From 75d28683cf5933b969cd6609706eb5849e3963a3 Mon Sep 17 00:00:00 2001 From: Neil Smith Date: Wed, 5 Dec 2018 13:37:56 +0000 Subject: [PATCH] Day 5 --- advent-of-code.cabal | 8 ++- data/advent05.txt | 1 + problems/day05.html | 148 +++++++++++++++++++++++++++++++++++++++ src/advent05/advent05.hs | 53 ++++++++++++++ 4 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 data/advent05.txt create mode 100644 problems/day05.html create mode 100644 src/advent05/advent05.hs diff --git a/advent-of-code.cabal b/advent-of-code.cabal index 0461b7d..9196505 100644 --- a/advent-of-code.cabal +++ b/advent-of-code.cabal @@ -51,4 +51,10 @@ executable advent04 , text , megaparsec , time - , containers \ No newline at end of file + , containers + +executable advent05 + hs-source-dirs: src/advent05 + main-is: advent05.hs + default-language: Haskell2010 + build-depends: base >= 4.7 && < 5 diff --git a/data/advent05.txt b/data/advent05.txt new file mode 100644 index 0000000..2ed4826 --- /dev/null +++ b/data/advent05.txt @@ -0,0 +1 @@ +YyjJNnYyLlaEXxejJUMmwWUCcrRuuPZzRXxvVrpPEewWMmuUqBbvVQsSjJqhHQVvjJqGgLlzWwfFZJPpiIjliIXxLtTYyoiZzIOQkKuIDdifFEeiIuUQJjqMmUQqiIZzTWcCwtwxXWnNuUUukhHKMmpGgbBffFFfOosgyYGSCcFUuACzZcAeEaOdDdYytTjJKkiHhILlDKdLlLjJgGQqlDSskccCSsCNDddDLlpeEPIixpPXwWLlQqlLUGguWsSozZVTtbBLyYlvXxFfVnNhHfjJsAaSlLyYCcGgdDYfFpPyYNnyGQqgYyvVFIEezZotTObBDZzDddiOpPoOoRIirHaAWwhvVxGgXvSCcqQssScCuUgGjTteEhHJlLHRrhHHhhJjAaHhAYyVvpMmPaLlkKDOXxofmMFlLwWwWdYyOwrRmMDdUWwrRUudEenNZzpPkKDuBbpPsSonDdWwPpNXxOyNzrRhHSsMmZADwWdawWwWnJjTtGgYPptwiIWTfsSJjGgEbBKkkKevVbBPpFCcUxXbBVvmMbBhHmMdDYrRyyGgYnNtUudXxDeETJWwjtPpmMTlLXxvBhHbVAaefFdDeEXxnNSsYWwykEfFecCxXJjKyLlHhYLlcCLlERAiIhPpHaUunvVTtNgGjJVvlLpPDdWiJjUudDZzIMmqQpLCcdDlvHhVzDdPpZzuWwUZwwWWUumMoeEOnNcCHFcCbBfaAIihjJPwgGBbRrRKktjYyJsFlLrRSsfSNnRrlLAajaAJhHTRrbBCGgcDvVdiIzZkKRrrXWVvwxevtTGgMmVeUubfFBuUQqEeEaAEeQhJjlaALPpHiIqKkQqHUueWvlLVwExgGXxXhEeErmMmQXxqgKwiILlZzqWwzZCnNcQlLLQqlWOokViIgGggGcCGGgGlNnQqLgyAaIiYdDvASspFfPtSsTJjaeETtvVpPUQquDdOoMlkKGgLwWfUtTCcuFmrNnRGDNniICcCmMoOcKuHhUkjFfJdmMfFyGZzgYmsSDdMdDreEDdRBoOAacCpbBPYAaRrMmybWwDoOiIBbEvVgzZGedDMmsIiSqQlLYPpyZzJjYyviIsKGgkSVtTXxdPWwEepJjAcrkKyYuCyYcyRrRrYhrReEHiIlbMmBKkaWwAeEkKOPpoyYjJjJLMdDmMvBbjJnNqevVqQEXIiwWxqQMlLmfFVvFfQNnVkxXKmVIivJjhCcwWTtlrRLAIiaLiIrRCYfFaAycoOlCcDyYuUWwuUdjQqoMHhlLmjJOByAaYBbpPbcCJfQqWwFHxXOoiWwUuITcCtMBbaAlLUuhHmlLxXUHhfbBcCkKWDdQIidDAaqwFQqEedRrIiNnDQqRsSClLlWZzwLYywWzLlNCcMmnZbBYJjyIwWiMJeEPPppzbDdhIiHBZjbBoOLAalvVMxmMXmzZIiNnmkKxXxXtTZxPpXZeEiIjJzsSolLzZOzJjwZzQqwIiWRrwfFIiWvmNnMVoPWwpfFAaDdOWYytTXxrRZzuUdxXDMmZErXxVvRemMzlZzLrRTgGtQGWgGkKwgafvVFQqiIvgPpGVnGmMCclLhHbBgPpNZzlLTVzZvtMjsSORroJmFfIiBqnXFAHhaWwfEePXsSxFfpqdOorBbmMXxCcTIilLCXxgGRkrcvClLXmMxloOLqKfJjeIidDEiIFGgaAhHkQCtTUUuuYytTFfcajJkKTFftmeEMeEXxSsAtTkKckdDaApPtTpPKedDEzZTGgDBYyKPpkbZgcuUdDCrRGcCPpzdpRrQqPQrRqCiiImLrRldDMIzZxXULnNPplHJjhuDdXxcNQXxqtGgkKTMssSSVvnSsNeEvVmYyZzpPZJXxjnNzreGgVUZzuvsLldDSwdDnNWApPaEZznFfDdpPbBPpNtTPpnyYNGNniNnsSIiJjZzsSZIiGgIiEeknNKCjtTiIxXJDdYyciIzPppoOvVPIjJuUaAbBGIizZgfwWNMmnNoOhieEIdDHlTtLndCcDQqWwFYyRrMmvHhHhSsEPpeVgyYRCcTRrtDddiINnNXxnIoOkKcCAaDdiIeFfsSfFCUPaApuzgGZCcUuAblLBkqQPzZyxXYpEeAaPpPpYVvaAHhpQqPBuzZvVUbdDRryfFYyXxdDGtuUeYMmyRrGUuhHkKgRrPyYKkpxtTBbtThEDdXxkKeHXyvVGgBqQbwWYNnhHISsraARLlHHWgGQTtqwhhizZEWwgGTGGgfFjJVhHvBbfBbFfUuQqFtTvVoOoOXxnNIFfGgwWpIiXyYhHxPAiIZzavVpPiTcCFfZsSztXBbqwWmSsDdMQYyqQYkKeEuFOofUiIcCpYyrBbTtUuRCrRcKcCkPwdDWfBbhSaAsSsRrHFFQqBbfdDjkxXKwWoOYyckKCqQHaAhawWcNngGCNnArnkWMmwKMZzmMIOoiqQDdxXBIXxibyYpPmgFvVrVvRRrrTtRYyrRVvYYyJjMmSsDdZzPsSNnXuUxpHhyBbWwAnNafqQGYyZbBIyYAsSaKWwIigGCcxXGgcCMtTnvVPpfFNTtbBmCJjVvZAaiIzfFcPNHFfyYrwfFwWWRCcpPaLLpPlkKlhAaeEMWvVuUzZCJjvVcHQqjJEiIpPbBehkKwmlLsbrUIiKkeEuBbRzuBbLlexXEmdDMggGaAXxgnNGGgbTyYJjmMtEeBPmdhHDbIiuIiCcUBNnbBFfpPMfFVvpGQxXNnqZzYydpPDeEoOnXxNUxFfJjTCcuaAUNnCcKkpLvVJjljJrDdGgRxCcXpPacCqlLZwWnNzChHvVzZcUUuxXAatTCcuxXrRNUuzhHxXCcdDTdDtBbDdiIyYhHFfZNUuJmMeEjGJMmjdDwWgGIiVvSsAYGgyWwjJabBgkKaZqQzAiIXxoroIijJCTtPFvVPpfpclkKLKdDSdkKpPcCDIiUuUXMmiILGglUuQAadXxDqAuUyYBbwWaWwIOiIRrnNwWaGgAozZXgGgGxXxKPfyYFPpYteETyeTtPpEFNLlnbBavVANRvVrnkKjJlcCLMmXaAxYmuUZyYzXxMyLlLzZlfFfSBbtThgGARraAoOaxXHjJtTyYjjZzJjJJsuyYNnVEeveAagAaYyGENnoObAvNnVEIBjdDJDdbWwgGiSVvuoOUsmKkbKrRWwGiIpZQhHqzuUgGMmxkKhsSHfFXHylLzXxWwHhZklLKSMmskjCcJKpvVJuOoUWwPJRZzrjDdFlLXAamRrMrRzOJrRjjJSstTjzgGZJUlLuXVviINnWZzwjRpPBbkKrNnqLlQJDzZdlLWwIiiIaZzAyYxINnSstTinlLxbBiyDdUuiPpWdDwIMmRsSvsSZzCcIzZihbBgiTtIzZGnqQOWJjVvmMwEOoezjgOoWwGqQBDdbdDZPpTttCFfgGcgNnGjJAhHaTHhkrRVvIihHKzTGgtUuJxXnNkKEeBbMBbmSsxfFXCcZvVztTacCAIiEeQrldDfXxFzZLRBbHhqpPYypPVxIzZiNnUuoOnNqQXdnoORrNPpBbtiQqlLmMvVlLyYqQLlVvqwgGrzZRCcFfJEexXOojhHWQQiyYIdDJDaAdiIhHvRrVjyoOYdTwWTRrwWVvfYyrQqDdRFttTsAaBDwWwgGWziIZvlLVdZzIfFxbqQmMBXilLtTbcqQVQqvkYgGykKKaACXVJWwjDdPSsprRjJzIrEeRiaUuAfFoOEehtXRrxTlLHcXxxEefzZFJjXCLleEuLycJjiIxXBBbbCEeOowWSUusgJjKkGSsQqEvfFVerRpmMPeEJuUjSeEaAbBeEstTUsSipPpSsVTtEevPIkLAavVqQlKzaAZcAUuZzWwWwzEeDQqdflLYygGcCFFfZfFRGgrESXxdDszZgIiGrRsSyleELmMSGgsYzrRePeEhHAapTtgGEXxFffWwOKkVTnNbzZBAatvVTbBtvHlSsLhTrRtaAoOZfFzgGgcCGoHFfjJyYhdkKDFfFfGnvVNgAahTtEeHuRrEWweQFfqUFhHihHNnFfjJZzGgIfZwWmuUMzVvFZUucCvVQWwGgSsuUsWwdCcRrKWxXMfFmwWbBTzZucMmCnaAQiIqjZJLvVCwWqiIyYXxNnxXxXZULluznNaqQTtYuLlUzZiIFfJChEeUzZuqQOoaJfFgfcCFBJjbRrGHvVhKxXkjyYQqsSvAaWweFfbpeKkEPBZXHhxzVvCaAcEUxXlLUubjpPpYYyTtVAavAaprSGgjOTtoaAJdDYdQqDIcCiwKGgeEJjxLlKKkkkKDAaVvuaAjJshHEeXsSzZxoJjTPkKpzZtdhHDoBvLlVliILCcLpFfBKkbPlxpcnNuPpaAUBbCZWwJjXxpPpTuPpHhULltEeAaPOojJxXYydMmKwQEeqUuWYOocCYyOoHhyMEekdIiQqiTtbBAaIWcCXxNnfFsShHEeyrRYwOorRhBbJNnjxXYWFfwmMehsSKAakJsNnSQTkuUKDdEerfsSFBMmzZiIGglLLxXlGgupPUPpDdnxXHhbBNbBbRbVvVvBpPBbpKizBbZUcBbxuKkUfFXYybBYeEyUuUueEEeCeERruIaAuUBbdHhmMDofFfWwFyYOGgxVTtvXkBbsSPPpnNfFmQSOossSqqQjJoOesSlLEMlLRreEPvTtVSsdDpOOoocCGgTAatusgGSJWwHXxRJjrEetsoOBbSoOmrqXxzZOQqoLlOHhoAapTNntPOypPuKDDddkshHzaAaUCugGUcgGAaLlXxBbNnXxivVCcIlLlTtLvKkIiWwEecFzCcZfvVdZzutTUSsDUuCazAaJjZUuAVEbXxBqQTttTnNtTKZzkdDWoBbOwNUFfunEerRLlhHsSHhyjJYoQqMmUubqkkZzKDdUVvNkYybBEeHhKlLklGgLKnlzeEdXxnNyYSsnnNQqlTtaATtCcBbWwLIGgiPdDgGpfFOoePOopEOtgGaPbtThHBPaxXAZDdSszdDnRQqrcpuYyHhUPsPpnNwWEeQqSojiIJeZpLAaTPpcCtzxQqvbDGgdBnNDdbUPpujVXHhILlixVvDUuoOlTtzDdZLZPpoOzDdFfecLnlLOwWopPcCJjrRkiInNKNkKJbBGiIgjwwmMNnbBwIPpimMKkJjqQTIiaAGVvDwWdkKPMmpdDXIixhiTAafFtsbBSazZVWjJFWwfoTtEvVMsLlGQdDrRqxXVvgSBbiXxjJyRrYkKwWLloNSWwpLlPsQHhqnmMdKkoOXsSiIwWfFsXqQxZzRrkgHPpnYyofFdBbDXxuYCcyUwWZJdDjzNnOsSfEeyIibAaBeQJAajZlfGgFhvVHpPyJjOpPWwMmRlLAWKktVvTwaEepProiIBdSsDroOLGnNglXxRrpPtTsSWgGwMbBbBnNnmMbXBbrklLKRLrRoOEeBbGAeEagPjlLFCcfWYYsHvVIWuUwrrRDmMQvrWCoOIoOizoOZcQaAqsuUuzZULlUuSTtlLscCXxuUEeoOhXRrhrRVvcCMNregBbGCckCcWwybBzQqDdMmLOolLlvkEeKBmMTNntDUcmMNPcCpncUbBLluCboOBMXxmTyYLtTltCXpQTtjcCcozmMZrROeEdvVfFBblUuPpDdXCcxqgQqPPpscCShHpeEvtTHlLyAfsSBbFaYyYMMmcCrRvVajJdrRRGgrDJjAOoVvtEejJTBbFfwAaWmaAMmmMjJhpPSsCcsSmSsBbqQmHhMMHaYyYyIVvIkgGKNnikWsZzngTtGNvVmEeHhvemMEtTovVmMvdhHRrRrgGkWwNnBbKOopPDpPkKVOopcCYyPoONnaAvVxXOqQVPgGpthHemaAMqDdQEkKeEOCnLlrRsSyMmnXxzqQZozZOCcFoDjJderfFzJvpPgaAtWCcwRXxTtrEggBfIizZkKVvFMrRnRreOGRrgoEOYyosSvGljAaJvCcIYyTtcFGgPppPGggGuaAUTFftnHAagGKRzwWZpPrmMmanqQNgvVdgGDMmGtLlhHTLlUbgGBCcKlLKyYLlqQkkYyaAhkKHdDNbBnuUKIrRiQEevVRGCcQJjxXqgmMQmWtHhzvkbSkErReoOKlLiIsusSKkeEuXxhHUhHUaAyNnJdDrNfFnRMsgGEYyeqwWIiIOoTtidDCNncAaVvLlBjyYbBnNnaANdDhHDqQdNxkKYyXulLsSCZZcCzEPpiIezqNLlnZzZCczKkpaOoqQAqTKkboDtTdwWOBYPpyloZzhHVHhvhHIiqAaZdDqQIicCSFfTtXxwcmMCWgXxiIGsjziDdJjIJjJaAjUuXvVRQNnZKssSSHkKGgpDdHhLlPTtBbiIaAHhlLtTgGhMmZzKTyYtkTtUEePGztTZghDdFoOfXxHpqmMQEReEgGpkPORfFbBMmKHhkvVWuUwPpuqQUkKduqQUdDQqEeyYuUTPpDZzwNaAGgdDnWoAaOfFGgZuUzIidcpwmzZMGgWPVvzocvVRrCrdVvSiPtTpIQYMmyDdqHLlrFfPpfGmMRcCVvxFLBblEefOoRrXMmGnLlNAtpQSsEeqdjjDdZHhzLlJcaJsSjwfHhpPFsSvVMEeUumdDUAavVuNnoOgGWbLMmgzKkuUZAawPpzKkZRrWIUuoOfMmJjzZRNYynDdrgiIGtTOKiIkFsSDdiIEeAxXafVvFzZyQqYYaAxXqQVxXUuvmMyvVFfsSeExXuKkUCcAtQqUuTbSiIOOolIidWtTHhneVvdDDdLMUumPFLlVvKkfpqQeEhEhHHuVMmXfFRbfvhHkOoiXxIiEZzsSZzeIKaAqQcCjJxDdXOGgFfjwNnlELleJjTtmMdDLltCapnbBNlxXJskKAayYgtUumfFMqQlqQQqLzZngGMmrSsRoOHUiIuheEFLlNNNngUuGLsaASlWwNmQqBbsVvOogGKkXxSqVveEQlLGgMxeEqQgFfxXbjJVNJDdFuUwIXxiWBsKkPpeEyBwWbYvVSCoOchPpHQBOFfohHhpPHALlWwqFfSsQprKkeERRWUqfFQJjuSZKkRrjwWWXxsrReElLgGxXuUJjnNpZQqtToOuUWwKvVMmkevqQVKfJjZzoOKfyeEUuljjFFffEeJeEpXDdvVKXxGgkxUuckKwWhwWAaHaLlVYyvHhxgGkmEFlLfeKcCGCdnLlNlEaAgNnzZGtRrTeIiLbBxiOcCoiaAIIbBRrXGiIcCiIgnNHeuuUUfFcCteEToQQqqjJDFfwXxYymSXxexXHhEmUuQqoUGguOCEeLlVvyFXxfjaMWwIiyYSslIiTsSCtTKkJjuUdDSUYyvRrVgGCnNcYydxXdDpoHheMChvVHSELXCcGgpGgSskOoKkSsOVvVGLBvVvZAaaSuvVaAhqoOVsSYOoYbByElLepPxIiXypDdCcZzmKkgofFOlLGMGgamUUmMRrbQsQNeEnvVaoWukKUwKkcCUuofbgzZRPpHhrBbGXOoxjRrwJjWEeJjBruURbwKEycBNAaZznixXICZzcpPoYeyYNnEALlaSsDduyRLlrVvYEePXxkabKhHkHhMgGbBmYyjJHhAGgaWZzDdEeSseVgXxBbGKzZsSkSTtsvhZrRqQWwyhHYtyYkSyYsKOoNnbBRrixXIgGVMmoOeEWwBtTxWwiIfMHrRaUWwEyCcsSBbYRTwWtLRrpfFPTtIEeUuRrBbssSSNqQniDHhwDdWaAdzmiIUuqQMYiItlLQoOpPbwWmcCzZMKkBJsjhWwqMtpwWjqQJPHEeWwfUuFCcgbiTtZzIBkgJjZzjNnRvVrlLfMmvfPzpKZzkPZIiXTtrXxBfGUugnNFeqaADdyYNnGgAEeSsarRvYfrAaRoLlCuUcQqoOUuOjXxGgJHRFfbBcNpPlLqQlPRnNrxXkKNnGnNQMfFQdDyYVYyvkKUDAadZzQsrBXxbRNEenzjvWKJcTpUuwWUOobdDBAanNqMlLUuZnNEebBVwWCkKkKcbBlaALkvRrVpPIDdgGiKxXvyYIiVXHhLJyYzKPAapkNntgDpKTtgGrRcCbxXBxXVvwfHhFaArBglLcChHjJGfkMmKyyYYFoARraMmdDpQqyYdkDdNntTaAKoMOoKUukRwyYDfFdsSWweEWwFPDdHOouUhDdpkKcXyYxpPBbqQZvZzVzYykKPpEejJrRaDzZSgGsoqbBQtzZTOdAHcHhAhHtrCciIGgwtaAuBMsSmdDsSwWtSsgGJjGLlgWwcCpHTtbBrbDFfHjJHhFTLllLtfoNnJjOwWhtTnJYFfySssSjdDHQBIyEeYGgieGgblLQqBIiOoEJLlOKkvVmnNPavLlVRrzZicjJnXxNntTNanNgGAJjyfFeEYIvGcLlGrIfJAKkFfmMhHUuauAaRGCcYyYykKwWeEpaAPsoGpPgOUjMzZmPpAaUuJfFmiIFIdZzNElLvVeEDdaARrwWTteyrxeEJjJaFfGglLDfFdDMmMjrREGaCOouUcRrxXXxAJVvJjjZOSsNaAXTJjtFfgGmUxcAaCvSkKznNzZZCMSgGgGbYAaOoCxXMOnyYNnNWCcCHhhTdlLKkWwbLlBgdDGGlfFvVbWpPpktTgGKYtQqeUuETbPyYciWwIiICwWMmkKOoMmqQMmXSsMmKkxgGIaqCpdDoqQOPlciIAaRGsSqQCssSDdSroOfFRRrPpXxPpOoPpaAQqeyYTfFtsyYIipPpPuURMmXxuFfqQUcdQrAaRXxnGgImMAaiwWuUUuqQTtyYyMmVjVvJaDnNdIiWFLlfRrRrIiIGgwWZdDzOoyYiGgxydiXkKxgBbGekEOoesBLlxmMXIiIsSTtiYyFfeEsgiIGZzYyvAJjJjboOIOtTekNjJnNAYoOSsNkUuKaAdDpbRrBcmlLMCPfANnaPpXEWlLFsSmhHMrQqRJiIjJfFYyjepPOcCmjJMQqSeEHhUEeEnNoOZJsgTtGHhjjJhHWNnyYwCeYUuyGgvVQLhHOokKgZzGBBbdDgGzDBiwbBWgiekKnNaAhHmRxXrYjJyPpMGjnNyYpvCcWXxzSsZSsHZoOzhwOFfZvWRruUhkvVydDYKBbRyDsaAfFNiInLIjWwCDdEeeEsSefFXBbXxxEsScPpefakKfFHhJmMjoOuKkusrRNnuUuBbnNdBbQqyjwGXxHhIigNnhhHbXxxXJmMjBHfFWMXxyYFNkKTlLpVvonNHhUuThHQqtDiYkKFDXeEeejhRjHhyYpPzZRrTOoabBOowjJvIEDdeRiIpPlLYwWaBbbpmMuUPWwEeuUqQpZzPtTywZLlNjJnzOMmnebhHoOByYDxaAwWgQjKkJjXxFiIgiIbBDwtTiVvOoIveMMmbBbBVCgGEeNnMmdHSszMmIBNpPnwcIiCWMRoOreEmnoOqvVhEDdTfFkKnNmMtsSwWexeDdvhwWOoHFzZYyUnxXgGNrGmMgbBdDdDRiIKkOVjJvSaRXxTtPoOdoOJwWnNnRtTOCPhHCAfyzZYFCHheEcDdsjNnaZzVbByUlKkVvLHUuhFzZSsfUubCaeVvEAVGgjJyBbYkdDjJmMDkcCZzTwWQqcuUUuDFlLBJiIDdvVooOOjJSsifFACSscaqKkRUuxXrjhHkKqQeEJXxCcasDdwJJxYAayRgGrOvVoVYyHhfFhHhHiIiglbBLlDdDdyYDdFfAXxaGgxRAaiIrqTtDUyjJoFfOKkYCcuIiUoMmOPpunNNnkKKklyjPpJgGNnbBVvZzaQTtuUGgdDRvVzZPhHJzMmQRrOofiXxoOJoOjbMmWbPaAGQsuwWUQqBlLbiIczZCSDlOsVvAYbhHfFeFQqCcQqwWfEhcCjyYLQqqiEIieMWdNnfFEeVRyYqQTOWjJwMmpPlLQIirtbBpPnqQTtNnNftTFrRTlLhHuWwwWKBtTbDRrwWJjYvVLtTltpbBoOyHhYPpAaXxPNmxGkKmSsJPpjgZzdDGmMqQqoOQvqdNnxFftTnNXaANnDFMCCcckIiKaUlLYyIiuVvVvlLiIKRaAcCrhbBbBiIbBdDdNnfFuOTthiIqQYmMoEjJeOUjiIJyIVyYvmgMvVENnepHBbsLlmMEetwWTSJmMjYyvUuVUPaAvxXPpVMmZzFifFIkKsSMMjJNFfnQqYdDKztbASGgsEeEmMekpPKcCLwaAblLZlYyARrRrDdPpOonNaEeqQuTtMBTQqtoOpKkEEZzeZzeHxXhTtzIiNKkkIiIxmMpnNRJjJjeEKkdgGiaAeIlkZOooqYyHLlorPpqQxXJsisSJZzLljiZasjWFBNnbrRfFfKmMkGgypsbBSWwgGTtPpgNnahgGBbRrvRrYIiGgmMjIyYqQijJADsjJSdqQxxKknnNCcuUGgkTOqQoeEYyiAaItBbOokwWYyzJjSscClZzLRrNjBbjyxeEXrRcSsSsCnOoNYmKkMJhtNnTzhmMzZxXTteoRrtmMTAtdqQhmMSMmgGNnoOUuQqqQlsSCcTtGlLoOwkKPprWwgGRwyYjJRumMOojJUSsPUkDdKsSkQnNwWqHwwWWEEDdqdLlFWwZzEefVvoODynNadIiBbDzZArRrXxaLJhHjNWwnlhHAmYamHhUQSskAapBbPKtSAawWHheEslLWfFQOjxXLlJyoOYfrRFDLlIiUSsFJjzZfpZzPGwntdxDaqfFhnjZDdkKqHwYyWVLhKkrUuMmjJRvtRrnNWvVwLlsSvKkVxKFfCtTRvafnoOhHaXxAyYAdVnNvDDdaGmoOCcApPObBoNUuowmMWNnGgjaAJOQqPpsHhSLKkeEphJoAagjQqPEPdDAaperRpVmQZzELlkVHhvIiTtwOokKbYnNAaFFfhEeHfvVnNyMPpmvkxXKXxgwHyuUYIihLQqlLlJjoaAstCcTtPuUpTFZiZztTIEtTFfsRrzZFXUdDuxOoSmMLAalSsbBoUTztTZLXAaQOtTeEVvolahHALJEMIimwZzYUhdDHuyezYNCcnQqyZtTXxEHNMMmmSPpuUPZzjJpYyLlXxfJjGgkKBbGgtTisSAajJAaMTAaseEWwhHSJjvzZVIahRbBfrpPRetGgTgGOoMwWgGLZjXgGoARHhyYbBnNtTrwWOMaAXFfIiaZXxbBzWwLmWVvwfFQDNsSRgZjkKClLIiORNPpZzXWwxnYvVyroLlcBbdDuwJjqQaAMcfFCOijJLlLdLliIVvDdsSZKAaksSPNnpmdEeDPpVRrvpPMFDIiDYrROodDJxXHhjaAuUoMMmmYLlPNncCNnHULlIiHhUkKJjlqBbDwWbSsBdLlCcbpPBvVvdkKUgGeiIEAaufrRSsNKkIIiIiJywAaRrbBUuWwWIiGQqHhYyiIyPczGgmMnNZRrGnNJjuUGDyYdoOGZzHBWIiwUVvmMaAUxTtCcoOEUECceCcvAaSuUPImMhHTSsuUtoOhKXxkTgjJzZtNnTjgGcCoOWwDAEeaHGgGUQeEqawYyWZzgnNVJAEeFDdfePjJDwmOoEegZdDzGzZWrRlLRPJjprwWVvQOXxhuKkTtrXNnoaIiYyYxUfFuwAIiBboxTuvmdDwWdDdhCGPUuMybnWwNAYmMyafFoOBghHueEUHKkeFfltmgiIGMDdMWwmTQXxQqoDdrPpAKkRXoOxGXlLjJxSsxSsXaAmSrRsMHhviIVGvVgHhgyYlLGgjGICMClLjJaNnAsBbpPSDdVvLlmxXFfdDieRrzZiIFviIGgXxVggBbvGgVOSsdDaPpAUuoGgvZznwWNGwWgFhAocpgGzZWGDdgwPrtZuvVUgjJGBpPbGAuUagiJbBjQWwGOoHhgioOiIIiaALtTEepJWohSsKnNxehHxXPjUwWJnvVNjuJJjgpTdJfdbYyIfzLMmHTwBbWOotISwWmCcKkMzYyOoYPphHTtlLvQqwpPxsjLarRDptgyBGcAaEedRnNDZzMmaVhHvEjTtJfAaxXCcjNFfUWsWwCxuyzZUuqSsjWwxXAjJaogRrqQGOWsGmMgSFLGsSoOoYyOglXivLltBbTZfuUQNnLfFlDdWGgtcCZXxzzmWLZuUDdAVvrRoBbyRrKEeJaplLsppPFaAxXBbfHhNnkFsiYyISqQNseSseYEdDJMFsSjJSnNVvNPpoEeOyYKkSivVIsniIKGgkMdPpDVjaVhHzvMmhHJjkqQKkKVquUQplzspwxXoOoBUuoRkKKkFIJjsdDnNPewWENcCzZjuBbUqQJIIiOoiDdeEzmrRhXfUacCHhbbQXxIDdCBDdjJzZzzpabBxXyYeBcAaCQqDTtiIAaHJHhAqaAloOKkHElLfqQFKkzVvZnNRreqQjJcCqzZVvuJhrzZRviIVoOhSsHqJjPUuXxKkCcjcCJkxXmMsSfIrReeUuEEuJqZykEeKbKDdnNgFfdDZKdsmsuUUiIjWwAZzahDCcdUeeBOobEELEBbtHpzQlenqlBbyYFKkQjJlLMmqPoVJUNnvVyNUuVvnAacxXXSscCxnNCcvJjJitvRciaAJjICcgGbBTnNrRtyLxXlkQVZziIPNeEnpvEGgxWwnvESsZzCcedAaBuUGgbLEesSlTNnoOqtTkKTtQYyXWNePpnNEGggGcCiIdmYBbDdZzzZyHhrcCaGLAfFVDdNUuWwnvGAnkKKbypPqQBbHhkEeKruuHhbjJSsBTuUjJiKqDsSmMoSxyYXaATFJjcmMQSDEeduPZzpiSsOoVgGvDdVvIXxiBbPpvAavVaMIiTtiIhttIRracCcCXtTMOoxwWXxXrREaAPpZzjSsRrDaABRrbKVvfFeEkMvVmMXuIZOXoOxOoevVZbNnzCcZzZBNnMmzlLLlaUuAGYxXfDKpPBdlLSFJJxXnnNBxXbZsSzqQdDveEOUuUmNEuGgUfFtTMJaAUujdDmGXuUOoxaIgGMcKAFRrfasmVoOzBMnNZFKKkeEkHhfpPIiFxXfoOKhHdHoNFfnJjdugUTtunNnHHYymaAAOxXTCctOxXLQqcCNnldzZwWJjHjxRrZzhHzklLYnNyKlAanNbJjUuXDRmQHTthpPSsqQAybbkKBgrRfAasSVeNrOIihHAUZrbBMmoORzqQdQfECcStLlfPpFwWLSsWKkKkEeWGgVEQqeMnNQqswwhHbBClLAahHcTtNueUzIYFSdDpPeEGgsKlBrRKkUuVvpPbAkKaqQNveEIitThZzGghsSQtWBvVTLltQqJtnNTjRraAreiaWwAjPVviYNmMLlfoeEuTtUwWultTLUUHhJCcjoOJYyhsipsSPOocCSRrxBqvuUllLZmyYMEeaAzZzUKdRrtFfTDRKkrICcilLsUupPUfzZiIFunNiTHhcCyYlfLtSUuURkKXkKcpPCxYFQmybBYJwFfwWTtDddXjilLIJDdYyxYkKyBbtikKmFfLbBGgQqvUuAjJfYzZMzOttCZLporzZRMmfTdmMWqjJhfFhHCcHQwLuoJmRrHhvFfRrOICIxtCcoWwTIitTiIWNnhHwtptTgGmUuHhLllLvHEdQqCvqmOLiSWcCZOdhQqBnNLYRZfFRrFIisSfzakylzZEeVLleEeEcHhktAvKreEViJIiFlLfeLlExXmMFfjJGxXyYyrRYwWqBboOTNypPswrEzuoOnzBbBbRxXZzGKkgXYKtoeEwWslLPpvEhcBbCmMHYyVBbQqsvuUVqIkKijEeJSgGxXQXLlxMmtTuGQRrqVVvIRrijmMJPQLredWTpPMmMQyYqNyzoOzGgFiVAavIBGgLwWlWkKwbBGgHhuUeEnkKyNqCcIiBWOuFfRaGgXnMIIxXtXYSsBbEdfpPFmXNnxXoFnwuUMmYfFHgGRNMfRbFfTVDdvWwtTHNdDrRndoOLfFKkzLzZlrRuVvUwAacsJHfFdDmJMSsCcALFumHhtTfFMUfgFsiIaAqQqrRYNnnNXxuAdDawqQfOUulLMwIZzUuhWkkKKIirjrjJDWHhGgHBwWblLMmeQixXmgmMbBrMmRGvjQqxXihdDpPHgnNolKkLNyYkxcAaAGHhffzZqQnNzZXxFVhHpXQSpPwWMmQqWwiIAsSaKOsHckKmMCTthXxXiXxIhHVwGEezZXxgDxSaAlLsPMHwgGWWwARrfFrSLYNnlLlLyFHhfobSfFsBOlsRUudDNJsYnUTEeMuBbURfFXImMcZzIiCimvdDVYyEdDdDeSYJPgGGgRwzJJjjaAZbcAdtWKkFSsJrRrRsmvVMSUNnIOoiLsSuOooOsMmSpdYyBHYyhdDIihqQvJjTtFfSTtabMmcCvVydDYtFIifxXRrkKIeVvjJSXlLBlLcWouUwZXTtTnJjVvNEenNiIcdDQhbEQqjJoGNnYyWwxFJjMBJbBGgDdRrSdDLlGFfHvVRdPppTqdzLlZKHSsBbSEdlLDYZzdPlLpcxXCDsxCqQOkfYEeyuWrRcCwnwWRrNYLlyZeEzXNZWwzrjJRJkKjLlkwWKteETgrRGQPBbpVRroOxXTTtqQteEneEfFEOKkoepPCdDqflLrRFZrRldDCcLWdDPpwNnClLfBtUuqsQWXtvlQqLgyzqahcCHslLlIWwiJPpjgGWwGbEbBTMPphHCNFfnDbgGBfMuEeUmFdUZUFGgaOIoypFfOsSsmtkfIifHCchaPatAoVvXCcxOobKkGOlrWwkKIiPpdDRWnNPpOsSKkRLNnlBhcdDwTdDtFQAaxxwqvVKOokQmvVvNUunwWXQvHMtadxrqQMmQqRtwymDlVvrvVHhRLaAQcVNzZQwWqdDOtAPIWwiwWOgPpGSUuWxXvbfFZnNgfcCwBeEbBbWCgGwWcqhHVvtnMioVDdxnNjJJjtHsFfShqQyYVvTAaUuASsXxeGgEjnNJNnsxXWRBDdbRdDmMYvHhQdEeDfTGiIgtFRruUqVtELaAYfYyrdtTDRHpxXQzTRrtAPEeiaAGhHhsqAaEJjezeENnhnZSszNeEvVyiMmELzZaArPyYuUZONnuLjJECcenNHnNiInNLWGLlzDTttscCFFfpANnaPFFnNXPbnBbNVtoORLlMmzZryWtTJDdTDdtCcxXPDdvVeECQyYzWwWsvVHhoJzZMmNeEjJnjXPhHpLLBPxXpPpbGghQqKRnNdrfoiIOyYQqFmMhdNVTrLhgGhcCFfHQqHDdoOfSsFuGgcCKkUIiHhSCcDdsrRdVvAakKSssSCcDlRcanKkHqQvNnOEFIipPRPpIMaAmueEjZxfFxPpPaYqtTQywWxXAHhoOpAUuaEmDGlLyuBbNnKkUtdDmFfsAEekHXxhVvGBQPpFUCzgGZbByYDzFqGhHKnYyNJUlIxZzcCGyYgXMxXTOqQAPpoORBXXAPjJpZeUNWPpZjJCXxNFuUfLlJQeEgGlLmMUuDEesbBSCcBhHSsrRbWwXdDxuUGurIymMAagGblLHclLCvVLPpmMmMlhpPEsSUTJjiIDytTMQqmjJVlLvlwqVdVvISOaYyAQaAWPpxXWwdkKPBbtvVvVTUHrMmNUBPbYyBpDdHhHeEZBgGWwrRrRbxAajJalnNZzuEebBxwuDhHBbNdcxSsiIeHQqrrZzXIFfknUuNKKGiIgkiYNtGgTCLlGTtVLOeZnNdqQCHXIevIiQqVhHhnAaNFfpPIjNnJwcjxiIwWXwTtjgGJWoyYvUlqQkYyttTZYKEegTPpquLVvlVtTGpzZNnolNnTfDpPgGFfGgdGgYFZzfwWlelLqQyrsSUuPpJEJjIJKkRrUjxgZsSzLbplgfZrRzBbavvVqTtQkKjJKkzZOWaAwLLAIiHhVvycCXNtVBbILmkuUwjJdDAaFfKkIwNxClDwgRreKkEWpDleGCcnaFfmrRkyUAEeQqiIoOEtBbRrDSsCvVlTtGgLRGAdWpMmPYHhGsSEeAogGOmjJuUMzrRLlKknnwIirIiemMYyiIEMmKPZhvVLHdlZzmclEerRcErRAjSsTFfOoTKkHLlVNDoiIKkRlLJpeEaAbxXBBbcCrRyYdaHhyvVxOohVvrREPpTNaAHKoOHhPpqZJvdmYyMDQqTqXxqUgGHESCyyYuBlHvVwjOFfoJWhofFZMuFmMfFVcCOoWwdfFDVuMYisIrnNNuOodlLnNVXBbMwWAaAgGyAasqQXkKWwFfxbQbAsSsKtThHkYycIUuDrRdXWwxgKyNQqRrXxinWwhMmoOPbMmYLlkKyThHvxNnwWQqYCcNsSnzAOOodPpTtnyBaAbYMdhXxjXYyYyXiIAaaAfJjCcsSFlpkjpPJnNGgtxgXnELvVwWiIMEeXxmWwDSWMmiIiIwsFfkKnNcESseCNtWwTnvvhHVdbjVNnmXxpkQqUDdDqQeEdWwOeIiYyzsSZiDqQHhBpBxpyYxXZvhHjJcCjJSYyCcBdPgGyYpCcaAxXoJjziIwDvVsIfFpVvMmAAkKMPUOspPiIlHWcSsCEenAprlMmLsSWyYwVJDYfFlipkNnVvlUnBzOJHhjguUGgYyhHUuomiIdKynNYsSiIGgBbROnVpxXfFrJjRPvfFGgpMmPyYIiTcCtwFwWFqQfwtTHhWJjDZEeanNtEeVvqsPlZNqRsRrSMOsyYEBVkeJjEEeKTLWwltEmUuMfFnNbCccCZwWCGghHCKmJvTtNMwCaAcvnNUJRrFfiLAalFeRMmtTIEeSqJvQsyHGDcCsnNSqQQqqQsrRruUWwRSTpaWLlwAzZQqTPwWpCKkPqWqQnNwGHhTSutTxxnncCIrKYwUqQuCcWWeELlayYPubMmMmHhWTMHtuafiIvVbaAnOogMmJPgGTteEZhHzCIiciIBBbHhTcUUuuCAppQqjJcFfCSFfttniImWuUBbwhXxKkzOoZRrMhHeAaDdUUuGLpSNYVvynmbZdQMFfmivLluUlLoOOoPEbnMmONWwnnPbBaGgepqTtXcCHhXnOoQBZrRyYhTXxjkEzPjJpgWIiStcISsiMmBbYagGqvKkMZGEeWwnNyYnVvXxBMBbBHaAxXAaGoFfeEbBBlNivVuaNMmnAdskKgGeCATtayPwZzQiIzZsjuRgGraAbJjUkfFHhusISsDABbsSmSLkhYyVRrvHKlUGkwbPmBKDhHUuDnNiLuIzCgGMobVxXoCccCLlPYyFfVNRSsdDsXxOoSFfZdjmbBZeJJjeENnjRUufFrELDdlWICcinxpnNAaUlMmLuCEyqQeEznNjzAaWkKbBwyYGghCwWnNUGOtTgGvTtsSVAaxAPNnpwWtDBRrbuUbBXxsrlOoanNIsTgAdDMvLFfhaAHlVkilHhLIvVwVICjpPSABNrRMwWedjhgGHZALgLTuKLKOMduUDIOHhvVDyYWwfvDvcgGxXMZnfcyAnNaaxXxYzZyDWwBbcTBbNDBbytTArGgCcYNOpIiOoFfPSLlEelsBaAbzLluUZkgGJjErTIituULlTlyhHYYyzZWOVvZlLrQIiQHhqdkKrqLlQCPoOprRKliIHhWvVnqJeAaLRvBbhAmpCcIrDGmqCMjECcVvoyYNtnFfzDqQNnlOutTxXwRopCcXxjOvVodrzFftCxKgGkHhEenQqNxsqQBikKIbhKfASAaXMdDiPpkSsKFkqQKsCeEcJMJjmslLEnNuIeCgLlVvWHlyMmYSCVpjJPHOgGgzZJJvkdKkIqQsSzZGGgIlLiyvMgTowWJjuObUNkbXnxnNXjsXxBbSJtJcVdTtnNDCootVvvKkPetPycCgcCGYmMJjRCcuUBbCGSRWZzzZVCHhycadXIwKkUtTzZmzrRZSOotXKEHhjJWwKZzAnNFtTfYyacCASsyIiXiIicCHXDBbfhOoOWbBDYwydfDRrdJYyTtcCLDdkIOruLltZzmMkIHhIiibsIiSlqfFmqcZzwWgGfPpFtWWLBbbAhHytSwWLlDdzZsAoIyeyqvaslLSQJMoijWRPplqubXxBtXtKkThMgGmBLcHhbgGylRFJjhQsaASeEEeOoGgqJUoeEIiOujHwWfadKTniINZzFfVWwUnAaNoeEqQmMBcVveECTtSlLiIQqswWVqQSLPKkpXMmAaOrpPRoOXoOxWCOobOclLCsSuAbFfsSnSHgnNPFfpeKaAkvXPpxYsKubBBbUztTzbBZenkJnRrLlNRUurPpiYtJjGbBEgghPVZzlLvmtTCcBoOXxJUuyYoOjxXopPpWwbzZDdJEeFfddoOdDLSWwLRWwPaKkIimmMIYYBbKhIiMmPpAyYlzuqQdmSBYXgdDGguUDJrjJROKkRTEetrwdDWuSsUZDpsSXnDdyGnfnNFiIIpDdDdMgsSWsSdDPJOoFfFBdDlZtBrrnNeSyvDRtZzUuUuuMGKkkJjGLHKHhGgFfKDdKNPpVwJNHhppapPAIiNKkgGtTnqxXdDBbCcBgGnLrXPlPpLnNVvYiKkUuIcrSsuXBpdMmICWdxOvKkuxftTtDdMmZhwyYdUpPDDdYtNTofFHPtNnTZmMIizphxXUduUDeEjJuyyYnNODzcmMoOJjCcCCRWBrkKWuNnKmBcJhHlhHnNhJjiIGgHSsxSQkmMrHCctWxeMmEEebBAVvgzUuPaBXxrHLljtVOocCUOOKkdDJdaziXLlxEOqTuUsbbbBmMyJvwyYpmMPbhYypeEGnNiIixLsYyiIhmMNRrmMfFCcXxIiiIQtTLgbhbohHoDdOzeErIwEeWWvVTJjAanNxXffrRZzAaAaFOodDbVvBgGFtqyYQyYTAxXbBIPfFPqLlKHNnYrRtTxcVIiSGWwSFCqQLlHhfpbHUqQuhHNntGSFPpWPpXxJlLjsSrRrHhTPpUuyFfDdavVARBbrTPnjJnNdKzWnkKaAhHImaEYywkpPpPyYKWWfIiNnMmLlmoKsJjiyYgjJeEvVNpOzZlQWABshmMHGiIlPSsMmuiIiQpUlRrLEOosQHhqjdDJEaASXxsSstfuUigGXpPZKeOKbQFcCBMmZrWghrZcCbEJPpjDMlLmQnNRrIjbBJzOKkSsufCcIidhebWuSsSjJuUehHuUwYhHCcMmQnKjtuUTmHCcszofhVWBKjJApQQMAakKNZzSDxnNUaJaAGocCJSsjCNWwoOBbjJecmVvYQiIBbSMmxdCkbBNOozvRrVkIfFpFZNlpzXxNLsSycMmzZCOuUcAalkhHsqQSKCBeEahHAGgJaOPMmpxqzZlTuUVOoeEwMAfzamMtTACcloWwnXYcCeXzDxXdfANbBZyYzZNBxXFfDdTSKiICckspPFsRxXrLlPwWyYaUuXxyYpPZzgJjDFcaAZRkKMIqQvUBmsVvjJXGqPpVupPOozGuSsoOMmASGinyYtMmhsSMeEmuUMbCcBQciIRIrPtzZRmJjwWMwPVqnwWDXtUupofwWFXxuscrRCmMwWYaaRYrcOozufFbwREKkAarQTqQwCVvcTEeXOGOQbOkKJjjPpFfhPpHRrJCZzjBnoOwmvXxWgGwVvVojBfcdnNOolOocnNisXbvVhypYgTwroOKIholHhVSsGlLcvzZONnATtPSkisScbHeYJnJNlmMSYyshHxFiIftTQCcqQLUuDdZWwzPpkKJjHaiaIzZYbBoGelLzgbAmLlwWvvOWwfFXjVvJFHXxauUPeQqdqzxlvyxEctTjsmHZUyuMXCcjKLlkcKoDdzPpZmMNnuTcCtMrRQXvENaAFfOKkiTtPfFnNJCEecGbBgjyzzZuUhtWYOoyBVvQhHiTlrDdzsWJhnaqPpXYvzZslqAniyufFClLSByYOYyDdBbLxXdNWwzwWRMIimJjMmmBbzZyYZXxZzUwiIWHNnsSdLgAakNXxnQWMFMfFhcRrfFbBkUutxXfqzEAaRinkvVKuZUuzcFUjxPprpxoiIOXAJsmpzZtNTdbBDOdDCcotEeGxeXxZCcRrtcczUqaAUYyEaAsWwfFSTghVvHCcpPGcCDTtEeRDddOUJRXxyYrjyYfndlLiyNnSsweJVgdKUuemdpAyYaPNnjeSsUuxXIHhZaAeguUGFKrutGdDrRQkKaFfDZRXLlfRmMGYlUhyibOFOVSsSsvKUdTsJjgGcfGgFGwWDdIlNoPpOPHhchbrKrnNjJRyYOJuvpGgQIdHPSsGEEpKkIEdryYLlOVvpPoHhXSoweDFDvqGOyYZXxrTbBAHhUEGgEXdJjzYzfdAjACjeQnYLIaosSOWPFiCuEBZzbAINYyDZPxAMLimZrCelLfueEzLRwUsSSdZKkFfWaAQUqjlywxXktqqQoOyPpnClLDBbdcKFmSxRCEcGgDJOvVjgJjfBUoEnNIAYMsSLlbBmhdDoODABbadQqPDdoqQOopgKSskGpPRJeEjGzkKgMmYyYyzHVAVvvOTBvVbAaYyXTfBSsDdbUdfXxHXxCBzqVxwWaKQqbBOoEeHihGpaABnQFopcCNXqcUuCRBbXxSkoBbNnOARraFFffTtwqQdqBzZxOoxbBfIlmXJHORRbBYvHhDIVWwkMmAaKWFkzdpROfXxFyMidZWiNnhUuwWCjSsSYhwWFaAfVvUuLPAKkTtVJjvayvVLlglBOyZbvfTvhCcHNnHhVNHhxXAVTDdKbVvDejhHJyyNGgoCTtiIcYpcTrwWRlLliIJjAfxXFiAarveDEedEeGgEVRBbSynMJQovDOqHajJAhRrQoHhdpgCcZsSctkAAwJzZlLHhvVIiyJiGJPgGpWAaSskQfNqyYsSmMIioIPcCyKkLJxXRJubILliBUMmAZhHlPpwKgNnzAaJoaAOYRRjXdDLiIwIebxmEYOByUupAwWjRrJecOoRigPpSsyNnhHGglLYEeYBbLLPpDdOIIPWrhzZHRDdweEIjUuRrObcCzZBvbqQauhtAatTTHkKIirWhyNYeEMYLiIbBeSsgVOENOonboAAazJQRuySfATfmPjJqmMDElPvVifqQIijJTtGeDsgMwycnNawLlWLlOiXxEesSPdFfAxfEVWoHnQNpJWwpPWcKahHjBbIuLlamybMmYbBRrBfBUjfDPpfgNvsSHhVEBVePEeMdPpDZQYycGAxngGNXGgxOKFYuSxDbBdXBbOIiSsUpzjFNGgXCcYgibjJBdDIgTtGYysSQWwRjJmLlqSygHtRrFeclBXUGjpPJIAlLrkmMvVSyYAakwgHcqYGgRWlCRyAanvVpUmMRrmCcnOoTzczrRZeEKXiIpPxGgpRLevfTcMFkKfmwWbngMvVnQnrlCZjpPSujLxIUxXtGjrWlfFFfdeEhNSjqQJySLfFlQqzxpPXWwWwNnbfudPEqnTcKgnoaASsXkROHNYVYuyFqboPWcOoVvJWwAGgtBqQbzZTaJjvaAxPAaphmmAaYcroaWFinsYLhHpIboVveCckKTtxabRrQKkjYAYyayJyYjJjWiIsGfFgPHXSSssxNhHnQasSuUaAAgnNtYyTGdDcCSTtHkAaAafepmiNKgrJjvNneEhzoyjlwIQOsSqmtXxoOLQVvYAayCqQcRNeoORnRiafUuOoFYuoOUuTMmajpPAaOolqGoXIAfBbNnDQaANnOoqFcMteGgXBbNvVnxLIiPRPpAoSgiRrIpjeExXMFfdJXxOlLuUOydKkFfsFRrjfmMyRMmrpPgXxHrRgNyIiwWgfFEeYgkBwPRsSxWwaRrFwQtTqiVvBbcjqGBdDsvVGgoepPhYyuUHiMmTrSdKtTlShaCMXYVIitTHhQjJGENSSbwopLlPWioVvcgtTSyYuvHVFybOocfbybBpLYGgwWGCgYqQdDpPiIyLlcRgfMnDlRrpoOPIeUcCzrRIiEdDgGFLlIYVvykcwxICcxXOcJVTEhteEkKoOjJBbnjCcBbyOsSRBbrEMfYlrMFfmwGUnTtNSlKSEltQqkkKKyYhHThHxgDdjJRHmMRLHXJiIbBtqHriIqoOyUDtFfrWwpbBXDdxJyYqzGWwoOLwWBnwkDdKWWhKgoNxHOZFfzpPOooFLtTUuJOEUnHhDoeyLOoCIfFYYtmEhIiHpdbBFfLlKiMmsHhSzHTchtFNnfshwMmqvWwVQxrbnNBQqTHcUxXjJuChtiIQeEinwWNPmHhjJKeDdbBqHZsSnEekcCocIfFirZSfdKkXxDjJKkgCEeMmhtioXlUuQqyqLgVKkDeQDdhHKYyUuyYRrWqQwiCxXuUcIkVwWIiIjJirRapGrRaAkKPpobXxBOpPgndIIiDzekJjexXwJvycWKhBbOpsSPoPWKERMgkIpPiKWfFkKTtUvmNnMmqcOoCqQvVYysrqmMZOoxJpXwWKqjySxXnzZBaAWwaAGgWvVCZMmdyYFlaEefCHhEeGwWYRraqQAiIMOxhaAOzBbCcZuUfFlTtLzLOolEgGkKFfEwpKvVkBaJRXqEbMHhGghHnBHeEbMgGDlsIVZzvFJyUXdlmVvDWPSsKhkIsSNgDIajJPpsSMVAoWEegbaVDdqbbHhAEekoOKcKjoOJtceERhtTEeZzueVwWXSOznNSsZJjwywfFZFMeEmIiDmTYylLtIiBiDREelhtmQlsSJjLKMRNnbihQqJuRaArUoOFfgFfLhVKLtAanNjGOzTfBmCXxEZziSYiIMVvmTFftyUqVvSsQtTLiYKkdDTtcebjJKRnHhAmMWwhHLuYZhHsyYAautTDdZzpBkFfcDFuuADdCbBcCaAMlLNPBtkQoOQqIFXreEuUsjbYySyYsgjJGwWdRnJjmMcCUOfcCkMKhHzekyOoDdhBhCcAnrRRnYYyynNkJwCClLcIXGgJjmwIAwWPpaIiyrHPTfyanscCMQXCcxqDdfFmcItDeOooOgPpIPbBoPMsSmpSxtTgIiPuToeEOjBbJMJWwQoOoSgGVgGgJHhZiMwchaCdWwBbaAxySsTJBbflRrwfFuFfaGiItaBdPTePznNGjQVIiIsSssSUeUXxgmMUuYcbBNoINYjJVkfKDFJLYNJjgGsZthejqppZXqxsSEIizGUudpeEPLJEeJHPmWYoOykKieNnRXNQnJmMkYXWeWVvfSpPJUusTtCcknCcIvCZJPTTVvttAaQqVKWVitTwXxMpdgpPTTtcCxXholfKUCxCcuoOwfFGuUNmmxOozZofjQqGgJiIFLuUlBbDXxdoOfClnRrubKeKilLokSbXyTtUuIXRrEjFcWvzZmMOuUCUfNWaAVshYvSHhjHhPzNjxoywWHheCqpPXxQBPGgpPaFfRKzkxXmMKZPpnNFzDaZahkKHeAMAVqQvQUuTtlXxoOLQnFoOWGnJGwhQqxXFAfbFfvVuUXxFGkehJUuWMFfjJWwmZBqNnQuUSgGkKNkeEnWKUurPgGjzZcCVvyYsJGXNnGjgaAnlLxIWHhBQpjtTbklhPpYfFZmedDEnLlQQtrRhXcmzzzZzZMKksPZzLPpQBEZzXVPpvxebqDMGjjJlWDdcCQwWqhHaATueGgqnlTmlLMPkRrrAHYyOohMmKApPOoACWvKHONnEOoeohOfgzLgqQlIiBNnbLGpSTtKRWwKvjcIibPpCcTJgLlWwGBlNnJvbjUuWpPDjvVwWgGoTXmhHfjHhRGYymoFfBdxLzkKufFTmMWLZZfhHtZHhHKDZzRPgyMmvZWDYyoOFfAaGIsSuCcFibejZLlYIiQMmRzZgRfrcCRLrUuVUuBbKoeIOcbBSgOVhIqQBivVIiWwQxojqmMtVoqZpCGthdDHbBzHhuPTtTXGMvVXTgsQYyOiETlffPIipyYIaAaDsbuUXeVMZcqDRrdQCyYKsjxaGsLlrkKPwWHTVCxjQbHlOkeEKUVvtphBbXIrivFHhaudNxLBfXoZFfQqfxCrKqQrRMhzcWwgGXLlLGgraSsAESjOoSHBuUqQuUBGpPTyYVoOvhHlBbmMMDdmkrhXjJVvOxPpbBDvqSsXSsxyjUuZeYKkrRDIQjJqiKuUjxXJOLBUukKDFfKkxhudDZfQAeEZVJjYUEeExTzkIaZKkzgPpfSRrWqqQsSZEecCjNOKYtTRzyYCpqRbBMFpXgaAeEFfncAaCkTznFcIzIFNMmuMrYywDdqQWoTmMtOiuKmMkHhGsSoWwmMgRfyjXxDUNGWZzEDdQlLiISlLfFdFxXsWVrRdWaawWfUOLlrnVxsYaexgUuMlLmhtQhHESoOQqMHhWwcPvEeZeWFpezLuQqxYWXTUIXRrSvKXqQZYJoaAaBkQFfyoOJjdijIBVzqJjQCiXsssSsSthHTnaOeEoGumQEegmlHtyOXlVGgICjJOoVgaAWSxXIiDndnjJSIimgQvlLVmODeUNkKmjLeiFXSlNPwoDdOHFsWfFgGRGCPpcvooOOHbqQJjhHopVeJbpPXxBNnTtVhHJjvEHYhHNnHdQiITRoJRreePSsMmUuIiumMRCkKIiTfFpvUuUHLigGlMmzZHxuYNmUuKwdlOoLleSseEhHyKpUYqeqIrRBbZvVzKZaavVZpPhkKjzAUcxXpKkPxvMmOpPorDHvNYySIINnZkkJjJjKQuirAKMJVWzLldKHlWiIukxXHfhLvuUfdMSXJNtSUufswWwmMjRgwWeEGACcaZpXphFSRJjrQCpChcCHdgLJNUYJvxVmPZzpoNctlMmyhLBSWwrqtTSsCcwekKPqpPXdPpWQUbcZkMKkGgmwtuEeLpMtzBfAMmTtKknXhVtewHhJekxWCdgbqVvAHinNIHPphGhExXoTeEDpPIieQqEzXKgGkyKknitTxiCcIfnNmQIjDCmWrUuRqQwIrRqgTXMvVduZyYSsNZBRMmTtBRuUMMGQuLlzUulRTVvtNhMFMwWfFirKmaAxXbKqvVIDidbAaBcRJhfuUFHBbjpPcqoRrVpxCCQqRehhnEewBbWTvLlThaAFipVXfFxtTxHQguKyYpDzZyYuUwWLFWgSUntkqFfNrRnheEKWwSyrRNSRIdKGgGSOCxCMAYXUucYMfDPpdNKktdQNBnADWpmMHhMmxXIPVnoOLAnFfFfHrRUknNXldrEXkKKkuwWUKeisYDJrWwaLIihuDdnRgQqUDdsJSspCZZvCLTuUtlVvJChkZtoOGJhwQHlSsiILrtTxXRfFhBbJjqWHjTiItgTVvzwWOoKHcjcVzzcPjSJjkKuGrNUsSHlARjdOoyFfSIEkuDdQqUxemMRDLxpPKkKuPphfWwFNalNvpirRmMPwdaNbnqDTnpPFiImyCUuxyamcXcosgkDirRrsnYsVxXvFfkHQKTNusGwflMmykKYZzdgiIGPiIkUGqhMmiIiIXvPIiIflLxXHuUtVtNHHErcgwWGcXPvXxOEeQCCcrCsLlSDIdiQkBxXMkRImxXWzZwCcfYuyYUymfVvFRRrlLrdDBbbBHnrBbLZSNnsTtPpUqgmmrbAarbznQjJqzUDmxtjJGQrRiXxxXMcrRdJiqMFiIXINYxktTKZdwWtVvOFfeEeHgdDhYyaVvWMmwlLQBGDcwEeGgXKbBEgGjWERrTvHxNJjaFbZTmPlUTWwWMIiHhfJNnjyYFmKzCBuqHhwkKDJjlLxpeEpUuPPQpEWQRmgGMsblHYqQLTCnOeEMvkOoKXVxXDdjyrRunjlGDhHcPcqQqSssfHPxPzuUrTtJWdDgXxGSFfFsTnoOjxJjsmDFVlHFhKUZzwLhkDZwvXxjSiIsmkaRIzZUqcCKziigGsnVhdRDdgGVXCuaLlZuUJHzWwAAnNzkFfKOokiQEQyuPkYGgEqQzZLDWkMmhHMnyUXfFhHhLIlhuVJjPrRtcbcCCcxXLlBrUIiEepZzEPsSpEjOrtqDIihwWtThvVlLHyEehejJJjjEvPOJjhHJjBpPvVhVgrTtwSfhWpBbnLeEsxOofIElJJjYaAyMnOouEdbBoMbtTmMVvBkKotTOHhqGufFUMsNzIpPiIiZIVviDNtTdsiIwGvzPpZcivLxoYqHhQYyThLMGqMUgANSSxIcZvbiJIDYVGgvXxGgqKbpPAOjgGyzxkVsxiutVoPpSsOvxwyIiXUlZEiIPQqfwEzVpCRrGgmIiseqTHGXBbEAySEeZzXvNRouFvPpVAAwxXDMhYyHmkKvwLlSfDskKNGFfYygnqeFfwgtTnuvgGVdJYylLYFrGyYpPCXxcOgOoUIkKqQRLgGlmUnfiZiqQCuPmMpUfNZtfGgFKNnuUNGxPfmrQPNncQqZJjrylBbLkonJvVzQInNiEewsFGBbAiKZtXSseuMmywWvzkXxKaFfWBbwqFgGzJjUHuUXTsSRrtdbloksSoOdydDEzJYQVdXoxHRKLtPpdDguoNnOEeUbfFbhdDHhsJseRlAyYaxgYyGlLCZHuUmkRRrcXFzOxFbIilwWXMmnOoDUrIiRAIifREUuerMmVIRixHrtTRSsPTuoLhvVBEenNqzZOoJXFfcvthpsSJjdDRSgAXJSMmkzmvExmDdYyMBwWSOoMmdDdAnNpPigGFFpPLteIoTtqQqSGtxmgxtpmMUZTgcPzaAQOvGgTQFfBbJOXqOoTtITtbiHvsSoMmGsETteCoiEOkRrvEejJRlSsFrGBbrAaqlLyxLlXMmJNnkwLlWKjzJEfFyYwWBjJIfUiTtgNndwzVYvjJVGprkWwKdkhnNzHbBhTFVvzabBAzlwZztDdUZlBbXRrTtDLlbAaOUuMZzgrJFMxtTtOJdLlXxwJBVjLxXbjaARrtBCJVfFkrLlksPlJjZaxXMmAGrwWRFokVtTtTwLlZbBzciIaakaRKptLNQEUIitDgyYGdvVhhHlLHDuUdwLJglLmhHdOolpSOomtTZZMCxHJjTrRqqNMziIyHLKoOBJPqbwiDdEeXNGmMJsSPpgxgjvVSJpRyYkwNKnjJsbgGzwjHEuUZzKgfZnNzUuCsSqJjtTQcBAaFafHWgjNFfgwfpPNqRrYyiIqaOoElLemxoOXaEAzAdZTuUtYyfkruUFBbfApfFbIiMmtTOocEqQEeYOXYyJnWwZpJsmMVyHSvwnFuJjcoCcnNVwCfJexiYxBsKvVNndDOIAakEoOkBUNLcFqCcQBbeEOXMMnmMSsgWUXcukFRrCtTEecLOHNniNIEeinItGKkDPmWIvwLlaAZzEekvpjzcVijJNKOoSjjJsFxZSszXwEEewxyKmMjNfFCcqnyYxrYyEIwMpoOaAhhHFfjOojgGleEDgZKkeXQxZzxXzPPQJEHTzSAanysurRtTUSljfdLlkFKvynijYyJOnCyGuEVvuSZKdDpPkzigGArRavqfFJYyEegZpEtpmMDbATgUusSniINAUWomMOLfFFTtjWwyYkKtMmYqlLxCcXQXDcAHCWrRmIzbTtBVvaAjDdGvsiIOqjmtUpZzGXacCGTtgAsPMIimpObBSsKkpNniXxHhIirRGMgGmTtqQEdTWwieECZzSNAYFtPpphRYentTOoNEZziWMEexicWjKNrIiNaHbHYKEpPZkmKFouNrDwWBJSPtTpOoIiIisSRxfiPpqKTeEEebAapnmiIcaUUnNfuxXUdCKbPvIOoiVoOUUuSKkzyUQqlwWlLbBaNrtTgGkdDBUuECyIlmFcCfMjJucKkCoOsIekKlLcMgGsSbFtZogGgJfFTlSsFBbfkvHlQqXxGwWjCcFfHNnIBjJrmrRkqMTHLryYdUuIbgDvfFVdAoOaGqleErRLQuUMdfzShHsLlWYWosxsSvEkKQquUUnjJQqNHqQOoHhrCTkCkKEeQqaBBQvVvBbABGwTtuZzUOavKkmAidGniKKkVvHPpkzZpwdMoOLfFDxuYjfiSLdmBhbNfeEFmMbBmBeQxrEgGejxTtkKYyXAbPWeeZBboHXgGxXUuomEezGIioOgZygPpLWwlcFLlAhHLfDzXxcwbNsRrYiIJQkxPjXzQREeieEJjISqQQiIMmMVuwGmGgrekwHkKhpHkwCYVSLlsjvVbBWvuUVEKtTEsSZdiayeEZzYADNPAvrRKeEPpkqEjJdvNnGGgCcBbZzliIQYLxOQbBqIwWTgGxXHcGJjFszRCtTOKNEezhQEfFkMgGpIqFfqQyYNnRXGgMmTtZzWHSTHCtbiZzIxXEeAaBtThZIkDPeMTyyieKFfkEclYEOdNueoDdjUulfhXnOdDGkHwNbNnlJjgZQjPfwWFVvRTKkdpPulLtTYQRhQTFfjxhlrhrvVGXtDuUdTLfFFfeKksQqkLsugWRLykKpPFmeLloYiZzIJFdDfNNnAaTlLHetvjCoiXkKWCYpPyKifpPeZuEiLZzOmModNfFdDmFGrCcCrRGcgoOyZzlIiPYBFQqCBYZzfvhVMmUsxXGCQzxXZqwWOIwOwWWBssnegquUSsDcCWfFwdvyxmcAoOPpHsLeEqQkDdDsRtTtYycCICcEjJMmOEeOoSbdvVDgmMQJCIWfAXrpWbKGyGaAOoYnGhEeGYFJfHhRrScCDYDdoojDeEmuUJgGvVPGsOarpHhJjlyYZzETcCBbXxoONnmCfdFwWaiMmxgQLWwIiJAtUuUbByyYAIDmMdmMctTCrNnZzsSNrEnvVrcCqlHhTMQoqinNWLCcHhnNJYsnNSNnOoYyOfFZHVRYysSGknIMPEBbzZlLdjJDpfFPIiFBbKyYMmhFfNnsbBqSsJjsShdDCcpRrlLSwJKkqBbBAXEOBcCcCzZiPlLSsTtyYlUuySNEeIaAfwAORCyXxDdMHrRhMHWHhwXVfFjHhwWCwpOBQHhfYnNUyvyWwPpdDnhorKRrxMmONeEGkCtNQepDUFBZsYseEcCnFfFDdffFHeEDLwEYyeRQqJgZzTchHCuiXlJUsyYcCJzcLzZRNqNmGNBCtFsSVElreaAEPGRRpPaJjArrgkCsSZtNMuPNYrcLwqQrrRoOyQUuChGWKsKRIiaiPYyCpPcpguxbzZLUuCEfThGxXYsBbEeUuhHIiQMrqGyxpPnfJyYVvZPuosUyfkoXagCYyqzmpEvbezZnGFdFkKzZJubfFFpPbykKDdgqWwAaQbTtBGBYXxMARuUrUipPJAkCaAwmMcCjPnSiIsqNxXhVrRvVvDhHdOKkSxaApqQPXjJsWwwveFXaDpEePphChHcHIWwozZzZACYMmWxXVvmGEeSdEgFiIIpLeOodQpMFtaFsSIisYUrqjZaTlLtOBeovGUuElymSsynKTtGFfgkYEerRboOBWwHwbBRMmUAbPpBBVojJJjkKfFQqjVvJJipzZiiiIollyGIrhHCSsGgEaPgGtFfTYcCboEeyeMXBrRxCcXEiWnNJjiIlxJrrAaydDjZsSGkWTtLPYypzajrSCcKkrRsjSslYNnpiqQMmOqQQnFsbBSTtqKIgGxKkXiwjWwgIAcCaWwwVrRvWjcpPCYGgjWaaFfKTCGgzGPYMqQmuUSsyVjJOqjmhHNaxXAnNbBYwWsAiIaIcCafFGggILlvVlAakKLivVOoMmGLmMKksFfStKRrbBFAgGazZfkRrCPyWwOnWyYNnwSscCdDYYmMPMmGgZtTRrzuUpNnSstTEGgOodBkTtdDtuUviIaGgntFZzVBLlzYobTtLGQqYplHysWweEDdJcHoOIwouUzZOzDImYbBorPDZKfwvidVjmWwMtTJyrrrRohjxMLiFuUXsSXDdqFfWwQbnNQDWfSsFKsrRrQxnPOfDuUdqNbPMmgHzZIhkmMAXNnvcCQZbchYyQWwqFsSDuFtuUxtoKklLVyYaAavgGhZZzuUGZgrPOpnNoOdmRrMDHvVXxXxyaiYyeqnNQOutTbFGJojjJqtTQBbfFdCecriIXsMrRfkeEsSNYoOQTgGKWYLJQuqwzLlQqCcDsuWrsSeEfFlZUJnUuNMmjFEcRcCzMIlmawWXpzduUniadDPVvpeUhHcIfYypwAilyGgQlLqNqMmEJcgGaJaDFZysSZDxlLeeNnuabHMmhBteFfERzoOpPogQVdfdEMJjmWOszZxRDeiPeegzZpnNGgbBhDiqPVgGUZzjosgGSrYyRkKkRFfBHOoCFfpeEnLigClLzZEeStDukofoBIYHubByYLyiIdDKkqQgrFxrRrRXtTPpxrFfzzZAadAqgTURkhHCGgcfDuUdEziEwWJVUuvDMEhHkvVLlDGUuvjEWxWwOoXYIDNFuoDrdteuQuxXZCbBCjWwJXxTzwTtOoWZzZzECcXvxDdXVOdDognTsSPMhHSjWwajJPRXTKyYXxIikQqtUhiIHuUuPKkpeEJuwOodYyDWfDdCWwUNICcrQhrRHqeZQmMTLltFTXxKRrjrRJCHmfmwqKyYOoGtBbTlDaAhfFuzIiMsSrZAanDloAabscUYIcCNaQLSVyxJjhHnNQANHjSslLwSuUZRLrRtIeEqDdMmbYIiNnOoPpywTUxXuHnNZYpIonDdKkeLlAaVxVvqmUOBjYytTpPJCcbkCnNJMmndlLJjzZDpPNxmUYuzhMSKkJCoOenXxNXYVLXZqQQDEpRrjJAPphfkKxPpoVVMaBGZEgdDNnsRrSOIiydDiAIAhlqnNfFXGgTtLnjNjyEhIiBCwWIyYKsjJSspTHhtaoOonNVCgSsvLOHikbBQqmMRvVWtGXxyPYqoOQHBxSQbBqILlqQCLfFDCFbJOmeEMAaMwWiIWNbJcoBqogoxtgGhHWtqReWwrWBjVTtvJUZCRyrlLaAAAymMSpPOoUOuUPTxdNQvEepWrbsSBTpuURiBbHRWwrqpPQFfXxhLlrmMaACxXqmRrHEeobnNBOTNIjJEegaAsQqaUEegZUxpPXvQGggKkxSMbuVnNimxpTtPJjXrzdXzZxDCfgGdxXGxbBXqQOyYojaJjAJANnwWeEPuUppSftLlbnzneEaFJjZxLynNfFmMYTtlEyxMmNxXOzhfuUFHZLZFamWDdvtLDyYxZQmMqzXdhHQXSWwsoAjbcLioOIAaTtCoLlbyYBYSMmslnVCcvZQqPLnzfPiKZnKAnNacyYQqQnNqDGgXYysalLAWwqyYJjyiPpInNMCFfEeTtEncJjOgjAuXBNnXxbxXdWwsndIiPpHhDyxXYmqqPjJPpaBeEbGgJjSskbwvHFOZShMJkNqUurRQqhHIiyfFWhHvVERrsUwBEVvPpEeHDYyMmFUTtAaoZlLidDqTuUtdRreBzRHGwRPpzdDbxXnNfqBkoEkpPzWDdTtWwwxIgJjGFIiQqTHhaUuAeSeuPrRqImMqQolLOZzUpLgvVypPYMmCcSeBRrbiIEbtoOTawZhHzqLGgoPnGIxXSkzZcCKkOeEQqtTMxXFncCNweAMiNwZklLDjWwJjJNkKpVvyYtMmYjJtRjJwXxFfxXfAaFfsZDdQqzgTjJJjhjJBPlLFxXcfFVvfsgxLTtlZzXsvCXXxyhXxqgGQkQDdppiaNnYybByjJsSYlLtwiRLlZoHhLsSRrlvVOxPpXOBHFfBdDxXGlImMlLiAKkaNnPpqqSsQnHHhSlXPpIgUuHhPwWIiHBFfWVjYBBStQoNneEebDQqdBIoOZOMmoADjoouvTJhRPprRXOoxiIInNibApZGUuVvAavyYVBYKybNQqQqwWnaVvTWpPwtXFfwThRMmKqsXqQLZzjCbHhMkUwnXxKkNRNnbDdwrfFGgcZdoYUlLvCcwWlLVuONntnTyFfdJjuDJjWJjHDdzTFSsBbZzXEeUNnqQVovVfFXDwsScuUuUixyYXkKmMDPbxUBbRxXmMMmCGgiIcCHhyQqpxRltTKkNbQFfPDdDdPnjSsWXxvnkksSkhdcaACDdlLYylLDlgJDdjKgUStMmTxXIisumULnNlaVvAjwWJTrdmMGgVYsxXEZzRRvVbTzGgQSFfvVsGgyYBbqLmMMmQqWwbfjpdDDdTtEewqcEzZMmNnmMfFeCQiIGmAaMtTGgmjJoaAOTtPWAazZwioOPerREpNgYNxPdzRitTIrojdGxybsQqwRrDOodWeEMDzZUkKZLaHYyklkHhKLgGWSswyyIiipPMAjiIJpNnrvpPVlsPpjJnNlzZtMmTkKJjofFOrLWzZwMmNnlRDJjDjrRyYBPObMpHRXxSsRrrcCOMmrRRroGGBbegXVvxTBEpPtTeyYnNEedDbyIjPGgpKWwNEZwWksSSyVEGhhHsaAqQNhQqHBavVAaUoBOoSscwoJjRrxXMwWmxzZlZzsIimMvbpPOnDdNrQqRuaAycCYsSWwveWAawtTzZMmEWwtkHhDHhDdArsfFSLkKYAuUaBCQqBbuUlbHwBBbbWxORrozZTyYUQLrwMmhHoOJGgIOvVmjqAVQEefFrRYEYiWwrlLREeOzZaTGpPgQazZAqBbCcYaBlhAaHwwTeeEEFfXxCNnZzQvhHVwWMsSQLBbNnJjBKuUmMyyYYTURoCciKljJjdDlALlaLYyFDLlaAYWPpydwoHFdxhXxItTxYxXaDdkekxSsTsRvVrRrZzMuWOsSoixDACsSYcvoObBCcwqQBbrsggGcrOeUuEoUuWwdDpTEpVhHnNTOOcvMmCCcjXxTeEJWwjNxBKHhnSsuBKkobgPpGBUwlLWOBrRJjfFOoUubtGmeEJjzZVYhOoHgiDKVjCzZcjGOoosShvAanNcswWnbBNvVVvLhIiwGcVOovaAEiUWwdDvKkVuUeyYEeSjDdSfSsvVWwImzZxAasbUuBaWMZzmwePpEFkKkVvHLlSAaQqXXcWwGgTZRDJPMmpPxrRXhbSsBoOHOrlLWFcCJfFjfUoLMmdZNcCTVvnOeNHhnCcJmcNUVMcCmvunMmcCnNQMgoOdfFRaAvVhHYyiPdDMaHVrlSsgGEjQNwLkciIRDqRbBzowLaAtReKSAaLspxXLlPonyRaYdntWwBbZzCDpPddXAYCFHhqQNzmxdDoOXrRIiCVTtdVFdXuUxoinwyYWNmoklkUtlGRrlaEezskKcdDhHCSOoURrGpPQqkKguJDEmnvVIlLiIibSAQqUuaBbsasSsJclLivAaWKHrRhmaGtSeHhEFfiALRSdThHrReEafFXogucHZhHJZYSsecqifGgFXxIQPXNwzMJDzqaAQxXrnvpWwCcOvBOmzZcLIilAfFaZiUlIddkkKbMpBWhGgHKgumMsvVPkKpxXMBbOoKkadiDdSmMhHUiIKuhHiIBRrUtTJjyYJpPdwWDrRSheEHnNqWJyYjptgGTYcCcESDUsSTtsSInLRrbOFfIigpIQqiPWwhbmbNgUuzmmHeEhMiIUuebBEVZzQAyCTHhvVswGZeKlLJtzZHlLGYygPpznNfFbqNxwWxbqQBQWwPTtEhHApNoNBVvPpyYbBgjJGjJepCceEOJiISdDUusIijgGoDqQdVIqDzBMsuUrRPlggGGvVhHgsSuEsSKkmfFFfuURqQeEvVrHMXxeENgGZgGwWzTTbBsPPtTaUutbYyHhrswWvVSRoOCcqQmiIMppPjXxMqQmHhGNdDBFAUPmMpjJTDdhLlmtwBUIipAwHxnNXhvVlLysSgGHhcUgGKkuCkRiNWwNnNXXXLUulRmMrvVxZzUqQstgZzQHhpsSdDctPtGgiIdghFfYScCqBGgbVjQsTtwWAaiqQmrREeMVviIrEfcCCcIFfQqjfFMhHmuVWmnVjmMxXiIoOBbMkcxXczBnNevbeSomrQnzLpBbSQhgGHTBbAzdGgfWJjNRKkroOorkDakKAtTtTMAahHOtTiFfJjIQqGoTbcCBtCcZbLlCcNTXzgGZxtuFtTfzZLKPILnNydzqQZjpeEFfoOPvRMmPuUasSNwdDsShLBbdQUuMTtmqbBDSPpEeoaAupmsSaBbqQaPiSsSWwrRdWiIlLDdZRrODbsVzPXuNnUbPbiIdhHIiIEoJqQjuKPfFMvJBUuDVOodWwleyFfYvVaAyYNxGXXaAxgGTKiIPLlyYLxLlxJHBvnsYytTSNwmMWVbDvDdYyVxXFfmBbNDpPoaNnxLlJjXhHVvswWEeSZyOPpoXVRroOrRtBpqwWQHhjmMFfJHRrNIncCxXYkIvVTlLtiGoODdeGgRrEuUJjKkiCsiISKnNpPpPkSaByYqvVdDBSYRWwrafFmxWwvWwfFEfFeDUdWwDnRDddDiSEeIwWMNnmymaAUvYyJOojvamMAfXDdGgxUYymzlLOLsbBSgGbURUuDtTAnNeEadrmMxXhHYrRckKzZsehuQQtQqVjzQuUkhuUnteHzQqZVvXYAuxXUDrgGRvVPjrGvVgOdnvhKcCkttJaeCLVvCxXMLDhlHTtzpwWMXzZxqQmkRqQWNNkLllLKvXxJjVyYuUSNnsqQHhwWAawWZzZajJbBtTgywDmMaaAgzZEercdTepPaucCYKbqQqQadDABMPyYpSgGsAfFNgYyELwWdPAawGEecCEeQIiqWlLdLVvcXnWGeEgiWKbBMlivTzZOooORrnxYjJaCclhHMmlWLlwoDdEeVAFwWxXGLPBFflGXJuqUbBuQjitThzZHejUuEiIeREpSspPPeRwMmhHWrYYyEpPAaLvVyzZtTYyUuVvDkKGgdeEFtLuUOPvzZVEegvsSsSMmCcEeUQtnWwMmNEeGdDkGggGTtrxXAaeERyzTvVKNnzZaAYyqQKkLqkKQuVOJpPCdDGgWiHRGgBbrEixwWhQBbqLldDcDzEMmodDRrCclvtTQqfiIFlLgcEmAaMenyxRRhEQtKkVvcCwIiWTqXCsSDnvFGgfgGVfFdKkUWXGHhHhgULoOAXBbzvbBVhbuzZhHnRhuprRIfFiDZzXxcCwqbDdBosiiIDUuvQWGggGYyLMmpPHnNhYHhdtueBgGZzlnNLYnNiRUZzgdqbGgBjRDdrYyQqnWrRwczAXxawUuVaAvnuOoEzAatTazZxvVxbraotmiGgXxGgRrGuWwUHhgLwWujbBnIipPHKkhNVvkgrRrRQeEYyfZbBdcufqDdcCbgLlKahHFfcCSxXMtiIHhOoqQTzVvZTYJjnNxXKkgdMeWwXwWXVvEezcCJqQUoOXxiKeBbELlkiIFfKkrgGfeoVSnNshggoOGGqGgQaANACHhPpCcyYtvndDDdDHoOOoKkRDrkHnCIicGgvPpVNllxOpPSrRTtwnNPOaAogGcqQCWwpZqcpjwjJKkdDHhYKkMcvVCzZmjJTMXZqbjJUuHhBfFQzQqxNnIiNnmSsvvVeEBJmMjpxrjJRffrzZRfSDdTtTdZyYghHwlgGnNhlJjUJjXFiIfxuUxXolLzxXZzBbpZzanNARluUeIYHLlZQSvVHgzZIpanNZzZqPhFyUulJoOEejeTwOfFodDWwvVWvvVRrVyrBCcbrwSSsDdGgadANnaDXvlLmEePpFHhfMOIxnNXFZzfmkKNTHhkKAHhaQwquUtTrRSstTQWFGzrRBhHuUmBbMVbIiBwsgmMwWGRrYyoplLuUaZzTMmopPnjJEeoOVvvrRotTdDvVvVOCqdMYDdWIeEiTGgVvXDtTeEUuhHVvVvzZNnATDdmhVqxVhHyYMWXxXeEZzXvVqfWCRrOoRjJqQrHJjbcCrSsREeronleELNwaAbBciICLogBDvVfFbBdCZzcOkKwWodDXxOaTApAFFKxyYXwrRWXxTMQMmSkKsqSoFfjJFMmfPYOijJoAYyfEeCcuHiKkIhJjGgzxXurRcmSaAsfWwFteGgBgLJjSkDUudYyKAQZKkYCcoOGVTaAHhxwZzqaASEeshHSFfQcKkCTCcblLFLlHhAacIizQcNvqfFtTnxUFKpPocXSfyYFyeLlshkDQtPhHIiZwWIizKhHAaMmkDrhgsYybBLlFAaOEeofjQqbmcrxXRCLlfXXxKkmMgOlbBGgaAmMkKLeBKJrRjkHSsqpPLlCnNrRwOoWtnNQqxzWAaOsSzZwBbyYsSCbyYxsEmMiqQXxTBaAAsVVhHKkIioyYOvHSsbqQlLZzBbiIYyXYyTtxTtDRrPnNUltTFfFfiIQqgoOGuAajfwOoTDSsaCBYyWrvVpKSskzSsZjysMslLSxNnrmtuNydDwWSjnJjaiIFfhaAmhWwHpXIqRrQGgixXdDdOotTWcCvhHxFfSmMokCccCsOoqMmxDdPMjJvRruRrIiUVmvFgLlvVaCXKnOGIJVMIqrRHhEhwIiQPpPpqRrdRDdJRwHiYyWmLMmlhHNntTsSsSoFMmMnNFfnDdNmWUQqRoQqOEoYyOpPdDRrermMyQjJSfGzZlamjMKkwWhZYgGyzJjjJAajSiICWZlLfvVFZzlDhrRfFVvRrtBrFmnrhqQyVvuUHhxXWNqQEefbBvVOsScCMmupPKkUXxbBxeEDdTPptMtTeEDeOovJjoOVyPpxTbBsSicPpVvgGRrCimiInNNlnNLxArUowbQvVnYNKdDkbGgBkKbwWuMmUfZZYnPfFpmpPRrtwDERqQlgGqBbplLriTtAaIRvVhHFfvtTcCzcCZGgAahXxHgUhmMhbBHHcCFfnNqnjTtrRJNsOoOoQSQJjqXxfFpPvDdiIPpetPpTVoOMqQDdiImYylLSuvVUOTpPkyxrfFWpPwZqQGgWRrIiWwwNHkKhUZTtSsTJiILltTjHhteLlUZzuRWcCctTAPaApayOyBbYoYwWJjwWCSYntQgjISsvVYyFfvRkVwgGnNWaTKCvPpLYKAapOoPAXxrEeygRrGJjlOoTtbQqPpHPpDtTohHqwWQzpPwsIKklxXKmMkeEoSsMQWwVFfcDehWwVgQqGiIMCcOoEePHhCcDdYyOTXrRiVvcigGoVYyMEsSejfFqQUuOUlxXhiIHrRyYdDcgMmGQqCDtaAFOPlzcVvTTHhoZmQRrqyFaMmVlMITDlLkKWjuUMqfDwWdyLlreEusTlFLCctuUDdIbYyBsSSkQGgqdDkKUiIkKwWjJuyYHhutTLVHHhhQbXRrsISHKkjuzkCcEeoOKMmZOFnyIpJSZzuFfSsUZCczmMsIEEeqQLzZlRsSTtbwTBbqHHhNnmQqMHtTVgGnLQGgqkfyiZcCzuUjJZzZlLqQuEUWwnvDAaAadvVVWWSvVDdgGmTJjtdDMsSmWwoOVbBvvwfFYywRrlvVTseFqDNnmMPpDdupBbkKPnNaovEfNnFeVrRRnEvFrIiRYyiIGyYCckbBKBYjJaqMKkrdTtxpPBLaAPpQxXqZXTPptxSstTXJlLhHWwCckKhDiIooaMmMhhNGfFneENUDeEqRrYyzUunNZQOqESCcsDdetwWIiIhHYcCyzZOoiTQhAJjkKSkKsORryYoaXxDtQqTkzFfcCmbZwWubfFZzBwWXxMmUvMXxSAakCPZzIiAalBbTtLpmiAGnaKkANgxdDXiIaAgBbHHhhcCunKkNUecTtyEeYCngGMuogGVNjjAafspfFPaulLcCUAKkRrDfIiFbkdFxXygbBEXfIiMmAYyaFxoziLlUxAamuUdwWJaZzzZOoAeYymRrDdMmeExAivVTtTTHCcaAlfFaAxXQqLhHeEmAhHBdDbVIiIUIiiNnXtTxIsqzZCQqftszZRrOXGgxdQyYkItUUZzMmRASsacCYBFfkyYhPpHUuHrYyRhNagSsJjalgddDDARKkMDBbnwzZxemMYvCcVyEWwBbtjJVjJvDVhHwWIiWwGdDgCcNXlLeTEethHqNUunKXxYTbBNnpPPhQqHpkKtCrVtTTBbIZzsSpPrxXRjJjVtTCztTXxZAaYuaALljxXvuUOpfFfLQNQqQqvkKVgGpPjrRJELqZeElJjLZVvzMwzZWmhHAasSPTtDdhTesSlBbCeEcuWwXxEeHjMmJDdgGRrWwJZzUuuUxXVvuSMSDmMkzGNnkjJBYgJjUuGKksVvSzQKNnkjUtkKuUTiFKKcCeExXkZzpQHtTPpjUQRrmMhXSsJjYyyYYWwyxLQajyVvYaAXxtTGghdPpOobElLmMAPZpPZFfgGbcwWWDdwitTwWqgGWwBBaAATtgOoTtGuFYyxQqRrHnNfFFfIiMiBbIfmMFGgZnMmjJpPpSUuWwqQifrONnFfFWgqQGwfbsoODdbBlrRJjLsSqQSOuUWrRMmPTtQqwWSZLPZvAJvmZzsWwfeEHhmpPNnOojeyEESnfKPiISTEetPOoAmLCcaAlMjzZkLlQqYdDxXHmMhOSsazlmMsSwUuMNSsnZTLlwqrRFKPpWwkzVIzZxfHhSswJQmMYRrHwWSshUXcuUdDfFSHhtTwDdvVqQubBFfKknJFeLlAeEdpPrxXDCfFgAlLaJjJlLjbYJjMbBmpuUtTPoOGTPdABbAalJiISXHKkhWPuUpVnNyCcZLlvVsVnNviHhhHhlYykKFfZAaFZzSslZzLiBnNZzHOohDFjDrCcRtPBbGpEvoOVXkqQeEHeEOpqQaAvrRmMVPwSuYyUsjPUKkTtycCpPYEeuwWlzZZzoOIqIJjzzZTUuRGnNTAatqQpPtTgcCCOxXapPGgBbtdDTHoOZzfVGuUSsgVvGTFftvVpPzZlLGvVfEmMgJjGmMrRIMcmciKkTtgJvVWwPpraRZzpPOMmqLEhttTTGwWYmpgOokKoOcHDeEBbwWMVGgUtlLXOaWXyAhHuYyUIiOxRUHofFWwqoOrRwrRQqdDMWdHhvVmMKkKRrkpViIvGgEPpFGgpPfGgXxTtajZtTzvyYDdGAiMCcmIuBjJsSbgvVhdJLlGPptzZJjiIXxHiOopnIizZjJNUuYysVueiIDdtThHXxXuqQxKNnkXxXZzubTthgggCHKkKkIMmihcuUCpYgwNFfnWYjinFjJDAaGgVQTtNVMmvneEqLlRGgrKkQLOPpoueEufFhpBOoXawWAxbywqQWQqOyaAddRrHBbhdDfYyVvkSskZzKhHjJKzKcCkDdDlPpTtpKkPTtdDZzoOIomWZzbgGBUjJoDdOCcJLldxXqQDIFfiTtQqoOzsSGvVVvFfFLlmMfJjKCZzckrBbndqMKkIGgilAxhHCcRrmoEeaOxJzoOlWwpPUuAamEFgGjVvJbCcBhHrHAMmMHhLlBbmiKkRcCrXxBakKABbxQqdDXbtmIFCclLEerSsCcRsnCRrchvvVVCyYcWdDdSsSsDeUujXxlSsfFLqxlhHtuOsbBfYyTlLtSeUujJzfSOyYWGVBWKPpzvVFfagGLlAZemPpMqkYyKMvJKkquUQUuGOjNnxXIirRDdHPlUubBjiIJmMFfpPvTLlNECcNnentVTtTtJjHhZpXxPzzSsZnaIqQiMZzeEgBbOoBxpPHhXbdDbBopPOOoKkgGdDKQqkNFrRAVrwWcUuzZjJkXTVIiaAHlnNvhQFfYyzhHeMmERrWwJpPNHQAdXhHrRDTNWgGgxXudIioqwfWwFLlTqkKujJMAyMyYCvlLVrRaABbcRrRYQeXLDdfFlxeHhSCcszZhKupwWEeEpPemfFMrNnLlWkFKkgGfTEetKWgLsPTtpVgGOovOojJwXUuxWVvHDTqMmIiQhHwWEeroOtNnTRoOakgURruGMmxXxXSTMmtsKOZzMmeEPpEAoOaeEXxHZbBHJKknHhZzaBbAoOZKDdeEgGrRcCKnNNGgoOfFXbBLlXfFaxvVcCiIXJyhHxXVJjqQHWwwOoWMRDdrZzmAGIiSscCrLluQqURfFRrPQqNIvVPprnNRirtTRCcnxKKkqQCckXbBYjJlLwtTRrJStTAJeEjzIIeeIixXGgEESjpPROhQOhHgGzUxXuKLibpPBEiIIZzDrhHPXiKYynCcZPbmYgGZzyUcCPpLzMmOooOBWslLCcSlsJjSvVaBoOVvdDTQTtxXqwWZyYkQmMmMqzZrRypxXPgGnNQLlqbBmgGmoOfpucCLlqrPpaNKkZznARPpQvVGxXgAhHaTthnNUuPMmmGBjJsyYSbMsUrRuSiYcCuyFlLfXxdDHoVgGvUEeVvbBDHkAmMmfQVJjCbBcpPMeEhHBRrbguUXjJeEMXxIigGhEeHsSEedDzEWweZGgnhHPzZpTyiIdkURHhqoqQtRxJYyHiIqQhHRKkrtTjXrrvDwmIQCclUaAJjwWugIiGJHigEekCcHhKGJjITtBjJgdDGyaSoBcCIibLCcOJjmbBMgCcfFGFSsYbBykKfcuUCyYqQosSdqgKQqQqgGkaAUMmupBwNnUuNnavYyhVABIFqZjiIprRrPrqQRpqAUuYleELXxBDGgdQqbyYLjzaAMKkmmMZJlLYyULLlluuUEDFfdzZpWwPTtRrpPBbervVyYRlLdQGtTgSsXAJjaLTtcCrRGIvQEeqXxXxXxXFfjJZzgGkKjmMMVWwOociJjICvmjbByYmMEeFDdbBfCcWsSxXFfSAMHRYyrhmnGgEeHaAhNuUQIDdRrDdiIdDjbNnfdDdCtwBzzuUZZbtTWKAadKVvqQQqvTtqQXxMmnNcBHhNnuMmYvgTtGHhKkdDWDwWdwRrXkKxzKJjGgTtkeEZUuAJSacpfnNFcoDoOduUreEzAaZPpcAaIioOqTteECcQLlCNjOooODpQqiIrAsAkKaSvVAaJqkKJjQvXyYxVcDdCjsouYyYEjJaAepPyfdDVSsEiIXcCHQWwdsSDNbiFfZiIrRGghVvDcGrRgvmEKWwkVtTYysrRSWdDdgGGMmFfCcfqQmMYyUwWuTtJFxXflLrRxXHhqzZBbKkpPGxXVvXdkKdDENinNIbBoGKkgRdDNDdnrWJJkKGgGgkKjjJjQqYBKkAyriVNeEtTfFIinpnNPKkWtTAtLlOoxXfFTtpPJiICBbDdcrHFfqFfQJRruUEExGXxeFfEgdyYfyIVvmMdNxXnmIgGiMwWeoOEOjhHJlCefFFfVvZzfFEcCcBbhHmMLoOvVPtnfmDdPpHhJCaAcGGggYyfFtTYaATpPRraAMmBbfFtUSsuDprRPvVwWUBbuywWfFhuUHYdDgdeEDiIQqHhGUSUUIqQiXnNxIaAtYyTfFDdFfEerRUugMmGQqWwiFMmfAFiBbIoXuUSsxOEwWxXJmMxXNnFficClCcSPpGgBdSsDbdMmYWwrbBHyYwVIiGgUzZuVvzotTVuNnUPJdDsSJizqQZIjxXJjgIiEIGIbJjdZbIilqEcJAatTTeErRRrtDdSpPjLlznMmNRreVvZoOzusSsFfJLlEdDejhHoEkKVfFqQvoOjJTtRrMmwWGgfweqQxiwUuWIFnsEeSyajPpAaJWwvVnKKkrREfFovVwyYWiBSsNnDQqdCtTOocanNxQqXvVVFfSVvvVLlbADiIdOoaSLKkpPHhlKEOoIDeEGgeEYXcCxXWwZzwIiASsrREYyMmwWesSvJOojyDdXxYbFfbeEOoBBYhHNOqQFfQqowWqDtTZzCQqlLghHeEGJjrFfuUSEMPpmvyYVGgcgzZeKxXkjVvJEjJrCleELRrLXxcUuQABNjJnNoOnbAAQqasSSstTBbKkaBhHbieEuUNFfnpyYyYKkBAaGgysVvTtSPCNRruUncwKMoOmkBLmMgfFTtKVvnNvVFnNVvfkCcZzFBbrRpVvbBPhHfjJDbBtHbBSeEsqlLQcwSsbGCcgBVvptTPWUuVfFWwvOonNwomBbcHMBbmUuhjJzlLZypPBYyjJsoOmBbmMcsQqHhVhjJHDdFkKfXsSuMzZuUxIixXkTtbBSffFYyiIFsWwAaKJjnozgqQjJNnXxxXAaLOolQqeYyJnNmdMmACGLlGgQqnNpPcCgcDdjAaTHhLltpJuUjqQggGDdqQGuUPMmXRYOoXOoUuLlVvxKknDifMHJjhXxRRIYyirzZzZTtKkruJGgjyYSgjJrJjTtWwUtTjXQqSsxFcmoOMCiiIRgaACgmMWwViCKiIOokIAQfFxXqBbYqQyCcpMosSjLlNnbqMmhCfFrRckKwWVvIicCxXJjhxfDdFXVvWwHJpXxPqHhSsZzQjYyJLluUjzpNnPZeEUiIuIiXxOoNdkMwAaWmKBrtTfIiOoOCcoFLlRQVvjJiIqRLiIaAlhPpPTEQqeLlHhbUTWIeEmMeEiVNnvsSSsAaDdCcAaRMAamTaZzCcChpPwWgGCWIisSwZzvVoNnOLgGlfipPjJIiPsSpIZanNAzWtmMgGTBbrCcEeqQyYmOgGDVvTtClLiIcdXxCcKkMmlLueEUUuMmMmDhHvVHhSsPujJUObRWkpPPdKkGTMmRYyrIimMXxuUZxXnNOogGEejlxZzkKSsEevMyYmzHqYyQsSIiuUaApPaAnNSsMkKPpjJmMmMUumnNiIhmWwpPRrUuvVAatTQBbLqQlvVuPtLlCSpPsnkKRjJrNjkwXxlRrNnLdtTVfVvFUuvDVegGaAdDEJZLGgRrlvGgVSPpseESquqmvXiIxVqnNgtTpfGgFwWLpPnnNvVwWyYZzCrhkKSsvmMqQVVvFyZsSzVsSyYBbeEQiQoGglLxXCcOXxqIEbpRrPFfRjJKkzZxHhpFYysSVFJGaAKGhTmcDbqQBdCQHJSjGgSsqTtTYyoOmMGguAaUYyrRbBkkKKsSyOoOoZlruUrReFffSsFPWwrRiIpuiPpIANLlbByYnhmFNnbhHBdDVbBGghHvbBXTtrnNRILpPlibNniILlaRbBEenNEerAhHLlzZxCcXeOovVEvMmuUsHhSNuSsUmMsSnHhTzHEwBIiOoSsAhHjbBJvVKpULlylHhLsSQqOiIbCYNnekqQdDpPKkWjJJinNItTQqAauUBFiIOhHOKkxOoGgXLlAkKrMmRqSAaqLlMmBwKkcCKkHTthvVswWAaSfFmfcRrCFMxaJjAXuUfFaACcWeoOjJEuulWwrRLJjAaMSsBQqtTGgbAqQpPPXxJjbyYBCcrRvQHUDdEwWeZziurRUIGgkKsGgAzKrRknNVbZzbBzZCclgzpPZyYDdIiCcvMmOooGpPgDdRVwWeuUEOdDovrKPcColLOzZqNHhnQLlxlesHhcSsSshbBHcUuCsHhBbmMKRrkSOspXrRxiIBbPSomEOGLBbkKlaPNnphXxHJjAAagjFfJPWXxwWwUuwWDWwuslLcuUtNVvnLmAkKPpEpPezGgZkKOMmozZMhHmNnyFfwppPPdDWGgYVvvyYVoOJiIyYdDCcYcKIiqQkDdHEehAUuaFWjCcJwfoCuBbUcCcOMeEqQsMjJgfFZzGWrqQRaQqAhQqHEeRrdnNOUuEdweEWDyYkKsShcCnNVvxXeEiImMDizZRrlVvLLlAaAaItRrVvTcgYyFfmGgwWrRMXxBbZzkJjPpPLliIpmMMgGBbKXAjJCtTEeSQqsPJOoLYjyYJBbHeFfEhgPpGgyYGFMNmMnUuZQqzmdDKFfkwPYlLypfFWTtkFMmkfFEzPXxSszBbZRrPpSwFfJzPpdDshHUuwUusSrPKkLJjlaRrZziIsSuUbqbKBbXxUukmSaAsGgBDdgGbQqAakKMBbWwcIioAaGEPWwpvRrVezZgOCfjnvBGsSXnhHnnuUfihHTtuUEehHWeEKkSsEeqxWZzwWwXQDoOdwWwCqkKRbBrQccCIitTSssSvVxXIMmNYyYyTGSWwjKdBprbBRyYPyjJYbaAwEeWDKnNWqQwoOxXkyYtlLTkLPzZAgIiGRrcTGAaAuUafFgGkKbKkZzQqBgHjUuJtTKVvkFfhLWZzXxSsJjJDdasSAdDVtYyOlOoVvLoTCrRToOtsSjJpeEQqPcFaALlnNVvDdMiImfFBrxzZcCLlJjvUhjrRJeHlkNnJkKjnLlVtTvLOolNKENXxwWwciICDapPAWwLWwpcCcCPjJomqQMQqzFfITtCcildDLZsrPDdpbuUBRZzEeLMmlBUDduaAEeapBbIiqQQqRrnNPYysiIRrSfolLhHFUlLEeeEuyOoYiGlYrRyBAPpAavvVVUIiuCJYyDuUPgGTRragGQsSmNnGgMmMqIPAakKpiTtXxVvYxXqQSsyOZzHhoXpPpPxgsSuUSsCcCcrrRdueEUDNncOoCgGgaAFECPpcegGJjRhsVNnvlLnNfFDeEiITtRKkOrRUQquAaPpBbZTtmMCtsyYKqQtRbBOorTTtaABbkvVSLlWwgGeEDflLWDdrRtTyYYyCcJjwFrKkCXxcopjJqQkKKZzSsPreWwnNfFWwLluktTzqVvOhNnHorxijtWwThHJqQwULbBluhkKHWIiyYIsSZJLlLlUuNnkSsKDdgOoGBbaaAAiWwgHhKkGIpPDdzTJjKktPpRrQzZjJBbOIiLmjmMJvVmMMhdDxXGgjzZJHtqQQDdDdgCzZcGPdJjtTDoOQYQqnNyWwcNnnNKkQmMqUnpPQAaPpqDdApPeEaJbFfXxeEQyYLloOVvSmjeEiIYWdgGDXxvVwCKkcWwLYylBKhHNneEVcCbBOoNnYyzZZTwMrkKRkKiIARKkrioOIOpPoaPpTtqJjgGTtrqBbkjJKjJFfjJPjeEtTJpeEhDdpPHkuABbMLlTtnNkKLlIikTtkKQSsqhgGNfFpYyPsbkKBgGcCSoVvOfkKwWQqUuCPFqQfpUucnNCJyYjiVLgPpVyUuTtUbBuYHkGgpPDdKFUufhNrlLRLlNDdnjJmDGgdiIbzZGGtTxXeKkTGBLlWwJjbZbBzVjZhHRoNnOEtTuRuqeERrQnWwNUUxXuroOwzRrZWUtTNnTtDApPaoOdOzZfGgNtDdTYFbBDdWwbBfhHNgPqQpGyeEYcXxeHhlLEoLnNOwWCTtcoxXlOEeTtDWwAaeEdiIrSsRmMobnCczZIiAaPpqQDdNrRRrBTCcMCDdVJjvnpPNnRrwgGWjJhHFfmMNcSggGdosSOZzDvVGwwWKgGcCrfFLlRiZzIAaiAoOMcCGguxXUcCNnSsmHYyiIhLlxXdDUuhfZzvVZLlzlLBbFkVvKkvVvVKcCjJwWmMiILlVGVqQvRCcrhHuiIUIiQLEegMmGyYAeEaDsSNnYymZzMGgBbHhMmaAGgCLlIBbiJqWeEwqQMmPxusSdZzbLlUuZvVSvVsUjsSjJlLpFfPFfJdDuzFHhflLuvViIPpfFURVvBGgbrVZbBFfbBYKtQqzvVZTkKsSfduUDiIgNnKkGFFfpLlPERZTVvtzFfnHhmHxHFfGgGsSgSAabBwPBbrRAapPpaAPpRVqeEsSdRPpIixBmMbKkKkKtTkXJjFBbPpfihSWwuUYydDdRrSWwsJMmjxPpXDFfyQqyjWwJaAOogGQqjJwoOiIJpoxXOhSsyzZZzYHLlmSYysMIisqQTtdDSlLlRPiIpxXNnjfFJVvrfFbBPpsSxBLlAaHhKkDdNcCcTtNnMmSsCmRBfFPpnNbbKfJjFXxkEbiIBeMJjOomRrYLWjJHhwDdpPBbzqEXPBbgnNGpcZxXzCLlPpOoxSsfFAaYFFffFGgsSpBjPpJeEbPJsSwTtWjrRbBuUdIiOoEeKbBbLlBkqeljJLEoOQKVvdDkDuwxXWUXxigGUuINhGZzKCcsSEzZeSxoOgGDsgGXxSEeOCcFlKkLLlAafxXubBUxXIhHHhmeuUOwVvEeOoFfYyIzZmMiiIOrRTtovHhlLPgGpVscCSpPvpPMmrReEmMBbvqBbQSsVLhHyYlAObBoITNntHDdgfUuFtXTkKtSoOmMOosyYxXSsdMmtTuUAaDxDdWWgGSAasWhfFiIzmMZHfFlIiOZzWcClLMmwMmoIioOCiIECCcbBcdfFHTtGgFczZCfhvJNnqQOiIeENnqeEQbBoBKkVQqaAXZEejJxXxXwWlPSshHzEOzZCNeZzEXxpnNZzpgGPpVvaAhHXYbByKkFIifKkxHhpPoOAgGDdTlSsLmMKkoQKkqoONamPDdpsSMRrADdyYsKkSKkAaDZLuKQFfBHhbBfFOcCfFUueuNnsSAEeNnyYZFfSOorPpjJRQqXxUYoQlgGvVKkLDdRMTGgfFiIyYdDGgoOpPhjMmbBUregGELlRXxXpPjJWwOyYiICcoCcxUrGgRuDdUucamMACkLliIKzpPZFfoTtWwfFOSoOsgLldeEDGtXZzxsSsSraARQqVvfXxqQAqQGgaFxrRXJtTKfFkjqFWwiIflLgGhHrBLlbRBiIHhbRruURrMUBbfFugWwaATSstiIGPpmjaAmMHGgzsSZtKqQoOWwkcCzZHhyYyYRrvCcVWwTEEebBurTtRUnNFYyaAqQfbPmdDMpByHeEDigGIdDKwWeiIHhEmEefFoOWwtrUuRrRHhFfJjDdTRrkDecChHEoOcgGCaAwbBWBKeEkbsSfIUuNniFTtoOIiUNtTnDdNvnNVWwfFzZnYypdpPDPuiIzAaPIiXbZzBbBbBPpyYvVbOZnNzZhRrHuKkULGggGlyhHlLpPYwaAWGgzRrOSHhMmvVUkKLJjaAtsSpPTldITTttiMmyYpPbBCbBHhdDcMmBRxXNnrbvVXkwWtTgGGgWyOFkKfogGRrZzWxHXxhXpPwjJzZsRPxNnXyaAPIiJDdyYGgjQqSsJsIuUyYWjJwiSaABVvukHhpIiPKTtkKGgVAZzzPpOoZbBHcjynNyYAZzoOIiQczzjJZZljHhzJmMLlgGVcCYyIixdDvVXILlimNbdDBnEesTtSMpykkKKsSbBYPHhehHEvNaAtTcCUWwAaSsteFfEwkGgDOoNQqnSwcCZsdDSzsdDSseBxXbESGgsSWEeqLlUrNLlUumMnRuigGITtePpcCAadCcDPLldDpnqQNNnnNYyxXmDxXSsXxdGBbgMaQqALtTlfNnBbMPpTtCcPpYymvVnMmrRNBbIiFdDLHhPKkpVvPxXplEeRIicCrRaCcABpPjJVvbraGpPMmSjJsrRFJjoOfJSsjSsgTtClGgzZLHhudDHFfLlhYvhHVwWmMpOoJmMjBbPyuZzoOUKklbaABuaAUvVrRnNLCAacYZRrzoOvVaAtTCgbBGcltTUGgZhHrRVvbBPFdDfYypJUuIijKkPOopzZVTtvvDdVjJhWeEwHMxXbNNCceEnvVTFftQqnPpBmwWWlLwSkZzbBKujJUsvTtDdxiIXxTtWwmYVvyXxDdMSFfFftDiIqEetTMpPYqQymxXOCcokKpPAaPpIWwaGprkKRtTPgLlIiATDWwQqvSsKkGgZzZyYoNmMHGgZJjzbLlSHhsXxBVsSwWNFfhqQHnnNjJtTtTrdhHDgGyYJjQqlLYHhInNwfFbBEkKeWllFYyfLamMxXhHALyYXctTCTtNmPpMIoObBiSsriIrRRhHgGPpTtogteEoOptTPdUuDTGpVvCccChHPxXPpRLlwWrPpZeXTTttzZZzKkxExhHwYyWJjkKaAfxXpTtzZBbfFqQFfRlaALrIiGRrgjPUupPiVfFvIJicCVvIjYoWwOhFfPwWVQqOozZvgkBMwWVvpPerGgReEmMaxhHhYyPpHXtTmMAaGgBUSsubBeOoEUuDdYFfyzNnzZbBjqQJgGuGgUjJoOeCcEZlLjJJjRrGgwCsStTcWQqIiIuUiPpYyUVoOvpkixyYTXmMxhHrRAamMmwWaAMtpPJjiIIiwfFWuXxjJKkUugGFqQuKkUxXlnaANZzXbBxhmdDMHGbBGggLHYyhuUnNfVvDdiKkqQMmICcHhRrHhsSskSuUkKgGgGsmMOVBbqQEezZvVjJQqvmoXxOMXrRxHhsSyTtuzZJjTtPpUroOROHhMmoRrYmMvVlLRpPOIAaieEAaQqXxnPpYyGgNpYyRrWdIiDGgwVvMmPwWYykrRKvVwPpWnZzXkeEKZzxZzvTtVkoOKsScrRrnNFfEeDdRCaAHrRZzhWOowneEuUQpGwWpPwWfSshHFoOebBEEeGcOoCgGGgeEguUjWwLlJRrngGNumEeMEeXxTtUahHAgEePkXxVvKAnvVTtIiIiZzPVveSsEpvyYvVVBbgGNHhRsSlLlLZztTrPNntSsSrRsBbmMCvVcUunNWwkKzZUuwDDddWPpXRrfNneEqGdDgFfQQVuUvqJjKkLlaAFZrRLCcEeYyIiBbwWlzZBdiIDShHlwWnNMmDdLlGgtvVTfSIisYyFKkmiIoOMLCbBcQCcSDdsiIqiIZzBbXHhxHhBLlbHpPzxXZBbUyYFfOhHobuUruJjURBFzZrRWPpwWEeiIwoYDdyOfrRYyYBbsgGeESiIxXyukKxXHbBvtTVdFfDhiIAVvzZhnNjJyYnEzTtZeasSZzqQfFNnAzZTjJtyYIiaFfABbzsSbOoBZpPMmGrRuSsUoUbBuEeOVvDdgKfFGgJjOoTtDdlLkpTtuPsSpUZzkiTtzoyYOxXXhFfelLIiHuUhEHkKDCcdPCcpfvVWYeEyKjJkSXSmMsxXxcCoORrLlswdDFGgUBbuxNRJaAMjtTJgGrRxXdDZcCzqbBQmcCxXLhcCwWFPvVpfHlQqTtSzZsVvBbwWyYGLlgywWFfAPpaEbCcBKfqkKQFHhkexTlLhHtLlhyYHjJXxJztgGTjJRpPAayYrZjGgVOodDZzvrHhBbZzQqRvVgAagcCGZzgKaupPUtxXeETOovVaAiIbBKkSsGgyYPcCNBboOnOgGIbBioUuPgkKyGgsRrhHgGlLGgSWcCCcnNwEecCYBbOScCsRdDnNroIiLlFqQKkxXfDdGUuorRiIOzZpdDLwWlBUuxMmXtTbzZoOTwWtXxmZzACcaKkdDBJjbMZzSsWmLlMTttTcCnNwpGgqQJjDdUuIsSicrRgGCqQyYcxXiIxHhXdCcDdraAOoRoOGgOoVfXxlLFRrvDUuEVvoOAawWRjJxXIEeiLlMmQqrdDaAXNnENneUrRMmOrRouUuqQsBbSXnNGgxnNlLxinNDdDrnNZJjAazMmqhTtHPpZzEecCbBdDQHhhHmMuUbhHLlBRNEenmFfTtaAoOQqlLIiMiIaAKkPpszIiZdDSpPdDnIizZtVfqQDdutTUOMmoFCcPAapCcFffFbBBbjHhJmNnMMaArRFfkJjKmxXeDdyYXGgsSxXxGMhSsuUHWwmgEeBbTtRrEajJExXeATSstRrtEeRDhHWwJjAaYyYymMHYyhUjhHJUSsYyuxXumMQNnoOmIiMIixYytdmMtHhTCpPcDLlNncCkWwKaAsSLBbMBbVvmURraAuCGgyYcmqnNQRrMIMmIQqhxXAaXxseESsSHlLiVviDdBiIblQqfFrkKNnRrxqpHhPQEeXrFNnfGMmgPpGgRVvABpaAgeEGPbxEeXazZEeRTtTNKkYyIibwWBEOoembBxaAoOMmXfFRrMpPtfpPmMFyyYYPoOpgpqQPGOMmoDdtTNneETNHhnkKEFHhZzZziUuIHibBIhpPfpPHhWEeJqQNnjwCceBbQqaAdDQvCcVpkiIiYyIfFVOovdDWwKcCSssSqQNnmMyYvVPSPpsIkKibEYyeAMJjxXahVvHkKRmoOQqMzZrAmtThHnNbaUuMmARrSsBhHGxXKVvWjJwaArRkglLAPpaqaAbBvINZgGzCcXxnVvOQOoqIOgGgGoiotTiaOoAaNnUNnuYyukKqQUfFGmMTtAsSaGgglRrPpLRrTAaNntAkEeKMGgzZmreWwpPERgGDdCcEDdeUuTFwWDnNgGGVvgdbBUJjOouaAQqNnNeEsSnpPnNfquUGfFsSgHhpPQtHZzhzZNnNnUuVnNlLBbNnQnyYaANSsqhHRGgDdrIibBqQzZNnUuEeXxsSMXxNnmaMQqluULyYNYGgyFfKzZknYfFGgSsMmfxXFBbyCchHNncCsSFfINniImMtMmDdTiJuUAyYqQfuUftTFFaokKOEeMQhHKLlkqnNmjykKYsShYyHAeiIEaBbRKktTxXtTrPGgpTppPPpPNnilLLnNlaAbLlwWHhBIYytbBORGgEWwerKGgdGgDkRruzZUoufFaGgAXNnyYAayvGgzZvVwWhJjXxQdDxXqHyYVYnqQNGgGgfFokKcXxCOxUuxHhXMTteExXXxmOoxsSXxELkxXKliIeKiIxXSlLskhHfFXhXEeFfxuUTtfFYyWwXDdxyYHxXnBbqQGgVbiqmMTtAaQmMIBpPbmMHhJjQrRNnlkKLqBUuvogGxXLxXYyIuUYxXyYyilhAEeaHbBHhQqoOMmyYJjZcCeEmYyMzuUFfynNhHIBFfbiiILlUucCdDAKkdBbwWeEDEejLlJgjwWJGajTtSsJtEeTRrdDIiZzJsVvDdSjvVRrFfKqOoQoOkrRY \ No newline at end of file diff --git a/problems/day05.html b/problems/day05.html new file mode 100644 index 0000000..04d65c5 --- /dev/null +++ b/problems/day05.html @@ -0,0 +1,148 @@ + + + + +Day 5 - Advent of Code 2018 + + + + + + + +

