diff --git a/io/pileup/data/test.pileup b/io/pileup/data/test.pileup new file mode 100644 index 00000000..34ef5a1e --- /dev/null +++ b/io/pileup/data/test.pileup @@ -0,0 +1,20 @@ +pOpen_v3 1 c 991 ^].^].^,.^].^].^E.^].^].^%.^].^].^6.^].^].^].^].^].^[.^].^].^].^].^].^].^].^].^].^].^].^].^G.^].^,.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^E.^].^].^].^].^].^].^].^/.^E.^O.^\.^].^E.^].^E.^].^".^].^].^].^].^].^].^].^G.^[.^].^].^A.^].^].^'.^].^].^].^].^].^].^].^].^].^].^].^-.^].^].^&.^].^].^Y.^..^].^].^].^].^].^].^].^].^].^].^].^".^].^E.^].^].^].^].^].^].^].^].^].^W.^].^].^].^].^].^].^].^].^).^E.^].^].^].^].^G.^E.^].^E.^].^].^].^].^].^[.^].^].^].^].^].^].^-.^].^].^].^].^].^].^].^*.^].^].^].^].^].^].^].^].^].^].^9.^G.^>.^].^].^].^].^].^].^].^].^].^].^].^].^].^,.^].^].^].^].^].^].^*.^E.^].^E.^].^].^].^].^].^].^].^].^].^(.^].^].^].^].^].^E.^;.^].^].^].^].^].^].^].^%.^].^".^].^].^].^].^].^].^].^].^].^8.^].^].^E.^].^].^].^].^].^6.^].^?.^].^].^].^].^].^].^(.^].^).^].^].^].^].^].^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^*.^].^].^].^].^].^E.^].^].^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^+.^].^].^].^D.^G.^].^].^X.^].^].^].^:.^].^].^].^].^].^/.^].^].^K.^E.^+.^].^].^].^].^>.^].^].^].^].^].^].^].^].^].^*.^].^:.^].^].^>.^].^].^].^6.^].^].^].^].^].^].^].^E.^R.^].^].^].^].^].^].^].^].^].^].^N.^].^].^].^].^6.^].^6.^X.^].^].^].^].^].^].^].^].^].^#.^].^].^].^].^].^].^].^].^#.^[.^].^].^].^].^].^].^].^G.^J.^].^].^].^].^>.^].^].^+.^].^].^].^].^].^].^].^].^].^=.^3.^].^].^].^].^].^].^].^P.^#.^].^].^].^'.^].^].^].^].^].^].^(.^].^].^G.^3.^].^].^].^].^].^].^].^].^".^%.^].^].^E.^].^].^].^].^].^].^].^\.^].^].^E.^].^].^*.^>.^+.^].^].^].^].^].^].^E.^].^G.^].^].^].^].^].^?.^?.^E.^].^].^].^].^].^].^,.^].^].^].^].^].^].^].^].^].^#.^].^V.^].^].^E.^#.^].^].^].^].^].^].^#.^].^].^".^].^].^].^].^].^E.^].^].^].^#.^].^].^].^].^].^>.^].^].^].^].^].^].^].^].^].^#.^].^].^%.^?.^*.^].^].^].^].^].^%.^].^].^].^].^].^W.^].^].^].^].^].^].^].^E.^].^].^].^].^6.^].^W.^+.^V.^].^].^].^].^].^].^].^].^].^].^].^5.^].^].^].^].^].^?.^].^].^0.^].^].^].^>.^].^".^].^].^].^].^].^].^?.^].^].^$.^].^].^].^].^].^].^].^].^].^].^].^].^7.^].^3.^].^G.^].^].^].^E.^].^].^].^].^].^].^].^].^A.^].^].^].^].^@.^>.^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^W.^].^].^I.^N.^].^].^P.^].^].^].^].^=.^].^].^].^].^].^].^].^].^].^].^].^].^[.^].^].^].^#.^>.^].^].^].^:.^R.^].^].^O.^].^].^].^G.^].^].^].^].^].^].^].^].^].^].^].^+.^].^].^G.^].^].^].^].^].^].^].^].^].^].^].^].^].^".^].^].^].^].^G.^].^].^].^].^].^].^#.^].^].^].^].^=.^].^].^].^].^].^C.^].^].^].^].^0.^].^].^].^].^G.^].^].^G.^].^].^].^].^A.^M.^].^@.^].^].^].^,.^].^].^].^7.^].^].^].^].^].^].^].^D.^].^].^].^].^].^G.^].^#.^].^].^].^?.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^?.^].^*.^].^].^].^].^[.^#.^].^].^].^].^].^].^].^].^].^E.^V.^].^].^&.^].^].^].^@.^].^L.^C.^G.^].^B.^].^].^].^].^].^].^].^#.^].^].^(.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^#.^].^].^%.^].^].^].^].^O.^6.^].^?.^].^].^].^].^$.^E.^].^I.^].^].^].^..^].^E.^].^].^].^].^?.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^>.^#.^V.^G.^].^].^].^].^].^].^].^].^].^].^].^E.^].^*.^].^].^].^].^].^].^%.^].^].^".^].^].^].^].^].^].^].^?.^].^*. EC07@<>5=;E17==@A>EC.A:@E<;5@ED?4=8EEE9E?:;<@0E;;97E9EE1E8B8E5=4=9:1Em3:.EEm80;E?ED.EEDCD9m/4C6=D9E>E;?3E7:m8F;@EADA@E4B9N6.@EK35E?EE9E?/87B>8mEm>B0<60DA>EE<=@3:15E@E876E;m@7D?<=8A6AEBCE?6E>=9B2EJ;@E9::.7m?BEEE:7B?5;E:mEm:E<:4C?53EE:E:AFEEE2DB7;6>5E?9:1>HKA8D8B444/::EEEF77M@1>3AE/03m@.E2EE=?EE=3D?E;7EAD>:AF4;=.=EE3B:7E7=:<7m:;2:2:EJ4E:E1>5:>EAE.M2D9B.C>6?E7@6@3:E46/<><4:EjACEE>?E.EE=@0G8E5EE9C1:?@5EEG@D886>EB;2?:?B>DC?EE/J>?@GE>1:.0=064C;76E8;7E/EE?3m?G8<9mEEEDE.;8EmE2EC6>9EE6EC<269C/EE<6F>:3=@:=BE39ADD@>K16EFEA1E3AD<=3EC>JE?1==E=96873:DE=D==mE6?.B4mEAAmH8CE9 +pOpen_v3 2 a 1006 .............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. HA2DBD==B?10?>AQB?F1;7CE8>5DBI<5<:AIC1997;:B0>A;78R6REBA@6C4>=D?D<=0>J:G=F@A36ACGA3=;C.0F03C?99G;:>A8=H:D/F9\:9@4B9F.@?=?5B.A@EJK?A?0//45H1;9DH8G85ED/D98?7H>E0?F;A:GB26?4/BG0?AA778IA1BJAH8:/EA/89D/?B@<>G??8=C@1@3AA0.7I@F8A7>D?/B26D>>E5:2C:404/AAC6F:;@=B@I8@E3;E2EB.7CG>C?95B4;B;FEB7<<99=B9BBBC2F>H=3G4C3AA:D;CB/;E>@=A>53MA35:459;>>.?B77C9<371C=1A?4>?D<9><9A?8B65=?A=<>1:>A7;D/=83AA<>09G;HCEE5<<>7O0BH0?29:99>J@1>9HB0=6=714D>7@:@=D???60@A=:CD<91A38E235A8?89E./C5@850:B/7H1IA@D..LA=L5NB@;AL4BB;@GAB6GC6F8=C<;E=9@JC=ER1988@???ADBGFC1=AC898?//7.75?<@AL@9>D0DF?@?K@0@>@H51GEK/9:?5@B23A>@7/EG.8FHDA7AC<2CM65>C?>6/12F>GC8=D@KBC0.?@=8zGG3>B01FCC@>939ECD@93@4EI9A6:8<IG@@?I846JGB@/:.3?=>D@;9ED0@8>66:>:=<8DE=6?A:=>E:B>CA?4;77D1F6:>G71DD25?=;ABCB@;1@A2R=A<@E=<7B;?I0FE<@EA>DFC +pOpen_v3 3 c 1401 ......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... E5A2=3;7CBC27==D?030B>C8GB2>5G53<7CC80=8CAF<<=:?OC39107063.<:B1=4@?748I8UCCCD5A4?91?B26>C>0?//06EAA033.6AFE6A2=;527?238D8D.1@5>@<0DA52@285<92>G6CC=72>CA5/2?1@EE9H3>5/C?1203.//5;D1605:9E/H7N285.6MB4B/9:3@27I81>F4./?4D;@;3MC1530.7?5>@Q0H0A2A78?AI@@F3/281O>96?C1H143595B6<5A/4=3>;>1@B3A5AB37918{B3K7M7>C4B/B37C1B=1D5@240C<:2404;DD;0;7>B:4;9>>3B@F6F/:;??2BCM8?2/F24;.D1;86CC07CF@B@=5B4>A;JBD8=>=UJ08D@/7:=A2?B77@:/;33715C5A3A?24>@K614>;?=;A>8B0554?3?B??=319>715HA8/0?559@.=U>>?5<402@B>:CB2;/917E590C8237B>6@8:C5./6B5B842/9E<35.0;I:8A2/0:<=>E1DBCD.D@=U;1I;72DAAU:A=:?76>B0:B2G99:DD@15E26/A7KAD;0?>4@C47AA=EKB3B:G2AG1>9G=4.?@MD=<65F0A;0E510HE72648A.D4J1<886A2?@@@G2;BC1C6312.B@=B:C<9:B:04684??G51GEL//6=<.8D24/@20A9563A6CA82FC4;.7G23MD5H6B1B<>A4I075>F82??63/642I.?2F0F8>G@/5EBD08<>A=9FUD3=A2/AG@CAA:69@GB?<3B4DD?A37=3091C8@@<2>/I7;<09?<@;97BC2B9>?;?F@3?B9EE3@@40@G/08725/HIC2B39092/>2=BC>;29BD12@28>/65;5:>4DC<=1@A3;=0=F>E50CAB6<294B;73.D1E92;?C622DA25@4<13;/@AE/BE;3BB7151U:=@=@D>=74B14;@4F022.KE5>0@62D??FH446A +pOpen_v3 4 c 1745 .................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................c+1Tg............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................a. AA=2?=.2AAHDE;>@@B@96460DYE491@E:>:I93HD>74;598863343?/;0E3:34>3:@C@>FC9KGCEE54N80=1?9AB:>@C@7@/LAB60?674CGH@B444?=FA441B4G8444;?B=D78?7DG409B4:@C@9=83R9:3E2:93H@60>:?3>;3@D9L;1B3C3@?=0A8?A>6GD543:3A724126A<4BB;174?C044>:@5F>B=DBCAC3?9:771:=/EA<33DE;91224311:?G9>4313?;:D26H80O3;7=4573JD<.E7?:;B941:MB6>J?H0.F39>GA74;F03<5F:27/F;2EF4A4E3:73@?EKAA41F=7:4388G.>9A1@36J3G:8<:395BA>030@L/1>@<4@;4311A8BK8G5C>43=E<46.49DF<5;@3>/EC1;;;5>E<74=4FA1/D8>EA3JG88C@3.7<3>>?CDA9;237A=GC@F43<1:4C=DE:=<:B71417:I4=C3D>8B@325@1E809@A6<3<173>E8@@;@3:4@5?0C@4B0@<5=@B37;?CC014<9:1;A7ID>:?487;==9;03H6F{/9=3>1;858<9:D=H41A?/85=/.1;=B@=@2E/0;DJ@30/A.;<6BD/DBJ=<>=G7D24B1=;>D6=H4E8510F@4>449B6?D0@@@5C>77A3>.3;:CC<@=3997E20>7DB268G3@A4C81;0F>/5?3D7C3:51;;JG;219=F;;?A64=4FA75..@H746C;PA:44FI1@4=H917/1C70FAH.>04A?=?E59@C=43DMCH8=9UI>/AASD04AI8O90F6397DG5;A44AD0G=K2<:482@A3;BA@>4G2;EF31FA4T<;98F4F@FEI3;1::D83<@8.;444A?1A5B4I:1?C4?=9GG1D=4@743CD@.@E>HD83:10@A;4._5=1J3DI4/6@4=0AD.:;/?:42381C<>@80C?F@23;43ID35G6@E;5GE6D15@8@IBF/B1C;;=>_C=B3D5/DK@K;0449;7<;{447414A@49@:B@42?3@3L9;3=38:>=1CB@@GD924D143:>A@?G@/=@3EF{J:@3C>5?G5;8;01;40104_IB:C3=91@28>:<=8>::9DG42;?;:H6E73C5;<>=>@>ED=C:@B:<<79F4@1D?2:EBEA71:/C711D?47<45H1J::=AG696@D66?<3@:<>344AAK73EF;6BA@4:9:42G1C>AAAIB=8:D94CB@3C0353;2{F1030=>03A?8DA4?DF>>@B +pOpen_v3 5 t 1807 .......................+1G...............................................................................+2GC...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................-1G.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... ?@<>A@/84@AGCG=?<@@DA>62;/CED47F=D=?;G8BA@;:BD2;@9@B8F==?:@?HF743;69AC@A;B/<{H3F@<6@G@A:0C@:76DJIDC6M5>?=FAE8EB2Q<406@?A>D99>8CF@08C@:ABC;>=1P9:FC3879{A6C@E??3CD9{.2A>E==CC@3>A=1A9@A@6{C6@6>DB81BK66A1EACH{/<{G>E?7:@C?BB;1:90C/>E?>@88@9@?@@FABCC3?==5881>1>1ED=DB><@@@I4:=@?QD5C@D{AB69BF>?ICG7A.4C3CDD=<024?53>8>J=>7CD/@<9E@:E7AHA98D@F@=7DHD;E>8;>C9F20@{E:??<>=@3A>;J@:<=J6EA{:06/D:;HG/{2I9=:429;BJA1>@E@F<@7?9?JB2D?;9;H@5D5H?0DD1E?C<8;:28R9=94J/?9ECAB2L3H@2@8>96CB??C4BEPB??8?;GE7CAC8D>ACEC@8I5.G=G??IB.A:A<C?CDJ8H?:;8C6?>=6CBE9A:K2<76KD1BBEDC:75GLDBBB?4@4<:8D>IFA7?2D9>08>9>>=CCC=96@A;?;EC;GS9=80=BE=CC;@==<8AA2>.=;S3F8BAC>;C>I<75B>G9.9A@9:1>D65DE5??:=6>45>F;K=E?D2CB.:A==D<4=@8D4;FCF/<<=C=3;D4>HGC@>6@;9=6D9<2?I6D{/=4A><49=8@<=B=F?F??29?=@608;:<4B@@6F5>@AGA911A.3<=CB/DAL=A?CR;D5;E17@/;?D5;KJD88E0DB.C<69B:@6F1?@A4CA8<:AA>/P?9:BD>3;>9<2E10><9;GB247H2ACDA8I::H<@5D?C7DG<5I<;QL?4:=G::>==GD506HHL@.DF>F70EC66JBJ2<.FB@5>H>>9J=A.@@E6@=?EJ2AA36BD1F@{2;:<86CBG=CBA>:F.>IKAEF1F8{<><:EDEAGEC9;F5;H74:D06.:74CA>@4A;A7{>3DC>?=:IF1I>4C;3;CHA/@3>OF<>>/8@@8E/J36>5EDF;/7@B>0BD=0:0@>A24?1D6FI6H6L5@;>>?BB=F=7D7BIE=@7F5?18G6A:C1B:3??G>D8?EA=>GEF>D=2>DA/AEGD475@A@>IAE3D@CC;:>{==A1G6.;BIBE?4945=;=3{6A64B.9A?4=@;B=3BBH@=I9=EDB@5B.GF<1DE84F3?@?AK4E0@@@@CJDJF?@5:;AD??K4>O{B=B4:;>@2=9=@<<7@>;<;FG94>=?9:E@?HD/>D=A1B>;=<3HEA@DB>>EBBD3F?/B81>I:C8AF6F2I:>=@F6=6?.E6@@J?A@?G?=6BBG=DD>;4CAAE98A93D?D>:BACD@=6F<@HJ>@<>JBGF=K?GFCA;L=DG=6DA7H8DC;/?@@DJ?B;BCMFD221@E?CC4?0KC::D5DB=>>4EJ7B9ECAHAAE=GH50H?8?7CHBUA0JJF@0GHJHEJL8ACEHDHHA2C9DHG97CBACEE?DA0LA9FI>8@7IF5.>LDEADEGFA{3:5FE{>CHE5CF@AF7DCA5KDBFGDIE:BCH>CD>5H:>H6?F{@?EHK796?;FIGJ><@EEF=BIA?CB=@1GDBI/FCDGFCJFJMDA5DEJIQCJH4G;9F4H8:FC?9OIAAHI{4B/7C:CIHA@?8H=97>?IJCFJE=@A=/EBAJ?AGBD5IIFEFBIGI;?/GC@?IG9J48GHE?EJJ@I@BDC:FC@;ECGME?GGDE>>I7JK{:7/D=HAEF1DFE{8EFBC:?I2I@FFEG>GCCIE9HH890C;GI?AFMAC9GDGJ4@4DGI2ECFEF::?HHG9E??CA.@=;;EHELB>F5F:CJFQGGHA?@F6@?6?>BGFDA80GJE3HFB=DH>HB=H7CE4C>@K@HBIACF?D8A>EB=8JH.=88?3:>A@H?8JIIACAA2BH75DK6A@:DDB>?/TGEH:F@M@CDI>G=@EF7IAGEL;A>IB/CAAAG=6DK87GBFDJ7A]HIC3?E7JJK;CED8JB<@8AG={JG9<3E{7?HQ.7@@D6@2;?5I?GI9I?H=E2=F@B41ED=B5FDB3J7?1HBIL:::M1ADHKDLK8JDBFFF7;H1?4ACB1BK]H:/4LD>H=AD3LD:?DD>3D=AAH07C?CK4B669J7AMFCBJ<6N:AAGHIE>C?DHF0CIEHD58:5HB4G4FDDG@970.5DNOB./JGFH19GF>8JEK>A3HFB?BEAA=GG4EGHIFK=EGJDGA@8BA2E:GFF=;{DICQ?LF31REC>GGE1@7@FE?;CDGKGD=BE1NDGB8B;;9DFG2>GFL>=E5CM{BDH1I@P.:GF:QMGAJDF:;G7?F828G/=9=?IIAE=I@7?JH:NDHE3=@HG9.;EEAHEDB@2:D=5E76M4OG;=E5AGHAGG9L6L4@E>DE.FG@FB;E=FHHBZ2I4CI:5@G;C9F7B<55DE{FKBCFGBDGHF=H>7DIB;AFHGB98ABA>HDIN97C;F?KDEA?G=HF<5EJ8P1A=?CKH04JGGCHG{I@E5FCA>FH1@9<@DGA?Z=IMLIDE=>?F3EA;F:G902?=FACAGG0EBGFGG=CA2JEFJJH?JGGHFEFH>F<6B.HFGEHH6J:J?B@AH:B?=:I=CB@]DGHDIJ?0BBIDJH0CE5HCGH>5EA3DFKF>6CFEG?B9FGA:DGK6I4?9LF;{SABCA@E92FE@OFEAI/EBJE6 +pOpen_v3 7 c 1847 .........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................-1A..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................T................................................................................................................................................................................................................................................................................................... =H=/CGKBD;>KEI{@FCE=KC?GJF4:FFFG7>F>DEA={;DJ>FC8I6FD;/AA=CE@DCGEJFC21BF=IC8>FCL>FA@HF6;G5EG@AG8NGCCEG^2DG3J>=E>1DW7A:PFGFB?G?{G4.C@:?=8JA{F3TKH@0HSIJJFK4BCG{G^<@D@HI6866H>D?IA2D?DEL=7F5DDGIAFI/IF:FI@8A4NH6?LFGBFIHECN:1{C{@AE.E8HCCS7EEB6HF<CF=5R:>G7?=IHFH7/D.DBBL@D{DF5RGKGK;RTFAI3=GFG;8/G@K{FE=D8DFL@CER?IAC{F5FDE8:GGJ2LKKLDA>.GHJJ:GEED::FDFQBIEHGG6@\KAA@F3{CKLFF>{:FN2H=>>>KI@[FCID7KHELD@@JMBGDPLH;EDD<59<@?OBL;CIGN<@GGJK4@M./ID{DGF=CBIFEEFE:bL;:0A=IG@DE`BC9JJD=?@4WFDHE{BEDIE6I/CG:B6IEH=;RDL4A4EG{2FEPF{:>?H{K7D?@DCB>;;IGEGC>I9L;DGELNHGA??F8A?6?ACHDGE92/KJH;CAKD7?J^B<0EDF?FK>EC>{8BT5B@>N>VELJF[>K;CCFH=9JJ.E2?7@39??AJ5<[=>8HKKC=A?DE=6GH55FGHFJ?I>?DH8G@JL{=A?{C/ICCCH=6DO89FCMJV6AEKKB3AK7KRJ:BFE:KD@C5=M>OJ;FIH:9=HGBF9;3GJ>AHM/:G>I7>;>6I@IH:{AD9G1CH{GDMF7HHBJJI8:G1>.BEB0APIM:0FJD5FH=L;DE4G?HAAADECG{AH<{22GHEFEEAB{iI=B?FJY0G{EQE2;=4F?3MKILH@:786FINK9GJL[1?IHDQGG?B3KFHABEAF=IG4J{GIEJC[GGDFBE9DI2L;JKI>FE1JD{C0E;;7FHH3>EIF?;H8IKIJDG0aEJ1;LN>G^NGGGH<>E7CF;27G0>9=>FHCD?EBEI;3:{EEG{HEB4;D=RL@8J75?BQB2AH>O@HI68BFGIB18F>^7GF=HJJCL2N3H{:1BH>B7P;C<66CHJG{CDFIJEKHK=L?9G{A=CG>{B:9EFB>{EGIL1B:;RFGC@GFQFUHEF4N4DIGC>5CHHM@A9GLE;EMH7D4A:ILEQ_5BBD@F8I9KJ=III>1{JGKHFI4M9FPZL4@EC>F69I/NMDAY82DEFIKF5kG{7JB0{I?>NEQG@FSIBJ4.JIGKAP0L73FDA>DCTDE0ME7=KN?{G5H=5H6_9OFHI9.I;J7H:<@DD/FJSIKE:GC9IKKF2:@EEJH9?JCB<.MHHBLCD{NEHKGDALIC<>@M4HFLBHm{;4T@HD:BNBCFVGLL[P2HACLBDL@HJ9I.GJLKG;FJE=M.IK={GBFCF3L{G;5MFD{>5FZ5FBK9HPJ7M?F>GG[DbH=:HIS<;/HBSJKBG>JBE69EA2M@F2G<`@HUGHM2JQETI9FK_E]JJBI@{CC;D9@@>_FF9GM3MG2{KPI.>H4N=@EHEII:HJ?OKB2LW?=<6LIEI4HF;4HHLA864IHTGI{BCB1=8O2B8CA>HI<;IF{3;4MTL2GPLHKE?>@{{5{BHCECEM@BH_I?>G>>?CKIO6BH@8<_4;25?H<{EIH<2.IGO9D?QIBEHM<5/CA_I>KL=DC{HEDH55:G>K:VKEIEQ=@>@B?YD:3J;G0E1<09@@CG5;IO:7G8HDK?EA=>@9IALEK@F@{H/FE1HS>6;DA=M>MGa63DMEg3CH/EIH3@FEBLEEE1KACJ4JGK64{1EQHQDHJ7KMDHUG;=2E@7C>H4II><6NNE3EF9I11F/{@DB0sI/I31F{;SFH?@HK6I97EB7KABGQF5C=59IFJPBCH;G7A:?EJK/EKD/IN2Ij89E5JIAC@.9:R<8?{V=;HDD>F/0EKCF?BFBLGI:DD{FI0PH8GF01:F3E=1>EJGJ@1=7?{FMI>IGSMD>G>IFGC:6KIFDI0>C{AG.IJP;PIHJHH=GGE8@J0G:HANC0LJRKJ{I0JIBJNJLHFLGF_FWJ;OH@LI1H.:KD=6=2HF>KIFGG<;JJAAC?OKL=;JJD3KLE{EHDCPC1EFAIDRV2@FI7DJ3:I;I;GG>>rB6JHC.{J8LEEJGGCFIEJKID>ILJEF_0PC7B_H@2I>WHCDEDKjIHJN81G?7>FN>KCKIIDAJED/IMDO8<53=VC:G;FD.J9A9J;{CBALE0MMHQJH>8GJMKG{J6CTDGGHHW3C4A3JFH?QHGU=R0KGBI:C8E3I7D4BI@DS1FLF4C>IAJM/IGEG8K:J;3JMMC:3EFGU/>LHWCFO@:DHJ3GG@{.DBIOEE?CK2@KEDHJFb>2FHI\{GF5O9E{Na3@GQ>F68ETHB@I82DFFPJE5MjFJG@ILGA/F4FP{FAE1H83KIB/?L<>@Y4NM{CNI{<4KBID:BKCBEJAF{MK4HAFHBJ{?EI8E.IGaN_;/_{J?K.MJ9LFAIDD2IGK;4HCEN>5HG5FCa6MJJ9I@F>RCKGJN@;CHI<80J=J{CHBMF8\@MHHDE7IEJ/HG.G{c{E3/7GB^IHD{?qEC89D?2H>{.2{kJD9IH3{D2{LEN?O4J>?EI^/{M:FJ?JIC2GLB=<6HIDD4H>;4GBEB66:J{EIKJDEA1<9I2?8AB>NL=AMM5M@GDD/FCF@D{T{?>/N?>CPFG_6AFA8=h3:15>G=GDEF=4.EI^:F@GGDM{K<50BAJD>IG=AF{HDEd45;X?F;J[C_Es>A?AB>GG93J;/U0D1;/9C>Ei5=JH:6;F;K8SDI@EA>=?;E.BIEF@FBGF/OD1DG>7;DA=_?JHG73EDGF3BE/F{J3@EGDGIM_0MBE{3MH/Z2;S{COGE4{J>=6MJC2K[7O1=G=?2N/MAFC0HF/D30EL=MHH=B{IM97DC7GAAI.VC6F>6<{DLKBEP;H9B;?FYI0{_E/IN2{q7;F4FLBC@.9:J<8@IF<;{{GAD/0RLCZ@DDCFIJ8EEHF{0ME8D{22;E1I01>IL\NA0>8A{EO{@LIXJG>H>GD{D:6KLIBL0/=DJCF.MI{;/\MG\{G;WIC8>G0D;J?WE0KMMJ{IG0GLCGHXHHHIIA_HPH;EE?HF0{.:NA<3=2GD=EGJJI<;KHD@D>IJD?;HkH4HaIGJLB8EC0JM2HH;H7F1DCKEDF8L:?DG{@I{E8f2.=E_B1GFADBGI1@KF6IE0>MG1<4HID{{IN2{HHPD4.E3F;=EJ?KEL{HEBFGG/LII_9<1GCX^MC@FI:/HHDI{@E/FF{?52=KB:{KGODEDEH/fCJU@ +pOpen_v3 10 c 1810 ............-1A........................................................................................................................................................................................................................G..........................................................................................................................................................................G...........................................................................................................................G...............................................G...................+4AGTG......................................................................................................G.........G...........................................................................................................................-1A..................*...................................................T...........................................................................G............................................................................................................................................................................................................................................................................................................+1A..................................................+1A............................................................................................................................................-1A..................................................G.............G.........................................................................................................................G...........................................................................................................................................................G... CJA9A2h4CD20EH=8F=8IC7I27RH36BM14=KBFq>DR1==J5<@CGB:71{{D@JHJ=HH2G>;G4<1H=D<9{2H{8<<3IFDF>.M@0CGEJ6?9FMB89F:IBEID0R49G{BJBKD3J8DII3CCF>P1=:I=GB?D3;FI>KJF5C28GLG?K:1H/C_E6DA/=F>9J.::A=C;@2;?@EKJ4L5C9.;E>B16H/6>4/B;114./>1GB{29JH{dD=@JFH4@>:L9NOH=@GLF:<0LEF3ALEEHiIJHEE7I?<<.9C?.JI/D.FJHEGB2@?4DN.:M8BI/HCD3I{R;7IDO34BA58>G6IF4A/D@I>K6FHFJ=9DH{=/5E@7LIH@1?G1{?O8D.78EEFM?HNB26B=HJI>E:D{7FI:97>:MDJB04I?1<>3L.FG02MFJJ0L16:G>THCD;?AI27D:F1=C:FEF5LH3JE1DGDHEN/J2FGI2QI8PI:?K2PKD>6FJDCJ:74N7DD35?9FGD2H/<>025E27:D?4J=8DH2CE:B6FB:GC3{32.G7z0.?>7G7:KC68I6@1KCI.1K4215DCI3E:;K1087>1:6?FLVH/H@B1A1RLGCJ55L4I2aD@J;81C7/B;F2KG>=6ZDE3FJ8Q1@C<@;I/G1E@94IH597;?AAAE6=C>B;E?GGLK=CI9H5BGSA.E>AEDJCE9{H7H4{=4FFCF6DILGFG02<;85@I0.E7I]E/?{K0;8{F3LH?OEAL@GQG>FO61C;K>ACWG;G=F9n8F?1?2GLDD>_>/?JDC86K;E4FH:<1H>6KR>:?R6>B;KPJBE0G:S2L7.9=<@:1.G1A1ICGLC95QHvGTNH>C7:>{FA.L4@6G3DA8AJB1COG.M1PC@73{GAEG29;EI6>KDII?5C8{CG22?KF?6:3H9D3@B9HH0GBL8FFAI2p.KAD +pOpen_v3 11 a 1761 ....................................................................................................................................................................................................................................................................................C.........................................................................................................................................................................................................................................................................................................................................................................................................................................................G........................................................C.....C.....................................*......................................................................-1G..........................................................................................................................................................................................................................................................................................................................................................................................................-5GTCAG.........................................................................................................C...................................C.........................................G..................................................................................................................................................................................................................................................................................*.................. BM?8@JGJ:II1F=:I1;.E=F88MM8;=1FA@G>H3CCDG6?9EF;79GM4?:H?D17GL?V:DF4B27GKJ=G90KAPF7D?.F=C<4C98@AH^4W:A::G;A03=?5=2.B5.13<4F@HEJHKHF7?FAD4:E36@H;;H1=01;4C1QGH<4EA352JHAE.C>?IFF9;.K?MEIG>E63@7CEK2HG:=9?E{G6HHH?K>2A?4Cy.:E6CGHCD1LHF<4MFN14@=79E5CI4@B?I?D5JP@J<75E{>.?:6GGF=;G2>C;p;CFCBNFHH/F=vJB8.D4LE64s4GH.@.4CC1.EMKHLK7N8=G5J=M7B7CLGI;E2I@0:>{FG8C:HN6IP972DIAB2>@F76I7C.8A9GBC/5ED2DCDLCO4IK1DEC>EI8KI5>?JmF=4AGDCH.42@DG?C399GJB2J.;>0/3B379=9;I>:L5<5FEGCDsr?A>;5?L=1G8J/C4BB:@47:DH7>1/7?N201BB61;B05ES4E5?@>6FG@;F:EGFEOI8.63{BM=D@/:>F1CH<4A/CRG<@=0==D9FC1J0Md4F/.@<7GI9L>D68HF5>1{EF:31JK8O15CH39D>:;3:;J1@AG;E?AFE?=E/LB>675DHAM4=L6CHGM0/A9A{38:FEJG6F:6GJ?992;{PCE?IGB<2C97I704<56//ED?AG>0H3118>CF1E;:G036>1:71R>IKH@?6@>gIF?D43{2E1P@@DB7.@B3E32ME?:KAGFF4QAA9@4@F/E?79G7A..G;?vWJ>0{I537:>A2?@M6=F7<:DAHCGI2CCB/0E@H{041K00E/0?5AGP>D=07FD{A?6LE6H0V<4CK=C4EEHGBBF7CC>@IJ4M7LKFEE91I6;;72@J/1I6LIG/?Hq96PH0LF?JC@E;FHH=>;FJB/4B5A3/7M9=3?/@3TF@=5PH=:CGEGC773N5I@JM;>H5BA9J<8G31:I40C9I=?DGF;H;C9N8L<0?.IGDB=Q<=TEB73?;{2EL202I;5GE>8B;?GH>C/I9E37?FJJE2FE301{=E31>CFA7=CKEK3B;DE.6C=A9KIAD569C/;D?1GD27JA>I@{2@9<>/@0.=F;J49:;@6;F<4/D/A0HAGA>84PEHO{FI<:B/74=G;I@0DGK;FAH2KA/LES0LC.:L{3@B:77M6J:EB?69>5?;68MCIONGB1HJ0BKI1G6H17LA49L>46HJIBB/6F19H?2B8>{5IG@C@5BIH135LAE{??M>7={614CCIE95{KE=JL3T;{J92H=?G1<3DMB7@=G.FF1UF4D=IEI5L5IKGL@;B2GAAF>GF2CBCG6H9OH<69DECK<2F.ACGC9F4HKG0sAN=22I7AG{6{8IDE?FBF?z>DG2:FI>{:DK6B27IOF>3h<3{BHF;CD0L=C=0>;2I5<2.D513/;;GAFKMMKKKF6>KAv4:D46?E;;M2=01<3C3IIH<42B==E95{DJGK:B2E?C@32{H@I.4B?A{??F?2FJ9;u=::?DBJ@;I3?G;H:AKJBIFJL7SQH75{4JL/?>E5B8.4=7EHK;GI:2I<{@C.4ED4.HG{JIO19N8=MHN=L7D;CHKF;EPnG8A:JI8GJ<7/>2B7899=5;FVDK6:.6F{FCDLH@A><7G{<1I8G3F4;EA:D46:<{8@1.7@N1231EC61>B16KK4J4??>>JKA>L;FQLCJ{;.63FBH@AA.9>E0FJ<6BCJK=A1/SG8{E5D3J19C@::8=7<{1A@vCJE?=F3IB?565A>GF{9=G6DG{I6A9BJ88:FG{D6G:5KQ@89?8MGCE?FKE<2E?6I808;1680/GC>AF>0H42F2;=>G1E<:J136@1:60p?JLK@>A@>lYH=D63J1C1IAAO=8.@8A2C33HD{9IAJ/{O=FGA7@6B{.10HA78E?A/2H<@{FG>1ID053;:>A2@@q6=D78:FCH;CFL2:{9L;EB74I7{2FK{4ZJ;PI2=136QGLC8B/93H50?71J?>DJIDAG9DTH>=;GJB04B5A3/8{9B8?0@<>5?BCKB4/HF68074>IJGD.KGB.GHD9HV3?ME.AJE.HJLB>H==GDA81>;M2GU103{;/FC>@7B;?GH=B/J;K/7FE{JG2HJ508J=A11>DNA.6>C{m{3C;BH16B>@;C??J@G.@<<>/@0.=H8F5::;=5;FC;F/93=L=JC1D{R9H@G/H?4NBI2{?6;I{32=?:77N6I:CD.;78>4?;59{BFL5L{C1GM0AR{II4J?6JCHDK>47IB7SCB/5D2:FA2?773=@5AH47CC?6B3@ICAJ<@G?6={613?HGB85{IC>JG2I;FG91E>>H1=5DD?6B=H.H{1JF2E=ECJ5M3GFFL>;D2{A?K?{O2KADP6B9GC=59CCCP<2C@DwG9F;JLJ0H@{=12E5ANJ7F8FBG>DBG@K>DC3;EM>F:EG7B27FHG>3N<2XAI{ACC/G7<1.C513.0;:{AMGHGI_IE7>{AD4;F56@G;;H1=0?=2C3{JJ=42@:=C9/HCJJO:D2D>BE42F{@E/2CBDJC=N>1GH9;I3.{7F={9MHTJF?=6A?G{Ex=M=>TFJ=G@3A?4GL2:C8CGHGD1GRG?4{HG26A;88F7AF3A4DBEA?5G{@{=;5DJ;6@76{CF=;G3@{;M:CKGB{EDK5{8.9=5C/G.N9ED:2XJFK9A:K{:DT<8.D<0PHI09JIHFED69H>BF@A2>@G76I6B7@;HDF/4GD/3KABAFK4H/G2JDJ?@4L8FN2=@LEJ<19>{EEK.3A2EBLB{3:9CCA2K.@>2B899<=5;GDBI6;.6F{JFD{G?G>;@{N=1M8{6B:;C46:;I8L1.7?K0220HF61=A16FE3D4@A>5SK@=F/>>C:{R/O<0EJ5{41B@7IK:F?P328FI6B1J<{FEBEE5D9DA<7{>>@1.JI8HD5C1J09E>:88;:=H1A@3WAJ{?KC{8>F7EHGF7B8CF78:DDJB6G95HG@89>06FDBE?y{B=1FC6J:17;660/HC>A{>0J46E2?=?J1C=:K136@2:30H=GJHB>0CA?qJF=@83{1B2IABH;8/?7?1F43GFJ7M?E/FG=xHB7?5BR50GB88D>B/2H<@{DF?4NN/51;:?A2??{6=F75:EDFJHH3>?AC/0EA{G0;1G82H24C5BI{>8E@?6DH{A@4{H9E9V>=DN:I7PIEF?=K7E@=AKH4I.0qKEG{BDC6<;72DW4/9G6HoB3>KJ185GJ7JE?\E@G8BGJ?=;C{C14B4A03/9\9A8=0@NHHC.INB.IHC9EI3>GC>F@JAEE==K5@GM=H:C?{8F<0?.DJH@>G=7@;?H{=D/{;E7HGGFv2FF6/8J>?11>GH@5?D{pS2@:Al.:6B=@>E@>0@1.=G7O5.;:;;4;E<@59DC0H@EB<92HG{{FLH?C;D/:3=Y@Kq1EIG9Q?C/Q@3I=E2M<0;{{32:?:77{6K:CB;7;=4>:59{CHD5L{C1G{03DKIGK46K@6{BJAH>47IC5ECD/5E272=E4>4D37I0IGJA39;MILFE1JD>=GBGG4E.=248CC6?4<@5?F/<;HE9D{3A:G46{D:3E:{4I3B7J@.7EC@5A3?DK@Y=>;D;;75BK{767.A02:1AFBH8A6@D<{/H@E/ +pOpen_v3 14 c 1647 .....................................................................G.......................................................................................................................................................................................G.......................................................................G......T.................................................................G....A......................................+1G........G...........................................T........................................................................................................................................................................................................-1A..............................+1G...............G..................................................................................A....................................................................................................G...........................................................-1A.................................................................................G.....G.................................................................................................A..................................................................................................................G............................G...........................................................G.................................................................................................................A.............................+1A..G....................*.................A.........................................G.............................................. :87D9=?FE/?=<@5.EE..:;?.NDD<0{;7E4/;G>D7/G>@1MGK0L5I53<24;D80FC.EB0F05=B9@D>BFA@FA>QCC259>9;28CDL?7E?6H@;51D5C:1D2C.2=;=3@6.11D./DMB==EKB?8=.;0AC8:B=K.@/>D/<;=8DE;@?=?G=@DA?CA4>FI>9;2H?EB=6/C>7;8AEF?.:633L>AC=2:75@B9SE.668I4CD?LMK.?OJ/2A33.76E:=0626.5=N>=E=71GL:<4@4C=@>>4:0;=4@=BJC3LGCI1F6JD2G.G.E.6;3CLB1?.J425421AK8B;G720;N0?G71N9B=HFE96K9CB:CLCA1=>;I::45FVDE8GFD@H@B2FE36GD8;6B26EA@8AA@;3O5A0=;9EAH8L8?=.=O?033@:JC/13.53:>B@??<.092F2>;4<6280>=E0.746D@D{DA8687F80AH4D6:><6;A;:D8>E77DAB31?<.37.6C@/<;64?=7<>H=73G8:/276?82><=G23:09?:921:=<1?19RB5F3>:4A;6J?=NCL8651L/?>986E;3F=F89D8:;G11A4H.97CB;F2=34.8I>E9>LD3{C.57AA/1;6J5?80/BD?B{OA:6FC>9/G76E32488>G56D6C>F/GJ@N?>5?4?A636/C>@8C:75;H379DPH.H/?CC>/EK@?9AHA;7?19//5/K=7=2A3;F=A@5B4EG9BH7?53.>:MCJ3<8G.E?BA/1A5D314BD@933<6L>BA0=O5=1L6=9K8K1?PAC=F>?;?30B8A4@>03E.7D97F?69HG6?>IDH=:I>4?7CC3E;C2?=.5<2.6@>521AI>B/EC44766>I8@E6=F7C@;>G=>@:ADLP1MCB6G5J9:F=/7C<6{7HF0CD1D8A.?=D9@F01/D;/D??8@C7@=??6D.IDE=3=KEDC/5.:0<24<;E44DF8H358J.;>1A9<<2?D6/23115=@/AB01E5G9A/59=H?:F088P38@970FFBF<4DJ9C?:D9M86H7=0;ABI812;>E=@B2:CB35C25E7:B04D8:F/117J.FGKB76BE5=8E?G;@EB122CH:22AF6=D16;>.3AA:8M0yE:D?8/=@:DCJ5@@<@?.@EC;28?9DF99E/0=6>H=B2 +pOpen_v3 15 a 1634 ...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................G.................................................................................................................................................................................................................................................................*....................................................................................G................................................................................................................................................................................................................................................................................................................................................................................................................................C.................................................................................................................C............................................ :76E:<>FD0><3;@4EJ174@.OED:0F66A3/7<13>F<@7.D=?1JFG0F6F52;13:F60FA7D?7D.64H@4@F<>.EBDE:>::AM;:=@FB@H/?9IBD0048>9988.?DK?9E;G?A5:={<5Q7?66F1;05BA7.9?B/>/FL8>?=5HD;41B3@91D2H.2D:=38;.3?1.@JA;=DN@:<;.:FA7:BE=@B@@@A48;HN@T@A6;FBKADJGF@I4B83:B8J5?=;0F@BA=8@=758?AG=;94;2{=?B>409;5<4D:>==36:<4@?@G4B3MG4F0{55G@5C4FD5:3DG@9>G616310@I1=9G320:K.=9BC{9@7@G?:5{195/=L71H9A=5DBH15E7@D:I:8GBE86@7C>=F?23?9IBA.2.41@=AA=?<.06.E1=:4=527/={4B4=:;59?;3D/=C:7>A?6/>8156B?/;543@<3:>N;62H84165=7=6;F3:59>7<@/7@1;DD7=A5BFI90H19:F4E509L?=N6828=<@09ED5D/;/@3A>7J>=GFN8954{/?=84.G;;N?D/Q;78E19=2E??62?BAD/C11<0O6A9.AB>DBE@95JC@J46H6A>B7JGBE==6>6??:25G;A;FD2.C>E87?CA./0=CB;5=9BA5BC?./:GE?=8EC?@5=/9.?J6781A3;C=@?2B.4AC9AE7?22/?5L>F3;8D.C8@A1A6B613@B@832;>T>A@/=D4<1E1B7HF.?G@C=7?42;6E1?1>4>30.@7@:@<14H.5E958>;82DE8?=IFF4=9G>4D5B@0C9E2=2A.2<1.5AC;1/=K=B9AB759:?F>:E9E:2@;57M243=4@4;C.E11?9@BCD1>/D9/G?727=A>@8C;5A.QD=;3:B24BE8H53D.;=B8<;27D5.140/4/=?.@C0E.4C8A.58BEG7F188E3.08A97:B9I44M7=08A1:@B35D29F67?03C77E/006G.EHJFA5CE4=8E?D:?B@0.2/BG;2EJ6>9?BO4@@<=?AEC:2<8A;A8<<.A=96M174@4?FJ87@0AAEH4H85C733/;9DG@>55:5@F.764E84C;>@L19<>@7==CENC18?G?/{CFD=><;A{;:=ANB@E0B8LFE//48>99:8AI{>9E=?>;M=F2;H95DC2:;.@8FJ1F72E4F@4>CB3.G2=@A5:CG<;M8?>6P1:25BD709@E1?/FF8=@=50HA;41B2@91G2I.8B:>66<.6B6.AK@:=FK@9=<.:H@8:BI>AD@@CB4=JGB8:KE55=F4?=>MIG.?GM1?16/65F==261559G==D980J\9@4>6L:>=>26:=4@C@{5D3G{4G0M65J@7G4GG5:3K{@;?F616410@J1=8E320;{=8CDF9B8CL@J5K1:;/>{;1P9@>>GDG15F7@E;KB>A8JFA0I9@.2D=A<=8?34{NCG>DDA?GCACD25EB9:5A0EBFB4AG?:050F5B>:8BGG8:@7B>0=J?23@9HEF2.411/A=CD8258B>/;547@<3>?M<62H83064=8=68DA/7A1M6828==.?08{G52F/;1@3A>7J@=IOF895;G/?>73.D?;EBH0L<79I=9@2H?O46G6@?F;_JEG>>6A;?A;24G=AE2.C>I88@DC./0CDD;5=9.DC9DBE//:HF?>8DH@@5=:CS6781A3=D=A@2B4DG9AI80?32/?1H?H3;7ED8@A1B6C?13AB@932;?I>AA/=I4<1E/E6KG?GBB?6@42<6M1@9<9?30.@7F;A=14G.4G:58><82EE;?BNDF@=9L>4D4E@0E9E0=1E1<1.5AJ>1/=FD<3=00/.E03=8ABIK.{.E@3I4N9:J<2@<6G5JF.=E9537:>FA;DHE:3@<57F243>4@4=D.G51?9MAB=DC0D701I9D8>E1@/H:0I?727>AFD8E;5A.JG=<4=IDAB//5;1;23>9C13CH8G75F.<=E8<;26C5.140/40>;A/AD0D.4C8B.69DNF6{228G3618E:<8/H1F@D<2C{BB?:E9F44L8=9E9AC@02.DH92CK169?CJ3A@<>A@JD:2==H;B7<<.B=9>6H>75A4@IE87@1ABIG9G95E@33/;9IGA@55:5AM764E65D:?AJ09C>@7=>C=@3 +pOpen_v3 17 t 1662 ..........................................................................................................................................................................................-1A..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+2TG...............................................................................................................................................................................................................+1A................................................................................................................................................+2TG....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... :86G:<>{FG.38?J?/HBDF>><;AJ;:=@IA@F0D8FHN1048?99;8@IJ>9F=?><{AB6:EG<C>53GC;53B2?91E2I.7@:?56=1.7@6/A{B;=JJA:=;.:KB8;C=D.B0=>LH8H/6F7:;:8EM?@=7>H=CFAABB4>M{G8@B?51:;5<<0CDF2<0GN4E9;8DI5;KO;D58>>:JD66=H4@=?IEF.?H{3A27/.66G>=262659G=>D981IM8A4?6L:=>>36:=4@D?H6D3GI5H/G65{@8E4HE.6;4HJB=?F616421@{0>9@320FAW16D7AB.=CGB@@?;{E?B8IFA1N9>/2K>B<>9?34KMDJ?BDAA{DDBE26ED:96@1FBGA4.BO?;050G5A>:8DIG9:D7C@1=H?23A:GFJ3.5A23A?AE<@=.0737/==E07=843F@FIFB9355{6?K4{4=:;6:@@3H.=D87?AAB?8268B?/;667A;3@?J<62J93067?8=78DC08@1H6828==?09ME53{0;1C3A@7P@=IJ{8;5/GG.57=0A01G46G3B@G<{LEH??6FE2.A?H:8@EE.00EEE<5=96DE9=D43;CGF/{.@GCF/0;DF@>9CF@D5=:C{6891@3>F=B?2B4CH:AG72>320?1G?I3;8E.{8AA1C7A>23>B?:33;>K>CB0=I5=1H/I6HF.?E@B@6A42<6F1@9@>@40.@7{Q<3=12/.F13>8BCGH/F.GB2L4G9:K<3A=6E6IH/=G=537;@IAGF2F70.1F:C8?H1A0D91E@747>AGC8G<6A.JE><5=GICC./5;1;24?:D12.BG8E77J.=>.?8<;26F6.140/30?:A/BD0I4B8B.6:DI.L7P228J3728{:=FB5?98C1;@L35G2@M66A0/3D87E/026F/{EEFC5DG14<8G>I:@E?02/EF92EL@7=C17A?.B>97J6{A.:B;8/B?:?CJ4AA=?ABDC:3<=F9<{99G01;G:?>7{=75@5?{G88?1DAEF:F95H?33/<9GJAA56:6AE.774F65B<@A{09C<@8=?E{IF@UF;GI3BK;4IK:E:3D4FF:G;<{04/CJEG69CFHFH79@CIBB206:I<;>{HH=HS6C55GBGHD85CC519D:DLE;KGB5?EADJEM77GGJFCEE6=5E{C@DF:FALJ7=J9I{F40E9DGE;=I.FGcAJH>A@F1Q;C0ME6J;DK1D.E:A9=LJA@E=?ICFGHHHDI0G:@EI8;JQ4EH039?A8J/:0BGA?45LABDHJ7:C2@AEG7B/4?CE:.@::?EC1;EJK5@?JFGC>9B9.FA??@EFB?H8CH2D=3E9;V3CC/A8;FDA;H6I:9IDCG780FL8/F@J9II{DF=0{.5G56=C82/C1GFE@=;?HNC?5I7?6O{70KL??JF@4H3DCC{8HBM52DEGH@PNBFG@GA4GKB:0N:>/.B.B8FCJGM8<44=?GG9<6BFAL<0DE>G>5FE2D=@>@>?HABD4;?IK/A5@=97JC1?H1MBB=ED20F=EA0A72=8L=AG:5F4C@B@2=F:BGO59DI7HG3F=;I2IFI4@/I9C=FF?I1A206?6@./E7A9GF.8L3:KBA2@EG4CH0BA:.1?I;:GED:9GD:>AC@AA5@IFEA;@:F>E0:CKO2?HFBE71==:30EHF{GIK537>BGCHJ>J?JDA2@5;D29B0FC?E7.DAB1GMAETKJI>FA7FBDM03G2>GEM2G/<{.F=JGDI4FFD8HE8/E.H589:A7DFHGFG=4H3@GFF@J3;>5A:A1{EG2:B?=AF8FF:=2D>E:9>:BFG<8?6<=VKKHDGF2@8=@:GF6JEDJB:/3/{43?GF:;CFEHF>I=HAJ@G@HD>0?G=79GD@;A<@::FFAD@DHKDCH3@LIDD2HC?33C7=F0F=H121G1585E>5G:8E?FFF{DB@FCD{DGc5;CF=?BEHG7ED=5GEB@2I4J?LODEO:>G?1;:AMGF=F/GD>@E@B4C<2@?6FDHF9CEF7G@E212F=B@GI4B6D9E=76DFB4CEC@JBKD7H{B7@;DFHDB0:18B21IJE5/0A@D4818EHDF:<:J6DA1=9053@:?9GL=3A2J?FHF?JK.>=LIB;N551JB@ADEBI4:495@4EA?0;.I:D=0=183FHG;>I=>@?D;A=HG9H/{/054A{:/4=>95L=?5EICIHB832B@BP;CECAD=:DEGD?23 +pOpen_v3 19 a 2011 ..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................G............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ DL8?NGG?HL;GN3GI.=;D{AL:3C9KG.:{=B{251HICE9:EMIFD8.:CQPDH269?T::@EF2EBI{>C55FDCGC:6FN82;G:{/GF;{FB>@ECKMHW87HSH{J3CE6=DEKECKG<.GAHD:>F4K{F91G:IHH{AB55KB@DuM8:B{K{>B:C80D@AA>FCL4D<6D1K>JGL@;D?D92PAAF?C.B{A4FG{uJ?0{{DIGJ>P0IJ{KJNEEKG?MA?.EBAJ{>BF;G>;EC?F;F4{GFED@7DB6B:?H;B{BDI;ID6;{EFE6B;BE>1AAC5=I2A{{:F>F55L{1<6F2??E5IG6JAGD{CDDEH>BM@2EF{EJ?CKHJE4HGM/3JD=097@AEHC:F8I.B8LFBK581OK844{ANJ@H@99YID{KAE/:4GH{IDH0HCBEFF@0D7/0{4J{DBB>CIJF@8I9?2FEIHCIHD{I@H@39KLA;2N=@41=T./DG{N>@@CAIGGEBHMCF{{1L8H4G{G>8E{/DFC:CD05KA:N{LF2M/W>D0D9@I@{8>EJFG1;GIJ;FJ{DPJH9<54DCFO7<6AI0AF<629Ek;C=6GD5H>B?>GG/ESC5CBB6?E:DEETEDBC5360B4JGF?JCG96>=19HEDH4F{5?EFAM@4AE.3@?CCJ9C=A>>7LE2>K2EBFGEO3;FAHD1E83?8H@?G:@F8H?DF8G8IJ/39FJ7IQ4{=;S5MIM6@/I{{AY1B1@9@;A5/20E:C:EF27J69HAC5AI@H9AC5WLMIK2?H8BM1BC;0@/E=:1ECD?=0MI:@BFABE6@H?K90//IDCJBD<>FC5A{YA;@FK?{2:CLCF=4D/CD0{>1A@ED{16=SKD{KBHHGHAHG@G1E{HGC<6>F:40OOGHH3H.L63:>B{CJIAFCGGA2@6:E4T8993@:I{8;DHG?@WFI6/@NS5OF=GK/EG=E{=9KCFJ4/K8AF{{>G2=G5IAINEI6JJF8HG8CC/K589;D/8HF{HCB88{6CEF{AI3BC5DMG3{GI;:A<>;F:EE<<1I@G89E>CKHB9D7<>OGH{GF{3D;AE=J6FAKEDEC;443G24FFJ:;ELF{G?I=F@FDI@{EC0@J@H:MEBE=>@;BELE1IBCEGFIG5:F>8I@GELHH/CDHEB4{DIK>PD0<<@E{N>T6GDBAKB:?EG615;B7A25:[<@GJQ>.9B6F@I{BIE.K{2HMKJ>G{25@@4B3{?{IHV{I/=>HQHAGC6FB?4AM>:2K6AI{B;2FF/:1GE64G=@44FGCHD@7GLEFMN=2G1HEEA=4KDA0>.H;.G<7=083J0HK:?1>H;2HELKCE2MGF<.GJH85DFBG.CDHC?G@H<@BIG>CBJM;{.F4153GF;;4:>96HME7GE>33ICAGCM;J094D{{BAF4I>JICJ5{GSB{AC?6{EGIG{:{BAG@H0XJAALC{{FHFLFG=G4FK{JE?0{JG3{JG?J0IGK7K{{FH{J@=KB@0LBFK{GEJ>{CEJRAJ9BA{{F1?{;L1O@OHF{5@1PG965KFGDF@KE{C<=IWINJDI0D6G{S{EK2IGBHGFCE03{LF?HEHJJB0MA8J4>B;F6/5J7LJTBB>GH{{C;{?DABG{FMI>{;TMM=L2@AR1N{D{{FK7M6F{D{1@JHK.A4HHG{B{{B{HCHH6@{KBE4VBA54@{?0{H{PFEDJE{FGKCGJH{IM7H9.I5E{5O8=:FI2IG/L;CG04:MB:JK{G5H/{CG3F5=NQD{8?0G{.JF4AE{Q=L9{LOJ4Jx2>>55G{{J7C;E{1BGAB4:Gk@EA:{Q7{EM{/MJK0I{M@CHH9BIBDIPJKCJK9D60B6;{EMB{FF9@B>2?.GLD{7IG8AIPGJA7K[004G.CNL{=J>FEA8OF3?{2NQKKHK5.>GDEC2EA5C9KB3AG?[H:JJDEA?IBH@{{13J7EHO2DF<11D0{=;3IIE@?3{G:GG{EEG8B{FG::1/3{HC{A{G;FF2PH{{DL6:O7{@4{FDFG@5D0RI0OG:I@I1FM;17@{{FKHLLJF7{.FGJCK1DJ{NI?8A{;41HJEKD5L{<6??DEOrLA{EJ{.I?Q9CM@?F5I{HJ;/{X{/4=IDKW{{ILMKH=HI{<{1>CH:{=DB8A>{{>>GGFCFI{K69E{a8{H?LE/FF?KO=>HB{{59T;.HKMF@J5@{6GC{HPJC{HL4MJG9EC1{5I9?E0<.HGG{EB@9K7CGL{2.G{4DC5RIN3TH{B:D=B2H/I;GM?=5HG{;DC0@CGKC=F;CCPHIFF1QI@{>DHE{:{D{GO{FB<6;{36SFHFHE{FL{@{>PHGG{A^PR1A{FI=KLFLB@B@GIO{2QGDH{DFM5?C{{SL5MKH75FDB/L6EwH56AED/7L75F@=KG>8GBHO{FL0FLRFC7MEMK>JLI>JEFGK61{{B9{G/7CI?M:EEAI;?<5:F2J3HFB{.{{G{5P?B{KHDL3ID7IFG{IRM3HBCKF3?GAK{{@I7OFGDK2I?@HF7P;CB={FK85.BEBJ9?1G74.4G{GECF1P4M8=3N;B@BH/{6EHC4B{D;3K8EO{M<3HG2A4{GF4MDG55I{H{{/B9JLSEN{?4{21{K{EB4{EC/{72K?/J@8H1=4M0FH:?6C{D2KE>49K?@@{B{9F.>JC:>L0KJIBIF{D7{FO95H.FHP4EF{16{283IEH{>IGFM{F@=3 diff --git a/io/pileup/data/test_not_enough_fields.pileup b/io/pileup/data/test_not_enough_fields.pileup new file mode 100644 index 00000000..47e9cc7a --- /dev/null +++ b/io/pileup/data/test_not_enough_fields.pileup @@ -0,0 +1,3 @@ +pOpen_v3 1 c 991 ^].^].^,.^].^].^E.^].^].^%.^].^].^6.^].^].^].^].^].^[.^].^].^].^].^].^].^].^].^].^].^].^].^G.^].^,.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^E.^].^].^].^].^].^].^].^/.^E.^O.^\.^].^E.^].^E.^].^".^].^].^].^].^].^].^].^G.^[.^].^].^A.^].^].^'.^].^].^].^].^].^].^].^].^].^].^].^-.^].^].^&.^].^].^Y.^..^].^].^].^].^].^].^].^].^].^].^].^".^].^E.^].^].^].^].^].^].^].^].^].^W.^].^].^].^].^].^].^].^].^).^E.^].^].^].^].^G.^E.^].^E.^].^].^].^].^].^[.^].^].^].^].^].^].^-.^].^].^].^].^].^].^].^*.^].^].^].^].^].^].^].^].^].^].^9.^G.^>.^].^].^].^].^].^].^].^].^].^].^].^].^].^,.^].^].^].^].^].^].^*.^E.^].^E.^].^].^].^].^].^].^].^].^].^(.^].^].^].^].^].^E.^;.^].^].^].^].^].^].^].^%.^].^".^].^].^].^].^].^].^].^].^].^8.^].^].^E.^].^].^].^].^].^6.^].^?.^].^].^].^].^].^].^(.^].^).^].^].^].^].^].^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^*.^].^].^].^].^].^E.^].^].^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^+.^].^].^].^D.^G.^].^].^X.^].^].^].^:.^].^].^].^].^].^/.^].^].^K.^E.^+.^].^].^].^].^>.^].^].^].^].^].^].^].^].^].^*.^].^:.^].^].^>.^].^].^].^6.^].^].^].^].^].^].^].^E.^R.^].^].^].^].^].^].^].^].^].^].^N.^].^].^].^].^6.^].^6.^X.^].^].^].^].^].^].^].^].^].^#.^].^].^].^].^].^].^].^].^#.^[.^].^].^].^].^].^].^].^G.^J.^].^].^].^].^>.^].^].^+.^].^].^].^].^].^].^].^].^].^=.^3.^].^].^].^].^].^].^].^P.^#.^].^].^].^'.^].^].^].^].^].^].^(.^].^].^G.^3.^].^].^].^].^].^].^].^].^".^%.^].^].^E.^].^].^].^].^].^].^].^\.^].^].^E.^].^].^*.^>.^+.^].^].^].^].^].^].^E.^].^G.^].^].^].^].^].^?.^?.^E.^].^].^].^].^].^].^,.^].^].^].^].^].^].^].^].^].^#.^].^V.^].^].^E.^#.^].^].^].^].^].^].^#.^].^].^".^].^].^].^].^].^E.^].^].^].^#.^].^].^].^].^].^>.^].^].^].^].^].^].^].^].^].^#.^].^].^%.^?.^*.^].^].^].^].^].^%.^].^].^].^].^].^W.^].^].^].^].^].^].^].^E.^].^].^].^].^6.^].^W.^+.^V.^].^].^].^].^].^].^].^].^].^].^].^5.^].^].^].^].^].^?.^].^].^0.^].^].^].^>.^].^".^].^].^].^].^].^].^?.^].^].^$.^].^].^].^].^].^].^].^].^].^].^].^].^7.^].^3.^].^G.^].^].^].^E.^].^].^].^].^].^].^].^].^A.^].^].^].^].^@.^>.^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^W.^].^].^I.^N.^].^].^P.^].^].^].^].^=.^].^].^].^].^].^].^].^].^].^].^].^].^[.^].^].^].^#.^>.^].^].^].^:.^R.^].^].^O.^].^].^].^G.^].^].^].^].^].^].^].^].^].^].^].^+.^].^].^G.^].^].^].^].^].^].^].^].^].^].^].^].^].^".^].^].^].^].^G.^].^].^].^].^].^].^#.^].^].^].^].^=.^].^].^].^].^].^C.^].^].^].^].^0.^].^].^].^].^G.^].^].^G.^].^].^].^].^A.^M.^].^@.^].^].^].^,.^].^].^].^7.^].^].^].^].^].^].^].^D.^].^].^].^].^].^G.^].^#.^].^].^].^?.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^?.^].^*.^].^].^].^].^[.^#.^].^].^].^].^].^].^].^].^].^E.^V.^].^].^&.^].^].^].^@.^].^L.^C.^G.^].^B.^].^].^].^].^].^].^].^#.^].^].^(.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^#.^].^].^%.^].^].^].^].^O.^6.^].^?.^].^].^].^].^$.^E.^].^I.^].^].^].^..^].^E.^].^].^].^].^?.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^>.^#.^V.^G.^].^].^].^].^].^].^].^].^].^].^].^E.^].^*.^].^].^].^].^].^].^%.^].^].^".^].^].^].^].^].^].^].^?.^].^*. EC07@<>5=;E17==@A>EC.A:@E<;5@ED?4=8EEE9E?:;<@0E;;97E9EE1E8B8E5=4=9:1Em3:.EEm80;E?ED.EEDCD9m/4C6=D9E>E;?3E7:m8F;@EADA@E4B9N6.@EK35E?EE9E?/87B>8mEm>B0<60DA>EE<=@3:15E@E876E;m@7D?<=8A6AEBCE?6E>=9B2EJ;@E9::.7m?BEEE:7B?5;E:mEm:E<:4C?53EE:E:AFEEE2DB7;6>5E?9:1>HKA8D8B444/::EEEF77M@1>3AE/03m@.E2EE=?EE=3D?E;7EAD>:AF4;=.=EE3B:7E7=:<7m:;2:2:EJ4E:E1>5:>EAE.M2D9B.C>6?E7@6@3:E46/<><4:EjACEE>?E.EE=@0G8E5EE9C1:?@5EEG@D886>EB;2?:?B>DC?EE/J>?@GE>1:.0=064C;76E8;7E/EE?3m?G8<9mEEEDE.;8EmE2EC6>9EE6EC<269C/EE<6F>:3=@:=BE39ADD@>K16EFEA1E3AD<=3EC>JE?1==E=96873:DE=D==mE6?.B4mEAAmH8CE9 +pOpen_v3 2 a 1006 .............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. + diff --git a/io/pileup/data/test_position_non_int.pileup b/io/pileup/data/test_position_non_int.pileup new file mode 100644 index 00000000..5f8ea6ba --- /dev/null +++ b/io/pileup/data/test_position_non_int.pileup @@ -0,0 +1,2 @@ +pOpen_v3 1 c 991 ^].^].^,.^].^].^E.^].^].^%.^].^].^6.^].^].^].^].^].^[.^].^].^].^].^].^].^].^].^].^].^].^].^G.^].^,.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^E.^].^].^].^].^].^].^].^/.^E.^O.^\.^].^E.^].^E.^].^".^].^].^].^].^].^].^].^G.^[.^].^].^A.^].^].^'.^].^].^].^].^].^].^].^].^].^].^].^-.^].^].^&.^].^].^Y.^..^].^].^].^].^].^].^].^].^].^].^].^".^].^E.^].^].^].^].^].^].^].^].^].^W.^].^].^].^].^].^].^].^].^).^E.^].^].^].^].^G.^E.^].^E.^].^].^].^].^].^[.^].^].^].^].^].^].^-.^].^].^].^].^].^].^].^*.^].^].^].^].^].^].^].^].^].^].^9.^G.^>.^].^].^].^].^].^].^].^].^].^].^].^].^].^,.^].^].^].^].^].^].^*.^E.^].^E.^].^].^].^].^].^].^].^].^].^(.^].^].^].^].^].^E.^;.^].^].^].^].^].^].^].^%.^].^".^].^].^].^].^].^].^].^].^].^8.^].^].^E.^].^].^].^].^].^6.^].^?.^].^].^].^].^].^].^(.^].^).^].^].^].^].^].^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^*.^].^].^].^].^].^E.^].^].^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^+.^].^].^].^D.^G.^].^].^X.^].^].^].^:.^].^].^].^].^].^/.^].^].^K.^E.^+.^].^].^].^].^>.^].^].^].^].^].^].^].^].^].^*.^].^:.^].^].^>.^].^].^].^6.^].^].^].^].^].^].^].^E.^R.^].^].^].^].^].^].^].^].^].^].^N.^].^].^].^].^6.^].^6.^X.^].^].^].^].^].^].^].^].^].^#.^].^].^].^].^].^].^].^].^#.^[.^].^].^].^].^].^].^].^G.^J.^].^].^].^].^>.^].^].^+.^].^].^].^].^].^].^].^].^].^=.^3.^].^].^].^].^].^].^].^P.^#.^].^].^].^'.^].^].^].^].^].^].^(.^].^].^G.^3.^].^].^].^].^].^].^].^].^".^%.^].^].^E.^].^].^].^].^].^].^].^\.^].^].^E.^].^].^*.^>.^+.^].^].^].^].^].^].^E.^].^G.^].^].^].^].^].^?.^?.^E.^].^].^].^].^].^].^,.^].^].^].^].^].^].^].^].^].^#.^].^V.^].^].^E.^#.^].^].^].^].^].^].^#.^].^].^".^].^].^].^].^].^E.^].^].^].^#.^].^].^].^].^].^>.^].^].^].^].^].^].^].^].^].^#.^].^].^%.^?.^*.^].^].^].^].^].^%.^].^].^].^].^].^W.^].^].^].^].^].^].^].^E.^].^].^].^].^6.^].^W.^+.^V.^].^].^].^].^].^].^].^].^].^].^].^5.^].^].^].^].^].^?.^].^].^0.^].^].^].^>.^].^".^].^].^].^].^].^].^?.^].^].^$.^].^].^].^].^].^].^].^].^].^].^].^].^7.^].^3.^].^G.^].^].^].^E.^].^].^].^].^].^].^].^].^A.^].^].^].^].^@.^>.^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^W.^].^].^I.^N.^].^].^P.^].^].^].^].^=.^].^].^].^].^].^].^].^].^].^].^].^].^[.^].^].^].^#.^>.^].^].^].^:.^R.^].^].^O.^].^].^].^G.^].^].^].^].^].^].^].^].^].^].^].^+.^].^].^G.^].^].^].^].^].^].^].^].^].^].^].^].^].^".^].^].^].^].^G.^].^].^].^].^].^].^#.^].^].^].^].^=.^].^].^].^].^].^C.^].^].^].^].^0.^].^].^].^].^G.^].^].^G.^].^].^].^].^A.^M.^].^@.^].^].^].^,.^].^].^].^7.^].^].^].^].^].^].^].^D.^].^].^].^].^].^G.^].^#.^].^].^].^?.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^?.^].^*.^].^].^].^].^[.^#.^].^].^].^].^].^].^].^].^].^E.^V.^].^].^&.^].^].^].^@.^].^L.^C.^G.^].^B.^].^].^].^].^].^].^].^#.^].^].^(.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^#.^].^].^%.^].^].^].^].^O.^6.^].^?.^].^].^].^].^$.^E.^].^I.^].^].^].^..^].^E.^].^].^].^].^?.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^>.^#.^V.^G.^].^].^].^].^].^].^].^].^].^].^].^E.^].^*.^].^].^].^].^].^].^%.^].^].^".^].^].^].^].^].^].^].^?.^].^*. EC07@<>5=;E17==@A>EC.A:@E<;5@ED?4=8EEE9E?:;<@0E;;97E9EE1E8B8E5=4=9:1Em3:.EEm80;E?ED.EEDCD9m/4C6=D9E>E;?3E7:m8F;@EADA@E4B9N6.@EK35E?EE9E?/87B>8mEm>B0<60DA>EE<=@3:15E@E876E;m@7D?<=8A6AEBCE?6E>=9B2EJ;@E9::.7m?BEEE:7B?5;E:mEm:E<:4C?53EE:E:AFEEE2DB7;6>5E?9:1>HKA8D8B444/::EEEF77M@1>3AE/03m@.E2EE=?EE=3D?E;7EAD>:AF4;=.=EE3B:7E7=:<7m:;2:2:EJ4E:E1>5:>EAE.M2D9B.C>6?E7@6@3:E46/<><4:EjACEE>?E.EE=@0G8E5EE9C1:?@5EEG@D886>EB;2?:?B>DC?EE/J>?@GE>1:.0=064C;76E8;7E/EE?3m?G8<9mEEEDE.;8EmE2EC6>9EE6EC<269C/EE<6F>:3=@:=BE39ADD@>K16EFEA1E3AD<=3EC>JE?1==E=96873:DE=D==mE6?.B4mEAAmH8CE9 +pOpen_v3 abc a 1006 .............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. HA2DBD==B?10?>AQB?F1;7CE8>5DBI<5<:AIC1997;:B0>A;78R6REBA@6C4>=D?D<=0>J:G=F@A36ACGA3=;C.0F03C?99G;:>A8=H:D/F9\:9@4B9F.@?=?5B.A@EJK?A?0//45H1;9DH8G85ED/D98?7H>E0?F;A:GB26?4/BG0?AA778IA1BJAH8:/EA/89D/?B@<>G??8=C@1@3AA0.7I@F8A7>D?/B26D>>E5:2C:404/AAC6F:;@=B@I8@E3;E2EB.7CG>C?95B4;B;FEB7<<99=B9BBBC2F>H=3G4C3AA:D;CB/;E>@=A>53MA35:459;>>.?B77C9<371C=1A?4>?D<9><9A?8B65=?A=<>1:>A7;D/=83AA<>09G;HCEE5<<>7O0BH0?29:99>J@1>9HB0=6=714D>7@:@=D???60@A=:CD<91A38E235A8?89E./C5@850:B/7H1IA@D..LA=L5NB@;AL4BB;@GAB6GC6F8=C<;E=9@JC=ER1988@???ADBGFC1=AC898?//7.75?<@AL@9>D0DF?@?K@0@>@H51GEK/9:?5@B23A>@7/EG.8FHDA7AC<2CM65>C?>6/12F>GC8=D@KBC0.?@=8zGG3>B01FCC@>939ECD@93@4EI9A6:8<IG@@?I846JGB@/:.3?=>D@;9ED0@8>66:>:=<8DE=6?A:=>E:B>CA?4;77D1F6:>G71DD25?=;ABCB@;1@A2R=A<@E=<7B;?I0FE<@EA>DFC diff --git a/io/pileup/data/test_read_off.pileup b/io/pileup/data/test_read_off.pileup new file mode 100644 index 00000000..54b39d5a --- /dev/null +++ b/io/pileup/data/test_read_off.pileup @@ -0,0 +1,2 @@ +pOpen_v3 1 c 991 ^].^].^,.^].^].^E.^].^].^%.^].^].^6.^].^].^].^].^].^[.^].^].^].^].^].^].^].^].^].^].^].^].^G.^].^,.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^E.^].^].^].^].^].^].^].^/.^E.^O.^\.^].^E.^].^E.^].^".^].^].^].^].^].^].^].^G.^[.^].^].^A.^].^].^'.^].^].^].^].^].^].^].^].^].^].^].^-.^].^].^&.^].^].^Y.^..^].^].^].^].^].^].^].^].^].^].^].^".^].^E.^].^].^].^].^].^].^].^].^].^W.^].^].^].^].^].^].^].^].^).^E.^].^].^].^].^G.^E.^].^E.^].^].^].^].^].^[.^].^].^].^].^].^].^-.^].^].^].^].^].^].^].^*.^].^].^].^].^].^].^].^].^].^].^9.^G.^>.^].^].^].^].^].^].^].^].^].^].^].^].^].^,.^].^].^].^].^].^].^*.^E.^].^E.^].^].^].^].^].^].^].^].^].^(.^].^].^].^].^].^E.^;.^].^].^].^].^].^].^].^%.^].^".^].^].^].^].^].^].^].^].^].^8.^].^].^E.^].^].^].^].^].^6.^].^?.^].^].^].^].^].^].^(.^].^).^].^].^].^].^].^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^*.^].^].^].^].^].^E.^].^].^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^+.^].^].^].^D.^G.^].^].^X.^].^].^].^:.^].^].^].^].^].^/.^].^].^K.^E.^+.^].^].^].^].^>.^].^].^].^].^].^].^].^].^].^*.^].^:.^].^].^>.^].^].^].^6.^].^].^].^].^].^].^].^E.^R.^].^].^].^].^].^].^].^].^].^].^N.^].^].^].^].^6.^].^6.^X.^].^].^].^].^].^].^].^].^].^#.^].^].^].^].^].^].^].^].^#.^[.^].^].^].^].^].^].^].^G.^J.^].^].^].^].^>.^].^].^+.^].^].^].^].^].^].^].^].^].^=.^3.^].^].^].^].^].^].^].^P.^#.^].^].^].^'.^].^].^].^].^].^].^(.^].^].^G.^3.^].^].^].^].^].^].^].^].^".^%.^].^].^E.^].^].^].^].^].^].^].^\.^].^].^E.^].^].^*.^>.^+.^].^].^].^].^].^].^E.^].^G.^].^].^].^].^].^?.^?.^E.^].^].^].^].^].^].^,.^].^].^].^].^].^].^].^].^].^#.^].^V.^].^].^E.^#.^].^].^].^].^].^].^#.^].^].^".^].^].^].^].^].^E.^].^].^].^#.^].^].^].^].^].^>.^].^].^].^].^].^].^].^].^].^#.^].^].^%.^?.^*.^].^].^].^].^].^%.^].^].^].^].^].^W.^].^].^].^].^].^].^].^E.^].^].^].^].^6.^].^W.^+.^V.^].^].^].^].^].^].^].^].^].^].^].^5.^].^].^].^].^].^?.^].^].^0.^].^].^].^>.^].^".^].^].^].^].^].^].^?.^].^].^$.^].^].^].^].^].^].^].^].^].^].^].^].^7.^].^3.^].^G.^].^].^].^E.^].^].^].^].^].^].^].^].^A.^].^].^].^].^@.^>.^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^W.^].^].^I.^N.^].^].^P.^].^].^].^].^=.^].^].^].^].^].^].^].^].^].^].^].^].^[.^].^].^].^#.^>.^].^].^].^:.^R.^].^].^O.^].^].^].^G.^].^].^].^].^].^].^].^].^].^].^].^+.^].^].^G.^].^].^].^].^].^].^].^].^].^].^].^].^].^".^].^].^].^].^G.^].^].^].^].^].^].^#.^].^].^].^].^=.^].^].^].^].^].^C.^].^].^].^].^0.^].^].^].^].^G.^].^].^G.^].^].^].^].^A.^M.^].^@.^].^].^].^,.^].^].^].^7.^].^].^].^].^].^].^].^D.^].^].^].^].^].^G.^].^#.^].^].^].^?.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^?.^].^*.^].^].^].^].^[.^#.^].^].^].^].^].^].^].^].^].^E.^V.^].^].^&.^].^].^].^@.^].^L.^C.^G.^].^B.^].^].^].^].^].^].^].^#.^].^].^(.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^#.^].^].^%.^].^].^].^].^O.^6.^].^?.^].^].^].^].^$.^E.^].^I.^].^].^].^..^].^E.^].^].^].^].^?.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^>.^#.^V.^G.^].^].^].^].^].^].^].^].^].^].^].^E.^].^*.^].^].^].^].^].^].^%.^].^].^".^].^].^].^].^].^].^].^?.^].^*. EC07@<>5=;E17==@A>EC.A:@E<;5@ED?4=8EEE9E?:;<@0E;;97E9EE1E8B8E5=4=9:1Em3:.EEm80;E?ED.EEDCD9m/4C6=D9E>E;?3E7:m8F;@EADA@E4B9N6.@EK35E?EE9E?/87B>8mEm>B0<60DA>EE<=@3:15E@E876E;m@7D?<=8A6AEBCE?6E>=9B2EJ;@E9::.7m?BEEE:7B?5;E:mEm:E<:4C?53EE:E:AFEEE2DB7;6>5E?9:1>HKA8D8B444/::EEEF77M@1>3AE/03m@.E2EE=?EE=3D?E;7EAD>:AF4;=.=EE3B:7E7=:<7m:;2:2:EJ4E:E1>5:>EAE.M2D9B.C>6?E7@6@3:E46/<><4:EjACEE>?E.EE=@0G8E5EE9C1:?@5EEG@D886>EB;2?:?B>DC?EE/J>?@GE>1:.0=064C;76E8;7E/EE?3m?G8<9mEEEDE.;8EmE2EC6>9EE6EC<269C/EE<6F>:3=@:=BE39ADD@>K16EFEA1E3AD<=3EC>JE?1==E=96873:DE=D==mE6?.B4mEAAmH8CE9 +pOpen_v3 2 a 1006 .............................+6T................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. HA2DBD==B?10?>AQB?F1;7CE8>5DBI<5<:AIC1997;:B0>A;78R6REBA@6C4>=D?D<=0>J:G=F@A36ACGA3=;C.0F03C?99G;:>A8=H:D/F9\:9@4B9F.@?=?5B.A@EJK?A?0//45H1;9DH8G85ED/D98?7H>E0?F;A:GB26?4/BG0?AA778IA1BJAH8:/EA/89D/?B@<>G??8=C@1@3AA0.7I@F8A7>D?/B26D>>E5:2C:404/AAC6F:;@=B@I8@E3;E2EB.7CG>C?95B4;B;FEB7<<99=B9BBBC2F>H=3G4C3AA:D;CB/;E>@=A>53MA35:459;>>.?B77C9<371C=1A?4>?D<9><9A?8B65=?A=<>1:>A7;D/=83AA<>09G;HCEE5<<>7O0BH0?29:99>J@1>9HB0=6=714D>7@:@=D???60@A=:CD<91A38E235A8?89E./C5@850:B/7H1IA@D..LA=L5NB@;AL4BB;@GAB6GC6F8=C<;E=9@JC=ER1988@???ADBGFC1=AC898?//7.75?<@AL@9>D0DF?@?K@0@>@H51GEK/9:?5@B23A>@7/EG.8FHDA7AC<2CM65>C?>6/12F>GC8=D@KBC0.?@=8zGG3>B01FCC@>939ECD@93@4EI9A6:8<IG@@?I846JGB@/:.3?=>D@;9ED0@8>66:>:=<8DE=6?A:=>E:B>CA?4;77D1F6:>G71DD25?=;ABCB@;1@A2R=A<@E=<7B;?I0FE<@EA>DFC diff --git a/io/pileup/data/test_readcount_non_int.pileup b/io/pileup/data/test_readcount_non_int.pileup new file mode 100644 index 00000000..3d5fad48 --- /dev/null +++ b/io/pileup/data/test_readcount_non_int.pileup @@ -0,0 +1,2 @@ +pOpen_v3 1 c 991 ^].^].^,.^].^].^E.^].^].^%.^].^].^6.^].^].^].^].^].^[.^].^].^].^].^].^].^].^].^].^].^].^].^G.^].^,.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^E.^].^].^].^].^].^].^].^/.^E.^O.^\.^].^E.^].^E.^].^".^].^].^].^].^].^].^].^G.^[.^].^].^A.^].^].^'.^].^].^].^].^].^].^].^].^].^].^].^-.^].^].^&.^].^].^Y.^..^].^].^].^].^].^].^].^].^].^].^].^".^].^E.^].^].^].^].^].^].^].^].^].^W.^].^].^].^].^].^].^].^].^).^E.^].^].^].^].^G.^E.^].^E.^].^].^].^].^].^[.^].^].^].^].^].^].^-.^].^].^].^].^].^].^].^*.^].^].^].^].^].^].^].^].^].^].^9.^G.^>.^].^].^].^].^].^].^].^].^].^].^].^].^].^,.^].^].^].^].^].^].^*.^E.^].^E.^].^].^].^].^].^].^].^].^].^(.^].^].^].^].^].^E.^;.^].^].^].^].^].^].^].^%.^].^".^].^].^].^].^].^].^].^].^].^8.^].^].^E.^].^].^].^].^].^6.^].^?.^].^].^].^].^].^].^(.^].^).^].^].^].^].^].^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^*.^].^].^].^].^].^E.^].^].^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^+.^].^].^].^D.^G.^].^].^X.^].^].^].^:.^].^].^].^].^].^/.^].^].^K.^E.^+.^].^].^].^].^>.^].^].^].^].^].^].^].^].^].^*.^].^:.^].^].^>.^].^].^].^6.^].^].^].^].^].^].^].^E.^R.^].^].^].^].^].^].^].^].^].^].^N.^].^].^].^].^6.^].^6.^X.^].^].^].^].^].^].^].^].^].^#.^].^].^].^].^].^].^].^].^#.^[.^].^].^].^].^].^].^].^G.^J.^].^].^].^].^>.^].^].^+.^].^].^].^].^].^].^].^].^].^=.^3.^].^].^].^].^].^].^].^P.^#.^].^].^].^'.^].^].^].^].^].^].^(.^].^].^G.^3.^].^].^].^].^].^].^].^].^".^%.^].^].^E.^].^].^].^].^].^].^].^\.^].^].^E.^].^].^*.^>.^+.^].^].^].^].^].^].^E.^].^G.^].^].^].^].^].^?.^?.^E.^].^].^].^].^].^].^,.^].^].^].^].^].^].^].^].^].^#.^].^V.^].^].^E.^#.^].^].^].^].^].^].^#.^].^].^".^].^].^].^].^].^E.^].^].^].^#.^].^].^].^].^].^>.^].^].^].^].^].^].^].^].^].^#.^].^].^%.^?.^*.^].^].^].^].^].^%.^].^].^].^].^].^W.^].^].^].^].^].^].^].^E.^].^].^].^].^6.^].^W.^+.^V.^].^].^].^].^].^].^].^].^].^].^].^5.^].^].^].^].^].^?.^].^].^0.^].^].^].^>.^].^".^].^].^].^].^].^].^?.^].^].^$.^].^].^].^].^].^].^].^].^].^].^].^].^7.^].^3.^].^G.^].^].^].^E.^].^].^].^].^].^].^].^].^A.^].^].^].^].^@.^>.^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^W.^].^].^I.^N.^].^].^P.^].^].^].^].^=.^].^].^].^].^].^].^].^].^].^].^].^].^[.^].^].^].^#.^>.^].^].^].^:.^R.^].^].^O.^].^].^].^G.^].^].^].^].^].^].^].^].^].^].^].^+.^].^].^G.^].^].^].^].^].^].^].^].^].^].^].^].^].^".^].^].^].^].^G.^].^].^].^].^].^].^#.^].^].^].^].^=.^].^].^].^].^].^C.^].^].^].^].^0.^].^].^].^].^G.^].^].^G.^].^].^].^].^A.^M.^].^@.^].^].^].^,.^].^].^].^7.^].^].^].^].^].^].^].^D.^].^].^].^].^].^G.^].^#.^].^].^].^?.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^?.^].^*.^].^].^].^].^[.^#.^].^].^].^].^].^].^].^].^].^E.^V.^].^].^&.^].^].^].^@.^].^L.^C.^G.^].^B.^].^].^].^].^].^].^].^#.^].^].^(.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^#.^].^].^%.^].^].^].^].^O.^6.^].^?.^].^].^].^].^$.^E.^].^I.^].^].^].^..^].^E.^].^].^].^].^?.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^>.^#.^V.^G.^].^].^].^].^].^].^].^].^].^].^].^E.^].^*.^].^].^].^].^].^].^%.^].^].^".^].^].^].^].^].^].^].^?.^].^*. EC07@<>5=;E17==@A>EC.A:@E<;5@ED?4=8EEE9E?:;<@0E;;97E9EE1E8B8E5=4=9:1Em3:.EEm80;E?ED.EEDCD9m/4C6=D9E>E;?3E7:m8F;@EADA@E4B9N6.@EK35E?EE9E?/87B>8mEm>B0<60DA>EE<=@3:15E@E876E;m@7D?<=8A6AEBCE?6E>=9B2EJ;@E9::.7m?BEEE:7B?5;E:mEm:E<:4C?53EE:E:AFEEE2DB7;6>5E?9:1>HKA8D8B444/::EEEF77M@1>3AE/03m@.E2EE=?EE=3D?E;7EAD>:AF4;=.=EE3B:7E7=:<7m:;2:2:EJ4E:E1>5:>EAE.M2D9B.C>6?E7@6@3:E46/<><4:EjACEE>?E.EE=@0G8E5EE9C1:?@5EEG@D886>EB;2?:?B>DC?EE/J>?@GE>1:.0=064C;76E8;7E/EE?3m?G8<9mEEEDE.;8EmE2EC6>9EE6EC<269C/EE<6F>:3=@:=BE39ADD@>K16EFEA1E3AD<=3EC>JE?1==E=96873:DE=D==mE6?.B4mEAAmH8CE9 +pOpen_v3 2 a abc .............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. HA2DBD==B?10?>AQB?F1;7CE8>5DBI<5<:AIC1997;:B0>A;78R6REBA@6C4>=D?D<=0>J:G=F@A36ACGA3=;C.0F03C?99G;:>A8=H:D/F9\:9@4B9F.@?=?5B.A@EJK?A?0//45H1;9DH8G85ED/D98?7H>E0?F;A:GB26?4/BG0?AA778IA1BJAH8:/EA/89D/?B@<>G??8=C@1@3AA0.7I@F8A7>D?/B26D>>E5:2C:404/AAC6F:;@=B@I8@E3;E2EB.7CG>C?95B4;B;FEB7<<99=B9BBBC2F>H=3G4C3AA:D;CB/;E>@=A>53MA35:459;>>.?B77C9<371C=1A?4>?D<9><9A?8B65=?A=<>1:>A7;D/=83AA<>09G;HCEE5<<>7O0BH0?29:99>J@1>9HB0=6=714D>7@:@=D???60@A=:CD<91A38E235A8?89E./C5@850:B/7H1IA@D..LA=L5NB@;AL4BB;@GAB6GC6F8=C<;E=9@JC=ER1988@???ADBGFC1=AC898?//7.75?<@AL@9>D0DF?@?K@0@>@H51GEK/9:?5@B23A>@7/EG.8FHDA7AC<2CM65>C?>6/12F>GC8=D@KBC0.?@=8zGG3>B01FCC@>939ECD@93@4EI9A6:8<IG@@?I846JGB@/:.3?=>D@;9ED0@8>66:>:=<8DE=6?A:=>E:B>CA?4;77D1F6:>G71DD25?=;ABCB@;1@A2R=A<@E=<7B;?I0FE<@EA>DFC diff --git a/io/pileup/data/test_unknown_rune.pileup b/io/pileup/data/test_unknown_rune.pileup new file mode 100644 index 00000000..2434d237 --- /dev/null +++ b/io/pileup/data/test_unknown_rune.pileup @@ -0,0 +1,2 @@ +pOpen_v3 1 c 991 ^].^].^,.^].^].^E.^].^].^%.^].^].^6.^].^].^].^].^].^[.^].^].^].^].^].^].^].^].^].^].^].^].^G.^].^,.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^E.^].^].^].^].^].^].^].^/.^E.^O.^\.^].^E.^].^E.^].^".^].^].^].^].^].^].^].^G.^[.^].^].^A.^].^].^'.^].^].^].^].^].^].^].^].^].^].^].^-.^].^].^&.^].^].^Y.^..^].^].^].^].^].^].^].^].^].^].^].^".^].^E.^].^].^].^].^].^].^].^].^].^W.^].^].^].^].^].^].^].^].^).^E.^].^].^].^].^G.^E.^].^E.^].^].^].^].^].^[.^].^].^].^].^].^].^-.^].^].^].^].^].^].^].^*.^].^].^].^].^].^].^].^].^].^].^9.^G.^>.^].^].^].^].^].^].^].^].^].^].^].^].^].^,.^].^].^].^].^].^].^*.^E.^].^E.^].^].^].^].^].^].^].^].^].^(.^].^].^].^].^].^E.^;.^].^].^].^].^].^].^].^%.^].^".^].^].^].^].^].^].^].^].^].^8.^].^].^E.^].^].^].^].^].^6.^].^?.^].^].^].^].^].^].^(.^].^).^].^].^].^].^].^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^*.^].^].^].^].^].^E.^].^].^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^+.^].^].^].^D.^G.^].^].^X.^].^].^].^:.^].^].^].^].^].^/.^].^].^K.^E.^+.^].^].^].^].^>.^].^].^].^].^].^].^].^].^].^*.^].^:.^].^].^>.^].^].^].^6.^].^].^].^].^].^].^].^E.^R.^].^].^].^].^].^].^].^].^].^].^N.^].^].^].^].^6.^].^6.^X.^].^].^].^].^].^].^].^].^].^#.^].^].^].^].^].^].^].^].^#.^[.^].^].^].^].^].^].^].^G.^J.^].^].^].^].^>.^].^].^+.^].^].^].^].^].^].^].^].^].^=.^3.^].^].^].^].^].^].^].^P.^#.^].^].^].^'.^].^].^].^].^].^].^(.^].^].^G.^3.^].^].^].^].^].^].^].^].^".^%.^].^].^E.^].^].^].^].^].^].^].^\.^].^].^E.^].^].^*.^>.^+.^].^].^].^].^].^].^E.^].^G.^].^].^].^].^].^?.^?.^E.^].^].^].^].^].^].^,.^].^].^].^].^].^].^].^].^].^#.^].^V.^].^].^E.^#.^].^].^].^].^].^].^#.^].^].^".^].^].^].^].^].^E.^].^].^].^#.^].^].^].^].^].^>.^].^].^].^].^].^].^].^].^].^#.^].^].^%.^?.^*.^].^].^].^].^].^%.^].^].^].^].^].^W.^].^].^].^].^].^].^].^E.^].^].^].^].^6.^].^W.^+.^V.^].^].^].^].^].^].^].^].^].^].^].^5.^].^].^].^].^].^?.^].^].^0.^].^].^].^>.^].^".^].^].^].^].^].^].^?.^].^].^$.^].^].^].^].^].^].^].^].^].^].^].^].^7.^].^3.^].^G.^].^].^].^E.^].^].^].^].^].^].^].^].^A.^].^].^].^].^@.^>.^].^E.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^W.^].^].^I.^N.^].^].^P.^].^].^].^].^=.^].^].^].^].^].^].^].^].^].^].^].^].^[.^].^].^].^#.^>.^].^].^].^:.^R.^].^].^O.^].^].^].^G.^].^].^].^].^].^].^].^].^].^].^].^+.^].^].^G.^].^].^].^].^].^].^].^].^].^].^].^].^].^".^].^].^].^].^G.^].^].^].^].^].^].^#.^].^].^].^].^=.^].^].^].^].^].^C.^].^].^].^].^0.^].^].^].^].^G.^].^].^G.^].^].^].^].^A.^M.^].^@.^].^].^].^,.^].^].^].^7.^].^].^].^].^].^].^].^D.^].^].^].^].^].^G.^].^#.^].^].^].^?.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^?.^].^*.^].^].^].^].^[.^#.^].^].^].^].^].^].^].^].^].^E.^V.^].^].^&.^].^].^].^@.^].^L.^C.^G.^].^B.^].^].^].^].^].^].^].^#.^].^].^(.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^].^#.^].^].^%.^].^].^].^].^O.^6.^].^?.^].^].^].^].^$.^E.^].^I.^].^].^].^..^].^E.^].^].^].^].^?.^].^].^].^].^].^].^].^].^].^].^].^].^].^].^>.^#.^V.^G.^].^].^].^].^].^].^].^].^].^].^].^E.^].^*.^].^].^].^].^].^].^%.^].^].^".^].^].^].^].^].^].^].^?.^].^*. EC07@<>5=;E17==@A>EC.A:@E<;5@ED?4=8EEE9E?:;<@0E;;97E9EE1E8B8E5=4=9:1Em3:.EEm80;E?ED.EEDCD9m/4C6=D9E>E;?3E7:m8F;@EADA@E4B9N6.@EK35E?EE9E?/87B>8mEm>B0<60DA>EE<=@3:15E@E876E;m@7D?<=8A6AEBCE?6E>=9B2EJ;@E9::.7m?BEEE:7B?5;E:mEm:E<:4C?53EE:E:AFEEE2DB7;6>5E?9:1>HKA8D8B444/::EEEF77M@1>3AE/03m@.E2EE=?EE=3D?E;7EAD>:AF4;=.=EE3B:7E7=:<7m:;2:2:EJ4E:E1>5:>EAE.M2D9B.C>6?E7@6@3:E46/<><4:EjACEE>?E.EE=@0G8E5EE9C1:?@5EEG@D886>EB;2?:?B>DC?EE/J>?@GE>1:.0=064C;76E8;7E/EE?3m?G8<9mEEEDE.;8EmE2EC6>9EE6EC<269C/EE<6F>:3=@:=BE39ADD@>K16EFEA1E3AD<=3EC>JE?1==E=96873:DE=D==mE6?.B4mEAAmH8CE9 +pOpen_v3 2 a 1006 .....................#........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ HA2DBD==B?10?>AQB?F1;7CE8>5DBI<5<:AIC1997;:B0>A;78R6REBA@6C4>=D?D<=0>J:G=F@A36ACGA3=;C.0F03C?99G;:>A8=H:D/F9\:9@4B9F.@?=?5B.A@EJK?A?0//45H1;9DH8G85ED/D98?7H>E0?F;A:GB26?4/BG0?AA778IA1BJAH8:/EA/89D/?B@<>G??8=C@1@3AA0.7I@F8A7>D?/B26D>>E5:2C:404/AAC6F:;@=B@I8@E3;E2EB.7CG>C?95B4;B;FEB7<<99=B9BBBC2F>H=3G4C3AA:D;CB/;E>@=A>53MA35:459;>>.?B77C9<371C=1A?4>?D<9><9A?8B65=?A=<>1:>A7;D/=83AA<>09G;HCEE5<<>7O0BH0?29:99>J@1>9HB0=6=714D>7@:@=D???60@A=:CD<91A38E235A8?89E./C5@850:B/7H1IA@D..LA=L5NB@;AL4BB;@GAB6GC6F8=C<;E=9@JC=ER1988@???ADBGFC1=AC898?//7.75?<@AL@9>D0DF?@?K@0@>@H51GEK/9:?5@B23A>@7/EG.8FHDA7AC<2CM65>C?>6/12F>GC8=D@KBC0.?@=8zGG3>B01FCC@>939ECD@93@4EI9A6:8<IG@@?I846JGB@/:.3?=>D@;9ED0@8>66:>:=<8DE=6?A:=>E:B>CA?4;77D1F6:>G71DD25?=;ABCB@;1@A2R=A<@E=<7B;?I0FE<@EA>DFC diff --git a/io/pileup/pileup.go b/io/pileup/pileup.go new file mode 100644 index 00000000..0f714169 --- /dev/null +++ b/io/pileup/pileup.go @@ -0,0 +1,252 @@ +/* +Package pileup contains pileup parsers and writers. + +The pileup format is a text-based bioinformatics format to summarize aligned +reads against a reference sequence. In comparison to simply getting a consensus +sequence from sequencing data, pileup files can contain more context about the +mutations in a sequencing run, which is especially useful when analyzing +plasmid sequencing data from Nanopore sequencing runs. + +Pileup files are basically tsv files with 6 columns: Sequence Identifier, Position, +Reference Base, Read Count, Read Results, and Quality. An example from +wikipedia (https://en.wikipedia.org/wiki/Pileup_format) is shown below: + + ``` + seq1 272 T 24 ,.$.....,,.,.,...,,,.,..^+. <<<+;<<<<<<<<<<<=<;<;7<& + seq1 273 T 23 ,.....,,.,.,...,,,.,..A <<<;<<<<<<<<<3<=<<<;<<+ + seq1 274 T 23 ,.$....,,.,.,...,,,.,... 7<7;<;<<<<<<<<<=<;<;<<6 + seq1 275 A 23 ,$....,,.,.,...,,,.,...^l. <+;9*<<<<<<<<<=<<:;<<<< + seq1 276 G 22 ...T,,.,.,...,,,.,.... 33;+<<7=7<<7<&<<1;<<6< + seq1 277 T 22 ....,,.,.,.C.,,,.,..G. +7<;<<<<<<<&<=<<:;<<&< + seq1 278 G 23 ....,,.,.,...,,,.,....^k. %38*<<;<7<<7<=<<<;<<<<< + seq1 279 C 23 A..T,,.,.,...,,,.,..... 75&<<<<<<<<<=<<<9<<:<<< + ``` + + 1. Sequence Identifier: The sequence identifier of the reference sequence + 2. Position: Position of row in the reference sequence (indexed at 1) + 3. Reference Base: Base pair in reference sequence + 4. Read Count: Number of aligned reads to this particular base pair + 5. Read Results: The resultant alignments + 6. Quality: Phred quality scores associated with each base + +This package provides a parser and writer for working with pileup files. +*/ +package pileup + +import ( + "bufio" + "bytes" + "compress/gzip" + "errors" + "fmt" + "io" + "math" + "os" + "strconv" + "strings" + "unicode" +) + +// https://en.wikipedia.org/wiki/Pileup_format + +var ( + gzipReaderFn = gzip.NewReader + openFn = os.Open +) + +// Pileup struct is a single position in a pileup file. Pileup files "pile" +// a bunch of separate bam/sam alignments into something more readable at a per +// base pair level, so are only useful as a grouping. +type Pileup struct { + Sequence string `json:"sequence"` + Position uint `json:"position"` + ReferenceBase string `json:"reference_base"` + ReadCount uint `json:"read_count"` + ReadResults []string `json:"read_results"` + Quality string `json:"quality"` +} + +// Parse parses a given Pileup file into an array of Pileup structs. +func Parse(r io.Reader) ([]Pileup, error) { + // 32kB is a magic number often used by the Go stdlib for parsing. We multiply it by two. + const maxLineSize = 2 * 32 * 1024 + parser := NewParser(r, maxLineSize) + return parser.ParseAll() +} + +// Parser is a pileup parser. +type Parser struct { + reader bufio.Reader + line uint +} + +// NewParser creates a parser from an io.Reader for pileup data. +func NewParser(r io.Reader, maxLineSize int) *Parser { + return &Parser{ + reader: *bufio.NewReaderSize(r, maxLineSize), + } +} + +// ParseAll parses all sequences in underlying reader only returning non-EOF errors. +// It returns all valid pileup sequences up to error if encountered. +func (parser *Parser) ParseAll() ([]Pileup, error) { + return parser.ParseN(math.MaxInt) +} + +// ParseN parses up to maxRows pileup sequences from the Parser's underlying reader. +// ParseN does not return EOF if encountered. +// If an non-EOF error is encountered it returns it and all correctly parsed sequences up to then. +func (parser *Parser) ParseN(maxRows int) (pileups []Pileup, err error) { + for counter := 0; counter < maxRows; counter++ { + pileup, err := parser.ParseNext() + if err != nil { + if errors.Is(err, io.EOF) { + err = nil // EOF not treated as parsing error. + } + return pileups, err + } + pileups = append(pileups, pileup) + } + return pileups, nil +} + +// ParseNext parses the next pileup row in a pileup file. +// ParseNext returns an EOF if encountered. +func (parser *Parser) ParseNext() (Pileup, error) { + if _, err := parser.reader.Peek(1); err != nil { + // Early return on error. Probably will be EOF. + return Pileup{}, err + } + // Parse out a single line + lineBytes, err := parser.reader.ReadSlice('\n') + parser.line++ + line := string(lineBytes) + line = line[:len(line)-1] // Exclude newline delimiter. + + // Check that there are 6 values, as defined by the pileup format + values := strings.Split(line, "\t") + if len(values) != 6 { + return Pileup{}, fmt.Errorf("Error on line %d: Got %d values, expected 6.", parser.line, len(values)) + } + + // Convert Position and ReadCount to integers + positionInteger, err := strconv.Atoi(values[1]) + if err != nil { + return Pileup{}, fmt.Errorf("Error on line %d. Got error: %w", parser.line, err) + } + readCountInteger, err := strconv.Atoi(values[3]) + if err != nil { + return Pileup{}, fmt.Errorf("Error on line %d. Got error: %w", parser.line, err) + } + + // Parse ReadResults + var readResults []string + var starts uint + var ends uint + var skip int + var readCount uint + resultsString := values[4] + for resultIndex := range resultsString { + if skip != 0 { + skip = skip - 1 + continue + } + resultRune := resultsString[resultIndex] + switch resultRune { + case '^': + starts = starts + 1 + skip = skip + 2 + readResults = append(readResults, resultsString[resultIndex:resultIndex+3]) + case '$': + ends = ends + 1 + // This applies to the last read segement + readResults[len(readResults)-1] = readResults[len(readResults)-1] + "$" + case '.', ',', '*', 'A', 'T', 'G', 'C', 'N', 'a', 't', 'g', 'c', 'n': + readResults = append(readResults, string(resultRune)) + case '-', '+': + // formatted in `+4ATGC` format. We need to know the number of jumps + // because you can have +10AAAAAAAAAA + var numberOfJumps string + for numberIndex := range resultsString[resultIndex:] { + runeToCheck := resultsString[resultIndex+numberIndex+1] + if unicode.IsDigit(rune(runeToCheck)) { + numberOfJumps = numberOfJumps + string(runeToCheck) + continue + } + break + } + regularExpressionInt, _ := strconv.Atoi(numberOfJumps) // Because of the above check, this will never err + readResult := resultsString[resultIndex : resultIndex+regularExpressionInt+2] + for _, letter := range readResult { + switch letter { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'T', 'G', 'C', 'N', 'a', 't', 'g', 'c', 'n', '-', '+': + continue + default: + return Pileup{}, fmt.Errorf("Rune within +,- not found on line %d. Got %c: only runes allowed are: [0 1 2 3 4 5 6 7 8 9 A T G C N a t g c n - +]", parser.line, letter) + } + } + readResults = append(readResults, readResult) + skip = skip + regularExpressionInt + len(numberOfJumps) // The 1 makes sure to include the regularExpressionInt in readResult string + default: + return Pileup{}, fmt.Errorf("Rune not found on line %d. Got %c: only runes allowed are: [^ $ . , * A T G C N a t g c n - +]", parser.line, resultRune) + } + readCount = readCount + 1 + } + + return Pileup{Sequence: values[0], Position: uint(positionInteger), ReferenceBase: values[2], ReadCount: uint(readCountInteger), ReadResults: readResults, Quality: values[5]}, nil +} + +// Reset discards all data in buffer and resets state. +func (parser *Parser) Reset(r io.Reader) { + parser.reader.Reset(r) + parser.line = 0 +} + +/****************************************************************************** + +Start of Read functions + +******************************************************************************/ + +// Read reads a file into an array of Pileup structs +func Read(path string) ([]Pileup, error) { + file, err := openFn(path) + if err != nil { + return nil, err + } + defer file.Close() + return Parse(file) +} + +/****************************************************************************** + +Start of Write functions + +******************************************************************************/ + +// WritePileup writes a pileup array to an io.Writer +func WritePileup(pileups []Pileup, w io.Writer) { + for _, pileup := range pileups { + w.Write([]byte(pileup.Sequence)) + w.Write([]byte("\t")) + w.Write([]byte(strconv.FormatUint(uint64(pileup.Position), 10))) + w.Write([]byte("\t")) + w.Write([]byte(pileup.ReferenceBase)) + w.Write([]byte("\t")) + w.Write([]byte(strconv.FormatUint(uint64(pileup.ReadCount), 10))) + w.Write([]byte("\t")) + for _, readResult := range pileup.ReadResults { + w.Write([]byte(readResult)) + } + w.Write([]byte("\t")) + w.Write([]byte(pileup.Quality)) + w.Write([]byte("\n")) + } +} + +// Write writes a pileup array to a file +func Write(pileups []Pileup, path string) error { + var b bytes.Buffer + WritePileup(pileups, &b) + return os.WriteFile(path, b.Bytes(), 0644) +} diff --git a/io/pileup/pileup_test.go b/io/pileup/pileup_test.go new file mode 100644 index 00000000..38c95f47 --- /dev/null +++ b/io/pileup/pileup_test.go @@ -0,0 +1,187 @@ +package pileup + +import ( + "bytes" + "errors" + "fmt" + "io" + "os" + "strings" + "testing" +) + +func TestParse(t *testing.T) { + file, err := os.Open("data/test.pileup") + if err != nil { + t.Errorf("Failed to open test.pileup: %s", err) + } + defer file.Close() + const maxLineSize = 2 * 32 * 1024 + parser := NewParser(file, maxLineSize) + var pileupReads []Pileup + for { + pileupRead, err := parser.ParseNext() + if err != nil { + if !errors.Is(err, io.EOF) { + t.Errorf("Got unknown error: %s", err) + } + break + } + pileupReads = append(pileupReads, pileupRead) + } + if pileupReads[2].ReadCount != 1401 { + t.Errorf("Expected 1401 read counts. Got: %d", pileupReads[2].ReadCount) + } + + // Test not enough fields + file2, err := os.Open("data/test_not_enough_fields.pileup") + if err != nil { + t.Errorf("Failed to open test_not_enough_fields.pileup: %s", err) + } + defer file2.Close() + parser = NewParser(file2, maxLineSize) + for { + _, err = parser.ParseNext() + if err != nil { + if !strings.Contains(fmt.Sprint(err), "values, expected 6.") { + t.Errorf("Got unknown error: %s", err) + } + break + } + } + + // Test Position Int + file3, err := os.Open("data/test_position_non_int.pileup") + if err != nil { + t.Errorf("Failed to open test_position_non_int.pileup: %s", err) + } + defer file3.Close() + parser = NewParser(file3, maxLineSize) + for { + _, err = parser.ParseNext() + if err != nil { + if !strings.Contains(fmt.Sprint(err), "Error on line") { + t.Errorf("Got unknown error: %s", err) + } + break + } + } + + // Test ReadCount Int + file4, err := os.Open("data/test_readcount_non_int.pileup") + if err != nil { + t.Errorf("Failed to open test_readcount_non_int.pileup: %s", err) + } + defer file4.Close() + parser = NewParser(file4, maxLineSize) + for { + _, err = parser.ParseNext() + if err != nil { + if !strings.Contains(fmt.Sprint(err), "Error on line") { + t.Errorf("Got unknown error: %s", err) + } + break + } + } + + // Test +,- Rune + file5, err := os.Open("data/test_read_off.pileup") + if err != nil { + t.Errorf("Failed to open test_read_off.pileup: %s", err) + } + defer file5.Close() + parser = NewParser(file5, maxLineSize) + for { + _, err = parser.ParseNext() + if err != nil { + if !strings.Contains(fmt.Sprint(err), "Rune within +,- not found on line") { + t.Errorf("Got unknown error: %s", err) + } + break + } + } + + // Test Unknown Rune + file6, err := os.Open("data/test_unknown_rune.pileup") + if err != nil { + t.Errorf("Failed to open test_unknown_rune.pileup: %s", err) + } + defer file6.Close() + parser = NewParser(file6, maxLineSize) + for { + _, err = parser.ParseNext() + if err != nil { + if !strings.Contains(fmt.Sprint(err), "Rune not found on line") { + t.Errorf("Got unknown error: %s", err) + } + break + } + } + + // Test ParseN + file7, err := os.Open("data/test.pileup") + if err != nil { + t.Errorf("Failed to open test.pileup: %s", err) + } + defer file7.Close() + parser = NewParser(file7, maxLineSize) + _, err = parser.ParseN(2) + if err != nil { + t.Errorf("Got unknown error: %s", err) + } +} + +func TestBuild(t *testing.T) { + file, err := os.Open("data/test.pileup") + if err != nil { + t.Errorf("Failed to open test.pileup: %s", err) + } + const maxLineSize = 2 * 32 * 1024 + parser := NewParser(file, maxLineSize) + pileups, err := parser.ParseAll() // Parse all + if err != nil { + t.Errorf("Failed to parse pileup: %s", err) + } + parser.Reset(file) + var b bytes.Buffer + WritePileup(pileups, &b) + newBody := b.Bytes() + file.Close() + + // Open file again, read all + file, err = os.Open("data/test.pileup") + if err != nil { + t.Errorf("Failed to open test.pileup: %s", err) + } + body, err := io.ReadAll(file) // Read them bytes + if err != nil { + t.Errorf("Failed to readall: %s", err) + } + if string(body) != string(newBody) { + t.Errorf("input bytes do not equal output bytes of build") + } + +} + +func TestRead(t *testing.T) { + _, err := Read("data/DOESNT_EXIST.pileup") + if err == nil { + t.Errorf("Should have failed on empty file") + } + _, err = Read("data/test.pileup") + if err != nil { + t.Errorf("Should have succeeded in reading pileup file") + } +} + +func TestWrite(t *testing.T) { + pileups, _ := Read("data/test.pileup") + err := Write(pileups, "tmp.pileup") + if err != nil { + t.Errorf("Failed to write temporary pileup") + } + err = os.Remove("tmp.pileup") + if err != nil { + t.Errorf("Failed to delete temporary pileup") + } +}