From 56d350f318f8cf9b580852b123d505845abad84e Mon Sep 17 00:00:00 2001 From: Vincent Douillet Date: Sat, 3 Dec 2022 22:00:50 +0100 Subject: day 3 --- 03.c | 79 ++++++++++++++++ Makefile | 5 +- input/03.txt | 300 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 383 insertions(+), 1 deletion(-) create mode 100644 03.c create mode 100644 input/03.txt diff --git a/03.c b/03.c new file mode 100644 index 0000000..d5b10fd --- /dev/null +++ b/03.c @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include "input.h" + +#define INPUT "input/03.txt" +#define EXPECTED1 7446L +#define EXPECTED2 2646L + +void part1(struct input_str* input) { + long priority_sum = 0; + char duplicate_item; + for(size_t i = 0; i < input->line_count; i++) { + int rucksack_size = strlen(input->lines[i]); + int compartment_size = rucksack_size / 2; + for(int j = 0; j < compartment_size; j++) { + for(int k = compartment_size; k <= rucksack_size; k++) { + if(input->lines[i][j] == input->lines[i][k]) { + duplicate_item = input->lines[i][j]; + goto found_duplicate; + } + } + } + err(2, "rucksack %ld: no duplicate found", i); + +found_duplicate: + if(duplicate_item > 'a') + priority_sum += duplicate_item - 'a' + 1; + else + priority_sum += duplicate_item - 'A' + 27; + } + + CHECK(priority_sum, EXPECTED1) +} + +void part2(struct input_str* input) { + long priority_sum = 0; + char badge; + // loop on groups of elves + for(size_t i = 0; i < input->line_count; i += 3) { + // loop on first rucksack content + for(size_t j = 0; j <= strlen(input->lines[i]); j++) { + // second rucksack + for(size_t k = 0; k <= strlen(input->lines[i+1]); k++) { + // third rucksack + for(size_t l = 0; l <= strlen(input->lines[i+2]); l++) { + if(input->lines[i][j] == input->lines[i+1][k] && input->lines[i][j] == input->lines[i+2][l]) { + badge = input->lines[i][j]; + goto found_bagde; + } + } + } + } + err(2, "rucksack %ld: no badge found", i); + +found_bagde: + if(badge > 'a') + priority_sum += badge - 'a' + 1; + else + priority_sum += badge - 'A' + 27; + } + + CHECK(priority_sum, EXPECTED2) +} + +int main() { + // read input + struct input_str input; + input_str_read(&input, INPUT); + + // do stuff + part1(&input); + part2(&input); + + // cleanup & exit + input_str_free(&input); + return 0; +} diff --git a/Makefile b/Makefile index b42f264..088ac94 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ CC=cc CFLAGS=-std=c1x -W -Wall -g -D_GNU_SOURCE LDFLAGS= -EXEC=01 01bis 02 +EXEC=01 01bis 02 03 all: $(EXEC) @@ -17,5 +17,8 @@ all: $(EXEC) 02: input.o 02.o $(CC) -o $@ $^ $(LDFLAGS) +03: input.o 03.o + $(CC) -o $@ $^ $(LDFLAGS) + clean: rm -rf *.o $(EXEC) diff --git a/input/03.txt b/input/03.txt new file mode 100644 index 0000000..9c0014b --- /dev/null +++ b/input/03.txt @@ -0,0 +1,300 @@ +JppMDcJPcQbqGqFb +ZStgnHtsSjGBhqFbBmsm +djzzwgHHggdnfwjtMPDPMGpPlNfpLDll +dRCtwtlCSttPtlNPNtgvPrDqmBsjGSpjBBsJsqqmrp +ZhWnZhzMMfnWWTDzBrmsmjsBccJB +TFQMrZrMfZrLZZnLQdlvNdCgdHPlCllHNF +PVddPnZWDDPqmHZzqVPzqdHdMRMJjQtvmvjvtTQQtlRtbbQl +fsNswFpChpNwfgtMvCbjTRJBbtRj +SFgfSMShLcsLgNMFhpwShFFZPHqZGZPqHdzPZHZcdzDDqd +dHffzCqSfJCCzCPvdcpzRrBDDBSBBBMtthDDrFMT +bVsZbsrgbWshBTFtDTtZTD +slWGNbNWgWwnmNnwgnlGjdJJdPHcvcrcHjqPzdqPvp +vBFBzGvGBvjFpGWcvCCvBvGPPhZbgLhMnhrPgFgPFgLLPF +dVlslfdJNVJJmQQwdNRNwLZZZrrqhbPbZndpdgMhLP +HJRHJpNJlVmftHfNQNRsHmmGCtGWjGDDTvCzcjWDStvcvT +cVQzCCCpVVjgHsNwwFRqSRSRRtNH +PWfhfPhbWWdWllPDdTvdbnvhLJLLMJFTSNwJtMRwJLqJJNMq +DnfblllPbDrbWmbdPFdvlhdgQzzZZzQgcpcsZGcGQQgcpr +hdFnnrdLnJRrZMzVlMbrwZvz +TgfjGCcfsqfqqBfRMPDVvVVvTZRPbP +qQqffcGStBSCQcsqCCBRjGqWhHFptFdnhNLmhnLWmphLLt +WHPqWhLWHBMqddCdtDRwStDSwgnw +rfCfZTmvpvvpFVfFrbvTbvcgtwgtStntggwbSJttgJtwgw +fpQFsmfFmfZcrFCMhWNQWLCzhhCM +zdqqJHDWwqNNZjQSmtdjpmfnjj +GFBcPfBLPThcTcLRbpTQQjpTQrjSnQjlvn +MFVLcsPVbPcRGfVPFRgDzJsHZNDCZNCNZsHg +WQdMhlmQMwfZlQdgdHfddvtzmbJbcsctbBJqqcvqzB +rSTrDDCSSGRCnnSGwwzJsbBvJsCCttccsvsz +VnFwDrNwPwVSDrLgjfZZdMQFMWgljQ +rJNjBLNQjvLQjFFLQJCFTvGWlRRgfGWDWlCDzlGnRRWG +tMMhShhwhbgplflwDlnnnzDH +ZcSZVMSqshhQBQqQvqQgjJ +btTtWGbvtcvHHccdNRhHdl +TDzqLPSqBzqVSldPddHhhNNlRQ +jBLDqDgZZBzJJmsbWjppmmpTWw +LLDTRRfTwZRGZfDCRTwRsVHsVFBVZVlmVFBFlFJl +QjWpQrzQcbhfMqrVVHVPFslFVpVmHH +hqhzqMfNvjvMMzhdRDdCwGDSSdnvRn +jmMdNCLjLmJPtHtSHhSVVJ +pDBqgBgCvbfGBBbCGHZhtQZtPHVSVHPV +pBnWgBpzWzBbWDWvzwpgCvqcmLNTrdLmmrnRLTrmrTdmLd +dRWWtRGBDPQctQDZ +CMfnCfFMmTTFVCmfmTLvsnMPZjccHRcPrRPsZQQZPQDRrQ +fLCffmRTCvRnmTllzVvpdpphNJggpGbJJJpdlh +cfsfbbWqqZqDScbhGDPDjTPmpVtmmPjPntFD +dCBBCRQCHNHLMQvrJJJBJLrGPMnjVtPjVMmnjPFmPmMpFn +HvRGLddgHHvqhwzbWhcgcf +DHmhhDDhbqrRhvbrHqhPbPvBwwWwTmMGTVwwBMGWVNNwVw +gSzJjnnjsscfcsZcSfWwQGdMMcWTBcTTMTMw +nsFCCFZsnSlCFBFflfflsztRPCqvvHPttRbHbhvPrrRr +SGNRLzpNpgNSNNlWFNwzqJfHfJHBtBdJhBJrHd +bQnjPTnjVdZtPPrfLP +TTnTccLnjGFcDNggFl +lBJmNzJlzmmQBlzgVVjLWRDfLjRsRLWWRS +vTMvTvtrfdhrrrPTdZwTTwtDqSSnWFWDFMMsRssjjsRqWD +ZpbvHbZddtbrdrdhcBmmpGQfBQgJNcmz +qsmhTmTVcDdcffhPhPvvzFhF +BNNlJbjWBWjtRtNljbmBBCpFzPlFPgpPfwFnlffnlPgg +JtBmmrrrRbDSrVqDqVSD +VmSgpSLgJjVDMrFrmMlfFmsG +bZWhZbzWcCwTWPRCwwwSPQzwMHnflHnGsMGnTrsflGMnlfTF +CqWhWqWCCWRRZQcLqDLpVDDLNStpgD +JwzTVzzcLzVJVVlJpVTwzGcrWhFjqsBjCjQFjWcCCjCjBF +MDSNQMtbSSnSbgbRDvnRNgvhmrqrjBCBtmCrCCWFqthhWm +bgMfNSSNZTwZQddGJZ +jjPgbFjjStjjPcSbrbtpvNrGnGDvBnMGvNDNGG +LwdZwsTdWTTmwDNCNppGBsnpBR +mWmHwZWhTTJWHBdQQWBjcFczSgjlSftjbtQPzg +fCBlrffzlCzcmfLDlfgRRnHScsHvRSQHMQvs +LthpZqtpVThZhGJtqTFvHsVnvsvMsggjHQjgQH +ZWFWGTLTWBNCWfDfmD +BpFqJrpcZZBDhDsNqMHhRG +zwlzPdmzPLhwvhMgsHnN +mPlWjlQfQjjllWtjQCWzCrBFJFTBcSNcJbbZfcZJSb +FpzNFTThBDChnnzNBCBNDzWGndgWqbJWVGqmPbJqQgQm +HQRctcvwgddVcJGd +LwRMZLjQfSRjFNzFSrhNsThS +WgRWVLWhFqgqgcgWHqLRWHVRbbbNwBmtBcNcwdwwBNwBzwBN +pSfssjDSrSvJpNJCztbJBtMNbt +TzsvGGnjGPsPjSTpDrPfPDSHhWqLgZZVHVhZZZZVQQFLnZ +sHjtPjQTtDbsfrrqWR +ZmccchvlvSvvZNMVNhvBLWRJJblWJWJlJfwHbwlL +hMMBzSMppVSzSNNmNgHjPgGPFTCpTTgTgG +rPQpCPPCQQZdcFhcZgzVJgwt +vDBSHmvHSSMlDWWmljnHBvFwzzcrwhVSJwVFtzcJJghw +bmmrsrsbsvNdCTdbPTdb +NgzBnsBNnfjgNvvfvWbtShSSFSMLJMFjjbPh +CCcRHdlQrQPLTJPLGP +HrDlRcqcDJCCDJHlcplrDJDfgfzBWWNZfvsnNqWwngZWwW +TggFVbjVTVzRwFFjjqBBqpzNztqcQqNNqN +SnZPrWndmShSZSPsnSLsJhpMQpcJtNqBClltqctC +mfWsGdnZZWmZmrLSfsrnmPggwtggRgGTVHvRwgFDjTGT +wQMZFQwppbPHPbLQJsgQNJJmBnds +qrSGvRRCvTzTDNnhNgmCgdBm +qzRrcRlGjvvzlzrvjcGqSSzMHWwVdPMWFpFMHMHWlPWMVV +BccsFzrBcsfpccccgFmQqlGNqCTLTlQnqgLlRG +MZbVSMddddSPPtdHPVJPJdTllqLNLGGTNCCRhTnHTQHh +DMwtbVZDZbSbpprcpccppwrq +bSZTdNqFjjzjqQMQ +WtRztLsWJpPLzrsMDlDQjMhVMC +pcgHRpHmWPJgLRzBJHBPPRBfvvfGNGvvFwfvSvfTmNNZfN +RjvBljWTTWTlqmBvHjGptRgccZcbPtcttbpzbn +VhDSDdJLJpSNNVVznPzzzSzcZFngZt +LsMdQNVMHsBHjqps +rSPSLTnSCClfSFCR +MwtZgwNBzzTjzZMbbmjNtwmBcRvFqQllqtQRlFRVqRqVVcvq +TsMhZsjNjBbTbBbwZLpDnHdDGdHWnpGHnh +LfdssTFBjFHSwlhzCcZZgMMfMhZZ +DmtDvrpmNStVvqpPczrZMMhZhhChCC +vJtJpQWvNVDtJFbHlJSlBbSF +PgvHLbcgRcGGHzRvgGgchBzsCZnmNZmZddrCrvdddZCZrF +JQBMjlStJrQsZFrNCZ +JSJTlqMtjptlplSSqJVDBqphwhhwHRPRggGbGzHbgzVRPH +pBsztsZdBsnWhntVnhtVTqTWNQlGGTGGFFlQFlTl +fDvLSMcbDbfMrGqFqSGwSQPzqz +zjcvLMMvffLjgggzfjjJCCLcdBtRphddBmmZBpCZZpZpmmhs +gmmSDplcPHDfHDlbVNrtCtCCNqHvTn +QGwJjzdPMzJhFLwnbvMqrTVCCMnvMv +LQQZdGjGdJhFBFQGjLGBJzzsBSWcPflllcfmDmfBsmBWPs +sMppbLDRMQbrTDTJjwcqnfnjwwnw +CgmFgSPHPzHgdmJWZZFzCzZZcVnGGnttWtVVVnccfjVqwVff +PhCChPSNgPgPJhPHhFZgsDNRspsvMNQLRvNDvpbD +pHnVnlRGVpfgpfgCpCTz +LCNQPqZCqNSSZCStzPgTmztwPfzwzT +dbSqhjhqQhNLQLFjLjGvFcRnCcsvRVvvsFnG +QTdnDTDQbCnMdbqdwSmJBljFJZhttJZMSh +HfNfLNzGLsgWBpGJthlZFBSB +ssRPHPfNsWHzZZvrvHfgLzNwnbbVVRwwRbVVcqDTddCVdD +ZhZBrJssjrNsbRtWpjwjlmlm +qTfHzGTfTGqqLGMdCCRcmmRRZcbPMccWmcRw +dVCZdDHdGHQhBVNJSsBhBF +NsplbGDbblHcbCpDlDGDPlPpJjdrVjgrvHnghvVdJrJdvvdn +tQFMZNWSmWFQRzQSwtzFmwFFJdVBghVrnBjVjBgrvVjMvrhJ +FFRmFZZRzQRmFLQSZZWQWFCPCNGcTCpGpfGfLTpblpff +dnhQHqQCnqWwNQCwCRRdJjjJVVPmVVJsJP +LccFRDgfMgLFBJVlmVVmgjrPzZ +pvfGpRpSpTnTQbvbTv +nwNlWwhWwNmJvQQdzdzZGMqDzn +rcVscPfrLcfvjTFcQDqGdZqMzMSHZHjS +LsfbbFcvVgRRblJRNR +Rmrrlmltcffhllfl +DDZMMMFZVsFsWZDSHhPPfgQbPPnQgcHctf +zGMGSBVDWCrvwjtBvm +DCZHwdDwNNGNZDZCjjtpTHLvtlgLbRLttlTL +BzPzBJffJJQgLlRgGztQ +PJffcJhJfNNSwFhGZC +blplfHbwZSfbcbwSbfVSHDHcNvdrvrWsCrvWVCRWnvNndtWW +hQzBTQLLMBWBsnsnNC +zMsgTjqTqPpZHbfp +ZLNNLtfZhRJQtpQhNRttZRqcGFcqGBzjrcqclGScFljjcj +VnvVVPMWHwgJCMvwdcGFdFrGcwzGBG +WHgPJJvWVTgnvgvTHmWCHmsNZRtNRDZpfZQffZZssR +rZgMFMVVjGbVSqZbhftLRDmCGRCNDCtm +cdddQzdWsWnQvzscnfRHmfnDNtLNChRmfH +zplDQdDzwszlDsWdPcldzMFFrFrBFgpqVBZgSgZFrF +gbzfbTvbJgbvzvTvJvJmzvjcBBQSfWDLCSBQQfLZWSCdBHHD +GhnMhsGrMNPPwnwsRPNsFCZDWHZdWBWHdrZLdCHBBC +PsnGsssGNsNRFsLGwMVNccJVmbjcjJblbzTVjlTz +RfBqNfVmPLTTTVRZMMBWjlMvBgbbMs +rHJzDwJdHzQgbMQlWMhd +HtJrpCcHflLPFfpq +SSGtmjQFStDbQbqGWJNnpZwgPsZjnJNNfZ +RdClRMhlldHdlvdThNgwfJNRspNwJpwZcN +CMBLgvvBLhrrBHTCVVLBQrWtbrDGmbtWGtzDQFGb +ZRRCqHpRdztLSqWz +hRsGjMVccGshPVDVcBmfgFFzggFgfBmWWtSd +PVjlGhcGJjGPsGMjjDVrMTpRnvRZlHnZNNQbHppTTC +QjbjWWlndRbwwwQWQdtpTVVZtzRPhHDzThhP +fFfLsvrLCrmvGlSfLSrlPHThDzTztHVtzDzGtTVh +fvrgsfccFLLLSvfMCCSWBjdMqdqNWBdBQNnWld +pjGPvvbllvqGvGjwMbpbRmgSmSwtRtShgSSWWQmW +DffTZLLzFFFTCRJMhWBzhmhgJt +CVVZLLTTsZTFCnMffMTFHffLVpGpNqGjNbNPljqVPcGNGlcv +rvJfztqQJqqrqHHwCzClTbBhDBBDrbSgphbVTrrV +FFGdNWFLGWMmLDbpRwVbgRBp +dmNGmZjMjQwtHCCw +MSGbqbqMbbGDhSSGDhLNBPNcrDPPfzfczPfrnv +rRwsrljslRgslwwgpssCjRtBNvnmPmBmccvmPnmzcP +CjVjsssJQpTCrCCgHJLMSZbhMhWGZhHG +JtBGBFGRVGVLLctRttthLFRBDQlDppljJwNQlpHHQqDHbHHN +szSZTrzdzTSMdzsmsqqQqwdbgDNqgQNjlN +SzmrlWPrlfPMsMZTPtCVCFRhhvhccLFPvL +chmbsMDMMcBnGbZBzZGL +JjjgJrJJggNgtrQSQBLjWBZlGnnB +rFNrFtFCRNVrrsHmMDcsLqMhMF +DLMwrBGgrBBDrcBcNBgWhpGhqVhhqSjqqqmjjp +JfJCZCdtlbZlHHbjWVpPmHWb +lTtZtnFQCztWFzJflZLcsrLFNDRNBcswcLMM +tsVttVCBsCcCqPqwvtqNPQjWDDWjzQQWnpJQSrWJJN +LMRdZvHGgMmZZGGLGLbhLhJpjWrSjndWJpSJrJppJnpj +RhRgLMlmgMGMFGLlTtcBvwcfFCtVvfFT +llBBmtncBglfqwsdwsjdbHwQHm +zGRhPJvFzhvFvMDGFvGPwSWWQpdpHSwSjWjHsWMw +JGFhDPrLTzhLhvFPzPjLjTzFlBqltnCqqBffcTgfnZfCfCnB +QWQGNHQBffCNDMPdRTDLPVMN +hrtlhtzZwJtwwgFgtlJthJJtZMqPVVpLmDVqRDmVPmMPVRTV +SJSSnJwJlsFFvcHSBbfLQHGL +zMNVzhNFsdNssmhlvtQvlttBlVGbTt +wHpFwjHjLFHlwtncTQlnwn +CCpjpqLCLqJggghqRmFsNRFmPszh +CTjmprmNcnmCNVQbstnstvbnQv +jqqdGhHgPRdfRRQvfLQffz +BGgqBhMdgqBHMDDqqMPwgdhSTJNjjmJWWCTCCmwTWZNpmZ +LqSDFFmdqDBDbbBHWl +dQcRpgwRQPngBWHbVWht +vdQMJQCQQvrJNqrTNsSZSmZT +cqrHcHHFNFPLLNPHLWnHHFHFjvlbZfWjSjBjZfSblhbBSbSf +VdVTGwTzTwTpMJslvjfsbbZSvnBClj +nJdGmmTpTTdmNQNNLPPmDFQL +VcjpTTtpcbThJBTTcjBvSPJzJlvPlwfJrgrgvw +dmshCNqnqdhmRsCsqCnrNgPPrPfzrNLfSwSgzl +ddQZdFnhsMttFTbDDD +hLThMTSdfMzzLzTLsFTbwtDvtsFTnttF +pZlNllPWrPCQPQlWNqjrqrjsnfDFbbtbstwswtvDnwtwjt +pCNNQBCClQrplrfHQpQdSRMSVRhJzRchRhGHSh +RZfVfRnTcPQWZcRVcRNSvljQsSSjNvvNqvss +pwbwgmqJhGlNvvzgMM +pthrhpmthmwhHHpLbbdrJmLWWRPTRZnCnPCPBnWTWTZq +nzsJJsMjGMMsQFbnNmLnmCfb +HlllPPTPlWTPDRRDRHcwwhrLLZfQmgmmQCFHvNZCgfggZQ +lPcNTwNWddGsMSttdjzj +bTbJZJDVFdqpBZTFTZJprdcsjjGszmjQszcjzDvsgccv +HHLnhMNCCPhfhCLMlPlnvgGfctscSvtSjGjztQtm +wWNQMPPMwlPHHPnnRLwWpJbrbbqbdppqJVJdZV +gpgpNnnrhwBVWFqgjqqF +ZCTsdRbCGZpZzCSGbWmtMBmWtqBBqdjjmq +LcsTSlplZrJNcQQPvH +DJDpMcqJDcDddNcJPGcJGFfnfZZmZZfRQZRNmVQVnBNn +WWThvSSHFshlSsHvgTHLlzBQfVWwmwnnfmRQWnQVRn +vljlgHjhstHbLhjLjrbPqMGJcJFJCMPrdF +pJlPMpMBrrMcnrBBMMrvdhdgFvmcFdWtmdtftg +bVVRmTRVTVVSVVVzZZqsggFHWTWtWffWFfWdtHdH +RjLQDSzmVsjRRZSZQrCMJDPwlnJJnGGrPB +GRgJtglPGlCrhQQrfW +vSjvZvZHNBjZSvwjvmvNDqhhFqhHrMhrHpfWqQfhpW +NBmwDSbZbvsNNBjmZfJzJgbVnGJbzVzPVRtL +QQZVQCdlVmdZnWmJBrLwSJRdggwdJr +DqHhPhcpvDqPFjhHjtFPssSJNfSBwBvffrgJwwJLBJbr +jpsHcptHsqtPttsjctpFhGlZwCMlWMmWGCWVQnTMVWmz +zzvnHjHWSfnvzpnfSRHdgrrsmWmhVrrwwbTrTmsrwm +NlLNGqqclqlZZCLCGGCPllJhhPJbrmpmrwVshFVsJbwr +DMLDNCZQCGLQGDtQpGtMjRdfdSRSSBtjtBjfjgjS +WBBJfjBQJjftGCbttVJptC +sdlmTHsqNsqpRtGcbWdbnR +svNMhmWHNmvmvHZWTvBQDgSSjDFPSBSFPP +mrlgqncgwHdqWWhRNtRttSvbRwwSvN +jZLCZVZzVcCTcpCDVSBBSbvvRFbfDBSDNS +VPJVpQjTZLjVLJJQGZTZGcQVghsGlmhshlqnghqrdrgldhlW +qwGDMqMFWbFbqbDwMgqgnjfnffffcTTjNnpTfBncZZ +lSdclSltlzPsJlhNNfTQPTmQhpPh +LtllsscLLLvvJlSzWGqwrDGqvbqMwMGb +bnfvnnQsVTdHQDmdNN +fwlttwrfSfLwdGZGmGND +qlPrjjplfSpjSltfttBBsvgzgbgnggBqWVvC +HHrBSmBqBHdHCFcQsc +WqtMDDnMMZhMhcsQVM +bqtbGDLLTTnRPwvGgBNmNrwvjm +RwWzWFwBcdSdMgJW +mrTjVQDQthQvjrvTmggFbbdgSJcJDFgSdg +phhFtvjNvFvTTvmTHZzlGlzZRZLBlzRp +cHlZmZmJSHZcTVGmvZVcGVHlNtbDNbtWFWdtlbCWbWtQDFdr +pwfwgRhngPjjtdWdNtFrdFwT +RTgMpfhBcMJGHqcz +dmCbpCLQVFmCRddCTFLCgZtWPNBhSNNwZWgWZvSwhN +rDzGDjJHhhwzThBS +rJrclsjjsJMJnJMLnbQQQFmRTqLVRT +TgFTGPtrWHzgCJDz +fQbfLwbbFbWjHJHWjd +LvQvwVfQvQhLLLLsmMBfLfBhqchtGFSNSFNqrSqPcqSGttSN +MsMmFgTVMMgMdFVMhdzWqCCBCWjWqBWqhzzL +nHfZDlbvcrDpcpcfDJbNJqGLbCjBmjLzJC +RnDZHwmmTwVMTsMS +NpdpdnjNCRjBnHRPpBDnhSdSwFFLFdScFFWcFWLd +stqMrMZtsQMJmMqvrtqMbstQVchPFWgFVVFVwfWJcSSWVSSV +MQrZzbvMrrrZZtZmstMtMsDRRjPHCGTjBnzpnDHTCGjG +ClGGvDMGMNhNSmFVPbpgFgmFgZPb +WhTTLWsBBWTcrPpggtQpsQFpVb +fBRTqWLjTrzDNhMvCSGDzl +jbzjttVzpbWzWVbTtzWzVwPbPPcwDDccccFNFLMFsm +rlghJZHmCHvHJvRLSNLhhhccNPwcMP +QffmBZRBGtVTBdTG +bDRqHwwRpNPnbppn +FqrlQSQJSVsQrSCmpdPNpcNCcP +jFZjrssjBhrZVhJLLGHfMHfwtqRjMqRTvD +SMMCTBzFfSRhTThCSMRSzzHnJgqGDHQgGVDnqrqnqqnqcQ +ljvjpWPbrWWtrbmDVDlmnDnqVmgJ +bNjsNPrNPtswfZzfTSTBwhSM +hNMNdssdMqdTQchqgNZzHtwmwGHHzmQZGHDH +JrbJvJrvLrPjrPCVCjRBLPbzfRFZmzwHgFHmGHmwFwzFZR +rpbrvVjPCBbCJrCSLSPsTlphNncMglcNTMWMql +fGWGHbrllCCWWllFNPQSZvdPSvdZTffZ +tqssVjJMJWzWVvSvWS +qtwMwDWjnRRwssWjngwjjnhhDcCLhhCFHlcmcbCHFmDC +rFTdFjdRDTTlDWCqvhwLhwZdLS +QzfJfnfsbsJHMnNmHhVpCZwSQSWqSqVQhS +nJnczsHzNMmBJnbnbNwnfzJfcDTltllRTgPlFlgPrTDjPRGl +ZLCGDvvJlvGChSPZWPSsZWdRRN +rQccBwcccnHmQggnVLPLWpgVWPpWzSRs +fmwTfTHnMBTfJDbfftJLvhlL -- cgit v1.2.3