Advent of Code

Neil Smith (AoC++) 10*

   int y=2018;

+ + + +
+

--- Day 5: Alchemical Reduction ---

You've managed to sneak in to the prototype suit manufacturing lab. The Elves are making decent progress, but are still struggling with the suit's size reduction capabilities.

+

While the very latest in 1518 alchemical technology might have solved their problem eventually, you can do better. You scan the chemical composition of the suit's material and discover that it is formed by extremely long polymers (one of which is available as your puzzle input).

+

The polymer is formed by smaller units which, when triggered, react with each other such that two adjacent units of the same type and opposite polarity are destroyed. Units' types are represented by letters; units' polarity is represented by capitalization. For instance, r and R are units with the same type but opposite polarity, whereas r and s are entirely different types and do not react.

+

For example:

+
    +
  • In aA, a and A react, leaving nothing behind.
  • +
  • In abBA, bB destroys itself, leaving aA. As above, this then destroys itself, leaving nothing.
  • +
  • In abAB, no two adjacent units are of the same type, and so nothing happens.
  • +
  • In aabAAB, even though aa and AA are of the same type, their polarities match, and so nothing happens.
  • +
+

Now, consider a larger example, dabAcCaCBAcCcaDA:

+
dabAcCaCBAcCcaDA  The first 'cC' is removed.
+dabAaCBAcCcaDA    This creates 'Aa', which is removed.
+dabCBAcCcaDA      Either 'cC' or 'Cc' are removed (the result is the same).
+dabCBAcaDA        No further actions can be taken.
+
+

