From 523c4446157bf1759b5cf92ae42782da9a192a1e Mon Sep 17 00:00:00 2001 From: Andrew Coleman Date: Sat, 8 Dec 2018 09:25:42 -0500 Subject: [PATCH] day 5 solution --- 2018/day5/Cargo.lock | 96 +++++++++++++++++++++++++++++++++++++++++++ 2018/day5/Cargo.toml | 8 ++++ 2018/day5/input | 1 + 2018/day5/src/main.rs | 55 +++++++++++++++++++++++++ 4 files changed, 160 insertions(+) create mode 100644 2018/day5/Cargo.lock create mode 100644 2018/day5/Cargo.toml create mode 100644 2018/day5/input create mode 100644 2018/day5/src/main.rs diff --git a/2018/day5/Cargo.lock b/2018/day5/Cargo.lock new file mode 100644 index 0000000..eb65ab2 --- /dev/null +++ b/2018/day5/Cargo.lock @@ -0,0 +1,96 @@ +[[package]] +name = "aho-corasick" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cfg-if" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "day5" +version = "0.1.0" +dependencies = [ + "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)", +] + +[[package]] +name = "lazy_static" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "libc" +version = "0.2.44" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "memchr" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex-syntax" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thread_local" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ucd-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "utf8-ranges" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "version_check" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[metadata] +"checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e" +"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" +"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" +"checksum libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)" = "10923947f84a519a45c8fefb7dd1b3e8c08747993381adee176d7a82b4195311" +"checksum memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0a3eb002f0535929f1199681417029ebea04aadc0c7a4224b46be99c7f5d6a16" +"checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f" +"checksum regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4e47a2ed29da7a9e1960e1639e7a982e6edc6d49be308a3b02daf511504a16d1" +"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" +"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" +"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" +"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" diff --git a/2018/day5/Cargo.toml b/2018/day5/Cargo.toml new file mode 100644 index 0000000..4c5c69f --- /dev/null +++ b/2018/day5/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "day5" +version = "0.1.0" +authors = ["Andrew Coleman "] + +[dependencies] +lazy_static = "1" +regex = "1" diff --git a/2018/day5/input b/2018/day5/input new file mode 100644 index 0000000..b2d22d6 --- /dev/null +++ b/2018/day5/input @@ -0,0 +1 @@ +rpSsrRAaPgGTgGtfFoOUuRqQFhQqvVcCHzZJvbBVYydDjKkquUtTQLzZlIvVPlLOopLEelWSswzZdDbBLAPqQpaiIlOmkKeQqNnQgGzZqEJjgeDdEcCSsyYpfFPSsAzZMmhHwWmMTtaKAakAkiIKfFLWwljJzZIifFaGMHZzswWdrRDSptTNnfFRXxrxXPIwWibBeGeQqEgASsaEAaXVvrRYymMOoxOoLcRrClOFfvVocCaADdIiYNxXIoOGgUHCchuEtTeRrsSSpPOorRoOMIiPoOtTpmuTtUHhBzZbstTXxixXctrDdRPUufFVvTRraAkKkKgLlGtSBbspnNbBOGgopPtTORrohHTXJjpPQqwPprRjJWSsxSsPpbcCBSsTtfcCXMLZzlLlmxSnNRrsqWVvuUwFfQbmMIivgGVXGqQgxGgBBbVMmrRtTpPyYvQgcCGyDdYqlLFdJoOjDcnNCFpPFffpRrtTPCLSQqhHmMsgGlMmPaAMmUdDBbTiIoOkKtFfqQWpPoiIOwbwWmzZZaaAApPAlLamwWVvMzcCMQuFfUqzZlJkKjLogIiGrROrRCcJBvVbMmjsHhSzZFfHhpjtTJeEPoTaAtOAxXalLZzbBlLHhPpgfFGvKEeaAkVAaGgGPwWpgACclPpsSLapPQqXfFxBnjJVvNIDdWwIijJiSGgHnNhOoPpHfxXFiIOHhtTTtoZzhwWkYyiIJAaKkrbBbRZJjzryYgGBRjQoOqAaWwFfNkDdKLlBbncCgGKHYPpPEepZzyTUnNGguduYyNuUQqnAaUCcsSDgGOouUqrRQtZzhFfStTeEssSbvViIBjyYJeENnfFYcxXCuUPpPlLiIppPOotVyYvTeEbCcBaAmMtTwWRCHhcLlvVNnjJrZzlLDdbBaAtgGFfdOoONnoMpPmDdGdDeEgSsBbQqEeUmMuDTfHQoOqtTCuUchebBEPvVpouUbBOXxvVzZEHhVvyYYySsetiIThHQqEsSAaVNnLlnNAwHhAIiXxaNnaAWaBEeHhSsMmpPtTbusfFaASWwULlKkLlvsiISrReELlqQcgGucJjCsDdSUZrRkKzmzZmMHXxbcCBcCvVhliJjILuUhsnDdNSHpPIMmVvivRiIrVVvSsyZzXxBbWqAaQwjoOJqQYoOAaKNFfUumMvVzZnrRwUuSspJjPWNxXUunLZzlXrRcyYCSlmMLXxORlLrooiIHhOOorrRcCRSswWMjJdDsSKkTtiRrIeEWwmXaAWwxAMmdDaszGgKjKplLPUgGukzZJwWhNnHkZdTtzZzfFZgGSsDtTCYWwlLJeEjLlyRTtKeEicFfCizZvjGgOPpoJVIotTOfFIiZztTPpsSZqQTMmNeEBbkMmpPbBYEBbOMkSswWbBxBboOXKcCmObXQqmMxpPBoopOoDdOoXhHCMmcxkLlKCJjQqcCcGSsgJWwjKkWwTQqtZdDnNzBzZTFfHTtYyqQhtkKZcCzsSbrxXRpPPpBmMShHsGVvGoOggbpPIiKWwFfXvVxTvcChHVdDtmoOMZTqQeEtHgGOohzZgwWGoOwWNnzqocCCcqQdDRrOoNnmEDdLlpPwTTtzZQfFVvqbBIitwkEeKWQquUuUvuOoZzNnUtFZzfTuUeENMmbBBbUhHyyrRjJYZGwWANnPpagLlzYPwWIipfXljJLQQqXxqpPuUIiPGgpxFwkKhHLlWHhvVVoOShHsFsSffFlLBbHhIigGMoAPpahhIixXFfHYyJjOoyUuYRrWZznaAQqlLNfkKdDTtFnNPpHhfMmtTFLuUoOlyYaaAAzGgFfypPeEqQYMfVZFoOzZgGftThHzahuUHAvBhHbDdgmyYMjJwMmWGNJjnpPTKkvVPpoOtUnNFfuKbcCBkgGBbDdZlLwWYaPVvpdDAyYyGFfgzfFdDyYqiIQuUXxVvNfZkKkKzFnFsSLsoTtOSRrMmVveElRriIoSsBbiZzjJkKocHhPBbbBpCIisSBbtTcXxZzjJaAaAvVCrgGOoRhfFACcamMjZpPlLyYXRrOoNcCnwWMmxWwnNmMkKbBDoOiIMmdfUuRBbbBuIiFVXWwDdxsSvfUrFhHqQUurbBRyRzMmZrkKGPpuUhHVvSsgAnWwLuUlNuPpUeEQhiIhHHqFfPLlcCpWwaVkxXKMmvwWxXOcCjJpJjPoYqQBbGEegEJrYrRyFfAaRdAaXfFLlrRwWxDhHNnLlRkHhcCKcvVOBJjNLlnbQqcBbCJwWhHjHWwUuDdNnpsSPdDhoOERretTpoOPhHWoORrwygGYHnLzZGgHnNrFfdDAasgGIiSmFfMaAhHjJbBbBpPGQqgnNkKlLkeEGKkDdgNnnNKSskbBhHKkKepPJjEhrRDrJjRrRMmkKsOoqQJjKkSSEefFsNnyabDdBNgGnFwWOSsoAaMjJmeEtTIFfcacrRrHhRCKkBkKbkKFfhHvRrVwWVvYfFZlLrRBPpbzIioOKMmpoOPOlLpPoZzTtSKksHhAauUgGKksXxsQqvmMFOUMmGgMmubBxxXHuUAajJnNvVLBblhUuXdDwWhCcHhHShHsgGvVKkkyYKkRrdDYyfSIsSbBiAaNbFfHXxpPhBnAaXDqQdXvVxXGRWwrgxxgGeEkKaAFNnYyVvqOoDrpPpPRBbfFfoKkOCnFOofWwNcGsSrRUEBbAemMWPpBbRrZzYIiMmSrRsyPpxXbBwWwWwELlFTtzZkjNnJKffeiIEFnNHhJjqQWwLlrjJRRGxXjJaOobBAjJgpPGPpaFLlfAYySsjJRrXxsSmMdDzyeEDrRUXxzmvVMgBbtTTtGZmMueSxXsDQqdkKuEeWwEeUUucKkBbCGgjZzIfFeEOeHhEMmcCFfWwvpPVjJdDVvcmgcCGpPBbMnNCosrRzZIiLlJjFgGfUuXEzlLZehHxASsazZKTmMtkWFZzfDdwWSMmsuUulLonAaZzNmhNnHmMMfFkKFFfMmOMmuUwWjJIiYRryoXxoaAODBbhHnNUXxjoQqDdAadZzDjTtJbBuUbwWBzwOsSxXobeeEEeeEVhHKkvEsSLlOobBUuQvVqvVJjiZzxXrRCcGIiWwqxukKUoOvVzXxvVINTtnJjZOoKKkvVkWwzMCGNnyoOJYyUujLlnNYyYtTnfFrgGyYdZjJzBbsSRrlpPyKkYKkkOWwepPEoKFEecalLsStTiIoOrRBbSXMYyIiHhmxsFfcEeCvVjJOnNEenNqQdTtgGcCGgDWDdWwkKIyHhYeEvAXMmUuhHDmpPfFMVcySsYCcCvdKLldDYyGgPbWwBfFzZPppkbfXxFOOgGoQqTTttocCBfFEzKkuvVUchHCicCBbEeIhHZElLeETQzZzEUEeuHhZlLzehFfxXPpHuUZiZCUuqQuUcAawWLCcnNwJjzZWlzMGgxXmVJjZoOzmMvOogRSahHHhARjJPpjvVCcpfFPtTtTSlUlLjJZKkzuLtTfFsVvAarRkeEKJYrHhRywWxXyYbRrBKkGjJONFfoFfOAHhayYccSsCUulLsjMmAaMmzTBbtZkNgGnklLKlRZzrhHmQqIZzikKnTtUuJjNwWnwPFfpWKkNMUNeEtTHhaJjhHbBAqQbXpPzZeExqQTtHhvyYVsZIJrRjgGiDdZSAaicYFfyCIreERWwsEeDIfFpSiIswoOWdDPVviQqcCNXJjPpxFeEfXnNoOCsIiltfFTLAapPStHhdRrNnbbBBeEulLZxXzIiwWNnNOogGniIqQUsScNWwwWXVvxHhhHnuYoMmkzrCJtTjqVvQBPOWRrXoOxbBEHiOoQqmUuMAaidmMXxhXgrfFRGWwxHrRalIiLRrBbgGgGAAaCqhHQFfcCcHhHKkhCLljJcRtTkKZkKBbzIhbBHgXxuUGEezZiCtTcrFtNnqQTnNfDRwUuWrGKkgPpCgCcGjJcNnbmHhMiIyYtTSEesIiFiwWIRrCjkSGgiIUuHhzVvZaVltTLvZzIisSCAWwTtauUcHhAFzZTtFFoeEGNngNnxXfFOHWwiICczbBZLlCIicgGhiIXzZeyYEnNoOlLxiQqAaqQWHhCcaALufFUlaABbsSuvVUMhHmpkKPwCVIfDdFCxXsSkKrRcivEiEectOoVvTpOoTtPFfwWUyAaYcCuBDdMLTtAQqqQcLlCalACcpPDduUaFfKYyIiHhWyYtAZzaTpJjBXbBxdRrALOCyxXUurRWwtTYcgGocCDAalLivVkKnNfFfFJzZiKkpPnNIjIOoKkdKvVKksSIifsSFrRAaZzGgXBbfqEeQesSEFhHHhByYUuUubBgGuUqyYruUfGgFqQIbBUuRQqqVvgGKdDknVvNnhHMmsSihOIfFisSoHIjOoXxDdJDgGyYPpemMETNnOotbbQMmaAwWqTwWfFQqtuUDdCcHgGEeGxDdKkGAagDxXauUAXgGxVxXAeElMAaCcmOpaAPnNoLonNneEJjxXNRTtxXrZCvjJVQqGbxXBuULjJJjsSIilvVWiIwgCcCStwWVvoYmMynnJjNyYNnKbBAYyYZzXxyaAawOLlorHhuURXxvPpUuVBuUDdbVsBLNYynlYybIiGOYydzZznWwLlRrNZCEPpemMcEeHhmeEXDdDdJjCcxhemMPvVBOobpSsEjLZzlcSsCrRCcNnQqdDVRwWgGyYrTtONZzeEntPpHhkKaOoLQqtTiIgGcEeCPpVBbFfPpnNXxvwWPpLlPmMIiNbBnuDdwWxXURKjLlJkSsWeaAEwcozZOCNqjJuodDQqnFfNAaOUyYOFRdDrfZzRvVSsFfKVviILlkWwXKLlbBkTdDLfFExxXCAacsgGSAxXABbaaaAtQqAactLbBaehHEAkKQqiIDdNnExZcUukRrMmpPalEkOoKebYcCyBkKgAaUuPHhpWwFftmMTkKLlGRrPzZpIidlLtTfFfFDUuZsSvUJjsOoSuOoOoVvViITFftcCKkwcmIBxXbJjrjJjQqTtJnNOoRrRSjJPoOpHhGyhwDdWGgHRcCpTtoCcORrsbBZzQoaAOfeEFoOFfqRrKCaAcoKklLjJbYyBZzAzTtXbBJjzZxXQHhYXxHxXhgFfGypPpPCCcZzhHzLlyYaAAhHDdMmNnQpPlLqhiJjIKUZzucCkKKLLllkWwkMlLuUmlqQaAajJgvVGAaAQMmSuUsLlUuqtTImMBbvVxXzIibBUuwvVrRWoOlLOoNNnIinpPXxdyAajsShHVvlLJxXaAlLXFkKfIWwixWLlkKuUwXAaMmMmiUuGgIaGhjJSoOsZuUtTbBZkKEeHdDiXPpxRrLJjlIzZNnbrPBbIGgWJjwGXxyYgipNnfFeETtYyFPfFiOoIPYyppaAPELljJYygZzKkGeykMBbmJjzMmEekKlvXxVLArSDdzZqcCWJjwlLQsyAabBLlYfFvVrRPlLtTpFvVXxqISZzsdDisSLlSsFpvVMmDFfSsYVtTvwWxXiwWhwNnWHvyYVIiFfUsSuorRNfFQqAAOovVabBaVvYOkKogGNSsnUQqCcbBuUukKNiIAKkyxXYIiVvvHhVedmbBfFMDaAMXxmRrCcPpoVvAmMlcCLhHqQNDddDntTuUaJEexXlLOHmMHvVRLlraAhAsSahNJjnGXvVyYNnxDdzZoDdOgiTttLkcCgCTnAaPpbBPLlcvVCCcrRGRrbBgMBbWSlLswDdxBbIqQeEaKkgEYuUyLuUoOrRmMXEexfFfAsSfFAasSXxdMmMmPpoJjlLFfWwiIOfQwHcwQqRrWChFfWXtTxqGEzvVrKkSsRRoYyOrOTtoUcPpCNnVvuFGgPLMkEevVFffFKrwWnNZzeERTttTmlpbBoVvYjfLVvlFsTtSJvaALlWwpPhezBbZLUuOTtolKcCkPnJwWjkKrUuQqRKkgprYyPpRtTPOojJiLlIIcCNnAadxXDrLlGgVvAkKqQiwdOoqQZCctTbBzZzmMtTufFJjdlLeEzZXxZtTZzPuUDaAcCdrRFflLZzzZBbjUvydDYyYHhriJQqeEUBbGgYyQqvVHhdXxEelzZaTiIyYFftAlyHhDdDdhHBbYKCtTcdDosSOFfHhILliUtTuaAIiZzrRwkiIOotvVTNnmJjsVKkuSvVsUiIvsStTSsSBbMICczZrRJPpjjOoEHnnHhZLlODNndozDdDdRrfFZzNyYzPKeEXxkAJjjUuJaMBbJdKkDVhHJjvjNnjBbtTXxSSsAaWSswAacXHnNhZlOolLLXxrREePOovQqVItTsZzLlxZzoolLAaVvIRrGGgEeffFVvIAaiTtpPrRbsSLuGEXsnNYKkypPSzZJNncCHhjNnyoOpPYHQqKuUkAaStApqQJjPDdaTthHeVvcmeoOEMJjmGxjAatTBVBbcCixQqXIiIuURrcRNrRnrjJmMKkTtsrRTyoOYtSlSsLvVUumqQMYtrhNWwIigGAaqQhzXlaARipyYQqqQyWwYTtIiSbBFfiWwerRWwEHQqhoOhtTgGPpnBqQbNvVZzZgGVdDVPYyLlpvRrcCdlLPpJmMIDFzZflDmMdpPxXYymhHMyyYXxcCYfVoObBPZqQyYzpndDNvihRrLlHCYycbBcCItTSsudDWwdpPDKlLuUkWwKkHhiAadydAaDVxmMRZCczrecKJhHKUfWwpPBMpPNnNZbBzrVeCcgGEFfDTtdJjDAaMJIiiIjmddmMDDqLlAaQuRuUsnNSrTtQqQjJmrDdxXVvUgQYybBdYyMsSmfhRrHSsLlhqQFQqfHhLljmMJAavAwDdrnaANRWaAVUulLLZzcgGCiEeLeJjESslbBqQdDbaGgbBbdDWwBAIiNnXxgGITWwtKkgGTtiiITteWLlBbwpPXHhxyVveECckaAKWWwcDdLkKHhhHrRNnlLrQAaqbBRHhlRraAKkFiIfCLlLlTtZFfzFfLmMjJmwWMnmMNMmxDIideEkNnKKkXlLMmlLRrlhJyxXsSYjcYyiIRyYrCaAzNnJjCczalLLlkKAhBbHUuaALlcCOmMtTrRKSsknEjJZPpzKKKdDkNnTtHxXhkjJdQqDKGgxXgZvWwVvnMbBmWwSaAlPpOXxHLlTtgGaAeHhEinNqjPpJAanNQIQqSsgGzZlftTFLyYdSmsgKkXxGlSQdqQDoLsSjJlgGQyYCcMxXjzAlLauUgIimoaxXkNnQqtbRoOrxwzZWjJXypPMmmMLlYfIiFtNnlLYrRyGLhHlgaAvrfFRpPWwjAaAaJAhHqWwZzsSCgGcQgGVYyvOoNnDUuBLGgEQqBbcCfFPpZkhHKqLlLlsNwsyYSWIiTtsNnSMaAVwWvmfxXqXxFlIiEeuUuUvggGSsuvVzZiIvIzZIiiyqQYnPpNRdDkUKkuKplLVKyvVYkmrfFRmMcCtKkTMYyqdmIimCcMOaAgGNFfOoNKknLlRrdYyEeDmYyuUXGyYgvfFVEdaAGloOLoQqXWjJWCcOsqoOrRNnfFZgGzHaAusNfFnSVyrRYvdfFEehHFPpAaMmIiyaAYOQFoOUuEtTehMmHJjELleNYqLlQQaaAAqywWnoOkKbEeDdpPpPAaSwLeElGoOjJiIDdMGgRrfQqheZzEHqQDdSsxpPdkKMmQHhrWwYJjkbPpBKgNBbnnNZZzTtziHhHhVGgeByYbwReEoOVlLnpPrsSutTUZnNkRfFSsxXJjFfXxHhSFfCcsuRJjrhRrHUqWBbfFmMJDdxmmMvVMrRsiIfFTtpPWwfFSKkXYyvWDdDdHfFHjYyaAJftoHbBQqBbEeYiIQMebhHBxXFHSsfFNnjBniiIHyYMmJtTfFlcCLEersSPpzZghHEeGSAsSasKRrzZAafFRrmaAQKkcCqbBuUFANrUulLRnaPrRHhwqDdQwWBOoJjbJjxXMmWMmaIixNCcjJnXdDsSlEeAAaEeSsaQqLoIrDdRYvVZzrRESsbDdBlQMmqLwqQWJjJNnVvvVlgdDNkKTtnKkWwyyYYsARpPuUHhramMKWwYyYyDdqQXWwxCcYycCEeEMXxmhHgbBnwWhHbDdGgOoBWYywNSsQqflLFNtOojIuUiVhkSsYyKSLlCcsHWwAAaGgPpAbbBBpPbZTtGQqdnLlNgGCcUuxzdTtXIiQqxDZXUuEjNqQeMDdZzTtTeEzuUsyKkhHYSHhbzZYyqQWXxxXwqQpXxPVRrGgtTrrRYytTCcRWFfeEhHwIiaACcOozZiLPpGgYXlLxtjdbBsyfFCsSweEPpdDtduUDTOoOYyoWcrRwkKbBzZGTtTtIiVTWwSsUuVMkJjKMtsSyYkyfFSsYAiPpGbLOWOHiIhoLlgGqPcCpEeCjJQqcjqQJqZpgGqQgwWGhHPeWUMmiSsXjjhHJdDJCpcCPpPCmHhMcOZzCtCKkcIJjiNnTheEHqjhxutTMagGJbBjfFfDdOUOoRmiIeMmEMGgYWwOPfhHtTFoOpDdoWEesRHNkKnhIisWwCcDdSAaJjrkmMKCcOvjJuURrvtyYyYwWdDqRfZzFrQCcTtTBLlRrRrbGgVeGggGEuTtjJUPplxXFfLUuVyGeKbBqQqQkiIrRCsSsSsEeScRrjJYlLyUuEFfQZuUBbzgmWsSwBnNbMzZlLZSsdNkFZzooOFgCcKkGwuUWEeoOfXpPxsSqHYyejJEhHUuTtSsQqNnhyYliISstTciupPXxPFfpUZzDdFxsSvwWsSZzKIivVOSkTtuUuQqRrhMoEeCcOeJjEmHClLccCAalLGgHheEvINniVIxXdmbQLlifFYyIuUHuhHtTMmUWPpxHOoNsSxHcuUCOJxSfiITtFsXjmUuDdarRkQqKFUuUQqufKCcoOkOVIivLnORrOoofFRTFvViIfyYEOKkJMmEtTejoPFYyPoOIiBbCFfxbBXhHqQcfIgGmMVviqQAaFAOVvSOoEXmMkKaPLlpAvVlzZLfFxVYIJpPPpjiFfyveHRIuUrsSOoPWwpqQSRrsJaAjLIiliiKpKkPkLDdqIOGcIQvVXWwUuaALMmlIGcCzqrRqHxqQVYbByeMsSmEvWhHwVQqveYyUuElLSsXoOoORrrRhQZGWwgzQlCcRrWwFfdOoDKkAeEnNbBMmTtauUDYqHhHhAaIaXPVvVAaPVvyoOYnDCcsgPSspaAKkGBmWwMXcMmCxvVXZzvVSnNUSsOxXoQqRCcSseBbwWNVvjJPpnbBOyeJjKgTgGvVXoObOoxcCXBxhUuezqVvHEMmeafFAlzZEelLLicnHBbQqhHKxXkAadDAEepPytTrVvczZUOouCRsSfBPpHhrUuYyqQuUehuaAJxXjjJeEJrRiIiLAaVvJJhHjErpeEXSsSzrRZMmNYCcDMmdvVyWwUupgGAVfSvVKkmgGCcbBkLlorRhHDdOfJExIzZigGykfyYSezZEhFfUcCkrRKSsnNtTTrIiRturIiDpPmMYydNKkZgGHhOGgobBJjsKkFfSjJjJOXxpPCxXchHSjrRcCJsssSEeimMIXxSGguCcUfFGgbBWwEeiMmFYiHhPpItTaAvwFMmfWMmEeWwGvkKSsVysSwGgdeEDvrRVWzlGgLbisSESsNJjPEeWwOoUFfuppPSsZzgAaGtTfFPuUIcCpgRrUuCcufWwWDdLlGCcgdkyYKDVviMmIewWiIQqoxpPBbRkKrXOCcIDdMmOcRrriIjJbBcFLoGgOSoOsAayYcXzZapPHYOoMJjmjtTCfFbljJIiOoyYsSLNyYjqlLQJaApayYIzGkKgZdzNQqpPPcCpnZaroRTaAoOtEeuDdUvVbBsbKkBEeNgGnraACcMmHhyEOoTtyYebBDiIjJALDWQqMXBbxmfcXIjJuYYyUeExNXgJjhHGZzZKkeEWwSoOykqQKEeoOjtxXzZLIilTVvaWxXwqxXlLXxvmheEeHhENnJjWwHTGgtUuLvVlhoOHRXphHPdDZgGzYIPlKeEmMFxXfBBbbMmKAaSsRfFrcCxXKrRkkKKJjkACcayfOWwSTCUuXxvVuWuFfUwSsDdWwGgCYycRsSXxaAAahHjuwQqWtTZVvDGgHIiFfXEeMTtmBbxQqyYPOyYCyYFfEeQcIfFNQqnNePpTtEeEbXxBCYyspPScsSnuUispPSCQynNZTYqSsoOQCMDdnlLhOoHjJMmwWHMpDjJdPfqDGrRgvVvhsSHFfrRUrxFfXgGiIutXxNXxnTfFURvVwWqQugbBbBFfcMHhwwWDuUNnHSsfkKJjFqQOoIyMmPpYJjitToORrhrRoyYSsmhHMZzeEeEcDJuZzNjJnRrlLHzIWXxiIwiNnZNYyRreEqBbbBAabBQoORFtTffFNnrprUXxloOlBwWPDBMbBnOkKKkouUtTVvNIRriwWcsSCAJjAtTFPpyWwUuYNnFpLlPfLlseEpPkKddDDPHhhHSOpPOwWQLlyNnYeeWwEoOrRUlLuOoiIfFEgGbYyBNEennNZOrRoYjJmQqhraLmVvMqeEQyYeiwTgGtKoOVvlLkHhDRNhvcnkFfKBbVvVeEiJjIvNCAdXxCcDFeCnYuUGWwHvVhbBWpPtxXLNnKkzZwWpgGPCycCYQLydWgvNqQnrxsvVbdEeDdDBRJWwjFfQYsNLlnoqCNncMhHlokKOSnxXNsgDXpPMzsSrJNOonjcwGggGZzWdfEOnsSNVYyvDdaKkAAaUuGkBbKnhhHatTyYAKksSmMmXVvEeOTtoYPpKkUuSsyxFfXbTtLlxXBmSZrLlRXxYHhydEWEewzZaALJjHhlejmonNNLqQTtUuPjJCcEejPvrRVvVjdSQqJjsDkIZQPpVaxeElLZmLrRlIuUqSNnsQjHhQMmqMmgGJiGjVvFpPfOGXxoOUZzuZzUuovVzpPZPdEFfDYyderRCcAafpPpPAaFgjJlnNTOotYyXAagHlLlcFfCFfVsSdDxXAavVjqwaAZzWDAaiIYyhHbDphHPrRGtTiQqLSsTMQndDJjCXxDdlcCvVwsSNnEdWwvwrdAaDRKBlLiIiIxXHhRIiquUQBCTtcsfRrjpWwPmuwszZqtVvmmaNSsnJjAqQLBbhHlJkWaXxZxhvVlLHIiNngXxdVyYvDntBbXcCYynNdDUriIRYySnSeEKOjJVVvveTtYDwWeXxoOfFtCcAaiHxXKGlLgFfFsSegsCcVzsSOoZQnPWhHtTwpNiIpHzZhcEeCRsSrBbqQdDhHzmMbFSSkKstTQFfcHhCiBbIrAaPNnIipvVqgGQxXRStTilUurRkhZfYyWwbiIHiIqUsSrRQPLEiIeJjigGoOcPpCoOEelkKAaLhvnNaBbGgAEeVjwWQjkKJZEaAOovVUiImMukKEezzZCcrRLRrlvGgsddDmdWJjwQJVvXGCcQqvpPVBSsWKWwkXxUuTtLeIsSTOovkoOqQOiICbzZiaWwAINvVYyjEevkaAKEeVJuUVJjvKkntjWNnrREekRrjJoOQqKVqQAoLlCSVvsccfDdaAfFZuNgGPpnKhOXxoVvxuoWwOtTCcdQqXdxXYygLnNUuqQlHqQeETGjJPbhgGEVuUfZzzcCPpcSCaAcbBsVaAaPwcCWpRrJNnjjhHHnAaYywlLcCWNtloOLFfHOZmMIgswCJjeXxcohHjkKQqhHiIiFayYtZhdDDZsBguUdeEidDkuSoLWwEaAlLUMmPpPlLQzbBTtcCtTkKSpxOoVvtTGgymFoOWwEcCbBtuYSBhHbiIsPpuWlUetgGvVTiIlLYxXUTdOaoOTvQqVmQqMsYyjFXxHhIjJkKiwLlCcEeMZPpMxXmZsSsSPCUtTbBpVvPucvVwGTpPOotuUHgGlHFWwrNgoKYykPUivVIupOeEFkrvmMyYVabRRNPEsmMzZuUUeWwWCcrseEBRrbVvxXmMaAFMnsTSsSUaAaAMLOoYbnNiqQXxrRMmaXLlxMxXOXlyRrYcihVvUmMuUuHLyVqKkfFyAZuUfFzMmXZzKkWgMcnpPQaAvLAaIilVuxpXirRbGDdmMMCBbcBIAaiXLlpjJGQWwsyLljtFfYuUSJsSjsALaAKkUuSsmgGgpPEeHfFhjJfwWFJYaAkKNWwJjnyjCqFfdDMmLlFZzfqQoAaOTLlDaqIirjIiJPpzgfFZzeKkuQqVvGgUSsafhyYVKkRaArQVvFfqbnJJXsSxauUjaACMmyYxXDNqmrGgDdvUuWwOyxXzUaHEeuWTEegeEPKkpGtTQUuxDjJxlLhHtGGPiuPpOoUuUbBAMUofkrRlLyzZejiIWwQbBJjEiMgSsGPvQzZKkmMKTOnNoqNHiIxXPpZVvzhnaArCWwxXccCRARQqiILUlLHNtCseFCcfNnBbNzZVgGvyQXxIiUAvbBHhBnNRoOrxLLCkKqQGdDPXoOxxyYXtTSFhbBbdDFfUUuumMJjrRniINiFfNmEebTHheEeqnNhQqwWrTtNqaAQjTtIyYdhHtjXxNnhGgxXpoOPhHTtoOaEiEeqQcIeErZzPOzjBbJZDdYHhXxyLcyYbBOoqQuiIUBbnRXbFMmhgGIiATQmkQqKMqCYwWwAauUgGhHWlOAaQqICcqRZzMmrfFHIiaoOCcAeMnQqNYOqkSZzslHgGhinNJjNEeLloOWwnNoGHhyYlLgGgaeGypnNPYMoiImMrRAaHhMtTmuNeLpPAaqQWSsGowWOyYsBAmeEcNnRTqgzBSsbNzZJjbBJjnBXxqWQHhgkKGeEkiIKYXWwOCcUuaIfqQwPpsoWwFftTqQSbHhOovIOtklQqGgSbBfFyHhYSnbBbBIRbsQqpFLlTtpPdEeDxYyXxXWaAvVsJjTtjFZzfNnqQuUmRjQcsSDdACNFlLiLllLBbnkUumMLsSlqdrRvSsIiZzPqRDxuIBKkYylLkaRAmXFflLLlDdOqQtHhnNzUufFopzMmyfsEeqEBbHQrLHhtxrsSTeEtRFiVbSsBvYRrgGykKbneUfIiTtFcjZzChHcSYyIOaGggFfqQiIJtTNeYyjmIQkJnpPobfeElLwWFSsLkKtGIadtjZzJrNnTwoaAOaZSsxXzUuSqQAaQDdgxXGrPpSVAMajqQdOuUQZaDdAiIbtxqbBQPpqLJBDTjJEmMUtTdDTtKcimYQljJyYPpHQrZzjJZPaqaAgzoOZqeEgIiFfGNJRZZiIPvVRrrRpqQZlLzPpMTYyudKsqprREEesSVkKnAlmMlpPLvVmnYFfjJwsaPAapcGCcPpQqqQgWYyOoqQjkqQKqiOTtkKRrdDQzZqElLWwgqQGgGyYNVvIXxjyTtJjIiHwnzZNIfFaADXxIiMmdiwWOodDNnNWoONkKexeWXxuUeEEVveFrEebdTtKkjZzJWwnNftTkvdDuFfxXUVKFJjJjHUuhPoOpPgPcwWCfFBblLEMmethHTtMmxEnbtqyYvKkprwWAGgOorqgWGgeEiIKFuUWeEwBJjQqEeAvVqVkKzsrRSZzLuYyuUimMImHhfFMAJjSsIUuihNnskaMpRVAmMKUYyukrRuNnLlUIWmMIiwKkOBTtVvoOeVvxfFXEnKndgGVXxvrGgGHtTGbHhKeOouCaAeTtERrVvdDBqoOmLPpqQwJjxFwhHrRgiiIURruVvzSqJjKWwaAVvlsfFuqwrRWEkKKtTRrnOoaANjzZjJPjBtTxNVvnfFLlKpDefroLEelCuUcwWsqQeESQIilLbBNimXxkKMhHIIOoCEeSsMIfFGgiWwtNnAkYuUtTuUpTMmNEebZzRrFKxXSsFfASqQQhHheslJfFjWxgEKkesTDlSdDsStyaAyDdjJbTtBTvYuUpPidvSsJjVpDdPIzxXZpopPOxyYZgUpMeTtudDJNuOMmNdjJGEegkKDCcPpwQqlZHGUSskDdnNuiRrGEeMpeEaArRPnEeNHCclrjbXBhJCcrSswlLlhqAaQFBWwrTtCaaxXmpJZEPpeZWkKXYECUupPzsSZawjspPjJhHAaRuAySPphDZhTCkVvlLcCxhHmcCMTYIiPpZzypAyMRrmPGgpUvkdDGKbaTtDdDIZsSzbnNHhgiCcmMlLFfOoNnIatiITPtcCTpHhaARrvQqEeVVEaFfVvABbZjZRlLrlLQFpPkpPjbCcjJBPCcRjpPOcCBWzUKkCchHMvqKNnKPyYBbppPKuMRzZrZzibspMmdDDdyYjLSQqaAkKkKdJjWGgwwTBezGgVvZvIiVQIibgjxXCctBrKkHdBoOqTlLKRrjJnNkIAKkaiAZzqQawWqyLbBlxXMDdHhmyYjeEMsSoOZDdzqQuAfGqzZVIiAyeabByYAUvjSrRiIabBSeYyEinNvVyfFrRkKYnuWwUFfxJjOoXUuNMCWKkGwxcCXiIWgmMYoOvVoOybshnNVvHpkswWQqELlehHpsSPiIOcCcCaiqQKiKkdDKyGgDkqQNUupdLlDBGGFflOOWmuUMHhQSFKkWzZwWwQIinAaNQpPqWwAnKGgkDdqamcCrjJwWydwsSlLWDdDfFQmIjJZUznrRqIqQiCciSHfFwWnNhPpYnNmyHhjXxvbBaAxeZPvVoOuDwBGgbWwyYJTBNnqDBbdQSIWwEqgfZOpnwWVqwTvHVlggGGXInNQXDKkdHyYhnNpLLlllpPLtzDNyRrVbfksgGSezCmKrRBbyoOYKkoOoOgzAIuXxUopuUCzZdVvBXZzgGqYHyYmQgGcCQqWNnwGYygFjXtZihHIsSGwqQiYyIxXefiISsOZlkCYycloOLNkKdAduUuUuNlgGPrRJVzEeHhUUfbBlLFnnwajJEYwrReEHMHxXhHVOnNoWuwcCWMmfFUKkGYyKXxtcCIwWCcHhSKJjknNFfPFdJQqhBbtifFITgGyqBmMbVvtNOuSsnxZzvALlaIiPFfpFomWzZJQqjtVvTkiIKomLnZzNqHPgGpgGXxuDdUNrRgZzoiLlgGIRrulrAaRNnrUuaSTtsARJyXtTyYMmmMoOOBTiaAPpZzKkgDLlrcpPQIiStTfnSKDdrrMTMagGqQpUubBPAfFmFfMasSPpXzHBaAbhZHukPpERaVuOoUnvVmMzBAKBsSuDiIdbPQqcaAAIiluzeEbBeIiCcEaKkhwWhFfFJTtDAuFUXUudDHxXhCcpPgGGLFaGgAfSssSyYQXxcDyAaYOodMqQSyYgGmMBbdDpPiIMJjckfFKkKzRbgGBhHuZzuAaUzTtZoCQBbFfkkKBtTbgGmZfFznNhKoUsyMLwuUMXIikKXmyYMxLQxbWwfFBKRrgmOogGFDIidxSsXeCCccExWSOjJfFoNnXDEedDKhHQcCSMlLifXxmhHMkMhpPHdGgFfcCZtTtQqSEIieYWcNumjJMUIITtOoiEeiLSswWlOdGJjCkAanNGgPpJLyYljJjrleEZcbBCiIzOoOdKkLlsjJMmMmRdDxLlxXqUzZuQbyYgaJDMyYPGgGRmMrCFdhHyYDIMmAdDbBrVvgGHhRDCgGMmIRINnfFiwDdWWwrQwgGjJiIdFrAJjnNcCaprRXxKBHIRxTbKPXxlJRreRRrrgGCfFsUuSXiIFEefhHbklSUuZBbTtzAgjJKkPgGpiZizqYkKrRQqitTkKUguUruURzZvVqZUJBbjFfwJuinNnNmMhzbrIiKcCOokzZRRqQHAkussxXYlRAabEelqWlnWivaIinjJiIdDSFfDdKbBoOoOCcaQpPQwWOotTtTqPpMoOqdVQWwIiKkEMGhHxXOoXxPpMyoisSXKNnMBKwpUuoOZxoOXnRikbBKzZaAIrrRuCsgGpIYyiKcCkHwCqQcgkeEbyYBSMIiKkUNAaCcKLloeEPpiyYxdinNIpPDBKkdlLhHrbBTtsSCNncRYJjvVEjJKEUGgTOolFfOoDrmRZwWhrdDdqqcxHhBaATtxzZaAXJrRRkRrWwRCgGifBVvQnxXNqOHhDtvQcCqVTaiIWwZOostUUuuSsiIBlkaAbVtubBpPMIiSGgsQBbqVdAjTBvvpReXxEyYCBatcPBfZzDjjJrRVvKHlLhoRKvVwWlLVJvKYGjJgWwGgdDFfFfuUbdjJOrRKkMmjJTlOobBMmLsSxwWXdsRMyXeExkKMSLlsKwshHSWIiiLQqlNnIkbSPJGgjpsvKOokLhEeHHTeEkTtKOoINVJjXxvPpniUuyNxgVvGgGXIioOxXGgzZMmMUuIimFOxXjJeDdTaAtTQqFfmuWwRrPdaNnjHhJQCLKkDdUukAaFwWwIiGVvgJnNDVaFfCczaLqHhjZWwnTtqZzeEQMmZzgAaGpiKRrkzrYzZseAOoRTAaipPgwMqQMxXwgAoOOVssSrwJJjzZuIPpkKBbDdiWwKkmqQMhHaAWrhHRGgHiIYQqtyVlDfyfzZmHFfyUfFFfKkKkAcfMmnOTnNDCpPpFfqQBqpPQWqQElGgEeSEeFLeuUEKkJjlQwWHhJQqSeEstsPpSsCcvVSFFWwuPpUlAaCZzWwbUnNTjowsIeAZzlMzdDhHZUKzZjEeJJjoOvvVVdDZpmAWwWkbZcCqQacCZGgCpPKwWVvkqQwWatFqWWCcFkKkKVvCcNkyYdDKnzZiIxXfwAatTSsDBrdPEeLlpQqDfFPSsNnDdPkKrRzWwwWWwZYdDyNnORBEycLJarStrRjJGUIXxNniXZzxNdYltCcTLlxXgeEiIEeUGguWYywsmMZKmMGgtTkuTAaFyqVvQtFftIqpPpPVCKfnhzKkRWSsxiqoGmZWwzZmMdTcCqQxAOoxXhHOBGVaEWZhWbBwHaAljLUPpgGZkWwKOyMIimKnQSIXoZHJdDXOooOpUklqQvoMmOVgVrXiJFfoOobZIiNgTCUuUygGhHtrRQPpqTrjWwdORyygEdDqmMGpPgyDzBbSefbGgSxXNIgpmMpPPVkZGgzLljeyYEqekKECQARwMIlFoOaHhjJGgcrRCBBbwLMxXAaBEeasQwWmvEJjevfwWeEFPeFOoxAqQKvNnKNnYywqeqmyYdItkKEYyYNYNQwWpuRrUwWYmMgGWetTEtDdmvOeEPVgGvXjJlwAamMBbdzoOZEjJMmLSslZzDdyYJWwXSlOzIiZyYmMDgGVvnNGLlhxXHbxIlLNFfocCKbBZtsHEejTqMrKTthZLlBWDdwgHhRrqQEQqICLlYIiTwdCUaAuhHWwcCCJjNsSnzZxNCccCnGEeRrgsCxXdDcIixSvGQGgqQgWREdGclmMdDgGLylLjJaAYMmgMkgpPoCcGgZzXPpxzOoZoolHeSzfXxKINnMxyIqQEAkKaeLqQqLlxmMRWbPpSYEpLaYyAUINhhZzlLHqQEvVOfkCQqcKlLXHUuhsnTwSZzIisEeeEtbBNnTvTaAlLvVtzaQqBbAXxacQnMgmaAeENqqZzQAabBvVyuUZkKzzGfirRZJjHBbhzDyYdcCkrDdeqQAForRRYyqaqWFfwSswkKRNnbBBbmMKkrpzwPpGgyKklgQqxxwoOWOFVvCiHSPpmIyYTrRjHhHhYyxftwWrXupxXDMmWrRcCgKkNnGsAWwAbdZzWaAbkLMsfFqUmMZGghAaxXQxXnNLtTDFfDBpTttgGTPXdDxbEeKRuUXqyYXlxCLlfLyYlFjTDOoKECOTtoMmyYqbhATTMmCnUIXxixohdZSsmMJlgxMmNnFkKXTsgtAdjZaAzZMmrRDwDHHuPGwWPMLhHwWMJjNnTtCFfIyicCJjRrXxJJeEVSFdDNnfsowWtAnNWraAIrRrfAxsJhHjIqleETtLGvVgeEQgjJXjGgyhKoOkWscCJjIiJjSHUuGeRJwiIiThvVYyfPYdDgSBbughZdIojJOiCctTfEeHMmFijJfFVvJJjlioVyANnuOvamMlmGpPKFSUlXnKkHhlLNwWhPpiIGyVeLEKxRrgYVvoVbVQWYwWavEDOKqYzmnNDdcmXNnwWwtTYyWRXcsJLvVlLSCZzcJjPQhEeHqxKcCdrRSlLyYsBHaoojAaJGrgGtbBAaqQZHkGaRbBjJUxiRroCcheIiiOehHxXEXcfKkFmucCngtpCKyYLlZcCDKkJMZVxyYSsSpFfPCkQDSfyLlxXYHhSVPAMGKRrkLLllpRNnrPzZiFfIWwgmpUWwuUYycCHheEDdsLLSsjmJDUfFVaAjrRaTtdDnBteEhwKgaZGmMzZPpYgGfiDpTVVvZzvVDdeltTwrRWjGsSrqIiHKCcXxqsKkoOKxUIOWzZqQwtSsaAwWTFfVviIWwWYyfQBbogBbeVFeqaRSsMmXxkTaSsAnUiIEevIztvVHCzmZcCcvZIzrNnGgdnNQQcMbBnjpYyTWOkHSRBwNnQXPRpCgGZzcrRCVlUoOLldUpPlxuUgGcCOrMathHhwVVvWkxUCczZOIogpPFcZMWSxXswgcUCADPLlwFVIYKrEefYyozZeleUnfAaFQqQqyYbUFKPvVuUoNnwWlLUgAIXitFflAlrROZzoLPpZhHzkAaKqQlWwLvVImMXXmMafFyYAxEKkkKfFOvVGgnNoSTtsmefhSslTtLoOVvzxXFfaCcIdVAnnHhlgjJzIiZrFfUXtTxVvsSAmMUWfSAGgzZTtdVlLOouUvJXjJQWFLlfwqxSsjyTtDKOeEokTtFfFfdaQqYyiufWMoJjOJjqgSssfHlchHidDIPpTthDFeEHdDZDvEecUoOyEbZzoLQqlLlONmsTfPkvVKqQPMkKcTacCSOougWXxDdOrYtsSkJttTmpPMJzZiVvFfiKrXxRkoSsyIpcCPERlkveEMHAwqYfFwWEeOcxWwxXOogGXCRvwWwQTTtBpPFwmMeEbsqQSRrJxJjXcWmzZyJDdLfitdJEejPpDUuhHTIygGnzZYxkxXZzKkKBbwWbojhUMmPDdvninNIiOoOSsqQbBdJjPpSKXxHOHhFfAzHeMmDvEeeEBbVpPnNqZzwGOogQqROoNnHACcXiwKkHrRlLhZqQktTtHIWKmFYyTNnvpZzzQqZPYQSNnsOhHYybnKkujVpmaKkIiAgGbTtDJjaAIvaAtmEeqKCcnNnNkITtekKERDdXfFkPVOEbirIhHIfUAaqhlhHRVrcLlDdPRrpQaxSsZzWwMYyzgRrFfhEeQNpPXqQxUuhtTFMcCzhQSEuUmmCcKkiQCcrRnNceisSqQkNnbjJBNZznDCcCXxfHhTtaApliucClrRLYyBboyMmYoOlLVVvvNwmyIcuOvViaaOoUHkEhHezZQqKNRDHbBUtTJDdfcRrkKQqOOozyYFJjoOqXtAagPpFalLKXKMCcwESAiIBIWwZYyoNnwyNnYZzWRyYqJpKkfFPphcwnmMSszCsSssuosYxgPMQTtqFMAhHFfRdDraOaeEAgGUuGJjfFUuqQNngGiIiINnUGgfwWMmsuUzZqvFJjfYSSZwWaAYyzqMcRShHHsQUuhEyrRYyFfFaYyOtqQaABTtbwVvuqxcCXLPpkhHNUMmPlQiIRbSUzZuSmttwIkXxcmEtsSeoOfFNvVnEQxXBiIBvJjjJVbbhmDGgdMeEwFbJjpeWQqBbwSarRvxunLdzQwTtVwCIKnNhHkuUjvRvfFtPpPiIEaAEwWWtrePQqpEviwPWOLlhbQlpNKjJMmWJldDWwFcCAnzZPoOXxpAaamMAOXBArqQYvVyviLlqQIJbBNSsnGLRrWtGgTiIPuUHOoemMGMNnCgsdotQznpmzKjtUQeEoUuOAWwanNLlKkWfJfZzCcerbjkClLKoQqnNKxLEekdDKmlLrRGgYyzZGTtxJwVvqpPWiIYtTyecCEwQwjyFEbOsrboOrRyTtFfYBXxiIYdJpPZarRXCsSHlRTviHJjudRyRrsNnSJsSIGgiGFfCjVAClLcxiJYyYyaDdvAaePzyYZYXcCLlsIicisSIUuPYCcyzZNnrpPRGgvlLccJjCCkAaCcaAZxmzZMfDAaZSLWpPwQLlTWwBbHYnNyyYNlKYwDDMmCccBbCmEeOoMbPpcNIKkjLlJYmaYSFfVvuUsyQwWHRksDrRdSOoIZzmExakPkVbYJvNhMQqAaeHbXkeKdDkKYykAUEKOcKkCoXtHVvQjHnNhHQNnREedDbvaLeEmiTgZGgzeqtOoWwjJYyViILEyYXQnNoVYBuUbxcCpRJjrPXBDqbRrRycoiImhOIedDEuUUuLlUVuJYLlCHXGgxBHhlrcCEekKoTfvqgGFfOnrRcdDKMmwWOTGgtRKSsSdDcWwPYTtCImrRaQMrlVFaoGMhHtTENSdDgFaAfCcLrRgGMMmqSDdzPrRfZzFMmCxnNXsaLlAQqoRtTrOHQGYykoOKKQBAapPpPpYZzKjtTfjODRoOrpPOFfVxXDdmNnWUBzzZfwWFYBmMyShZDoLXxckRBbBbZbtTDflijJYzFfuUSsFPaGgMmlBIicDdkQnPpxXNkEeKzcCQsMbBijfFnJjNGHhyYSbuUJjcZHNBLlQqbnhzVcfWIAhHeHxXaAhcZKkzCFIVSoOzHEahTuUzLlMUumkPEyaNndDHdIigwARTgVwWvxXqvWlWHhkKHbBhVYyvvOeEYAjGMsSzJMkZFRpvGLlMmzZsQqQpPaAqSgGpsPpMYyoSMjJCcDdmssKiZztTIQCcVMjJGLEWESQquRTOCpxXPJsHAsqQMEqRrQlLRcGRfpPERrEeDvgXxpOwrRSomEeQqbBakKOsXKsSkKkEezygXDLnpUzHhBbBuUJjbyFfKewkkdEeDRjOEPIfFUmRrfwWFJjqDiZzeEmuIiOkoDzZdOITvVYmsRrzhHvgGVnzZyzZrlxNnBbsxXSMcpgGjZrRcBYKJrOmJCjtdDGOCqQcTmYWwVbBGhHOXxGcDkEesaPpASrsSTtudjUGqoeEoInNAjdDJzfFQoVuQDdqLlUcmKBXxHnKkMsMhaRrrMSsgGXSEkoxMIcCoOhKMMtAayYZMmjJotTOQjJHdIzTAatEHhlLgpVsYXjWsSwYKcCkDXChJCoIiTDDPsSRuUrlHJjBbrYyRuUhLhHWQTWwVWwvQqtPMmpFfaAjJadkwKkWYytqNZKkzwWaAJTIBjJAaHJkggfVvCkgGMxYnGMBBORRrroxHhWiIwgGZkOWkJZvssbGMxXapReErvyYVQUIBbkYVTkKpIutTUKRrLlLpPTtfBbdodBSwWvVsyziPEQJjebWwfMmFYMptTPTtmteEJjJFNnxZCLxuEvfFYyVAvVAGeEgcCacKkeNndRrcCDEcjXxpyYFfXLmSsMmfTroHhwWORBuUbhVeSdDyyYQdjHPcCojGrmIipXxVvKLlFfPAapXxYGbKkTykWbBwUPtTHkywWzZnJIUbBMOHRmvVXlLdAaTXxGJxaAVBSsmrNQFfPpXxqaAlLOddDdIiNniIBbOMmytFfzaRiIYyvspPjJoIsaASSLUuUuxXJTaDeEtTXxBbIYyidxXFfZPaUISQqmbBvdDpzeeEKuUVzcqQlLcCftTuhHUFNPXnNxQgAMMiuUBCcgcFtyObvSFfhVvudDrRUHVXHhgGakKARmoYyOjOzoorhHKkmMvVbVvBhHhhHgnNCvwJfDdBbsHBbhnNNnBbkKNDmMdZzEIWTWjJFffTxeWwscCYyjJMmSEzZoOnaALlwNVRrKXXxWwrrKqCVLnJIdDArboOBROISHsaAHLlolKgGybBVvxZTyYFftzXDdxXLlbmhJOPpoyICnNbBxOoXtlRrvYqADMUuitSsdDYYwVwWpPtTjONnPzZzZGpZgWOoscRhIXIoEgGWLlgGdeiqUXTbBmTYXxtyWwMCaTlOXxotJiIjTbMmaVPhVvlUkKYyqLBGSsjOoqCcmGSsgLdZzHAGgbDTtgQxKkyzdVSsttTwWwnUGOoguuQqnNQVSjrmrRLlrDXMjHQqBjtTsfFqNGgnSsuUmiIEeOoWqQRyYjoQqLgiCaAOGVvHhlfmDvOPbBcCpxDdFZtTXcWPJjXiIGuLvcNGtuUOzXxkZzyRIiPALwoOQqkQJfXXtTrSshHMrZdnNDhkNgtTQYyqWJCKkKkIaVvFrgGSsRsXBbnmMRPLNEenPDdxOjiICwWQlEPGMaAmACaRtEdqLhHlZcIiSqZthFBpUudxcrQSweuUEcpANnCJUeEJHGgbBGudZzrkjJtTIOiFgGDulxRrXxXoOLUAMjvPFPdPDdXlxHQyYuZGsmMqQYIhHiZzRFoksBbSpguUlguYyDoZFIiwYyWfOGerjJlFmbOsqQnNTtKAzhPpHZdDZVOfFoBZKwiFBhtTODapPNUuOoIeeqQYwWyWwZzPdIfnWnrHAaqFUufxFxhHWIiMmjJMXBtHhiIVvAqXxDdNnQUJhvVztHhtbyTbBFCuXxykoBbOEzJMRrrufaybLZrHhcCRAVvaJHVNnZzvKIdBBFKyRtTVsSvQDNjJRrwTtxgpwWhWnNtiIMmVAAofFjCNgGnVvRLhvSsAfFXxQqxMSseweEWXxoEeTpQitgQbBlGBVXpPxGgazJArpjxjUlxbzhTKxOojTCwjMTZUuEdDCcnkKNbuUwWBZPSvObWQmNSrdNgeEGrlBhuxHkKhouUOhJVjJyrJYyOuqlSsLHHQjJDhPzQYyqaiOoJuUmVvkKNyQqnNwJwnNXgGxEeqnwWoDOQmLMCcmMMmUumzIjBmzZVvDIiniIGGlgGLyGgdDYmFdFSZlaywhFUPpMmdTtgeIhydDlaAOFFKkcCKkmGZIiAakYoOzZTlUpEzswWeAaWATyZzEoTSIioajkIiKnNXYyjJQqxwWDNnGjJIjHwmmNnieZsDJbZHnBbNBrROoknNJjMmhuUKNhHjJFeEkxFfXlHHZWsXxxtJjwLrzZLZzFSQlLeEbrzZRsbbBgMrqrOowEKZzyKkIvaQWygyYocCHluNnePlLXukKvVZsxGsmoOmMBGgOmxPXUyyqIxVvXaAXxWYyHVCHhnCcmBbabKxTYgcRCcuTeligGILEtUljJLfFYywcFfCbpLNJjIFfIwWXxhHjcCDdhHJXlrRLfnOnXAUbeEjGyinNsgKAaVvTFfVvgMmgGHUxkKXFeEPjJjDdqQMmaAcCBiIbxXXZvVCkzZKEklMmLVtVeEaAlcnieMpwwiIiIkjvhHZwHCchRprFnNfVvSsHMIiuVvJKkthwUPQNGBQqkVtvVfYiIHzZzPDdTuUNBTtDIWgQhwjMUCbcRjGIiDgEeJjeEGRrsKsSxXVvktTZGJwWyNhHxcCnPMmtmUcCgGCcLlcCSTCMmcvAaTDdsSmMeskYRMXoRrOxUqxkclFpPTrRwiWwmWwLmkKfFkKxVFKkfhHkWPvExliIjBZzjJgdhUIEdDmLloOdHRKzIESWkbQqzZBaBbxmAUstEeTHhwlaBzLpPQqlYyWwwAaWZOobDIyYrRDTrRkQqCXnKEGGCLltTctpCZIiLQqIYIiHTWwismMSIlFDdUuxXIiLAlVeCJYyiHhITtjXCKQbzTYBNMNkxrHfFYoiIQSyCcMMxKSsSsNnuFLlCXHprTJqrNLlSscrRACIcCJMesSyMmrccIeEyqsyYHijycmUWwFZxXzuKkUzNkKQuUwShHIsSEekMtFTtQPEepLlVvxlLXipiIPIGgYGoudzVvZIXAaxDhiakFaZzouTtUKJBbqULCeNFugvVGvVUTUzSsZBSFfsNfHYKyKkMmvytjxzrRZLlMVjCcJNnvhcCcCfyYhDOodpHhhHOMoniuOrgGHlttlLEEeeszrWpPwcCRrsUuSSuUBNndXwWxOWwRNJuGgBBkdOonjJrSsSsAaRYyzPpwYHwRuhHuZzhhYCnFfDZQqZgGoOgGSsNncIjIHUDnSzimMszZkTWoBXIAlvQlEOwSAMPfgcBxXsLliIUDaoDQddNxCamiPLaGRzZEGEegqQiIUDdWeCRStTgVZUuqXxKkYzydAvDxiJzjEGOJBbOACMmccIwpPpXrwWoOROoxOLfRSHnNhsUpPutZzmMlLyYmeMmEkHhQqGggRbUugZrRzzXpjbJbCuUkKuUkGGUuiNlxqwWMmdDbaSsFaVJPEBxKTtmdHmMqpPxXxzZpMdTtBbZxnmLLfwDQSHSTqIiFfaeYYyGDFKgGiILTBtoEJjMmzQaAqVhlafcxKpPPzcTtSiIUaUueYYyuBejjJJDdheUuEHlLEhuUVZCczTjUQqNNnniINwnNcoCrMmIPcGoWwtvdDfLOyYoOhrRWWAawotpPBbBGEuJjpPmyYMUqpYyPQRrNvViJAwWaODdHhobmHsIPFfMlNnUeEIdLlDHhcCQqUGMVvQFDkKiIdUJphmSEkCGjcGrRxcCpuUXYuZjJzfFkAaAaEEeTzJTHLhHWMCLlmMLqUPVYcXxCgGNnDdeWFWyvQgjDdnGfSCcqxXLHMmLlEAeVqaCyYOKpFBPphlEeolQlNwkpRAymMYwfFYFWwnrRkEMmeKAZsdgGImMiKoiILsDCpOoXcVKPDaBbAMHZOnEaJgGiqcvVnfMNKkyWwsSYnbjZzIiaUuAarJjspBzjtTqHQgzJuNiEvVeudDUroIihqQrAJjmCwBSKUICcxyiBbbIGZrRTtJMlajMbBmJSsALlwKkpKksqQWZcNaSxXkKbQFCPzogGdPpDuUOZMmAlFfLaHSbBIvViIFKXDjfTXCOhCMWwrgGptVUVvQqGTuDdsmMhHYHhSVTwfFWHxzsSFdiaRKWkIipCbaOqwQQizZIdmLlemMCADvMNTOlLGCcgoVvtiuCZzQVgGBVvKemQoKMiIZXxzTtmLBblkxmyfAwRrZzwiaAnNApWwPcGhHZSbIImMuaAdgdvPlMiiPlkzMmZKyWAawYBheUuAaIgGFfBeFPpfZkKdrUblBbNQAaqyUWGMjgDPpdISGgsAUkKKkGzZgkGNTIAKEekahtEDdechVAaBUFfFfiIHhsSYfFdyOoyoiVaOorlabaJjEeEegVmXxMuMmyJVUXSsuuUbGRiISshwWVrRmcpwNgzZTqeGYywfQuUSKkUhsSCspPiIiDCXCAMOLlomZdDvVPoxXoOISJIioMyYATtlGxHSZJMMQdrROogHhGDqmmjzshXgLaSsmOkKjsiDcCdOpzacxGgcdAaIbBSceEHusvqQeEVqFWGgKkgEQPptGMmIinWwWPCMvuUHeFfErgBUxuvjYUaAmMyYuUvIiGUurRAvVBALROQIiGgqoAvIOYYDyaACvVCccEdDeubAavHCPpTJekKEjAaHitnRRrfFrgGgKvFfgGVmMuaiGRrJxXCCccmgaAwGguYnUudDDdLBuRfFoODMfFmzEbibBEHbMmLpIImSiIsLpVDkKGocCQqODUkKiihHBszEehHYygfFCaIWRrWaFYMXKOokKBbfeEFkOqSsMEkbvqcUInmVdacEMDqqWQoSJUujsSsABczZgGPKwkrAIDfZXhtvsySUtgYyuvKkTbBPRmcHEgGeocxtFgtTGFhHfYyJdxkfinbyYyYCcBNzTtQvVqZshTtpcfZzqQqBOosAnCzFfwSPWLlLmjzgiBIYXaAKkiukUuBbsbWAacMhHaRHIiOUuRwWjJInUjkQqKSsZGqhQpTtPJVmMvZbPSaARZzACjJcJoOBBbPpmuUFNCQpPHaAhIZzjAeaANoOolLzNnhHhmIieEdwuUWQqpkSEesjNnJvCtTxPcdSLHhllOkoODSzakxXEoOeKfIiyWarPKWtTnLqLsSOLHkMmKQmMqbfdDPkocAQvEaehlNnHhQccCtTKkCsFgCiIcNfFJGVqQOoJjfFvqVNnYwfwEzZPpmMyvpuQlcmwlvVhtjZtSseKUykYyXdyYDxKxPwWXTtgCQCjJxXcqJgcKesMHPjuDIFfGgirXxRdfqmhHTtgurSwWsRinNuLmuUpiShMZzbBBpPjIbDPpzZdBbBScQqCsWwnuUegbTDsSuUdOdDHhwUuHolFVTOgSsCpiyYRcOCNFfxYyXnnGgeEbBJjNWkhHKnuhHJtOovHJjbUyEAuUusFfCMmZpkuUXpPCFWwwWHhALHvZMmJjeOTbtlkfdgMmyCcEAmMQtshstTqdhHWlYyLFllMNXbacCABGgbBzDmPXQhDNnMkXbepPpKkjvVQqFfvAfNnABmMQXLnXxIBqBtTbQbggXxKBbcAaBjBxXJtTPxZbBYyGBrtTGKMTrJjVvFloPlLWiCfiIFCfFBbcadDoPpWwjomMgeDdJZjIXdQqyaPpAYLlVaYeEyDdxXDVvYyYZCcyDdQzvGkKsrcEwugGergAlpzZIMAcWwXnDDcCuUqvVdSsOUjuUJuAduSlLbCGFmMfFpmPpajJsWcCoeSsLtTqViILanNlzZLixbOwtUHhuKSsNneESIZsNdkKkKuhXxBbijMmJJiCzzdNwWcyHHUAaCXxcUrWhyWBbdDjJqXxQZNDKbbUjnroDbsGgRtTFtTwgcCGxXqQWfZSTTHhLhaARoUINFfOmoPHFHmXJTYVYkyhFncCbutfnEcluQjkOjJAfsSKAInNHdZzKkiDGgUOgyfPpWwlLGgFaAqfTmKAafFisWZzqnZflLuMWwCwpOoPWYJIPpXxiIhSQbBYdDqQiCCkKRhHYEmjnNicauUQqCRGgrDdGeEgnRMgGwWmQxXrRlLOocCccCCjXPpxXxGgtRPhNyYnxciuUIrRfUzZOmMCcsSAaoEekIiwWhvVHXcCmmYtTHhsqOyhRXAagGwWKVvnmnbytZEeBqkcxcEXxvLalDdfBbLthyiAalzHhcdDPTlLqmMQCcgmMgeDdkNxcQqKtdidXxcCALWQMMmmuUqdDSMmuaMXAbBKwuUseiZkrhDMkEeKeiSsuGrRgGgHDxXGbPpJLXeQqVpuUwKvXcCMyYBblMRrIXxUuWtfLjQqJyYCKXDdQYyuTSiIsOotmryKSEFftelLEmMVoOtsgGDMmYyduMTBmQqRrMbpAaNXnYjgzSgLlGdgtApPaoOTaAJrCBcaTbQqBtAusSmYyJWHSzZsdDTtqGwPpiSbBsyYdbnOotpZhyFqrRQThKkHvKbgnqpuWHTAayYEeIijUmiIhRPwWrWbBzVJVvHsShKWWkKPmEINCaALSsvTvKeczRrxJWwpEefgGuTthGtkGSIYgJBuaxNosxXSNCcFWwXxxmMiinlPBQqWrRgGrCfFzZCcGvVytXkBAMZzNcvhDdySsjJYNGgnwiIWCcwiQYYuxpRrNnXIiMozZbMSgXSzUxpEULAahOPpGYwqAVJjaMmAEeaAiPpYkeWwWRQBbRmGBSBiIqEesfERrEeqQKibBIoOkeljJoORWToOtwlosSOWjJoOCcTXSAawCczhhLKfhHnIikHZoObBzKbhzBjGPpgdSzEIzZMMGggGWhTtJigdGnNglLiItTDdWwEeJAOqQswWtIiOeYtawESZePpZzPRIVvimMruLiItFfSslLoOytTHhKkKzeEgMuUffotTnNLOoYHGgiEgGGDcCufHWYxXALzsfDLQqlfMgxXgNdMbJiZlMxXqodOgHhGNQrRWqQhrRWwHjRrWoWwOYpPnuUrRMFfjILlAMrRmZpHdjxKkXNnNRrnJqhhFfQUojRYwWvRrjHXUvVHbWwPpWwLRYmMynDRsnMqwBoVsHhpsSGgzpPeztmJWctFfJQqXktHZBXLjzZJuJXJPoORaAajZUuAvbKkgLGgqGTIqPqQtlMmLAaORrEmXXxfcCFaDdVHlrcJOarOoRaviITwGgHPGXWLdRrDhGAaEegHlGgxuUXndqyxXYBOobpPNnfFrYkfbjJbDikRrhjkKzIiwgQqGWlBYAHhFYyUlLiIRLlKkmjJjZeKyYYDzkKZaPpzZEeAdUcftYBEeTTZvVHzOoYrRyZjzjJZBGgbutTaJjcCTkKbxZzmwXfOoXQQqhRNwNFNniDpdDuUUuEEaujYyJUgGejTtJEAinAdQqwWoHsSbeEfIbBWkzbvzvVaAatTkSoBMfLaYyAREgowWzOCcdUGLGuUdDPKPYypOfrLOpPBbolyzZSgzUqhgGQqXLxpDpfpVJmzZadfiIIooOiUuKRRAarDUghjuPpjcLlaPCiIKkbBnNWsqBbFfBPpgGbRCXDdDPUubfHTIiHhzQsQEeqaLiIlAgGCdDzjJQDeTrAcagKkpHheLVvRrqcXxJoXpKkVIivlprmMNkKxSoOfAEeieEzTtZHhcjUuwxaAXvMmVGhJjDAaPpdHnKHKkGgzVxXDdvRmRxxFjcCqKWOowNnWqQxXlaprYxXZzKZovVTgwWnCVXxlUgiIxpwNneECxzfXoVdMFeoVvOELcCxXgUukKDYkKYzZrRycUuCydocIGXxlOnNEMmedDtTJrwbBnNyYaAMWwrEeTtSsRQhAaHlLSJbhrRJiImxhHdRMQeEqRJsSsvqUNWTdDtTBbvDkKZYXqGaxXAdkXxAaKBasShiIEeDlFfpPMQSsJgblTUuEetQuLHpxXvyYABGTYdBbmMDytQqgVVvvbBLvVJjtkJmMktTVvKjKAcmYTytMtxuoLlOQRrIEDSswenNqQOiSRrsxiHrCSwLlGzPgpojJpPMmJvoOWyKmMkyEePrRwWpTBbIVvmdaQyVLTBbxXcisSYAcFfCajHMBfFSsYkJlLjLOYyhShzZFfsiokKDdaizwWCcZjNnNlWmMrpPRwvWwcpDdPEecCQkRMmUQquRxhHkvnWNbBLlYhsSUuHyXhHqQYytvVFRcCrwtwiennNFfSstTkKAaOQTNnrRtqPpoSFjlLCcWVcHhaAGHGwxXWgRDdTtObBVJsVvSgGjLrRjJlLlvOZoFSsfJMrgGxvsVBoYsSTWyYwfCGqQbIIimbxXBmaGuUqXZxXzVvBbxpnCMmZvMmPpkEZCcPhHVKkMsiuAGgpzAtjlsJjiOSVUNnuraAANfFnaAZTTtYoGgDDoQTtqnBbRMbvWVvAawXjgtDEMmexfFGgWwprRPMiXxIrhwfFWocCmuyYijNYKhxXpBbPpuKYtmMBgyYlLykEePMDdRpPgJOphufFUJNnDzZqYsIiEvHZefFEztFeQqExXMlxPJCjJCaeTtnNUXlcJjNnzXfjTyYyTthHBsSEqJjepIZYSsbkKYyDORrDFlkiOhHoPtvSHJjhzZsyKiuqPiIAmgGgcCBJjSSVzjhcCHTtKwoDdKzlLXbbmjJgNyXmKcFGGKjbBbBHhhbwWrHhRGuUgTtlLitjnwWQTKDATAatqwpddtOcDdjYyQqyYHNnZVvzcNnbBEkfFKexdyJJjxyQqSvPGHheJjTtZiDcChqcCEeDdcCzeETWwmmktTHVvYyiIIiiIimXOKAaFfesWwxTMmtsSmRASWwsHmMmfKkFSmNhjJbkMCvOqZsOoSUuasPppLlRrPSiOOQguJXxNJjnDvVUReEKdCgbBpPogbBvyMtoQqgNnTJcjMocYyCRjkygGbCznNJIiPxXCmXLJjRCckKYNZSMytfFiKoUMIdQlLMuSsaAUuPpipeoJrKKWEkYCYycZuPvRrVNldxGYZSHhsxSoAaAxXMOsWoPGVPpdeFrgCremSahSjcotrUsewelaAuUgmvqkSOmSpPTtGgbBPgVBbPrfKkzKmjZyOoYBbKkmgJahHyoVwLwUuVQwWtTWwlLbBTtGtTtDdraWnNGDhAYepKZpPAauUJjtHAAaehZsvyYifZzEQBcCbqHrRhaOoiwFoOeETtCvSEesgXxIiGCBsIwWiWwDdgJIrRbBmSTMmDdtqZBbqNoOnKDdCbLlLCMmcgGApeLlEGgfZyILFbBdBcCMmzrZzKClOdDdzrKkRHnNsYhHbykKRAarZLlbuRGgrbBmMwRJjrBbAaMvobJjBjJdoJyYFANndDaWwzZQfFqJkyPIibqksSgqnNFfcChzZSoOcaApZsQmlAahYyHfFDMmeEdGAaIiHjJhsnemiIsSgtTOAfvLRmMQqAamIiqWwAMicvDdVypOoCoOsPlLpuUkrTtojpPatTAJFfjJKnNkRLlrkCNRRXxruUroQbyYBtTGgNNnnVFeEtOWwRLbhgGcyYLgGXxloOyjxXcCUvuQqEeioHMkKOCnNYrBQdbVvyHhvOeEqxelvTzZQEGtYyIMmMTtlAZmRrMzVBdIiDrqhJqhTxkiIeuaEKxBIiHhTtCchEyYmHuUnVjyBvKpPpKAgGXeQIOoiqMnNiKrhwWZzqAaYyAxXMTsSttTUuyKkinCBDdddWykLnwtTWhtqqmMQWwlsukKUzSsdFXVvzKVpCvVHhSxypEmKkMVNnQqmMAEejIIiXavJcgGgBbxHhXjYrDMmUNnrRhIVBbtrLhCbBcgGcxAzjDyQqRSotTBefYJWAaWWwjwWXgBbqQUuMlXkPptTOkcSsKJSsBdDREFjFwUuTxXtquTkXxKvVJkZMPZzNZqiITOJjLlDYkKybBSGceEmXxgSsEhVvpsSwZQqrRwWzlIigsSjFfkKVRKkabxtDdTohHiIPxXLhHRZGgRrzrlpiINabBgGieEkKpPIfWwLjwkZHhhHzFfyYnPLqBHdDotTwpvJjVWPpIFJjfVTtRTweepTVrUuVJicWvWLVvlqZDiRrIwWlGgNUWwkKAaXVAsyYWwWwEPBfFzZeEfWHBbqTeMCAVvXxaKiYyWDdTTMssBrqLyYpMuUmunKZrRzNyYlLYDdynlBbQUQqWYCcyToAAafYuUMmeuUHqShsBbrCmQsqQsTpPtyVQSFuyIixKkXYVvgoWwmaAfmpGXybBSOUSSFBbfnnNmMNcZdtTTtDNWCHPnNjQvVrwWOXxzibaiaAWwIKGgksehHWRdDoOYyrmkxkAfaVAavAGTRTtrxwWQHhfZOooRrCFfFjuCcrRPphdlLrTtnhuAAIoUapPASnNsqQYyCiugGUYMtzZTWnTtOUsSYyILPFcdKSlLsIECqISsMuUmMMKkepPsqHPpZmNnfOoUQbBqoEeOuZzHnqEeHTtGZfFmaAXqQAqCRvONnlLgGorKkLHFfQuLlmMFMmiiRqQEeIBlLeovpKRrxAariQKkMHhTVTtFfidBaAMPAaZzvZlLzJUdDNBnNoUuqypPVtfMHbBhEekwihTKzWIxNyYNnnahrnNWJjkKQAaEeWwdkKEhaAZapoOLlPWwohTtkWwPpGgsCcDzZoZzSstTNnINVpucCHHRrhiIJOBSsJorROjXyNYcCtTFwSsWljYMwCjeEtTBeEtTmtvVTMWfjJhHbtqWJjVroKOokPbBpywWQWahmxXVKLreiMmVvVvYOIwWjJNnIvVeEjTjKMmNnUuHCchTiTtIZzyCcRORYoOydDroTtfFiIoMmXZzxwGUscCAtCmiIpkKGglLpDdFtiISqQMnBVviIeYukKCOoVbBdzMDdmhWwfdHTtjJCLhFSGQeEmwFUIApPoOtTYMmMmDasFwuauRGNnLHhNHhNaoOvDMmiAZzuUZjJyYbBsSyYHFEqQMekKJjxsSijJkKaLuFfUTQqWwlTSslLRrtLIxiaGuIdDiOpkfulLBNuwWELEeEOGgbBFzKzZsSkAaFfZRlLkyHhivfWxXAagGEepnNdacVvvEdDeVuCGPpbgGBmzoOCfyRgGrYSsspPSZzGOioumRrMXKwvVaAvWHTLUulAmRkKpPoXLShHsUuMmuDyYufFLvXxcPrKkNnTJbBjtcCpsSsScCsSIixoOqWQqbrshKFfefFEVvZMmzovXxXxVxWwXwtPGNnEegJrRNcClLmiICqoOqDGzdDZAwWCcaAagvVRcCZKkNnizVcCzZCzMZchOxXoTZaAiVuNsoOSdBDdbDLltKrAQExXtTTtGgdVvDfvEGOqFMwWmwoFfiubBXkHMmhSrRQWwkhxXPpQRRZOhHeEoLlzrHhgRrJBbLEvVVrRvPpaAvtQqPdIQqaAFGiIgyzZzZaTtAgzAmMGiIkWHTbzZwYyWiIwwWWNdJmMjDtTAKkJvudjMAaHhjJpPJoOluRrUKkFfLloOlAaSDduPaNnwRrWgGpvsFsdxXSuUsqKcsfFXvzYymjevVTtEwWdzLlkcyYPTGUuNeEUMWwfKkFCxoIsSEHGfFcCgOYyIXurAgKcCZzzZhtTzPpYylLTWwCsSpPcRgOuUOAhbdDHhkKDKkkXpGgtTsljSCPQqpgGdDxrwWMmxMCMqQZxXyQkWwEeiIRroQqdeVAWwywqvtTuUBXxvOVvygGfFGXLlkelEvjJYgHvgGzZVxLusfkgMLXxAVoUvVaKxXVvOokYvOIMmLvVEevkKWwVuUjIaAfhHhFCcDzHGgGUsGypHhFHSstIWbBjviIDLldVrEghwHYGgyYJpmMPNnxGWwkKiSBbXadDFRiRAawabWRrvViIwBTOvjiqGgUuVvoOQIjnNIGeEgYnNLljJOoiFfGgcmZzlmhHpgYyfFpqQhHBbUhhaAoOdIiWNndzJUuDaTNcCncCGSCcapPAmMtxpPfnAaNXlLbBeEGLjzeEDHOXuNctRrtbBbBaHBQckpPKYyekBAabdcCaAcLlCtJiIDRxXrHhdcCcXLTdDtKkZzxQxcCrWwkiIdjJSsdlqYcCyHtTzujJEiIeYyQSmlKBwDiIBTVvtyghHGqQYaaShHuUrRwKkLlkKZzYybBdPUxqQTthHRTMmFXJtixXPpfFPpGgBbMMmsHhhIcfoXaAXeEGLYWZPBbWQAQrOfwWfFzZaDdkKUuFfyYEnNRKIrRmMFgZIiYhHQnMGXNnxWwmNqQqQqREeryYCkWqrRQwKJjAZLllLdDVWtNSxFoecCHdDvVrRhHnXxiZzulPnNeysPgGpJNnjuUMwWmzZBBbwiIfwWFrUuXRrQlthHTrpAaPRsVvSYyqQiYIiTtLlXmikXxXxFZsmMEhLOOOOoGKmaAGCgyYDtLlTWwerwCckbJjBdmMvVDYyKGOoLlqVvgVsXDdIiSXcEecDWtXxycigGejJNndDGSjJQqmMmMsbztAaKGgNnkTtZGgzTHkRmQmMtJhSTeEzuUkOIiniXBmYAaAayMgfFobBOdzZoLsvVxjqQAaeVvDwWWLCcxpoVMTwbBylLPqnygGfFLlnyekKTivVUDduDnNMRrzZQEQWkVkaXfkKEpBbVEeEeVoMmdDOkKMMmrReEqSAbmlCcWaAdDoOPpwWPpbAMmfLiNnmWWwraYyqoIilLOcVvQJKvmMGinbBsGMmgbBBFEsNnZdAaQVvDdqYOoQcCefBbFpPGqQYYrotTDJRYFfucwWRUurUubBUutGnzBdDOjMmIxiIRveFfEFfBbpPGNnOoLKmFfMuEeLlPxjhzOkKxmMiOonDduuUUQqNsZzqCchHeENmMvVkYoCczulvaAVJvVNnLzVvwJjTtFfeAvjJgpPRrxXbqLiIfAjJaFlFfQoYeLIilEArRaymEenNMaXtDzMgOfFQTtIXlLGgwrZDdtTHNFkcvqaAQtOvVoTQQsSKkqiWwTTZzYfAatUKkzdDSsSGCcSUusLyXiIxDUAaunXxugbBTzZsHlLlLhPpKkRAjlChHYdDebropmMpIiFfRXxAqfTjJtFQabdSsaAwQMmUuqQfTnNAAaimHGghMIcRrgGoEeOzTtAzVzZvBKuUwaiIMDEedPzkumnNLalLEgGiSWOJtUuuSsBcSsDdLMmTtEefwWXQqpPxfTFfjKnNkCcqFWwfGgoOsSVLlCcvfvEeVIisOyYoLewnMmNcCJamSsMABbjQqbxXPtTpPcmDSsdMtTdtbBoLlNOoFkKMmCqQauYsShMxXFwWzZYFdLvYTDIidyeETtvVhwxXwiIWxXUMAamjdDWRSvoaGWmmBbWYyGItrawWEEeSyRLlZIPaADdNzJQmMlAfFZAAavdsSjhHWfKAOoaeyYElcqlLAllLqQLDtTPqQBSsbppRrmNnMUZzyYMoOqEeAaxXQthHEofzZkKeEGgBbyYnoNnZIizDdPpOegGJjEYzZNnBbthTtlrbBRKkVBMPipCcPIpmrRoOSOjJosmDdYmrSDnNjJtoDBrIiRerYyDCcWVoXxOvwdRwWHhEyvVkVnNjvKkYypPQqkqQjJrOkJrQqzZQWwqYxXyRjJysSYdFoObgGpGgyYCOoTuxXUAbcNnvVdDSsCcrRrMmpPCzZcPVNnFfVbtrRiEeIBiIbJaaAFfDtTMmvmVvUTvfFFfsSBuUKoOccCSspPCLbTShHzANndowKaAkcCWzHhtTIiZXxbFIVvCciIcsSrKrjVvJjbFaAfXCpPQQDRHlLbBzqQpPriIMRQqdaALKYykFMmfnNMmtNnuznNZeqQkKtTkePpyAarCccCtTvBbVTtRMTtWwWwmDbXOoIqOohHQODdknbacCABpPuPpRrJpBbPbBjmsKGWZzhiIIiPjJSkKcGgUaANzoQqIiODdPkKWkeEhHbmFfkWwOobBxkKIvmMnNVOYmgmeNnHhbBqIifGgFvzZDfFXxeCccCuUEGTtgkKQmrRZzqpPlNDdnLAsSGgNnksNAVfFIZzMmYywXxNLwQLJjBbBrLyAaIiSShHUuUKTtaKkRrhrZCczBZHlKkLqQIUvVjWuzQAavdDVbBGDcCdujTtJZzIiIbNnkKBdDZcCzuUygGQiITtIPpGasLRMTkKtEemWwrXxKBmMxXrRxONnlLuUlLoOobQVXxvgGqBcNnsSEXxWwgGACXxcajLfFpkBvVtXTtrhZzbdDkPSsRfDWUuUurRqxXHhfFicMmdaHcChfjJFzZQqifcgKktkKTGgpjJmdjzZtTABbGBtTXkKUulLriNnIPEepFfkIiSssSNnYRrWwyKCcSDoLrJjkFfKRRVvKcUugDxXoBbxXLlnCwystTSsTzDmGoOgKOoJjoOgGBbNnHhFvVgJjsSGcCKkRrImsqdDkdxKkseEwXfMJjGkIiVGTtQqgvXqldNnDxmTeEtgdCcWwDGWoOlmYSuOkHMKDdqcuUOUyYPprcnNCZRrCRrGEeYygRrmcCURrQqusmabBAVvkKCqlgtTxufNLljJnUadjfxXrRpTtPHHqQhHAKkjBbEeJnNZrRUDdLaCbBpBUyYbknNabxXZMmgRrGJjmMNvAEereHBbTthKWKkwUSsCchSJjsFOofMmGgxiIhHcCAmIoOitmRRksNFsqCRdoOoOGTtItRAarZzboxEeRHhtTGgrYjWYywqQsSqdDsSRrQnAaNLUrROJjKkGntTfFfGTtYyCcgFhWwUuQliIMXxOFfwDLldRGgrMNnOfVXhHNUoOonsSrRTLlQYRrPmRrMpHjDfpsDdXlLxiykKYPWwpTkgXxmEeMuUwlLvzZhmHhhMmWybBeAWVvNTtNuuCcZvjtTpLeEnUuUMmDaDJIijnwWKLZzzoFiCcaAbBWwiIwWIFfEyYTiIttTWgzZzTnNxHhJkIiKfKgGkgGuUgAacCdDGoOWsSAaBbWwJpPjXxmMbBwqMmMhFfyQFdDfxgDdGbDojJOcOoPkKOixXamMZeEGjJBbAaLlyGgtTYTtkMXxcZEKFBvYndZTiIPHhxbWEemMzZwFfByYOoqqlLDvVdjJQsJjSwhHtTWixLvYyxXoOhyYVtWQLlvNPozBFfbFhHGQeHhisjJbKkGaAgcCpPtjWwWdOoUWwZzpzldDLEXrRVJjfFHhqQJYMwWyWSswsnNeEILlGoOdDNngQNZuzdDOoqQijJMqcCFfNnUukPpKIiYRMBbAQWwyDNndYYpPfFQqymaAMvVNYyrRaqfsqqQgGwooPpgGLggbwccCCWZzjeEJPnKHhdYkEewMmNPEepeEnWvQqVuULlIkIBbpPAFHhmMfohOvwsSfwWFWwWFfVOooHlLVvSKACcDdaULLllSVzZvsLCFfnNclnNdDCcsSuPMmSBTHUuhtsSvFICcRrCciyYvPpVZAazfVwcmHhnZzNIsHhAsJlLVuELlYUDeErRdKEekuavQgFaUmJYqQQJjtQuUbpdDUuTtGgPDHhhRAaYkKyNnbTgGFArRaftTJGBmMSsqjJVvTtQTtPmMpqzZEPpbtWGguUDdDsCcXxlgGKkhHJXxPaAgGKkmBuOoUbiIMSiILlBIrRmvVUDdkkkQVmmMnNhHuZcvVCwbBboOoJalLAmoOUQquMZzhHrpIiJKfxXqzfYyFwWpPJdDFfEetTzOoevOoexXEAGvVBrRxXiYydAMmgGBkibBIgKKuUkqQUuWYHhywVusOnNgGolLnNQkhjJHKqSzZzZWYAUjJucCaywuUnNYaPkKmMKkHhtmvVMxXXlLKlLctIiMmHCvVczUujJrRdqQjJHsqQnNqQYdsSXpPzRjJrZxcCDarRCcUDdcCrDdSTtfFDdFeEOofJWgGAcoODdeIiyxvVwzzjPlJjLKfFbBkYyqQMaAAABbjJtTcPwWpRbfIilLHUtCcTuLLlWJjRIkKifFjHKkcCCcbxBtTJRLHhhmpPgIUpPLlKugwWOohzLeEoOBbFfWgGCcBbiInoUnjUoOEmPuGzXsXxSTpPlLUutEePYyiDIVvyVtYYTMmtGgLlTsLdtrRSGXwLSEHDdqsakuUAaYyfByYnXxBbMmtuUPXRVvsSrYyaAxyKaTHhWwmcsfFSiTtHzZwvVbBWhGgnuUNnqjTtJORFisSIEdPkXbJptTFsSrRfJfFkeQDdUHyYdDheEcCHYyhSLkQuUsQqQwWqZIQiaAuUIqGWfqQXEeWdDlMQbdDbBHhUuzZzZcUEGJfelLFfEFHhfFOojgzRrZkGgrDdSsRBELlemMgoObBjJRrhgRTtWwTtDNkNnNnNeEboNnigGavrPmARrKcCgGBorEeRObExYyXAaeRrxfFXSFHkDdKhfPqQCctTpHfFaUyYlkKPpGKkgZxXvOoQaVvxXRRrJjrbfkhHVvwGcbBCJjQRPpnNzciICXxZaKPpeETtqQkRQqPVrRPpAaQDdTWwBNeXTpGEeYdDypFfCcsSaAtTDutTUBRfwxpPXEXrRZzdDAaEnwnWhhHiIYJyYiBbnyYDdeQqoIpPKkZiIoOzQuUBbJwCqoOQRrtTdWAawzZDOWUuwoPaAkKpKkAVBbpMmPvNnSLlWwOoWERrMmecCTtZzjJjiIJyNIiIiNnMLaiINlhHyYLeEMmvzZedDPQeESkpPUuDUtWwoOmyYhfFHZzuUDqQfFdTtmMzzrjngGKcCBbkNvQqVnWwzpPZMmQOolLvVmMGQcCApzRMmyYqhLqyBbmMMIJjCtTkiBbIuoOetdhHBbIioOHhbjJgGWwVvzZCcjlQBblLXjRrJTBzqfFgTtGLluUoDJOHhoyYOoypPvvOoVVYuLlUAwWmaNnvZzskKRqsAWnNtbBRXkKxTtTDAijJgtKkbBTTyYhHOolNwlLWxXxXNnqQnAaBwWONjKqFfUuizIiZGWwgzZMtTJFfEnPuUpjQqcwWCiIGQqAoiUusJCcfFCpPKkumMENBIfXTlqyYQRZWwzpPqcChxXaAeTtGeEgtQqhHxXTVvQtkKdLlgGDzZIiTSvVFOokKrRYZzsSqQZzZPOZEeJjxXTSsoYyxMarKkhAaHAKzZSrRsmOoMbiUPpXZzdrQjtclLCiIvVVVvvISsmMSsGgGgiTFfJiIpoOpPFfGgTtxXwWVaADOoQhpPzZhHoOHLlKNKkIfnsrRScaCqJHBYyFfbhGbjJHhBgrMHcChJSpPnNKkwfXxPSCcBYiIyriNssLnNwWdDplLPKnNMmToSsiVBRrEeEesOSpPSsWOoNnQwWqzZFiKkAoxyYJjyMuUmUuBbqwQbZzZGgSsGQtrbBCMpPabjJPpfFrRcCHxXhSgvVGgwVvlOWwoAaEnLloOUZxXziIFfcSsXxCeEOmgQoaAkOoSsKOqIiEAWwRrOnsStTILKQoymwWEhLBblcCZzpBDdbfFPSsHhQivVoLAaycQhHUucSsCxXHhqAatagGHfiIBKkUqQSsuBbxUHhuAaAarNCLlyxXDdYhVvHZPpCUuczlULZzvVlulLGgoGrRgplLRiaACqQIeKkZzAVvoOHJCcTDNnBbvVEqQeHheEEZzeKuUkiJDdJjyFfYIinRtTHQEoEevVoObSsBOoOgGfFCctBMSsnIBHfstMlLmTBbpYygcoOllBbXoOUuRoOrnzZNbVLlauquUGgFZzfDmbBMdHEehJjtIikKSsTzRrZkKAaLlYnoOrRTtXxEKkELleSdxXjJDuUcTivVtTTtInhHYmMmMVvyhFfulyYrayYBbKkQssSSPptkqJjVpiImMSsarRzZAmqINnFzZfIiiQJAajIqQeqLsSlOoRrSsJUkKlLuEYKvVFOumpCyJRrjYcPqbBQisHhSIlRrLfQqFXxaIpdyYJjDgnNgTDdXxXxXdXqQZXxzJjqtwqrLlRQUhAVvuZYeEoVRMQnIidrRcJdDeEHhfFFfAaqaAQAuUjjNBvHFAEGZqhHQxXRQAbBdtpPQmjJQqMxXcGeEMDaAdTtlYyayVvTHhJZzYSPpqgPxXMSstgGTmOfFoxiICcYySsbFfmgQRrqBIxPcCLlXUqOtSsToNtTCmGKYGRrgyTtkYyXxwFfwWOoCcAaxaSsAaAaYQvEeYRrPpoZzOIOCconNeKkEilIcDdCCNnLSDdsxEeomAIdDBylmuswWUuCctSNmBbUtTuvVfSJjRwWwEvVBbJjvVuIiSepbBPpyYnrrBxXWmMwdDMmARqQYlLyZzYWwUujJjJyKfGnRfhZTtzWwSuUwWsmySUusYqQMrRLhCcnNHhgWbBNLlnpzzmdtTDKkYymMCcWoOfpPVvJSvmMVcCtLhqQHlAoDtFfYyqQRruyqQEuwYyWLBbwRrwWxXUpPyLlUTeaAfeEMYXmkKMPAaPpbBvVshHRrZoOvVqpMmvVuelOsnNUKItTFfIiDGbSaAzFlLfdjJHmmMMTtjJznCcTttTIiNTAfaAtTIJdDOlLCEcWSvwWVGizlNnLohjJpPTjJhUuJLuUlAUuvCMmOzZoZwWFverRJjFfWwNNPpnFFfAWVvwasSAafeEdnNDnyYHgGBpFfgptTPtPpecyYCHhEhGXkKaOoAyEMmeYxcCcEeJjodDOfnNFBRraAFfbvVEeUuRrCLlIipPDKkUuxgiIuUGDUXCcYvVnNWKkwbhHeHhYZzyEBZKkzybgGBkKeQqEGgHkUzFCLlOaOoMmvoxXOSswtTJTBcJjoKVtFfiElnkKNDdBbORrvVowbgxjiIqAtTaoODMDSjpvVPJBVSsvbMbBmFfVJjZoOeCczzZqonTtNOaAJHkMmKIQBbIiOoqlLlnNkKpZlLcCzqevVcCEuRlLgGrQxXhBdDFzHtZzTjJKFfaAOoLIsXxzZcTtvVYMqmWwyCqsrRfBQqZyYPqnNOovMmSfnNNnFPpyYkKHxXhFfGEfiIbrRBYykFfLlhIPAiIaQqpToOMyYmvVEDddyPpdDQqIiTgGEAaetEYTtWwgGyokoOsNsPpuHrRhxuUTbBNGCcXVvCccCzAtTEewKjMMTQKkBIibqEeQAaNnhxxXmMXwjiIhHJWHSPpBbWUMTteJjEJDdFIiLljJLWwVJjvFqHhQfJFfGggGjlGgSPXbBxpkeEMLaAlmKbPGgpgGrbTtlLiIkuJkKjUdDWVDeZBbzFnNfWLcMvTtjJjJVmKkLlrVvRNLlRrfFfFkKqXxmUuhHnNvVKktgGloOIghHdBEefFdQJDdDdsSviIfFSsaALxXMmueEwWUTtDdhGTtxXbBxXxZzgGyEeYSpPstTLlLeEGZzsSHhDpHhlLOGggbBoJgnNiIQqMzeEXMmAvqoOLtTlqQcqqQQCzVvJjiKJpjJJpVvRrlndwWGgRcCyYrDOMJAapPWwDsYyFfAaxXSzsMPpGEegwUAauxXWxxXhHuUqQMRrHNgXNnwkKWxIsDTtdSSsiBbqQIioatTAeqQmMPpbBFGgDLlCMmZAAxXaavVNnXgGxPpjRrJzRZPpoOmxdQqtTIiveEVGDdLixXImwWQzZOkKsSSHJjLluUeEgXfFvVxkKGhyqjJrhHSWwXRtTqQeEXxjtTqgGQJVnNGSsiHhIsSgGwznNJjZvVsSDUuWwhHDdYloOsSqbBHhaAhHconkKNvQqVOlTwAadDgyNcEfwWarRtTFoOfPpVYyeEHqQnznNZZzrdJNnjWIwWOowrRWEGglAdDnNKmMkUOouNnHPpWuUwhgyYGRHMqQRryiIzMmBbqlLodDAOoaoAaUuixFpPfXeEILlYSsyyYIiDdsSsgGpVvFfSZzzZyqQYyRrYfaQlLqhHxXaAambdxXAapbLPsSGgpLuaAREePDdtTnhvVUjdqkKHhQCOlZzIiUuLtTdEevVWYymCbBpPbeEBzZmMrBbAaRGYgGyWwVdIkKidgWSpAaPsfcCUuFwpNnyYmMOoMmPLjJlGDMUuLlJjSsmHZwWzhjOoJaATCcgGrRtpPQrRFmgUuoOnbPpMmBNGhqQNtThHnNmcdDGgyPptzYqqcOoBbopGghdbBQqzRrVaAvUJrNMmOclgGLConUvVpJiIjPFfctJjtTsWwnNoUmXOoxCciIyYMQqjnPpJjNJuIsSikUuAaKdDbBKkQqDdFvVVvYkeEpxXuUWGgwPSsAaFzZfZjThHttTlLKkKkRBbPprJzkaALsBbSpaAkKuUQqiyuUnNmMxrCcMVCcrRsjJSQSuJjhHUsyYAJYqQUhHTtuWwCcRMmrsdDAgGazxgGnXUfFuCcuBsSbDdykKTtBbuQqUoOUixCFpPGtTgwdJzdDqQZjuUlKkPpeEmMaKkdYRSQqjJrOREemUuMAPoOpDipDdtThHCcPKkjJjhHJAPbBZaAbBzCchHoOxXnBcQqGgOTtVvonNoOmaACcMbBJyPQqphiIAQqxKktTDdTtNnjJCDdleEhsSHoEeOfWwCRKkCogGgGiIikMmQqKhHdDEdDjJeEwWwWyYGgwsSjJFUGPnNBbWXxuKkUhHweEirRIiiIgGpikuUKVHhvIsSneIBSYyJzZjyYsZwWcKkCYgwWVSsyLPplaAYCcyJjPtTpBbfOomGFfgMBbIoXxzFgGfnMmuUgVvUuGKFfkRHKkopCcPOsuFjJfUFKYXBbzZiIIYyiYyejFKgGMsFOSsorRlLDGgDdHWwdwWDhdvaPQhHqyqGgQYppPPRSJjsrnsxXxhwWHPRQqeYyHhjTtGglIIiWwJCcjjSsUsoOYySwWHhHERrmMrRLlRnNfFZiIzbFTtAaaAYacChNCSsIQqLyYTxXnNJjvVtzZlsShqQQRrbBZPpYyECoOcHhuUHyYJjtGNnkxXcCEYEkKeVOovHKqQkhbBoNnEwWrgGusbRrBxbYcWwCcCyoZooOOoOzFrRCcKkWwbqEeHEehqQQQqBfOTtRrSAadNpvUuQqrLlRpfFyYuUoOxuUAiQydLpPKkUuZmbBiIInNZziyWwYMvVOkdDKogixaAmRrMEeFfMmHhqaACcvVFfZzWwioOjJsSCeEgwWojgGJiVvQfFlIsYySIPpRufNnoOKkHheEZzJjgZlLcCzGlpYpAaPyPLpPAHUCjJkKcUuukKhpPaoOFUIiijnNZzYyJKTmMtkwCcWhbBHLlVvHQqhvaATgGtEeVAHhhHxXakKYyrhsqOoFfQoxXabByYLlpfCcxXsSpezPpZtfgGFrNloeEAMoKkhVvXneZzEhCcnNEeehHEXEeRrKCckwmMdDPphqBZzMGgOozZOodDaAKvVkDioTtwWBNnbOeEQxXqUKnNszZmnNMVvokvJTtjVfFcccgGCOoCCVvzZVjiImMJXxspPSXZOozOofICiICjJcXxXxLfFnNTtQVvpPXxKkAaOlLEefKDdTtHhEenDzYowWSsdDWwSdDwyrmMuohHfFFAmORroRGgrUuZzUXVvHWwvVJQcjJocxIrkOoKRRrYPpyuwENnjJzQrXxRhHxXQsSwWwofFsSXSsxfFlUuwWrRfFFmMfNnBhHgIugGUaKTmmcCmMvNntvgFfyYkKbBMoFdDGgfbgGBTtMmOqQSsEeGgfFmutTVvUfFDdqkoOVqQvKPplLUuHhpPLYylQGgyYfFlLJNnjvVbSsBEeWlLOoYKkDWcCwKRrkJOojdtTCcBbSpPDhzZHqQJTweEWHhgGZzYvVyylSeESscCBNnVZzSstjxXJTCcWwPBbfFUUuQquVvqQwOoWpvPpjOomMFfJbsIvyYBZtmEnJPXsSUufFxpejTtBlLCcaAlxXLOobJDggGWtvVTwLWwQqgPpGxXlmMzYyBRrmMgGjJIiaaQqqQQaARrqvJQfFapPyYpPIiSsjJmMMmAbUubkKBCcBqvtTVTndDyYGekSVvGLjeyUuiOrRlOiIoXxEcqHhQCcCdDcnZzqQNeECwWMoOmJIijIkKigGeyYgdDGLjJCqhHQcoOCcACLMmnNMmlcwWOokKVvtPpoOTpfQuUqfFJjnNYyMkFXxnNpPfOoRlzZLrRvVJjJswWSjPpjBlxXAaLbhdDIoORTtrNaOoAbkKCcaASsNnjJjJrRaAJhaHhAgGfJjEvVNnAvVzAaZWGgGgwgGPpalLmuUcPpCqyVnNNnvhzZrRZwWzOpPuUHhLlTDdESsesSkUsSuKxXVvFbBZzMmhhixCcXIvVtTwVaAjwWwJjQXFfxPprKzRNtToOvrWwXxWEvvVFfVvpmMPYySZzsIGuUyMpLlnNPxXmfnNCEkKecmMFRhHrVvwWHhRzZnNqDXsSFmgcCcCmUuYyMpPqQOoWwWkKZLlzsuQqMmqAaQlLuUUhHfqQKgGkgBbvVOBtTboPpKkGGgCgGOovVeEnDdNcFBPpfLsSlqRrlLYfFyvwWaAPrRpfkbBKFosSaAOVomMfDUzHhZhSLlHKksShlLKkYyzZsmMmMQBheEnkwWqQkKfFKNsKGgkUuWLlaAMmwHhtZziITixXIaaAEPpeMKkKBsRrOnNoSbkmYybBbRrOoyYBmMIGgiAUpPPObBopnNehHEuSHbcCSoDdwsPpMmvVcPsSpKkPIipPpkKPpOomwWMHTthCOouAaUWwSArRawCcjtTJqQxOKkarRAlLOogwWDqQeGAagxIiAaMdwWDtgGTnoMDxXQsSvyYPyYJjrlLKkVDdUEeGuNnUVLSsNnfzZQQqqQnYyNFbBvTtVqQOoKkfdDFfcCFsSpPDEednSbBQfFzetBbTXxxPpXjJlbtTLlSsdktTKFfaVTjJTRrtBTGgVvKAOMGZZzzZPpEALlaeJkKZDdzLInNilmjJqOQsSqqOqQonNXXWvVwxKkxmMYyRrstTLfyYFOoYpPySAacCntTNnwWnNVvNMsLlDCcdHrRhRfFrVvDhkKokKZMmCczpPhHqQLdUuDsrRNxlLXLlVqhHQrZzXzvVZxRzeEuUGLlcCXxeEPXxfFpWqQwsSkwTtWEOosSeCFfuUdAaDYnNTtycwWDdOvVFfUuoLfmMvVFkcCrRKwWlksoOaAHhSTvVteZCczZzNsSLTtljJouHhUtTIiZHhVvZnHhNFfHBbsSNhQqmOoMzZQOoqHhHnrRzZwlLdDYEBzZzLPplmMgGsSgGpPJjZUuIDjJdlvaVgGHFKkDqHvQqVkKeEhGupPpPmMOkKylGghHLYojJBbRtTeEmMEeWpPeEwMqUdZcCzvZsSzFhgGAaRTtOoftTFlLrHfFfRzCcxXZDdrpPBbRnmJgKkGjRrbBbukKUTaAfFrjlLJRBRrbtFEfFVvRrxXeJjuYykeEOojkMmCEiLlbBIsSDdTRrWwtcCsSPJjZzaAdDpcWwnNCGgXFHAahKkwWUufvYDSsIyDdbBwEeWVvgMJjmGWwYUFQuUHhreELleExXRqLdlMvVmLijhHgGMmnNTtDHhPpiIHhMmFfEevzZVpPoOLxXlvLlzkKiImeEKkpPMCcFuUWrRpPsSwfIiHIsPIwWrLJjxWwZhHeLlEHDduUnBfFbHRNYynLlTrvVRcCiIyVvUupPCWwvUuNnKeEkbrRJqrRQXuUvezZEfFVqQgMCEbBAaCcTCcsPpcGBbgDdxXSsChfxXFJdDjdUuDxsSeFfYFIifIiyYynNWwdDQqiEeIxXpPreEmMRvcQqCVKkaAjNndDXIixiIJPppPNnGJAgfFNnGaJYyjjFfgsSMmGggUlxXgGJjBQHqvVWwnNQKkjJrRhjCcCcuUJqFpPpPLlsSzZZzUuTPptLlgiOOlLXqQMmSicAafjJFWwCTtnNUbdDwWBxXoOTWwIiXxtucCrRbbBQZzuQkrRKTtqDdvVnNUGgqBuhHUuUpVvzgGxbBCXxsxXnpPGgNJJjmPppPhSsHhXmMxUuqQHhSsEeAZFfzaHpZAaNheNnJiXAaxhHFfDdKWiIFflLWgGLmMZSszlwkLLgGZzoOBbiIDuEejRrpxXQqPItTaIioEegGOAIivYyGgVqxXQjZxXaARgGrlLMNnIimzJcCRVuXTtOomBXxbMxYyTtxXJdDJjVvpGgyYhCcHzjJNnDUDWAaGgrRIaRjJdDiGEezlSsuULxXZNrRAakHhKLlpcCKIWwQqizZkErRVvaKkUuRrAHUjJuVYyyrTmhHFfYyMaevVtYyFfTlJQaAqKkLljLdQqmMDEAcCwbBWiIpCcCcPqQtQqOoRrROsSUuYyfzZURrNwWnuZrZzRuUwWDdegFjXzZxJMmDuUBbaFlRrkKJfFjEedDXxUueGXxTtmMOocEesSCAQqiXdFfDEempbBgGaANIitnNlLcGfReErFKtTlTGgJrRjIojnvVNOEafFIVvGtTqQgigGnwWynYyOdgGDqQTHWwhtjrRJzZLlgGZIrRQTtqkiIKiAZzazIydPfrwWkKuUOowWRQLAalfFeEcCnNftTpPeoOEJjzZrRBbRaZGgKQqYkKGgMmpmMtmTttMmTMTfGyYvVSsRzZIirOogDdRIiBuzZUgGfFyYIiWTtmMIivVYydDLlwZaALlzhzzHWwqNnSsFfQgaAAKkxZzrhQqHRuvRQqrVGYygeEUUuYILlipPyYZaAzvVDydDYNnavVAeSssSdCcDdDEZwWvVFfibdDBeELFWwuUItTifiIHcCGgaZhHBCcbpPDdKkWwPJuUjpEecqxZaOqQLlqQugGUkxUtTRlLruiZzImiIMfFUusaASsSnNAaAeEsStTaXWZznNwTtSPTkiRQqdDOBboAarWwvVIkKyYKkYycCcaAwWCPpKVvtuUrBbeESNnsYSKRrkgGsOEeokKIigDdbBcBbJjNnCwhHWYyslZzNnRrmMOoLLlnAOoaNvbBVPEefFcCoOBbKpPYykpiMCWnNlLEezHMmhaALLUuwWlZzAkKKCBbCczQqQdYyDJKRrkjaAqXemMwWKkkKcClTCQUuetTEqeYyEKkFIiSsfhHTXdUuNnDyYeMmltMmQqxrcCOzwWZpPooRrjoOJQnNkKQqnrVvDdeEzjJZGIiOogRrpNTtmecCEMnlATrRovCcJHmMMhHrRlwWLVvxXfPpFDtnNToFEefTtfuUFgXxSXxDdJjvevVEXTCctxQqQbBCcqWVvkIiIivVjAagGZzXxcCfFeEeEOoJNQqRCcrFfjJOyYWwhUiIuHdDtTMeEPpbBmTUusHPpdDhlLwWqQcCcpxXPcydDoOaAfFYxXzZzlLvVRrxXORraVQqvHhGiIgvIhHidXqQwEewWWgYZzyhBBdFfRrTFftNcmIiMCiIZzQriCtTIicRMAOoLlamSsQtTbFfKkzZOoxkEenNVvQlLqNnAEelLXxFbBfIpPigoOGaCYyLlGgdLHhlDKOokBbcfQqWOomMwQqeERrlLFxXlXxaAvBbsStTTtMmVaVFfvOCctToDdDbbBPLKkrROolWwwlLFBbfkQqsStTFuUAapPEJjeYyfFfmkKQKkAamMqOPpobiICtaATSsvVsSbBLljJIfMmRrFeSsclJjLPpNTrRtcCnHhZAaMwWmzIiyPpHKkhLlumMUYeRrcUuPPlJjLpcjJCpCEuUIfWwffJwbBYyWjstWwALUuvVlImMikjJKaTkKzZKJmIipPmMulLUDdMPDPIipdIipcKkVveBbcCEzQqZOkMmKoRrfrRBIhdDHtTMmIhKpPMmkWwRLlrWwewZzqQgGwYeEUuoOyDdMmNnwWuUWUxXuPpzZoBpPbvVpTPmMpGgtxHBbPpSIyYizZPFfpshXfqQcCFuUYJjyRrcCQqbxXJjcRZKzZLMmcCwmMMmWllSsLnNNZznNngGHhOcLlBbCtTTCctyfFUNnAWwkKbJjBaWsSwKkCbwWlOoZzHhLBwWJjDRryYTrRYytTteETgGNYynzZZzcbBxjJUuEZzNMmntaATwWewWXxnwAagNnGMmWdzCRrcDXxTtEehHdzSqQMmUMmufWRrwFmMBneEuReFfEMYgGymQqLlaAKkrYyLBbiIKHhJlLSEeFfQqsSCIijyYJnrRygCcGlLTtkKYUuNndDcCAXxYyadDsjJKCckSoTdDtqbBsSbZzDdDdBfFQbBOYyoGggrElLezZEYyesruUGvVoOjpPJIFfhHqteepQqJjPxJXxwWGghHjaUfwWFvLlVtpPfAaFIiTYyuVYyiKkwAaYyoyyVvYxXCeEBsSgQqaAGdDEebcYwUuWnNVvMmjJzZwWAZzjJCfLDsSeudDUERNaAhHhHmqQMCkKcxuUsSCcXgMYycCpPmtLlXxnNTcCavPpVZDmMtTdXxKkwWTtZeEpPjwWJvVSPpszEecCzmMJjJjAcklhHLKmiaAZAanNjiEoOeINnNHiIRbBrcChnJXUuYydDFmMfvVMTtLlzgGZmYyQgFfvagGAVlLyYbBIZzkKiIiGmMCcwWgOoWTTttmGgMGgQqWwRrPpwInxXRrNrEeRVPXuUxpQHhjJPpbbBBswWGDdgZLlzQRrqmMSQMmqVvqvBWWwkBbKbBwyYWVvdDJtTjuUWwZOXsSmMLlxMmHhEeJOouxuUAaMmUDdupPIiPpAaPZzpJsSfFjIiAaSsNCcnMmpPdRrDdDAaXzZguMuUmUGmMEeSYyxmMXsayYAkiIKdfOopPnNKkcCbDqQEedYygGBeEhwWWwUuFfHxIvViFfXjJUuyYOBblrRyYKkNnLzZUBbcCcPpCwqQNWwnvTtVSiZSsoOKkzJJjTtzZHlLhEddVvtTCSscDjVxXvJhHmFfMvcCVQkKwTtWSNnsOogGCcWwJjqYYyzZJbcCsSBjpiIPdDZAaguUraeqQugFqQiIdKEeWwLlkkxXhHsPbBpSMGgmvVrtTcCRQIiqYVvfFypPQqIBbMmHbBDbBdhivulLcLlCRrUVZMmzVvQqCuUQqqQcKktTvVIiwWKQhHBbfPOoLlpnNkhHKsFpPUaArfFRrRVvGrRqQtRrTgyYbOopPBwWXxXgwWGxcBbFfMmCZzuBKkbKQqfFoaejJEREiIerqMmQsSAKIikykdDKYTtgKkGwWffUukSsgGKFVSsIivdDWwVnNgGuUWwSSfFpPLlAaHhtBbSMmcmMCsRrwWdDTkKYyqeEwWdDMVvlLLlmQbOvVoBsyYSkvRrVVvyrRoiIOCcYynNkXxKAtTstRrdDTSYyCcCifnSsPpKXjJPpxiIcCkJjNpqQPrvVRZzRrUuAafaAFHyYdDMmhsSlLkKZzHuUyYAahHpUuTtLlxXPdTnNWwtDPGgpJjdIiDrRgGlLaSsAnidDIfHdDcChFjNnJNSQqsRrEeRQqrsMmShTtUuHhWwHhAfWwXAhHaxnNJjlfFcCXgGeEQqxLmMFhHfvVgGziMoXxOmIuUfvmMHhVLlwWqqkKQQuUuqQYyUFcSsCZNnFYOhHpPLlgBbGEeoduUnvVNJjZzwWnNEPpnzZrRjwWJaAEeHhnNNdDHhFbBfeLllLHynNZzLrQqRlXxYGgrXxRkZzKCyaAWyYwYqQcReERrgRHhrVvwWGVdDodDWwOvvVhtTlnNsSNhTtZzDdEetCGgMmfFcTYCOokKyAaMmYsSeNnyYEpPpPcRpPaAryGgBbZzNndWfFwDbBBAabEeXDbBdxaAVvMMmmWwuUbBDUujJdYsSKkyosSiICrqQJjrRmXRrxMGgpPKzZXQqxbBklLlLjmCczZndDNfFQqMyYWwjJRreVfCFfcFviIteENQqSsnyYecCXxKHhkEToOoTtzTtxXZOzsSeEacCHhLlAQMmZzqcWwqQCBbtTdaANnkKgGiIDJtTHFfAaDdlLlLFfRrpPcqQqQJfFjkKoDdORcCrhAaHtTCaTtDdzZAOlLIyYOEeGDdOogvNnVGnNgmVvkKYyZeSpPsEbBxMmuUZzgOuUaZRrsSCczVQqAavAetTEQgGvVBbqoIgGiGGgGMmXxCcggGIivVXgfFZzGlVvOoLwhHVoOvHObBhHhdAarwWRAkKnNaDUueERrlLOoHyFRrhHEeWwfYXxsIiYylLoOJjSDQqGghHdtTQeYyVwWbBvkKZgeEGzpVvPwhHWEqDlLNnrRVvdPpMmDddtIiTDxXnYoBbOyNfFIiOoXxUuVvVvSGDdgsEeVvVtGgTUXxuvXNnkKdDxmorROvuLlndrRDlYPpyyYlLgiIGmzGgZMLgGyYbBWwYyJjCcVZzWexXzZGgfFMYyQqfkKlLFVcLlCNnvOMmXxQfFQqkNcCMmLtTlrRTbIiBpdDPtOoBcCYyVvcfFCxXbxqQXzZPsYyEeMmsSSJjernNRlnNLgtTGLlUuyAaVvRrMGgzZmKrRrBbcCwWRyWwoOYnoOMrRmEetEeMJjpPmkquUIiQuzZkNnKSMaAmsUKkYykKRroOmMKgxXMgGmoOGvVzxwWXaAwWIzaAZdGguUUunNHhHLkKzQqZlhWwnNDJZWQqkKFqQfwzjJFfvVqQJMmjjHhahHAUuCcEyYeXxVvPmMEepGgHhdDqZzZzQHhcyYCTzZtGgIinyMmYJwWEQqehHjNzZsqQiIMMmmnLlNMAtTaLlluULrRyYLlIhzZHimKkqQYdgGuUDynNOonEqQeacGgAakKFEefXxCAuUWwNSBbcCyUuLXxwWlqQYwtTyYnVvNWNnktaATiIVnNiIvwWPlLYywWIiAaKkZzsSzyYZaAEecQesSEqCppLlPlLmMrcjCcJtTuUhyYHpPzYbWwJjBxXWnwWNMmSsYytTyYvVwEYyeWwxXzVWwXxvpPqIyYiQZoOyYiHhIyyYZMmxPLlpxXhHkSsVFkmMKfvGfFBbQqbBaAdDaARrdVvDPpgzDdZqQMCeoOEyYVNnvcgGgGcCLlvHDdhvYyVjJVWwuUTXxKkgGpPlLXGgSsfLldWwDCcTtRrFqQRrxuRrUGkGgKgdDkKLWwltXFfUuaAxgtrRTGCMmXxEeBbXxAiIaRrtTxXMwWRraAmeoOLlFRrjJyPpSSsssfdJjDpPFMmPpYUurRZGHhgzlLgGeEDmMdOtjJjJPpTuUoWwAgGarRGgOiIvCccCVuUoLldfsSFfjnNMqQmJEwOoWexXKkDdFEeDZzyGVvgCcuEezZwiIWxXfFwyYWpbPpWwBghHgGGzyaAYZsSFfemMwWEQqqmMQOnpnfFNfFPgGNJtTWwjdTtGzZJjgDoYyhMmHwzXxxXJjlNnLZPZzYyQqlLksSwWoOPpvIiVKlLdCUucDpWKknyQqpPfFfFsPpbLlBOoSKkjJrNnwWcChHytwWLuUlTsSYUuuUtTQPFfpqsSYylpPLiICcTtRyYMwWmnNwDdWeEhANQqxXnkKKkEdcCzZDaAeKkwlLWUgGbBuVvUSsuaeEMjJmoOoDdKkoObvYybBSsGeEgVNnBdpPNIinNnWwMsSmeEpNnqQPUeExDdfFwnNLltTWXvVEtTFfOoBbeabBARBbrcCSsiIuTtUuThGghHEakKAtTVlrRLgPpGvXxTbUutTBuUSstbgtTGpPvVBhUuYyhrRHHpaAPeBSsqwNneEbBWQbBlLuUuArRRmMraUbcYytjJmMTfFCyYHTiIZbBztSszZtDWwSsdDjJoOmMTtigGxHhLlcbaAJjBCXvSXxsSsdDVxgwnNfFWOoGXbByZzYXxf diff --git a/2018/day5/src/main.rs b/2018/day5/src/main.rs new file mode 100644 index 0000000..09b3d87 --- /dev/null +++ b/2018/day5/src/main.rs @@ -0,0 +1,55 @@ +#[macro_use] +extern crate lazy_static; +extern crate regex; + +use regex::Regex; +use std::fs::File; +use std::io::{BufRead, BufReader}; +use std::iter::Iterator; + +fn calc_remaining_monomers(polymers: &str) -> usize { + lazy_static! { + static ref POLYMER: Regex = Regex::new(r"aA|Aa|bB|Bb|cC|Cc|dD|Dd|eE|Ee|fF|Ff|gG|Gg|hH|Hh|iI|Ii|jJ|Jj|kK|Kk|lL|Ll|mM|Mm|nN|Nn|oO|Oo|pP|Pp|qQ|Qq|rR|Rr|sS|Ss|tT|Tt|uU|Uu|vV|Vv|wW|Ww|xX|Xx|yY|Yy|zZ|Zz").unwrap(); + } + + if POLYMER.is_match(polymers) { + calc_remaining_monomers(&POLYMER.replace_all(polymers, "")) + } else { + polymers.len() + } +} + +fn calc_most_significant_monomer(polymers: &str) { + let chars: Vec = (b'a' ..= b'z').map(char::from).collect(); + let mut min_letter = 'a'; + let mut min_length = polymers.len(); + for mychar in chars.iter() { + let regex_str = format!(r"{}|{}", mychar, mychar.to_uppercase()); + let r = Regex::new(regex_str.as_str()).unwrap(); + let new_len = react_monomer(polymers, r); + if new_len < min_length { + min_letter = *mychar; + min_length = new_len; + } + } + println!("minimum new length {} found by replacing {}", min_length, min_letter); +} + +fn react_monomer(polymers: &str, r: Regex) -> usize { + if r.is_match(polymers) { + react_monomer(&r.replace_all(polymers, ""), r) + } else { + calc_remaining_monomers(polymers) + } +} + +fn main() { + let lines: Vec = BufReader::new(File::open("input").unwrap()) + .lines() + .map(|line| line.unwrap()) + .collect(); + let polymers = lines.get(0).unwrap().as_str(); + let reacted_len = calc_remaining_monomers(polymers); + println!("remaining polymers has size {}", reacted_len); + calc_most_significant_monomer(polymers); +}