## ~pmikkelsen/aoc2022

bf7ed4ed5a1d2068851dfab1a5dd5e5b7b2e9f08 — Peter Mikkelsen 1 year, 7 months ago
```day3
```
```2 files changed, 338 insertions(+), 1 deletions(-)

M aoc.pl
A input3.txt
```
`M aoc.pl => aoc.pl +38 -1`
```@@ 5,6 5,7 @@
:- use_module(library(files)).
:- use_module(library(dcgs)).
:- use_module(library(dif)).
+:- use_module(library(ordsets)).
:- use_module(library(debug)).
:- use_module(library(time)).
:- set_prolog_flag(double_quotes, chars).

@@ 20,6 21,7 @@ solution(Day, Part, Result) :-
% Day and Part combination.
solve(1, Part, R) --> parse_day1(P), { solve_day1(Part, P, R) }.
solve(2, Part, R) --> parse_day2(Part, P), { solve_day2(P, R) }.
+solve(3, Part, R) --> parse_day3(Part, R).

% Time the stuff and test that I got the correct answer
% It will print the time for each solution, then a 0 for the first fail,

@@ 29,7 31,9 @@ test(results) :-
solution(1, 1, 69528),
solution(1, 2, 206152),
solution(2, 1, 15422),
-	solution(2, 2, 15442).
+	solution(2, 2, 15442),
+	solution(3, 1, 8240),
+	solution(3, 2, 2587).

%% Parsers for each day

@@ 58,7 62,35 @@ day2_game(2, game(A, B)) -->
nth1(P, [0, 3, 6], S),
day2_outcome_points(A, B, S)
}.
+
% day3
+parse_day3(1, P) --> day3_bags(P).
+parse_day3(2, P) --> day3_groups(P).
+day3_bags(S) --> day3_bag(A), day3_bags(B), {S is A + B}.
+day3_bags(S) --> day3_bag(S).
+day3_bag(S) -->
+	line(All), !,
+	{
+	append(Left, Right, All),
+	length(Left, N),
+	length(Right, N),
+	sort(Left, L),
+	sort(Right, R),
+	ord_intersection(L, R, [G]),
+	day3_value(G, S)
+	}.
+day3_groups(S) --> day3_group(A), day3_groups(B), {S is A + B}.
+day3_groups(S) --> day3_group(S).
+day3_group(S) -->
+	line(A), line(B), line(C),
+	{
+	sort(A, As),
+	sort(B, Bs),
+	sort(C, Cs),
+	ord_intersection([As, Bs, Cs], [G]),
+	day3_value(G, S)
+	}.
+
% day4
% day5
% day6

@@ 104,6 136,9 @@ digit(D) --> [D], { member(D, "0123456789") }.

input_file_name(Day) --> "input", integer(Day), ".txt".

+line([]) --> nl, !.
+line([C|Cs]) --> [C], line(Cs).
+
%% Solvers for each day

% day1

@@ 135,6 170,8 @@ day2_win(paper, rock).
day2_win(scissors, paper).

% day3
+day3_value(C, V) :- nth1(V, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", C).
+
% day4
% day5
% day6

```
`A input3.txt => input3.txt +300 -0`
```@@ 0,0 1,300 @@
+pqgZZSZgcZJqpzBbqTbbLjBDBLhB
+wHptFFsHttHFLMDQDFTbbj
+fVfvsstwPHwNwfNGfHWRSnlpClcJzCWCzddSrddg
+bdgHbZJHgMHgJgJctDtVssVcpFtq
+rNNQqBSzTcBPTDsP
+GWNNrhGnNnWNzRfnRQRbhCdqHMbdmbZddbmCmd
+BSBDzrSwrqccDDwbfcBjsRwggClslTRWGWGMFlsF
+dnhVhLJtzNZdgCRlsTGWCRJG
+ZHZdNzptLNtPhPdnprPbbDBrSqrSQPjbqD
+rlSwlrGvwTTSwSggCJGQJdhVgJGQ
+jcrHrMWfNHNzQgVH
+WbfjmBMrBrrmLtqMbwwsPTvPpwvBPFPsws
+NRNcHzbzbMRcNPjPrrlBPlbtBl
+CZwVCCpWggqprwtlHlssHtPr
+WpmLghCVCqCnmVTLnccRQvvQQHDhNQzzzc
+NvGTmNGDJsrCmCWPHpCP
+nqfVfnFQnZQfFqzMZBPtppcBPPCBptcrbF
+JGRNWRGJbGmCGRbLmGpqShhcQpQgCcncScSQ
+FFdtjvvpvVFnQhhnQhgf
+ltvjjtjHlzBtWRmNPLZRHLpH
+FFCJFsvgLsjLgWzJFWJgGwBDbwnbwlDddqffnjnlnd
+pTpTMQpMZHQhZQpHPZMmTMlwhDNNddbnDqdDwwlbVNVd
+SHpmrHPZHQpmvFrqsFvgCsRq
+TtWpWhQlVZrVptJhtrtdbLPDPbjFbCCWCvFFbLSN
+zMGlnlsgSSvjjGSF
+msznlgcwMnRwznmBqTZQJrddhfQJtBJtZQ
+mwTwLftmqqSHWfCfLHjWftBthNNNVrlcFRVNrNrRTrMgrRNg
+pvJPJQPGPPzbpVpVlMBVchFl
+bzQPQbQQdsDZPDGJnBGnPGnjHDttqqqqmCjftLCmWmfftC
+ZNpfdHcccTfdwfMFNjBttMgMbBnvlvjBmB
+QVPsGzhbszRLRrgvtgjWgljlRtgt
+VJrVLsSrzLzGPChVGzbrrfpTSHFfDDHSdpZFfHpDTZ
+NPpvDbmbsmdbNvQvDdWQpmWSnnQCLBnCcQSCnnLlwCBlZz
+jggrtGTFhtGfjhDVjrjgMftFwnZcwwBCnzzVwBBwSZcVwLSw
+JfHftHhgftgFJWPdPDWRPDvPJv
+ZSLLZJGglDSVNDGGGgGgngGmHrfLzmHvvjfjwLhHvLfHHr
+QqFWszFMTQFdFPMqBmWBHvfhCwCjhHff
+pTsdppTMPtqqdbnlNVzJVbSSnbZR
+gBqDccrrJDwmpTWHHTdWMPWWZFHF
+RNfnfSwRjlLSWjQMHWvQZtvH
+GRLbnzNnzVRLCqhwzwBmJrmc
+CcGnZGnGlRncsspmFmmcmGRJJzCDTzjLBSDfqjwDDzDLDB
+hHrNdPWhrbPdhPgVWvvrgWdfwjfNzSqfqjLqzfBTzJzJTz
+HHQhhvMWbbdRswmlsmwsQc
+rrwhpZPrccRpQdcFDJNqhtqtqMLhqfMh
+lTtTllgbzTlJsmDMvbLbsf
+VVWBTgzlzgGnngrtQRQRtCtwZRQB
+HGnGvVdLhlFcmvPWmT
+jwBLqZgjrtjqmFsQTscPQs
+ZBNZtwLwztLpMrfZBLMdbdnfSRVVfnGbnfDVGh
+LmBBBzQrBgBhmmggmtdVdhJNMHNdhsHNDd
+ScSZbRplCcMnSpvCfCCZcpPwtJPNtHPHNVVNtPddwlNH
+sljSjSgsjcCLllsjVgSjCtspQwvNNhdFwFQvwpbtmhwhpN
+hDqqWzGRHHfRrJnrWrfWfHBdFmBFmBbdBGBpwmFdFpww
+TDnDHZrWWHhTjPClClSP
+wGNQGQDGjqqmwHHs
+MWvvrzgfsdWsvMrSdqJqcpgHgnqLFLnjpH
+fvsPMsPdrTZhChNDhbhPVN
+sbMgDDtttVvpMtcJsgcGGBBfGLBSLclQTGPS
+CWHWzhhRRHjqRmSGPfBSzJfSBnBB
+HjjRHWFWhRRwHNmCCRHhhFdNDNrdptMstJvsbMDtVptd
+RnSwRsLsnSswjDDDBJPrJv
+cpzCzlczHTJVQhvBQlDVDj
+WmGzqTmHSsffqqnJ
+vQSPHMwpmpQMLGfTPVLRPRVP
+hsWhnncsJqbGjGfcfBMMRR
+sqdNWqqghbsJslgsJqgWllMWDppSvNCHQHDSSHrHrHCSvvCQ
+ZWWnWMmmndQZmffcdZcmssQqrsptVwwTtQHTCTHH
+SvvrPzvvFDzGzTszpGGwHT
+vrRLjjrPhLjrjPDSfdcMZnmdcmJcfcRf
+HpqWhDJjzmcTSbmMBVBb
+nCzfLtFnZZrcbcVVfTBfsc
+FtRFzgrRtnRzrFwzDjljpjgHNJDlNlhN
+PQDMwPwMppcQQcvCFlhLhGmjflctlnHGjf
+QwDMFFdtwFDQJZZZNqSqJSqBgBqTNJNg
+cddzbbzQflTDcDfRbcfbJVsplVsChNghHNsSsVpn
+FBWFWjFFCjWPBSPPJsVpppPSVH
+CrCwvjWvmqmvrBvFwZRGQQDDcGTcfbddZdRc
+ZBQqdGLFmmzDmTZz
+PvrVMvGgWmwSmllglS
+NrfGnvWWPhfpspsGvLJBsFBbqJCbdQcLBq
+DrwTrlfGThhQTpDdWSWgdgwLLgBSZH
+bqbPRVRmzJCLWSgCzCLH
+jRtbNVtNjNqRqsJtbjbMDQHQGlchfQpfsTcHpGHr
+tMnRcnpDcZtpQDSCCsGGHvcGPGqGsr
+mzJmjWJNlbfmbhzVCCPmZrCZqPGCgZ
+JWhzjJBdWnMLZtSBTw
+tvdLttzvtHLztnQpssdTPbMqbqMTdTss
+jhSRGNjjSjhSDCNhRgRgclNjmfZTPnbTMqJJfqqsbMflTfMs
+WnCjcjDRCChSNSCNDjNhGVDtQvVLHzFrpFwFrHFQQwQpzp
+fLbLLLLQhVPhBVmDwmCfwsdwwDps
+GNtctFTSrrJqGGpHFcTJFTwsslwmlmWsdsqRRCmqwdWs
+ppctFTTSgHcSrGrrTGFcrrnhhQbPLbQZgzLvQQVVvZvLhv
+mBBWnnBbBCtssmRThRDllR
+wfwFQcpHFpddFrwpGcHSHdcjQZZlqqDTTjZqssRhWllssj
+dWfrcSGFpgrSzFgMbCPNPLtCtVMV
+llLlGLJJMjJMGVSvVMSLRRHvjCZtgZccttnmbCtdCcmCCztn
+sBQNqPhsrrqrrwrsppsHswsZcmnNCzdZtbgntcNgcctnCt
+WWFBBsPwpWPwBBHpFFrWGRMRLlJfJVMJRJLWSJ
+vgMvQnPMntnSQPSgMvSMpNJfJDNNRpfZmGQmbDND
+HlbjHHBLjCHGZGpfJLpfwm
+qdHWqBbbbjrTzdqFqssvtPMSSFFg
+TGDfDHSgtTzPPbnCtnNtVn
+WQrWMFpMWMQbCVNPRWVWWv
+pdpMMrhrprQshlMFjZpdjZMgmlGJJGlGDBmgmHgmJCSBHG
+zWWBjZZjWPFFPPnBCVdsqmnCdSLn
+rJvpbvbpGgTGrNJGGpRRhsCqSsLhnsmTVnSLTLHh
+gNNNJDbpvGNfvNSDPPWQWWPZZWtjlQfc
+RRVbWWWvvZVWmsFSsDNbHsDSsg
+CrTwJQJpJpCCwvlJQTTPsfzDgfwNhszfszFhzFDh
+ttQJtvjpPvcqTllJTPtPRGMGRGLWdVZLVZjWdMjj
+NnPCTQWMMQNNNWwWnMzpHczzsZcCscddHdGs
+mqRgqqVlLgqmfVzcGpzzSHGZcgcz
+tjmZjZmhqftlJRJhlTMPTPQbrPBBWnhnnT
+hvTQqpvTqjvhpjnCqmCnSDSFDWFFLSSSWDnSVL
+tZwGgsfPcltgcZltRgNSDSSSSldmWMLWFVHd
+GrZtwRPbGwwPcGRsZGtRtgQJJhCjpzmTBTvJzJrjvzQp
+rwmwqDWwfDtztnFGBB
+LPdpdVcdPGvPVgZsPtlhTTtthHBhHF
+dRdCjvpCRpjvCMZgvLgRVJJSWMqmbwQJbMWGWQNbbQ
+CMCcMcDGzBGPmBmznTNbnGbrswNTwTvN
+SSHVWZphqWWJJzNsbnFwFVNjbz
+flLQqHzzgtQdcDRB
+mdzvFtllBgFttGnvfMwMVRRZCThSNZVhMd
+pDTrDHjWWJPqjDjDSMqNwSZRZhNSRNCZ
+jpcTpQPWLLpDTLcTrPjPDcjzzFLFzvgLzlzfvGFgfmgFzF
+fQVVPzBpFVVrtrsJ
+PldSLNSmWwMCcCMMcCNN
+mSPlldllmPdRnLRwmbnLwmwvTjBTghTHQjfgjpZHpfHHfZbZ
+pmfMcfprMqMrZZJcMZMGWTsFCVCTVPPsVTWCGPDP
+vrvvvLRbBNNBbvBbjBHbQhgDslPTWsPTlFDsFTFwTWlDVQ
+hgjznNBjHHgrhRHgrRLRnRfSSJmdqMfffzqJptdmmmdd
+nRnPlCRPWPMFqwPLwq
+tBGfbSbHtBVQgrbrqfTFFLvTNLLNGTGMLdws
+bgHVtBDtqnqqlJRD
+SdSJrHssFBSVsNtMMdRWnTRhRl
+vcvfDvgvcwvFRlbnwWRlMhtn
+gJGTFLTdrpLdBcWBvnllvlMvMC
+RRqbbQhwNZZwQRPrSZWnvHSZWSvSZC
+fQDNRsrsQzfbDrbsqwdtpgJVjdJdpVfJFLFF
+DzWqFvqpqFSCSzGRGmwfntGjmR
+cbhZNJQBtgMHJbJcNcrmfhrRrswmfRwnVrhG
+bJNgbNdJBBPMHbcMNMWWvSFpDLFvCStqpLdv
+sLsHTsTbRLRwqssHwHjFrPDwJDppzFDJmmcrPJ
+BnZGBlMZnQSgSnvVSMmJzPDCzFcrLPPJmpDG
+HRPVmjqBqVjVRRPmcPmJjbDgLDDshbfRLlfbfLbhlL
+rtTzSMSMFpTzfgDzzgsLfLHZ
+rNpGpSSHwMTrrdHGNtTPmVjnGGjVjmBGmmBjJB
+DBqDQDQHSFlHsFnN
+MfLfwwLMWGLrWMMnpSlsnGJJlbFVjV
+gRhMZzhrFLWQvTPqTPcvvh
+NwwsHwtnFCtzcPdbvrQbBqclQq
+VmZLLTLfVpwMBrVVqqMM
+mgJDjTgWgLWDppJZJTWZmSRzCtRHhGGwHNzshGFFCSRt
+RGCCDRdFZdRCMzzGCDGCmGHMfqbNNNLQLfFqnnqnNQqVPnQn
+glgcrwrJjJccBwdSfnSnVqrqQVVnNq
+jvtBsjstgstjltBcWzTGGddHTWDTZCmDGm
+HJHGZZHnctSSDhZtmZ
+MjjQFSvQlRjSdRqdqvVSqCCPtpRpPPDfDmfPbbpphC
+SNsWqMNvFFqdqVMgwwBHrGHnHgcWTJ
+jBcbjSmSBbbCcPcMjmbzFPhDMDfrfGRhGQRMnGQfdrDh
+wHlqwlqpwZqcwVlqHtJVJLTdhndTDnhffftTGDTTDdTG
+JNllcwpZZlpZJjNzSzSCNjSmFN
+FhwRPzmPWmQQmwFPGGMGGRPnRHHVfDbvJlvDlHSvDTDfVHbD
+NpjcpCdqpZZvwvJVfDdDHT
+twZtqrBrBQBMBPGn
+fBFGjbLLFblmbWFmVfBvrvMdMdncnrdNbdQNTr
+szHwgtHtwPzPLpVFpVPLlfLC
+mrsrtrWjljjjvwwgNnZfDHJDqTqrHL
+FccMPFQcpczpdMPhMqJngNfqfnFgDnnFfg
+BdMpdcDPcpjBmlBmVWts
+VvwTTlfVlblwwSsbfTdzVqjhzVjpjjqjqpzV
+rwCWFGmJrNCmMRHmwRFPmHQQhBLBzdLqBjhLBHZdQB
+rFwDrMNRJDJFPRmCvcTcbDsvstTgfTsg
+zhRzdRRChHCFGPDRvWRWvWvHpZpscrrmrZrJcmspJmJZFfpM
+wQqLtQLtnjbjVnVjbBgjbBnbMZMZJlVpZfJprsMprmGZZZml
+jQjjNBLLwjtQBtwwdGGDCHhNzzWDzTPD
+DzzQnCMMznFnCdnFFlHtlmhVRtmVVmVhSF
+PWrPPRTfLJJtfbtBfV
+wsrggZsTwTTWGvDppQMRjjMCjMZp
+fTjzZVTlbffCMvjgMpSFWBNBWSFsvBsNNccF
+nJdwdPRQqGqbGJQbmmQQhRSBBBSsPPHWNSWFBtDNBsHH
+nnQhwwQGdLqqwnZbpfjMfzpzLbLj
+jgTgCwgjMgGLhvRrHrHwhvhV
+bqSsSsZFZBlFsBlTSppVvVvnVHHvHnhp
+qFlbPbFFsWFsBlFWbsbsmzTcMjLmtfcCmcWtgzgm
+rrHbfBLbfMcghcmrcCzg
+RDStDtvdZRQdJSQWWWdvFSgNvVcnghhmnnzhVPhczPch
+ZtJpJttSZStwtttFDQmLGTlqMLqGfwTTGLfTGG
+MrfLWwfBwgghvLmNvmHHHGGQHQSSscscVvTV
+dDjZjDPJtFRzjdTTsqVjTpqHsGrT
+JbFtlbPRJCzffBrgnlMWmg
+ZFsbbVLLdZppLFpcJjCCQJlGcQCMZq
+TwRtRBdBClCTGlcJ
+rwBvBzDvwNNDHLHzfHssdHhS
+gdhgftTNGTbpqJqjjgRJ
+lcBcMLFzMzLFMzFzPjRBQjQPQpSqhpbp
+mzzmZHZZnZwLhtGfddVsNCCnGG
+lblbPGSGrTLRwqZLvP
+FffCCFzFCWzzvmjRJnRTnZZNJCTqCR
+gdhztVjhHMsGvrGVVB
+ZJZjJGHZhDJRFJHjDZjhPNFgFmrnVmgVVzVBscnzSg
+bwlWtMwtbqdCvlQCplmsqgnVVScnVgmnmzNs
+WMWltTtvvCdwCCRPPfTHGcJDfGZL
+svqQJLvSSZrZZZCFCBDPDCMTDpPwMWDPCwRw
+GnlnGbdldjhzzhpPDTWjmtMwPmWW
+HzVbGnnbchblbnbzcQTZBZrQrFSHvLBBJv
+MmgMmVpcRDlvbvpHJF
+GSGTLTwhwwhzQqTqwjFlbdvdbrlrbrrDnDvHlQ
+zLNNNtwGFCMsWsCWNR
+tSTDDDftSqSsTDnTtCWNrbFsNJJvbzJbvJ
+dhRdVHdMGRgPJbjNPbzgvr
+VllQmQdhRHLhhHmLlGzSqSQDDcDBnnBnqDfSct
+zBzJWZBLZNNGLsbTvLbmbT
+QdtQwfdnPdPTbsRQGhRvbl
+pgtPgPjVDnpVnDtPTFFrJJTBCcpcrpCW
+GnWMfBfdCGMbjRNpnzvvNLRNVv
+FShJDJJscwwszNjvNjNNqZ
+tJmccwlcFlFcHlPcHFfdrbBGBGfjCGTfBCPf
+GhlcQsZNQZWhpcGhwlPmqnnqnjJjLRnqzJsJLJ
+VTMtTtDTbvbMTfvdJqngjmqzdjmJjCLm
+vHtbHTDBFvffBPGwLLZBQNNl
+bDphJrpbpnBbDrdBvJdDFBMtMlfgtsFSstfGPPgggPGP
+RZmNjTZQNVHQHNGSgMsfPlShSs
+VmchTLZQLjVLjmTVmQVhTmwVrWJqbDqddBrpnWbvnqrqcnJB
+jWWgThWtgSvSSWlJtlShllPcHVnJHPbMHPcPVPbVZrHM
+fGdfRsRdNwfRQhnpcZdVhVpbPh
+fGhwNBqNjqStFqtj
+TSTBrSDlQlTDrrQclrBSLffPvcfcdVjVMGGPLjLL
+qnbnbngFGhhhPfjjVffjff
+RRWbmgpnmqlrCwwSrwmG
+mZZTsdBZVZBZLVHdFmsNnCrCVQQbWvWjWNCnbg
+QSffDGwGGrPGWrgN
+hflwzltflDpMpDSllcMDhSShdsdZQdLZZdHTssZzmqLzFmLB
+LLRJRshLfsJfWnLBTlTBlFzNrnrBBl
+qmmVwmdHqmqGHZdHbbqSScdZQTjjpTFFVBBrlDrzDFBTjFjF
+wZZwmcbvHgqTmGccmvdCLhCPJsJCPWgMLPtJsJ
+TWbbbNbJJjJbqTjtJJjTQCtnGSBndMGCcSZSQwCB
+mcfRfrcmrDRrPsdQSGZQGnsSQMnB
+DDRLDRDFPpgmpcgPghpfgvRTjbhTVjHljJjzlVzVTlbHll
+rPlPrPllBGgJgdJfHgfjJt
+pppZVfFDWssMfFVVFMpsMMVmHCRLdcZCRtvLRdCtCJdHRttH
+mDMfDFDmnMMmsMFznDFpzswbNbPGwwSGBrGrhrTzThSl
+qDNFfCCNWLfWWhqhDGPMMZVwgpCpMbJwJCvV
+RdstRRvdtmtPVpppVbVtrp
+zzncSRdsTdQTczQBsLvvHNhDWGjDHNLDSG
+bNNpcfJcCtNpHFsJsGGjLGzmLjLmGzlFGW
+qwqZdnQnQwnhhzmnMWjmNlMzLr
+qhwwQSwStJbHNftS
+WlfWSwDftzRltBWVlRDlsmBJPcsZPmcJnmPmFhrn
+dLQbQbvGTddTvbjQCbLbhmCrZZPPsshPPPrJZrnF
+QgFjQHHbMvdRMVllSqfSlf
+MDPJBWWPggVlPVDMSljdZNNpwjwbHZpNbDdH
+mGmzcThGrtntHhthzGctRbNRNwRNzZwfdZpjpdRj
+ThtcvvtThFcnqFQSHgBSVJll
+hVqhFLBngHVFtJjtLCBJVSbbPNNbSmfLLTSNSrrLTb
+vsdZZpvQdczlMdMvzlcvvdQprbGGTfSbWmzPTgmmGTbmmfGP
+vgRZZMgwdgsQZdMBqVhjhJqBhJtRhq
+bgFQbMMbTbQhghddFTFGnmSmsNdzHvzSSzlcHsls
+fZDjVtfZLqwpqtCfCjCjlvqScrvzqHSzszzSnczr
+jpftjCfWCjCfCRZZlpCpjRWQBRTQQbgBBTMbghgbbPGJBJ
+VZZrbBVwbbbVVvgbntnggNRJqRRNNccMcNqJcJ
+jfDPfDdGGhDGfGFPCcZQqMpRNJhqTcMc
+LPfffPHGPDjPFGWSdHPFjWtlBlwvlwBlbtmLltsmvtZb
+TTfJDfrJTSrHMcVMJDTfMcMDBQBPwnPlznPszFVBFgzFgnsn
+CqtmWNNGBPzwbbwm
+htdCthhWGtWWGNZqcZpJjwwHHHMcHZDM
+VvjQjQCZLbbSbTPpSHtFzsHzppMfzz
+DJrJWBcDcWJWmmcgGRGRGWGDzHHwzdfRHpMztMpfdFdFdzdM
+DmBgGDqJNhGcccWmcZLjTPLVLTQhPtvvTZ
+qfhvwNDQqwDGdGZZGwPTTw
+STsJgsRtJMZPjlsmdpbs
+SCTTHTWHNVfHQqqq
+djCDgllgjJjDRRNgRlDdBgtpQHfhQTrLLrGBtzrQhpBH
+SVcsMGcPSbqSPmLTPHHQTHrftPTr
+VcWnsScqSScWcZbMMcSVGbNNlgDRlgCCNgwWvvRJdNdj
+mgPllfRgvNmPGQGGsmQNWlpFtnBPFShncTFShtFShnjS
+tLLzMJJwwbbdrrMLqLVJMzVZFnpTTFpnCSSpShCjBJhpThph
+HMdVwbbLMbDMDVlmDsgtNtNRfgsm
+hNsgsgzNZRghPhZBdssPQfzDmQSmmzQGJWzfCDJJ
+bblVHvvHHTljwFCfGrvmfmmJBmGQ
+THMMFVwqTPRdZptMBP
+QvcPGSvQLjmcQWSGWWGjLCNhhqpCdBCNCbJNdVWpCh
+rwtLlzZggLHnHlwHRDdVqBbCdqqVVhbqVnVh
+zRDzwRrwlRlRTgrDtllmQGLcPjGLccFmTcGSQc
+RWlgQlbcWBwzsJggTfhh
+GrnLjHLjmLjjGSLjSDmfJJpfThhfSWJPqJqhwz
+vLvDDnDNrCVjCmNDbFlBVZdVRQlRbWcb
+mTlwFngwmlLlvsmLHmHsLJhJFfcbdpbNcjCNCbpccb
+tZRzBRzBBRQzPqGRqrVQtjjfbCMcfMfCMMjVjfCJNd
+SDBBPtZZTdnnwSvg
+nddNNMMPNBnBNnBTQSShlSHghlDHBr
+VcccVmqJsJsjlTmzTDggmHHT
+VqLtFCqFJfVtVjsNgPNNMMWNwgtNvn

```