After all possible reactions, the resulting polymer contains 10 units.

+

How many units remain after fully reacting the polymer you scanned? (Note: in this puzzle and others, the input is large; if you copy/paste your input, make sure you get the whole thing.)

+
+

Your puzzle answer was 9060.

--- Part Two ---

Time to improve the polymer.

+

One of the unit types is causing problems; it's preventing the polymer from collapsing as much as it should. Your goal is to figure out which unit type is causing the most problems, remove all instances of it (regardless of polarity), fully react the remaining polymer, and measure its length.

+

For example, again using the polymer dabAcCaCBAcCcaDA from above:

+
    +
  • Removing all A/a units produces dbcCCBcCcD. Fully reacting this polymer produces dbCBcD, which has length 6.
  • +
  • Removing all B/b units produces daAcCaCAcCcaDA. Fully reacting this polymer produces daCAcaDA, which has length 8.
  • +
  • Removing all C/c units produces dabAaBAaDA. Fully reacting this polymer produces daDA, which has length 4.
  • +
  • Removing all D/d units produces abAcCaCBAcCcaA. Fully reacting this polymer produces abCBAc, which has length 6.
  • +
+

In this example, removing all C/c units was best, producing the answer 4.

+

What is the length of the shortest polymer you can produce by removing all units of exactly one type and fully reacting the result?

