From 20ab475034f8e600ef924ea05d781347ed430ef7 Mon Sep 17 00:00:00 2001 From: Tyler Hallada Date: Thu, 20 Dec 2018 00:21:04 -0500 Subject: [PATCH] Day 5 part 1 --- Cargo.lock | 1 + Cargo.toml | 1 + inputs/5.txt | 1 + inputs/5_test.txt | 1 + src/day5.rs | 70 +++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 6 ++++ 6 files changed, 80 insertions(+) create mode 100644 inputs/5.txt create mode 100644 inputs/5_test.txt create mode 100644 src/day5.rs diff --git a/Cargo.lock b/Cargo.lock index dbd79ef..c104040 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,6 +3,7 @@ name = "advent-of-code-2018" version = "0.1.0" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/Cargo.toml b/Cargo.toml index 93114f3..49731c3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,4 +6,5 @@ edition = "2018" [dependencies] chrono = "0.4" +lazy_static = "1.2.0" regex = "1" diff --git a/inputs/5.txt b/inputs/5.txt new file mode 100644 index 0000000..1729efe --- /dev/null +++ b/inputs/5.txt @@ -0,0 +1 @@ +JBrkXxxXaEeAaIoOHhilLALlKQqpPBoOxXkKRdtTzZDhHdDrbmLlMyMmJDSsdjYEAaoOpPsSRrcCZzIiViIvNnhpPoOHaAvVPzZpWwZxXyYzvVmhrRcCpPembBnNfFwfFWhHjJMfFEHeEzZMfFeRBiIbfFzZKGgkvVubBIitTQqULVLlvqQIilZzFfUuwQqaAWqZzQSJoOjsxXWwWbBvGcCgsJjXxSVwMsYySVvYIitTwWWwPpyZzhHmfFIslVvLrsSMmRKkSibKkQxpRrUucCPtTXqxKkXSshHRoOzDdZrsSjJHfFhreERDqDdQtTdHhvkKrRVXmMxHaAGgXoIzZiDCcsSQqxXFfdOlWwLwSsWaAsSYLlFfyeESsxErRyYehAzZlLaRrMmIuUnZgGiINnvVWwzAaNeBbRLlZzrEVvymMkKYoOirRQqULlwjJrRhHRsSrQqEIJjwbBWgGlLiNnemiIRrdDdDMSiIfFUusNneVVvSsvtTExhOoGgHReEwWrNnGgPptTXjrRsSJWobBDdOEeXxnEaABbeNcLleECOzZoRcCWwTJjtkKrFbByYfjJyWwyXLlAaPuUpxYyYYYKkyGONnogdDhHBVvWAawXxkRrKbERYyreEeSsyYhHzZvsSeEVjKkaHbBTttThOQqomMNnNntHhrRTAiqQNtIkKiTnIZzFRkKroOiIfNnWwyOoYUzlcCLZuUrRuBbJmMjVvGDdgRrJEeBbugGjgGcuUCOocCEeJZisSIzgGoTiIOcCrRotCcMVviIiIbBGYysSgYVvyyrRZzAbBalLYTtNLbBlnTtOFWtJjnNTwSstHhTRrfTIgGitoFfXxmMfFqQOMmoqQhiIHmMKtTrLlRQqOotTsSGgkWwkKrJjRCcmMFfcCBjJLkxXKgGlLlbZDdiIziIiILloOPprRQqDYcCbBAaypPRhHrXxAMmadLliFfIWEewlLOgyYGouUuUkKjRIirJoOPpnNgZzNMpPmnDdDdGzwWTiIttMmTLlEeZUXxWwYyuewYyWvVuUwfFLlWKYykVvCsfFScjGgJLlIidDXkEeKxjVvJWwYBUuHhbdpPDLPplTnNEkKensBbSdDHhCcGgWwgGkKNCcmMXnNjJxOohHtKknNfDdNnFzBbUunvVNZbBpPyiUuoOIVvMNnzZeEbJjBzeEZfFCOovVcmrvVHhRcCsSihHDjJdIrRrWwAaREzZJjyYpFfQqXnNxlLsSgMmGLlBbBblLPMmMeEsSmwlRbPZzpBXCfgGFyFuUfrRGUucCgbBWwUuJjHZJjzpPNnhEemMRrXxoTQzFfZUuqQqFgGaAftOoPAjJaZzJBPpbjTteXxECiDdIclLTkKfFhHcCdDhHrRqQxXXxBJjbPaAOcCoJjpwVvxXDdjJVvUuWaAVvkUuqQKRrmPpLTtlmUuMvVBbSsExXZzcCeBCctThHNzZnaAVVkKYyvxXvhHMmDdCcXxbsSBbxANnaXAaCBbMaAfFuUmhtTHRcdJjmMDrRCrcjqQJjJhHrdDRGJjKkgzZbBXEiITteDdIifFeEKdyYDkLqJNnjQlLlAamoOMEeLlIiIZzIiiuTSsMmdDxXoOgGtmaDdAMEenNsjJoOSmjJxXMBbrdjJjotTSssSMmOsSzZtTMtKkJjhHkKSsgGHhvVTmirRRrrRixXIHhMhqhHQHJfRrFjVvEeffFzcCyYhHzZpGRnqQNrrlLdNfUuFnbBXxXxvVwWxXMmXfFxiyYIQMmRrvVnyYCcNqRqQrDRuoOUGgjJxMmXIiqfSsgGFjnNjJGxXgpOoPPpUuJVvqQZMmVvEJjeziLllmwWMaALhHMmxXFfdUuHsShtTaLlAujUuJeoOeEveEVEgGlLyYmtsSaAQqdDjJTLlFfbBRunNdNnTtBbDUxXtTrxXmMMPshHSpfFnFTtzZoOtZzTthfFOvVorRHKkZzdDEfFeoOgGWtTwnNTKuUSsApPYycCRrGAaWwLlguUtdDSsTsHiIpPiIpPJjBjJCclLSsbCchzZqbaABiIePBbtxXOoTBbmMLlpAaEsUuSEKIrRiArMUutYaAyFfTmRmMaqVtjJTvNnrLlZzRqQrRBMmRrbdESseVvDuUdGgDdNnaXxAMmBFfzKarRvxXGfgsSDdhHsbBHhpPOGgoSfvVDjoOJdFsMmqQnNGgLlLlLbBlrZVTjJtvzuHhUKOokRBbSWDdIiYywspPdDCmwWMHsnWwNSwfFWCcwWdDbjJLlBhHWwZJbBjHhzZYytwWTxXzoOVvGgxXCokKOciSsIeyYKkxIiXEMBTtbmRrTtMmALlSsahfFcwWcxXBMcCvGOIioLlmMgVxXEeIivVmMXfFFUVvufrRIiyYWwHhUuzZzZYyxiWrROokKJLlvVZdDzHDMmHtFfTsWwLlShIiKTtkdbBoOtTPpPfFwWDdRrpCczQqXxZkUuKhvtTZaAzQqlLZzNVvUuUuntTlLOoUTnNIilLttOoTylLNrRnTDDdRrdQLBbliIwWqQvVqQsSqsZnNzZzxAaXwUuWSGBRPprbMmLlbHhmQqxXtTamMZzLoOlnbBNVveXxELXxpPuUlYyyVvbBWwxpPgGXEctMWwaAmAdDaCcTonNOCTCcZYycpPwHhsSrRWfmxXMSQaAqsdDMvVoOHhEeflLOoEFdDMaAQqFfIqQiJjdDpMmkmMMHhmUuccCCKXxPvVDddmrAaRzZZzMEMGgmlLDMSsmshHCcSzZdkKzZnNgGzZeZVvzLlrsSRHxXKkdShHhGwWfEIieFgKkWwHhBbmMHaABoOaAflrRTsStLjJXxXxNiInEPpeyYYMmyvFfVyYdOYyUfFuGvVAnNaQGsSgiISbBsqKkGwtjpPJTSsWUxXugAaTtuUvvVSsVjWkDSscCdQoSstjJTEekKOUTSZvNSsRrRrAakKQqyYinNIMcCmnjMmrmMmtTMOHhLlBLlLlcCeEEmMGgXxBhwWCcvInlHuUhLlwroUuOCcGdDgLlqQUPoTQZzqTLMEWwaUuAelLeEvVWHDdhwmkKPpWeEwlXxbBYLlykKoYyOPpMmuWwULLWluULiIXxaGgAwlcClWJjPiIVzZsSKkvyAaYpzdQqIieEfsSFMteEcCJjTuAacCUzxXuUJKkRrjvVwWkKZKjmMCcvVLlJkURsOoSrFfuFfHkKXxHhVgGvUgmMMnDdvXxFfVTtmCcvVMNzKkZmCcwiIQRcCrqCcQqgGWwWjqQDdBblCckKLYyGgCfXxVvoOFdDBbuVvJjUdxXDGlLwWzZVWwvgcVLbBsCcoOSlEevKkYuUPpeEhFbBfTtHRjJrgQqGruIiPpnNUIaJjASskKmMVURUSwWsutUuyYEhjJHoDdXxUuOeLldDGJjAOxXLlotZzTHOoiIhUfUunxXrRznajWwJPKkpHhoOiIBbAbBVvsSajJAUuFfYyxXdCUucBbLCcmMlUxXuqAGgNnaAaQZjJPpkKAazSsDNvVZMtTpPmKEekOoiwbBWgGVvIYyFUuYxXyJjBnNbxLlXpPaAJNnjfsSKiIlVJjMVvmrRrRiKkIWwcCTtrEadDqQAeQqNnSsxXWwRfhHSsKknNRrWwSdbiDdNhHnbBImLlcCMQqtTbBXxhJjHmMLbBlUuijJIwWpUuqQPBFfOohHDdPpxXDzZiKfFkEGgeFfPpISSssDdcCUOoanVvBbNqQIiogUuUaAuFfJkSsjMmJKjTtGDtyYTYyBZdDPKkpKkaAbBkOvVonNKcpAaPCryfFYhHYyOyYCczZoSsXxvqnNRruUzZbBVxxoOXvVXlZzqFDdmmMMhMmHKkRrrRWwVlLNnsmMhHPKkaevVMmDdErRxXrRYyyYIadDMmAipCcROorDaLlAGgdsMmiISogGOTNntDdsHyiIYojJkeEvmMJmMvVEHhZzeKNnxPYsQqpPyZzYLlSklAaKAQUuqaKbBHkKhRkOoTqQrzZPKkKkvZzVDpptPpsSaAEGcCfFRrgNnExbBQOoqXcoOiIxvVXWwoYyzBbcCzZZOCeuDdUpPpOobLlBPOoaAlbBxXYyMJjmqQYKJjxXlLRfpdDDdPbBGDdgkKEeNSsncMmCCIicWwFjJrCcjYyOoAdDaaIiTiItAzZdDhHtGDdgvVgGoOgObYyBmykuOorzZuCcPpUfFdDKqQgGsSIRtTqQzAaXGgcCYyHhqSsOoDdJjkCciqvVQmMIvVxTtdDLYBbykLlqKkHeEHhhQQZDdzqGgKNnJjlCclLEbcCLdsSDlrRVvBeXxGgNnDXxgGdieEhHIJjtTsTtGgRUuQqDmMdGHhoOwtgGNnTBbkKtTqLlVjcCJMmUuRrSsDBbiOoIdLBPpbxXbBIiuUOqQDdRiGghigGFoOfIFfXjTtTyiLlIYfFPlLAaBXxbXxdBbDdvVrUuRDewWELMbBGgmlyfFOotTKlLFfkpPYEeiIptJjIiZzHhtTVvKkZzZzlAmMZGUugzZpCmMVvcPsSzkRrYyhHlXxLAQqPpDdaKavpzZPSoOSsoOspPJqzLmGgMJjWwIQqzjzynUIiukeEVvKNtTYIiVyYFfEeBeDaAocCkKOoOlyGgcCYeEpfFENnMmWwHhYkKBbcCyemSwIiWshcCbHPYVuKkUvSsbDffFFxtTTsSpPTtKqQkKkLlwWBIdDiFfROorPpoFfOfFlHpPhoIivVONYySsnXxXxHONnNnrZzfFRrRUujSsJzZsFxXftTSogGVvOEeEUuDvTtVlbBUuLOyYDTtIiKUuFfYtHIEeihTkKRUuYybQwWqwWBcCxXaAxXvVdLlJxXgGjEePpFaAqXxQlLOoOCfFcaAGghHfFMXIZziCOozyYZQoOAIiIAJjaUyYumUuZCcMmZzRZcCzaAqQrfFWwyGgKkDDddbHklLtTDdKrbZziwRrjJoMmOWfUMmNnpPHhuLlUueEaAFgXxGrRzZdnNUNDdncCXxMbzZBmBbuFfwutwWdoOFrGgVvRrRBbJjkKEeRsSMmgmMGYpPQqSkKsgGylKkZzLTvHwWhzFfSDdlLvVOoFSsLlBbfjJjJJRntTOonoOpPoOUwWunNYyMuSYcCaAyiIvVsTlLdDFfJzCcZJjxiIsoOwWSsSXZzYpPHhyjhHCcuegUukKPpGisIiSOooOpPoYyxXOgGIXnAtTaAasSNxhUsSBphHJRrRLdDlrSgGOogGDdsFzZiCccCqQRrHBbhxrHhpbBbBGSsLlKkgLllMmLuAaUmoeEObBMmOoQqlLcyyxXYUAahvpPLlFfVkxxXsSDdMIiHJGgHNEehDdlTVQqvxXFfxQqZzXDdFLlcCfCmsSiUuWPpwOvVotTdBzZblLnNDdCcnIiDdNooOPpIiODNnQqcCmkKvVmNnMdkKEepsSPkKUuDZzpPqQbrgGRBoOYyJjLleOoEgGyhHTipPpPvVIJjzZbHTthBcWwvnuIiuOoUUPFDdfRiIXxgbIiBGilLeVptTPvEDdbBRrijXxJIujJHhUJjJJhHOmMEDdeeQqLlEPuUlLyYTtDdVvvMmdMmBbDtTeVLyxXjGVaAvgFfJuulLUqHhQUYEsPHnNyYbBhyYiIdDbBpQqAaLyYltJjqQEuUuUlQrRfPpFiIIeEiZwWzxfxlLsvViNnhHADFGgfdKVvksSavfFVvVtTCMHhmYyMmVtTvFfxKpPYiIyVvmoOMUrRumMJjcoxXGgYymMODdQRqQrkdDKNnqCkhHFjJHhVhsSHQTOpPoDdKBbkYCcypFUcCgYygGoyNhHnEeQqnJjPpVeSsMmEiIvqREeyZzBnkJGgjgqKkJjQrRGuiAFftccCCCclLPcCffFZzFTSstYyRrNQgGUPgGEdDSzZkhdBbOomMZJjWwwWIiuUAaziIBbZkKOAhHaouUtjJFtTmMDxXfFdHhKkfxXTpbBRrLaARrfMmfFxXFhMmrRbjJoOUmMCggGGvVsSuUHhcTbBtmfFMJjxuUHhRaARTteBfFeMmNbByCcsSZqQzeZzyIiUyYuSsYWwEdDWEewVCcDbBpPdNnJzZubtTLlXxDdoOBqwWHhPpQfiIFOoykXxzKkKkZnPpNVvlcZzCCcAEYaArRyJFEbBTteFsQqLlgnLfFkKujLlqQnNQqxXxcKBbkjemMEdXxDjJJEeOoMmSsLlZWwczZcCCxXzqGgsEEeeMmSQsSbYkKygcamfmMaOoyYxtTnNMmBxXnPpNsSkKkKIisSqQLlMBmMsShcCnNHbmhtPgGnXbZzeEEPpepPfUufklLKHhfFcIiCipPIFbiIBGYyWjJwqtTQEeqQjJgCLsSlaqQqQyYOovVYwiCcBbIGdDgfwWFWzZNhHnoVvOVWwXUuxKkyYbBGwWsSWwgGBbdDgAPwotTLQSIisbBgYyuyQgGSsnGgNMKLUQqueonNOEChHcMmxvszZUZzwWkKwHhUuSsbBMHgSMmpPmMMvVmcdDpPXxqIidDQPwWPpbVvBwrRWpDlLMkKdDmaAdDdMmCiIvVWwOWBMmbfTlSsLtTtsnbBbBNSlLFfmjORrQqiIiPSUuBvVjJElLeqKiIkwWfoSsHXUuxzZQwWxXqXgGxGsFfdGApPkTOotwWhYyoOUuLgGlZzTWwQqMCtToOcwEehaAphHSsuUxXQqPHGsyZpMmuUPaAzYdkRpEePyYubqQVvBULlNnWwtHhQqEnUuNxXiIGGgHtTQpOosSwEfFvVeWObBodDqQONwWrREenRrYBlLijJIbLlUGCiwWIzZcgyfqQFWwrXxRlLIisSdDrTFaAftFbIQqiMJjYhHycCaSsLljOoJAmBsQqqQzSsZyYNnAaypeEPnNSeUuZjzFmwWgGMkwkcCQFfqlgGTyTtsSeqQELGgtTQqVvmcCheJjIiEHXxKzZkvLNngWwGJrCWwNHvVhardDRvVIizZdoOlMmLDMmJyYjgnGgDdAqQsLTtlvHhVWwSpDzZqQlFfLnNdYyPuUmMSbBslpwHhWPhRrHPpnYYEeDPAaWweElgGLOnNuVvtTjnWGgwYAeEajdyYPpxVvmMXIikKmMVupPUeEvoOwLlFfpnNqvVlLLnNlQOoPVYHvCnNcPpnyYQDHhOBSgGfFsbUuorRxXcyYHhCieXxsSvjCcJPPnNSsZzMmhHLJdDjvKYykVcCEVveMmXDpPdzZeaAEZYpPNnyHZzzZvTAaWRrwmJGgKWDdwkKSskLltTKkjtpPTsSQhHqQyYVsKkSPOoVaAvGgfXxvVvuHBbUDdcCqvVGgKkqrRsSQcCeXxEXxCcQgGmDWwdbBEeEeeEMcCwWeEnNVQqvUYykKwWhHCchWwXxJjXfFxXAaFnUuvVtdDdDUuHPphItJjMmTEJjeifFEMmcCgyYynNyYDrRCcDdgGdYOooOsBbSwWDdciIClLbroORGgsSvVYydDROorVQqfFYyYFkAAaavjZzuUkyvVYhHKGZzcxXCgJxXsgGqQHhIWwJjtTVaAvGgYyiSxruGNnpmAaMLlLlegGESAIzoKkORrZigBOobVvlLPZLsSKzZkuBRMxwNTtnWUunpPPpQqaANEeXOgGvnNHhKxIxXJjpJjMmUfFuPqWYmMyOOoonNwwFzZflLWHhvVnIiNQMmivJGgTEPpvVJjUlLuQrHhXxRqyUdDNnSswWUAaODdgGwWwWtTlYynNLfFgGEefBbJHTtrRwWhHLlbBbpPBuUuAObBoyYaoOygGQFqQfzgGZgfFGvVqCqzZtnNTDdQwHrwSsWmAaVvMRrFfRDjMCcuUFmMfmCceoTYMmiUOoaADdlyPpmMfFZQqWwbBzYTjJKSvBlLbVIikmMKiqQcCpPvjgWwzsSZaAaAMRlvVmMPpLLlQqyYuUmMpPNuQqUoOkGvADdXXxxtTaGgGSsRYykKEeoAaBbBbiIZwWgGzRrGBbgDddYgGyUuejJeHnNCcMmuzaAqUuQjpPkBeEbKkKFfzjSsscCxAaXWvVRrOovVmMwsseESTtpPpPyUdDuUKgGaAKkQeEEeqmLlDJUFfHFfDkKPprZzVvVvRwWHAYyafFhSsdDnAahdAacUugGhHCDkKfFIiNCcnZXxsJKkMBbPspjJjJOsSJjfFLihHzBdwWDFfeEvVVvpVvNXxGgnKkwWOWwoOoWrRZzZfFVjFfJjdDSszoCcUgoOGXxAGEeEgcFfZiIcCzCLlMmZzMMmeEEeYytTNzkKMmpPZfPPblLIiSslraARDdYjJLljjtTanSsNpPxrRxPpnNkKJjmeEENnGquejJEBboOUueIiByuUYDdbEKkwWgLdUdDaAAaWIdaVtSsVAavTHhgGVviIcCyDFfdCciIvVYSRhHHrRhrOzZoECcHhzHhgGiYUuRdDIOoJpnFfNPOoAahHgSiMTtmaVvooOMmZlLzgVaAvGqQEzKkZoOSslLCcjkJjUuKktTeElLSsNnLnNXMmHcChAaFfBvdDWRrwIIIiiIZzinlLNoOtDvfFZwWcMmypFKkfPiNQqobZBjJsitTQqRruxXYkKVvaAbxVXbBhWbBwHxUSsuPpvnNDdRrwQqWBbNnYRUOZohHOTCcCPpdDvVTxsSXtwgGqTUyYIVviMmukySlmMemwWNicDdCGkKkWCcwKtRrTJjzDHvVhGgqQLYuUyldEeDBnaAcCoPpONXTJLlXxjHRrhOoMvVXZzYyHhlEcDdGwWoHhDCcZKkzXxQSAXxakKjRpPrKkRrCcEtgwtTXxWRrXxmMKknzZNCjxXJyYgKkGcASsaOoitMmrROGgEfFeoOIdlLDccCNiInOoNWwFfKyaAYwnNOGgoWcBpxXQqQOoqxXlCcDSLDdnNlvvdDVltdSsDdDhhUuFSjBqQbMXKyXvVrOaCCcrULluCdIiTpPDdjJTuyPgGXEexjJyYgoOPpGVAayvVojJSmXdOJofaAAvaBiIqRXHhHmMhjkOIzZiJpOKkozxtTTkxXEtTsSSseohHOslLaAgWwGOfFkLlKonNnNrRrDdFmMqjFfHWyYUXxubBUuhCcEEeSskEeKOjLlJobrHJjhJcIiCDuCnNcUwsNnNkqQyOoctTbBCRaAcNntTgkKGEeatTmMSoOyXxYAxCccVvoOCWgKTtRstTNMmnorRGgOVvXxqQegVvGeEwEIiHzxxXacOoQyUuYSsqfuUwWLMmquDdxXGgINnRrLIbBiSsvVnhHAaWMBbmwpPVvNlLNVDddwWZLlORzZlbRrBjJqRxXvVpPNrCVgDvVTvVdDNnxUuaAWwRAzOoThHtiICcKjwWJTtXxkiIyWjJxXkronKNnDdGgxXfFKAFbNXxQTSgOIinNJdDcCrcCZTnrLzZlRNmHwWxXHhhnNeEXxFIiiLpPeElIfOoIiTtIiUuwWFIiBokbcfFCBEeSWwsxXbnyYDaAAxXadgDPpdGeKknNvlLeECuvVUcGTxyYOMqQYyFffFjYyEeffFbBnNeXCQVLlvqKkccFfCxAalLvrRFfVPpHlLhKgjTUunNnrRSsNzZUPfFncCQqWwNRrSCRrnNRrcaAsSIizzZSEesBbEsSjrRJJQLlwyYWRrqjaZzkjCZzwWpmJGLlgGgCiIAaaEoqwWKkfFCcKvVkgJjyzsSymMiFfIcCkEeKTtYtTCcoOZjDdqXbPuUpajinCXPhHkKpZceECzjensSSspldKkEeDLvUuYwWLlAUHYyhmMVvEeHwWyYhVvTHoGgcCOhmMOoIaYBbaAFjFfAaJfvRrbBLlmMfFLlkXxMOoEeXMUuUPpHTtTllPpBbxRrkksrVptxXHGghbGzZMmVIiPhNnHvkKkQYSsypfFzZMNncndDWHhoOHhaADxdDUPdSKkdyYDUxXMmuMhHHhojJOmMmFasAaSbTtBAfsBIYyxXYyiHheuURrVvErKuRrUkKpPrLlwJjoCNfFQqneCryYRGgcElzZtUqQuBbqeEQGgKkTvdDDdStTsRqQHhUuwwkKWZcCdDdofFOcCsSKBbMmMmkDrRndDKkNEeIMmBsyYFKkrVZzOovuUPPCcLRrQRkZzKovViyrZzRYEhvVHzuUWNnwZejJFXxfXKJwWKkxqQnAaNWfFOoOvVWaGgEbBePpyjJzSslLGIiHhgmMZuUsSbByYqnPZzpSsJCaAHDdhcqPpQmoQqWdRXxDoOppPKkPpcCPgGOCcroOmMLlRYyodFMmfdDUsSaAZzZzNEenvVCZztFYyWwhNnbHhBPAZuUVLvVlqQNnvzBfZzdDxNWAamMUotNnhEeZHndDNNnknipcFfCsyYPpZvVZBbIisTIitEADdHhYyNBbnFfNnaIijxXjwWJjJPpJpPeAFpGgYSNnsfnKokKOHELjJlXxLleEegKkGRaAKkKkrjhHbBYWxlLXabyYVJpTWwtSDRrdIKkiZzWHnqBbUuwWMmJjpMsBbcCxXxXjWwtbByYgGEhHOoeJjSrRwWsAOoajUjJjJfFsSqQukKvWwTVNiJxDXfFxbeSIPVvTxXITlLXxtLlapPgDMmdTtvVlgCcOOrNMmnGoCcQqOgRtTgGDdNnRrjJVbBvgGYyohbHPphBCcDzZZRsSgGrHUxXwWEevQqVzOoZpPUxXuVTrHhrRxXNRrnpPCkKsSpoFSsfOtTSsNDdnfFNWpbBOfFfHVvlLhFIiErRPNnQOmUuXxrRMSsgtcqdhHDdDpPDpPknGbXxBgNMAadDaTrgGKkDSsDCRrppPAarRPgGcJaCIovHNsSsSIzZWMcHhhHqJjQhHnqQBlLjJWDdzzZZmhHUDdunNSsyABDdbiInNxzZaWwSsfvVqLlGyAaGgmMEevVvxXfPpmMFVcCYCNwtTFBbiJeEROamMmhVCcqqQdLlLjFWGgTtwpPgGPDuVxDdABbVGbBZDDdHhzeEZprzZRcIiAaPFkKfuiIURaAoaADXxddOGgXpPeEJjxjzcsSCwtMmCckAgLlAaawVvWCcQAaqAdORrOoUuPporRDkKyYiImmMMsmMUuSGFOlLLWyEpqQPvxzZXPptnieUnNpxXPrpvVyRHqrRyYqQrRHjJhOoRaUuADdVvKvqZfFzQCcZzVkKJnvVPpDduDvVdnGgNGgXtTTogOoZMmMkejMmJhwWlxXSsNYyfnNBYNqoNRrmMmMzZvVPbBvVpelLeEEDdVgGQsSqvfxrRbGAaXIixnNBbRtzZczQoOERrewwWWqZNHhlyYtwxVvDdXSuUStTdDVvHhssjnNneEHhCzZcNmMBbdhHabOoBipxEeoJjzZZzOXakyFYyfAaZztTYKhHfFAyhHXKHhmcQipPaAIHhQRrOyYbBomwWJAGgaeZOoTteEysfFbGgsSOyGgYQOuUSsYiICcMmyQqyYaVqHOohpPQqkBwWsSKYykbpPqMmVviqQvVfTcCJjrvVRDdtcAaCTbBtJjUIitTWwFfGgIiLloZzIiIgIPpiGqQbWiFfeJfFmaAMpJjPLTMDdmsSewWEtiIBbhkOeEvlLsEJYyCmMUcCtTHheYypPqsSbBQEuTwWtFewvkrMmFfXxRPpqaAOALQqJiIOojupQNPepkDdKPTtRrVlLvVqqQpPrRQzZvaWCcwAZzVDdvUOrGfFpPPzIisdYyDLyYloKkTbBWKjXzwnjJxmMfFXOodKkLlnKkKkwdDBbSsHhEeUUuJjJjuUVvMmuOoWVvCjJnMWwAHAwWSWcfFbgxXGwSsjWwkKWwhHJjJCSySzZoOWnEedDNSylUuLAtTLlUvVClLcLXxXINnrwBFfEbnNkVxXvNZzngGfFBmvVwWGgHhNnaQqQEeMleehVRrqYyDdiIQcXMmxkdGgDtTxznNjAaJJjvVBeysSjJjKkCVvcEuULlhHZeEzORhqQeEXxUzQqZuFBbbBQqDXxdpPqQWbBwsqQYUuEVvexXiIiodaIiZzDtTdzZWwcsJjDXxzCEeePpTKkNQqnGEeCdDdDALlXxmJCcjMBbadtwWTvVfbxElLciBbojaAaAuUpzZcCPpTtTtkXxONnoJoOSsEQqTtejJIikEePnvyYVNpPesSzZldMDdmLlDRrSssZzSYyXxCzLmMXxpPKoiuUIEepCcPCBcyYiGgKMmpPGfFWtZzTtJjhiHHTtffbBtTKkUQqbfFoOyYLlnNBGeEixXfFKgGkIsSvVFftTuiIJjUDdYvViIPpyYFZJQqnNOSskYeEyvUugGYxeYeEtTHhJjyzZiLlGgViJjIjDqQpdkKgGlpchhHiIHUWwjTmCcnNMthmiRrbuUVRrxkKXfTtCELvVIikLzZMmlKkRrMmQqYylLdvVddDDXxDGkBkKFMOKSspeQZzqCzZsqQDdRdDTtrlLugGiIAKnoOAymMjMyYgZzGlWrDyHhUGgunNDaKkcyYzfFZxWwXfcXYGgVYheEHYGNnXpMoOotVClvAKkaaAVWaAwTtSTtLlALlLOVqVvriILlMGQAQqhHEehGgUMmsSbpPwWzSsTtQBbqBbALvrRVOoiIikiMmGgTjZfFAzZaXPpgwWvVGEkKxClgGVeElcCLvNnRroOjJolyxXuQVgGnNOoPXCcxuprRNnvxXIuUijJZsSzdDKknAaNXwTtWPpxgGcDiIdNnhVvPjEeLWQdkKrRDjJaZzNnMCpWwKZzyYUjJgzZYsScCywWtTRrZTlJjwWaAwKkqQaAyYHcxXCmMhMmHoOSmFfCcSsCyYyYLlAkbnAayQnNwjJyZzhgGhHpHWLuUeElFfFWwJjBbcJvVhHjCFlbGsTBbaXxhtTeEJGgSsHnNYyQsBYybXaAZDdadUYyLcsymgGUuMmhHMTpPvVHFfeElLRZzWwrqQVvhwkKWnszTytTbNnZyYZpzvyYKkkKrpPjAzLlRUizZliIvVIBbiLvSHhsPXnXxOuXkUuHWgOGrRzZgckKDdRWMLLlxXlmIFsSZzAReEGSLlsgNnrkTdDtaAUDdwRlMoOrRsSUaAuoOdqnNXxOlfNrRnFqQLeEMOoaEOVvnNlLsSoDdaAvzhMpKqoOQvausWwDTEJWgGwRnOFfAlLvEmMZOouUipKkPhHGaAOooOyBmMYyhLXxszZWLSsYUuyYLIitTlHxsMbBcCPVvppPFfAQvVVvdDqVvMmrRLlvVBbNpPNtVlLlrhHRmZzfRrFIwEeEXpWwIiPxKkdDxXEoQACvEeBxXdDpwWPHhVvOoeDZnNVvrmMyCcYeyRyYOoQrZzuvklHhLwVVXjWOoTYktSsEeNnpPfFTnzPpcCZNQnTrIMmioOzcCZJjJnNmDdImTakKUuEldDVBbQfHnNMNnXxwWGIXrRNnxxagIwWiJqjgEeGnQIiYqQyOoZswvVWdyLuZzJiIjUpPlAIJCcvVclYJjyLSsBAiIBbShxXUyJjsRBbrhHxXleELBbFuUfSwcFfCRrKkzwjJFHPpjJdTtTZunrwFDRrHwWhRVwWqQvNnrwEeQbVvBcWwUuMmCEmYtdDnHsShqaAQnoUaAwMmMoIJNWwwWZpsPpSjbcCVvSUuopPOHDdruxCcqQGgsVvetTBkyYKsSdrCTrzBOLluUFgpZzAZNnkKFfWwxcjJpLlPCcCXnNdimMIlQcCqtTQuUqLEqXuJjFfvVWzxfEeFYyfFVAqOPorRIixCLoOlRrfCcXxFlLXWwJnclAaHhWMmtJnNKmMYfQrBbHhndDDdeYaZKkYhHruSsKkURjJyZzrRzZnIiPpWfFQeEjJIizfFqCrKvLlVqKAyYacCjJvVdVWtToOouBbKkXWwxgGUTcUkKcCuaApGgnEePDuXkKogGPjJzZeEMdDLOSqliILQKlVAaveNnWwMmEMJhHjzZtTxyRMvVmTtWrRvmrRsSumMulxXLwWKkWwtTUYJSsmMTTtlqQLrRthSuUMmsUwwtcgBboOvNnVGwVndnNBbcCZNnXxzrfPHeSzyYaBxOwQnwLlrRfFifLTAaawbBdaAQTtqxUCkcCIyGcnNqBNntTbNDdnnLVGcrXxeERcEiIBsHcChFjFMmIifPpwWnNYFJjCcZzMmqLWaAJWwSxYYHNnhPkVEwWexhluVvSsRrEEcNjFtTfbLLlRWDdwcCIFSCgRlLjOohvMmXpwWpPuUjJuNMmnUNszZTtTnekKgKkbtYCeESgsSOoGsHcCyNnLfFluUUuMAexmgGgKcRAamMXRDdrUjNFmMzxzZMJjmeEFfUuXbBgGqwWkKQZSXxkmmGRrguUwWsDdSMQoOcMTtPpxgFfEbBLlomMOsSerqPJjgvrRVuUozgmKoTJjWwtorvVRSBbCdDFfcAMmQtcXeGgExkKghHsSxlLXQDdJedfUqQrRuSyHWwhvVvDdnNzZpPVfFYQpPaASavVLqQlemNjFfJjOMmSsVxXnRpXxPDdQrJjmFJjbwWAaxXteEkQkooabBBbMmjxlLAaKkXJnFfSsHhUWmSXMNtFfEelDjJPlDdQqjOhRAafXxFimMRrGJuUmMjaAgBNnEqQSSssSdLltVvBrzZMmRsSaGOogGHjONZzneBZUmQqaAfJnNmpPMmbZYySgKtVvTpPkKORrHzZhoRHhrHByQSznLlSsmhHPZzuUMmKDmBDEAwWnNaaRrAvCcEQJceowPoOGgQqpSOoULeElIITtmkKeRcCnNrEMvVaAJXNnvlauUzZfuURPFfiICcOyYodDvrvVVPpYhHpPuUcLVbBREcIQdqQJjwuUWspPnNeFfTtlkuMmoOndDNnNMmUGKwWkfuUuwyYWtTABpPosmMEeiIzHxtTwWXtDdUfEeFxXpbbBBPPpNnlLjJdDuTdxEedQkKydDYZzLPkCcahvPuUeAFIfZzSzYyMkKkHhoOkKKEGgVvHsCzUuOgNlLsSslQlgGqeXZFkKVvKttTuLNnyySdDdDGgIizJjaIMaASDdszZRryYPIiyYxxXHbBKfhHtBfvnvVbBLJjEKkefFCBmpPSsNnAaTmLSzTWHheHeEhkPiNsaASrryYRruOEeapPVvkoVvexAaVvXAajJfyYtTcCtaMVDNFfnLJjsLdDkFuUfhHkQqKdAautwWWpPYyYygdhxydpdKQqkMsSyYEYyaAemhuUlOMfFmxXGcCghFRrcCfHwWgPYJThQqlTtVvVKklLTAatdKtJEejdDxjJEeuKJjSHyRCcrNrKeEfMbYyfBbymkTtBbIJxsHUuhSXjjJiVohnyWJjqQsScwaAGgfAaCcLlFMmiHDdhIZzxXpPWCTzZdWRQeEqTXxXsDuyQpPkRhAsScCmVntBGnSdDpnGLlBbgNPtTdVvVCcvDxXlXxjJGglLXfFyYDBrRoOqKTZzDFfsSZztwjJOkKMVeMhHDXxjTtfFtHhHhdDfpkOiGHuUmiIidLkAbZznoOdWwDNAJjzXxZJkKHhKkZzAxXuUsiIeVvEmMlLSeEizZXjYXxyyYJgGRreETggGfmyYhsScfnNYpxjGYKSfjwtqQfZzpPRrEXhimMKMmyYBRWAMOaIiAoOoCGBSsOVvoLlbzVFEWBQgtevVVQSdnNsFZzfSqJiWnNjJYuLACcpPaHhroQjJPeEgGFxVWfZDbBCcdKkwWikKwciIdvtUFFTtfORrNnADWzJyPmMpbBYRTtdGkKuUEeqRYNsLlSefFEuqPHCVvvkKaAZzVcrZzESTEHiIheIpKkkKPiLBbmsSVwzqxQYweRrUOoqQcSSZRrzORrexXouUyNnNneEeqvCiIKORNnreECnNcxXZIibBAHtYWwEgGvVPOfTtPgGpBvBbVzZhgpaYyAyYuVvUPqQiIXfTyiIcCYyxXYdeZAYyanepPAzKSsyzIiZbeEQoOdZToObbpMmEePTlqQLtPpTlpBDsrRSDmMdEMccMtQYyqgGMmKknNbkKFfKkBThoOavRiIfFcvMmGgnTRrxYejJQoOChHiTyYyYwNAanDhNTtLRrrjlLkkxubBUwWRvVOoBmRrtTLUuOSsolGDdgqXbrYDeEdDYyhXxHdlLyJtTZgKkkKgoOEQqvVQqjBbCcJQesSeNnEPpeEmTlLYyPfCDQqdcUHAakHCnYmMyNIiCrcsSHhCcgnaAjDdDdufOoERFfrtFKksFyTbTXexXElzrXCNgdWwWyMmPsdDLhfdDFaeEcgGCPVPJNuUuFEedDznoOxXYDdyGgumDIjZOozUuFGDdzZLllLudDySxXUhHwyYXIaAUnNusLsSIiqQYCLAavRrVVwIfFpQDdvPBDNSsnMNnWRCcHcCJjuUhRrHmMCcApPGEZdImMPXpPxpoAWwUOjMmlLtTAaeTAaPXvVvVGnCcVviWVEevAaAScCXITtkTnvNnikcCTdalLzLlZMOoAQqqQamfgnNfrRFfyYOoleEaAegWwSYgGlLqqDkpkogSVvQqJjHFfmSsMAamJymuUrkKRhHMkdDJnNEZcAKkldRFVqnNpfuhgvVJUZpPzFJyYDdmMjZBbqoOnDdhOoYDdnZsSbUcXxRRIxEeRwpwUuWKkzZmGSsgyYFfqQPFQJjyjljJcCtTVYyvWlLxXHFsSNnxxORrjjxKFDrLlAKWDRZUulLVFlvJjAaRrtTSUbBuYysqEmDdMeWwQhRrokmBzZyOgjeRrzZvhcDVeuuzZUUnNMRMmoTMVuUQhNnnjJNmNnAHhTHuoOPpEXLlfFWwxFwWferDVvLlwWPpdBysTpPKcWwWDdDdUuOoeEyYwgYHhRLBRzEsGgNpPoaALYyRaAhHFOoAbBajJDlbnNMmBnXgmOaDdWiRFGqjdhKQdjFdbMdADdaFCcfTlLixLOojOHLRfLcnNYoOyAabBNKeEUfFeLlYyIRBbzbZAgCcGJjNJeElLjHMmCXjJmEQVrRvPJTbPtTWpKJjkdDbFoCRZeEzrcslHDPzZOoylHhyWhjJluUzrFcKkjPpBBbYUuziIsSCdFfFaWIjmEGgjLlJrRYumJEvZzEsNaAEfQWwpPqOfFYyiiIPchQtTwWoVUShCcqQHsyJAadlLmgGUqQbFfwsVHiIhrRDdyBblCsHhvGhHBbHAafFAKPTvhFjzZJTtBKmMkhmMHgLGgFfQqLlHyYyoZjrirsYFfAiZJjvwWMNpPnnNzsmMXxzZhzZEeAancCNHihHwCcuUXvtZEezCQqTbhUURqQruCoOiIcaaAOqQfFaQsjjkMGxRrCNmSmMuUqGvDdVohHOUhHQqxXzZwVLlgFNOuOlEeLtclLTtzzZCKScCalZzrPTgGYnNaAxeEXwWyWUxXfZzSMiJjnUuMmUPrsgGOSvVMmLdsSyYnTyYyYCQqcJjjKAsSaNRrVDdPpUnQqNBfxXvQXxVvqVEyDdjJnIDdeEqQAairFfwMmYyIiERrmmyWkKrRwqigMgHAacCOoBfFiIbrhHRdlEVZOWYywDyFfwkKljpSHAanNLlaAuKkJtiZzBbIAaeCKkcETmCcRrAeEQqaMjKpvkKVulMmmFLlUuUTturBbTFSsfDwemMurKkPpRVvmMDlLEVvecCDLlwxFWwWhHyBLWwqQPOUUSmEzEignmMeUmMSsxXfFKpPmpMEoolEeLRAvHhoXxVvIiNCcJSsCcELleULawgCfyKspPeIqDpzpxrQaPpzBKikyYKvVXeECZzdDdDCENtCcIiyQsmVRPprXxTanBwWbtTxfFNsSSsnWwFlLQqGEjYyeFYyfxXjZzagGAxbkLbBHyYPXFXrstyYtTEeTjJgGhHPcqiWtTbBKhWwxXQlLqIkfFKuRETtNJKmxOoMmZzhHgGmCNhHpnTFfFzGuUWwWwXQlLTPpoEeAakmXxMmsOorRdgyYGDfFFfcDiIyYGgjJgBbDeqQgeEGsWwuUxdRuUUujoOJsSSsmaaAAdFfZYKkynNhHUugGCpPcxXjJDBZzbZzGlALlWwTtKkBJafqtXwWwnLSDZRrosSKQvKkCcVqkGqfFGWCcVvwZzMVtFmbQNOhKkHgGPpakoOMpsqGdDueEEenLaGsSCCKiIfGgXaBbjpPJsSlniINIbmDXxHhpPVEDqQSsTplPpCcXhHxMKIikpCvHhdSsoODBQtNndDTqykcCRSXxgVJJjjbtkKTBlLQqCcJQqKkUPujncmMuPkKHhwWiIpAKkKLlrNkOoaAfLlFnrRRKkyYDrhHAWwGhOaAmMvVVFflpPcCoLhHluUOyHhoOIVvnMmmMaYydfFGgFfbBGCfzZbgHKkhpPtTtTWzLFMmOHtTHBbhsliSYcCyCWOocCSMGgIimfnNnPkndHhNnDNGMmUuJQqzkKtTxXAnNNaZhHQWwqfFLpidDapPUuadlLdDDppCcEvYFIiIikzsTvVPoEeaAHhOEeLAajJlaAUBbuSyPSdDsfOvrdQeWRrJjqQwBnlBbEeJBbLlmMZWThoqbBbBkuUkiBbDgFDNnNnkKbBJXLlOoLrTPNxXFpTtQqrGgluFfUabNnarrzeQqRrEFfvJIBwWbqOGYFzHwWJFfnzVIiFsSEeCcjJoOzUtTnNnHhRMZhnWMYyEOlLsqQSKaiXaDuUWwcrUurRZzTtRrHuUvVhRCdrRKTPeEnNhHEeNXxnIUTJRdDrjMWydSslAaaBTruPwWnyYmdDMNbnWdpGgKkGKwfoQqUQRIiwRdKPvVpkPpXxSQiODdpPoxXIqImpGqKEeiIMmRkKrsSRDqQcRrDdrRDdeECmDWIcUoozZCclfFdYoTUuFNnYypUIkcqQwHhWqwWSjEITGgaoCcRWsXxBaAbgQHjJhVvqSUZTyYnNtXDnQqcXxjiIEpPqQXxePpHDJjaNtLliKnNlLGgqQNNnCwNWwnpXxDdrowLSPFFfWqjWcOgOoDnvnNTvmMVthvuFfzZUlnNWwwIQZBblhHOogGGZxXtTQIxXsdSVvAhxoOdJskKceECMNnoOCykKXxNngGLlzQqAaecCBbJvZzHhMmRgkvVxXOoKbBlLhmMrYUSsRrdDuUuoOyRGyDzBQkedttfFySHCtziIkKZHcCPXgCimCcwAwAcCMPpeNnwcCHsSFfjJNtTPvVpBRwWePreEkfFJjGglCcZEezfhHElLGWwhHKHqqOGgnLlpIjjJIiHEZucZsjeqQuUeMugZDfwDJoyYOtkPxUidDgGIqiAAZSbbvVrRnNNsKktTIikZVEjdyYhNeEcHPXxFDaGbBpRrCiMmIsvFnoTtOuUNGsSDkKzIRrFUSsXSshsSHHhxlBwWbLDdlLDdTzpQqzZAaPiIxHEehSrMmRscAYyFcPwWpneKkKkEBkhHQqKqZnNzQbDckvzTtZkKuUaJgGnNFfTtFfAxUoOuXajXDWMRtyYPpFfTVcCaAavqQAaWEOoEYwWyIqQGfkKflccCLlPVgfFSJastUuLFUufaVvtlLHQYyuzdfFwLGUUnVvJwWjXFVviBbdwySEesShpPHUuemBbIiTxvmeqIioOJlwqOoQMmWoBmMDIiHhPpwWxQpNRNJjDdLwLqQPplMnNrQCCHXgGVQjVZzvJBKOpInczCpGpPPpiILlgGVvqBZTeEHgGzPpgyYsPpStThXxHrHMmGdDzeYkyTtYKBMdHYNmMiIYficuUVNnZzPMmLBbVRvfHNnGgYyhWdwyZLLCceEjCcEeJtWwGguUnCcGvAuUSCcPBBvIidDhFDVvdxTOvbaABOowgtTovKjzZjJJULpgVuBUYxXyVHhpINZCcfFfZzOotpuULhvZzFNcCCUuXxcTlWdKcmRBbrSsiIFXaKkWwAnHLpPXNngyYyMlxXFZAaLfwWuNAanPsSYkeEFfdRraAWmyYGqIjJzZEMmMzZmecNnGTSNnIiERryYwWcCnNwWOopPoNnBQyYWqtTReqQxIiNHTCcVIiNRSXAaRYOhsQFrRIizZPCIOKnNImzGgwfEecoYTTtNKUIeEpPrjIqSshAkKrWTsmwXTtQVvqKUuwWSsvYzZWdTtfhHFDJephyYnNpWwOodpPDPxTBRrKkbezrosSFfcCVTyJjCcMyHhYeuAhzsSmulcoOFRrdgGAaGtiEhhHjRrJSnwhNMpHOlDJjjCcuUHSsiItqQTBVGgvyYEROpPYcCyABUQScaALlCKtTEeFfsPpHhNQIxzGHBbSAasbERresxFfXSXxyWwrRFDEKkGzZNWwVvnVJEFWwrvVKUuGTdjJhHxglbaeEAKkIVRrvrSqNfFnexXXpfIipNncdSSsaAsbYGgyAabBBDXyKkGCHvOnNfmIbBilLBboOQqACxXroMuMSsOgntDdKoOZDAadCcPpQqbDyYySgEDjLaAlrrKkRpPEqQeRviDNNsSpPndDAaLSqQslnsmMwWSVNAlUYyRRrBblLvWRrwAamdDZoZmoyjJMxHPpPAalLXxMWKkwZNnzvAiTNgGQqAAgofFEeOEfVAapOAaXJJrPFfmaSsmwKkAaFmZUuusSFOXtGvVgyNzAaZnrRNmGgsSCNSjQqJsCJjBbWuUAUuQdnHMZzmhNiUWwNnqigGZzOobxNDpPBbNtUuCcyYmMgGJjJjSsqHhmMLiFvkRrmKkzHhZMtQPeuUIDdbzZBJNhHaGtfaDkbNnEVvBbOZzLNnNnVNgbGEeRPpIirgUeEkuTmsSjtTxXNnRNWtTjhMXlLxVRXlEeLlkxoEQGgCqlKtyYJjEeUgNSkKLgGKkztWwWwWvktTUmMrZHhrvmMVxXtTQJjZqQpYyPoiIOErfCczdvAaDdVKoOhYGcXCcxsYhHFRrfMmWFfwxXqESFkVqvVHhkuyAgfdtlGbBHQAmvxzOoZzDbxZAaKiIMBBnNKkbbDdmkuGgUuNMPcaKwWIiksvVfFYkKyGHNilLaAoDuBTtbIGOhUQwMmVDdeRbMIidwRratTAhoQqurRUNnOgjJlLYynNbWwBnWKwMmqLlQWvbBTtVmURxeXqvVpPMXSMSNnXNikIjDQyYAFIWXxZzQYteMUuSsRCbuUBMusUNiIHJjyPSsrRujICcMmNSKkJjsrRnCclENzgGoOJCbfODKkdaxNnEhHWRBaAbUuptTUukTQIfHrRRbBLycCZzkKlLBdczZVQqumhHNvPpVpRZzrPZznpnTpjcCkppGgPdzPCpPnNkKcfrRKCDdHuiBbmiGgIrRBWNAasuVvvuUkKSFtSjvVcYyFfRGgbAVAiQqasSALdOoLQONQmvxAiHiMMWISsyYYynNiOofOoPpKknNOVmvdDlxciIozcIiCaAastTSsCcmTEeEWOoOQqfCSpVvBbbBPaAyKgUufvVzwWXzeGglFfvVUKMmmAnNaMxqQonHUCyYrRaDRTUurnlriIRrQaAwWyHqbFrRAMmyInNkoSfddGgDDFaAspiIKkRaZUVEeXxvBbtAXXEyYBtVJIaKVQwWWtTtTaoKZZyYHhDgGjXEGxfukbBoOgGbeLxXjJWiJjIkAWWDwVZolSAtTcYyQFvVUqQsuNnbLMpYrRNSaAHuNRYyYyFfGSSshHsjhpZAanvVjJJNOrSvVsRMlkJRwQqBIvVeIihHEsSWwMmLhGvELZzcjJydQdWfFaiIeJjzQuUmXQZzvEeVJjPSyEWUQcKMmhXeEYCwkciIKlOoLMeEdDmhHksQCZrRdDriybBuXxpEtCTCcbDmkKGgxXMriQcCioyyvfnvVWwgOVvVPCDrsEGkKgexXHnNuIvYRhhmMHkKpzDeEcBkFIMoDbBxtTOoHhlLfVvkaqQIcCqQQSsiEeIJgGjAgGcBtbBxRZzsHKkgmMWwnyoCKSsVuEDdeLvVlwWCznNhzkKZrWSNeMmluBvDdcCSsqoTWwtWQmYOaAaiIJjblbBHhWwEzDwEeXxUuivViEnNeDDdmjJqnwcCexXEIibPpNpPnBJjsXxSkYDaAdyscJhHalEHlijjhHJqwWudDFcxwzZMmefhUuqRrirwmVQlNgiIBHhJjcCbGgmMvuIJxXidONnoDdDrRgGJjGzZmMSMBbxkKQqZgDdNdDnGEeTqeEmiIsSMfvMCkAUOoiIueiIOoMdWzcwWtzaAdDKmbhIgmMuoOuUjJJjdDIixkKaQBuEeUWhHbBeoOIYqXxQbBWlYyaAgEeqVvqQQPpGLrRpPsSnNEZqxXKZfzZFzlNxovkKUuVbNrsaAvaAiHhFfsGkdQqqRwLlWRrKqQnNgeGgIhHiCteEWLEqQqTcssIibzZKkbAVvaSsfazZszZtkvaAHpSscNniLptTnmMmIRzCLyQJgGbBvWjciICudDxXUdyYGuUgCfqVvEebirRdDKkgGqCcBQsxXdXxmTjJXLJAasBoOPpcTuUUMmCuBvqQDEoGgOUIfFvRmHmMsSvVhCPpRrCusWwLlZXoPGgdnQQOnjJjQJjnxTqUoiWwzNpoOxlMDdJVfBLnNlBbbgGMBbmbBcQlLcCcNjPRbzcDdnAaZecNLoTtcCPqVycQRrJbkcmMedDPrfFcCeEUChHvdOoFUwcCWtxXXfFxTLlSBcCNnMeeFfrRlnMcrVCbBcQqlLnaKkSVvsSsEyurNUuCSsxjQdDqeEJXlGFsSfRrfFABbhbBNCceLlvFfVEnUucuiAfFpPnYHhQbAaEGgeiUYyuSsYyIymMWwYBSilcUwWTzhNWezZAnYpqKjJkIyHDKCcuoOFSsDQQsSgmNauoGggnkKOoOuUXIlLyIfFfHyymeEDdqQMmBwTtZrXYZqgNTEetqRaCuaAUoslHUudxXhzCcXOrDdPQqSYwEfFeWyqQlhuGwGdWjpCcyerFDwKBmMbOMmlpTjJsStBpIvVtqRneoaAZeEZzLlMSsukBhHrRDlLqQnyYvdRVSAxVzxmeoGgOEarRqQsSwPgGmQqvVgsjzZYyAMhHWhyJrRlLjOouzoOGlzIikKyQjzrVYLlyVecCGgMAmOoQtuUTdBbDhHByYSsDAhHhAyNIDdinTtXBbGRjJkDdISWwsZFfztbqQYEeFxrRyUFanNtTloOsJjJRWQJjfFHpGQrdZzFfDrxMSPpoHICvVBsNQDFWMZgGgWwXxrRHROokKrhdsmdDyOgGNEermzZBtQuFBbfbWCMLrnMmEgGDdfqQXCTtRrxsXxXxzOXCtbBwWSPPeaAwBbWEzcCZpSmpPxgGXMEDdtTNTtoyYOTCgGyYuLsGIirXEeOXgaAgGILlnTtvcyLlYCOoBKCHhcRjuUoSbgpONnPpsFERJjreBbMGEPQIwWghcCAsLfFYyEOoefFNmasSEDdeAyaVvUwTVvoLlOqaOdfBXKAaCmMaAdEMmhsSgwZzFfWLYGrFfRRtiIwMmWYBfFoVtTtPZzFxNerVsSNaAngAzwUkKPpgUovYHiMmoIofKiIfHhSsDipsShIEehjfbuVvXWqKofLKwZORbacCXUBhgGRreHOLlEeYbzZXzdmWwMMmDqQfTNKyEetCmoyYOMOVkTIOUuvnfkKzZFNXtgiTtIAZzUbHhslkqrmMRQpQmWxMrAxXaRyhkgGKAtPufXqQRhHHYpYyLyQcCqHdtIiiGxwaXjtdaRrmgLtTHhtqNnQTpNZvbqHxYJjqEesSVMmWwcxoouiIvVlqFjBbiIXDdZKTtkHEZzhHcCHbBoFfhHKDAcVHfFjHVoaACmSsCrbBedDfFRrjJpwotpxDtTHwWhdAGPvVlLKkGkqndWWwWwoTFfmMlYKkKkMmXxwUuaAaLliCcLrYHRbFdbgUAxdWwlfqqQLAWNnsKWwkriLlInNRrGAamMAKkQLDdcZTDdZhHryNlizqNnQWHOoIpWwPXxiWuDdUaAOEFbMASgqDVrRdeyZtvtThHqXPpiIxKDdJpzFfQYyqoeTHeCyYGeAiIOAiTRrmmvanhGoOsSgnYniGpIiPoodDoxkIRrYGwQqjLlqHkjeEJkWweEgGGGMMYymfVdqQaADvxyAmMadDqQMBbQOTteEZzcoIidUowWoOOuJzZhHVxmxTcrJTtZKKkDUuFkjJSswLtUuOzMdhvWRrQKJjJRAyMCcCDzhHNnZzZyJfFmaAIwZzJjPVwIjsCboOBcjALlaJzZLlsUJjuKkSUuSYdvrRqIDrmZRiUKkuXmIYyFfjhoGgbWwemsBbSCcmVviIiCcaAocCjJOwVBQHoONjQzgRrGdPnpNvVVvpVXxBMOPpoaIbnNBYxQLiIqQaPpJSQNryigiKwXthVbTiXaUzaAZueEARdbBDQqbBrjkwPVrYycAKhkNMSsmhtzZLLgGFrZipucrwSBHoDdmMXxLlOHhheElLjkcibvMwWZztCsHiIhleELfYyFXWAaUJjuzESOEeVeMfinNjfHefFeYyQqbBwIiWLKfPdDVWJBZLyNnMBQAVOofFJoOeEjBMEvVegdDGtTmbnSsFDeoodxSsAoLlOWhAeLCMXXxxasSAXxmcTFKkfLLZyMpPDREelLqQOJjeEogyOouEeLLNYiUhoOOokKzhknNWtToOwvVKHTjyQMvTJjvsQuUszPjUOfWImSojeimMJKrRTflXxxtRCcrvCcEBLilLcCVLqvLxXLlWOdVoOvVvDrlQrHkKbSsONpAuUatTcGrnNSsRPpwJlYTpGgPqxXcjJCQtBbyhvmxXnHUiIKkRcFBbfNiDdEwitBlMmKZGIeIiGgrMsSwiHsOtTBbaxkBUuFfCOoNeOhHzHJpAaNErcijJMbvVTttQjJqEDdLAfFWIQqBBzVKCckHhGgbljpPCZQkIcivBiOPpaGtbEIiUuUlUuCAtTliZzGAageEWwrrvAaqrXxqApuNCKkcnUiKdDZqGgWMdGCiHUlLuhvKvxzZDqLxZgFDdxgvVGXvQLTLliyYfQngiqoRzxhjrwLIisqQyprzDZlgSEepZzPDFfdUuqYXxoElhHWeuKGgKrKElGdlJpPzJwGhFSHhtToJACciVlBbQfdDwtTbBOOcCoGVvbBZeEzsStTEeQqpwRSdzZDnNdAzZuPpzZHrHkeWwiSsnaANItxdsaASIiDXTqlNfFmMlvXjJJTeEtjPsSliILYNwlzRMrcpPCKbGlLlTBKiIqDsRWrBiIUrfiZdGUugUudDUuDzIFRAWwaDdubRwrShHzZdQKkDKkdkbtLlLgniITtwWvVNBkRmrZLWnyxyYXpOoxVLNngGnLQEKhRhUaDdDsrWPBbFfOoVvgoWdDbBdDFqNnLbBvIQqajMmOqQsQLlqfHfFgWbBjZjLDgLekRkcCJjkUCcEwWTtwlLLeOyItTfFUuiQsGlLLzdZRPPpYpmMWwPDdSlXxWiIRJHXZrOQmMIEepPGGgYyNyYjJqFIRrtlqVfGzXvVlQdXVkVIcgDmhHwzZFfQzNnXxXxeXxLlEkIPaQBbRLcsSClQvkKVVPpRREaYyDMmdAelLEqQeILaVvcdDLuoOzZeBmFfMTsUfFuSuTtUgzZIiAoIbVIUuiICiKqEezcJLBxXvYyjJZbbdDGgiwfFaleTQqBmIrRCRenhRrHJjPjhZtTIfFioEcCncwWbKXAoDdShOoIWmRfAaFNnkaAaAKeEeEEigzaAkSSERrerRWvVwsswjcCJWLbluKkULTIWeInCruhNJjMVKkHdDLKkjWgCPnoBhpPRqTQqtLRoedDMmOqQohHEwllLVQlZzvIlbeCcVTXLFtsGRrgSkjIEJOsMiwFouLbBlJpZSGIigiISsqSVtVmqYJCkKczpLlPZKktZCcbkKBHuIyKknlHhlCcUYGFfdDrYylLdmYzlzZlMmFfmMtyKkWwYmMlEWwayYHwasSXDOOEdfNfFvaUuqbmuUHhDdJjCcYCzZclzbDdrRjwsSfFvpFklJjENnEsShFJIAaFmEvUuoserRZwxyYScTnNmVgGBtTICKJSZzsbsWROoCoOUPIzEeRaAfllTHnKHkaCRvpLlWKJxItBvHWEeZzwTxWkIGNnIYRnqsjAlUuPpgGqXyjJiAZzOEePpombvPvqbBQQdDeEqVvpPnUuNVnPNpNnDZntTNqJnpPoOhqqQbPprRvWIaAYyMMEBGEegOLlHrRJFfiMhHQegmMGECcSsqxIrUuzMRdiQVDyIiJiWvVoOvvVpWiMpiyYIPjyYYdcmwTtLlVvWYaNnMmZzrjkqlLAaIiwVHDmZotTTlWrRpPKfdpQqPkuUzjRCtXMOoXSsvUsSujUuDMmOCaAoqmYXFabBAmggTtLjJAalKjMmJKjJvVhQJWgIiyXxtTiKXOPpOiIiIOpWwPgRrIhHNyNdDHNAVMIiMRrRrCcbBteEPpIaaAGgoAapfFPaEgcNnjJEhtgGEOZQSswWoOqPjkXxQVTzYEXxDvdQGsamBfeodDwxXhwFfZILniIRrkKoOZrvhHVRzYRztzClqagXxRZzSwalQFLDXazZuGBYyDoOfBrPZzphyRTtOoxXlIRrAWFfyLtODdWwwTTUutYfCcFytJjDEeNQKglLpgaDdlLXPTOWpqQPPLlEHhehHERcMccCOvhJhvuUCEeadkDdOhZzehTQqtzxJwWflLQLUdDOOPpXChHvhHjJNnQyXvVhQBVznPlyYGMADTJxCcAhHWLlXgITDhIiRrYlPyhMmrtTVvxFWwUpTaHYmXwMqPxXKLSBRYyruaGYlLyYvVDdyTxVvnNVoiDdtKvaNnAoiIpPcTYjJkPpnIiNntnNFdDZxBbByWhFVvfESsoOvVeHwoPOopOohEHbuxABwWrozWMMmmkvVlFObBkQwxUBFVXxvJHowvVHhWOiHPmgGMEeIdOokKFfFkFOHhiOIhyiIVOuGMmPzZpcpmMPCuWgGmMZaGvREnXyYfDdpTvObyEerRTrgGgyluUGsLlSHpPeDckxbFDoAyYQtWuAKcAaCkYkRcnNBbCrSsKMvVnlSaHGibBqpegHhkKmfSRtgGTXxrrRoPGBJnNOojaAsOiIJrkbkpPPpKVtTNiGxiIoEeCdDcVtTvxRFfgWwSldDUEeiIPpctnMmtTesPcCQlLqppsKkiITcxoZSeEHQqhXIicIixFBbAaeNRlmcJjwBHhiIyYciICUqTbPpMRyYnomMYCcMOoIiSDGnNzmuUbBwfdqnOoSnNbjJcihOoOsmXRYyRQqqKkgPhqwrjhHSTHhWwtoORraALTtAfufuUFYXfEWwewWyqazZkKAQBTcCiKrgxqQYKkaHaqQdbhHqMaCSscmEvsSvRZHhRreEJqYZzvVZNnLgZUfzZFYHTtwmaOozUWwcCuaAZZzJFfSGMpWASseoOEMmMXZvXKkasfFvrbBDVkqQKtTPpNdbaAKUsSmzOENSsrQqQTsSiPbUcCuPOoLokWdfREPjJpYPjJJwDgWzAaZgUHLspRoxZHCcaADhLSOuUcArfFQnGQzyKkxRWwNnzWbMYYhFiYIErRNnZzeiqQipPxoNhHGOUQqAnMGDFfdsSqYkKyqdfMmUCckdhYiQPJjyNavVxXEeELlwnYyHZtPpzZuCLIsGafFaAYyAgYVvyqBbMmyNaIUwdDWCHBbagbBLSnNscQQqAaOoqnRUuUiItlLTYeKkvTtVLlbBANvRCmNLRrEEmbsaAufDcxXCztThHvMoOmiIVtTZVcuwWRpECKBxXjqCYvUuQpOlniIxXCEzjYyqQxyYXJLlNLlDhHdCBbZYyBrpJnCJjNnlLZwWzqCFvUBbuOOoojxXmLXvVPnyYIrSsRKkiZEoOeIuUOusRrSQtXNqJNDbPpBdoqqNDjJpOxzPpSUccMrpPVTtiudDedRrVbUcSsutuUCOobWwSGgjlxrRtMgGdLlDDJjSjJqbQICKkcSsBQtTFcDMmxXCOoNncJwVjqYlcZvVrPoOpuUiMNPlICPUuhVKteETjZzJjJTSsSAFRrnNBdDNnBSSCtUuQZzgAaQCcqGelwoOTtGgWwVvEeWwTcEGxXxXpPAuKaAkUaoOkrQRrDKqQgSIVHhSRnwWhHBOXpPnLkQWwzehHoUuOtTwqQyiNnEwnJjNuUFfXxbvVqdDQjJqAvVhHXUGiHBlLMkZTCzZZwhHDmFfEacCyYAaKcmpPXxvVVtNnTFmMQQqttTtTDdiIbBfFzVeEvXzZmsgbBBbKEeklLIjoOvVRAarjoOWwJtkKTiUOoVGmMnLqvpPNZznfeEFMWRIQHFpPEMmmMWXCfUQKkJILheLAjCGgSKAagGwnSyYsfFNWbsSBWKaQqjJAkNQWwPpMdIIFfIcCikKWdZsSeFfmMLBAoyMqwOQVbULXxHKkhmMEnswwWsFfSRHCcnNZZzcUvkFfcOYNvVaAauIiUUORMIimrUuouAGhSrXZzzZDdTbCaqiAKFXAadOmifKbGgCdmMgGZPuUHryIiViUnNhGgSRdDdNnyYiIcpvoGNFVYYOIqILlReEdUufFBMmcCjJtcTAaePdDUbBYsSVhHvqQIaARdyaAXIixjJYDzcOoqSCAaKWhHcyxHkCqkKuweFfgGYspOoqxMqZkKeEEAwDqwWDYsSLlHhCTtlzZeVgHhHlXrRxsSibrRWrjKdYfwWFykFwWcCSklLaAKyYsXxfKbBDLmcCwYyUuWBbryYBbRonjNRNnrkKzPHJgxXYyPprnUhsnjCcJcVvCyPxAatTXrRmlBJKkjUHhSOouDdWcCwfWwqlLCfFaLOzvWdwwaKzZiuUhHfFlLIvVwsScCgGoOlEBEeKsSkzZKUFXHfFhzZgeAaVvxJdzgGzkOAwqvkAijvTiIKkbexLlxuFfPpUaTTtuRrzArZzetTtTEPSbBsOoOHgGhKiYLMmlafBQhYvVqRLNRtbBTFftrdAcvVHfFhHhulLhgGNOXeEIiklLuLEZxqXxWLtTlwQZFgGUTtAaunNGvVkYscXxzZFbBowjJetMSACcZOCXxXYtTrRyLVMvoFIiWwwmmXxIhIaXVJjdDyYMqnTLltoqlDlcMPpmCgGIabBvAaaBLlwWrCJsTfxXseEVuUUUuLlsSSnwbMKktTIUhcgGkbBFlOofzZFLpZDPKJPCctNPNgGbBnLlMUvWwEFfmMeyYCDbYBblrhFiYyqbBAafFtKPkKrwYyqQhkKTtHeNnXIqQiAKkCVvctTopPFBcvVjZnekKLiJUSspYnNhnLluiISUmcrmETyqtTwifhHZzaqJnNjdJikKKaAInxEeCczZsmsxjJmQxEXruMkwNAaGHRaArWDWwcCmBDdrECcvWHhPpquiIHogiJjHhUdOjJbBInhgSACpmnUzXwWBdZvVXVMZzaqTtPpvVhwWgLPfFpTqQnNtTDUrlLRuFGSsawWlLYnNDdUKQvRrKfyIUuiTtYsCcyYetTTtQqQJjGgGgpPySmMCgGlLgyHfFkSsvVDZFRepPztTqjJvVRzKkKkRuKVwTZlsnGuTkLQcsSnNqtMjJmTtTeOTtXKLGgxZzrvXxpPZCczmHJwnrJMtUKuqQsSBGtTnvloRremMoDcCdOBKdAFTgrRAnjnNixXHBbNnvVhEpqTnNKqQVfIlQDdUuMvVmcxXUIiuCTnxXdNnnWwXBIdDQQqqQsSuIDqEecCabBwWwBbDdcnJjxNnXcMMPpNnmndUuDYTxofXxUzMeEfsSWMAaAPpMpRjjxorRmMPvFeGaawWLlntIaVuUxXmphXmYVvGgXdDxOLJjPplMzOzIiMKkhHbBVlLruLTePpEtanvdYkKyIVJdSseGsYdBzaALcCqQnNlZaAzkTNGomUmORHhcajJzZFXxfMNGQqgnFrRoVTthcgYxPpCPtTIEeiFPxEaAOoQGgsyYRaAidDBOonNlLLGXqQjJDtbBgUGxXzZgukxXRfejxOoXmMvDdgeddDfYsSlLBhgHhZXOoiqnSksqubaoreFfISsibaAhfFJdLVvohPmwWnHQqWNsHyYeITggxXGDdDfosSOCBbnNLUNecCEOonmMMYyZePpEHaUEmDdgGYjJtvyYFfORPpZEoOoOGgtXsSkKIiHPdDEjLlVqQvalLAwyVdDuUdeWwEDkwWKkTtxWMpPStweEwWPpRaHQiJRwWizcGgCrRJeESsjwWZlCqQcLljJLukntyOyYCFWnNZMikLloicpLXxlfYMmJjyqSHoaAyoOrdDMmOGgopPxDdMmvVsrnFfvqQthnnAaNXErtTQzZwUuyYqLlbOEBbeHheslLlWwLtgCzvVZDdiQFfQqgMwDKHFfhIiybqQeEBRPxXpXxrGgARrapUFlzfLmFkOotTKcCuUnNfTtYGxlhNxfjJAaMdDCkDyYQqwLtkYyAaKcCoOetTEnfVHlPTlLFPpznNnjJiPvubUvGPXxpPNnlukVcCKWwIikOGWVFmMmMfqQotIiXFffnNyYgGHVbbpsaiIrpPRVgNIiBLlbdDTllzKkYWbBDwFVrvlpvCIFyaAnBbyhnNDmvVbyEZIIiighRGZhtGgzXxbQvVeEQqgPQqcZLlCKkNiPokbnNqvxdfFDhgGccqRMmgGmWlDdYyfzZFnrnPqXuIiUdmMbObByQqYLjvVmMQqQEsShGgHjNnJMVXtnRrNMjJEUusGgYWDIfxSlLsjJGgjJgqKkQGNuuglvDdVWDZrRUqhTjJAlLizWwOoyBbcCYkGgmMKZIlTSAjsWwjJZqTtQzZmMWwzHhmMGqQvpCwiIWLFkKAMmfMqOiIoQmFaFggGieVvmMewVVvAvtTrmwdDNQqndxSsAfFVKpPCdNCfaAaCFfLlLlXhHZtLluYyfBbiZEeooOOXnNxNndgLlspqQPDdSfDdVWwVvlLSLAalcPbBgAdfWwJjphCUunHDKkBbJevzldvgGVDLKlLqpPQSnBBEeszaBbaIQiIuDdQqXpaAlLymMRrYKLljJToOkmMKjdrRWmzZMFdzpAaPGUsSmEcCqQpPEJlhHLSnuUlLNDdtTzCiIUzebBJjhJiPNoQQIihNnfFkFfplLPHhgeFLhGgHKRpKwlrRLtTWqQkEAarbnhTjJtcZzCTVvtWEmabBWGgOcCoaWMIcGxSGgsGgYDdEeyOmMpPRoOroNnpmMhyYuUTchsYlLTTDEKoOqbZdYgHhHGrtTwWVqQjAaEgGAiIpPaZyYyYYcQqMmmWwSjDmMXHiIasOovVDXxnNnNSiceECkKzbBgVvWwLzqiWnQqNLHMmhVHVNjJTQqtdGlLGgotTrtTRCuJjRrUwJQwfpslWORrPpRPWcOonJWwjBlLNnbuUkIrRTnAdpPGghfFEeHhJCaAHhNdxNnzusGYKgGMJIRrijUumjJkySwryYOAtieJsnNQCRKbBkrKiuPfuPpUyYIZzRrithHWwvVJktTKjtTOyDVCcvLkKCcOOuCiwdMdrsSaAkQgiIPWwHhAaMiQqQqsfFoODrWrpPquOQqfFFWkvVgPDIiyYwNBpPpEeURtbiIWdDAihHIgGTtawALIhHiXSsxJjtTDcCeEYwmMdDmtQRsSrBbquCciNHHhwWhnwWceECEelJjDoOdLptkQqbBAxIAkoemwNPpBbUuEeHzUumrTzZtNYyBbuZfUunOoNvOoZgGNsSjhZDdpPfygeEXxooOQzZBbijnfFDdBbNFVvfVZRRABALRPbBfnptwWzdDJjZJjRCchHNnlMbBXxGgmMmxLljdfGdIKNnmMKyYpPTtTtnNQTttTOoOGgHtTOoYytwziIjLFfNbEqDRYyVuUoFpOohHYspsSPNFfnSsoOgwWGCcEeOoptSZKfUuyoOVxJjXxCcdGgDoOXecCRCcrPZzPpPdDAAFfhHIPlzAndDalLYyZjgKzZGgyYptGZzgTNfFFswcfFsILlLSsShoWwrRflOomMZwzZWgGwiIGBFsScgDwWtwWTAxXNiRrRrYLvvVncCrRNCcoHgasShPpHRdRnNrrtWwTNfFKnRkGSsgaBbUCNJUpujVrNcAaCxXnTPptoORKkvcqQENnMmeCpPYVvyvGsyYrKYhIrRiHbVeEcPmLPtXxcCxDdXlLdeBbQSsqaAvBbdMBFfzZeEiLAxJmMjKkFkcIiPFfpcgeEAlNUgEeQSPlLrRTtRrmKVvAoPpSsnqBMfTvwWPpmgQgqaAXxQTVcCvtOeEzdslNSsFfWkKxTQBXxdDbFAjbpPxXCcHhaTpPtLgdydDFfYkKmMzDdHhwTtzZWfAaFnNDMLlaRCcrAaArDXSEdGdJjCSMKOlxXgDGgdGLGgtXuUcCxBfxXFbqxOoXxHhvVgZfDdtsSNPYyeYyEeJjkKEFfnxWxXGgwXcMXGgMkjbNnBnZzecSsCRvVrrVlLvUJymMPpYjiHkwWwTtINnOoQQAaqVvrRCplLSuURxMKkmfsSEexphPpAaSslTtFfKBcCXOoSAasJXilLIxEjJjPpJJKqQFmMfkeDdgfSsXNAFftrRLlBbNnUbBuvMSqZzYTnlLecjJcxtTtTIkFaAfbZPSsxeEXVKkvpAqSsczZCRXPZsfFSPiIdYIOoijJyQiESkYFiIcFfGCcWAlKkRrujnXxxsSXOVaXxNnrlLOOemMmPyYMksSuxXENGmMPqQjJpIeZMmePpSgGsMscCuuopgGgGHhlbYwfXWyYddBbUFMmfiIEzZWdtRpPiIXIixfMLUcCPLlbBkJhZzGgrRHjSsUIihsPJLWYdMmozveLXxjJDdDVvhQoOqGRrjJmGIQYMMQqpPXxMmCyYNncYytRrKkUOoLltOoTumdDoOMTEeeWwmMWRItTibBKNmMrREenkNYeuUFEebuvHhnlLkJoOaYuyYUyACqlVvLWwZzQcklLhHKhVvHrRtNZzDCnNclsrRoSRpRHMmnNJjhrumMNImsFuwtpRLAwWsqQkcZCTVGgvoUoHhnNnfGWwvWunNgQsfbBFMvVyYncXgmjJKJJSqAouAaLlkKuUEeUAoOCvVDdBbcHhuHBtcTlwWLNpPnVxGgWIcSsCSuVvMFfmUZmVzIjJaySRvVJjeEIORrNnomMRJUuzOkKYhlGbPKkpUuQENneSsqjJkKfBbHVtpEekafCceEzZFYyEehgVScLYHhMmuKkRVvrUQqPpvSWBuUuMDjYBbeEuvOqHCpHhIoFenSeJjZHhzfFKkVbBgGkKejMUyeMaAJiwAfDWwSscZiIlLICciqQUuybyYJZzCcCfRVvpPdVvMmDZLHFfwkzZKYLYpdhetTKkELhHSOfECcYXFfxyezZBPmMwplLBtjpUuqVpPveMxsSchrRnVvFfazyYZzVvBqQZiIriEuIikdDdoODnlLAaCuUlFKZzkrlhogdDGVvJlTtPpXXWwQaAiIqxzmMGgGgZzZVvyYPpTtmMIWwtCMmcdDyYSsDIdDPpcCiLpzYyZQquDQqkKdtTGgkKUPlhHmzZBOoDfUufhHFJDqkQqHDJGgQEeNnlLgfrIwgNnGAofFZzeWwEMGxyYNLdfrlEpmMzZKkRrPeORrnBbSehHZrVvblryGCkfFxXtlLQqSYbRUhttTBLlbaMnCcNHPpqxWpPwXoOvmtAaOrmJjEvKkdkXxbByYKGgCHfFVEwbBWJjJhHOoGoYbMKmMIiOWwHMViIvmGgoOqQNnVLhHpPfRrvmMYyVJjvNnzraAdwfFkapPRdZzfkXXDdqQzZrRxrRJJoXXfhoONnwLmLlMJYoOqfpixXqQKkIibYyMbBmBgGIZzKkMPGgWrTtXoOikKPprrwWCuBVvzNyyYHNQbBzuUjJJcCmMjSsBCcdDbfuGgjGHUFyYtTPQvfEerdDYyDLAbBasSIDaAdiaCzBbeDgGdRrXjJxIijKmRiIrHhMYjMhCcsrRGRroOZzsJjwIiLlWSXJlLjcCxOKMmPYyKAadnNXxRrQQFfDdysGQqELFGFcCwWhHABbDoiUuUuIbBOtSsKKkyYIVPpNhHgGtKixoOqAxXaQFVvMmfFfsawINgQqxQqpAaYytEiBbIuUbZaAzBJqlqRSsDUudxXFfrQLQqQouTtzrRZaKkOsSUumMhHiDzeLGglgUuiInNGdDTtaAghMmHsaAyYSGTGgtEeyYNnbBgAaabBfrRFhyYrwmPpguUGdbpcCVPpqftTFBbbBPbBiWFfvuUbBMmyVvYzZDdlHhcylOTtoSluHhUhHPpLixWusOoYUECceUugfJiYydIinQqEelLzZikKAaICcNMUNZnNfiMmIMetTEmMmUnjpFfvpAHbBlSGpAaPgpqQXxYFfwDGnMmFfcaAiIxRZLxjuUOoxXeEJtBtYfhHSjMmpPJfqQTeOoFUZzbBJfFbBwWTtNioOIGCRcYyuPpUiIchKhNnuFpnNtUuMUoOiIuFfYyIiJjEUwWuIiqZEoOezIiHheoOlLGGzjRBRrpxWwXPBbxFfZzQXxuUMfFbLlrXkKQqxwGsSgWBbXKKcCcCLlJbBRlnTtGgCcHdtTdYyDAahHWtIcqEyrRXtNJjVMFyYlLfmCrVRrAAHhaHIiUumCCmeDddbPLsSefeZZzzERrFyYEtBgGBtPpzDqSvVsBIiCcYkZaENzkKLlEDttTFwMSDdsmWxrRGYyEeHpIiPbFopeemMEywWThqQdDaaSsAhHzFfokcvVVQEBzZbYIicCIiOQqqQTtELloqQssCuPpETtWyeEqXQXxKkZQqWvhHEeMltiIsebOoBRhpQqQUrRehlFfyYfpPTtNnFLHjJiIEnymWwtTMrLlQBbgDrjZwlLSsdaofwWuTVDCWtTWwIQqUOouzFzrRAaZtTwvNnXBbjJaAfZJjzpqORlUywBbdDIjOKtnNTWwkoQDsqvvRrwWGgDEedViCcxXIEwWTubBUcCGgCciuUZzIyYGqnNcXoOGgxCbweDdfvZBDdbVMmZzUlLaAuqaAvVkKsSQvgcUumaEewrbsKVRrvWwpPuUkOwWoSkIHxeDdFTbBWJFsSskFfygkKJXwWPFfynNFCHMRrFfFGfFDdtjJGYygsSxAaiIIaeEwWjAaakKZzBaCcKlDIMhgIoJjKkKPFTdDJqQdmzZwWEFfvaAmNnoWTdtkQPpbdMmSsxLsNFSsfgbTGgNnGgFfNvMHhaSUusSsHrKqYfFUdOoSxtYyrwDXxtlLlLwYNOoHdDOvKPpiIMYFpPBnNmTtaAdDFkRnYhskUuUXTkDNnvLlLpPHrRtjzZypZzGokKLSsAaHDLlrRBbPDxjJqQXXMmxQqYeEwWXAaxLlXHDaAXxGBbZGgzwTUQmMqDJjwCQqHhPpcWKlhHSldvfFkKpPmzZATFNnEdGVvgpPDOKAGgoURRnIhHpKuUjhrjJRZzHJEwnNcCtUuZYysIHhrRiCclMtMSsbczZlSsNVoOFbTFkhzZXpmFfiAPpZsaAYYlUTkkKvVZzfzjHhJhBbzzZZHOoxEQVvLLlqDdLqtTQSnGoZxXjJcSLlZzhEeenNmZsFifaWwfFEpVDdHHhCcAAaKeESkKWwspyYlBbVkKvqZzYyDXDJjhZSOcChHAONnXxoaVvmMFZzkKnNfrRbaUFgkKKjJLKLlLlkEeESLlDMoOmWwqPpgGCsSciYyCiIEemMUuerOoVvRrvYylCygGviIXxDdRViIbBprFJKCckjALVxjiiaAubXxrRgGtTBPplLsPpSsWuUOECrXxRjqeNwiIBbuUdDhHDdkKWnVpmMPpPedVvNoOnbMHhvvVoOVdkvVpONnoMNpPPpZpPOOooPpnNsaADoOdqYbhkGqtTtTQAasqQhHzjJBMjFwWTPpthHMwWuzbQqEojJjYyOoJJhgaAAbTDsqQeEXxvVfGgFepPbpPRIiuUrZzIrHoFfJqQLpWwdLGqcCQgYyTnmxwWsMwqQTDdtuNxXHPfnNlLFphiQqIAVvlLkRrKSsOOKqKOmMUuoTCRrcXxBfAaMRqrNtTvCcoJnEeMjJEFfftTHhFAsqrRFfsFDEjgGcCYSsyAhHkKanNqGCTqiIamMGgsOltTLOihHnaANIEQFfqekGgMGWiIZzwZTtOzZaAIiGpcCqQTtGgAaQSsREBbeGrCUucQqRXmWwChHqmRrMMyYKUusFYwWyvVffrRnJjJbBuzZwWbBxYyAacCrCsEeSkGuUMXEamvVYGgVMbBmvuUSshzZAQmMNxXnqwcCWDCcdacWwysSqrRQTtTBGENIiHhtSTOotnPxVVvHkKRrJNnrGcbBsfirzZHhlBetTEJnCejJsSeULtTHfFMmdDXvKpvVysSycCeEXsBbaAjwmEeMlQuUoORyYrfyYNnyLlJfinNISQqQqbeMPpmCYyVvCgkKvmMlNlLfFQCgBbYifFKvVcuXDWAtlqQFIWNqnNWoXbxXAbBZsEBbhpOoFfWYywFEoOeRhHdDxXDNMmdmMTtDvWhHCTKkWWZzuHFZzfjJdDjfFdOPpqQoeEAaDOaAkKoSsyXxUQqMVQZzqlLwrYXCcmLeEWwkTtjJKkHPwWphsolmyYqQpmMAafFMDdwWXQqYyxBbmOMsFfSmEexUdpNPmMPpNnKkCtfFOhLxXlHwGgvDkkKQKkJjkRlLJjcQZjJqZzwCcBbgGNzAyUuENbBRqeEmMFykkKjLlTrRiIXxwLtTCNUujxqrRQcRrbuUBsSoOXOpoQCcavXYymMZwnNmMdDRrUxQFfeyYDzthHPpTuUvVZzeEaPYImMiyGfuUomMKkbZRtSEeEescRDbESnNPpXURGgeEhsBNnAaJGjJgPlLznjiOmWuOJjNNTkKydDZzMeHhqVvWoOGsSgdeEfGgWlLhoOHRMmNrRcCUhHztDhfWPpZYdlLDrRUMmusSyVvGgnNWbBsFfSYuHeJYyjzZiIxXEsJjabbhHEeBCjvVitTOoaYQqSmMoOTtOosOohHDxXEeSzqNnNJQjtkKTqQGvVAXiiIgLgGlcCmMmhFIIiiqxKkKkXHhvLWpPwepPKkmMjJAtwWrRlLOovVMiCnNcMjRtNsSqKytwZzJOYyoxvvWKfFVEQqCZzceYyUuURWDdPpwWwqOogGrYFfSsERzdEpQRrqPhHDdWjDdJwbEFfeVcuUTtEeaaAqOyYedDdDeAaOoNpPbBnWiUuMLvTJGgxXjnnMmexXFxXfEkKZTtgGzOfFKkoSsYyAaBPYypeEbDdsSaYyysSYmSFfXAkKaxuUXlXxFfLhoOzZylwSlHPpbbMmBYDdKRrndRrDNyYkvVgIzeZzVbjJBaFfoaADdNaUuArEejetdDdSUgeEGxlLrxXRBZzCcbXAVoOvMmVkPmpPnNXxrRHZVgGkKeAtTNnjJmoQDqxXxXQzZoOmLrgLlBbGBbWBbBbbBlLuCkKcKOorRzZdDafIiOJjoiwrjJCoAaGrRAYyaJwWjwhKYyRrxpPUoNzZWwxpVIurgGZaEeJFXxrRfRVhHuUwWZPLLllzOidDIozBYtwWNnWvtTdQqDsSVuUwZtTStTNGgtYSOofFBFfeEMmPphaAvVHbDdClaAUuuDuUaAGgdDNnjJQOqQoqsSAzdkKjbBeEnKkNJDxfVvOoPpOHhoUuFSFffRUuvVOoxXrFkKFRrfQqOLlfYyFoOcbBCoAaqhjHAaAttTSbBgBaxXALffwNnZUuzhPHYcCWiIaAqAaYXxNsSsSSsoOsdDSBKqQYyastTmMScwWMDdshWLtzGeFfEukoOPckKmAoOZzqwlQBboOAaqTtiIJpHXJjxCqQtTVnNXxzZPULlpTtTtvqUZlLAagGzYAaLlJjLhHwWyWwYuDdUOZSsQqXaAxIiNnJjzCyYcXxyYLcXexzJtixXqQnNnNIUuIKgGIDdlaZlLBuQeEMmnNJjqHWdDwadbBDqgmRVvQoOsSveEoVvMyYmwWKjJJjkIiWwxXlabnNBswyYOoWkFfgGKTtLcvTOTtmnNPxgqQoOyyvyxCUuFUuWwCAdYAaOoQmMVvgGgGquUQqdRjJlLGgRrwxXZzExXeLIMmDdimOoJgGYaUunqQNNkaMmUuUfiIFgcCGSwMmKkWcEPJjkoFfmfbKgTtPvVpKXyYxSCcskcCKGgdDlecFvHbBGgGkKCcghhHBIflLFMHcZzCakKOoAJuCPLdDDPYyBdDbdJvbBlLIEXyVKojzVvFffytXxTRrRrgxBnNbboOBzZXuAaCcZcCBbzZoOzFsSFhhImwWMHTwgbBkxXIOklhHZzZcyhHYLFiIfEpPjbBJwWwWPppKOoKkszDdRrZzZSjGgyYyYOmJCcjMPpoFqQfIiHhKPJKkOICevVXBzZFDcgtkKjJEbByYdDcZQqMmZzdsOoSSyYrRCSsAYyDBbMPpmwzhHZWwWOZzDdTaAtPpIlLkKQqpPySfNfFRrtTnTtJjxVvXHIiFftTroemMJYEJjbZlpPLXKCHhIivHEELNnmdDFfUuqAvVMbKBkKfFesSbVvWMmRVvxXnnNwWNixybBzZYrRPpKBbkbBlVdNnDvyOoOVvoYcCnNaAuUTRrqQoOtuaYslLwzzZZsosVvSOoOYscWBHmMhSsCzZlCcLVPpQpPqvCWwAacwbBspLlPiIahaWwmNDjJUupPpLlQqPbpMmPBdHhcNGFfgDkKNWbBZxSsNnJkwOoGgtOZEeGZzgpeEPpYygPpRBbsSUuopPWwuIiJjdcCCcYqeEQyDEOoqQpnqPpPUDajJDdLlAdZzXxGgdDlaCSsclLlLfFvVzZoQpQqPJjKVWLlEfcjeSSsVokKSssSUHhusSKNnHwQqaGgAWYyTvVDSsdnNtMiImJjcUuClcOouUyYCKjJkjbBjJbBfaAuUFRrkKEIwBMmiBWqQwbOxiIXsSSRrKkwWsWwgGuaRrAFRZzrSsGgtTIPpiIQljJLVAavaAfFKzZpPQvAoqoWwHzZxXGjJgKkhBSYpPtTwFfPjJXxpWfFzEjkwWKMqqCMkYydDKkxYtTDdPBeXkwWKgNnDdGAaxmMEbBPwWpgGbIAGgDmMzZJCcWpLmxXMlPTbBUuLndDCyYTAPEJjeIipatTmMrgBXtTUqQuoOFtqQdDTnORrRreEQnybFnLHGgeEEKInNimyIiYuaAUQVvqtTqpPcXxCXgGxQTtCczGJjrROgGmMlLCcJjlLlLtxUGbBnNZsSzOokKLlsKkSgNEejcCwWbBkZzRsSrUurvVQaAhSsEXxdlLxXzZDeXxrYPReEukwWzZKEtTINTVzZBDdAabeUbBuwWYtTUuwlofJjbBaKcCTOoWDdZngGNOoaGhHgAXxtTJoDkKOKkrplLCgvVGgKknNOopPGUuXxeEpPjJPoMmYyOXxSuUlLBaAbhHsdzgbBBbvaXvlLUFfdDJjoMvVEeAamOdptTfCcJlzZGgpTfFMmAatIBbiRrPoOqJjYyQDQvHMYyApPSrRszZVvjGgJojJAarjMmIuUaAfgZzkKGJjWncaABbvqQVgQFAXajJpEePvvVVYvmMVMwbNCmwiTtckKCndDmMhVOUuicAwWaxWwSIiQiIqsXiIoORrAkKjddoORNnDdtRrhZzUuHARrVvvVnNcCfFmNnKdhHQCTGoqdDpmMMmeoPwDSnNHhsdElLetTVvnLiIZzlPaAVvsSXxiIuSvxXsSVsUkKsScRtvFfRrPpYyXWMmwxtBbXxdDTMmWwuhkKMFfmzdAaHbBrcCyYyYLEelRCcxXuUoPeEpKkGLJjGjiIfFWwJIiATlLtiHhtpifFsEKEekBdkOoKXKkjTtZLlzmdDMJjsSmCcMInauUYyAaAvtHhQqUuHhVNyNnqQYnBbVtTvEDdEeeaAbBJTBVvhHbJJjSSDdsYuUXxdDHhymPeEQNrRKkuUhnNVcCgGXxvWwwsPjhHvzZBVvAwbByQqJEeLlhoCuUmMYyckKcJjCmjJMVvOnNkNfFFNWwnLluUYyyiYyOoIgwWGPWwpPfbBaqQqDdQSBbqQJjzzSWwPPpINFDsSdfBbWwKgVvGIizZhcCzHTNnJTtjWwnNKkOuwnXFtTbzxBbtTXhHEeZuUHhXcCxWwapHrRfFUuwWfdDTjJAgGFfacurDwrRkiIAadDKOOWwoIiMuUAHhaXxjGeqQEdDvVgBbNQLliwWwWIzZXUuDrRdjJkKpPxyYvVGgYAGBbgwSWwGgdDsowKkXvVjkxIcCOxXBbrKkiIqqQgGlMJjmLlppgGjJRfSsQsSrRqIieiITtEcChzZHSbizWCcriypPYVvIpPYKkyVLRrcOQqWRVvIiHhkMmRbZzSsDJjSspxXuXdTtwrRNCmaAQqpQqaAwWPaAEexXPqkKeEKMnOoNmyYVvVsSpvBbgBHhTPvYZzylHhxXLRzZSgGKUxXuxXKJjcCDdxXtTXLLtQnNqNDdYynfwWFhuSsPpFfsSZzmxmKVyAiHAaOocCzRrchHCZhjJeEfFtuaYzZVlLvmMyaAyVYyPNRrSsEJxfFcNpPpPjJWwIJABlLxQSsaADbBXxdDyYdJQpPqbBUvVdDunTtNYPpGQOedDnNAcCYycbBxlYmMyLmMQqXjMyIiYPrRcAawWJsSUgGugGcCCcKAWQqEekVvKzyYZyYweZzhcZzCHZVvspEeeEXrRxlFLlfLcCutmYyLliWUuwIMJMmHyYUuhjMmJGDEedYyYyKkRrkKkYlLPpyRKZoOzkraOoGgLlAEFDdpPJzZKwlLWeEVvkmoXRrKkqQtgVQOgCcGoqElLNBiIKkeEjJKONnuUIizZbfMtzRrRjbBOooGsRrvVQqtiIqJjNnnBfaWwkIiGgkmMpKkPNdMmDJjORKoOwYZaKkrIiXDWtTwdaAJjEetRrdBbGZzKkYyCcgGvmMWwcRnMmpHhPQqrQLrAaRrozDDgGdSGgsvnaABogGOblLlZzyzZYLliPpHhOoUQzZuvVUltTFCAXZqQhBpPbeWZzDwWxXrRxXuUlLlEeQqtTwWLdYyyYESvVFfPpscuUCSxfjJmCcqnNMqVlFfLvQZTtYyzFzZRrXZzOXxorkGGgwKSskXDnNddDCcAaasAPxXpWwCrtYdDqSsKkQLlNnlsSLbBXxyEedDhuUHTYKLlnSWkKNndjRNnXeEUuxSatTAsnNDwWdbBCcCgGcjJuUBcCDYyJjdeHwhCJjcxmkKMXJQrRYyfFuUoOfYyZzRdDFfSWwTtfFMPpJUujxTtXmKPZzdDptXnNvVZPjoFfCygGYcdDLlcCKxCcXUuoLlNBbnONnNnJxrQxcCXbckKCSsAVaFOkKjoyYDWwYyxMyYsOYLlyhiIHmMoIibBOvVqQYNneEUuPpiITtvVvcCZzpYNnRrUkEebBKsxXStwWnNtUumMGgDeEbBcRZElNnLfFUuezcwWAJpoOPjJjoREexBlLbYkxTtmAaMmJsrRfbrRBwWyYwWHHvVTLmFfMiIVjJsOodLPSLBblsbCklLPKkpnuUCiISstWUuwXxTiowcCtTWTIjkKSsJGMmcwWCTPpeJiIvVFfsqOodvZzVynaAFfNYabBALlqQvzZVRrOEzZegBbZzUEeCcuRrCeiILxzIiZOomGgEeTtTtFawWALlftTtxbdIiUuCcjJWDfFTtrvVSsRdoOikKHhyYInNvUuViIwOoxrkKqQWClLcLmiIMlwDdRSsXZgAalLInMELsYKUutQnNWwdDWlLbBcpIsOoVvStTOkKoitTxXPtzouCLlZzcryVvfFTtJjqQoOMmEeXOCAaeEctTxLlXoBysSNBbnUkKIZBbfKkFznNAaSbTtiIzfFyYwWDNnVvdBYyOnIwWPtBbTpPCRrcDdpYDNndWwCobBOoDYydOiIVvLRrlxXkKtTtTtaVvAoOTDdRrzyYzFfZVdThhHHHhiyYVbeIiEBbiIxVvlKuijjJJIUdSTtsDJefFVvyYOdDrRASrRscCYyAwWalLIiIyYsGjZsSziryzZIsSUuZesxXveEAAaUuaADiwuDlGFfdgGDMmFfHhSsUQiLEelIgedDEtTYyeMKkKkwKkWLldDcwWCnNXXDdCEecyYoOFfAFuUfBEeoqQNnOZzRrbJEeJrRyLBwWTtMmfFHeEiIhyYYyppFhHXxZznVvfFeHhNnExXmHhGfFezZXxNngacCWwwWqDdDddDyYjJJHhjwWQtTciICzZuaAOZvhUuiIVvTtHYlLyhHtnNTaAlLVJETtOoevzwXxPbZIlmMeEoPYOorRnlzZCcLNHhyHhHMRrmkKDtTdhcvVChHjJSSspmOojdDSzrRrRUEeuHqQNchHCdhHxRbBijJIrXTtbBhUAaurRuYyjdgSsrRSsGMzZkuDdISsaiIFjDdTtJfAixXWfFQqwEeYSSJQqZIihHJkKZnNgZzGRrUhAzZaupPeEtTUfFJjxXEbdDPpJsKkSzZjMmBoOuIcCiUEDOvVdYyDkiKkKEekeEOoNtgGTnAaITNoOntLTttTlDdQVtTPpHhjJeEvqJjtTjJKmMrgqQDdzCFfcZVgZzCcKSsnDdLydDYlaAaqQqsSNxXnQpHhPRxXrAZzrmZzGvVJVIAaspjJMHhmPrRkWwtSsIiLKkodeEDJjOuSsSsMmIdDtTDAAaaBSsbdytOEfFJdrRQqOUuoKkhWbBmMdDlhHdeEMmDBbKkLcYrRDUudiIFwWTtfLlSsUgGhcCjFTgGtdDDOompPSsqQMdYBbyLlDdHhoLzUuZRrluuiIYeJjiItOtcfFCToDoOdjVGDdGgQqghHYnNyXZmMzlLPpXxkKkhHVBbkKLlsSooOMmmRrQqEerbRrUuUseESljIiMmJzppPGiduUDKTtiPpIkuUVcVvCvIbBNnasoOKQsSqkPgUpKkPRAiIcCaXVsSFffFgGKfyfFSYeEyLlsvvpPVUupPBjJGePkKMmpjJROlLobdDpPBrHhyhHEeAaiIuUYCcTFUufVvFfNfkKxxXHJjumMHZzhHhpPUBVvbuuqQhaAwWCcLlUVFAcCaNnuxqOoBbQnNXUVMmvpvoOsSIiOoZrRzxXqbBxXMtfFXxVhzxSsdQDdqhHPpxsSXDNgGnYylsSSHhsBbIRripCcpVENniMmIRrOoIdqyYNWwwWMmVhMeEeEmMmQqyvjJWevVJjeEEzVfFvZpPgeEGMmDFfBWwWXxTdDtwZzbJAayNJUYlLytTaAopdyyNtTXeExIHhiLltTkEewWoOKLlaAhGgHwAaWLlLLLllGgaxXlgGGgiOoIpSsaApYyPzZPLXaAqkuUwWKeEQxqQNSzZsIxXJlLjTtisSGdOoDKksWeEwUuLlSGgrxXRRVvzjJZrGgANnSsnfFcRcCWgGQvVNnqCcweXoOOoAaxEjaAjJlVEMmbBwkKWeEeMlYtsSvpPVLRrxXWmMTtdDtJxXjlLAaHhMmkWwrRKTwXxdDKiINnBnNWwbLlWQqsSeERqQVfFvryYKQqEefpPZQqJzDdzZEsxXYSERmbBMreJjnNnNfJbBYyjGgtThHRyYUuJjDdkKSspQqccCHmMhtTCYyLlFWwfPWwYuyAapjjyYJJCcPNnRrmMoPGgqnNTxXtvVhQqHhTtlLglLpPHhokKODdoZzOeEUuCcDdeMmTsSJRrHhjDdrhcmMCkKoOtaAquUQdDTwcLlCWSsHKDyYSyHhVvBbYiIcCgiIuyYHFfhmMUyaABboOVGgvYXbBxQqcKkAaCPpWgGmtHZzLrRlKtTxXakbBKpPjJgrJjRWwHhDSgeEhOcCmIiMBbDdXxFoOQbsuUpnrRpPNIoQqTDdtJMoOFZzwotTEeRGgNnrXxdDsPmSsMpRrfFGkAaGgetTEKhmWrRMmCcuSdDVMmXvZzcCVlXxwWkpAaDdPmKkqBbZBbxfFXzYQqIiKalqQTtLEeAPpdDLlkUUuXxGqQGgmOotTzZWwMWwlNGgnLlLlLvUuVogGPSsgbBGpOHhRXxrIfWwFiqSspPLlQqlSsOTtWZaAGdDgzkKFfpEeavXxCpPcrRyDdDdAcFlLWwoOIiBxJjTtNnNpTHmMbXAeEFVvgGMOoACGnNFfFfyYoOLmMlBcCgGZzrRCJjhiIHVvyYvVkKXNnBWRrxXnNwWDdwdDYyFfMmeqQEeEDdDdbZLlOoKkXxzoOWwhHJUpPcCYyltOJjoQqTtThdDHOGgkKoRrNGtiITSfcCsXxSHhCxXaAcfqQqQKkFfjhHwPpaAWCrRbBcEepPesSYyaTkKttTeELXeEFfOoxvDdyYVSqcCQsNniIKYUjOovtwWTYfFnDdqQgGjJZzEEqQebEkKrrXUuyHhYZUuKkzufFfFKrRkBHRrgxGgXqQGLlNnPpltTaAPMnNBbUeEOouEeJwWjeEmcCJjlLzStTsTXxfFtDHVvKsepCcWwIiuqNnnKxXLlheEbByYHvVkpdDTajJXxIuUUESseCckKiIBuUbOoKNEelLbZzcCYyYuUzZDdKkzZOorQNYOYMmLJjlyGurjjaAJJRfGgCcoOPIipPLlCctqLXhHCciJjIxxXqQeZzEurRUOoxXYoOyYPpLlzgtTZzGZypPlvrRfjJXGgEeJdDjVMIimvwWdjJDAarRqQGgntTNMmcISXlLrjJxXRKkBbvClcCLcVFfXxFXsSTtjSsIVvhPpuUHiJqLxXaDdAtTEeeqQoEQqeZzVviIVaAaAvcCOBiIbTSelvEdDYyhoOHjJphHPLlsbBSxAaqQgxXyYKMmkGHDdhcpPVvCXiICcVgpPGtTSspojNnVvjIrnNpBQqbNVCoOVtTvbUafFdDAueEWwBYDdYyyHUuhXxtKkYVvefFUuYPmMpyENkKxXHQqhHhoOnMtTVYyvCcIsSMctLZzsdDSDdHhHOXxOoAQqaoSsdDKknhjhiImXKEeHuVyYvEepPYCjJMtTPZdAaDMmzIijCcgGJLfFlRsSHyMlLWwCcoOBbRAcCaYXxAayNnrmnOoNHhSsBbYhXFfOiIMmqQopPIfjPdDbuHEOoUvPpHhVLyYlrRujJUrRKkRrGgOotGPmMrRpgeEUwWDdQqxXTtZzmNNrjZWwztpZmMzPHIiYyAPpaSshAPpxXKkakKuUTsDdcbBCLMvVmlmpPMoTtOZVHhtLlrfDzZTUNnWCchBqbBbBQbmMbBwsYySLFflWOowWaADdQqsgSwWsGcCSSsHyYeEDdckKCYBbyDrKkRtTWUuwIBRhYySnNsbBiIAaBYYyTWwFftEwnNWEeZzveaAEVeUuzMiIiHFfjJpMmqZzQxXxXBHhbPDjJdHhpOoPUuYQqyWwUuhMSsmaFeEGaAgfvVBMmbNnNOXxonqSsLlTtTjJtTtdDpPcVvRrQqxmofPpDkNnLoOlKaAhHiIHGghwWERrenNCcryuDdUkdsSoQJjVveEggscCSGGqmrDdRMaDddMmDZzAcCSsdeEnNUueowWPpNnhOokKsSLlLbtJwWPpoOjiIXdLlEeHhByVvPpAapgGMhHRrWwoOMmUupNPpZWwznPLlRrxXIilLPpdDJjPeLlpTtPEsQqSzZtTRrLLlTnNtdJjvFfVPpEkKSsEeoOyjJYbBbvdDZGgJnAalLYyNVvZiQqEeRrCNHhncysSYmMPpHhnHhNnNlyYZjJQfFCcZzVPpGgvdnNKkDjCchHVoOLsnwWNSoOIiCcJaAdyecCEYDgiIGxiIHIrdDlLQqqcCQogKkGVvWwjJaATtOKkouUOooOcCXxlRVvvVrveRNkKngGrtTEiIDdXxaATNtHheETqQbgGBnbBtZzQWqBbUXHhxcCuQqQHjJhgZzcLGghHlChUPpuUuIMBbmiFfHraAavVBbsDdwWSzXxlLKkZgTtUuGwWzZHIjJihAkkKKSqQXQqqQXCcGgxvVyvsSVYHhMmKVvshHSQHhSsxXOeExXoxhHDbBdnyZzYzsdDSZNZRHhEerlAaLrKkKkrRZziMmESQqsekzTtZWiIwKkmMfFxtQhzZHqTXRUKYMoGnkKNTJRrtTbBQqPXxnHhNpkcZzDdCuUyJjYyDdfFLfcCKVvoOkFAaFkxXKoOfVveTwWgGoOkiIKYyrhHRCcaAacCAUuFJVCSscRqQrvWtTPpwEekBbiIKjfhHPuWwUFfvrRVfFPufFUhHdrsSRXxcCpRtcCKbByYnNhVviNpPnImMHzZrkkYyDdLBNnbKfFpPIiVviIKkBgEeGbyQLlKsSkgGBUubqsSbBpXQjLlXxJQOVvolLqTtqmMHKkhbCcAaBkKjJKkKkKkbFfoOBkvVfFjJjVoOKDdeDXxdEYyORrLmMlhNnqQvzZOoIiVcqEeIaAtTiZzQrRvVQqNFfnWuUyYwDdCSJjfiIFPIigRrGXxEUxXiIuiIkEeFfWwNnKlLeWSswjJASswWbBvVRrpOoSvTtfQLAagSNnMFGgyYRrfgGmszfFGgZGvQjlLJdDZzVRzbJYRpPrrROotJjTyOoqZkKzQSsaAUuXsBbSxdDjOiIodOGtTvVMmDWwlVvLmMdDdFfgAusVvdDaAFOoXaAxvzDdWwZZzwWLkYiIiIyxXMmzZFfyYBqQgGbNBDpPiIdbUxXuNnOoFQqdCcqQDsSniINulLaIfFzZiGgMmgzZEeTrurRvIiRrZqQztTUuizZdDwWnPpNjJzfFmMZRyzZuUORroStTlLUuoOsvVIinNJqQiIGuhkKpPKWwGRrgkEDdemDMmYyKkAaZoOsKkEeShHWwiIHyPpsSYGiIhHgTGgZaYyAzwWeEtrRhuUPwXxtTOoWpbBwZztrRfFCqQBbXxcTttnNOpHKkHhjJrRrRhiIuXOoxqQRTtCtTdFfKkDcsLlnNSWbBoSsOQtTwWwWdDaYIiyAqQqMmxdDaAeETtoqQOXwWuUaALcCNiVEebBHwWbhHGJjggGDdGhHgeiSFfsGdVvZzDgICZzNncsSfFCCccoiIAaFfnGgNOboKrRkmsYGgcCmMnNKkWwySxXRrzdDZJjPpbBlLhHMRJdDUutTepGgoOPEbyYBVCaAvVsScPgGpzxXqQsxXaAtnNoYyOuHhqaAASsaHhMmwWiIaEyYeAKTKkaAtkuUSsmMoOCcZmMaAgAayYGzyYKLlgGwttTCcTkKJBbtTgabBAWwoDSuUhHrRsBbFSCcsbhhHHpPhdDHnNWwufFUsDZzHhFfvVHhhaADGgiImAaPpnNrRfxXWXxwFfqQeVvsJjSqQGgFmMCcmmMOoqQpPFznNZCzmzZGgMtTteYAxXMEeFPpfzuUpiIGgKkPkKpPhHkFfKZBtVvnNbBTAaRrgZztUtTuSsTQqtfFeEYuhmMHyWlLSswYBbiIVTtgPpGvVFfbAaBjuUWvVuUwwIiIlOoiICcaApPLlGHhgCJdfFDLlAaAajZaAzcLLllDpPpPdPplStTpPsDRrNndPpmMLXxEeYyhHLmbCRrTdDFSsyYWwfPpnMmUuNCcIitRrbbBBOorRzZbBIiuwtTWLlrRUFfSbZzBiICHPpUuhufFoOJTtjTtegDdGdDEDdUUuiuUtTIimcCMgGPnwOoWNmMjJpIgGdDwWsNniIKkUuSXxrRBXxjJbcCFEefQqFLfYyFlxXVvOoNnsSfeQqPpyGgYEBKkrRbcXxcCOpPoGVNnxXgrRGKkgGvbBPpWwOFfDCcqQdAaryYRhHrRyYJjhHocMmCxgeEnNEeGwWnDdYjJgGyNXoOmMGhHgFfEekKkKPpHhRLrRLllrgRruxXUTtKkGvVUIiuFVvWwlfFcCaegGEiIbBAlLYpQqPyEeuOocCxXUHhLMmmPpbBMgVAOoQqdfFDkmqQnNMQqZmMFfgGbaASsIzZiUuJjJAajExXRrecCoOBAaYdDMmMmyphPpHhVhWuUwHOovaIigGAYyEeAiIaOAaMmofFjRylLYNnrJHqQtZzJjidDIIoOiqQIiTEZzEzZezZbBJjZzNnUPHhlLqQcCpumbkKBDdMRrBFfbePgGlLHhbEejJLlJjHfFLlhDIiwaAUuWofYyFNnDdOwlLWDtTdqQQuMpPmkLlTfFZztKQXxwWyYCSsqQcKzZPtTprvVyYRVdDvfFdDktuUTqoEgGaAxXZzTteOUNnbVvtIiTBuoVvjJOnNUgAaGcCVnMmNHYyhVvvfFuuXxeeXxEETtQqTQqtUUuUAaLlgGvPpeEUQquVkhHeUFfuZeEzCciIEXzZxeQPpFfSTtaxHhXMpPmsSrRgGXZVvHBbhzxkBbBbdXxDnNsSYyXxOotwWTEuUeDduvVBbKkgYyGDdkPDSsdpCcjJbUutjJTCcBKeQqECcsXJjxSUbBuSMhHOomcCsRrPSspIQqoCcObBuUikKHhUwWHhfDdCfFPpcXxsSjUDdrRudDBWxRrXwFfbdDJjjJxXwWwXxfFWtTJNVvPpjfYySsCcFdAAkKaasSNnDkKPpQhHqqBbVpPvxXuUztTZAaLlhIdDwWiEeHQXxjmYCcyRrMJtTDdhcCHoMmOLlJuUrROoZzvLlJjQqVUDgGhZzgGYylLHvFfVRrzZhaAzqQOodDZwWcCHYyIQlNnLcCTtJIBbkKijgTpkURruKLxXIilkYyIigGJjKEenNWBbmMPLlpwDdnNPfFtPaqQoXxOBbAvVbZzccCSsCBVvUuKkZiILlkohHzZOaAVvmMPpoOKjJrpPRBbvVWRrMmGgwQHhqekKEGgFCaAcRrSYykKsDxXMmTtBbFfdmIUeEuUGgupPCcDdLKklUuhHJwWVvfEeEMmiIeFrRDtezZETVvgGXyYxQqRUxBbECcvVeuIinNnPAapNRrchHCaAMmURrBbkIuUiOFfoKLltTLeKkghHGEwWlqUuQeENnxtTXirhRAaWjJwrHRCckUGgdDuRrpPbBKYXxyqQzqQZcEeJcEeCjxaAXdSsDChBbpSsPlLBLltTFNngGfaAbHEevlLVKkdDStbWwCcQqsSBtTXxjJSslaSsALnqQRrNTHMmhKIiqGgXiIxzlLvVZlLgRrGQrDcCdRkDRrdBbNTtnNnhHsisjJSMmQqtFfjJVvToNnOzFfZhHTjJkKttTnNDVyGToOlLQqtgXxnNYvbBbBdlLoOxXqQYyqLlOrRoQiGgkKTtQmMqIIBbOoSXxjzZKkJsICCcNnnNcTtlfFWwLjJyYOoYMXxmyQqFfCcMOTtyYoQjVvbBJTtpPqQzhHZzbmMFgEepTtPGjLliIJFffcCMmCcBZuUqhHtpyYOPpJlLwWdlLDIiQqjByYbLlLAaYVvyUuEeRFmMfrJrRiIFKkfHhjeUuEJiIjEIqQkKbBiyYOoecCeEkKAnNtTJjyQqRrYafFlZQqzQqGSsaACcEwGgWnNeTQqtjJLzZIilvpwWPiWwIVIkKxAafFXPpOoTtjXxJUusSiQFfqvIiVgYdiIDBbigGIHhiIGgSsRryZHhqQBbzDZzdxXPptTNInBvVbNiEenVnNiZziIlLIvzZxXYuUcCyJjqQPeErRpaAcPpCtTTvVtFfDdjKkuUbHhBPGgpJYoOyhHYYypPysJjxHhXSpPBZqQzDTtdboOtTiSmMwWTtvVsZzIaAlLYZzVvcBbmYNnyWwXxMpmcCTtMqQPxsaYyAlLcClBbDdLgGQqkKPpjJDdyJjYkVmMvLlKIipPSjJKkWwmMKkgmAabBmKZzkdDMHbBMOoCcxXmheEMvVGHhsGgSDdjmgGaAMJbBrWwLKjJkQyYEePpQVvGgTtAbBaqqRGgrqQFfeEWMmodDOjJTmPpMtRbfFsqQSlLCcBrvVMJjUbXxjJzkkKKlLZuUBuvVmmcYyYyCzZLhdDHlJxXHhYyBbMPpmkaAOZzFfzZoJjKrRpPrRwWkKjkKuUqQsSSsUuQqfFnNnNaWwWwqQQqxXYoOVNnvyAsKkCcShHjJspPQfFqXxbbsSBAaBSdfFLlLlytCcTYDqTtVvRrRrZzQIipdDUuMbBiImPbYcCMmywTtWuKkvVfFFftTUBpTtPyYqqQDdZzsSlLQnNCcOGIiMmdDgNnhmXxMjJyYHyYyDJjwWAaRrdNnnNYuUqQDdDBbNndgxGgIkKiXyYGnyYFfzPCcZbBzpZOozZpPJjMmgMrvUUuuVRUuLlmxYyfFYyJjBbCcXIihpPAoOjJjVvJEeaHhHUuZUxXuzDdqQtgGcuyYUCTbBBbCmhjJdDeEHMcEqQefFGoONTxWwyYXFOoftcCrDdRhHHhPLdDKGgVvkmMlLCcSXLlOpPoxnNjrRJsfFYyAalRoOrLlcClLHhpWwJjsSOoj diff --git a/inputs/5_test.txt b/inputs/5_test.txt new file mode 100644 index 0000000..8637b35 --- /dev/null +++ b/inputs/5_test.txt @@ -0,0 +1 @@ +dabAcCaCBAcCcaDA diff --git a/src/day5.rs b/src/day5.rs new file mode 100644 index 0000000..89192db --- /dev/null +++ b/src/day5.rs @@ -0,0 +1,70 @@ +extern crate regex; + +use std::error::Error; +use std::fs::File; +use std::io::{BufRead, BufReader}; + +use regex::Regex; + +const INPUT: &str = "inputs/5.txt"; + +pub fn solve_part1() -> Result> { + let polymer = read_polymer(INPUT)?; + Ok(reduce_polymer_completely(polymer).len()) +} + +fn read_polymer(filename: &str) -> Result> { + let file = File::open(filename)?; + let polymer = BufReader::new(file).lines().next().unwrap_or(Ok("".to_string())); + Ok(polymer?) +} + +fn reduce_polymer(polymer: &String) -> String { + lazy_static! { + static ref REACTING_UNITS: Regex = Regex::new(concat!( + r"aA|bB|cC|dD|eE|fF|gG|hH|iI|jJ|kK|lL|mM|nN|", + r"oO|pP|qQ|rR|sS|tT|uU|vV|wW|xX|yY|zZ|", + r"Aa|Bb|Cc|Dd|Ee|Ff|Gg|Hh|Ii|Jj|Kk|Ll|Mm|Nn|", + r"Oo|Pp|Qq|Rr|Ss|Tt|Uu|Vv|Ww|Xx|Yy|Zz")).unwrap(); + } + REACTING_UNITS.replace_all(&polymer, "").to_string() +} + +fn reduce_polymer_completely(polymer: String) -> String { + let reduced = reduce_polymer(&polymer); + if reduced == polymer { + reduced + } else { + reduce_polymer_completely(reduced) + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + const TEST_INPUT: &str = "inputs/5_test.txt"; + + #[test] + fn reduces_polymer() { + assert_eq!(reduce_polymer(&"aA".to_string()), ""); + assert_eq!(reduce_polymer(&"aAbB".to_string()), ""); + assert_eq!(reduce_polymer(&"aAfgbB".to_string()), "fg"); + assert_eq!(reduce_polymer(&"abAB".to_string()), "abAB"); + assert_eq!(reduce_polymer(&"aabAAB".to_string()), "aabAAB"); + assert_eq!(reduce_polymer(&"dabAcCaCBAcCcaDA".to_string()), "dabAaCBAcaDA"); + assert_eq!(reduce_polymer(&"dabAaCBAcCcaDA".to_string()), "dabCBAcaDA"); + assert_eq!(reduce_polymer(&"dabCBAcCcaDA".to_string()), "dabCBAcaDA"); + } + + #[test] + fn reduces_polymer_completely() { + assert_eq!(reduce_polymer_completely("dabAcCaCBAcCcaDA".to_string()), "dabCBAcaDA"); + } + + #[test] + fn reads_polymer() { + assert_eq!(read_polymer(TEST_INPUT).unwrap(), "dabAcCaCBAcCcaDA"); + } +} diff --git a/src/main.rs b/src/main.rs index 3694610..bce7b06 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,11 @@ +#[macro_use] +extern crate lazy_static; + mod day1; mod day2; mod day3; mod day4; +mod day5; fn main() { println!("Day 1:"); @@ -16,4 +20,6 @@ fn main() { println!("Day 4:"); println!("{}", day4::solve_part1().unwrap()); println!("{}", day4::solve_part2().unwrap()); + println!("Day 5:"); + println!("{}", day5::solve_part1().unwrap()); }