From 1c065d36d239ae7a9a99a0e4003c111c86d7bbf6 Mon Sep 17 00:00:00 2001 From: Joyjit Daw Date: Mon, 23 Oct 2023 17:42:00 -0400 Subject: [PATCH 01/13] RNA adapter trimming Re-enable RNA adapter trimming to cut out the DNA adapter portion of the sequenced strand. This will improve the scaling parameters for the read. Closes DOR-373 --- dorado/cli/basecaller.cpp | 2 +- dorado/nn/CRFModelConfig.cpp | 14 ++++ dorado/nn/CRFModelConfig.h | 8 ++ dorado/read_pipeline/Pipelines.cpp | 7 +- dorado/read_pipeline/PolyACalculator.cpp | 98 ++++++----------------- dorado/read_pipeline/PolyACalculator.h | 10 +-- dorado/read_pipeline/ScalerNode.cpp | 63 +++++++++++++-- dorado/read_pipeline/ScalerNode.h | 3 +- tests/NodeSmokeTest.cpp | 11 +-- tests/PolyACalculatorTest.cpp | 13 ++- tests/data/poly_a/rna002/moves.bin | Bin 9264 -> 8134 bytes tests/data/poly_a/rna002/seq.txt | 2 +- tests/data/poly_a/rna002/signal.tensor | Bin 94126 -> 82880 bytes tests/data/poly_a/rna004/moves.bin | Bin 6158 -> 5708 bytes tests/data/poly_a/rna004/seq.txt | 2 +- tests/data/poly_a/rna004/signal.tensor | Bin 63086 -> 58560 bytes 16 files changed, 125 insertions(+), 108 deletions(-) diff --git a/dorado/cli/basecaller.cpp b/dorado/cli/basecaller.cpp index 934c537f..b93b1ced 100644 --- a/dorado/cli/basecaller.cpp +++ b/dorado/cli/basecaller.cpp @@ -143,7 +143,7 @@ void setup(std::vector args, if (estimate_poly_a) { current_sink_node = pipeline_desc.add_node( {current_sink_node}, std::thread::hardware_concurrency(), - PolyACalculator::get_model_type(model_name)); + get_model_type(model_config)); } if (!barcode_kits.empty()) { utils::SampleSheet sample_sheet(barcode_sample_sheet); diff --git a/dorado/nn/CRFModelConfig.cpp b/dorado/nn/CRFModelConfig.cpp index b50fd894..7bed4db0 100644 --- a/dorado/nn/CRFModelConfig.cpp +++ b/dorado/nn/CRFModelConfig.cpp @@ -129,4 +129,18 @@ bool is_rna_model(const CRFModelConfig &model_config) { return filename.u8string().rfind("rna", 0) == 0; } +ModelType get_model_type(const CRFModelConfig &model_config) { + auto path = std::filesystem::canonical(model_config.model_path); + auto model_name = path.filename().string(); + if (model_name.find("rna004") != std::string::npos) { + return ModelType::RNA004; + } else if (model_name.find("rna002") != std::string::npos) { + return ModelType::RNA002; + } else if (model_name.find("dna") != std::string::npos) { + return ModelType::DNA; + } else { + throw std::runtime_error("Could not determine model type for " + model_name); + } +} + } // namespace dorado diff --git a/dorado/nn/CRFModelConfig.h b/dorado/nn/CRFModelConfig.h index f01a1444..c4597012 100644 --- a/dorado/nn/CRFModelConfig.h +++ b/dorado/nn/CRFModelConfig.h @@ -44,6 +44,12 @@ struct CRFModelConfig { int32_t mean_qscore_start_pos = -1; }; +enum ModelType { + DNA, + RNA002, + RNA004, +}; + CRFModelConfig load_crf_model_config(const std::filesystem::path& path); uint16_t get_model_sample_rate(const std::filesystem::path& model_path); @@ -57,4 +63,6 @@ int32_t get_model_mean_qscore_start_pos(const CRFModelConfig& model_config); bool is_rna_model(const CRFModelConfig& model_config); +ModelType get_model_type(const CRFModelConfig& model_config); + } // namespace dorado diff --git a/dorado/read_pipeline/Pipelines.cpp b/dorado/read_pipeline/Pipelines.cpp index 532832b7..545d434f 100644 --- a/dorado/read_pipeline/Pipelines.cpp +++ b/dorado/read_pipeline/Pipelines.cpp @@ -62,7 +62,7 @@ void create_simplex_pipeline(PipelineDescriptor& pipeline_desc, auto scaler_node = pipeline_desc.add_node({basecaller_node}, model_config.signal_norm_params, - is_rna_model(model_config), scaler_node_threads); + get_model_type(model_config), scaler_node_threads); // if we've been provided a source node, connect it to the start of our pipeline if (source_node_handle != PipelineDescriptor::InvalidNodeHandle) { @@ -128,8 +128,9 @@ void create_stereo_duplex_pipeline(PipelineDescriptor& pipeline_desc, {splitter_node}, std::move(runners), adjusted_simplex_overlap, kSimplexBatchTimeoutMS, model_name, 1000, "BasecallerNode", true, mean_qscore_start_pos); - auto scaler_node = pipeline_desc.add_node( - {basecaller_node}, model_config.signal_norm_params, false, scaler_node_threads); + auto scaler_node = + pipeline_desc.add_node({basecaller_node}, model_config.signal_norm_params, + ModelType::DNA, scaler_node_threads); // if we've been provided a source node, connect it to the start of our pipeline if (source_node_handle != PipelineDescriptor::InvalidNodeHandle) { diff --git a/dorado/read_pipeline/PolyACalculator.cpp b/dorado/read_pipeline/PolyACalculator.cpp index b774bb8c..65ba0fc1 100644 --- a/dorado/read_pipeline/PolyACalculator.cpp +++ b/dorado/read_pipeline/PolyACalculator.cpp @@ -256,57 +256,11 @@ SignalAnchorInfo determine_signal_anchor_and_strand_cdna(const dorado::SimplexRe return result; } -// Since the adapter in RNA is still DNA, the basecall quality of the adapter is poor because we -// infer with a model trained on RNA data. So finding a match of the adapter sequence in the RNA sequence -// doesn't work well. Instead, the raw signal is traversed to find a point -// where there's a jump in the median signal value, which is indicative of the -// transition from the DNA adapter to the RNA signal. The polyA will start right -// at that juncture. This function returns a struct with the strand -// direction (which is always reverse for dRNA), the signal anchor and the number of bases -// to omit from the tail length estimation due to any adapter effects. -SignalAnchorInfo determine_signal_anchor_and_strand_drna( - const dorado::SimplexRead& read, - dorado::PolyACalculator::ModelType model_type) { - static const std::unordered_map kOffsetMap = { - {dorado::PolyACalculator::ModelType::RNA002, 5000}, - {dorado::PolyACalculator::ModelType::RNA004, 1000}}; - static const std::unordered_map kMaxSignalPosMap = { - {dorado::PolyACalculator::ModelType::RNA002, 10000}, - {dorado::PolyACalculator::ModelType::RNA004, 5000}}; - - const int kWindowSize = 250; - const int kStride = 50; - const int kOffset = kOffsetMap.at(model_type); - const int kMaxSignalPos = kMaxSignalPosMap.at(model_type); - - const float kMinMedianForRNASignal = 0.f; - const float kMinMedianDiff = 1.f; - - int bp = -1; - int signal_len = read.read_common.get_raw_data_samples(); - auto sig_fp32 = read.read_common.raw_data.to(torch::kFloat); - float last_median = 0.f; - for (int i = kOffset; i < std::min(signal_len / 2, kMaxSignalPos); i += kStride) { - auto slice = sig_fp32.slice(0, std::max(0, i - kWindowSize / 2), - std::min(signal_len, i + kWindowSize / 2)); - float median = slice.median().item(); - if (median > kMinMedianForRNASignal) { - float diff = median - last_median; - if (diff > kMinMedianDiff) { - bp = i; - break; - } - } - last_median = median; - } - - spdlog::debug("Approx break point {}", bp); - - if (bp > 0) { - return SignalAnchorInfo{false, bp, 0}; - } else { - return SignalAnchorInfo{false, -1, 0}; - } +// RNA polyA appears at the beginning of the strand. Since the adapter +// for RNA has been trimmed off already, the polyA search can begin +// from the start of the signal. +SignalAnchorInfo determine_signal_anchor_and_strand_drna(const dorado::SimplexRead& read) { + return SignalAnchorInfo{false, 0, 0}; } } // namespace @@ -327,10 +281,27 @@ void PolyACalculator::worker_thread() { // If this message isn't a read, we'll get a bad_variant_access exception. auto read = std::get(std::move(message)); + // Save data + std::ofstream outputFile("moves.bin"); + + // Iterate through the vector and write its contents to the file + for (uint8_t element : read->read_common.moves) { + outputFile << element; + } + + // Close the file + outputFile.close(); + + torch::save(read->read_common.raw_data, "signal.tensor"); + + std::ofstream seqFile("seq.txt"); + seqFile << read->read_common.seq; + seqFile.close(); + // Determine the strand direction, approximate base space anchor for the tail, and whether // the final length needs to be adjusted depending on the adapter sequence. auto [fwd, signal_anchor, trailing_Ts] = - m_is_rna ? determine_signal_anchor_and_strand_drna(*read, m_model_type) + m_is_rna ? determine_signal_anchor_and_strand_drna(*read) : determine_signal_anchor_and_strand_cdna(*read); if (signal_anchor >= 0) { @@ -378,13 +349,8 @@ void PolyACalculator::worker_thread() { } } -PolyACalculator::PolyACalculator(size_t num_worker_threads, - PolyACalculator::ModelType model_type, - size_t max_reads) - : MessageSink(max_reads), - m_num_worker_threads(num_worker_threads), - m_is_rna(model_type == ModelType::RNA004 || model_type == ModelType::RNA002), - m_model_type(model_type) { +PolyACalculator::PolyACalculator(size_t num_worker_threads, bool is_rna, size_t max_reads) + : MessageSink(max_reads), m_num_worker_threads(num_worker_threads), m_is_rna(is_rna) { start_threads(); } @@ -417,7 +383,7 @@ void PolyACalculator::terminate_impl() { } int factor = std::max(1, 1 + max_val / 100); for (auto [k, v] : tail_length_counts) { - spdlog::debug("{} : {}", k, std::string(v / factor, '*')); + spdlog::debug("{:03d} : {}", k, std::string(v / factor, '*')); } done = true; } @@ -437,16 +403,4 @@ stats::NamedStats PolyACalculator::sample_stats() const { return stats; } -PolyACalculator::ModelType PolyACalculator::get_model_type(const std::string& model_name) { - if (model_name.find("rna004") != std::string::npos) { - return PolyACalculator::ModelType::RNA004; - } else if (model_name.find("rna002") != std::string::npos) { - return PolyACalculator::ModelType::RNA002; - } else if (model_name.find("dna") != std::string::npos) { - return PolyACalculator::ModelType::DNA; - } else { - throw std::runtime_error("Could not determine model type for " + model_name); - } -} - } // namespace dorado diff --git a/dorado/read_pipeline/PolyACalculator.h b/dorado/read_pipeline/PolyACalculator.h index d66a3f60..0431601a 100644 --- a/dorado/read_pipeline/PolyACalculator.h +++ b/dorado/read_pipeline/PolyACalculator.h @@ -15,19 +15,12 @@ namespace dorado { class PolyACalculator : public MessageSink { public: - enum ModelType { - DNA, - RNA002, - RNA004, - }; - - PolyACalculator(size_t num_worker_threads, ModelType model_type, size_t max_reads = 1000); + PolyACalculator(size_t num_worker_threads, bool is_rna, size_t max_reads = 1000); ~PolyACalculator() { terminate_impl(); } std::string get_name() const override { return "PolyACalculator"; } stats::NamedStats sample_stats() const override; void terminate(const FlushOptions& flush_options) override { terminate_impl(); }; void restart() override; - static ModelType get_model_type(const std::string& model_name); private: void start_threads(); @@ -38,7 +31,6 @@ class PolyACalculator : public MessageSink { std::vector> m_workers; size_t m_num_worker_threads = 0; const bool m_is_rna; - const ModelType m_model_type; std::atomic total_tail_lengths_called{0}; std::atomic num_called{0}; std::atomic num_not_called{0}; diff --git a/dorado/read_pipeline/ScalerNode.cpp b/dorado/read_pipeline/ScalerNode.cpp index c8d63cf6..0b71a9a3 100644 --- a/dorado/read_pipeline/ScalerNode.cpp +++ b/dorado/read_pipeline/ScalerNode.cpp @@ -37,6 +37,45 @@ std::pair ScalerNode::med_mad(const torch::Tensor& x) { return {med.item(), mad.item()}; } +// This function returns the approximate position where the DNA adapter +// in a dRNA read ends. The adapter location is determined by looking +// at the median signal value of a sliding window over the raw signal. +// RNA002 and RNA004 have different offsets and thresholds for the +// sliding window heuristic. +int determine_rna_adapter_pos(const dorado::SimplexRead& read, dorado::ModelType model_type) { + static const std::unordered_map kOffsetMap = { + {dorado::ModelType::RNA002, 5000}, {dorado::ModelType::RNA004, 1000}}; + static const std::unordered_map kMaxSignalPosMap = { + {dorado::ModelType::RNA002, 15000}, {dorado::ModelType::RNA004, 5000}}; + static const std::unordered_map kAdapterCutoff = { + {dorado::ModelType::RNA002, 550}, {dorado::ModelType::RNA004, 825}}; + + const int kWindowSize = 250; + const int kStride = 50; + const int kOffset = kOffsetMap.at(model_type); + const int kMaxSignalPos = kMaxSignalPosMap.at(model_type); + + const int16_t kMinMedianForRNASignal = kAdapterCutoff.at(model_type); + + int bp = 0; + int signal_len = read.read_common.get_raw_data_samples(); + auto sig_fp32 = read.read_common.raw_data.to(torch::kInt16); + int16_t last_median = 0; + for (int i = kOffset; i < std::min(signal_len / 2, kMaxSignalPos); i += kStride) { + auto slice = sig_fp32.slice(0, i, std::min(signal_len, i + kWindowSize)); + int16_t median = slice.median().item(); + if (i > kOffset && median > kMinMedianForRNASignal && (median - last_median > 75)) { + bp = i; + break; + } + last_median = median; + } + + spdlog::debug("Approx break point {}", bp); + + return bp; +} + void ScalerNode::worker_thread() { torch::InferenceMode inference_mode_guard; @@ -50,10 +89,18 @@ void ScalerNode::worker_thread() { auto read = std::get(std::move(message)); + // Trim adapter for RNA first before scaling. + int trim_start = 0; + if (m_is_rna) { + trim_start = determine_rna_adapter_pos(*read, m_model_type); + read->read_common.raw_data = + read->read_common.raw_data.index({Slice(trim_start, torch::indexing::None)}); + } + assert(read->read_common.raw_data.dtype() == torch::kInt16); - const auto [shift, scale] = m_scaling_params.quantile_scaling - ? normalisation(read->read_common.raw_data) - : med_mad(read->read_common.raw_data); + auto [shift, scale] = m_scaling_params.quantile_scaling + ? normalisation(read->read_common.raw_data) + : med_mad(read->read_common.raw_data); read->read_common.scaling_method = m_scaling_params.quantile_scaling ? "quantile" : "med_mad"; @@ -68,17 +115,16 @@ void ScalerNode::worker_thread() { read->read_common.shift = read->scaling * (shift + read->offset); // Don't perform DNA trimming on RNA since it looks too different and we lose useful signal. - int trim_start = 0; if (!m_is_rna) { // 8000 value may be changed in future. Currently this is found to work well. int max_samples = std::min(8000, static_cast(read->read_common.get_raw_data_samples() / 2)); trim_start = utils::trim( read->read_common.raw_data.index({Slice(torch::indexing::None, max_samples)})); + read->read_common.raw_data = + read->read_common.raw_data.index({Slice(trim_start, torch::indexing::None)}); } - read->read_common.raw_data = - read->read_common.raw_data.index({Slice(trim_start, torch::indexing::None)}); read->read_common.num_trimmed_samples = trim_start; spdlog::debug("{} {} {} {}", read->read_common.read_id, shift, scale, trim_start); @@ -89,13 +135,14 @@ void ScalerNode::worker_thread() { } ScalerNode::ScalerNode(const SignalNormalisationParams& config, - bool is_rna, + ModelType model_type, int num_worker_threads, size_t max_reads) : MessageSink(max_reads), m_scaling_params(config), m_num_worker_threads(num_worker_threads), - m_is_rna(is_rna) { + m_is_rna(model_type == ModelType::RNA002 || model_type == ModelType::RNA004), + m_model_type(model_type) { start_threads(); } diff --git a/dorado/read_pipeline/ScalerNode.h b/dorado/read_pipeline/ScalerNode.h index fda9654c..08080f2f 100644 --- a/dorado/read_pipeline/ScalerNode.h +++ b/dorado/read_pipeline/ScalerNode.h @@ -16,7 +16,7 @@ namespace dorado { class ScalerNode : public MessageSink { public: ScalerNode(const SignalNormalisationParams& config, - bool is_rna, + ModelType model_type, int num_worker_threads = 5, size_t max_reads = 1000); ~ScalerNode() { terminate_impl(); } @@ -34,6 +34,7 @@ class ScalerNode : public MessageSink { SignalNormalisationParams m_scaling_params; const bool m_is_rna; + const ModelType m_model_type; std::pair med_mad(const torch::Tensor& x); std::pair normalisation(const torch::Tensor& x); diff --git a/tests/NodeSmokeTest.cpp b/tests/NodeSmokeTest.cpp index 7da59539..966e075c 100644 --- a/tests/NodeSmokeTest.cpp +++ b/tests/NodeSmokeTest.cpp @@ -3,6 +3,7 @@ #include "decode/CPUDecoder.h" #include "models/models.h" #include "nn/CRFModel.h" +#include "nn/CRFModelConfig.h" #include "nn/ModBaseModel.h" #include "nn/ModBaseRunner.h" #include "nn/ModelRunner.h" @@ -162,9 +163,10 @@ TempDir download_model(const std::string& model) { DEFINE_TEST(NodeSmokeTestRead, "ScalerNode") { auto pipeline_restart = GENERATE(false, true); - auto is_rna = GENERATE(true, false); + auto model_type = + GENERATE(dorado::ModelType::DNA, dorado::ModelType::RNA002, dorado::ModelType::RNA004); CAPTURE(pipeline_restart); - CAPTURE(is_rna); + CAPTURE(model_type); set_pipeline_restart(pipeline_restart); @@ -178,7 +180,7 @@ DEFINE_TEST(NodeSmokeTestRead, "ScalerNode") { config.quantile_b = 0.9; config.shift_multiplier = 0.51; config.scale_multiplier = 0.53; - run_smoke_test(config, is_rna, 2); + run_smoke_test(config, model_type, 2); } DEFINE_TEST(NodeSmokeTestRead, "BasecallerNode") { @@ -369,8 +371,7 @@ TEST_CASE("BarcodeClassifierNode: test simple pipeline with fastq and sam files" DEFINE_TEST(NodeSmokeTestRead, "PolyACalculator") { auto pipeline_restart = GENERATE(false, true); - auto is_rna = GENERATE(dorado::PolyACalculator::ModelType::DNA, - dorado::PolyACalculator::ModelType::RNA004); + auto is_rna = GENERATE(dorado::ModelType::DNA, dorado::ModelType::RNA004); CAPTURE(pipeline_restart); CAPTURE(is_rna); diff --git a/tests/PolyACalculatorTest.cpp b/tests/PolyACalculatorTest.cpp index 218f55e3..f8c9ac7a 100644 --- a/tests/PolyACalculatorTest.cpp +++ b/tests/PolyACalculatorTest.cpp @@ -5,6 +5,7 @@ #include "utils/sequence_utils.h" #include +#include #include #include @@ -21,20 +22,18 @@ using namespace dorado; struct TestCase { int estimated_bases = 0; std::string test_dir; - PolyACalculator::ModelType model_type; + bool is_rna; }; TEST_CASE("PolyACalculator: Test polyT tail estimation", TEST_GROUP) { - auto [gt, data, model_type] = - GENERATE(TestCase{92, "poly_a/r9_rev_cdna", PolyACalculator::ModelType::DNA}, - TestCase{31, "poly_a/r10_fwd_cdna", PolyACalculator::ModelType::DNA}, - TestCase{29, "poly_a/rna002", PolyACalculator::ModelType::RNA002}, - TestCase{64, "poly_a/rna004", PolyACalculator::ModelType::RNA004}); + auto [gt, data, is_rna] = GENERATE( + TestCase{92, "poly_a/r9_rev_cdna", false}, TestCase{31, "poly_a/r10_fwd_cdna", false}, + TestCase{28, "poly_a/rna002", true}, TestCase{67, "poly_a/rna004", true}); dorado::PipelineDescriptor pipeline_desc; std::vector messages; auto sink = pipeline_desc.add_node({}, 100, messages); - auto estimator = pipeline_desc.add_node({sink}, 2, model_type); + auto estimator = pipeline_desc.add_node({sink}, 2, is_rna); auto pipeline = dorado::Pipeline::create(std::move(pipeline_desc)); diff --git a/tests/data/poly_a/rna002/moves.bin b/tests/data/poly_a/rna002/moves.bin index 22493b2728b5b4fbb44869f60c6d97ffec612576..6f741d4415bd5112085d61907ce49942857d0632 100644 GIT binary patch literal 8134 zcmcgu333}p43z%==}e;!0JBTUDW}3B2S8t#r6iZXzrVlsD|0cNf^F%~(?`=sf_cBt zKQH|=wpM(9p`4GV)R9pX6%v~y!wh3gsL&8fh{R2{m)wUglOU^qt!GVNPy>(#Pm3Wh z4aQi6#SsmSyZz zw|4+>ocpG?t^@`@g_$4qNK5T1>LuY)d|iL*a8uFw-iy`eXPnkQK88@Sa!0d;F z;Urs9-CogTxkX;6f_vl5_gn!S_oA3vyJ9i)cUmGTZv*D@skb>+L0B9>OGIfB9i3q& zXDU-oh-0M5JsD-ib2Q(b&^+c~f+=B?q3Si`dv0(n9pGvicFr`S1Ksixz8y=5yhp_4 zI)*7Jc86>MFWDhe>!0w%++PmuY_vLv(|E6>4pOyj?d+jVEmXRG5egUCzO^OnwX?=U zidXI!L0p+z%c(IMl+dvDdV$89zvo(>+Z=WX(mopNKiv3(PBD>T~t@_WI(gZa01-C z6GB5)^V~^Zq!X(KqXhfWp$J)W3>{DL)LlMND0H>=5j%j9ING|^P@#Rfw2=qrD=-D)%S*x+#t>sLeM*pW(e2tsh!!_y1*jlZ z>eCcRrk}fch_4G;Jn^KE98V;mW5$-5P=bBHdOj*@w;cv=VC~bmGaL@QQrL9B>?}rg z5UZ!c&%pQ8yN^fQ``=XB)Kwd^&57BLP92@M5j}R~2t7MwL{E6>uM+ZTe!R&DJk+1-jA_vxf4`w}c zRTdt&n3+ZkU{VrXx|=h7s#}C+Q@Y8P7JxzjR0G5&gu*)Q;ToKH`2iD6I4j;ZSTZWY zyRgp0J0Y4aM&#S*7&auqEPQOGRuL|$-driOyCgPNVjrK>2t-JP5gZT4d zE3}uO>#5o??(iQbditym%TJ@<0FuZ6rYzJNg%Kx8h)4|bDM4g~bZ^Z<^i32-0%uEj zRo#Zf&??d*`()=6o*}>NPNpD1WAr88D}^_A(2Kan+wj-3zO|F1-B`GmUO*fEdbf8n zQv11GHyD^(Fl2Maj~fxy-6GLkWhqDmN|T%w(GL$8QyZ?N;vY0cI)`_(!_%m{Q>*p7 z^8SA#7Q7w#!P&gf7Cw*JSo9HNw-S9x#t<*la?~BXA;~G<{9+8Q5&9}t$a0n zzryhO4Sf#Y(o*Bod2@Zf`?JYExyyX0dN16%Qcl}v7n{M3H&~fqC8?G}EvvfvUPk-1 zZ@Y3oYS?9C z$J9;73c-L}hf-PC^JLM=)*GF1mp-g;tCry=VN>yLP6DGOm$Vu`on)aaNuU#6o?E>&A+HMd&V1LL%F}KobzvSy?V}6a@42a@LoCc+sk`q-d z+2$h>C%5=_W+j$yeOu@*xg4ux zlb7VLQ&vch^Jk3)RlUX0C+wD8_e=Eh%Rmupj>~5F#yfhrl@e8Odd&&Qmwi2tlJs=Y z7N;n2w&o4m!zKe1l6wBMXDOXS)VA}FJ7ZqY4%@a7x`pggj2CXD3fH=)oL2=i>+Pw@ z(_3Mh==o%(WjzuI zLtP>>Fip!+gQ`K-W+pP0-F^_qQA>j@0R?P3cY^LI6DMje3V%Z_%F#)QvuUNNc~r+Z z7E~{Pwg;uit}?f`HFLh`kyq*EL)QnEmt%c+Yk?a(&G`0%(FKxw)t?jUTj4xxG4d@es+#aLLQV8<5h1 zv(?|)4ws0k#3I#pG==E>yXKEM-Eifo>A_@}M*zh{`-Zy6@0#A&hz~#)9FHR{*o|Xc zj9ZXU(%gID@o{ZdUCsf|fWpC-G#m|q*fztaxK@aEBh$dh14*88(3)x(EYT-1VD#BxfVo|*bo;Wd$$FV_?r z`weDP)5h1o!qbEuc_b-8wFtI0ppApH$J}mZ(77gl^jz4H0k$=P8`&;|1kc(5us%|H zX|Qbs46fi{e3`|K=>^l&#_OAfJPp&%$yQhLTf>n)fpU3(`UX(UkmM??AbphT6je?Q zcoG3-7cEw`tZef&ePHk3G2BuboH$fho9o7Lzovl3r zLmbeX$F$^JNz?4xy1ur05XJhH%VnLY#^ diff --git a/tests/data/poly_a/rna002/seq.txt b/tests/data/poly_a/rna002/seq.txt index bc7cc35d..8031d19e 100644 --- a/tests/data/poly_a/rna002/seq.txt +++ b/tests/data/poly_a/rna002/seq.txt @@ -1 +1 @@ -GGTATCCATGGTTACGACCTGATTTCGAAAAACTGGTAGCCAGCTATCAGGCCGGAAGAGGTCACCATGCGCTACTCAACTTCAGGCGTTACCGGGCATGGGCGATGATGCTTTAATCTACGCCCTGAGCCGTTATTTACTCTGCCAACAACCGCAGGGCCTTTCAAAGTTGCGGTCACTGTCGTGGATGTCAGTTGATGCAGGCTGGCACGCATCCCGATTACTACACCGGCCCGAAAAGGAAAAAATACGCTGGGCGTTGATGCGGTACGTGAGGTCACCGAAAAAGCTGAATGAGCACGCACGCTTAGGTGGTGCGAAAGTCGTTTGGGTAACCGATGCTGCCTTACTATCGACGCCGCGGCTAACGCATTGCTGAAAACGCTCGAAGAGCCAGCAGAAACTGGTTTTCCTGGCTACCCGCGAGCCTGAACGTTTACTGGCAACATTACGTAGTCGTTGTCGGTTACCTTTTGCGCCGCCGGAACAGTACGCCGTGACCTGGCTTTCACGCGAAGTGACAATGTCACAGGATGCATTACTTCTGCCGCATTGCGCTTAAGCGCCGGTACGTCTGGCGCGGCACTGGCGTTGTTTCAGGGAGATAACTGGCAGGCTCGTGAAACATTTGTGTCAGGCGTTGGCTAGCGTGCCATCGGGCGACTGGTATTCGCTGCTGTGGCCCTTAATCATGAACAAGCTCCGGCGCGTTTACACTGGCTGGCAACGTTGCTGATGGATGCGCTAAAACGCCATTATGGTGCTGCGCAGGTGACCAATGTTGATGTGCCGGGCCTGTACGTCGAACTGGCAAACCATCTTTCTCCCTCGCGCCTGCAGGCTATACTGGGGGATGTTTTGCCACATTCGTGAACAGTTAATGTCTGTTACAGGCATCAACCGCGAGCTTTTCATCACCGATCTTTTGCGTTGAGCATTACCTGCATGGGCGTTGTGCTACCAGCTTCCATCTTGGCTGCAAAAAAAAAAATTCCTCCTCCTCTACTCCTATCATCCATCATCATCCCATCATCCATCATCCTCTTATTCC \ No newline at end of file +GGTATCCATGGTTACGACCTGATTTCGAAAAACTGGTAGCCAGCTATCAGGCCGGAAGAGGTCACCATGCGCTACTCAACTTCAGGCGTTACCGGGCATGGGCGATGATGCTTTAATCTACGCCCTGAGCCGTTATTTACTCTGCCAACAACCGCAGGGCCTTTCAAAGTTGCGGTCACTGTCGTGGATGTCAGTTGATGCAGGCTGGCACGCATCCCGATTACTACACCCTGACCCGAAAAGGAAAAAATACGCTGGGCGTTGATGCGGTACGTGAGGTCACCGAAAAAGCTGAATGAGCACGCACGCTTAGGTGGTGCGAAAGTCGTTTGGGTAACCGATGCTGCCTTACTATCGACGCCGCGGCTAACGCATTGCTGAAAACGCTCGAAGAGCCAGCAGAAACTGGTTTTTCCTGGCTACCCGCGAGCCTGAACGTTTACTGGCAACATTACGTAGTCGTTGTCGGTTACCTTCTGCGCCGCCGCCGGAACAGTACGCCGTGACCTGGCTTTCACGCGAAGTGACAATGTCACAGGATGCATTACTTCTGCCGCATTGCGCTTAAGCGCCGGTTTTTTGGCGCGGCACTGGCGTTGTTTCAGGGAGATAACTGGCAGGCTCGTGAAACATTGTGCGGCAGGCGTTGGCTAGCGTGCCATCGGGCGACTGGTATTCGCCGTTAGCGGCCCTTAATCATGAACAAGCTCCGGCGCGTTTACACTGGCTGGCAACGTTGCTGATGGATGCGCTAAAACGCCATTATGGTGCTGCGCAGGGGTGACCAATGTTGATGTGCCGGGCCTGTACGTCGAACTGGCAAACCATCTTTCTCCCTCGCGCCTGCAGGCTATACTGGGGGATGTTTTGCCACATTCGTGAACAGTTAATGTCTGTTACAGGCATCAACCGCGAGCTTCATCACCGATTTTGCGTTGAGCATTACCTGCATGGGCGTTGTGCTACCGGTTCCTCATCTTTAAGCTGCAAAAAAAAAATTC \ No newline at end of file diff --git a/tests/data/poly_a/rna002/signal.tensor b/tests/data/poly_a/rna002/signal.tensor index 9616f0cbb57fb7732244d1031c91c4f4f52d17cf..038c2a6486c11fb35d2934eb1798aac678dd116a 100644 GIT binary patch literal 82880 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 literal 94126 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 KSrNAnxBXwBge!~y diff --git a/tests/data/poly_a/rna004/moves.bin b/tests/data/poly_a/rna004/moves.bin index 4c5bcbf61de20de53bda5e64dc4a79cfe85ed6bc..42466a664210b1d3dd456285b27c8be2e27adbac 100644 GIT binary patch delta 771 zcmYLHJ!lj`7`@q_`PtdO*}c6@q2@Y`#Aqz60!h#=Q4ArK5{@)lg`^O{lOQMoEfR9C zRiajkpv756jJ=71jUs4zgIsN)esg=`!tO9LZ{K_0`@W4c??)Mfaq12&%;Z=T5hk62 z-l&skq#;Ms)o3|EM`-+J>Hn>VJI*F{(*UVcN7GR_a256nfybG_tZO1x>pzTER>Qk+ z7+;mfp)2u+am0?mb9bDi1lo-pk4%hpKSt^;I5mcA-ZXBAgkTcQ)WfY@V=DGZU*Z+> zao{PJ5pIl?A<0x)^hM&|M=$U(p;X>iCRG2vf?!t`*!SnQu4g$hzmYeDcEvJtuI)WKJZl;{0Cy# zlqawmH^jgg5_JSUxroWc$Gj?)WwF09tP0xFnqGm|>ViYL{!*hDO>?yB z5w?vWB*)KK;!5xd+e~)P={bf6zD6fpz;PMjv}Y4l9f!x3vGUeuT@}YLB`LaSMGh=5 zJfYs)4GdlI?ziX?6IFo>Jzl2~u=Z>&KJIaYo5=`fWJ;MR>@*@=3h!9Q4Cn_7c>+ zGD+flRm{H6|y&q!i_PS$Cz`uO9+T7R!hE|rQAU28|ovNWh3~Q zj>ukw#emgK*-RKvXZIKDtcGudD+qKViu)CTO&X!WL|_I9wzCF)unfy7({!GYMO_v( zSq#ZySawpw9?5PddrPXN*dm-^Iqs4DqgIO{Qv$3sb7*XWyX72B=F3xMY?CQ8{Qy1c zW6Ps>lvQPmqUGLjiGwF@8^d0L-w87^|GHz5!n3B(=OVV?ngr*)2k6EW&6H7HR#|vC z{&@2mY0f|CsUqIe16Zji#f(v{|<8KB>T!*X%L-@6Mjg*a$VJ%G2Qcvkv6rz;`kmWn(X|4HX%qx38MTQe;y|R~(IStj|O4=s) z#WTHQ8!w(^Uk>laZNu1W*>kt0hsogeKH)|taoxnWxP;}L4Ng}d66{n0JobgMxRu}f E2VpR_RR910 diff --git a/tests/data/poly_a/rna004/seq.txt b/tests/data/poly_a/rna004/seq.txt index de95ddc4..fe28fdc2 100644 --- a/tests/data/poly_a/rna004/seq.txt +++ b/tests/data/poly_a/rna004/seq.txt @@ -1 +1 @@ -AAATGTCTTTGCTTACATCATCACGTTTATCGGCGCTTTAGCGCCATCCAGGCTGCCTGGGCGGTTGATTATCCGCTCAACCGGAAGCCGACTGGTTGGGCAAAATCAAACGTATACGGTGCAAGAAGAGGATAAAAACAAGGCATTGCCCGACGTTTTGATACTGCGGCAATGTTGATCTGAAGCCAATAACACTATCGCCCCGGTGCCAAAACCTGGTACGACGATAACTATTCCTTCACAACTGTATTACCTGATGCACCGCGTACAGGGGATTATCGTTAACCTTGCAGAGCTGCGCCTTTATTATTATCCGCCGGGAGAAAATATTGTGCAGGTCTATCCAATAGGTATTGATTGCAGGGGCTGGAAACGCCGGTGATGGAAACGCGTGTTGGGCAGAAAATCCCTAACCCAACCTGGACGCCTACGGCAGGCATTCGTCAGCGCTGGAGCGTGGCATTAAATTACCGCCAGTCGTTCCTGCCGGACCAAATAACCCGCTAGGACGTTACGCACTGCGCCTCGCGCATGGTAATGGCGAAATACCTTCATCATGGTATCCAGTGCGCCGGACAGCGTCGGTTTGCGCGTCAGTTCAGGGTGTATTCGCATGAATGTCCGGATATTAAAGCCTTGTTCTCCAGCGTGCGGACGGGAACGCCGGTGAAAGTGATCAACGAACCGGTGAAATATTCCGTGAGCCTGCTCAGGATGCGTTATGTTGAAGTACATCGACACTATCGGCAGAAGAACAGCAGAACGTTCAGACAATGCCACACACTGCCAGCAGGCTTTACGCAATTTAAAGACAATAAGGCTGTAGATCAGAAGTTAGTCGATAAAGCGTTGTATCGTCGGGCAGGGTATCCGGTTTCGGTGAGCAGTGGAGCAACTCCCGCAGCCAGCTAATGCGCCTTCAGTAGAGTCAGCGCAGAATGGTGAACCAGAGCAAGGAATATGTTACGCGTGACGCAGTAGGCTGCAAAAAAAAACGATCCCACCCCCATCTACCCACCAATTTATTCCATATCAACCTGCCCCACATCCCTAACTCC \ No newline at end of file +AAATGTCTTTGCTTACATCATCACGTTTATCGGCGCTTTTAGCGCCATCCAGGCTGCCTGGGCGGTTGATTATCCGCTCAACCGGAAGCCGACTGGTTGGGCAAAATCAAACGTATACGGTGCAAGAAGGGGATAAAAACAAGGCATTGCCCGACGTTTTGATACTGCGGCAATGTTGATCTGAAGCCAATAACACTATCGCCCCGGTGCCAAAACCTGGTACGACGATAACTATTCCTTCCAACTGTATTACCTGATGCACCGCGTACAGGGGATTATCGTTAACCTTGCAGAGCTGCGCCTTTATTATTATCCGCCGGGAGAAAATATTGTGCAGGTCTATCCAATAGGTATTGATTGCAGGGGCTGGAAACGCCGGTGATGGAAACGCGTGTTGGGCAGAAAATCCCTAACCCAACCTGGACGCCTACGGCAGGCATTCGTCAGCGCTGGAGCGTGGCATTAAATTACCGCCAGTCGTTCCTGCCGGACCAAATAACCCGCTAGGACGTTACGCACTGCGCCTCGCGCATGGTAATGGCGAAATACCTTCATCATGGTATCCAGTGCGCCGGACAGCGTCGGTTTGCGCGTCAGTTCAGGGTGTATTCGCATGAATGTCCGGATATTAAAGCCTTGTTCTCCAGCGTGCGGACGGGAACGCCGGTGAAAGTGATCAACGAACCGGTGAAATATTCCGCGGAGCCTAACGGGATGCGTTATGTTGAAGTACATCGACCACTATCGGCAGAAGAACAGCAGAACGTTCAGACAATGCCACACACTGCCAGCAGGCTTTACGCAATTTAAAGACAATAAGGCTGTAGATCAGAAGTTAGTCGATAAAGCGTTGTATCGTCGGGCAGGGTATCCGGTTTCGGTGAGCAGTGGAGCAACTCCCGCAGCCAGCAATGCGCCTTCAGTAGAGTCAGCGCAGAATGGTGAACCAGAGCAAGGAATATGTTACGCGTGACGCAGTAGGCTGCAAAAAAAAAAAAA \ No newline at end of file diff --git a/tests/data/poly_a/rna004/signal.tensor b/tests/data/poly_a/rna004/signal.tensor index 370d2533fa40eee43bbb309685340df6716f7b62..a93d417c315b0de9f6c86b9c5bae934f4da3e48a 100644 GIT binary patch literal 58560 zcmZU+dsLM5`u`pFkhBz3#ILwrY)|3hd>H0%&&++#++%Jef3*39XT(!(4;bz&Ta-l6 zl4_Z3)0WEGVeG_15CIO%z#KTJVew?UcBXAys6}7+Zal2;acP=b`Mj?2_t*32;xIG! z;d6gJ*XKICulIHFzyH^x|JNgrL_|FD|N9sD$fQTM7H#R!^_-*tljzjux1w<6xn?V7@Iclhni z?%l`FbO*FLh7l_b&&UKw1bZz0i^PSav_G9OQ&hV~ZdC$jL-JS1s+PZFbZsYvPUEy7>&dFTE z)^)gZM`vSaA?K{@YUFi7S2)KSuJo|lRo4QYZ)^W!Aq4u49t~z2fs29|L_O0sH zW@?{mNwzS@YmO<})3yuhXzdHt&e0b*f2I1nI#b)H8nuA7%C<;dYX8U;UZ%~dxm!}bkok3C8)v&%VAs)^$hxk6d! zyrrD!3yntQ{BZT4JyD&@-A{9FF2~HWx7dg6;~Arm>u%!w$?Chj8_qSGIdY2{Yx8mZ zJiDFmJ@&iyO7$+ER&tM(Ji`|LujFng`1FK2%RYf;|IU6vUBtEI3SaPamFjk$d7nDL zo~>QQyS?IZp#;+Zztr}O?w?$E;X zmf06E3IpSr%r)$sznyb(x%PIoIdp!FnyuCF>XubLm3u7ZsgkutJasr%z7QJ01DoGA zncsUt*J$R*@Az#pKNs=+D6=KAy+!?&x!%B)TkK1D{-$}wcwC#7s>f;J6tm|~1XOsN}+q)cXV5}zA zXvCJtjC^PRiIHsMx#x0^ZLGpJHCbE9cz0U2Ft@TQ8$xTH%g!@qnd9cr zJfGk?bJbNmr)pD~OPQ5LNS?@*$zH=Xj`H4J*6aeawF-H=%j|C9y>GeiO1{stud>x} zwKASvq}&6F7WOM(pbisHJl}TV8kZRVbr2H$H4to@?Fk2V4bdBvYyZ<^6u}P9mO4M zSfMW%Z4cKJN%663jv}R7_)M<06p0gQ@-c!M?&4FYXsq2KnvcHA0kd%-5s@rqUMB~pLazJ;-D30>L8^`cmhT;xc0*guNw#{O+#4{T89SY8{7_Vry-&xlajC!;-i!&BlN0=wk zk}H|nn$QeC)HvbH;c3>anNKdTGiUK+cCIYk&n%9KVxCO)SjM->K8typ z&J*26?rJ#q1ls8*)?^=7*R<(8%Ql`!jyTP{Z)f$+Sbyj4?;;zbSHH6xxT;Y*$|@zQ zL&(NF>f5 zW%m7yL`EtaPvx91nDte*Z+WKA6|sj+?7_Lr=?1RU!blG(@A6c!Smk%^7j4_Qs;t3B z=-zp}p1>&P@_H3dE0RBA6RjN{dM43!QOwZ;p0x>?9Y$u$kh5W~x`~~1k#!KOB6?9? zjWEAuto|+QX;w0dYsqZ)aE4f3(YdQ^B9Rry@VwAWo0!A9yq5cJPzS9|to;zz5KX*| zyMKoSEK;v1vbvKQi)f>z_HTIx(TjdYYO-7KO16ab_i{xvo{aHb&R1EjrHrOrNn~fq z4v%6iiHuxqj_gU1?CH#!_!0YAqbo`odoq!^7n>$)EE2YomGk4fEJa2Qe77?@xk%4s zzE^VOFxMQhiOw-F2a9-bJNFUkUCJjD_}Y)|J%A+cWL_rN5Awf)kuT+0MB|8e@tAED z8pp(X%l*U-OlJl6ahdoGah;|!`xH+ zvM)G7yor^JYZc>uxGTl85T7U(i@(e)@+cN)6;Em6E{k}w@9arDhwRNHcFVz#^iVreF;)%_( zPr=v9<=Gx%JnOBp3s&+RqLIYbTx4&TF+T^nj_ePS#|g}mJeL6p5@}k`8i{o|Zk2sD zkLQyak75p^RPhamkw}rHM0Q;)t5JrWyvudO7KihkVw?7}A|lbU()*Z!RklM)6m!3n z{WhKFc#N6cgvJpc#(*yUj_W?gK3K(<%*6yo_fRg5B8M*^J)+}#7>W3NOYNfFc3Mq% zFR~jy;yzE?ehRIR_@Uw>$a4;1A8sQFWz4AP60r{z*j|9qW%u}bwMETju6uaBog?-kD@z%L zcyv*$h3NcTw8$!+T5R+d=0;|;hr48JbCFu{J7vepoPNv7%B)Rbe6nhf+4iHm98+@|&-DpFeh^<(#{}{+#=ocj714 zyeHbK+DkG|gzlaf=xx2{8|T00tKn{azCK@6+nRtD2=f`*QUWP~Vn$ZXdmH`Z{1JhB zzN&!7SCxJjeK|#YO8Ll^No=>Cm@S~qV!xSKMGXu1p|)E40u6Hky&y6+i}|~VEZnlb z%RI?XzwHUfGS{Fr)pfx70{c_+Ubl0Vtxm6Y&eWsLtF`sUIOk#g8OJo^aci6Np5wCP zCf{Rpr^D%Z&hdn!*Evdm&)H->V~w?~bIx|Y=k(i3>t1qHm=5dVhTH0LrPtZ*yy;v` z%(BV;H@(OHti$7Y)EUX%jA(aftw_D|@mS{!f3uoz`9-^_-*fy!-|Xzt3miA~T1P<3 z)@D05J5{~J8RJanx3_t(+WD-biWsarGuAXgZC2_`t8Dp} zGsawlsc9jrJ&o0wV4tlpM$RgvvwNy zD0eu<;M+V!Ia8H1kN{_~v+I%ju|?R>AZspF3w zg`HQ4`)3o^kL_r1M5!@)p>sF!ceDDMW0!VGyB?UsDp?diyXCyHN10>ovXoe&@L@~S zWX=yMo9xGVM$!A?2OUx>*c17dTYN=Yk8|`+<9(id9=az+nPx3l&Lc0m*qhpniJ#Op zew|XJ{fD{yz_ZbxowVB*5ol-`YO4y&^$&WkBWZ7Vb9}!Y%d~#rsm-Vg3^d;lz8*{o zl%{;g5ZIUu^q?!8@fuEk?^jJjy=Ka0ZT9^_|L$aKta$FtPkXN z?p< zL;gL%h(K6yN9XB%=KdZ$nFR`waiq z_96d7?k{_KTiYb>P}^L86gnrOy{dhYM``VC9cs&OW=FT@u)pW}l~zOBAe!i&??%f# z-dT(WD)krp&iZ?rZnT8?3cZWlwzYlWF*WtJ7JA?C_W7)6mZ-LK?i(!;?YXmlS3lJr z*qjbQGNROG<7xEgZS^_FEc*p^*iUMm2_M*e3wbEBk5X#TSD$Lb=7aVV>IwB#ZM(YA zy4Ub^N@?1}Piop4TCRDO);z{J!+*_N=v~Vl20ix}LyqtJKyv%mKonz*YO8A;^i;J+ zv@iCbXp0E+dL#I3sI8{0)F0*9SUt#CuX*nwSvCGep5E5j#zme*p6n#iWuoU!GGBAi ze8s+#%yV*kL(3p%=|_J%)_}h3^_KeM(SC1uCkDs)CwY&do%?v*8fWze8JUKpZe{M~ zvTD7p`OS;{R_{jtS$~)>%478=x5xX+ThIF6@NR3uH+Wa)i|| zu%6}Yx>#E>vDXqU4Lw$3nXT-%jn~dtr)a-pu?DT**-x2ggRad%i+rwJQN~z^ddy;Z zS8<+1mf7g)d<*&vzv2tLzgyN8dx>QyJ9YxLThNjZIpVbKMXkv?SsgKnZ#+sFL7y+h z#`^jGp(cLqJiA*vj{PgrZsR3obL|n^Q~1>vumqDCi=Y!F7Quz0kddFT-`n_}4084b zn1N9nt>tNgCcTL?2%?v)?b0sr$x1%IfQPe)uX=5~_ARf(XExc>^?&H^=@ojGK1Pqx z|DspxF6VptpY#R#X8lL!kIo&=5^RQo7Qf;60gDk6dOb!Tt*_SO^d0(m&PaFujq_(a z&pWg9t5}R@9i#M_`ejEqXLdOL?Ks8vCme_MHs`0>c|Lv4v4c+w;fX*&pQ6j zJ6~aC?L6}@*buX$*71_#ZO0{^XR1RY|1Eq;WO^YKMF>XuJN}$RcJge33l5uq)gO1= z(WklI1r@%c1oSRF(lx@@RlQ1U)Eo73eZIbgHA)YyV>Ld)a@PA({clLXW+Y<2{wr%c zAGvsswcXFV7xkOYFS)`^&UuyNHX|=x`eBas>O1fpHgmQ4Tz5GV@wr~a5s$bIJAZXH zB3(b~b@~Wbe336Xa|bf>rS9g~KXJ7eIX<2D;`Ax{IVAI_+UA_8UDv`KXN=!;obQ~7 z<@p!-f6()NU|nZ#r|6;bPNlW6^RJ-uyN&m=_ujV zUpvFF98Y#xg8$ty8;f1i`6F1ni~ogOe|D$R`7+1d>L>^ge-%uoEeP9A9xT$ESs?&NyD@;pg4vs2bK?tYt)ChQHE(8%=l{i?X$Saog7Rdp-+S zw0b?h96Z9^zPIoU^Uz{7Z7141T>Y$nqra*>+g*@xz&c`z@(jek;VsD&q@f_Aw5~O- z-|)WWlsVk6T)CXlY^*c6v-FfFjV0)yrS@TSw{yDstMgBKxl&^J**NGKXdd)zvhQ*) zM&m8=M0u`x^O4Ww_Dt&-OOHLw_krgUyX|lKajU5*w()(-ug(>zbMQd7w%=$OugxZ_ z(C6#1|LWX=mb#=BWqshe^Koljj!$Ao{8Rr7{~_f=EzDy>UHLl0Q?5xYuM^r_bE{1)#{u;dd&a2M23`v2{E*Y$xbX3nsy zL@#kl+{_LIYvF1v)-`3ZEuWc3#<-%{<&L03q$Y$JNh1lj1a;7{XI-pN{pB`Q}2i5%`L6(%g9U*s>xSBlh%y*2p7m)q?-g6^sz zE(ybijzbO~?fhd$3NkISf1>RrboEzgsXum9X<8D2$f#@|`5pBUG-*r5+uUx})BT4!eMHI!s#yG7ckwv@Nt`B*<1 zk&Yzdv3FUT@#Kq$DojXwYn&$-hS&L4U{1&P_>l4VlP}}B?Lixa1+RH)@!+Zg#lbo3 z+1G;>Wo+mu@jt~2ozt-`Ts(+z=uFHJXq3hb5mmQ59 z_k-gi`fES>(S?Rwz|Ofz)K%ydyZ9$PS^Eg-ea-P6(Nmp%o^|fhOZ3}n01K;fkM+hs z>CZa$6F0r6?ZEmeyy|w=YaT~5@!DnVrqkiKeMQtYpQ|UKZ@<*GsXKJZ@%@E}>o&IX z7xI6DV0%kAVjc1{+Zm_-+c8EgJ=XXc$1mC# z{ZTA#9QRLW9Mjb^#%1R7$|&WKa>h7d>9QBcUNX6~P5MGBGg0O!Xrcc1diC)5Ux zf0do$VPAZO#*-CYjmE2W{E98S>72qk|H!?1ovVq`>-0ueVjaHKi(*~1&DhDq&PUl* zh0gi3Bz9Y9~||e$z{iW~2BSL&PHA2ZDhbkO+z8)?k4oE;@@} zJ_Bz%f|zGrM>jj5kKJZnJjQ3MByz(yAbXAnPD@(eXR z&s@Lk_V{2^$7kq>xXu-+t8A)im)oGmn$8%9)Q#0&YEE|Db>u(Rw8-;;N8-TVR)fEx zWszrV`^M09im}}?*MpusqTC#G=U8TJE6-lft1A2fv@CJw_xvm%>WMW4+pXS9?Lnf{ zt(?)F`G73mN1%VJY|&=@=xN&|?`+2Zv+-x+7|S#wf7xyOLEFO7=(C6t(lb@tH0uES zXpXhCZsI2e8DFQIbKm*+&d0rA69dit^%8CMwh~o(e>=9zz019}r5=gPLGDi>y>H?# zXOsWG0IoC>|7s?YNVZl)o^S)6quOVf{fgA2#HlSijrvh=7UNz+c9M$Mv^H7L zy(GRCGOvP}slBGbd%ZVWYTB&c^43M*CtKSGnumz0 z?|fX|y34H}y_`{-vB)+YDYM|mO> z2AaN3jh4LjWMcXJ=7{!dslOfD*4AI&oq40B zr>UVOcUDx}Kyx9_)XSO*vSGoX>7(>unuqj`#J~zu_&dTMRal z3~uoJu@5{)yh(}KZmU-!=Nis75OEv$c?rx@5QA~}%n|JLA^c^*Wv(ObeIZ21gASM& z#LEqgWv3|Y_TJE*zuMWxUQg&+$*xb}e=m%fb!ddlu4=wt?cBn9!io78=u&vsqOR%i zXeM`Eg)*MFF6>_wAY<$YV|>T=BFt|zoqci6E-cM1KW=+QDz#jBy9AC5EtdrE|^>KC5QjJNTO1)yDCS9P?jHhGpumG3L5>BT+2yVQm#IMphCnk0K~+Gr zL6C-!j2kUVYvdtW|DLAOG}+P5v%_OerD=uU^vv3f%NYZfJ6W@ps&tW!$b@OewaJkQ zYm;LeTjTP;yZ0KB+b4Nv_!kq0h}Rd7hmJ->5^LIueRYjdjG+(QPqbGb=*uEcL`ZH# z!-s)&4WjLGh-mY`h^~2ehtRA(Y|A)o#8%D>H>98g>e+ouh*2MPdhn87!`@v->ogF< zzJxc@frWk!A8?oU3^uXE8HT-2$A`I$-+cqEbP0_E#-+Z94PFZS=Xdo1S)3mG&qj+f z5T8W^8H*3lohf+#8Eb9EDRaH{Dz^NLG1^?N41s6VgD+R(QT<6*h)8$n0lqr0_iuwX zj3;jPpf?okb%1E%MJ%Q}q%9uD63@q8M?1`pu~_E?c&a~emcmoS@#R5hbzrj>sd3I- z*#8DJSpycofoHr$q_G@5CdljlU%yR#(l}e$>G~0`@V{IyYLB>D?1|h*K~Il$nwhr-=4h<54IgYQcduoX zuQ`sANBY4rMfW(q)KZCAzT|n5@mVAv*cvxt65YQN>}m>H^9g*8-#H=~O*;jBdL2zU z)$xMO%Zydn_K-tKR6UM5Q#9V$WcBe79xt9)6M3V}&ew=4y3qZ54L4d!)AB7>$iQr@ zjx~+3Y^*+G)Km17waML?6{hvZS`hPaVwnPm0ln34IO)%8Z&s5Muj-Krf5XGgx4fs1 zn8x9OJZ*c$8bt;Mec`V#-Do+9ltZJ92Z7OoKS`$zCQ*ELv`i#ed+L87OepvN~c$Xt;1F%W0< z;SX#C`OYC?Ddk=HZDezRb$g4wTOj3;@L8Qg0eV?2p}=J8!>Uz?l^?mUD~NT!KT@Q_k5Peh|Pkl8QPJbwNe@7ATiiaoE#Hs8jsiiLjL(F{Tr&|Tm?`*n%Wf6?l6 zzikTEy#>h@pSloVH~{+alEVbP9qrhx&$IvCQ4@;GF0*qNfI>xD73Tu*su=LA7el`K zO+4usz1NwUr0>iA`<)6`8!NWa^_~Qa?1QZ@%an3 zY2YXa&C8V)sjue zuY(=Auo1U9=5)Bw{$iE>g$0<@`587(;gipT3$OrqXXZUh3=z|asVaRHnC@xQQ%YpQ zX0YVh#6-M3(aPq@m#Aj;8`=ZR7()kj>9yZ)k2b^VvC z5j`WZ;7yQ+!_L3xPq=Y})h3hT0Y*=SRGA z{l%aK4J|9d9AM(G#=_@0Z8Pv{3KF?NO|!Jvdzxm$VR@0!8nGTN_dZeI*Q-euEr+&mpM)UPHK{C@Yk6OPAcj%&c5P zfBm)83RX~Q9rQFC#eNt2#7A!kWq76;BNOzaGw_6h|7W-7fL`PUB<7M_S6J{iG1Nq` zjhE3WVMG#=>&ju5OIA?+pEij-h&D$i%ndOBc7ib#h4KVZ>K-x*f~+NiW-qnJnu_r7 zB}*Y(z|yoq{KP@eByZ%QMVwtlYx#4~L@)_xhs|7@%T0AFb^*TxV{kS$$|L$pUnM zFb={XOa-&LuSk^s1v;h-&P;7aBvxH=&vmALL!D_S*uzfac~I4z{MHJQ!8@BIXx0Lt7a* ziWla=dA_&CO*5LXw+Dz@&v5O!#yl|Ca6?u4jTQrbx1JJ#Z~umunAamwhKAf9@m6AQ zz9+_i9`Al2Ub1ODO_$o0*6gH8Kdc3JdF%7XBtsdQ5Y^U8+?k!!Uw@)4J1N|d?askA zNM6j;6hWr0zkVu_$8K_L@>?Gkt`|v=eA-s*k3?{{tZ~jC*s*cWe}hCB)EyxlO2s|q~qZVJP7SClaF`kcz>qXG3bL7^( z#bXg3(r(b%Qx4(Cnu!$e+7(tXn^;wN5E8Xc0r5EHm_WXzN_&MIPa9(pPUJ4GVFb%f zh9@Cd@qOiYu5f`}J`d*K27EN};cmlOJqU7g5q`una{q(YDs)sW_Z00V+}Iir<`LL9 z!tjelCd!o;;1UVy^q6fn*>*2%`^{ts_b8cgRIUgQfn3uoAXUPoxy9Pz(Gm6~*-oM1 z$?mg{By%9PIE>Yi?{HH0Ao1_K?(*S6F(s>J!j=0h+Ny0AoYr9H}1 z$|bT)?;;z*Y}%rJog#eMdyZ=6)`>N&M{`P^Xb;|*ezeQ7B6X)R@{kv_x6C}vD7%yl zDshEmaScQjlI8p(IgFZ6j9H0R-AXL-hBpe?{S9V|9Xv4!+xa7C=6Ki|wT^UhK`O7y z$?#NZFOu7-(8FC79%Y%J#m2CF~<_eJ%9} zo?8Uj-@S&Pjc%+{K);HmvbpB#(XRJE#r_3?tLQWFdp}nSh(n$s`k2c1M&~6op?Lk_ zSeXa5dyY-$@~KFrQHv%P5q_Ys@iVQ$D=yM1K-=v|-xMVFpj}YS82w-RIjmXcYF&w>wYrajk^ptric}c+}Vw7y=sU@_tK34`TqWLv6nnmg1w`^u| zk5ZZzYpbJ9q%_TB{+`bG zQKy2#+!}W|Lu^yCQ8no)-I=+wtX`~D$O~#V3g)pQ^|UE6;S`pqzaDN>b6w*pH2QIC zCc7aiu{AE(4sHTw&h+O2Z~z+o}YwoR1UsN))j`*4(F$=P!el19;VWG*6=Gl*sGwe zhq*#J_Xud^ps@eOOHuK%cEDVk4RR|!kB1d5=f7JYrT>d{U*N1}l%pBld=T|&kofVO zFBxx@JDyPA zvwZ`x=N-U!uln713#uZ6>=d zfCLZ2P8%T-T#vUR{Dyhk?6iY99=^K^?$*j(o4X`9K6$IZKk@GJ)` zl4TNBMze7ztWp(?`;;>AlMg^U*24Fxfh)3+c(9T&iM5rutPieCC0@~DtnNJ!ks16y zg4LI(w4PX?lw*tWn5N^!go4Cr2KPvqHcd6P} zY~)-60)I1(Gp$Y(3ljKg3(1sNro+wlja4r`iqZSp8$A(L6y%U6hm zq%NTcuI^HNfqC#|O)!XsOZOQ62gwvoMpmU>O!%oEA*((3^TJvGj@Ke55396pBk_~L zn1nMdwF*)nHjkWX567G)r`?299svEFV;uyyodiyMgQtrEnN^U)a{TyS?>Tp&cVjgk z7h111PVfjlCEK0fEJ*GVSWeq;XUHDq5-)M?+MD<%XOl_QG1#O z;WnjbHndp5Q=`qFllPRn^tPsFzK?|V*H1I{8`k6XlIK6V-gqtb46mOgvoXmle6_j$ zy@pDESTF*FPw=}M;vU)SIYbE>k%MGeK7+Fs57+HJ=xa6cEb$}xpRMrd;y^*a4=f~B zjfV-*gpH6`wWQMm+irg69yoUEI^y{4KIe`l1G6p^4@(v{9frgLSQMXeP2v9uYi|yW z3PDA~h=$jZ?YY?*2e+ad%(J`W_29bBz3?K(b_#Q_kShiQS6~+|=oH@JJ>Tq3iFc|P z)0_^;M0+?!5Re0${c;DKS>$R5_^BWqp5R}>SPQvQdFR$ZIqyawTYv2gB4g=r184MC(FABd4tMLc4eN$2`vH&sXJZ_`;CZstUj2PE zOPJ#?dV*^o(em5iZByWx{Xm4jNYzu)$XIQx&hf2C-Q_-QxqbWZXuzCU^wew5s5TU?s`2a*nV{g+aJqkCCFho zd4xGIh87^#|6(VEleZ9QeX?s5I#@UthrpOrTXY7@Z*@g#bVi*?s;A(d8)6$TXNcb( znecVW)D}~dM6q9|>m zKgmWnWxF@x;}7xvjh1@QN8#*>7M@7{H6rv=c3K|0M)b3wSQfO!%b|Se!#L zNw!g-Uhi9qz=hz@+sc((!$I?7R6y?Ji~}I)ufQ*^O7G4bBqy^BCWhF~pV*aGKu%3q z^H|~oGDFD5rFJ+uVBYm;SK-YK$;uFwzQr1>V{J~N`-|bC%hy&o3StrDtU6G%L&|T* z%JJS`15f_J@gxmV78@o*>1_{tE|lgdj*xrR*Ua*RG1iR0%O@rwd~wNa+KXjaBXl08twpGk%i#f zlEYnyEsttDgC;J>IAh&O9z|kKi3KNvV?|Q2v);H_m_pW)Og|h2sZ3dK1o>-BMyktO z=VEtZ36lT)1AAV$6KmLm6IuTn7#Y`Lv0TSSzD#CV@I*nh$jp%c5ZqC8OHY#(q_?*< zA|QEpymhqOZhY5!XowWDHsA9KJKLU=7->E0Z;g{0k8|#3<6}thUc({QJu*Si_ab7W znOU)>e9J;2DdAc)gZ@XGpM{5b6Wlx1<#6qECAd^%>rcd=jaa|s#ODF9kI#uGVY`Ny z(K|p%UV(MgO+@K}#Up&4ABdqIbuJ*r|8s~9tLPHT{sF3cS2hy3ED3u|DfQK}Lo3o*52H!)I}ue7cz zy_nyW)^l(Tu7TX;Be%i=Slssfu}Z&w^h8@}n($07;n7RIlrWO3$WrY_zlv9r3{Nwe zN-2q4A`^sXD%t#l=F>1h&cV;S=B;a#Sj?Se^`?O_6%s?_8YX@sk;q~g^lmKZ#_FkL z3MXNIuy0M@*^lBMJnP!5KkIrPX4ZOg4Ck2HoBDIS{=xB`eE~D}gbS7#{JG6=JzsLX zN94_p#vAz&2k=z&eWzEFH(_cGLI0?#u6zs zS>I#tpGOPSGs73a0T+;ixT564c)bXd<}TRZDsrWf31#Gt_n`Fzbz4NtI~{!IDBMhw z{d2`fyj=qKW((fLW61Gx@U&*5RDBMIYQ)~fE2&|G5AfQi6M1YP2Hik3kvnS?)zG$;{yJ0Sp#BzDLZMPId@j%A*pq12A7fig?LSM zjn5xr-yAAUs|As-O3w{dKL2(szgf_qiJw@Bk|c6&jT5GU0ePGx$PYOgLF9M27kMHN zoggw2{>vLMOx6U%9}Z*Be}iUuhf1N>iAWX_HLOF|yv6?S3&jvG^H~8gPG9Kr6#R{B zw?v^cupbfVhqcLro-@|#ASey+f}T>Y!zC6T->V=RPQ2#;EMVaPR>9?;+VZ*blj_CF z{Q}PC#vhi-0XIiJr9^>M%4c1$7{^dY78Bx>MTfEu&Bg~dVOEdxH8i&rgZ3XRsqB|9ubr_XjEjPjUsG8it+dfUWFRi75pg5wB0!X;$ww*gu!r zds~H{Cd{82JQ#_0Qkbj7%ve==81+sQgU9?PJAM}ViDE46R7aNH;d;##t{!)N<@i;9 z+cnj7#`XX3WpjlSOWej+KZ<{T4~ZQHOTVB#fWi46&>jO=M1dpH`V5SM5m;>Bg7hpz z#(!rYy~-M#123(lQpE&2Z_qQFnV+ndWJcmOh#Wno%*>Li!eJ`G?dqe>`^pbQAJ4#8 zNMz^j4rLIYVjTpr8OGNzv3DeoNB+esd89PUYO?xuF#Uvoa4j{qajst~saoSg{5P+7 z(o&~+IfKk?ok;Hyw4(TT*=~1Mf4wjyZV;6?(Yl+-l-WUgpMV8YgltS9lduyMvzGlK z*ydC$e>S|E+*t)w1O9ewYRlT>+*vZurlyIX#&?z+bA%oV9K zvnGBL1;^)zSG3JC^Evl#$2L~)a*vo~lvU|pr|3s>XSK#j_N%T@oz`PCEmZVbtZm7 zbrTqloB>;by%$BLlw|5Wcv@9Ny&6Ytg}qY)v!_pF8Ev8;y+?GL?LI*@+a&hvpywga z%*q`FnV3YCn)or2H#`UGk?oE`y2J3GMHd;cRQI^jIDTq)dSb(=lfc$QVV!EI@ahFy z3S<0RL74nRd;^vxn&{DR{GUYXYlLOI6#sD(*x&?Wr(0APELWuZ`UO@+@aWy-Gpfj0 zorN=%lqgw?D32g1^0eF9b{eH8!8{Q0?c{%Mp=0}e_wn^d@O_snU#CRj#ZNPa5o_cT zu`GoDDNIyB7WM>%*P#)U6oi=M>+tTYsaE_9|Kw80R;G7qWITl*OLYf3^E3AJHLt`# zF!JIPy8amu#>^@6+T<5(V=P+-!rMHngZf{7+&yr@&QRi>VM*Y7g>(wcp3`a>YE_b)%d(g z9J?P3x)CIH2{HL)(8FZ(-Z`*q7c8qUVLbhbYwdyo^f>l#x1$TBJAmF)@Rvt{R!h~_ za{bSs-;G$#t7P|glbg8A_Y&@Y!{GuYm{0Ei8GM&)?MdUztW0aK7pspn6%vCkw8l1W z^#79>vky%tvK5bKDSY3mKvH6Q=8cvjyse+fY;N=)h9R-8LoCB$|I5UeQuUca^e4XC zIO1H<|6s4x;>St!mj_xc`7)_WSwmGT*2RCLB`GltU9BIj&5(#*ycglr2~H_2i8&oV z!XK1=TZP^aVEvu+=XUwfWs=7k%^q)NziZ@r^0fCY*}StF|2x*U+H{+zdlOt+Jc|kT z)o{f=1*P~f#FQ=4E@!;TSqDK6vo-1Q@e8>9f3O{Q@fadO4xfT|>?a2}fc@V|Zy?pS zKtE`%GpTf2Sgi|wEy+7x&+=czQi2=Xi0(f|yu7-E@T_-A3PUAl8S_GlE|$udFy zQX&uSH0C!?{A8N3HLg3eAY*2h7hW9o5-A^$!#_x_yxq;yvLBMzODZ zTdm$ZA4eYARXqGBH?^XIT`#>c!*8p zgImDlZsRr1;dei%^AJq9@%W(^=?0Su&ecq|`8qpuD(oHUjI|`hUEW9Jybt7W9um0) z^lBH(4dFsdZKHI6T0(~Eabf1LJ0;>RBI1=Qx#!rg(y=Dfy2^GLR*niEsKRy$#=~_O zEgZ@IK1v1AFH|ZB8kfw^gZAah0)}tICbvDCD)tz9G-QGhlw=AUV%S^+J0ssB5v@BbIwPDNIm!DRTpqV} z3Z~Ctr^Y_n#Xh^~yv?(&ar|{ z5l=-`<}_<$f^b6$GKS6jsh9s;xq}Ze0M|rvhkAG@-1OB*HsxHkE;X+6~`nZoa3{|@7g@3%!BnnvZzlg1-nucD_& zEz>Kk>E=*|zYFiYg6!H(tK{oXnU}$6X~HwP0y{wR3JYQ=*Xi>L8U*VeHQcqV@ym+5189&%aI)Cckt) z*jSyE7z;aTui?(eZf0_3mOHB`3p6r?UINr+MQ7yra%bVM)d|jVCoA&MK)m?+tS>zj zyzu1u>n~@l5Aju+$=*m_S81(E7p`1U7WfEpBwRWqV$egKS5islK)hf^cRpT`nw?ad z_H{~0rsRXyChIB9#%8R1X<9QDqBZVXD(rT+Lj54L&mSuQ<><~V$;>qfV>8^)+gh3? z8J5c#VpZgR>xqW4-P4Q_=@Izq!hk5s>NkwAe}xU5opjE9sl7FB63lwZG)tXgG3-r2 z{QrqQT!Xf{j!!O3tT1$vWcjZ1sbE*7M8`zScrx|$O8D*AUc<0?W|r)X*~DoNF+6ux z6L|ZewFpaIgmn(EOQqiHrgOX&M{O%z6Uh*}*o#iG!aJ#xk`5Z1i2Ggvwcd$L9l&br zgkz#orzie)BK+LBDn1sTu^Y>t;QAjuwlPt4>62BrZc%noGuO~^0j&P0S_C4$-YA$@ zHXiLltKjLMg2*pn-{CyW|CG*-e|H?G!`rv`*bnF=bAflHGoSFnr0bD% z#CZ&yFwJ5>gFOu^^9y$417g_RX~>5Qeq&smS(xCoxtL30v0^e@mV-I)Q+0tQfkRTZQ~ z{?8`&ex5E=sh}^CzxTlVx`)1LvhHv$Ghfcwpgsi#Ivua^8OLT;&2JOb@KMgc;TWQd zQdpx!#EH_0!%fEG6jGI~9W-Og(?=F$z_JM)yA69V zVv-qHhK^ZA=Jyo$e#KfsZvTDDV>ZdCO5R0!iu`OGMGTv7dD3_bYcv9nb*FI}5|$4i zKzgHeXX+`-%(15N)S;T}g5%Ip#(1Np!qn4LMZKof7dN!D*oCckgX)ya84{rh-&J}g z)U*lrQL2%9TlXkq@dt%rQ553WNe`Ka%>F0vK_A5vb>oTVI5gz&Z7i3`z5`!Xx}tc9 z$w$H0*a3gT10T47s&B+!#Gf=FOez_!6D}3QwZlka8ij}((y@>@kE2<1lA@?4&R-1#`vT$285~` zJ@)*u^>_@YO<$*UfyWMF8JC$WczrE(6nOAvwG;=t03=o3hR~xBW1JxKd@6C zca+0P`7=Je^jVmXAO08i{Ayx>3h-`u?=V)pEre)EHts*z?P##C$Kj0ZKsH|_P8hA% zv$tQPGe8lu=q6t%oig3Tw^#8A#)6hVj_vo+Kfw_4DRv{v(!Assp-nZa2hT%<)BW4>*F768PS`OE`+F8Ks?^*Y5yu+7??dmyh zVsHW3ILVVA@d{g2e9Bs`9EL5uPgS7!w{4xb$t+vFDS_!o;-A55g@Khsyd}Kq(d=4b zlaGg2{wNg(9mGabohscG1noQlKVy8b&|3l3Bs>(8SMr*wdO@8s4_bdfKdGiZUu#^Ft;-_ayk;u~uygvwpxZZt9vb{RVMYAi5pB+- zLxzlbEw})6jQod}3NBFyFV6r{FPS>2>No;kEIe58y=G9!R7y3RL>!Wpl-OHxYk7eW zU>ZljFI@u~F#{}GYAX8cw-QAP%egeI!4cc|DIV|=bU+MxV=}zQ2~-I@0pHPp<@h(h zeXITeWAqjr(3Ae9cB$UIj67?cv9LqxXvR9r&|uG^XQcZ4P3k!}z(I&xkIxe|o;3#35$CywUTDy&-(`1ZBbwaMZsrDqC)Dop9pG(BZ6{>WR*_{-D) zyiB~|A_H8G?ug^(H$*bs9UG`zle#mhTDwX=Xp!!8bj&+MDwBvuh*-!XH^RNBCWiTj zcgLcA?!$qQiZZEoo5S9i#2KQ^WS)f8a1Ys)ec-{v`vbEl{d2@K4C3#>>cnTM0YQ{b zXrM2=cb0X?<2YfGufaoH3|8Dn{YeV`kMy9BxEr1i*wI{c-uHoSaM?cDBV2JTk=bWt zZDlWd;5|r;IEU{AtkWLiyl#3$&EZ*V`BacxiQ%rm0g~gkvbK`-?c<1gM(e@XYGSvJ zWk*YQDZzh*EpeZHD!nsg_Xh*_@p(0Jfzp%V@lZ9V)XDAwnKNJuW}%mr zoypU=SU(GP#zRfW!VV)SLKq{iBKz|MI<|;T7{7$H^e^by7typ~x1ZD&do+2XOnNeIf(5Y)PTi~8dTS-Q3+dV$iElQ?ng{DvIu=eK zd+?e_N(Xlmc5(x=|Kyv7npc!abJbB?d3w|zGr{ouV+@UbEUtY$kQnC%EV8EnW3jdlRK%U;x`+Hi)2g4GE#-v zWf62{;wQqai%iI!)r_CiZxB}FJ!*a<6Rcjc2Op!c(SJ8uwsDs{v}aX&HyrRw;J4@8 z!o-t4VuGp4ejLXRy#y1Y7><5#>jym5+0fHS+!zGwl&&!oKarf@RB8mI>R7lSR-S<< z4390FTwp`XR4M`^6J~-UnebcT^1>%0r{1ck^!ZMcy^BmpN|cII@w1;I@~trKH3(~Z9~)fMep0^a#0EZss-PKE6L@8G^~qtRncc&7R*R zjAw`d=U5kjwcf`^@G3K5D}0GZSBXXY2!`xvU82Nxq)#@W>+k&0bL3rAJVVF*p%LN!m<^{pgide3Sa)F?`ZT`Y|BdB{OepXH2V(0<_w2}kF3a!gW_ z7(qTtdLYRR&Zc6bu5mUT-Ki}j#FOC$>7^#Rc@Rd)1T3`h%0^5t*pd=gQx){SMR*U_ z=>C!h)1iVqPc)uNG|yg|wi>A&hUq$Ds-tUUzu`3KKppi0g28lw39knUotafmhDkhf ziI;@q@w4$X9U`A3W;jC)&mFK13-`;1C0)V1*1`dp$$ni9cY$sr(m?{&Wf%2J<-DVY za)QDV7-NY@m)O68F$(S)4L&4QNflJ^tp|S{rdy4yP%Iq$VLlrHw;JGjkqNOT)pW`% zy_|#(A^qV_fgF`_>@fEk;hFNuX-VBf1;@!z^tB{cR>0FQGw(IT;D<>JF$M(rAoWl& zu!jT}ljaQQi4rvNJ(1K1c8OHg4k5EraU1WeFs(=(HkYwht#L9ZWg(7Mnq`jl6f!0m?p<_% z6{IU0n-F1MqlCj_y$RiAahP+}OO;l8aFDbb0S46zhO+q?1jhH;XX=Ey; zuLFBsd&8>*MB?kIPrYw7wF?MLcTh{MSfjV5l11E*L(Ug;;U zlT6Ph>Dqul-Y)Zz2fu6xi&9AJBbJg{=xWi09?bj8ZF*T&1B%O&SOsf50!k{?l^=L= z4N+Jzx*;@w;F12UrFD@B+sMp<^tzK0?|i(=J&V7QBAvCR_o4VkVZ_h#;FA=AP08QF z_yW{w6v*}&t8`wF{JCJ*ySdjQsshq81(7}HmfjXysaCm9EtrbzNNgq9L&4$@@7Ph2#ifcfo2R$*0{FM{w@I1?&gcV4$+=U||eUG=nPd^A( zMfzt;hkEIGI|ypF)A}@=5{V=QUz&&SDtz}B(5BKI`URNrbF31r_{o&Y-*ae!Z6Y1s z=UC^_OIf1O`}nzYsL)aA)NkVG6MQzA?3MU~!dUr;b4>76O!f!dw|KZDgE8~V|K_yQ^*8_343H{SWUr)f3$*%hgJid5N4)?4!D(~PBc zNr`Z8VdKI8z<-t=BvWClE+%q>1B;f*oh8xKosT8se$Xs@ruX5$7iE=XehufMjGb7U zA=s{5SEsA#YOq7$ZwZ@VMe3cbgJ?{5matoL!Lg;bU;5UZMzjA6TRt)&@=#>LosSJ| z64wZyeI4?u;agDQPu(`03*Ku1!;mgD)l`gX?CtR&od?bGw-*XTW`pHS2J`cnI| zet{a&ZfbzS>F@a$5Z=-H68cMIkxBhYl^UYacszn`Nu|*+>t zNI&{M6|!Tn1H$YdHus~6rQcP0<{8E;T$Q@U{(7<;9}mQLgP-5WCWRYn!RsXoDNQ>^ zb-@4}oXZ(&Tcq=gbhD1mNDlR3xHQ=;*WGkns3&rV(SuHv&JE&;N+0b?`ea0Bz?H@#!XIEX(vc#AzX2uu z@5)f#r`WfL*%KD0WX8oyjYy~B;FCPq9MaD#8J3`|L@y(d-hFpIu4A3Sjjr4)Lfi>}|wS<>G}?1^;o70i97H9(a9sPm-%6>B*=A=V}t$T+^LVJK8{L@!zI z$%2B1`UqxIFV#lAq?c|J-F$W!#NG*RKZc0nSK|I3u(ck(SJ1PI{1yFg*2ClMuNT`q z&6q^SV2mY~xVa!BM(M9FL!ZiD^^l%Lza2Ycj0cU7JaQlQODbigeuXthqtBqCW*V7^ zW2~O=#)Uz?pmPxGK8W^|yoB(kPZKG5;kbqqRSa6Q-My__;Z<(KiwR@RE|F#H^UchP zQiH5>6wIoxQ~t{(DAPx_c%p~hz9PNY=VC5o#jCVz*fb-i`OZD~6pN@`J#Fd*eJs*T zEQjg;a)UXj1yPs!=U%7Zwi*04hTa$H^ai{K`mqlF#%2)UW~|pK^LO@qi^<&6WWf^@ zd>kAR8>x`}UH~T5P2T$*P|_bkntmmB{xV(F(m|jEg=*w0fhY=8s$W3{QKtsL9F4J{-bS&8Mt@Hdn33XiZBN3h)Y*axAC9r!|0y(T+FYWb@0 zM+Ik)-6Z+cs8H`!iMeZ#Y8Xw_*h_aK;ZfBf*VKt5Cnc^(9f)s@`x@Kk#yc*_6rWu@ z&l@~fFMYw}|0JHQoQma1u$04O->?(pj)D*hKUqdAdO|q=(!Wv|4}zmf2C@K2d>wg< zCsQ2;suo5Cmh=*ldM4?*_c{`L7>veNB#HdQFX;1+3K$C^$G zA&~FjpLNs8FC7`!!8wH-E$HNbbM8Z|G9CZzWqy}#TY^mX@?U!JNtMe@G9uE$B)4mJ zXFbm$8Fk5~NL+4V>|w-z5)%r`P$JOl@G0KH(n$9=YKwWkw*rv~U9jT!^VcwnLS2aj zle=q=0g;n9rUHIJnf(M@n$L;6Voe713|YlI@Gj}HbQe5HYWt*ido(QGJa93|TEM5b{I(YAV5P=W>SagcNz30;IcS&4? z`%3=qO(MSNQoH=sx^Tw5j}gmX_ZSUkEl9>iD$;X^Fr;Sd6gu!Ge)PZTtf0~rK{|P_ z3h~@p<4Rz@(-Syzkw+>(ucfxe^@4Ea8a|+VkaS;_zkN}!^|nfH>BxloKy5~z7Kxq~ z1oTC%ymb!fsR7&S$L~vmy)qM@s2QX^n%sv}h)KryX;|3Ftm-WCx6|+dSJPWh>Z)c_ z-J-&eI0D}wcb52#Pa1`-s;68dqN5T#9(H=j(u#M6A4B(w#UTE|P$WkmphF#6f!bv{ zzUR)8t{#H9RHaMDyCSL_q*_wE?et7yv_s_o&?mw(yqvKMZTg1yHnw??ZpG2mXDnlv z4m3-)uD`y|7nx8+R5J0C2y{*nD8bLht^9qE4?O4Gi$U5%D=1VGY-@{xCnDVj>P*7R z?52lFRl7UO1KTpnGsZ&Y3@BQ3#u4u_vv4BBpOsDvYtR+aby>V6nDmG8@qXnmMb$En z8{(z4xwD@9e;Yd!;4I6t-vfR?6o|5YMwy5P!;l2BkvHp`4JabU(uPeCS(>uMqR7%H zkqRx^qfit_%~UWIPz)jo*&q-|WUCpmE+`fT(MDlJ$`KDEOEn_r_j}W?pY3-#b94eB zdDrKCp8LM8|Mg!|-hsDO8@Y1FI_9jZ)5JgeGp|+4rzX`(Pc%^v%XbFLK=l#D>56!s z@vM$5FuVelFef(ZJ2(X&7rp$>;Y~_bOG++$JrL`xTx!pk@`kWpk7Q^0n%QCt{z~OR zFuB~Wpw2&Ij#7;?&)-1J50bcnd-8_$i9ssRNhpWbg%Fo|Ch@~THaaJ(?I?;1f@r7( z2oJr-Geey46~)<)=^f(gjE*=~Z%Wm&%a{Yn1DC5-T5+z%y3qNM4v4yos55gS)ChK^ zKgPBERt)I_R%$(}LYNfVkAI{51*k9dwU}>|@plst6-@+?Wvn!8(GMFa|ARHmt%v*PiW+gvdeKvE> z8aa7OQo|Cu?tDyVs3HST@T&Bfco*MAeGy4U<$FCB$AZz`9CB$_sVkCHShW<^f;(%+2J>57DPm)m zq`m{nE>GbEZkyden$FdnrL*)Jp0`z|&b9on9`WLi<|OnY;B8U(W0$ZRM1vf^m>sbt zjaO0yqPm<;u^5c61eQ!8^++|{6=uB)FO35sT%KdUs^fIyXy$l+n)=q*(e34ol;^2h^eL_t8Ix94^3>FRZsqsR z4(D(VmoZCeVdd4GsRgcjM{*Csw&O9xXQtP<-ID1Y$2MiKw$4KfuOEFG^%8n*Za0SS zPSh<0?XgnQmG}kRob*PO8>ipVUY^Gk1-nmrOP)`((V9?4gO8~l^==r+>S#4KhV@%T zGI%Ji2{0JJn_KZm=np^R6n+rvQjav`?-rTys??|8<$Bd;52ABx49(DQqBg4I{Qr#U zrJu~j9anKR((l4p5G|Lp9H=x;r;&9D4mlO1Sx>%hwYP_uW{iTDGP!XN=mRsIoqfQ{rYaVn&c-rUA>Xh5dd9_Cx zVqd$)Q_oHhV#j3BH)30)- z!wvZ@{~Ak=v5);--jsEd3AAsATs-BTf0471etR^P(d{r^R-HD@ZRIw-_T_GLUvR&s>*awW*RH*+B@!5pYJSXsZp_2VJ<{j*pT=Bz15)@|Ve z>&N)IW7HS;Sj5d)<8D+~HD^s<&X5Wi>T7m?%ba!$b7&b6B9djSw(FSyWwX|)ZeF|V zahT)d(Qsei^b%dtY#eEw-*4f2on((v6+g~QSJ#B4@J&@XgrS#^g(=GCs}1M7lT6}t zU2!FL(r1bd`xm!BDZyI3jESEr-J-aXwAW#_wnq0)Spr(`iuX*id1s{+7nobC3hTi; z7U5A5lED;obB*sz&j~$zdkkX#$49tdjjNB(R~V`oP)VR_XZE;Z8J$$`*P4@xSed3! z11{rLy}Fx8$-<; zPMy1wns*;vX*K`Wu{jPF#h27Crb)Zi;aPSS}iK#UK7SA zAs_sYTpu0jdt{>TWu7j3_arFvLXMpJs1I=WODCs-UYD6+0w}8p3YezZ?HY=G}`cJ?T*J*UInDm42giEetzVz;&eQ44oNcfMjLY6Be|<4rsr=oI+ux%TOn@6Q7Pi#XrgV1G^ScVj-il-=58EEe>j-ap zeD@5VIg;*9M}mA_Ltj?9?sSbU-1k#>ZpqtJ#dM)M>5tD|Z04n*6Eq+eoB8eq9G4qNIiJaE zewTg!e>Z&^@J ziz}jxWC%INm$%A0&Om)94uv`n7T06ccP+K)C~})gW~gA|p(D{@s@ik#e{SUyy$bgH zi}a9Xa3GE)AH{FaRfDWOc*oP3vo;o$K@&-q2c@7T;9hA*7(?MFdXc3jYphv^_)Jo{KWygepI)8?{%G}16 zV5g1c94ThSjEBjdUaQ}tbGemNGM8XhRxtCJ&P*?Fux?0CQQ^A6=rA#iN0N0jlf6mz z5oay>N+)t0A4E5q7OKtEOjI_~S}gS+Aq;*>_dp*n&6S#k9IAEFkkV$xa#OGEGL>Y*gE43b&mYcE8b z*;=KCw#q#<`|A425@KWIZuLrZ#+o-+q-=AItchEw%VkjPp&u|yQXJ_b^}2XBOnqF^ zALbk~KR!8l1vL3h*e&AEtJA+{jk8NPD{Ldb4F+Bz7pgNWp;-0z;LfY?@sp3E3zbYd z9r5JxKFs6IBGYgac*l5f44Lx%@td4Qt&#>`$&AAL=n(b0?uDLGhc{h63z)wi1Y3(5 zx|(DF&l+*iR$LA6NKKFzvM#GE;o)qwDIjL;)8Hxf&*5KKlH^WOv4yLe9g98}X6zA= z+=bg$H$ICRqfh$!oGjkUD7bZ3GT&qsUkR2m6(k}xX9xP0Cz(EFXCEg4ZFH{u?sZw8 z!e^~de*;HAwM;*S^_e5^Q%mZHIw(F;52sodto`or_IlF4x|<%9EFWuC$RGA zz~J?;Yq#L>H;{9tVoOilOU)O#5B9*pz(c46b*H$Gt5TQFE+i+&^IsnDc=bV@F%U+s z8m#jf%}M5IE`>9G0Or?y>1pX*NT4=}WHoin()3bRF)|RTvF*6V!2=buPot|)m82`s z5vscnSlM4@I!ZMRj;Mm_B%P%UJ9GTJ*2b`s4+h!4k$r12*Nv&FW@ul@yuwT^z%1_- zR@paT*j%AMY$6%%EbRLM^!c$&^?-AllJ z=Ti;%v&rP^_Z?_Z0ZMQBJB=lbvNUZgFX(e?tN5B!{E=mwjLrcLxq?+(!7m% z8!NV`f^inC&#rTB6)LPr)D^8&g;gerTzYjLnU`kk;awiOmNwJF)J7JOhkyAcaQ`0RHtjq{ z8QYWj9OMdarM51m_O~zD1EWCP-eWztv0%X6XuF@s|LjVpE;(U4Tcho3qlU_ZZ-X~+ z0Oi5=Oz8t04VZ63!Rx@NRx>~CpRq9*u|>ZO^InJJU7;)RIUG$*Nh%y_hjy-l`i+7-p;GgpQ4HxkH51blbCQ9=T-TvE8$YtarLl&z%4Kp67L?E zp1#7#Ai;cpLl0ziaimucLx*MI^veK&_Dlno$$Uox}o zN|jtrJzd3hZaVpXCRXM|*Kk(Gf-kqRUJc_Mji4r*&O39uuRF%NkauENaBvkoX4RXl zt+wc1RtvrGcJNB(^NhNfiZOq~`bi)3S$CYWi4vs=Bk2`|3X&pP-33jxD92vbL4~E#I<5}tDc}?XV@8DU?g>K*{ z->{dP#VFI%qgBqkuHt!2M1LLbY7NI$u4zx$q&~XNyGvjsRPv5@pfECV{36dijqmSd zg;aTTkmoUvZXK1X$5$@HeE!t&Pk(0}eC5d<49Jn30Qwh2oppw*s*E#l4;)H)Fq1>q zjqHq%;h&0AWV_;XW}A&cek(n@TxOFT@iqi&);Yfp#MtwnIU(OIq^fe}r|Qmq;wv8E zM(*DmY+w{S#0Q+=9bwmr3&28Ropa~#iq?U3FvyPDX=hHZh;j|rhjyV&Jnjr0#mAZq zLTH|uZa8IJPx7f2v>5%Q)Jv~|3GKM_YDtn`u`w$2_G}Bn$ykU-KxeXL@wlkUr{=ZB zAGd2`lfBCzI*sPt-_w_T$E3<>Vmj!b&Q4E|z_zUZe(K-ztOvf6`>BryHQkl8fL`E=9;ncQ`AZ+SHfX>HWLw=+ef52`uFu&u$vclx-7rejU@f zMBbsUC6gQ5_`f@SmVO;AV1)ZC@jd`M*X=>fk;Ilzwu>GsaEsy7nDev061_3=nmKFa z3-%b~E0fzYD}_3oPX7#hj*dMiP`&Q~-*uX)8*(|UCDAa?*SPKHc`dR8&htsjm|ab; zpdz6JHFhN^M>=@lgZx|emU?bG#q;zOefdo#6T?V8xz9j}z5i#s%(i)e9w({ET%E;y z4FV-Gt>*#Gp3J6je)1`k!xCnOgPMNLIi=tgSgFK=>ywfL_Efo1k-~3 zd=9%h$R4lUnW^ae7&HrWLfwD6&%DZ*k+G8#r=zYisi;3p#gWx-q*KG799;@d+m~wb z@>X%6bi6b57BF*VSv?*hI3fC&9W%m2jZ4v?3UY*b?Fa4ssHM$5*UbJ3ThYFVnRht^J@gLkg*#0+pj0 zI@1IHsQKaM1zcy<&5t&}OLsVkE3KgE`=TZ33SL# z>mT2Ja>o{~qC**W9G<5==)~nKSSt;8RRwm+Q)o_&%Ke2l%<(N2-_FS6X+1o0&>3 zXVrd|UF$<|JDp!-lwDyR{*d21$G<@aS#jMz?#e2`;r8i}8ulf$kW+G(roWw&jPvA= zL2BO3J&b=_J)Rfaa=*?iK;haU|1cc$srd_Vj5?aj^+=9IHrY7+@vmH+J_4TO^(bJA z(Z`L2B|^F(s<-@*Q}b0|J-TUc#%XyK8I4oWn75`)W#?Uoj(t{2Pxj#zDZ1G$#SgC= z?5F4k*-t$-R1ejWp`MOmEgZMm9KizC1U=>Tsl26grT4kw-tvJZS|y zw&k$amXZPzL2uNA>(s%(akMV2X+v`Kh&(f7o%zzt%A_ANn*swppd4b8(cTQ{2Eh)`vc71O3k)jz}S@^r@UDzsgZP`7oVo7K*j$ zfdyb_>(H&efl~Iq+}rS(PDg(jg<7#B?R^ri$#USRijxdXe+mWX`oxCdhIH52H+i&t zbaEF^LrzZA_h7Tr=)juX{^(J4U7m>AG%|Nq$_c9Nhcd2$!Lld#=bQ%4xa#bvp?XU9 z&*%s?^D$?#JjM$tW*}D&&CRi|QIR%^XY81>BIR$))35N!b)k#WH&_=T`}l~!S&%t! zeHe0`IS#YHPfQpRmvz3NH%J`Q*Jyafa<#0DohHt0IF!+V%l1^J>Id*5?nl3SC}SjS zzn*-KlM_j_sqsDO3O}B{_y)MWrimN}ul|^;$<)|vI)$$AVbpcnC@Aa0@E!_K4F83i^-Yexn2N0KVR(<6W%6D?R)xG9IBIyJ$e)z;uEJlu zsTzj{Q=H84djkZZg5y<{(u8}%oHck64Mr$EmD^+Y6H8(;By5-s&_l90ncC zos4re_=~5=2wMxr5fPBp-BSNd^0y7D@$I5|Y*>!F5jt{M;oZ_!RiE58XU)oBHxi$E zf_1o~mL$nj?3UJmj=D5{8YCI!Pfd;Y%>%i+SCzDgX!Z50iQS_6KfHY2Fce555OBXtmdS%!yCq*Mr zZHW1pSgHTf6T9qYzoH|ViTbn~IL&}85d{4)FT#6x9zA-+mep`b)$QzxT93048{~SMi zJ7*;v^jlwoJ93zbZK)kw1Vu%L$o)QU^EE4p%IG2FcsU`G zd#t;t`Io0b5LG>#8M2nH+>T}d{X$!MYEEp7+J^w^WC_#vKq{XU-eLX0Z3C&DSlK!! zzeGaB^gOSrEY3qGRCLu`Ghk5ckoSR*y`6I~&{|a$v`bcp@m4mje`vi&#-6KL#?0gp zS6SX*{D+w_aa=Rf@x+f$+l970m31L`+c~&61Nj8b!Ovd`Cnpyz>Th^;J+saRmf)#y z5NvziR{1gNLYx~P+jJIpIsKyYHad$kYX$8ay@2d2U9U$m84-&L+kS~x8XKb@h$(5$ z)U%bmT+asRhn!9&ps;Gwji*)5(vXs(OmNPkXdN`|^$-;>+8 z$~y_IeZ$=(qde@596CVnswxNbWfwH zs7hd`M{<@j*J3R(t!J|=Aw0o;i~n6OI;h!n-Qhu3s?O9jI)N;w#+w8h7UcC$<7g~L z5fn>Tf1LHq6btwKEcUrd9Jf1yn(HAN2c9H$o>5;K-;Y$8emOhXv-Q{0QD6l1BcA55 z7kT_mAxEz3sB2~9?L=4lB6aTP?5<<+sGxoW!wqIWiYKN{{|mCWlpqqel-TexE;-s(qt5-d(fT9cC1P?CPi zRK=-FGF;Mf`Y<#2TC0Y^bQGn?;`1}XV+T0OZS=KwaURHGch>%5wqCEBsPCUA_1tXF zOU#<`2Ale-&)($3%j7$$=G)6W$m|Z?uqQB|*vmvtbYe2E1Gg{mHa$86ANXfu7v--4yIBIKIoy&pUUtcya{tQ%Mzvr z4+h=}C9Dj|AC_?xn%O>9?lklH`&1tC1V@GV8@b)Ohy{3EQb!&UCYOuWh_N z$PR2{o^S;O%Bs7^Ab0u_>Y7=s6U-yvC9o6GH`slMy`5seN8yBq=Nr`6)|cmDhWQvI zxiKG@1@hKLqUiP9R%YdMAYdv+r-7Q`5X-q70m`LU&^O%kL%vK5ZC8Fz1s4nF8j$~a zGhfWQQ}qT_nb%UQ?~|Et;`$M2I;B>lz& z;BSxxJ><4AkkAh`b0e{Wh=?|lWpKN(VbdR>_a`9 z$qwLaFy0^HNOz?_{ua)!Yw|`qXmu(NgExJ}e5@PQ*-x2qjmiEIEA@-iRi<8*ux>xf zxn?eNAv2Ye+nSS-@wV1u$_YWBGLfkVY2@*}Qp>iZZLQNw5pH1olB^r({Nx+6+fZ$o zT(gATr8WAU!GIKCzA^M`eOX(}5+-o1%WNsFh(l|uyR%c>&8UJ+^a6(joBWvRgzUx_ z@IxKJBuj_B#+^%RpW>*DBBADR^;V8a8SF}{^$Fb0RQJC1KGsT(idc-iNcAw(JSvBJ%R5(dJJY)5 zftkB*LxWe66hlJNT9g(ucTLa6ffFs#+h``%{5=rWuQ`Ee(*`Fbnb+1D-3vD1nIWDzt@JvRaIufzoH-cM+UoMxO6PoO zsBX%z4w(M(*ZRV{SDeC6edVcubsopuC>Lbe{J5XtrrI6$^jjgk`9*H0zt!*g(*&np z)cpBiQ@PYvKZAvmi@#z@sB=FF>Q>BpahM9n`T6^-^Liz}&uV`&Xq@PgYR~Jbh)iX5 z*4Tx*;rrlEK)@cSa{HR@X;S_=oD*)y`*r>c`M=HYk-wR2x$*f=^3xUh59d9TKOT36 z%zQl2$d0?4iZ3$nI5p#6QSx+RMN-XEO@H-QI<2>;1Ecsl3g+I4I`Zq>&N#H6rDhbH z!)KCP-wob=l&Uje$Q)P&aKxm zv-yLL53Gthio6eYvIvfO2^wVai$(ORYp6o?JRN9a8l0_eyf5pszkz^U&2cURx9`Zx zIu^X>V?3A2Ksj$^r!Qtrs7BqqkK?$L&xqYTL$|?D`We_-Jbcf4@L?X6VCgvJ_P#S%yln|To5WW)uGX@IrnLA_ zHYuqNXy%usw&EWqD?XkzJdH%~V_m2IuEu9Zs1>&^xwQ zcMCyFOjqg)%JCWZ_5F5dmre)!a3@!t?Gcz6;to9luKzVhnPr@*?*$v? z(yLx^bJm<0@_d>c9~}VN)g70&E+;!Jf+KVZwc_-^`b1nb(Fd$gEQ;%l)`1>~V|X{K zR|Gx^x~F*6&f6LR$~hU#F`lGX*W=ij&K&1ntXhS*30Pls1FO|J{nD%L&LuK{U&cj> zV@ADwnAE}A$dUNT7Yvw%hT<7kip{71^sp!M2ISxRP$zrTvapckJnHxG&fp${bTx?p z8*^Sz8t)X~6q;i+%e(`VW@{sBBRjKts8Pl-k5%vsP_w(?hn3*uts_ba%xQfwsHNTnTaZX*F3%+IuawI$7woY%Ql^C-WG(f*;ln4R#8l54M}_k;dpI>N>>{)g z@m9Jo;#p=GEso}?Tpjlwwo8X}>K&O2xDE6)R?ddW#8HCI!$pScq zI%98U1vATYY3@(CXDUqU7}oGB=!*Aejf7#)lbJvO?!cS;R6mD(FlSAexSF(4+zW9b zD*)3~efBJ!@kLPL&eWAAW~f*zW7k>2q}}8zl6}ajT*WO9A)nN3Cn>)tGw@kBhW{t4 z{jb>%@XR4oBb&}TGvC=sdhW0DQ_0AAl3k%He2uaR1c&NgJUE??$Ze=ZGhu}kq?cb!M~GVq z+@?cRBH?)9%~^909LG;njXGYF8zZ(*39yVE7WFVhJ*Z`F1G z<$9g(@aD&-Bm&R=k=4ClQ{z!sbqKGJ(D9(JJeAsq%E)xaPOOFTtOzpt&J3}xvEQ`* z&)X_RZD$+!AeHC=Dke8zxwUM(Mtd&FrrpL#SF%Eo~lrv^M|MfMXs0A@vdaTrJk~lN^mW8Y^U^#ASMrR9mIgD zn(6i>w|EYW>`kVNqGMv*8^JpCnh*tX^7asCm$#BBhZ6#d?fLY={dt}bxxKD!vQJ(I zXR>?N`86CoP3+uE7OSWrHSJQSSF#&lr-fki2g zZ3-~2*Y{f7fJ_zm?MvAiR3i2m)R}dvS8BzU3n_(F)&_ZlxhIMQd-H>!z@87fQ?ynk zz_KVLqoqA-W!~2D=oh1go?-WCjc$!juN57gKq^lJXlCBv%UkX8o`M-~Pur1RSJj-J ze|kHes557&n0r@%Ch1nRlq)#Mr=V7I8g>8cRQ^uU&;fz&$S7#n6zNRnW9xok5_|?q zLlayI1~^FLdSEW&h+(`+SX`~g(~lU=%Lj>t>UT>^>r4n?r1XmpuT96 z&=oo}#$7J3g7d94?GiQYQar?_<_GfsGygfz%<=iA{syTkUxIz#jjD7kez8Ai;!Cy{ z^(KkHpq<6c5`N6zC9wJPVeS6{)Gr-}u{GT0=XiF;QZ+B&5h9rt-wpctIJ1UoQiAiD zKQKw*Ctu@^s>1za)G}}9xIVrJB6lCpAa~>`ygG2^0pC|i@DlfY8YFQ#%yJQ>RqP+{ zvu^9?{{<`6rJ->+KRlB>7yht*Mw>YobV@k3Y4NtzFwXUnpF@T%d{cb2FNT~Lb;>+Z zR|l$Ra>l3zJ#<7QbSRO5DyHY2Ek|fFYg{8pOIm0pD~FZ08cyA6_V!QEhK&IAXst4H zuYB9zz{gad-Ul*zC#?RZxb^9YF_8YzJi_tJ@w3@s^n^*uP|<3lotzXiO5uQ#UZxA3 z$Y2X9mK8V%S~G|>j<2KRjlXHvxtinjtgba8pVp_BUR6KXE0yP~jc!ESmOeR=2?P7~ zES{sZ;y|hhg-YZvs2H1*)+d@~V8b@~M2@MQhzXfv z6@j@8YvH?^x4oW8h>X=}_Mw?LNm$uCLm3B4$Y<$G&8=?#J#epgnXgRPCiXOiDqOdQ zNVFp&L_f~!l^VA_hMZ^l1-UtUU}c7ViH6N`054r z*hwG>v*>%zGl_R!YQr6RDVm}K=)#NHWo4<30U?^R<7t>X`j0ll^=(B7bc{ybXR2kLp3_e^pAIoGCZ#T;lGmxy>OKw~q&c1$U`l2Pnc1P9 zQRZ(s+E8=d!eNk+=E2pNj2cqTzL;(cJ{Nt}ta2q--=^0t=C^VcnMT&=@~28u4Ylk- z)g9JJeok`(Mp?!DDAHe;QcROsCIl!g7 z2d`i|s;~H8wx}K#bMUY>#nP;lQtB^V<}QLVFJ$#m8C$VMY+w>sqT0SUxb8}lR6fpv zyDKASEftApjJ}AiIP@*Yoqo6(Ox?o$Y#I?ML_GXQt$oBxO*+CX?59hFNRg#&k5yveV6S zQtf;Wp1S$dfl9UeruA6Wni^*+W^E*%r?{|$C5((MNN!@C=^yIykHKBq0}nvGy<9$7 z=^s{Zvo9sh(RNVTt{z*JNe}b*7|ZNi_Y@R)tTtA%m$zP*J%FC8C{Ep@6PYn|T;H%ylF0xs#S|hj z@l_;aWx#G|t#Z~`$_}}3`^eanRN>#!jj-zR%sM?dZyUzhF&RDlD9#R)jt%PKvswMk zy;H3f$=rN0ySTcp_h4S)C(OOu-IHa?yT0ns&5={JS^z(zVZB zw2e+)m-i{~P9`#q{Sv;`cc5}@>0jdubTZhS`zbx?o?uDta?f1{(WW{28`TB{2DeZ zf(Yp)R6$OsUb^B)7r+MO&7P}?8hQYK%43@*gE>vd#WNh2^oMXDa(20bZc;B{b!lQ& zBw`M6&JyCnPD5j92lGnS34PGZSw(2Zuqd z;RL&;Yw|jrIngD7hdI~0MBiH)pG40*Db>7RI-$&fvrAvUD#Cz$8#Vu#$OR7TD&AjE~?KodEa0!lT`d?zv}{>6oV0 zMo@P+Gq8^{8(faT0J1j@l68xkqrwid1(#%J8IAbZKF(@)KWpS?tgZ>W@h_$ySh&57 z3BkOrIKK^I(jIt@`A7shP?-s{NKUN}d9z-jH@ltv>vlS<2#}x^?2#}qIG?}eod1Ni z&|Z8mSJorcSR^rLz!}+95ZttLc>dKn;dMJ<`3wZ}{WfP{-Ut#itg0U;gDjmo`_G^- zvikZ^kKaln;rQTppuB$u!Tv4h);?xxUx3AQ#c8vQysmY;Z#{V4`5rt6x2)Lb08 z#UJ?YVQzW2`8l}0kA{B!DEIzdb5!%kd`)bQy4tFM4swM~v?T4;SdIFm;q%VWq0u$9Z-gq~`d>RbS^8q`S z`d2F!rkC7<+(Q1;6=niEziYS2!+0vh>NeD4!!dT%k+Dvq!7Ra*NnmFFq|d07ASeCkDZ)uG#OQ_gV2$$gt_zhO4>PmGh67iX{Mhs{(p3(R+ zp{a#4m3$fI!{O>MYFE)!yKbG6bVm!@ZoZZN1E}6$e)OZ}(_2O@io28*X7V->x3C1K zWTo*sNs8C9#Qd{n0+t@uBj zMoW1BhJkf8#{(1~86AyIL~`!~%-{O+USEO#)E{NkbD2@>qU*pzRqEW9Rk1}~^<}Ew z3Dl`F&gAFgk;rRq0j=#vC2RfL`!zMk;T#!zLvt|aZIx-SAN@@M7IzRnse7PB<{ z*Y*uV1MB8G#svn^Ns;@ zf#d700|8c#`UbV#=9+t%c<#rWZ#g>J)hIqyMcvAJhpLxJ|D$k`c7R!Jpz^yNuAqq= z2RUv>*-`4L5O1eme2BH)sjW)R*I`4!8t3n4*;SVEcqW=haGRrGy!U}RF6EJAO_|`n zj?QC6Mgkh1UicR~hpA%1qBm1HtXnatel>W)54iNIo-APr5jc*D-FQtuM$K!#+?Seo zGFOuNBK=C_BkGy)9(C1ux>?muGA73CoX`H_l+_)h2Q}_$j>#cVzUT4Lwqo6%)g3ga zndxH!tf74*QvM2DJRGw4XTxwp#jfe5~2QeI=JPs~k3sFJsAIO5Bz1*D z-ac)V^D`g5-LIG+SJC@#;M`F6p3GcW4eDCdzD03U>bv10pdPDZgL&xGI2)4TJ6?KK zNw;^pBSVs<4WYW-uUkdPDszj8Po${Tp4KhKJ>f{eg} zVB@kgoXH0&SJ0d575NN|{S_#Bj%{+Ls;l@OR>V5eW^rK)O?A$Ne3+71`NhdpQ<P8P&Y|Oujd6-ozLWp#=ENzF-bUy9~9jb7P2&>7SVCqa#5$%rQ`WS`X`R+mUorHkyb zYAv0NtB@??aaC(9=2KH2HfHBZUXPDEhTU3ZBOF9&?~Yk11G1I}!cnH^JyeVX!WW6^ zyFX&uAP-+xo#lZMTrtjyPoW(+$YkLmt5&$j%&bAZ(^#JdFiR_e-+PdCbV*2|`%JQv zkYO25QW?H8cri8OldKbRUi9UgLFGed8S1R`K^sHAnaI@XG&q=Nirv|b{QoDajH`A} z*pWoq`$RD1dxoGWXXf}heNYh2Krd1(@mz@+8CyK`ELRl00-OTp=&r!dfG_a6&7gS! zZWy)s2Ch^vEE5pTt?WheqAVx<{PQ-#$3^4DmB?(pD9-s=QCv~n;c9c@eNkIw(`A>z>u#w%!j!d~xs!8d9TTh= zO^LPNp9_nudG`t`&>uI?Zkk9X`v8@y6>S4`t3O{u|Mcl@T@On`$da`s=M&C*<$R5x zhc^Gp+EPyvXInb1%~^92Y)p@9_omW{iY=sT;qdNvfsjfPXKb))^L}5TdW~Z$sE$64 zTF9A}BZ%Ypd#H1BGJb?Nj*CWmZ&{q>fDQ{b5Z`y+7|l{GG?tUM?=qdR4WNasp-gT2qPd1gTR* zn2s`6JJ0;*NnX94g?FP68%GCOz~p&66FTSFO<>=qG|FFEl9d8W`Ag7dJwFb~GE00lj3G@?AsFT;FsYtkY4>y`9rJ zzZ2@5^>CJ|!0zv&HtZZayHeo}+<;H5`mrIf%U06KuE^L#xB3c+jd$_ch%>JPd%~GD zKNd#wPjmiC;!YBbuXj;LCZV2rIBzNputChRzUDXM;e)M0Wp^8l>>$|?Rs359-*Png zF)*F?Y@3|86gNTnj$@cXk6>lT^^@MkUG#&H`=8TluV~%tm`yh7c5m_`YTm}PnQOr0 ztaX>9-m>E~c+!Kr%C|kAwlps$c%<>UyzaZcrW))@9^sbU+o+Uh!Zb^Uk$)J*?G#wv zk+~nk%_w6nodVlV_r&FytV3(`SDgS#SQ^i(r^^e6?R-9C!j3MPc;T>fh(wQSoPwjA z-ada~^_oIeaIGmn>^LXz#4X?U2tII&VY4=(r`BU6k?T>gni_4!% zm|=9ab>QCJcU^k5HZr6BEVKSesneJ^GubASbT)hmTr9z5#<70HW|mg$&$`0CUJbXw zRoJ!6Itw;AT}2ic4hc-`<8m^erLQ2-BYiPfk{&h{z(Up81L;tDpt4(%s-EjhxaKSQ zExz_l8rtY%%;>74hb`G1wmmV#CR>jJM@K07UwU%6xNW?rn|A33e-gCgmL0tklhyZa zJhtfo+>ht@q(9^}Oyyj?p1o8zh42u5rL%%b68rhBSL_MqAXngl>fE)CYE|EfEY`v& zsb0LVC{$;d=sx0|bTpmPU*QUWgR6LXCR}DZ4b{_^UN!qFz4o2K`$G!sb7Tq1RL8N2 zolCCI7w8{ghM@JXjlA@#?zg%-S)ZTb>etckWu`f;(IaCcNRzpRy=yQ2A3=J(__W!< z9rSX31}c5);Uma9>WN8H&P^;N%>UFX_6E!+D%{gjW_#O1{`qS>Oe2!PRn8#E#G6GdkIj?R&));!v z6jmV}--BeWEoObbm%jQmJ<>S3B^_u_!^W_-ekJoTSIS>5Qm2xfp} zc4xf9?jM%0E~M``1dsX*UaYeCqJ|ztTe>1ccAPzeIXNR^L#|UWds?HzxAmufe+TyN zUKl4%udM~B5gIp%Z)t7~xx_n}vL}#e~RL}1deJ# zZVG7|qu^nEg@!SKWZA1(WB0MkN3nBF<m0xu1C^>`#(SWR0xIcof8P z3h&VMbqI+dG6kyO8GprVXaKo16)!5g23*+AA#d<8`X4i5$%g{wrQ^0;Z@)_#P@q4bU??Fkv2Rk<0o26&H>s}fw zd};g$kfIZC8q)C@bGj0r=IpU_htpywndZVdJ()`lCg(wB%t@GoEAc~7<1`Z9msp+s z(lhvu&RL`PL-;nGEo&o7(LbqplHV$u$f~=rO6PLfU7lwmpiDJ4>J3CB*aD5 zH*gr!Aw5!};b`6jN9_o+89o1;`RM+a2u2zPiYn_uPa56Jbk{O9;4_ezbi7N=wZUx` zPN#EyT^}E0>NK}ep0B9A86;)&bET}7W`>@mvUDOG#dOh$WC`e)I)uWsq);_>2rm>W z%6O;gymnFzJs@TH1hIT_ga#bzxLRrJa4#!gg!=wYHq&kF8C!^}vroJEw z@|E-+ZYAY&-qulcJpNnv_an@GMuH!p^5ZNp`%~mr)N*r;*(%32=^>)JbjwFu4H77s%5ZFk3+KP-NtZw2HYWn)qo1^`JgCP@A_joxB z=U{X9*nodLoJ;doab96p-(P9M93I-t?cRZruIj^7u<>=)P*z@kG9ERVz94hp<4&_x zK+jndj!RnwS;T5mM8Ga@?Xf}MJF_~)YkF*ujUwW=zcPYrTUEB_SZyR)-^wELu8wUw zGej)jilsKvbSty#-Qkx6ymby_F$k+Pmn)EV2k>ARfSDV}GS?L}GnQ)2EQn&@D{_vMeD2 z?+5ec)lP&Z6yhehE;TmB>wnL-yYUsdNG)W~HHGeEU-oq**vPB?GrP+aIDVZ_Do0UrQ@mqg7R<$4TK zQ>-`R161+-VSH^!&!VSoLw|QFH48tp+vw*C=#vY;nd|v!1N9%iz`<^KQWgvtMs=(= z<+JQd*9QZYv+0)g0!`vI?4gF2-F=pcfQfJApbtLc1MGx$!@i=~RCmsfJ98^NKyVL0 zMbm^HSI*=?lohAb`{ce3N_CtaklAO}8q~1wQ+0ofkIM=A=6Lcd<5AO^>HQ_yst3r8 zJVl=4U7#2$#a^e|meVwhR}>41_-xRL$t&p9?`1+ijDGZUJik-m!1u{DRRl-n%(s|P zuTI~|9DfLvudb9?B5a(u-|%ODu!BnYrKn_4!pb)5$=TcuoFRtyWBq%cV=;|)eLY9> zPTVo3R9IYEAW?cuZ!C*@}$GT+FiPh%7S|m&hIxI%_pgp=WW$n^DbWTIF8>AKBr3hvxu z<0?zo%-*3>Mlz^G7;Csn7JFwq7*)+L)PeZZ+vTDm9YU>i7Onf|+4oUxc_!XQU$rv$ zBWC7$3j73y>~uQgU+34O_%B8=uP5MNavIQp9m;P@|IhpzaNMZP|1*lPH%R-~3C49I zCw$xdOq|~X0jj@}B-Yq8vphcD&Qw3Jm|ZC$=^R%SY=wG!VsqUG z3*hOS?ovpmr|Qf04m$xvr9M3x*SnKD`lrAzz?H81F8EpO81KQ&lBYEgCWU;IHfk1~ ztaUL?4E^qYJ|}NiNv-oB)7b~8SjO)5c4iQm?rUbayI3VVjf!LEP`dHw@5a53dp<}V zQwQ!U%f>!^7#+F}kn@;nncjWrRrU%}_UsT%6g>h?Nh%1RgRFS@S|;C$R+BsI^g~tZUCp$Hg_qV=L2HO)nzBv%>?8+mJ zXp^{NzNMxuteV>h$2qqjRq$qdQ1imCr^j8+{?UVV!K-sM2+}xkvIAUytz3mL9pH=4 zVsfJv!;H+5q-FJ{$$o)ur(i$@9Y$yPUG8rEQ%Jdk*;E=o9KO0L)$qFEaM2Xtw$O}lg+v62u@iF#XSGl%39FsZ+RE~lK;eH4uGN11uE zBlA4)rkIXIaO-lAgFUP<$6>#zCmopndwM0cKWAC_zhvzn!M^Y?-Jx#D;-BnFph{IJ zn-h|jkc?SGa*Q>zF1XH0WMFy)TCd5%U@`>~ItNxj26;3Q+;@6l37R`yX3@#TR&2Qk z|8%hx-SYA_x?i>;t?tLahdVyCar3rG~Sv( zw8$)Bv6fNv7%wv!MQ6yZ==13qzz#Vh%J}4Uc~((j74O8>w9+E{#6_!QCg2W>6Ot}9 z_7SQuQDX4tR_^D!YNRLQjN|+^0puxWCtE=dJgeo6^1bjTW zjc26{TJsri2Dex=EG%X&Al7;iEG`=>n6|$tH=14zF#tZ7V_TgaP0JT z9rm306GzIO0#-Vm&tv?5F?1yDqegLFb)-+a$p4x?0G_?T1hx&&0P3k90oqaT(6J zIwwy??a|Io8VA3y03}^)%unv<8g{Wm#81Efq(cY4esafE|IwjCSXhVu@!z!_I(JxD zJp29`a}$0(W6_NG2YxYkOq+Jio%4SF%egbJncpGi*S{Kc zS4SQsael|5&~M|X{c=(9+=bUnTQKuyzbu~n^J$A_-oJ3(f@vkm*UaxUXwY3uW0U!g$r+Pf8&GN|BA`H=H{EH zO?zO*f*JSCTr_jR!fDfP&c6BXsKltjH{TQb)z5x8Yt}!0-u|N*_uoHn(TvcmZ@>Bf zAkm z@uK)?4-^;uf^(()WGKFW(cI#Nd{$Qtx@XYLMTK{CxTC}Wn*Sf6zxeL4`JMk)=%cGS z*OYxPkLTCFf4hA;^!e|%d;h{kGwxrsu>FL+?ti?&Wu0O|k9=Rk)e|}OJNWhQA33~3 z-hVxE2_GQm+Q?zS|M8grABXK9HyIlG7!Unn_V`XbvtK{CqoaTQ<0|~&_1VK;{L_Cw zxF!=4|MjjvJkziJr@Q_5FI;Z_d^!K?oqu?0`4Rv3f4Qyyxby$GH2(Ebe)x$+{r5xg zUAIsF{iFQ%N%^mj_ruSr&p$ohw?BNmAAIWn`UpQf*5Uv32;)Bc$1D2#r~8vTx^x-* z_uJfb)sTPOy360c`>(%$=UT^q@AC-$$NgN;I!rz3pB*~*>z~}wIdtwad{M|0-Rnw6M1>;Loby;=Xytlb;`Ptm50dp8ypuUzq8v;N=zpMQba z=GfX;(O}Ww&cUUFzQO9ji@fR^d>!-gu4pigpA&<(W3_|x`21O{`r49fo30(@e=UDE zUF*BndF}MI`fC^B?`!#8e{Bax^uC_Y=kUAw+6i9$*R^tf7xDYz;F4?JYk#AqWX|&P ze-200=HIUU53g!@uk(_*vWTVQ_Z;*Cn49r#W&Q!;aOCgN{wkMXoc>YUc?@wNtN$9ZQ^(&NI%}yg%ctcUHJ2 zowuAvIkw4J~4TZy@a43s+bpv5OsR@tJ*0%6nUbWL^ zdnh&hXTO{C4cZx^r9GjIAwO5SIj<_@88A3Em7i^#QA5l7d37_gn)P`*rm>zk_&BEj z4|(;P_nHB%+O+uG>>T{t;P{n)TW&_iBmaqpB2OZg=(1>cbYb*A(YKK=qq`%gn4wFN zsc>Pis%wpZ=(4plEzsSQ+3{)48h=@~wKE~lxcq6(in8vWU}>S{*OJVRzn7F{rv+*Q zwtzcyyniU(>k&p|5C7{1JOd+)%|_m5h4=96cf(%{=(7yQXNECo=dWj=kta^#Np*I| zKpkT}8SEICVZ=uVP6yqL=TLZeq$Zq4zi&ofhL43miF^{d8#W`CBD*zan-x{6>o$DJN$Y&{zS!u1Z*bq>nOGuE`z-c)@IJa~ZtTNoPHbN6;$UoW9g-2 zZ#wX2|Ip=D)>vXh>-BuphMsJS{U^FM)*9Z?|Ig?=da^mTkM`!pa(FGN{}1cvXJk8- zR;pOBBca-W#%@pOpV5&ZX6Ydz86@K267ir|&Ej?ch6rv$USV1kUs3F!@D?jzY3xO|KSM8y( z{uZuwGrOmQ75#5n^YiHSzSv26agu)gGrEE2>Y{fCV=s^e8?SO0k%iHlk)Nag;M1R@ zb2)!rERC~^8P7DXlqBtAOluj_w84F``-2Ct8hYP1cy#b0^7fe7>O)^YLks`czpAg@ zAAB}A&8t7rqi2|ts*o93&{vlIWAR__-^zX7lahZn|4v!5<+LTYG`IA};-<3CivtC| z!kmI%OA3RT$i#ubBzkCOK-w`ADLL2Y=82_CP6v~blEUDj-nxMcfzg5LV1DRu_hfKE zUnVm4#egkP9gGHbd}C;u75``dSbrlcI~uHJ?83-hG`OSxc)zPRIk>E+HZaz|qkkkc zyT6XREa-~{ZGq$cf1>?v^lA);`Ft3O%8cJP38~JD+{a4Vc;;G0VCi5evNfu4uL)1Z zXE78Rp%*pb{m8~mq+u$2DUuUQMXyb>J|sJm*QxNjzApx(3x~pMV{ao*(RiBm|H+P;|%Bq583dJBU$dJlJ>__qvr6n$(>vLfft3us9%X*Ud?dlElGzS7TjFq3Z>zUa+&aLFy=|DnWZ9v-7gPxrk z$Y3>OpmCCev)hLQ^Gg==B?kiq)r?IA^ZC3-tECG4>P9BU`nO)K=)X;Z99Yozz`v!(7C78} z%Ae?e&Kc+W&h@S9OAGw<{_~z2z2jHzhKrfsbhJt+^3UjXtjt_y^dxfB6qmk>{PrPr zOR-c<=#eg@FDDj=t>#_M|Gt-o`A_tn$B@JMb7K~ya~|?29k?$h`zD)rk}Gzie+F42 zmzaYu(LtA(-EnML6YZ+~wD|S&IC~#bp2Ia4IU3+^6UTDsi~JJxql>$~llJrIfG^`e zUq+YG_Rsw9=1IQf|8@HHWi&C8Q?T`FS+>2c*>K`Jj2U;z#*EvAzm|;f+GFit%`c0- zWHscmzCw}Ffv-#ItijT+OA-wIt}v4Ec~bJHi&m6X7zueR$_g#As@BfmKX~5r`v--= zzurH9Wu4ug9JF>0UEXWCl{<8~?VC5HnH`6EkM}3~r;9$#Ih$X3#aaBk=Xn3@{-&}E zfi?acy_Hu21@*|kt~wA%^mq51>s!!Q&ssPTkc1!ZUc(F;m#eyN(zq3!`)kY4g?PMx_Eu4_j%7>?^ku{nrY;2UEfdNb@xQk0}uQOd53!KZO?mVw^v?S z){}-r))pn?q0fujzNtxn;6H?vCI{_pwt#vxivF;6KJV%7dEj41Z(dy0)slWmL@Rc> zlK(ZVnkjyEv&v_M)8cFI5O?jS7YTXKF?P`}+rp{#~Vs z{xq~x8u!a7$n2;|f8LYmzkqjgxck!_d)wje-#>7nDU8c&{MOD-b3V4D1$OjT^cP~c z(-`Lpq@+5il`j7ypPtEY@Su71dj`FkkIktY*nxieVqkQjGU8`uU((xjv_K8=DQ)0K zPqc@A`fj@DdC!b>OV9X~Q+`+PmY$C-Z%WIu7xb+t%PDwe^coe$kHsHbp7%7B-6@-2 z(r9fcU)JL+-g@-T0#(J6jyp1eFV~z7_Dr~`m zS_>Bl9GEW~fHM5T{@M)tZ{eG{QX`lrA9vF3NfKD@#ryn{j3{~0v4ym$GDYmt>& zyo6dleTZZ|j6I8cmA8p`YOhTaAxsXQ8I-s3H=+qeE#<@ziU(d3&&;{DZ?J|QOyQ>- zL6?0J*^Hk*7oXq4?}JFP?CC6Y|4xqWi`C%8U1GkaBM!!PV0$XCF|+Vz8$oa%gx4xMH9nTy{j4VZ0Ttfbj zaQ9P;&6nu-eNtc{Vl z@3*B#Q9wHyb|W6m829Pz-x$irvlzoq9Uah$$VV4GK;xDv%WiajQs~3zL}($s*DQvxTvOqBv8ixneAZjB zAYnX9y|0Yxyxsg>7(LGuK4reYL{rT}<1RzjNptPy)gJ6%D(l6MwMhyY$ky!sn~}6Y zC^Cb;Gz*{Ycz&SNPcy0=1HYl8^6?5z z6Z6$EqB^SBM^RV?Ucx9I`D9Qw_{->4wD3Q8-hbj#-o*m{gXesKZRi{v9=wfjdjikv z_TYV1^!>qUek+nrW}Tkk-ECIv>%rG}ZFBJC&Jf2g9qh!H)9+23Ym3MFHsqj|&raam z{f*bc2TpKyC;#W*(G}6!YhJ&mMR|KMuAJugH1W6IPjY9yigCBwypjZ!<9#RpuQaKb z2e|Sg=N8ePKK~o%PjW;a)tR_gsW@SnHs)}pUe{lXaZPnRqCdcubHE#li1yF$zY8Q| zDaYPLd^SAMea!zcypdCpxiLi|`|+ZO!d=MzMWk}x;2=-+Ka9xu5EgG7PgnvLQpBqz;0!`bgn>w#=*a172S6$mElK~>@`>gwnZEAhzef86XCA#a zhuJ(q+wpt<>*%#VuU+_8_PI6_zsVbs zNBNLrXYfU;<<;X8tmO!?bX-GL)7Lp1U5z%>=t?IJ;zQi#+Gn)li+dL*X>&909}?AU z;JlOZA6@l0b{@@lynkuTW34IQW%F2b9G}^Ig>@heg~88kKiJ-L{bD=g%q^X9WtbJN z4EHK`r*pHt!}Y!EnA_$UF*99zUDeJyaEnJ~f;nMUnKR}IN4~q=y~+$Yl1#&V1+wuy zpJ$lOt^z*)-c`rB!;VH*%sJ2Lad});Ue$qjOgomlnn67}K~LUu6*&vQKdi0>*9pgV z*L}xcda~U06?lmU#6;J4z*(9>O7vdW#hjhaNAccVbiBuv34FGfyB9h4(#j;5%X_Zn zE;oI6#HY8ozQXm4qgL9S;LLAb2OW<%ztg#$--}!Y;4uZ98KIqKp5a^mH*>ccKAmwL z1z#YduUs8m`8`jzoi>)cmVp0Q$zTIbJV$>el^hhFk%!y z$J|u$Jhz{{j9`CO}t8891IzZ!!MdZU?t=A7X9d-$<(kGl9wMi?cH z)K{Fbh*dJd(M60X?=owT4_7RTGw;bnI5jG<9^Nj))jLcRW2`|WO8-| zt!$^oQD#c>JIUG|qhFb{=An%a#zFmR;90z^tFLHh*pW&9Biu#nSbbbif4tl+Li_q8 zKAWcGsE(E&@l+Fhk{MqqkC2)%R_V8Vrq*JtIIX5f^k9^`JaVlv+Zp*(fbbJo)7K1msWiNEzIzvmLJichmmREzLKy6j_k9K(%YR5 zuk*HDvS+3J299WL#E^&Yc_qmYIJ9~bc=An*qgL-TR+!eHX2C;`&oFnl;y7#-=WplU z&GdGDNgbaHiLH*eyPa`qpl$W~HBS_wrH6K1C+!q**;p&m4-H&>6x7!9zsHWoW%U(z zl6*+xJYz){p&4|yN#yrE*F5J}t}eTzA?EC|*U?{TwgNQg481nYqg*j)uV$R2C7a{p zp%H$kajcAC5py=d`y?duDE-_{%evRQ`QHhyTtR=1a*l^%XPgHe9-jFq<5a~HEob$Q za_tP-DFZ$8J@2-m5u`!Bjh|7(xc9L3ZAj`Pp5S{%P5QKsR_nOpE1o6QoS^Nmc#0*A znKa(Fw5iz|Wxf}op9AQxy~y2it~`SjO(TU`?+xg}3fk8?ZeTpl@Vh9kFSj!`(~eh+ z?j}Y$%^@Uwrz6JGo$$GTDNR;HALk)swdlJHbJBT{RV&$C z&(kfZ4;@I_E#4mmt8ZYe&!FYT7;i~t0X9zkNJ8(AGFlzT%_8n!!CI0g{fcWN%$l@! zCr@N$jBU)(yXSkv+Iz;xc5wVX#v*~<7Fwdj-io?MtdnF8VvL5yPyL#7zGBpe9SKNG zv0e5sjTO6>C-{n%-lLrq`!m+eK}Q|;@j82GRdXkXH;b^w$nFhZEO6Q zr0qP6(I%cXjibw%?@6rca$3EGBzd`BRz-SI@2XiVlgvV`qllUG(3VDf5%-bhmChY@ zXhlx*c_)2J;7B#Af0}z&)8EyOH13tkcuNy^aQ954zR|VTEb z5}91jon_NB$68^{%-j-YGsc>$qs8rv4!WPC(*DxpvRTqOb&NqH$9lMrR&R{wuIJ}9 zx_1sM@ejLnK?3tN&1lA0<p|RW>AFXNZQJP~8 z=YQ+kY_DbhC1>^A%gRbwjl3OnNUIV5G2aPD`?vH^c3E=Qfu!6*W|PdG`07ZY<%wrQRg4_MU0--uXCbIeO%eUQ#cEo_h_n2}0VVL%)AX%_ah8`*!Sl%K zbRwbhGpo5<0=>*+JW}i)#y*C;RMD56jN~mwM?Op)x-^q3cQW$B{Aeud>D{|^F~*bK zXZ1+OFJiRh^Tim!C5+S=EV86=9`^}2GEB{n{80G_dd^hr!*VRhBr-2uBKt6n?Y&5Q zkLX1Q<2;YG^@@2FqkFIj@#OQY^p9UD%O1b-TVGB3Z+*j{4J*oqL6VMx z^gQqjK@v_81?Lc!I05c3yWbXQC!4f`p6%e+C`gbpD5)SGUzZfP+H9-LplzP>to<|F zZTkq(*U`9c`4&H*-Z^46W53df)h;@;#*Q-PUe-b_KDz8kE&1z8_g3F(hv}QcYLZt} z=bG{iJHp=U9*cLz+H6)BD?I`4es_YA;~4j3c@}z7yjh+c?>6@~cZ<8y{lv4_8}_6z z4+kB`Je8iXXNmLEoK|<8HQ>Edw%q)|_QW&AHO=u@>b!Rm(dD>1-?Ik;=ObB|f+IpwMJp7)rZ8eaK1cHMK#Jwy!FRQAf) zU~9M5J8Q~4*42&~E3u^I7h9us*s<8w3(Eb|cZ2pWdlR!$?>uRKi@j|PxsGZO zm%ye^0pD-4Qd%y)E2jUxHm+ zg0%STZ){!kJlE#Ihn-)dF;Bsl&0$4L@5>KLVddL+`dWVW*>fBp*|r;-`LvVB>@!=F z{jtqwpNCG^Y~NK{lWuQw7PpwG?yp?kJ);A+3y*^x3U5y(m-)PB8?1l@eHH!2<+Jwg zo?WG>VQZ)G-uBS^lA17{Oi;NWF%(9~r)LiQ3DuX6^K%eTec;Ewwk zE9GKB+~LEhn_Q-HTrDBxMjpmSLdx!b8ONx1f>}<1skW2fPb6o%AN+YY`N6rdPrzYE z$&mQL{#!r_+sXE&hDVX|yC9TLk^TyDi0*jLKZ)blb)bMccWtaao-eEljl;v(O{Psu z3O{*iJ!cYl;q#v9fb#swwD~bN(;Mx2FP?}B7ZEhhM9#^wbg#KJ^wz!YtCoHxRhg&nun(|uK!=!VUZ4`Yq zV-A%kU~Ohx?RXM{_CkxZnE6e=K=$IdzBS}$w)A*FNN@DMxS9<1D#Wz{ytXj-6duEK z@-NE8C>PuTdfrIJpb@NfI&dK{Gq9{jxs#v1`>pR!R+jSS5BzQ4Z0Xt3bGuNwOnOfF z!7tE!JHVfnO+MWHoU3l-8kY}uk6$?lx}J^pThMn528F9PpZOW%eM+Y!fkVBcpx?9mm-Q$^o85oPUlm%=cOWobR5vhmIVJxc4z5wI4Jgy7oc)17 zHW>3XIjjmY0?H*;g9IM{i`IOwLvwt%u=%Bh?t&pW$)>(zCAwd8x#0*`Ie$l`ip zuSRn&dMp>6@Y>-f?pkFQfQYTey0w;{v~^%9ik!vvwf3p<30FGguZhC1|et8hTIw^jgyc;X+3K#OQMl!&cI{3Yw`0y36YaO^=19%`_C96S*-g*-~ z#8Wi$d6Jom9#1vzfd?dTR6g?==L)ai+vYvxUFluw&GGK@c6qmY+PpR1&EA9Fx%~Hg z&SN#0k z&+2`Ib*x+q&K|dyaUB#mrS;lqs~pecY|Y!xqmrca8gqCzYNy zF@VVkB#nnP5 z6txKdXf}mr9>vdGYcD4LKjAPyNI`c%j2c~Tw0V-5fX|Mlvdi{1yFRjcvAT7Pa<1(e z9`SPgD&ie-iVMhm=aZ|bMQXOeUZ_QnB$N5rf);*LS|7{`gB;uMxij3`Y56PH$Ch?? zYx(!C5%+#ZC(C1)3q47u9~2kc$dQ*=+3h@YmOIJ4(LLgBb^Cdh>00Gh~s369$vOxFn$y=K22Hm*^|@Jp&b9YrpBe<6Y`|%g-C{kU8ib^q%x?@NQ*} zR>bGA3m;(@^L^KQo)vJA6>-Ts&v%w{PT?P%=iNT<6K{%loEGNzR(Owb-a*#O9dCeh ze_)M-JqKxR1MTi&Mcnu9=ZuBEo1TT-tIhj|H|%{&i%0m;m1kKqTSE_yaQ+I8 z6?^l&v)lwH1ko!ra{p)1?Ti2Hg`>G~9MowuN%#>d2L_0p`6pXNN-0CQ=H-ewHhj$s+5Lrv{Dv~%-7!>2L zK3Gfk@y~ugw)ha-unIiF2S<=oOajuGp!o*Z)PE6Rj4 z7r~S*EYd?50y`Os$2^h$H#aUW5)9yWy^0l zE3b5*@wUJS`K>RrV?keG@GM$uk!yB;cTW;Ifb-rQ$4}q2ePg#R^nPC4g$G(6O!T|W zllWI-{flVvTeMV?`?N(l^pyOHe#MSQonOEjNx@g$XU{f{GfEz;YeoOLzO(tn%f>cy zmn{=pyrpM;2{zJl&ulbbA}xv)N8E-xj7+!V=Yo5=3(T3S6^1tK3Oum;IOBB?QPg!5i!U5H#wWiItEOS1?_&sy~iDJ?8Yv%n_ot^ znYpD)?Xnp|%vS~)DuJgNVSW`=|6$(?S7k-n&}FT5F?hve`+Lbx-@P(U+CH*1qZSgPey|M1NgEKW_Dmd-r?3b)}#ek9cGk zYrN~td92=ccN@`D*!vh=cgNf0U2fjQ!d7yR3Zuq*%zcTtsnzsj{Z{jC%5%>gce~vS zxkDwf+7jnWqORSvZlZ5rGOB02%JJw%v)6ctY}koUeD=9~)@2t$_8xK1Mpj7{E$fbMcZ)fWbWJ*^@KvYE1K>Q(#w{{m z%UxP@O?Wft9n?TSN zd+#z6MBdoI6z26HcJihtUsC1S;Kfs7F6Vkz@+^K2aWdY~OGaxeep9Qv*^r+hu9TSH z7eFEu%S|B3ii@i7%RTTU8i{$v;j^T}_z=%0CnkQH1(wJd%!*!qMu`>0xNxH%Ucy?u zj{MhP`BJf$;wX#3bdw{}{Nk&4@Nl-pxmI_PB5|9VuG;{M&K6Tc%Cl? zB<-!R>r8Y=cl7h(VMm6w@=Bdc%ql$1yqD%Sq%Oma4{vONbEY`(fxm7*+_rkSuxe)q zwp(NUyk`XVaRs{bOGfM|_sGIC5I?m7M*9SJujs!^)bq-S!m*tU8bqm2xuU6T6Nvph z5ZYldk6XD#PFL?q`afoj8B^s=pj(o**Pv}yH2P7Zgg2!Z!NfM$0!YWFIW_6IrOx8< zD}TNJ*Zc2ym}S|DwjNLoajws}TzRGP%8RS_SaEyMX;0nvSml-OJw%pC*wiZg=_(?T zJ!T7eLNc3ik2!;5+psDP<-}Rm&B*qT#Vg8$eHG$sL@m2)E6QBG8(CR!yZw!!3xTJ+ z8p6|k3YSTYsBPgoJl+YsphLYaj3OuzmfpZ?H{3n^ZFj%1y&?lI9K8vgzm7O}%!Q63 zE@;K0ZO8wgp%<;?N%+7MW|KXGBNOHk<^x$LVyVL$__w8iXy=hR3+W#svPnh8X1LpW zyhUMJ?PQNV*0Su+i+zP#uWmPP<<2kZH3}`a3p4PVYKw&Kss3Y-aTR8I(Xr2-39_mT z#%+)$#}TB zT0DSPD~45aFtZ~W&YJ;?vn;!*4CJBxaQE5#w1BnqMsK43aQE#(~H$bIk4+>+sW@TCfRmwyL_i;rIFqhd5u6^98Q95pmo2E0&rNgUo?- zpa*7TBb+heGTV@X%D4{5L-LQY{!`H}PecES+VI*X^B3XZO6JqzT*8MOO&eT_MtF?h zeuhuQpAs*oDF$%|*3Er*G`BhajCb!Cz=OQ&LUX{xfycCuPdC%@T6D_e*lIM%MUKC# zDbhK&i5I$~n>l)$bC$yBQ8hsqzZF5~Dly+wbFh!z`FOvU)}DcdZRVXS77p_FAXo3? z{LP&6A()hp>%}8m%PVoGbk;)Hzn?^2P$QwLhkabz0*_COY9Yr$XDZ=m{>C`knEB_h zr?-Gr)PW#PvoaF>Yy7`|p!uKOKEFf~UDb8C`;{@j9gLlIS4!U~9Dl81j>&wPN7hi5R?7+oFb3`??IqUTmL4(ml0m%0 z+|zm%Dw9tHlLmWRoMEy5C-4`0VIq$8-zjTH2i(KXHJVx2!EwB#c4RSwSoI$A+ln_b zg^VJl;Gp}liRV4}*!vpn>_R+)bZjcd*(50d9N{pzE4Gm-2-3l!lSD3;xiFH-sEQrd+!HraGM*^K`rJ+ z>^0WcY&BcaD$*7PmUuVz+D&9_!8-59Q%%J7Z{#Uf@-vRkn!;u`x>kB3*#CQIvU^zk zdpu(;`r-%ln2^~ieDZfW+MQ&X4uaSobo>G?U1wcuZz$K?1q%M#_rx=3pDq&Pd)QHy z-Qmi{&pqS&1FtX#KYyX`J>vG2*!8FMWh3Kuk1?`%#__={+;;^@n#junR=qV;$>nEjPU@%94nLJ=X5%Y0D2bP|9*4gCpcrRK238Z50-+ z*_5X|WBy{h(OXAWOQ?z4{m|YB1|}|Cje9RywO7VjdrJQNl6}lYPCmOH3ykgaE%Vs!W11P25JEZo&_dqqMcgNQK|q^eO@{Y*gyN1fjEnI+e#GQ2qHZz zEGGM($b)#k9(;ljD0r0UX^70uF?=RfbJY=Njo}Z7@jV2Ca)u|-Cx3D`v32D;xUs16 z*u?o&wbHvYc5rWTR`bBdPs0JO;o4c@Wz=GL;I?`OGCPE|3bUV}k8WZ$)vsjIM>mn3 z7_zlRh2YMrH|wPbnbh#8pL&Whu;{z=eNcaf-XeAzcgfwP? zVzv_ZRGF(CH(8-`iBtXLcR&vCWbb;KT`yTZ8Rih)agFDdtAW3t;N7nEwqwulVVjp@ zvt^Yj zf6ggD9)=w?Yv~*Cq2y{*Bkb zI_?m{JRDdSl~vQ2CF0Ni18@2z*wG8nq^)32FQOOYR;dXKa2_ACHT)kwF~Owf#UA)m z@l-z}12jU-=&&P5)``-Xf?v=hC&@^CY{}(SyS0roGRQ|=0NYN+A5cznU0*i%`uq~N zc?S%(ohV_O`w2+fF`oMgGqTH@=mU2JT?@P4dKUWX7)?Kz+gi>!1!9)~I%x4-0)yZh zqKX+jo`v9p`@DI+9N%5^jAFq#zIotv`@9xkqUSO1!k&4)Q|N7zSuggQL_f6Z-p{ON zq4igK(mfgI8ew>Oz9}N5*}4lV#c)}ZBziOB%hhu zMmv?r?hq?zBN{jYzEMohi>!0r(B&0n%H_CWb+?A)7boN?=OV9qIxvDSAGNHZ9t5s< z*EE$H6`&Yj45;qvaCb9U2&<7f7N4hxoaiewp>W)};OMj4PulikbL4^U0hJJ1x(!URWahyO?AXM`NUe%Ps-Sw zMwh7Sz(z(zIwBj*r%zOuP(dd9mGPMP;3G1wBV<>n%0IKQ)=U3hQb=9mT%xmIOXk{! z%3I4D%0Dk21HYWHCR>d1n)DTAi?Q@ym&{nVgZjwU7gEPKzvMRAO@s5tj5@1wx-(W+ z+y{SgRerQ8m7aqDC*&y?C9m}y*)3&y3WG`JR*z7#C!R(#jBPi}LQ97GjI+rO?g!3i zbxnaVt|nJr17@|^t|SN zl`8~rnrb0y=Wl(}c<{p+VG`D@Lcv1<2@qcY6ZQTMUFfHY*;*` zu)ERq)GdzeMk2)m*G6V=53%YQ*er@#SAlpub=Q+`88RQ*H#x`YgE)~9e(Jz-;UdSe z;?4E~^hgpJyiS;ZU*V(4hg%L(o#3iL58Yyp=Yoe0p`%8)r?i*2v7;c&)#TU3@H@zw zcx<~5YAe)fr{g5-jHP&dzko%(v7N;mT1z(mAQ{1jU|(X=)WYI9NuF=1{e+_x4WDb1 z94T`kTRfZD(QmTwpbxUH9_t%)do=iYu@T_o7 z)v+tfd5TKd3-K5;39VXBEV6()%{r<%6aCx46HRRAAE238ur)^9E64>^^8O@9=8$=W z+|DU)n(q{Opj~(XVSf9uFSFdjo*yyJ-(&Hcne_(#j)2!IH!1F90{XQFJpLWiv<|N# zRk=P;KR0=v`;I1RAJ67*M=Nee+Ov%)`zR=yO^)l9-ZWsy>GBot9={1%dl6e?iV1qtG!kDy~Xw;#3B2MK34Jjt|y7Co4kH&Ul>A_+Y*Vw5 zVV%ayKTD22fmJ0hsM!$a@p*AOR;RT*P*9fbE3|gn+gj1+IgYcivwVdq`O%=W_#BwQ zIantn)^*gWOAE#;E4B#4%46Ornz%P!j<%y^JZLO?w#cpy7m<^qWX-_ zV0}%%>8dk_+>h`=My%oqzlU!WbEcNV*@E5E;W~*WQYL$+W6&;M(EO6`;UEV~g`E3Y z#Tz}!twiu`<~XPxhAr1nE^g6YOFNiouvEUku&Yd>fDWquYmuAZ`VKmT0*;Xbi=bI+ z@RXGwTSfogarhT;@9nT00uI>3 z74geWsw#yfJ@9Y6ni0BP*odBjQ3sYW28-zT=AJD2x!;Y-f78GP1@E}cts@oA1Urn1n=(0*RLpiiEY zqF>>M;@nhq4PA}~g&3<=vl|pD8MHdH<2cWB0Z&2M>4i~Y+N!GELta6Zs-qy{iQwYO zgbN8a@LKOuy_<@sDn8aMJlYBVCvs$pcyhW(n)O?r%*u+LA@VtCOE8v$_2ibWDC@x= zP#sp2y|!oFN%dk8 zFbP#Us77ED90^rvEoc2za73J8)hehy44w^Vi+^*J)o~kMX%qK*4sPq}tw~P=3Dq73 zYgmb=@Z-<*jbFLZn~-+^wA0>}k}o`Bx@hQfW`~g6b+DY|O^t({{`6htmGLXTvX8<# zs^H7ARa^ekcS2bo(9SY&)Yk3eJF7 z-^x|JcQ5a=$!xfK#aCnR5=#<{xMUDM;ddEmbjiAQkO;$8Qh1BLgiR{2*s)6>7Kv4pe;d1_=dw6Bub8p1d-kYi=X#D6pRM7bdC0ke^#No2nijXmYH za%TEHL0ezIb1Q_ap|w649D*JBj-mJ;_Hj`4w{{45%Tp=GERN(c#^)y4uPGup<;=97 zO=IXrZw-8&0x-xX`(EOWRqkT@1XzTszCahr!N@aN4jwWBK4~R_*^eikMb>5;7>lYj zzQtF1g1tHgb3ru@>*4xcgtL3l_tN~*cO84yh39(8Gtc=Jn>Ww5l;f%9ZZe{Y*wikp zYL2(Z1q;YN;ktwddWsim;-?$nGgg<0<*b3bRpd;;YM#gE-|87Nitz;>lcoN_Ye%!> zyZ3o*zVG2C`@!2*!81$r)ZzI}7tJMOm5^7_|9Nrcm3C_qc(1rgtMKMkDX1#c2IQ}S zm^%~Ssu4fYO*D{?Z}t_O0NI#>Xzf~lQsKU-l1H3))qU-x4&^n+t*+bldL*_7*4y{^ z>s4GQ##aOKOq~<*J?Z?OXjuF#u{I>f!P4hF%B3XWUn;V+!Mh9;6j~DUUR?dWcy{|< z%il|W|A753+Tjfv%66uK+k8lcxOVMnA|tRmzM5}?@d(@3Zbhn#P9r0b7a8QU5R9RD ztm`I@DubZa`Z~4?tt`$(3K-Kx$FD^H9@po^zp__@s;5@4Z$sNR!BY9{fr58CHzDRNiqGqy|>!IBmRM8W`(Pe zn zqmh2zgQQEinUlMW#9P?QH_?&G>8y=O*7N9v_N@4j9MA@`*4k(1 zL-vFC5C*j`mI~6i6xqB}rW)>FSRHT363phQlR!{LX<563MA0y+T+nV5-SFHF(W^={ z<|MkOw|{P|-C8&Bk7!{q!+HZ=Y!V~UZncp=Uc+qHq%XGJ%B^815YP@2E|Sd_xKn0x z?6a$qXBb;4Hbo~Wh>tn~_1*Qiv{;SIUu$yGx7gsMH=H-*q<7ZWcjyQRhVpe=YgQcBoew9LdtI(oN2fEt~B_<(uu9 z9XSQRfAC{*urwwA)12v|?eMezu(#tyirfEd$%VkDIYXC~)6ZaT>Ya7uKYWGb?5Zp48fW4qy<7&cbtY-@=I6b0$jTW+p(M>F@a=6+(k6bmHIJcBa z1@b70ITZ_5xP10~tfUI#7uY~H$BMEg)a|J6zz5#-}O&& zFzqlcYj`(8{>fLk&t4Tu$ybfX_?2d3Co8znl44g}EA;&|vC&@3D`T;3kYnOnG=u)n zSdYO&oa3|jOy3&c8K2Ep$=a$R{v5>m?IJ$E3HEWHc=8T0yO_~uK}nim9ZeA*u7$-T zK2IWfl6=p8V*F3yY}nQ0BgCHm)|Kv=1rl)#WNH<*d=)W@6?@Q5eq;jcI|R4Cfhw#d z=Dh*0^dMP6vDL-Q(QYR4(#0BJ)X9P=3$gX;abl#|{h#K1jcpO@eH^aAZyeyeG|dr4_TQof?lHni;DGzdL98Wntmr|N z<3>5PfBAuen)1i!U+qF5<~WEI_zwJOQ1W6h;;-P=E7nlGa~HVZYLHn~eJ+pJh&{va z8l{J-7OmpQS4i$xL=$K88ntQ39v=u+An!jG2M)l`M zse78SW-!*W56Wey5uv^zvweoUXIOtget!R;(K_w0w;7jfi{`WcSD+vRc8d-C(1U*v zCKd~$ZIeQc*55xk*QcDbi#@aUqNCrS4?ea8iFT9Y?3aYR&x>~<2fu;jShx+FPX`D_sJ2>q!^KSY$I$T=ln zOapcsqw?a@9PQC1M85Kh_SPCEG7|q~LEr55iTDnU+QsifG|O8ef|o=j+Ffrcx@H#g zUr9zyyHmYIH+@0QRG+uwZwy^l6slc58_^H7;6^q_hA>cgK|xyvIYROH+Cen7;XOZs z1uPEW5M2JPSBqg0Eyc=Zfu>I2536!uf-{5EV5#bUDX~`yyy!aXXQ2KD^P#Lmv$4r3 zX2o`Jl{&Dnf0LV#+}!9r2l}o(55)qrc51iN+9I)K#Lo}|C#OJrqRF4BVuzy&c;8c4 zL1hA!xylNk4(>;v?I5c?iiB%lMi2Ed+S61%kL>y=b}$-jiAN*D4}L6e`{s)Q zRZ^woi~n|xJ?6F$UnlytOWvnBTD|Mgit_KkI9S(WNThpuSSLg7U&xegCmN}Q1=7OW zSVbn`4^YfqrS>*qn_I8$DjkALcQ!wlYCz-i)~mHeXY)1A_(thx^W__8?>>85qW?$O zW|dd$ZQ6ZvFZyvA9G`W4(l$o<_!Z-FLSE&S5vzLnb&0e1R_@vSlze5s>}^^%-AKxz z-ev5oXK$O`uAOt&fz|x<-7@ZUxH}D|&?)Mg6n~zBsh!O%E`X6E-q#JdW(%mz(#}~) zFm=S%sYyRg&PeEa9VlAny*%AY~M zvKe17Vv~_f6Tg)jU}B&^K~BNL*vhaNGp*&dMfc%4*9UX)#ar=N4zN3%wNprVS|GRd zAQAW}5Y)H)UFh3|Pw~)e`W};GIR@%~38rr%eyoL>s(f(h0Q`z9@&P8kMh*Y(kmcBg zr?DDtH5_7a<|%OH-S{Lg@HoW6^1~Ikc-E6kpGAgqE7`i2*jAY3WcOQ;u>D|-cR;!y zp*J_;FE0kIR@K)o?V)xeKa^j8g9Ei6Y>DHBw+x_V~@68*lyxzzmL%H36}h+f`{ zICa7)#gYg`&cGkkep^%k!uoTE<_tapcTgV3K*lGK_if~Q8caKwwn5%dJA!zu%Q>UR zOtH(eprRhG*bFGeNSrC#Vg^gwxhes>z6a*QE4=n0aPtf@mBskJLf)Im)SRUD&x&s# zPU&WELwTe1BD*c@_6k3jk2$|&6+9Xrm1a*sew8hK1cNIF&xec#nN|y#y&l(6*zs?O ztW@Fi`v=<%?M9hkq<~-KmhQDIwdWN4_5O5`c6eSgbA}iw&thj>W6DhZ>oo!{e zj=}F$RIgn&h4_6EKQe_i8{%5+c_<6_1@>zKpWGw{KgB+`AF|JBYxq3zMJsnwT74zDI$06EG|SX4HTxE7(~0LR>ELE&tL81s-2*h z^4WEen)C50FCXknaoly?R?tUbkj1fog48IIf#*p(X&{6z;BjfUNCSKLjw!GGz1N`y zXRJ%@ifVeRW$^N5YG3kMY`e;UT7x57rJ^ z%UK;=_JhPeUx8!!3fmewvqk3%&lao402v6stF+C-A}};D!CTqRXf(4rB-5LJo~uKJ?%)slg@xol}|qL zl4pzxBAA&-?ta+O`BYB*VB1gD{vN2~EMk>Ja-pi^?;r*d|L-2Y&=3**q;mt$Mh@tY+ursJjCZdh91MQu%Ev&*8xI7b7ceKDA z+lG%7LC#X}DSBMTxc^P^8!6t|?VlGvavkB$Sw!%&sJDrbMZQPfi}px~T0UZjJ5^q- zC~L9@3d9Y`EgdR<4PsGj|2ICwhIn;Y5KzNBPIvqITyk%1m~Xw>L0(9_$Cva#d|S`~ zbldzAdCTXcRjfj6K9<_mtKC5DZK`>;Vc*l(+k7LMaCZC9N8Kc^4#@qbp7u>&uxy6K{3 zJnbJq5}L6PDfvHA)9}jpwd7-ZQ`MDQsy0@zx49Ubcgh~XM^%O;7`H0AUj@<7(B%Z< z?J9(1q2G{aEt-Sm&Easp`E_ zyl%6Y+SV%9DKf-sk;QH9>z+TTlhWQ?w}>SllGXZyH8lrK@rQjU(ILBF;cu@eH@w#s zC}_kpzK&(L`CfS2zFF^DOH_Q_+h(i0GK80#WSZVF*M1QB3PYIK9z5DXBIUhQ88)C- zp2Bt_SB*FEJ++3~V{w*>!R`@y_M`(;uMp8>byww=8X>5HncwWkcV zUC2~xxs6<~cK4b?TsvlTfd6Zc!bQZ)&D7V=a?fG^ixYTiMWA!>yfEH*4xDANaoFnu zyheWEFk`hDi@S-O-d0aT`3Z99uh1$@Wsl4@Tbknt5rmKy{jVhV?qj5D(7MXskK+|( zfeofP{2qh+_*X<4KCHEey!$C;ZHZH;VLsQVgGzj46KfRPk1x5{HbKUsl~uLJY$#{X z6;Pgh5B2|OvljC%?59(no$#bKf!*Mh5yQ;#xY2CiqVw~qzRLm$nu7hl8+?P^IEj;9 z(ffPYf;!g`Jb+WYcB3WpY3C7HkPWt5=-3YI!3b7qv)w?)7-W81x%WfZXhE`sI~~fX zD(|8_MaGO>ue zKAz|Vp6DK!{jw=by=R<$d{ym=GLHRQ3}3?!e}l?9czD_&i2VwAa`u~HXM{!&ust9* zSuk`}S)ldPO2mE>`!GaStiU{N8KYq39b?=mw{{Af($3w-(2SLl4ywBp-P}cnci^wf z?~rFP0;-%G{3P<2EbC6V5)VOzPB_Ndjid>@Gmp%I_HHf4OIV0UvNbBsfpAhqE?T%xJdS878;8e9 z)~$hYcmxX%&Jl4!y7wNk-OkPcEsWv>d|K_4IYE4zNL*ooAwp!$ife|4EuSLH+7_o; zdqeHPKJS4?ww|Li=nyI-$k*vE<=a572Sl2U~_|Qn{BvKN=e<89!zbt}N zxe-sK2qt$b{=pXm#j!62OzQLx^)9xxGWPnG6yvgxs@eVXV!cK_d5c!ECqGB$40huY zE(C9Wg1uTA8^TBY54%v0^G=y2;S~CwgE|o47BU2i%k)hOs;HCad6DWG?Yn(5axr$7 z+;t6~?87_MUgueycPy-(td%EU*C)2Be8coO4_}d?XF&e#&e$F@%ZGZ~LshKAPe5zM zz%q%q#H&u1)RI@tf>)kT#laM@k*ZU*yMoZp8Tc8lUhPD5xZ6Y2*;@V!c*iEJ#2KR2 zVfcjAWF6+(E?|F7!?4gk@#61i!WB>*mRK1&RyR<9-;W*b|FL+;+ygS6Tlzh9+QxJ&s*ZKw#p1!r_wvN|?>+=$p$Zny zF!*3EctA4WxzY{OxDlLdf_T~k7Ok3!vh1gzRAM>LFS+M#`(}pK%FY4k^KmMKvpn@q zRrbz;f$D~x!~hVJO*ufF5K5?xB=n(EF}wRVv`qP4nzrY7ty5zl$f`v?WSn-Wig9gX0^~-|3Mq_GB>P)tsu6jeyM6VGF1Y#o8QUc8?*6 z?Pelug-+)YEO8R=4Oqgm5naUOYpLYKqkyxWhW=7)_l8J$7ZLhvR=NC{X*i1~(b(E^ z^S&b*uXdUyYxd$QyN6Mw`O|k*?8=0nPUb1IDEqhv8T{1z4+?NXR5+?hzPko zr07!LzNFcCY|EpD`evjK6d|7;53%n=B|5f+s;n&RBMd?C1NOKfI(q~HAx0{d-!Su< zrNQ}~kI$l=poC`E5ff%mr{E?}be26CZ^43yfXB9*x9t&f7uvO#tQV`dA-=0ky|W(7 z%TA11mi-KWLG5XmN3kY!r+f5egRP1z&9|;#Y1E?qgqBd5KkPVxKRV03hYcI@2kdicDwxjvh3T1KYe$I$m}>sr6L$%*lzNE!Z`I?)e2j$R>zO2 zDpC9So$Kpm7nNaf$6l;_6}sI6Q%&C|qew^$0_D(?$P3o9rGs`UG!^7pkNo3mqVA^$+d{> z`YUI`djXxPNf)y&P;fTC89(V`bVVjO!{P1#k<+xa2R_tnYA6qI7k#JF>7c%GWfJ@r zEEOi6_7M}NDtXLALMLHD?0}>HfNx;A0GnJ-qqs2&)~Q`%YSNYS+j`Z8EfK~#49~L` zr1dl&+YsMUa=3fz)d%=-dqI&>@mrgSqACo7%7E!2>e~3u5Pe6KDo#}|5+w4ivld#! zKR3$ngI=vBw>ii65WaU9UbT-Md;URgbe``A_9yvo-y_#QeOt*Gyz%m67Fr zXqV-C-m}>D?)#gx=UWZ7J`@q_O4(}VtMwfmTVY;2i7e$CM+T`3E*jJ~ij9QU#$d1z zMb%PkxuquomSF@f&rX@j`Vebq&&@Zbbwq))@GKMuW}^3$bCF%u?f|MTssl5qX6GL5 zWTsj`X{V>e)I!QsO#u&(K4f;hB$quppzjG$g|pb8S!la3eLleJ?&wzZ$Xsd%HaYo* z98jSI!v>?a%f1<`bu;nHQo9AV!b`a45iHs~7_#YJRX^z)T^>`_I~L#DKrGJ@t9);H zSBhbU>L*eYRtuh8PbOFuAsyHT*tLkq{Gciq6O`zH^JUkBXJ9(eIAD3bW~xLc7XPaCnS!} zOE5LnB*AZ)@bpzFM?O;xg)C&lM`3O{|0wi>=u)PNbE~(;MZ5me26R6hlmbO*N32{0!tl zxR|Pw{%>XP9$aO;=6fbU?+!w+hzDnyM9v1xPN-ZVSxFX2R^mCXQYB5S=V>H@9+0K-{*UARyoEr8@3EMoF1B9#~)|K^ZGu{3etP1Cv3>l zTS7gW*I6R3VuIh#0L_U8!wKZdEq!!xVnpk-A1-kZZklmmV#C~XB=UP7+t=K}{EhSp zFd~@+dQO}nxl8_3(Wz0YTQyK7KaQ~0o+bTgA$r=?ClvwaFy-3|0hz z-4ZrLW=pD`K13d1z##|6Hiv=ypTDRTgGPn1zlHJI=Z(oe06;JWHub(7G! zX*j3rWCN2*eI4cnOAGHl(bwx4|7qb3>eT7e)p^^e73EW~?@q>le(WT%B%bbYL5H0&Q z{_LU)+{ddnyG=$id0iZjVSFkoV6cBk@8eEc(;J=QTG$0TKEhE~cP$nc06*PH*YqTv zlvSKAY1V@as7z%_%H`^%29^ce1o|3BKlbS2BoJHE7I(CN$KIvmBR>2n^VWp7!E)b; zXOdcA*FyEGq#SVOKHL#(o?y-gvp+|!gB%0hD?jXd>6BgKW<1&SVijv#jjx94%J$9~ z*$ddkdY0rIY41#i@3}UqJI&;>%cPKo)9=h*aqML>QgqhV`_S5mnv1>Q9*%7^I8_e& zL_)zPknOysIxjds7sGyq=hE@z_7V}<(PMgBZ0XswqzX<*Jm-$RmD5A#oM-Vpu|C&F z^~0`2_L7BEGBF*~Ilgb<#VV({3`Dku4(a(kQ%-bveiUUP)| z+J#oZ6K(^=ej8=&0d76P?@Fi}tp{bS%!H+43hn`RE6{du$?aqYOy!>A{K2t5u%rEp z#kFt(yVHt5HqIp{r6t2&-_agUFA3b4Kc%IJ&y8b}p~~K=xAXJpz}lp6dNf?I^?_ws z*3Wv7R39&!Yp&YIc>mH@rrJ&2neW8CE>}L2{P+F%gXL#_&Z^^-Uu@UM9p{|DCxA8n z7W0T%r0#wWH<3mw!fu(7&1@2FzrHmstZXB&<-6hPbu%x^BL{IZ>ui*B*F?l7@B(*h z^I`7-!_cMXT@<71xVA$eopre-U>Y4s~bbzDzkqm_YqcN z{jP4aL%onGS0&h-m6#d4Ge0S<0sI{Q1@Zwmf!EuG%vwB(y1?Yco+USq>-?gdwOOC~ zF#X6BRDbD2y2N!6{<#U7^lL}!3tz~*7e&#lTnTxcZU*9W#zdvJW| zx4M_QZ{;wRA7I+$oLxSH-Xtc~T06&4BcX*yLE_w3A35jhcjnuRnk}h=Zh-4w99;w^ zl{HwGktk{f(Vy+0!1%1fs;2V>yV_Tn(!VuW6MFpwXbVTGo-Sn_>tRhOc?rIDtb(sH z4Krh)23+7;P|tiF@62k^1+yl#jMTV--Fu_SNS-TSltUdxxE~_ zQXXZJ6@CV+&w2A|6l>$%oBN*un~-Dp138-hd;@(#Qre>&8F1G;`34p659G8uVfr$X z`fG)x53SkE6`WlKq;GCGxsBsunrKb0su;bWG zwBTKyZ4Eh{8gQ5@QgqJst%&Mb{!$CPOxODFxR?Gu?kBqVin(78enpp_S`_NN7Cg+A zuzjf$$Org(7ew=2Zt*Qs?-EdOIK27@qL&(FUh*w&6Jz}DBM|#_;P&(AC}!g@7gKZ= z?-Eo8cy^^{>wm-aopeO^=IFp4c*hXX zrHuNO@oraicD`)?N!17VOQ=i#~#nN_yxbT_l}Z<+a%UDVI8 z@TSAE$S%5p4zr310^dPat^i2Iw|sInF*MZ<6&)HK)wf4#`nf*CBDsp{iurtIZ)&;FtF3p}i3sp6s4YU1d_9amY` z-hv0!j?eV0#dW#olI0+&<|xW}tGkiC{W(@4IkNWhQ>Zu7sR~!)^Sl~n)Q?;Tc6E91 zg;cM3rSx&smNy+)wIYh>TIGPj4i=2t3 zwl`5}ndrN%ubR557vGtkTaN>{V&A!Q} zDgya47-Kdph)*~NOxT{oc_2FZ7{8muDnH@7Z&6d|wk0yT9nUH~_*A(}I&Q53y?l4T z9B(J;PE&NE=-^duW1X`nG>6>|bR8>v6f6+k-%RM-jPj&AO;$V_OICMXiNxg63ZCbT zv5%>QUvM>l0xnG^o!6~EC798rrFGz4x-6y9wX5w@yB&bVTL&)Y)UpuWKRF$dx(!Y) z2o{wNwQzt+S|?-@dbm|R`#?SCXAxb0C3-_AlAYkcCSas-ALgO#$ku=Nvsb_egsTe! znP;5L8N0u5O`aS^SfR{6CYW)af%#qn0#^f)@b=R0z%1@(vTAC^2(NpH=Tp)CIP(zo zOs|5iHKEyh5apApTX#`uIs4W5?g-rCT5yT0a70AqOqw~3_m#Ofk5h}DW;$EXURKFt z$}HZ^dxJs2J&M6EYUnW3Y<UPg%{G>JikufX71!?#-=92d>_hffQg|3^aFlk zI`j-&d_!~~wbWKQbPKH6?6lo!3;Q-Lsly?Gb(;BlQ(`+PvW}_0xwP zkd>%5e7xK0Z1kA!6|JXcEtaA9LuY;O!PEt;3O!3IaC|?=>y~5o`ia-jQtoJ{H>IMV z$g$eK4gcWlML9>%{()R@!cnC*pba0{(>qrz*U-a#A#ht;>gKvTt<1+n32f=fN^B=(w;ZI+RpDXO1kaHkt1JJEp86blnGIQwE+$DNy9>7Eg3htrz)?}O zFIZaxxpE?`XLVY*!djv0vel9a%n7a0)Tp>7q7#W>mzdK%fPOPSQ?~T<-e~3us?)?j z8ep!gf_I_I=+5FWV$@#T(Z7{AL8Spm!ICGc%%o` zg;o{MT6_=PXdnE+GS=%Fc9yAlBYX=V=WIb6TtUtz(DNw%y$hxKaEJs(IDKC)+O#B| z3N(=0jEdMKj(PapCxRDzoTav-JR=@NLoL99$b0-C(+Qt>!w+}p9pdU-+IBu&Z%Wm& zcQXf)2QF7_ZBh*S5A#?j9T0UFsbNiaA`}3-(jOxMv`7r8luAX9DlsXwAK$T_{K)Zj zjv=o!DNU~J25J-UpGfDmpA}uD+)E(96|6@pv2{wZcH75eJx6`l2Z#I&&sjjSz+`fB z2sYf0U{|`@h*oq(RJ2>T&)HL7FN$X^i|=KxIW-a>u?F{N84361CBWqS4E^G^hn@Q?T&RnUJZ+KB^9Hcy;E)HpdoZYo0(DEq>^)&Q5)<|vl#}a94hynZ`q}s z%jh1vncc_z%6ZMCDtH}_^Z>WF<99NY!bGQ+-({1X{tb9+9=pmYx=1}2XM)jQVs|l7 zWUNmlDWUZnkQR5=DJQ9{m$*`d)5~)6QAx^E_yM=gG0?A=j$t}Wui?@*nK}vlQIA-I zhw6jyaBc-kNyRV)y@?8RxUl&RleMpas8-S`?g!%|DFJ@k2zz%KmC*pMK7-7I^utke zX?M7zeKqO?8T5F{gCAY)xN*E3rWp7eNcxK~sy3iB(p6RWq(<^D3cAiETN}vJRy+DI z^@#T`04ZpGqqJ>pQsC(5F|P%9y#KM)Sr$_%h z`(?VFa4;)zkd9IwRVF@o!=R~Q_*&r5a3Cgf_Gg!O|2~rJ{3Mly9@&$=HFk6%&O~{h zszqPnT9GknWhGBd?Pn^#cXo(hAJ<=qp2O8jcL90fx(Hl2Bo3_CxZRTJ9a)JlGBGY~ zdyzF(jJkmQ=at-UCExwf*$CQWrKBryJ8n*Tqsoob@5q#EQxxnz$sOYPL>sLMbu_q2 z?WlLd&`}it1yqyupt!h*<&t8Emg79WIBQth8mKjf@PnWNIeBA1WX7vfpMupVRG)pz zu~ruzMIH7n=X8AUW7I!>GBv%wqpl*4p6f@nT+Z@^L+0rOsD)y<i~2yZCI+fIjR*&Hg0wgDq${8avG3X6g?%*m~-6M;T{xDJz?**b=mQ`&os2zxtQI z*j1dbT75aH`{Ca8a1v8_ts^JH>5bHYPTAr6bLN-jHqj+TgOb$1wEP(loHa~g=IKon z(Vxu=KSVsoG}nd7EW zlU+mCTEd!uCmcKJ=&=#jk7qg`p}tsgtUMz+#odTKIHiC!G1z?e)T+}zGN&B|!ITjp zA{oagGq*p1Rre##dU+^enBz0?o;`nh4PDYaQmUQbSMj}0vU{nD!)SeVO=yH~s={Fg zdI?#WqI|wuc6t7#Zr7Rd3_1|!b-3$tOOqblv+l-6LX~cLMsi*fI7<@Ftz}FPT=CNB zXRGjc9${{+Dr_t7ScGQ|osgcpJKB9`dQRx!+l|slAK~ibu0B3rLaPqU3dNtMlQ$hvXd{-l6w&i<;gqn_G3jgGM{*Nj#jo8E`_te@;w7!dcsfv79U22+k^ z9kqHdg&R*612uCIb#6a3?*v`x75=Sb^W(56;;G0@lXm6B(S|=}sF(w|m43OB^)}4e zF?3W^#J#4TPeML;A$!U;`W~6+Dz|0tR?shP;mE0v!o|F8IXM;g!jUtnBnCf%4!X}w zre`pR;X&{3nG4e?73NMXRZbAqL?PaYFfoHcu7C$X4X);gz>;v);{NmalUaNYSNdwS z4WsbVs<~QpzK@A0iSc5hqMi*tv6C!-G1zSD!0Iz#LKnf5n*)lp8>hR2sj6=7%%6e2 zwvq~CCc4>S_(_?kH&6-6K>9ACYW+Rk^^Jj4&I{LYGfbXjf7F9xE<3PaWxVr0(w8~g zbZ7m9$>u(|1bbnkEudQqpYH3Gzn%eC>c+r8&#&nOKN)~g0$Xa%;2+sdtKm^)(!<|G znbJOxgqL#ow2Iz#9&yssScXX)c<0ak+qv%ncy4*!s$w=WhikxRZx2Zk!R8Fmjg{1+ zaGsgc=Ya+9&HI71tg)k&)&2_WxLO!r@y0=T`GXq=SCTRx<{H_<{PhfZ_m}u?CAsb! z2kj|W!L6Hl`t893@L1;Il^mu|y+O80Bh|(NUW*k&T;JU%j-cXP&TFa65%29H&teVN z#nZSio)3a*!W+JDNRDyfsJ!DByY!%u`Jzuy6qp)XJ5($UBs26e@z9YdimG-l2+9iB zl&P@ihv^}Q;6OZ*9ma3ZRRc{LyyGI~tPOZKex5zP^gLRX^?|`)GSjWsaHrazozS|M z8g6Y;E!-{@k3Yj=QOP%s!}3q4oOMt(%S;Dp-J(TQLZC;zaDg(>CdiJd@6D#)UPY4G z8hlM=a*ph0#heC{{oxM%7M;sYr;_;`G`pUeM-el<@eJLNUZKKuh0$T6mq(IyGs-!n z`-rm^eWed`9KWT{?%;Z|`VvRD$X;#Q+Cu)wq?zo`AK-g^{NuU8iohV!;b4IpfS^^!BY+(qG^uYnpU#B$k4Pm1AH$6W}V?M>+56$ah_r*03*DxcGPI;91K=twHg4Y(eki;WmHaQLcuJu&0AL58As460rEWShJ_<5}jvy!(^qwHhfx=5vLswzw=6aJaBTY3w+c%>1cY6^yfB zeRiF5t5A6u6|;_}39TlH+?ik6wvv6Ac_`^-UQ0XLl^T2ZGJ<)4D((S@vhJnIHqIdWIcL?Yw%O9p$Upk`SIj6 z7+2(jN7dXOLZ+Y|))m6m5Z?OU7}S08U@?bH|S3o5b! zj;8)Y&X#03sH|Td@d!JYtmFUdDCKvwm-Ah0s&(9lI60^dngb@~zALgS4iaEiQ^MM` zj$>t4<J9enZz_fSNA99tVVVq)6VGaK)Lnrkm>0wyvS!=#;&M4 zc_REhvn9>!G?iCx5WAi$Ob&IGn6+4q_Q#}-e8Jjm$6my0CktgHg5l|>ItSLA94Pg~ ziS(oI;}bE!1Y$aMXguz>!>p{e%xb$~ATq~fid_%dTLz~5IQxyL@T;uME$lU&umNBs z73=z@Rw6rmCftXzvl|82J^0a)R|aO*Pi^Z|{ytFJQgGrlcAxe1F0S;^Oo6WE$K&Ur zv)pyGCi+5bC!JSsxpAtPYgE6uV&n9nj;;<(Uuk4Q`4wv-DJHD6l}sc@xb|fxxaUQK zYVYP+-v}F1FGkajU*<8B(aBsxcQc1SJ$cd8)i09+UCZsw|2DnYL~fDhGu-bqulFi^ zfI4FEBl->hl;Cogb zU9zM3)5;pG&aH^=gP>h2sT%JC4X$TRl090_N-xiAH}Cj9UX8iXU$MfGe8wx0Z*U*? zIE`Z$o((*YiRekJT6givI z=%PX8Jic-nF7b|Z{L|lA2VZ$|Eje-|TT$56vgdz^C+U99Ji79^@?b7TuA4Gel&kPh z#VPt&@hjOO%*L2Q)w6{vUj#(7MXXup{4Nk<&;J#mG_Raw+DGbhU3XT@+KHmChM_6LnA$oc&MG9Iv7F-%9mA4F%CcCUhy_F^4(!x|Zm!BueTk zzZy2187@=65X}TCZ4-0MN}SAg(PJf{RX&Y5KT}#R9CBV0og!Zl9U!mF+@caZChYXT zWY5vD=Lb~pXTW!zX6lBllY?lO=PT|&5x2#UV9Dx1wgR604L+gY)0M2CV{jJejN2Ju zH9vile#P&c7ygl+^IbZ}QF@Ho{7k*J**3qT$N2_aq>4VYiqCE)*vQnuUvc()Pv=(! z!fTdK8^6gLe43w49sGu`dHmZ9A9WDs?F^!AsDuF`Ps%Ciq|d6a+?lB!5i8LwoP~q7 zg~_cB)+%Gpr^DVtU1d^{u9!ndGlT4xC`TK?X$!i{I1&eX81GEI1$>D}bQf4xY4nXc`3=69!kkeSe$(0bue$;rXf8wYgqPL2xC~v79 zhiC6Tu$SHJVpq@&Rx%;gFOtffKUetobaW4D#?zQ*ngdIw7T;B%kU2|Np_=(*fn&1kx}+E z>u>`5+)w;_IW_0i$o_FUzX6Ba=7<{hBeak^i@wRb$;9+yv~DYyK#jo-e;?0_(IO^O zC|qZU$KaT6B)ejB_-7np`pB_ZM>b9-{*|{$YS@JObrrmbO{@ilU_a*7lI;gKBo(Yj zH*FLRq$nSwUM0QlM zuM$=lou8(%x6Z&*Z&lE9E*c!VDffQ%$Cde8akP;ykE74z6kzI9QJOZaUnS_JwOFu=s5})&K5!E#eVv-?In?6uf z5?D^PbS;<)gJl9`>{py|D1@{1ly1ONl<75Vv^>UH zdDJDSS*Yxqa8Z6R;=@-1+iwfC5KaS3!+lS>!q?LmKM3#7G?8LliKgS)U~23-I)woI zn0kCe?7QOeFnXUvUK0$Wxl+9zI_bfu^Qcq{g?x?$>roKLgA3GVdmjCvz#ODPJR9!I zuVhzS!EvZBoVxUKhgYY*OZRiN4|8o67S*8`j-h6~#nBg2k=5Ns=R3^geFjr4c{fGO zXgwyVWMRFl@E30yfPZOPNN)>5E{8%LtpQHasA!n@Lpmk0({*+eLl7s1kRhSZ0%1iDS7dj*WLmr}P($ zq0rp|pTQkPC|HIG zt#BlA)dj*q2Y0oaF}-=1`N+E{?sVXFmy^kO2cajmaA0}hvDgBRr?zfvYy>K4R!ehBpQNoKL=#P0nT+kqjgkW;)z) zo13Ue%rgV=hI!gr;AAri_0JYmr_bk^il_@n9BMP%gh>xR46}=DcB-fN$WO^v=PI0C z^b_y0pE*rkf&Q0yOYLlRp^}NO8c7zvoF`RGv8hGOvtI*mlK+QJgvpJJjjG^-A)Wmi zNfN4NrEfz6l!V^7j5U0A*tyd#v_BoZzaZM6QIPwK+-7QcQW;%Fj+YZ6xyQPTnt!>9 znWn0T4>G6X|6xb-GJ8^0up)#C3++Q3>tr%`Ph9R+syVy4wMlWg_p-8mob?gMbaS!S z)cS&O&tdD1yg^i(YuV7us>z*qsj!$4N%J#!>+t;D<@8s2O$sf+Sil+kkLvTst$EXW& zZk(045_dWMqRu5di!y5^j=8md+`7i z=QmOZl)$c5v#RUaCT4wB7G@rb4JWXc+!w(Jt_7>9j~*y)Vz2lMsA?Po8u@8+@q;9eoW+f5AsN$y+;SnFn=#~3EC-ie#Vk06jPaZBZf~-3 zWU`i+*7GSWp^tF->cIal#B}&oy6z%$=m&UpCOBN>b+vJIsT)vVpgyW0YY*5#G4IqA z3-|o>tY~v^+@1nzu7_wkc#_!pi(Ru8lfO#B%6(+m=&z@vKrQv-!qEA2bKyRXIC6!k zYh~np1x`0iovSC(HaselLA3QI?!*&Qr~jtH!Q%JGsL_YFo>%Ei8q9~4U@SK~ybDkC zRn$7ExDx0iw~<|SGxgHWqPyVA-AmQ^Q4x7BRLx0baops&Qj4F?f3sLlt?5wn;3t}9 zw-5IubMLm2Byse&W>gaJ99R_Q;&|9;9RR?bb=wLs-UZV0EHD;n<^FE@bywt zCpD>7NnrOI;L&BJPKWEHvtEMf8B6v4wt)2vu{*#A(h8bz z!Kw-EWCv-Zvxp~Aa0O@cHr8WwP@zpA0mGr@yb&B=7SiXeO}bU^^&<6ncjI7Zdc{EY zWFqhDFlla+sA>k5+@RHDrL>@}dm*#FSGAn!W-Sq~?EtGl89vbZX@A9}auwcG?)1rd zUr_;qkOjtJ%YDOpQR_wbL2Yn9Yeo?jcoFQ+Yy9*cxRf)g7dEo8WN@aQM{!fd+#P>> z&Y5nysapQ8&qNw$x9i4sDiXbd(zs^=UnYi5D!+Hrbrf+c`Jbiy3`Q;0ZwzduGt5`? zeKPY+T)+7Z`CyyiVwj(HFjW?USgKy)PJ_;{UcP=p_VteT3Q(Ji5yg!7fX-@f(xEy- zHs#tZhuN?oQ~|gv$X_aC&2L1>Z{Eja0~_gLKY_ix8EoM&h?AZOrY5vgr)}=v2pVvM z?{!L_hiYE0wkoE@zXoHeVp2Sl-z(-6BcEfB@V{|XQTzLk{?38$>KdPqH zmQC`DT2Wj(rxs5TJ?P>p7-5F0f>kAh`b0e{Wh=?|lWpKNv6EU+>_a`9$qwwkFz&BW zX9VbvVa?Djmx3S3gfKCCh@PZ|-G3~!jTu*6VHqp+Fm;uwR}HM&o%GY@GAFcFqPT6y z%EQ}Qk0~bv7Y-ff@u%Z)0r#qBBIk!ry%fJZF>CQv98^$@vIa+!r;tMj*-eFr8zu<> z_2dKfS`!s(S$`DGQ4M+N!Fgr#}M-S7w%AC>u zBl-K7dE!4)G!>=AX#eiQi+ycqk#5rM-Jo+c=~AuaT>Ad$g;qTW+1jh%01eVle4cF| zxD5ZYXy%`_R6y&|Q;lcb#w3u?#QS?nXy67tF<`|i@*ZMZDQDi9 zp7}L-bh}n~v2>noaG&nsN-t-<(DiRSw^td+6d*S#(k;s$)`5K{`?ikL%sE-Z=I|H? zQ%zLPV7J-I`eWtN5R~iiD86g@%Y*f!{<_4<(}v5|Y4C|_!6_~GGDkeZYba-`xd#t@ zcPsmYJ#;Lw_+5$sffn%GQ$ZJGFNj|1_Jwm7y~iA0NhTetiA~+i;6y{@__y)SH{sit zj2Hh4d_t<)HgV){_8~h&*^O!66DS3AEm~@}`($1!bs|LqgK|bUJZg+c0Y4~Yr2erW!Rz)2}qFF(k z;7`4YK2rRmiT?Fns!%;ogQU!CM&$(iDpH@31q*(^3q0sSFrQKO@i?yiG5&o8)axRS zV>jq_^-&QO*%!J+m8RRE>1QQiYt!I+zJL#NO~^`q1^ipjFWds@Sf;^&+RVQ7Ev_{p z^_%&>9#gW*Rr8DVk8mEfpzO`Z!FdEu-fmV4eLw>+6d$7h)NeLEr;D|tEO!n5VY1>$ zi=dh@AeU&v(9~^n*)`?C$%b01Og z?T<|0)xN6E_6UqdxI;g~_H9E6b^vt$F%ah)@Xo$G@daK-cjiZ~xRehvgKz=|I1&M- zuy(J3qm?;29H_f}A+soF(~{;l)CX)@Ql9ZK^NP=?kw$QH^fsHQFEA4sI{FN07$s;Z z(s5VW(XI+P;{FKoZ+)nfeFOQXK1SJGCOS*dinMe5-9jiee$e`oBnu)nC*IYsBX?JLAb? z2T?QU4rF?RzP@k4MS2FeYaPIxG@4oEOi>4LYm5~zEc7F?J9lcY&#$<`E-E$CsBUsD z${YI~o=tPX2xMzG6*|MbW))MMRp4o5Od_hNzEqYqd>tBg-H4bU|*LzCg9wl zGX?dX(vnVHezWfdeDE$DnzcBFGpvK>6`gD1x|M-cj04I{YS(7i8dq5D)b6&zPx?H9 zRMxQ<97J8`jywx?*1^=t^W-+GziK}d3tm5Ag6%jQFH+6HL*z1S0DFv0m1&^|+3P2E z!H3U7iK(79oeF0)$jvBT$j?!|%vx-vJFM3VXjuzxO!{HpWOW}#2{WA)WY)&Enc4|L=9Hv~{92u{KV>yz{RHRP#yu<0E|Z!FGTliXUIW8m3;X;5Jd~IV zMEo2kV9uH_5eP9MU?0HelR3QVGZbTF&)#Cak7wUm$G_z%#F0bX&(Sf#FhoveKexS>LNZ9UGb^bnTpo6IQc<)gTtP<8o9qgw@guDQDOT~| zGoy*cnXa5v&vW@`$KhC#7zE;8UpOQC(?YqI#Z2wZ&JDwRxdy&`4s_D_h}?!bu&u0+ z-lm$kO-GnWpEHx%;2=DuA#!qBz;VQ#)u?mNs2Mc*Qs!<0xyLHm9gg;|vueV!5 zM7JbI-uwvhfp}1J9V*mAsF6qjDfl?coZ?pt8nU*)xF`X)5l`Jn4b};2y#*wy989aI zU=>wgELEBukOZ#N>vZEIoX64dy_2W`%c=VGIlmSx2hqZLl#aKb`>Us{q7s}+9lI&- zeh`yCa2-4j_smSUc&>(@I74pHM~RM!agTs?=rth<;^gfbh={k6DL0g>VjK4<@LT&_ zbC+-D$v#P<+O>Pu`Lzfe>rGWg_P~_22o( z46m4HN{V<7HRFDkKt=7V+#N__@0bDKSKWZ?dGi~$msB60k^KP)ar;?q%!+bVC(EhT z{07y)qLf*Q7Y>nX9j9o^spBVdWE4zligYIP zv2{OCLqOjaNpLxs>Lgu!Hk|I6@9$O|GezF?^~>;>Jr=6GtB>p2qX&ILtEjKDcy&j~ z?1TEE1<(~bGhR*~cAd^)Os~y>HijPvCxs7#W+nTqAjCQmKn{`UaN_?*Sc3y0%KJsTz4P;NCXE>NzgKlaH z%!bvdmbyUooOqR-)I&!^Vl(xb3{){a_iQ;r7g^&1eBTjS$>L$<#lZTGVXZ1-U3&@C zBj<>jdvA3w1es8M`WeV*H>`fr0hs%|2R|x@s~M&XJ>@#MU3$VC460}~(N0cE470wR zBYC8k=|U$m`1*;ry04=ivt|%$e5Uh9ko3m>n2ut4R@WMlPwUe=^VJVdaK1HmkSBfY z8~E*IIGA>)o##2$CedF~2dhNxp<-;HUNp_dO2%vuwYEO{WzMmrv@cPG>Aa{T)Phbm z!#9rK%_}kW#KKE z!$MgD8{it}JARiU%!MoV!6mVN_T3nv?~shj)1JWsg*hK_ zi%#Nt5{>gHTGzxE*5_q?n_nphke8Bs0m&8es)<|sw+W=&YoHhb4UNt zt#G+!gUDsV51IzgXHtu3w(kJ!&i6B<()a$WF{ z^iEoFES&y9W+N+@*Tk|cbptohWKU^v9sGJx50&4!}AL@9_6eI z96bmVHVLPjoFk1)w-V_cP)dNJ-VcZKagNAcpr5Yd@}^}!)`PV-uxpHfJD*RNjUzAT zHN2#Tj^^Vo|02pwGd2T9P482=88~{ir#vGOrMo=oHjWvuialdH|7yxLfp{KYW?4^V z-;~e&Hv86ccB~BcEb*E->@@S37RS*k2Jz!grvJe;fVEfrMLyX)Fc6s-f!w>PZ3nI#**JYDhWzV!E&6b5YPWrNt}3`u1Tk zDf@$R{zhvL)~8BS4YlmTIMxa4BtNHxd`iRY5a#erat))nf&zS!Ev!Cvr8?3?aZTy_ zWv;NEHfDX8<}BY=<%miW*@S-P>LumC53{c6^eaQz{zDH()1pKCYav`=k=F_yL3X4( zW;xuYuq0b~CAu{a^B6kInB8H1NF&#@9;&@`s-N(G(O~m63zdYNnYeS50c53yrhMi+GGb6AyjVEqH;ZwNO~i&0n}ny){EfAB(%XGGsGjL+a!^eJpl? z2gTsAm62aIcLIjD{z>kgm8aS}C;91|B}dWrz#T8^GwH@NTQ!rP!GZxvv1u~=5)&ew2}=R4dKMrk87y9M<+6MbX;k4WTge@wLr1I zJRv5&;+P(*>LZ+WPOw96>7jFB*7hUaND0X!ID~?QJ8$dd?6}DD3~_eU)1j-2@9UL? zIh%R=3g#isOky~b-3NYVZjut|QPg$Gly`mAp~?3$#N#xw*Q=N_TelDlE0dmOA!pxM zpZV8?^foe1XR@2Dp!@bQ#eN!jBwvNx=0?`*CwUHamc!^;M%`n0q{nzAyLd&q_PL90 z?tdXum-n6UPU=A}A5uE}+< z?mlCkSFigJ3Kae5sIjvGx#n#w%OYKY4&x8JzdUwe`(PPbyTN)&VRltgjpeXYy+;=Y zj|hE%?qvr+)YT94gYvHj+gy%g;j45znbgedVV0%QahZ-uRuBlbj`2*#c?7e;`fZ`P+_-}f-*?12w)3m)=ycEigZb2*=X&(7&qK{<@#XfrBV(!U2^erM`CGu|nFr~CA; z-q|{Mth37X1U=r`4ex1kPCkBh(8Rv12;D@{hME6&N-D#iWJo7^4rKO(?v;}jH z?1#_inrWWJi=-tb;H+xK#fx3vF|m^$DbspJgjsHm+B2}d+~;(-Gr>|dL49ODbZycT z*n}Z{8RQn!z>3fbqMhC|9i4@_4X(T@9ISw?5W7Gw>}BL%7IK_RsSt+IdF@9hB#Ltu z6g-Z!J?EIQsdB={yIWDDIjt1yR5`CR=S#3F^h7{(-V)6D`73}pYVJFzdb%qdWpVIOg`<`w? zUoU!uUG;prlju!LW`JIf<;F9A3gF|LjN(ks-61lDUAuzpkAd9t;9U)%6J1<4NuWf* z=7iQ{cm}~{t5bEQx)q7|M5l-W?P$L<|1y)=bIH}m9|3RAIWl_eQEFGwRl9DTlXOR$ z(PO@q{sSvH4({Z7Gwx_ti{dV2g-Mb*h})x!os!K0vuMZ?uT3V;NnfJ%tgN5os`3TM zm8np>!SP+mT9}INh5Mm1@h}K>8D1>rqdFZ~1D3do`D;_I3Shl8MFH^E#4X=B@QPz` za5|!SuQOp0Hw4x1;Ks#T9|gl^CFl?AEpV2=QKzFZxP;(D3qOAjRqKn?wCYyHz;Lse ztLAtCN5;-SALk3gvtN@jQ8{nK0~smHi7um;VybTc$*#di^clj4zQQ%r>l-T zD^U!p`ZyfdRQfGESso=1Eh|y%#%nr?npd~=H>p-GawS~>N!71JKBAr(zaHr8tw!^r z+DXR5aPK9Kqf=IQ470#*b4+v)2;!q{#d;5J5@Yb4}o>I@*$Q&-!m4r2~i#&EM09`OepXw4P>%@(77XKaK*= zj?kTLN{jxg>PPCxIXDAH?JM??8C20Kj8a3j?7*e?geHSZJdfTdnYtp_TuxUAPXOni z8^_Tjf~O|5e!WPw^4%u_M_=qZpRWG32-d(={9JYP4wF^ivxI~!SW;m;3+%jSqJ~=q zlg>(i1m>(&vF?E49QJm4Tz98UrlPLwS(X)mLq0iel=E{5zFi9wv*6NU%a zXzI7^Y5wH!=647fR88IG?%LdS*Vm(bT}FB%A5p;!5U5r}M8cwXR^EEgN7P z6Pi)5%2C*Bcz#mrO=tE)z6qbMj7pi6#c)MW!+1thPX^P0{F_wLRn&sxky`J5&V(x@ zZ%oHiRAfRYU-jSQe{uHe|5KS$HkbXInmHbiR5Og#NHxHjSjJpNEF1MYjAEy#W)*jH zE~s&eO`U^NwfUcuvqbY?WK7w$+iOHcvIngQ#3{G11L>lyF44bL5X<}7#ZTeTN4n(i z==M|j*)aG0j_Sb*LNq}p(sxu1t@L$$bZ+|Mma=!p(`{{lMXHX?Y?X0dkB>XdZY{F0 z07MDbC)V1^oFdZZKI6*YpUsSFiTdv8OdI6k>#9?kQ_FF3R(yX!U2X=Gg=?%DDi$^^ zA!Q|}nf2*qW@*Xrdo!2{pwr-J1c$A zhUqsCgE&6PmuHIInTqNM=*NCH(0b}%unA>|uFLhz9b1^}MTOpmGr)Sx#4}9l`u^-; zuBc_W^>;;l_FRFT0gv#y&7h&@<(m0=QQ2HEEE5pTt^8uKtC}houm1)Vnx$(Com` zIGnaF!(SRb79Ytz?mDSsf)%4FvG)5LV3BP-9i{@E`p!J6*q^9Z@p+@7Mg11}xvnS& zPV0I&5kZ!$Enng5N6=sS;-IWtgVvUMk~rIP-6e?C{4YJ$hEl62FY=(ZBvzmB?k zxwtQ&myAu76R0n}HI?{Ie9p_L(qx$3rhnRlPJKL*VEH}@vB98TrL7>SLFUAr^wlH$ zD@5;A$HV~DA;+-={LWZ>K~l%*OxNUf zr|F*UgyJRMo8H@=InIcmgBLLYbI~*R?h{3<*Lx#8l=7vokxZ*z?QvdXCmOWBL3y|` ze;Hi*?C{5MqQ>A$jln~@O?GD=^ChQIu}qO}@RL>Hm~aPLfd|QZQa@G(yR4s1 z_ImJBy49H^HlF6Q5oeC(*e(psLk|-V@9Z{-J7E}K*HA}>QP1ou-UtIMk2%)V@Waf{ z+DP9SD|!q@_6n-2zM?l_O7=15GK(UX%F4_-s#0{K3qxw&bRoFKwa~=Mw2u{c3i^k@ z(MPBc%x1Tm9?0HK?I!*$gKwO_ABX9DraO7bH+X8xcU;K~`X%1OqH9|1#LLuD~$Cr}mo}#~MIVj<*#aqAub-&Cx zQogkH)W)UJDfR3eBGE&AA9f|sO`ah;ul3Z2I1MI{@}u7V2Rw1#>b{A0;&ZTB2hdaN zF>;uzQO`aT24w}vbMEN7aeRzDN+nD$U2O_Hf}Q<$=EtUzaL24afVy-qyzeqHNneF8 z5y;(6JwM3$v1jSpqB+mlAdksxGMxyC@pL1t)P8!{ zkn_Thzn7nHMP*lpwhpYO(B!Y@(Z*Jy1+AhdFr%xB9yaszjGn__h8?U2cjFVOm%&PU za=Eyhc~6aW+%4>^DWnE|u{e)v?_6?LViVktpQtbrcn!O`N=rbRbW8CPY?QsaTHR{gYL}N{Z@A;>+>&RbL4IO$fxDKiju~3=ItcACDWIjfm3gVa0~xBeKqvyiKhOa&VEoyf7r=24DSWJ z=y4{dXX)3xMs@MQ)tPngJv7)bIGM+VLM7y7J_uXX$?9%Z)U1XzXgNTP*$r+5=?W5X?Py{hY30asT~VV92G4QD-V0859}0kh?3r+oLU=?cqWs*) z`$3~lt!jq$EpnyyXJ1DNce&$HoYmELbit$k0CZFqUo9?a4JbNg$Jry8lXE^@*D0Aj zN%%EIQ@>O1E(yUnae8en5KqPYDM=XjgZ?f=1J{HykN|;mcqM~y(H9Kw;SFji!GafWBj-SRb+24lZ z`%M_EWkr>wZPdWSiifpT7DK z3T$7B{+zXP8lU!c`d|6q>Dk5TlEd(o5>DNs@?qyH+yql%h`OkVk9a5Ote?y%jOH;C zO%@jSp`+PJK0_zRx1uPD&(QgeJIr@$no9%Q z#ix%?3r%xqgf+1P9`H_dQdI&%zh>onMR@$A%nF!bia_(jvjCpyZRVE*ke)dkti zD8#3SiqYDcQCQ3lyOAqmIy~!8AxdSgyVe3a<9t2qUH3Xz;b$#=38ZK_sfZ8bGv;(< zTAs53eRW^}TcS5Vq<+8gx&qT(ZSQSR@ zYw@?<{#!baoBUL6!#e)0hl~!UvfNU@VjG#{{2m6ud8VW{dG+QqIoH?q@muElV}0^` zMeWTXiKCyJV71h1tAfhXiEu5rh!e?VkR){o_u}1WHI|3g^&s!fX?oe*FF`HzL@t{< zgwHwI^KH(-+QIOgs++@cXTBQCDJS#cOyL-IvY^Ypri89u&PNQ0t_ZYU#Rh7(T@e)c z0bWlHyRkWrUDT{=lkEFJ-OyXeCkh-T1FYr=+^%JgPVu#OA0S|CRJ2jL~C!;DWv7qY=XpWkwM%Z}=Q%Q5C*KUAnSoJR^_ColFQF=Y8fJnND>v1Gb{N zNYA-ByoYpFdCws#BJkcub~4>u&!CpKA9x0DK2{ify2_bsrqc~4&~c?x)9MZ$qI*u| zeBBAhR<=+KXNcZkdf828E)huj;hsT-B zebtM|?pz$bh{qi5PhvjS4J+moW@YqwD6{r5X;<0h>|M9hRrp+b-iDc(k^k^>vRlu? zRQ7$yTbit4WR+Ok_^MyXlu;-!)vdyVV@)vs%llG0RU zypVa7t7AudEw5TGe9n>G;2S&ISCY(RhUqw;-3wqQ`?Cu;`}EFRn{+PuLz0@Sk8eSz zc|GU^up!u4fcpiku3LfnUUN81@n|j3%SL{cjt+b2F4Yw4&G-kZ_y!nXvBCB9v{m>u z4&|<=mOH|3Q%9d%2hKc?pMFLC_a5`@F%)J8Q`^Ap^rn1|eW|42!l75`mh}QX$ZMFO zhL_#Fk~-AHx3kotKH?wP3GIe`MXyrbIXlkbR(gPB(1As>;}yYVjSaStP`N5tSd>KX zUd)W6ftvMQ)UeTX1PhByZqU2R%<%)Lu2=F(t@q5$JP6bFAf3Wqdg?r0Hy&HOqCGI4 zz}(rvXM%H_%df%LRQj+H2!V? zJD9^6{0$njWOfg|56&=)4RdsKZu_zv1dH%flJEY*+I( z0%%XpCBN7u4wneWjs(jVH7Vv{$Y#56$UP+3tV7g?>_zgpUR%7QUCoNfrPIm@DtkR4 zNw1`XQPteu8OXgtZ?{ejDYX(^2uHq=YRfb62z^z5K^Zf1Jq4bGA&WW^e*gO@{`Y}9 z=m{88bOsIBwJ;rEI2Ff@cf)@~5q1ezwXeXqmh-9gFh9AP|3apf&z$Z{OIt!kIR}^< zEz4SQY)zh79#?y~8giavSGv6<23_Mw;L8)Y^WH3SADjVC-*lIR);UZQ({U5A!zKrv znNA|EcNM+Sfe*U^eexb>;#idgTS8Bz)qv$*g2GL{5R0%>RR?Kh*?U6DHFvl%h=sM>Zi+tL0Em< z^zJ+Jqf<=TvqLmdbOfAo1C_pKQ39xionlc0t!|C{YX4dMpec*h0BZ$K|IKdTgaPw~$47>t5dXrr>5l#N2lexRBN~{o5=h*`? z+gA3Z^pg||V%*D-D(v5S`Y>#s6!uTKqcYfj=KYxiG0Co6(I1;?KfSOhRG82T*Mb%D zL8{shZ&WE3y{0%r{Mly{#nO|}Q! z&cW1rI*gBDgSxwsR?{Q1X%_QfGF4HjF6c~z!&cgsOpcd5_-l*v;ZdskH5v60<_1B_Zk@EOmXt12$=VI7v>S%eZKm*RlWrV01;aVj8RjDKd~Ytb zi8rEL9vRak&cX_KvFjS1(t3N9k)o{2EKKb5V6*<|Vk^4kolADVoJ3+&Efg>eb=IwzN&v!Ymx*tB;EonI$aNQbLbGg459w-sNSo zg6$aeKJS3fYJ#Imig-}67>+!r-)fdD4L%d&kk$&!8Ei!AJz-^;{tmirQ@z{M_C9*HajSHI^czaM!0#P>|vNMb{0)6EqYPJeXqBg}&jrm7pC5t$#FbM5(6 zkNeo}KpmAv37>oqwZ2)WtY5fBuf}mzu8WoZ0Bp)}&N5RoTuVMg&1hDP-J^;peZign znER{-$|GC|+G?jGm)TzVFzdh9RTS?{-!GXy-|^n;aP0KusC&*lz>#vNXyVHDMbsXX?4&_B!81_OF$a9; zuVWVdbnU7C@_$A}`BnPR)M-&sF)>m9)qgXivZFRv{Erz=SJYOd|I_*n4=l@!`uqQ% z|2;qDsVAPO{q5$bo_XSlyZ-jKPjA^!b=R{|i(dF&lFOob!pvu*pNjl8{fRBL)f;N= zdSY``<(BFVPd`yxwW;Q}o1fUa zD&t??V){S*&kroS>(7qTQyVI3YJNHS#*-)iw`l2Izx?GBPyAEG=8BC~wN;yIo_OMy zg}*FckhviBm;Vs?Rppj{{KtR!`Q(o(Hf{QCZAIkOPu~3B_^}W14?NW0MGoCve$a0( z{@+$?<9+z`@4uJ-7?t;LznAo<`83u(5&7)1|Lk4;x1R*hPbvHFdF}^Rto+;X-#ziz zZ~m_2iB*5M@;47Z_{86Zm;DdFem1I%-$p$fUH|Nqhob)ZR9IJCoBqTM=d+M3Ce`<{R64L(0*QRI;~W=wyK%OuLLfB%tZME$48BX8x?<3xL4S<%1s znE&lZ@9+OUEAla3cysNeQ+Q^-N*{{$fB$mD{`s|hm%sRn|NeCSW@P^B`~CT8KJzc` z^M9}^{ONuknty%IKR>DF{KY+g{(kbF|J6nDuOH&iKdArs7Y{Lf{oi?r|LrW5%XP@-HzWbja+!=py_y6#JPu~5XKhDyJe({Ucf4;%IscHXm(_j4a tcYpf-?_AmV@4s+&|KolxUr{q}_;*y4zb<{~uOc`9Mbs~%y#3^D|6eBRK~4Yw From c19202bf686f5bce5d1ff8be94ccbf6ff95058fc Mon Sep 17 00:00:00 2001 From: Joyjit Daw Date: Mon, 23 Oct 2023 18:19:49 -0400 Subject: [PATCH 02/13] Move SampleType into model config structure so it's determined once and easily accessible from the common structure. --- dorado/cli/basecaller.cpp | 3 +-- dorado/nn/CRFModelConfig.cpp | 33 ++++++++++++++--------------- dorado/nn/CRFModelConfig.h | 14 ++++++------ dorado/read_pipeline/Pipelines.cpp | 4 ++-- dorado/read_pipeline/ScalerNode.cpp | 18 ++++++++-------- dorado/read_pipeline/ScalerNode.h | 4 ++-- tests/NodeSmokeTest.cpp | 6 +++--- 7 files changed, 40 insertions(+), 42 deletions(-) diff --git a/dorado/cli/basecaller.cpp b/dorado/cli/basecaller.cpp index b93b1ced..85a92a52 100644 --- a/dorado/cli/basecaller.cpp +++ b/dorado/cli/basecaller.cpp @@ -142,8 +142,7 @@ void setup(std::vector args, methylation_threshold_pct); if (estimate_poly_a) { current_sink_node = pipeline_desc.add_node( - {current_sink_node}, std::thread::hardware_concurrency(), - get_model_type(model_config)); + {current_sink_node}, std::thread::hardware_concurrency(), model_config.sample_type); } if (!barcode_kits.empty()) { utils::SampleSheet sample_sheet(barcode_sample_sheet); diff --git a/dorado/nn/CRFModelConfig.cpp b/dorado/nn/CRFModelConfig.cpp index 7bed4db0..a9fdb8cf 100644 --- a/dorado/nn/CRFModelConfig.cpp +++ b/dorado/nn/CRFModelConfig.cpp @@ -9,6 +9,18 @@ namespace dorado { +SampleType get_model_type(const std::string &model_name) { + if (model_name.find("rna004") != std::string::npos) { + return SampleType::RNA004; + } else if (model_name.find("rna002") != std::string::npos) { + return SampleType::RNA002; + } else if (model_name.find("dna") != std::string::npos) { + return SampleType::DNA; + } else { + throw std::runtime_error("Could not determine model type for " + model_name); + } +} + CRFModelConfig load_crf_model_config(const std::filesystem::path &path) { const auto config_toml = toml::parse(path / "config.toml"); @@ -96,6 +108,8 @@ CRFModelConfig load_crf_model_config(const std::filesystem::path &path) { config.signal_norm_params.quantile_scaling = false; } + config.sample_type = get_model_type(model_name); + return config; } @@ -124,23 +138,8 @@ int32_t get_model_mean_qscore_start_pos(const CRFModelConfig &model_config) { } bool is_rna_model(const CRFModelConfig &model_config) { - auto path = std::filesystem::canonical(model_config.model_path); - auto filename = path.filename(); - return filename.u8string().rfind("rna", 0) == 0; -} - -ModelType get_model_type(const CRFModelConfig &model_config) { - auto path = std::filesystem::canonical(model_config.model_path); - auto model_name = path.filename().string(); - if (model_name.find("rna004") != std::string::npos) { - return ModelType::RNA004; - } else if (model_name.find("rna002") != std::string::npos) { - return ModelType::RNA002; - } else if (model_name.find("dna") != std::string::npos) { - return ModelType::DNA; - } else { - throw std::runtime_error("Could not determine model type for " + model_name); - } + return (model_config.sample_type == SampleType::RNA002 || + model_config.sample_type == SampleType::RNA004); } } // namespace dorado diff --git a/dorado/nn/CRFModelConfig.h b/dorado/nn/CRFModelConfig.h index c4597012..fb360c19 100644 --- a/dorado/nn/CRFModelConfig.h +++ b/dorado/nn/CRFModelConfig.h @@ -15,6 +15,12 @@ struct SignalNormalisationParams { bool quantile_scaling = true; }; +enum SampleType { + DNA, + RNA002, + RNA004, +}; + // Values extracted from config.toml used in construction of the model module. struct CRFModelConfig { float qscale = 1.0f; @@ -42,12 +48,8 @@ struct CRFModelConfig { // Start position for mean Q-score calculation for // short reads. int32_t mean_qscore_start_pos = -1; -}; -enum ModelType { - DNA, - RNA002, - RNA004, + SampleType sample_type; }; CRFModelConfig load_crf_model_config(const std::filesystem::path& path); @@ -63,6 +65,4 @@ int32_t get_model_mean_qscore_start_pos(const CRFModelConfig& model_config); bool is_rna_model(const CRFModelConfig& model_config); -ModelType get_model_type(const CRFModelConfig& model_config); - } // namespace dorado diff --git a/dorado/read_pipeline/Pipelines.cpp b/dorado/read_pipeline/Pipelines.cpp index 545d434f..3eb1d4c2 100644 --- a/dorado/read_pipeline/Pipelines.cpp +++ b/dorado/read_pipeline/Pipelines.cpp @@ -62,7 +62,7 @@ void create_simplex_pipeline(PipelineDescriptor& pipeline_desc, auto scaler_node = pipeline_desc.add_node({basecaller_node}, model_config.signal_norm_params, - get_model_type(model_config), scaler_node_threads); + model_config.sample_type, scaler_node_threads); // if we've been provided a source node, connect it to the start of our pipeline if (source_node_handle != PipelineDescriptor::InvalidNodeHandle) { @@ -130,7 +130,7 @@ void create_stereo_duplex_pipeline(PipelineDescriptor& pipeline_desc, auto scaler_node = pipeline_desc.add_node({basecaller_node}, model_config.signal_norm_params, - ModelType::DNA, scaler_node_threads); + SampleType::DNA, scaler_node_threads); // if we've been provided a source node, connect it to the start of our pipeline if (source_node_handle != PipelineDescriptor::InvalidNodeHandle) { diff --git a/dorado/read_pipeline/ScalerNode.cpp b/dorado/read_pipeline/ScalerNode.cpp index 0b71a9a3..8105ff04 100644 --- a/dorado/read_pipeline/ScalerNode.cpp +++ b/dorado/read_pipeline/ScalerNode.cpp @@ -42,13 +42,13 @@ std::pair ScalerNode::med_mad(const torch::Tensor& x) { // at the median signal value of a sliding window over the raw signal. // RNA002 and RNA004 have different offsets and thresholds for the // sliding window heuristic. -int determine_rna_adapter_pos(const dorado::SimplexRead& read, dorado::ModelType model_type) { - static const std::unordered_map kOffsetMap = { - {dorado::ModelType::RNA002, 5000}, {dorado::ModelType::RNA004, 1000}}; - static const std::unordered_map kMaxSignalPosMap = { - {dorado::ModelType::RNA002, 15000}, {dorado::ModelType::RNA004, 5000}}; - static const std::unordered_map kAdapterCutoff = { - {dorado::ModelType::RNA002, 550}, {dorado::ModelType::RNA004, 825}}; +int determine_rna_adapter_pos(const dorado::SimplexRead& read, dorado::SampleType model_type) { + static const std::unordered_map kOffsetMap = { + {dorado::SampleType::RNA002, 5000}, {dorado::SampleType::RNA004, 1000}}; + static const std::unordered_map kMaxSignalPosMap = { + {dorado::SampleType::RNA002, 15000}, {dorado::SampleType::RNA004, 5000}}; + static const std::unordered_map kAdapterCutoff = { + {dorado::SampleType::RNA002, 550}, {dorado::SampleType::RNA004, 825}}; const int kWindowSize = 250; const int kStride = 50; @@ -135,13 +135,13 @@ void ScalerNode::worker_thread() { } ScalerNode::ScalerNode(const SignalNormalisationParams& config, - ModelType model_type, + SampleType model_type, int num_worker_threads, size_t max_reads) : MessageSink(max_reads), m_scaling_params(config), m_num_worker_threads(num_worker_threads), - m_is_rna(model_type == ModelType::RNA002 || model_type == ModelType::RNA004), + m_is_rna(model_type == SampleType::RNA002 || model_type == SampleType::RNA004), m_model_type(model_type) { start_threads(); } diff --git a/dorado/read_pipeline/ScalerNode.h b/dorado/read_pipeline/ScalerNode.h index 08080f2f..9e5652bc 100644 --- a/dorado/read_pipeline/ScalerNode.h +++ b/dorado/read_pipeline/ScalerNode.h @@ -16,7 +16,7 @@ namespace dorado { class ScalerNode : public MessageSink { public: ScalerNode(const SignalNormalisationParams& config, - ModelType model_type, + SampleType model_type, int num_worker_threads = 5, size_t max_reads = 1000); ~ScalerNode() { terminate_impl(); } @@ -34,7 +34,7 @@ class ScalerNode : public MessageSink { SignalNormalisationParams m_scaling_params; const bool m_is_rna; - const ModelType m_model_type; + const SampleType m_model_type; std::pair med_mad(const torch::Tensor& x); std::pair normalisation(const torch::Tensor& x); diff --git a/tests/NodeSmokeTest.cpp b/tests/NodeSmokeTest.cpp index 966e075c..f33e2888 100644 --- a/tests/NodeSmokeTest.cpp +++ b/tests/NodeSmokeTest.cpp @@ -163,8 +163,8 @@ TempDir download_model(const std::string& model) { DEFINE_TEST(NodeSmokeTestRead, "ScalerNode") { auto pipeline_restart = GENERATE(false, true); - auto model_type = - GENERATE(dorado::ModelType::DNA, dorado::ModelType::RNA002, dorado::ModelType::RNA004); + auto model_type = GENERATE(dorado::SampleType::DNA, dorado::SampleType::RNA002, + dorado::SampleType::RNA004); CAPTURE(pipeline_restart); CAPTURE(model_type); @@ -371,7 +371,7 @@ TEST_CASE("BarcodeClassifierNode: test simple pipeline with fastq and sam files" DEFINE_TEST(NodeSmokeTestRead, "PolyACalculator") { auto pipeline_restart = GENERATE(false, true); - auto is_rna = GENERATE(dorado::ModelType::DNA, dorado::ModelType::RNA004); + auto is_rna = GENERATE(false, true); CAPTURE(pipeline_restart); CAPTURE(is_rna); From c3deb8f09431b1deef7f7725988401b81480a87f Mon Sep 17 00:00:00 2001 From: Joyjit Daw Date: Tue, 24 Oct 2023 09:35:38 -0400 Subject: [PATCH 03/13] update adapter detection thresholds and use last 5 values to determine jump in median signal values --- dorado/read_pipeline/PolyACalculator.cpp | 17 ----------------- dorado/read_pipeline/ScalerNode.cpp | 14 ++++++++++---- 2 files changed, 10 insertions(+), 21 deletions(-) diff --git a/dorado/read_pipeline/PolyACalculator.cpp b/dorado/read_pipeline/PolyACalculator.cpp index 65ba0fc1..4e19857a 100644 --- a/dorado/read_pipeline/PolyACalculator.cpp +++ b/dorado/read_pipeline/PolyACalculator.cpp @@ -281,23 +281,6 @@ void PolyACalculator::worker_thread() { // If this message isn't a read, we'll get a bad_variant_access exception. auto read = std::get(std::move(message)); - // Save data - std::ofstream outputFile("moves.bin"); - - // Iterate through the vector and write its contents to the file - for (uint8_t element : read->read_common.moves) { - outputFile << element; - } - - // Close the file - outputFile.close(); - - torch::save(read->read_common.raw_data, "signal.tensor"); - - std::ofstream seqFile("seq.txt"); - seqFile << read->read_common.seq; - seqFile.close(); - // Determine the strand direction, approximate base space anchor for the tail, and whether // the final length needs to be adjusted depending on the adapter sequence. auto [fwd, signal_anchor, trailing_Ts] = diff --git a/dorado/read_pipeline/ScalerNode.cpp b/dorado/read_pipeline/ScalerNode.cpp index 8105ff04..1169c237 100644 --- a/dorado/read_pipeline/ScalerNode.cpp +++ b/dorado/read_pipeline/ScalerNode.cpp @@ -46,9 +46,9 @@ int determine_rna_adapter_pos(const dorado::SimplexRead& read, dorado::SampleTyp static const std::unordered_map kOffsetMap = { {dorado::SampleType::RNA002, 5000}, {dorado::SampleType::RNA004, 1000}}; static const std::unordered_map kMaxSignalPosMap = { - {dorado::SampleType::RNA002, 15000}, {dorado::SampleType::RNA004, 5000}}; + {dorado::SampleType::RNA002, 15000}, {dorado::SampleType::RNA004, 10000}}; static const std::unordered_map kAdapterCutoff = { - {dorado::SampleType::RNA002, 550}, {dorado::SampleType::RNA004, 825}}; + {dorado::SampleType::RNA002, 600}, {dorado::SampleType::RNA004, 775}}; const int kWindowSize = 250; const int kStride = 50; @@ -61,10 +61,16 @@ int determine_rna_adapter_pos(const dorado::SimplexRead& read, dorado::SampleTyp int signal_len = read.read_common.get_raw_data_samples(); auto sig_fp32 = read.read_common.raw_data.to(torch::kInt16); int16_t last_median = 0; - for (int i = kOffset; i < std::min(signal_len / 2, kMaxSignalPos); i += kStride) { + std::array medians = {0, 0, 0}; + int array_pos = 0; + for (int i = kOffset; i < std::max(signal_len / 2, kMaxSignalPos); i += kStride) { auto slice = sig_fp32.slice(0, i, std::min(signal_len, i + kWindowSize)); int16_t median = slice.median().item(); - if (i > kOffset && median > kMinMedianForRNASignal && (median - last_median > 75)) { + medians[array_pos++ % medians.size()] = median; + int16_t max = *std::max_element(medians.begin(), medians.end()); + int16_t min = *std::min_element(medians.begin(), medians.end()); + //spdlog::debug("pos {} max {} diff {}", i, max, (max - min)); + if (i > (kOffset + medians.size()) && max > kMinMedianForRNASignal && (max - min > 100)) { bp = i; break; } From fb1b636137a96437b4fecb26a56751e944531155 Mon Sep 17 00:00:00 2001 From: Joyjit Daw <1127155+tijyojwad@users.noreply.github.com> Date: Tue, 24 Oct 2023 17:19:51 +0100 Subject: [PATCH 04/13] fix upper bound on adapter detection loop --- dorado/cli/basecaller.cpp | 3 ++- dorado/read_pipeline/ScalerNode.cpp | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dorado/cli/basecaller.cpp b/dorado/cli/basecaller.cpp index 85a92a52..6834e2b3 100644 --- a/dorado/cli/basecaller.cpp +++ b/dorado/cli/basecaller.cpp @@ -142,7 +142,8 @@ void setup(std::vector args, methylation_threshold_pct); if (estimate_poly_a) { current_sink_node = pipeline_desc.add_node( - {current_sink_node}, std::thread::hardware_concurrency(), model_config.sample_type); + {current_sink_node}, std::thread::hardware_concurrency(), + is_rna_model(model_config)); } if (!barcode_kits.empty()) { utils::SampleSheet sample_sheet(barcode_sample_sheet); diff --git a/dorado/read_pipeline/ScalerNode.cpp b/dorado/read_pipeline/ScalerNode.cpp index 1169c237..0d3a52dd 100644 --- a/dorado/read_pipeline/ScalerNode.cpp +++ b/dorado/read_pipeline/ScalerNode.cpp @@ -63,7 +63,8 @@ int determine_rna_adapter_pos(const dorado::SimplexRead& read, dorado::SampleTyp int16_t last_median = 0; std::array medians = {0, 0, 0}; int array_pos = 0; - for (int i = kOffset; i < std::max(signal_len / 2, kMaxSignalPos); i += kStride) { + for (int i = kOffset; i < std::min(std::max(signal_len / 2, kMaxSignalPos), signal_len); + i += kStride) { auto slice = sig_fp32.slice(0, i, std::min(signal_len, i + kWindowSize)); int16_t median = slice.median().item(); medians[array_pos++ % medians.size()] = median; @@ -99,6 +100,8 @@ void ScalerNode::worker_thread() { int trim_start = 0; if (m_is_rna) { trim_start = determine_rna_adapter_pos(*read, m_model_type); + spdlog::debug("{} samples {} trim start {}", read->read_common.read_id, + read->read_common.get_raw_data_samples(), trim_start); read->read_common.raw_data = read->read_common.raw_data.index({Slice(trim_start, torch::indexing::None)}); } From 0966a38acbe1a83a044109f47382955b5b7eb045 Mon Sep 17 00:00:00 2001 From: Joyjit Daw Date: Tue, 24 Oct 2023 13:58:22 -0400 Subject: [PATCH 05/13] refine thresholds for RNA004 --- dorado/read_pipeline/ScalerNode.cpp | 35 +++++++++++++++-------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/dorado/read_pipeline/ScalerNode.cpp b/dorado/read_pipeline/ScalerNode.cpp index 0d3a52dd..62df5291 100644 --- a/dorado/read_pipeline/ScalerNode.cpp +++ b/dorado/read_pipeline/ScalerNode.cpp @@ -39,43 +39,46 @@ std::pair ScalerNode::med_mad(const torch::Tensor& x) { // This function returns the approximate position where the DNA adapter // in a dRNA read ends. The adapter location is determined by looking -// at the median signal value of a sliding window over the raw signal. +// at the median signal value over a sliding window on the raw signal. // RNA002 and RNA004 have different offsets and thresholds for the // sliding window heuristic. int determine_rna_adapter_pos(const dorado::SimplexRead& read, dorado::SampleType model_type) { + assert(read.read_common.raw_data.dtype() == torch::kInt16); static const std::unordered_map kOffsetMap = { {dorado::SampleType::RNA002, 5000}, {dorado::SampleType::RNA004, 1000}}; static const std::unordered_map kMaxSignalPosMap = { - {dorado::SampleType::RNA002, 15000}, {dorado::SampleType::RNA004, 10000}}; + {dorado::SampleType::RNA002, 15000}, {dorado::SampleType::RNA004, 5000}}; static const std::unordered_map kAdapterCutoff = { - {dorado::SampleType::RNA002, 600}, {dorado::SampleType::RNA004, 775}}; + {dorado::SampleType::RNA002, 600}, {dorado::SampleType::RNA004, 700}}; const int kWindowSize = 250; const int kStride = 50; + const int16_t kMedianDiff = 125; + const int kOffset = kOffsetMap.at(model_type); const int kMaxSignalPos = kMaxSignalPosMap.at(model_type); - const int16_t kMinMedianForRNASignal = kAdapterCutoff.at(model_type); int bp = 0; int signal_len = read.read_common.get_raw_data_samples(); auto sig_fp32 = read.read_common.raw_data.to(torch::kInt16); - int16_t last_median = 0; - std::array medians = {0, 0, 0}; - int array_pos = 0; + + // Check the median value change over 5 windows. + std::array medians = {0, 0, 0, 0, 0}; + int median_pos = 0; for (int i = kOffset; i < std::min(std::max(signal_len / 2, kMaxSignalPos), signal_len); i += kStride) { auto slice = sig_fp32.slice(0, i, std::min(signal_len, i + kWindowSize)); int16_t median = slice.median().item(); - medians[array_pos++ % medians.size()] = median; - int16_t max = *std::max_element(medians.begin(), medians.end()); - int16_t min = *std::min_element(medians.begin(), medians.end()); - //spdlog::debug("pos {} max {} diff {}", i, max, (max - min)); - if (i > (kOffset + medians.size()) && max > kMinMedianForRNASignal && (max - min > 100)) { - bp = i; - break; + medians[median_pos++ % medians.size()] = median; + int16_t max_median = *std::max_element(medians.begin(), medians.end()); + int16_t min_median = *std::min_element(medians.begin(), medians.end()); + if (i > (kOffset + medians.size())) { + if ((max_median > kMinMedianForRNASignal) && (max_median - min_median > kMedianDiff)) { + bp = i; + break; + } } - last_median = median; } spdlog::debug("Approx break point {}", bp); @@ -100,8 +103,6 @@ void ScalerNode::worker_thread() { int trim_start = 0; if (m_is_rna) { trim_start = determine_rna_adapter_pos(*read, m_model_type); - spdlog::debug("{} samples {} trim start {}", read->read_common.read_id, - read->read_common.get_raw_data_samples(), trim_start); read->read_common.raw_data = read->read_common.raw_data.index({Slice(trim_start, torch::indexing::None)}); } From 4956dfa8d54ec3b59dc9f3898411c44baaf537b7 Mon Sep 17 00:00:00 2001 From: Joyjit Daw <1127155+tijyojwad@users.noreply.github.com> Date: Tue, 24 Oct 2023 21:14:40 +0100 Subject: [PATCH 06/13] optimize tensor access for median calculation --- dorado/read_pipeline/ScalerNode.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/dorado/read_pipeline/ScalerNode.cpp b/dorado/read_pipeline/ScalerNode.cpp index 62df5291..69f93684 100644 --- a/dorado/read_pipeline/ScalerNode.cpp +++ b/dorado/read_pipeline/ScalerNode.cpp @@ -61,18 +61,21 @@ int determine_rna_adapter_pos(const dorado::SimplexRead& read, dorado::SampleTyp int bp = 0; int signal_len = read.read_common.get_raw_data_samples(); - auto sig_fp32 = read.read_common.raw_data.to(torch::kInt16); + const int16_t* signal = static_cast(read.read_common.raw_data.data_ptr()); // Check the median value change over 5 windows. std::array medians = {0, 0, 0, 0, 0}; int median_pos = 0; for (int i = kOffset; i < std::min(std::max(signal_len / 2, kMaxSignalPos), signal_len); i += kStride) { - auto slice = sig_fp32.slice(0, i, std::min(signal_len, i + kWindowSize)); + auto slice = torch::from_blob(const_cast(&signal[i]), + {static_cast(std::min(kWindowSize, signal_len - i))}, + torch::TensorOptions().dtype(torch::kInt16)); int16_t median = slice.median().item(); medians[median_pos++ % medians.size()] = median; - int16_t max_median = *std::max_element(medians.begin(), medians.end()); - int16_t min_median = *std::min_element(medians.begin(), medians.end()); + auto minmax = std::minmax_element(medians.begin(), medians.end()); + int16_t min_median = *minmax.first; + int16_t max_median = *minmax.second; if (i > (kOffset + medians.size())) { if ((max_median > kMinMedianForRNASignal) && (max_median - min_median > kMedianDiff)) { bp = i; From ed5201d20e62731a089a05d7ff64b95cc5cd4bfa Mon Sep 17 00:00:00 2001 From: Joyjit Daw <1127155+tijyojwad@users.noreply.github.com> Date: Tue, 24 Oct 2023 21:24:26 +0100 Subject: [PATCH 07/13] revert change to is_rna function --- dorado/nn/CRFModelConfig.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dorado/nn/CRFModelConfig.cpp b/dorado/nn/CRFModelConfig.cpp index a9fdb8cf..d0f84476 100644 --- a/dorado/nn/CRFModelConfig.cpp +++ b/dorado/nn/CRFModelConfig.cpp @@ -138,8 +138,9 @@ int32_t get_model_mean_qscore_start_pos(const CRFModelConfig &model_config) { } bool is_rna_model(const CRFModelConfig &model_config) { - return (model_config.sample_type == SampleType::RNA002 || - model_config.sample_type == SampleType::RNA004); + auto path = std::filesystem::canonical(model_config.model_path); + auto filename = path.filename(); + return filename.u8string().rfind("rna", 0) == 0; } } // namespace dorado From 2984137ba565a2aed930658a013d79943027de7e Mon Sep 17 00:00:00 2001 From: Joyjit Daw Date: Wed, 25 Oct 2023 12:48:45 -0400 Subject: [PATCH 08/13] removing unnecessary member variable --- dorado/read_pipeline/ScalerNode.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/dorado/read_pipeline/ScalerNode.cpp b/dorado/read_pipeline/ScalerNode.cpp index 69f93684..9905a382 100644 --- a/dorado/read_pipeline/ScalerNode.cpp +++ b/dorado/read_pipeline/ScalerNode.cpp @@ -84,8 +84,6 @@ int determine_rna_adapter_pos(const dorado::SimplexRead& read, dorado::SampleTyp } } - spdlog::debug("Approx break point {}", bp); - return bp; } @@ -102,9 +100,10 @@ void ScalerNode::worker_thread() { auto read = std::get(std::move(message)); + bool is_rna = (m_model_type == SampleType::RNA002 || m_model_type == SampleType::RNA004); // Trim adapter for RNA first before scaling. int trim_start = 0; - if (m_is_rna) { + if (is_rna) { trim_start = determine_rna_adapter_pos(*read, m_model_type); read->read_common.raw_data = read->read_common.raw_data.index({Slice(trim_start, torch::indexing::None)}); @@ -128,7 +127,7 @@ void ScalerNode::worker_thread() { read->read_common.shift = read->scaling * (shift + read->offset); // Don't perform DNA trimming on RNA since it looks too different and we lose useful signal. - if (!m_is_rna) { + if (!is_rna) { // 8000 value may be changed in future. Currently this is found to work well. int max_samples = std::min(8000, static_cast(read->read_common.get_raw_data_samples() / 2)); @@ -140,7 +139,8 @@ void ScalerNode::worker_thread() { read->read_common.num_trimmed_samples = trim_start; - spdlog::debug("{} {} {} {}", read->read_common.read_id, shift, scale, trim_start); + spdlog::trace("ScalerNode: {} shift: {} scale: {} trim: {}", read->read_common.read_id, + shift, scale, trim_start); // Pass the read to the next node send_message_to_sink(std::move(read)); @@ -154,7 +154,6 @@ ScalerNode::ScalerNode(const SignalNormalisationParams& config, : MessageSink(max_reads), m_scaling_params(config), m_num_worker_threads(num_worker_threads), - m_is_rna(model_type == SampleType::RNA002 || model_type == SampleType::RNA004), m_model_type(model_type) { start_threads(); } From 37e474edc9595e6889ec01fd209c3cefcb51d57a Mon Sep 17 00:00:00 2001 From: Joyjit Daw Date: Wed, 25 Oct 2023 12:49:00 -0400 Subject: [PATCH 09/13] Adding -vv logging to dorado to enable trace logging from the cmdline for developer level logging information. --- dorado/cli/aligner.cpp | 11 +++++++++-- dorado/cli/basecaller.cpp | 11 +++++++++-- dorado/cli/demux.cpp | 11 +++++++++-- dorado/cli/duplex.cpp | 11 +++++++++-- dorado/read_pipeline/ScalerNode.h | 1 - dorado/utils/log_utils.cpp | 8 ++++++-- dorado/utils/log_utils.h | 7 ++++++- 7 files changed, 48 insertions(+), 12 deletions(-) diff --git a/dorado/cli/aligner.cpp b/dorado/cli/aligner.cpp index a1637f78..2f113597 100644 --- a/dorado/cli/aligner.cpp +++ b/dorado/cli/aligner.cpp @@ -53,7 +53,14 @@ int aligner(int argc, char* argv[]) { .help("maximum number of reads to process (for debugging, 0=unlimited).") .default_value(0) .scan<'i', int>(); - parser.visible.add_argument("-v", "--verbose").default_value(false).implicit_value(true); + int verbosity = 0; + parser.visible.add_argument("-v", "--verbose") + .default_value(false) + .implicit_value(true) + .nargs(0) + .action([&](const auto&) { ++verbosity; }) + .append(); + ; cli::add_minimap2_arguments(parser, Aligner::dflt_options); try { @@ -67,7 +74,7 @@ int aligner(int argc, char* argv[]) { if (parser.visible.get("--verbose")) { mm_verbose = 3; - utils::SetDebugLogging(); + utils::SetDebugLogging(static_cast(verbosity)); } auto index(parser.visible.get("index")); diff --git a/dorado/cli/basecaller.cpp b/dorado/cli/basecaller.cpp index 6834e2b3..8dbffed0 100644 --- a/dorado/cli/basecaller.cpp +++ b/dorado/cli/basecaller.cpp @@ -259,7 +259,14 @@ int basecaller(int argc, char* argv[]) { parser.visible.add_argument("data").help("the data directory or file (POD5/FAST5 format)."); - parser.visible.add_argument("-v", "--verbose").default_value(false).implicit_value(true); + int verbosity = 0; + parser.visible.add_argument("-v", "--verbose") + .default_value(false) + .implicit_value(true) + .nargs(0) + .action([&](const auto&) { ++verbosity; }) + .append(); + ; parser.visible.add_argument("-x", "--device") .help("device string in format \"cuda:0,...,N\", \"cuda:all\", \"metal\", \"cpu\" " @@ -384,7 +391,7 @@ int basecaller(int argc, char* argv[]) { std::vector args(argv, argv + argc); if (parser.visible.get("--verbose")) { - utils::SetDebugLogging(); + utils::SetDebugLogging(static_cast(verbosity)); } auto model = parser.visible.get("model"); diff --git a/dorado/cli/demux.cpp b/dorado/cli/demux.cpp index 68a6c997..928daeb4 100644 --- a/dorado/cli/demux.cpp +++ b/dorado/cli/demux.cpp @@ -69,7 +69,14 @@ int demuxer(int argc, char* argv[]) { parser.add_argument("-l", "--read-ids") .help("A file with a newline-delimited list of reads to demux.") .default_value(std::string("")); - parser.add_argument("-v", "--verbose").default_value(false).implicit_value(true); + int verbosity = 0; + parser.add_argument("-v", "--verbose") + .default_value(false) + .implicit_value(true) + .nargs(0) + .action([&](const auto&) { ++verbosity; }) + .append(); + ; parser.add_argument("--emit-fastq") .help("Output in fastq format. Default is BAM.") .default_value(false) @@ -99,7 +106,7 @@ int demuxer(int argc, char* argv[]) { } if (parser.get("--verbose")) { - utils::SetDebugLogging(); + utils::SetDebugLogging(static_cast(verbosity)); } auto reads(parser.get>("reads")); diff --git a/dorado/cli/duplex.cpp b/dorado/cli/duplex.cpp index 35940d1c..45e2a78a 100644 --- a/dorado/cli/duplex.cpp +++ b/dorado/cli/duplex.cpp @@ -109,7 +109,14 @@ int duplex(int argc, char* argv[]) { .help("Path to reference for alignment.") .default_value(std::string("")); - parser.visible.add_argument("-v", "--verbose").default_value(false).implicit_value(true); + int verbosity = 0; + parser.visible.add_argument("-v", "--verbose") + .default_value(false) + .implicit_value(true) + .nargs(0) + .action([&](const auto&) { ++verbosity; }) + .append(); + ; cli::add_minimap2_arguments(parser, Aligner::dflt_options); cli::add_internal_arguments(parser); @@ -132,7 +139,7 @@ int duplex(int argc, char* argv[]) { const bool basespace_duplex = (model.compare("basespace") == 0); std::vector args(argv, argv + argc); if (parser.visible.get("--verbose")) { - utils::SetDebugLogging(); + utils::SetDebugLogging(static_cast(verbosity)); } std::map template_complement_map; auto read_list = utils::load_read_list(parser.visible.get("--read-ids")); diff --git a/dorado/read_pipeline/ScalerNode.h b/dorado/read_pipeline/ScalerNode.h index 9e5652bc..743faae4 100644 --- a/dorado/read_pipeline/ScalerNode.h +++ b/dorado/read_pipeline/ScalerNode.h @@ -33,7 +33,6 @@ class ScalerNode : public MessageSink { std::atomic m_num_worker_threads; SignalNormalisationParams m_scaling_params; - const bool m_is_rna; const SampleType m_model_type; std::pair med_mad(const torch::Tensor& x); diff --git a/dorado/utils/log_utils.cpp b/dorado/utils/log_utils.cpp index 88cbf3fc..04c775fe 100644 --- a/dorado/utils/log_utils.cpp +++ b/dorado/utils/log_utils.cpp @@ -73,9 +73,13 @@ void InitLogging() { } } -void SetDebugLogging() { +void SetDebugLogging(DebugLogLevel level) { if (is_safe_to_log()) { - spdlog::set_level(spdlog::level::debug); + if (level >= TRACE) { + spdlog::set_level(spdlog::level::trace); + } else if (level == DEBUG) { + spdlog::set_level(spdlog::level::debug); + } } } diff --git a/dorado/utils/log_utils.h b/dorado/utils/log_utils.h index d01b3aae..39acece7 100644 --- a/dorado/utils/log_utils.h +++ b/dorado/utils/log_utils.h @@ -5,6 +5,11 @@ namespace dorado::utils { // Initialises the default logger to point to stderr. void InitLogging(); -void SetDebugLogging(); +enum DebugLogLevel { + DEBUG = 0, + TRACE, +}; + +void SetDebugLogging(DebugLogLevel level = DEBUG); } // namespace dorado::utils From 07f59d0924ab4e91c5e4e223e96ccc87341591ec Mon Sep 17 00:00:00 2001 From: Joyjit Daw Date: Wed, 25 Oct 2023 18:07:48 -0400 Subject: [PATCH 10/13] update heuristics and cleanup --- dorado/read_pipeline/PolyACalculator.cpp | 4 ++-- dorado/read_pipeline/ScalerNode.cpp | 26 +++++++++++------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/dorado/read_pipeline/PolyACalculator.cpp b/dorado/read_pipeline/PolyACalculator.cpp index 4e19857a..c3ffb6cf 100644 --- a/dorado/read_pipeline/PolyACalculator.cpp +++ b/dorado/read_pipeline/PolyACalculator.cpp @@ -312,7 +312,7 @@ void PolyACalculator::worker_thread() { // Update debug stats. total_tail_lengths_called += num_bases; ++num_called; - if (spdlog::get_level() == spdlog::level::debug) { + if (spdlog::get_level() <= spdlog::level::debug) { std::lock_guard lock(m_mutex); tail_length_counts[num_bases]++; } @@ -359,7 +359,7 @@ void PolyACalculator::terminate_impl() { // Visualize a distribution of the tail lengths called. static bool done = false; - if (!done && spdlog::get_level() == spdlog::level::debug) { + if (!done && (spdlog::get_level() <= spdlog::level::debug)) { int max_val = -1; for (auto [k, v] : tail_length_counts) { max_val = std::max(v, max_val); diff --git a/dorado/read_pipeline/ScalerNode.cpp b/dorado/read_pipeline/ScalerNode.cpp index 9905a382..d7a80320 100644 --- a/dorado/read_pipeline/ScalerNode.cpp +++ b/dorado/read_pipeline/ScalerNode.cpp @@ -45,29 +45,27 @@ std::pair ScalerNode::med_mad(const torch::Tensor& x) { int determine_rna_adapter_pos(const dorado::SimplexRead& read, dorado::SampleType model_type) { assert(read.read_common.raw_data.dtype() == torch::kInt16); static const std::unordered_map kOffsetMap = { - {dorado::SampleType::RNA002, 5000}, {dorado::SampleType::RNA004, 1000}}; - static const std::unordered_map kMaxSignalPosMap = { - {dorado::SampleType::RNA002, 15000}, {dorado::SampleType::RNA004, 5000}}; + {dorado::SampleType::RNA002, 4000}, {dorado::SampleType::RNA004, 1000}}; static const std::unordered_map kAdapterCutoff = { - {dorado::SampleType::RNA002, 600}, {dorado::SampleType::RNA004, 700}}; + {dorado::SampleType::RNA002, 550}, {dorado::SampleType::RNA004, 700}}; const int kWindowSize = 250; const int kStride = 50; const int16_t kMedianDiff = 125; const int kOffset = kOffsetMap.at(model_type); - const int kMaxSignalPos = kMaxSignalPosMap.at(model_type); const int16_t kMinMedianForRNASignal = kAdapterCutoff.at(model_type); - int bp = 0; int signal_len = read.read_common.get_raw_data_samples(); const int16_t* signal = static_cast(read.read_common.raw_data.data_ptr()); // Check the median value change over 5 windows. std::array medians = {0, 0, 0, 0, 0}; int median_pos = 0; - for (int i = kOffset; i < std::min(std::max(signal_len / 2, kMaxSignalPos), signal_len); - i += kStride) { + int break_point = 0; + const int signal_start = kOffsetMap.at(model_type); + const int signal_end = static_cast(3 * signal_len / 4); + for (int i = signal_start; i < signal_end; i += kStride) { auto slice = torch::from_blob(const_cast(&signal[i]), {static_cast(std::min(kWindowSize, signal_len - i))}, torch::TensorOptions().dtype(torch::kInt16)); @@ -76,15 +74,15 @@ int determine_rna_adapter_pos(const dorado::SimplexRead& read, dorado::SampleTyp auto minmax = std::minmax_element(medians.begin(), medians.end()); int16_t min_median = *minmax.first; int16_t max_median = *minmax.second; - if (i > (kOffset + medians.size())) { + if (median_pos > medians.size()) { if ((max_median > kMinMedianForRNASignal) && (max_median - min_median > kMedianDiff)) { - bp = i; + break_point = i; break; } } } - return bp; + return break_point; } void ScalerNode::worker_thread() { @@ -110,9 +108,9 @@ void ScalerNode::worker_thread() { } assert(read->read_common.raw_data.dtype() == torch::kInt16); - auto [shift, scale] = m_scaling_params.quantile_scaling - ? normalisation(read->read_common.raw_data) - : med_mad(read->read_common.raw_data); + const auto [shift, scale] = m_scaling_params.quantile_scaling + ? normalisation(read->read_common.raw_data) + : med_mad(read->read_common.raw_data); read->read_common.scaling_method = m_scaling_params.quantile_scaling ? "quantile" : "med_mad"; From eccf952ca8d8f5c52416fb658c5a385d4eeee116 Mon Sep 17 00:00:00 2001 From: Joyjit Daw Date: Fri, 27 Oct 2023 07:59:13 -0400 Subject: [PATCH 11/13] fix enum for logging trace fix enum so we are able to log debug messages only. remove default arguments. --- dorado/cli/basecaller.cpp | 1 - dorado/cli/download.cpp | 12 +++++++++--- dorado/cli/summary.cpp | 10 ++++++++-- dorado/utils/log_utils.cpp | 2 +- dorado/utils/log_utils.h | 6 +++--- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/dorado/cli/basecaller.cpp b/dorado/cli/basecaller.cpp index 8dbffed0..b294f92a 100644 --- a/dorado/cli/basecaller.cpp +++ b/dorado/cli/basecaller.cpp @@ -266,7 +266,6 @@ int basecaller(int argc, char* argv[]) { .nargs(0) .action([&](const auto&) { ++verbosity; }) .append(); - ; parser.visible.add_argument("-x", "--device") .help("device string in format \"cuda:0,...,N\", \"cuda:all\", \"metal\", \"cpu\" " diff --git a/dorado/cli/download.cpp b/dorado/cli/download.cpp index 76464819..70065083 100644 --- a/dorado/cli/download.cpp +++ b/dorado/cli/download.cpp @@ -47,8 +47,6 @@ int download(int argc, char* argv[]) { argparse::ArgumentParser parser("dorado", DORADO_VERSION, argparse::default_arguments::help); - parser.add_argument("-v", "--verbose").default_value(false).implicit_value(true); - parser.add_argument("--model").default_value(std::string("all")).help("the model to download"); parser.add_argument("--directory") @@ -62,6 +60,14 @@ int download(int argc, char* argv[]) { .default_value(false) .implicit_value(true); + int verbosity = 0; + parser.add_argument("-v", "--verbose") + .default_value(false) + .implicit_value(true) + .nargs(0) + .action([&](const auto&) { ++verbosity; }) + .append(); + try { parser.parse_args(argc, argv); } catch (const std::exception& e) { @@ -72,7 +78,7 @@ int download(int argc, char* argv[]) { } if (parser.get("--verbose")) { - utils::SetDebugLogging(); + utils::SetDebugLogging(static_cast(verbosity)); } auto list = parser.get("--list"); diff --git a/dorado/cli/summary.cpp b/dorado/cli/summary.cpp index 99816b3c..38c4d317 100644 --- a/dorado/cli/summary.cpp +++ b/dorado/cli/summary.cpp @@ -50,7 +50,13 @@ int summary(int argc, char *argv[]) { argparse::ArgumentParser parser("dorado", DORADO_VERSION, argparse::default_arguments::help); parser.add_argument("reads").help("SAM/BAM file produced by dorado basecaller."); parser.add_argument("-s", "--separator").default_value(std::string("\t")); - parser.add_argument("-v", "--verbose").default_value(false).implicit_value(true); + int verbosity = 0; + parser.add_argument("-v", "--verbose") + .default_value(false) + .implicit_value(true) + .nargs(0) + .action([&](const auto &) { ++verbosity; }) + .append(); try { parser.parse_args(argc, argv); @@ -62,7 +68,7 @@ int summary(int argc, char *argv[]) { } if (parser.get("--verbose")) { - utils::SetDebugLogging(); + utils::SetDebugLogging(static_cast(verbosity)); } std::vector header = { diff --git a/dorado/utils/log_utils.cpp b/dorado/utils/log_utils.cpp index 04c775fe..363c3444 100644 --- a/dorado/utils/log_utils.cpp +++ b/dorado/utils/log_utils.cpp @@ -77,7 +77,7 @@ void SetDebugLogging(DebugLogLevel level) { if (is_safe_to_log()) { if (level >= TRACE) { spdlog::set_level(spdlog::level::trace); - } else if (level == DEBUG) { + } else if (level <= DEBUG) { spdlog::set_level(spdlog::level::debug); } } diff --git a/dorado/utils/log_utils.h b/dorado/utils/log_utils.h index 39acece7..845b94e9 100644 --- a/dorado/utils/log_utils.h +++ b/dorado/utils/log_utils.h @@ -6,10 +6,10 @@ namespace dorado::utils { void InitLogging(); enum DebugLogLevel { - DEBUG = 0, - TRACE, + DEBUG = 1, + TRACE = 2, }; -void SetDebugLogging(DebugLogLevel level = DEBUG); +void SetDebugLogging(DebugLogLevel level); } // namespace dorado::utils From 6f35a85fd6eb05710e2f896d722b0faee9c98b97 Mon Sep 17 00:00:00 2001 From: Joyjit Daw Date: Fri, 27 Oct 2023 08:10:03 -0400 Subject: [PATCH 12/13] removed stray semicolon --- dorado/cli/aligner.cpp | 2 +- dorado/cli/demux.cpp | 1 - dorado/cli/duplex.cpp | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/dorado/cli/aligner.cpp b/dorado/cli/aligner.cpp index 2f113597..722b1dce 100644 --- a/dorado/cli/aligner.cpp +++ b/dorado/cli/aligner.cpp @@ -60,7 +60,7 @@ int aligner(int argc, char* argv[]) { .nargs(0) .action([&](const auto&) { ++verbosity; }) .append(); - ; + cli::add_minimap2_arguments(parser, Aligner::dflt_options); try { diff --git a/dorado/cli/demux.cpp b/dorado/cli/demux.cpp index 928daeb4..e0f90658 100644 --- a/dorado/cli/demux.cpp +++ b/dorado/cli/demux.cpp @@ -76,7 +76,6 @@ int demuxer(int argc, char* argv[]) { .nargs(0) .action([&](const auto&) { ++verbosity; }) .append(); - ; parser.add_argument("--emit-fastq") .help("Output in fastq format. Default is BAM.") .default_value(false) diff --git a/dorado/cli/duplex.cpp b/dorado/cli/duplex.cpp index 45e2a78a..1ffadcfa 100644 --- a/dorado/cli/duplex.cpp +++ b/dorado/cli/duplex.cpp @@ -116,7 +116,6 @@ int duplex(int argc, char* argv[]) { .nargs(0) .action([&](const auto&) { ++verbosity; }) .append(); - ; cli::add_minimap2_arguments(parser, Aligner::dflt_options); cli::add_internal_arguments(parser); From 820c2234737c9a1b26fee845f74c5aa831eaa854 Mon Sep 17 00:00:00 2001 From: Joyjit Daw Date: Fri, 27 Oct 2023 09:33:04 -0400 Subject: [PATCH 13/13] address review comments --- dorado/cli/aligner.cpp | 2 +- dorado/cli/basecaller.cpp | 2 +- dorado/cli/demux.cpp | 2 +- dorado/cli/download.cpp | 2 +- dorado/cli/duplex.cpp | 2 +- dorado/cli/summary.cpp | 2 +- dorado/read_pipeline/ScalerNode.cpp | 14 ++++++++------ dorado/utils/log_utils.cpp | 6 +++--- dorado/utils/log_utils.h | 4 ++-- 9 files changed, 19 insertions(+), 17 deletions(-) diff --git a/dorado/cli/aligner.cpp b/dorado/cli/aligner.cpp index 722b1dce..35999ffd 100644 --- a/dorado/cli/aligner.cpp +++ b/dorado/cli/aligner.cpp @@ -74,7 +74,7 @@ int aligner(int argc, char* argv[]) { if (parser.visible.get("--verbose")) { mm_verbose = 3; - utils::SetDebugLogging(static_cast(verbosity)); + utils::SetVerboseLogging(static_cast(verbosity)); } auto index(parser.visible.get("index")); diff --git a/dorado/cli/basecaller.cpp b/dorado/cli/basecaller.cpp index b294f92a..18e167a5 100644 --- a/dorado/cli/basecaller.cpp +++ b/dorado/cli/basecaller.cpp @@ -390,7 +390,7 @@ int basecaller(int argc, char* argv[]) { std::vector args(argv, argv + argc); if (parser.visible.get("--verbose")) { - utils::SetDebugLogging(static_cast(verbosity)); + utils::SetVerboseLogging(static_cast(verbosity)); } auto model = parser.visible.get("model"); diff --git a/dorado/cli/demux.cpp b/dorado/cli/demux.cpp index e0f90658..a6df5ad0 100644 --- a/dorado/cli/demux.cpp +++ b/dorado/cli/demux.cpp @@ -105,7 +105,7 @@ int demuxer(int argc, char* argv[]) { } if (parser.get("--verbose")) { - utils::SetDebugLogging(static_cast(verbosity)); + utils::SetVerboseLogging(static_cast(verbosity)); } auto reads(parser.get>("reads")); diff --git a/dorado/cli/download.cpp b/dorado/cli/download.cpp index 70065083..4d1aa8db 100644 --- a/dorado/cli/download.cpp +++ b/dorado/cli/download.cpp @@ -78,7 +78,7 @@ int download(int argc, char* argv[]) { } if (parser.get("--verbose")) { - utils::SetDebugLogging(static_cast(verbosity)); + utils::SetVerboseLogging(static_cast(verbosity)); } auto list = parser.get("--list"); diff --git a/dorado/cli/duplex.cpp b/dorado/cli/duplex.cpp index 1ffadcfa..e181745c 100644 --- a/dorado/cli/duplex.cpp +++ b/dorado/cli/duplex.cpp @@ -138,7 +138,7 @@ int duplex(int argc, char* argv[]) { const bool basespace_duplex = (model.compare("basespace") == 0); std::vector args(argv, argv + argc); if (parser.visible.get("--verbose")) { - utils::SetDebugLogging(static_cast(verbosity)); + utils::SetVerboseLogging(static_cast(verbosity)); } std::map template_complement_map; auto read_list = utils::load_read_list(parser.visible.get("--read-ids")); diff --git a/dorado/cli/summary.cpp b/dorado/cli/summary.cpp index 38c4d317..8da957fb 100644 --- a/dorado/cli/summary.cpp +++ b/dorado/cli/summary.cpp @@ -68,7 +68,7 @@ int summary(int argc, char *argv[]) { } if (parser.get("--verbose")) { - utils::SetDebugLogging(static_cast(verbosity)); + utils::SetVerboseLogging(static_cast(verbosity)); } std::vector header = { diff --git a/dorado/read_pipeline/ScalerNode.cpp b/dorado/read_pipeline/ScalerNode.cpp index d7a80320..6f6d0ce3 100644 --- a/dorado/read_pipeline/ScalerNode.cpp +++ b/dorado/read_pipeline/ScalerNode.cpp @@ -6,10 +6,13 @@ #include #include +#include +#include #include +#include #include -#define EPS 1e-9f +static constexpr float EPS = 1e-9f; using namespace std::chrono_literals; using Slice = torch::indexing::Slice; @@ -74,11 +77,10 @@ int determine_rna_adapter_pos(const dorado::SimplexRead& read, dorado::SampleTyp auto minmax = std::minmax_element(medians.begin(), medians.end()); int16_t min_median = *minmax.first; int16_t max_median = *minmax.second; - if (median_pos > medians.size()) { - if ((max_median > kMinMedianForRNASignal) && (max_median - min_median > kMedianDiff)) { - break_point = i; - break; - } + if ((median_pos > medians.size()) && (max_median > kMinMedianForRNASignal) && + (max_median - min_median > kMedianDiff)) { + break_point = i; + break; } } diff --git a/dorado/utils/log_utils.cpp b/dorado/utils/log_utils.cpp index 363c3444..ba22abeb 100644 --- a/dorado/utils/log_utils.cpp +++ b/dorado/utils/log_utils.cpp @@ -73,11 +73,11 @@ void InitLogging() { } } -void SetDebugLogging(DebugLogLevel level) { +void SetVerboseLogging(VerboseLogLevel level) { if (is_safe_to_log()) { - if (level >= TRACE) { + if (level >= VerboseLogLevel::TRACE) { spdlog::set_level(spdlog::level::trace); - } else if (level <= DEBUG) { + } else if (level <= VerboseLogLevel::DEBUG) { spdlog::set_level(spdlog::level::debug); } } diff --git a/dorado/utils/log_utils.h b/dorado/utils/log_utils.h index 845b94e9..910fb273 100644 --- a/dorado/utils/log_utils.h +++ b/dorado/utils/log_utils.h @@ -5,11 +5,11 @@ namespace dorado::utils { // Initialises the default logger to point to stderr. void InitLogging(); -enum DebugLogLevel { +enum class VerboseLogLevel { DEBUG = 1, TRACE = 2, }; -void SetDebugLogging(DebugLogLevel level); +void SetVerboseLogging(VerboseLogLevel level); } // namespace dorado::utils