+
+

Your puzzle answer was 6310.

Both parts of this puzzle are complete! They provide two gold stars: **

+

At this point, you should return to your advent calendar and try another puzzle.

+

If you still want to see it, you can get your puzzle input.

+

You can also this puzzle.

+
+ + + + + + \ No newline at end of file diff --git a/src/advent05/advent05.hs b/src/advent05/advent05.hs new file mode 100644 index 0000000..4aa6746 --- /dev/null +++ b/src/advent05/advent05.hs @@ -0,0 +1,53 @@ +import Data.List +import Data.Char (toLower) + +main :: IO () +main = do + text <- readFile "data/advent05.txt" + -- let ids = lines text + print $ part1 text + print $ part2 text + -- putStrLn $ part2 ids + + +part1 = reactedLength + +part2 polymer = minimum finalLengths + where finalLengths = map (\u -> reactedLength $ removeUnit polymer u) units + units = unitsPresent polymer + + +react :: String -> Char -> Char -> String -> (String, String) +react prefix a b suffix = + if willReact a b + then (prefix, suffix) + else ((b:a:prefix), suffix) + +willReact :: Char -> Char -> Bool +willReact a b = (a /= b) && (toLower a == toLower b) + + +reactHere :: (String, String) -> Maybe ((String, String), (String, String)) +reactHere (prefix, suffix) = + if canContinue prefix suffix + then Just ((prefix'', suffix''), (prefix'', suffix'')) + else Nothing + where (prefix', a, b, suffix') = reactionSite prefix suffix + (prefix'', suffix'') = react prefix' a b suffix' + + +canContinue (_:_) (_:_) = True +canContinue [] (_:_:_) = True +canContinue _ _ = False + +reactionSite (a:prefix) (b:suffix) = (prefix, a, b, suffix) +reactionSite [] (a:b:suffix) = ([], a, b, suffix) + + +reactedLength polymer = length prefix + length suffix + where (prefix, suffix) = last $ unfoldr reactHere ("", polymer) + + +unitsPresent = nub . sort . map toLower + +removeUnit polymer unit = filter (\c -> toLower c /= unit ) polymer -- 2.34.1