From 53608bc65c28ecb369476e37b66bcf42867ff946 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Mon, 26 Mar 2018 19:36:26 +0200 Subject: [PATCH 01/85] update check disabled (faster boot), removed unused multiprocessing reference + added .gitignore (Chartreugz commit) https: //github.com/Chartreugz/TekkenBot/commit/1a24c10a7f27a23693b3ca8f6ba05c42dbef6b32 Co-Authored-By: Chartreugz --- .gitignore | 6 ++++++ VersionChecker.py | 9 +++++---- 2 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..2f535a26 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +#These are output folders, we don't want them in github +__pycache__/ +/build +/dist + +TekkenBotPrime.spec \ No newline at end of file diff --git a/VersionChecker.py b/VersionChecker.py index 17d64d51..862f8fea 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -1,14 +1,15 @@ import requests -from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze +#from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.8.0' +CURRENT_VERSION = 'v0.9.0' def check_version(force_print=False): - if 'dev' in CURRENT_VERSION: +# if 'dev' in CURRENT_VERSION: + if 'v0.9.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") - print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") +# print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: try: r = requests.get('https://api.github.com/repos/roguelike2d/TekkenBot/releases/latest') From 9ccc2255f963ed3fe4971f4179eee2121da4888b Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Mon, 26 Mar 2018 19:42:07 +0200 Subject: [PATCH 02/85] fixed case-sensitive link --- TekkenData/color_scheme.ini | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/TekkenData/color_scheme.ini b/TekkenData/color_scheme.ini index 6661457e..e2be38ec 100644 --- a/TekkenData/color_scheme.ini +++ b/TekkenData/color_scheme.ini @@ -1,5 +1,5 @@ [Comments] -; colors with names -> http://www.science.smith.edu/dftwiki/images/3/3d/tkintercolorcharts.png = +; colors with names -> http://www.science.smith.edu/dftwiki/images/3/3d/TkInterColorCharts.png [Current] background = gray10 @@ -78,4 +78,3 @@ advantage_safe_minus = black advantage_punishible = black advantage_very_punishible = red advantage_text = black - From fa94be1a11a166d36b070c79e0bc5b6676db19c7 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Mon, 26 Mar 2018 19:43:38 +0200 Subject: [PATCH 03/85] images sizes losslessly reduced with FileOptimizer --- Screenshots/command_input.png | Bin 251076 -> 202018 bytes Screenshots/frame_data.png | Bin 328447 -> 248267 bytes TekkenData/tekken_bot.png | Bin 5449 -> 4381 bytes TekkenData/tekken_bot_close.png | Bin 2671 -> 2180 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Screenshots/command_input.png b/Screenshots/command_input.png index 55069a431c239aaa389b7f0320a2566cc07bc763..2979288e66a1c490ce37ddcc2e801f85ce279c1d 100644 GIT binary patch literal 202018 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 E)#_B$;@#X>bF(my9Kf-v(>bf7x?I|s zp?>K0yyJ0&fQp5#%<3xcb)|pk!;bfU;E~Vk-Qn)^_EI{_;?l(`Yw1-}&8Y46cJwvt zA)`dix%uVlURQnXSUvwr#p-QS@a$^sV0%Hn{a$H%$GP;j&-$iq?s0#b_~N;?qBb|S zlK6RWWR+Uf6i8{4OgWwsExk#8*v|02qlA`rZuB(U*732b=$3(XBs99+;8NT$=YR7i zxIxW$w!j%Y)#ce_=Y03JxSgyphA?#)_%NAh{ZW(M^^pCQo$WH|+0R<;e0Sut({udw zn6L5_g^m}|@U=xowDiW2HE!kQ+Gx4;-26vI+(qpC@pC+LCn=jr3!C-;kM`o1^{*|w z;V)-%%|!YW6g=GVGJZORPM+mh!ladoxt{Ssn*~WCtrvXmY{1SrDP-MG3I@nDcQlOj z&<37Eie#h;jAx~I_YG-1cS_Tg5eaz8D_D?VQ$o`OW@L=D%Z%-Wc|-_h zE}lf+I)z#nqxk6h#dp!(W_v|&lP;+_j@gTu!?Vq7c=CALxYfN`+Ooj#N$69Zy;3{p zJA7OB1*<5#?p%$n8fJ6!hr~v1lGn}cIO#=)6NoKC8~uE6p}00Z%y{it2&A3vjR|@z zb)UxLK5M58Gh}hVjFZkX+Jj#0_4zRsN%Ra9Q*b0`tMDF^m7L13nScdiXv+c7$9rNo ziEGnJ;a_eL>;Q|K^+nA*MA=VaN1{3lM$vlvm5yOR#Pb*CNa%p>{{G*YV%&a@TT24O z5eWAjq!`!AK#w~%-K=y;vd$>B(wk8@efZvMhVRWjhC<$jy5&or6MkBl7nNg zn|ed4{iHZ#iDtV=``#$iOxMSZWGh969LF)Fr3wyf5z+UCa(|a(m>NE`qdwh{sLsin zn@HZ79s5TyX9nt~r^FC6uJ~}viK|R;@JvxM{J~sJ9w9beYq2;M$KI(ky_j4iCe^hS zE5JsyI~V5V_wtJFpISbv618AwRQXommNxh#OAf#E^_l&C)Jl4ZvjFakTR>w09fJTK z4BPPatPu>$_3ZjKuskv8X~L4&e~v!Mu%}h{ba&Cwxu>hB-*=u~ zp&HNo4o1uTbpr~duejK8pg$ZX^Hu3{f$#aYKPT&a*E{_@QS#l02#u6s+b+!>6PI2# zPLx?ae$weDT9&PVKYXsXHyWukJ^hj0l=+coB#%w2KGZp55t;F6cng##C8{x>je%UI zXBIGVP0c7u4(_WwRTFPJw|>jiq)jhc<>#WmoVwJ=e6q6hiCO;yXQCUQ-L#P!_PLdd z#wVdAGb|g0$qwV2(lloE5$3eJD)&f}ar9%fT&2Ct+o`crLDkVz>U)bs>p@*6NvqMM z0lt(pQ`3VFGjHOAOGY*x7Y440=c~D$@xh(WmCx4`4;G%>;PK7ud$`UQzRl-o_QU6J z$~F0<*+dH(C*u*xerO(t)c+2|oTtMzj3bmK*&? z`ok&D+}2y5(+NxGGWH-wvI~5d4-adbwwGEvi`uE`8t)ZhOXl9WlPBPxO|d!sYP7jOdBH5n0nlJFafdWPz+Eme#7ErurwAdmq16u zi+ON(SQeczG1^S9zWPKJh|TeeyDvvtB!bH1fbWGhyKJGr+VTwDZuO=yKcK&dU4SY5 zK3p`V^?gF#M{UxrxIM}(2k$Mf0rA9%+w4z4)G?6*rXiG+hm-KrZ-os~2eD;o>_Y^@ zt-W8p8DZ~@c3qZ1#BhW%*oQnI=P??~+W_Y!QvoAr~VWS!l5aJClgqY}1j#d)EV zZ|LAw>4f>@E#g#c6o=_hQx+M-NmXNkwCuSpKgUD*9ow_3J^crZ?^Q7%Qn3ZL*gndh z7WU6Ig&6ufnWpR0@crThc{EQtMDL)QWZAi|BMQvE0eDaXJCsYJhO@C=yp@nLG-#ml z_64!;6L?$b_77v4Ai{Es=Ai-ZHjZI$2UiLt1!%_g3J{q9zz+~QLwwaM4uE?akl)}c z?HygsdFP%42(B0Wi8^8yG0zT(LH`g4G_rgIUU8>|Nuxv2o#D9Ak(af}0q4kJ+?e+4)eK7<1ULV+i`RZHXPK$C||M@Yg=rBSX`@?yH40$ zV1?GshGhYSkTvUipMETY)e09WCN1(MrBaTavGyRW)Ag$?X00JeZWcr9=c zhxMh@eW%u{H)9tt>F#Xd z#8GuR@ZsXAR;6>?kAtz~uk*QARhcp|RJE2OG`+HfcglN^Usl{c&Qm*GH;yX3^x^8? z7R()+rK0XfpB^-(lJIdm-MH$s-!HE|wg-umhi@jTydTZ2U3N9Po<4`a?p!*r}!Zl+%yZi2@;T=;4q zqjuj`G(M=Oe4M&&%ze(j-e=ab3TZnXI=;e_uy<`Sn5?s@>i`H3fS=8atU@9Js1H?w#+OQPcZvai&;JiO)D!FmKS+ zxy{$za}j0KzM0#IHrhLWj{SMibl8)b1APjD(HVEJ^w^`)z-?VyTdj9e{E`m)r1@xV zpxsh^J6`acpE4Be=Z$-DbdK~_E7?mphfUz=U(+_3S>d3Xaw?;mr*cMH7G!H2(8cC| zw})t5t`1*A8kl4g{oHwCx1GJI0O+ZKGY$2;R zzJDLNV_Q9w6D|KY3cALq>j2lNR_?}Le>$Yrann-c06ziUi?lOxndOlXWFdjfcf@g0 zY-WOzrsZ+zALHZdsvA7`RBJF$K6wKAra0$jFZuYIUkk-`3l!h(PBJY%$a)w>CgzB1 zrgdZELikqasR zNupO7`bId0z{jze{CrM)`D6hd9TUuFThyZ{C%We8?&6p0P3`otii@KNt6eV}z~*rq zlalm9Ao6{-Yae&|$wEPf_~*7AP!1BdjxNKeNEt>;JH8lrMh3*n1B*HopAlSGgLNM2 z&%x(@4))LI*5AexCOk%iVZ=jCQzf4YM>=oA13s(y>p$F4MpVn0uoM#9SaCsprx9-V zd)l`>m5j|<$H|-(P5B#tQ@w=(&f6sr^)`z=UW*CpFvdlSL)@f9aJYxO2+kSMO$*bR zH-HUaA}G!VZYD@8)G~waW{GrHFd-U+dFw%Fdqik3v9`z%2mjikK2jS${4GWR{dCpw z75(n?g%SRFV%Crw<#obBBsJ*ZIfmi)aih#tBw&B?@z4~llJ!}zu5#5TFJwCVvRJp? zK`O7mF`$d86}$@c9Q+Vno;NTLN>0 zpec|^ofMTcSZ`2XYJV8gZFiF*c1j`JuTVy^*rbHbJ>(*?ek^){<19^My2b{*7Y95 zKuw)zLt~=ei5CaQifzrio!r8qQk&OJbu=}Lb`b&I1n)@niYrb53thbow~AJq$>>T8 zb4UN{Bw40lZRvw^!{U$nTwNW1b3u*l^GjK=&F4|H_cUFSLS|ai&8Q0XM5+sS6Ybfb zOU+M}N9FLfz^zXLxw1E;=JD|4SpIh4YM!Qcv(c19a1+o@XIB5+@5KmZ=P+R<-TD1m z*M*RRHBpc-0_0vFR>2kED){iAeAG>59vwm>(&!l0tcvJP+!IVcVeyctv~Rm>k+B27 zIDFx5!cu}^R`cszHoITbImOY`mqTQspU{y(YAI#AS%a!;BI)2G5S;a(T7^guAa->3 zVV8!EhtV{up5bTt(RRD+vyf>j`v zDevJ0NT?ygIPj0b1k(jUSSPlL_CbzOI;2pwH-3?OL{SlhK>`w&7$4NJ%tHsm8%BmNRIu>iIwH$$BP=J_@@EAb! z&3*mAL)8~R+;ML;;3Si-+~8t^)&*9db`dpa*Z6%tzYU0>Ro}360#8mtS91E5FCaQs zXR;hFOMeZR#q0>gi$O^TiZKQ2kzKnI<%k6RYD$YBo|Yt{>-L9#*x+?s!kiP``$TJmq{8@zq35I9&!yYgAqPZe*xNEX*oRm~IaRv)^H^bN$wVwUg zY4@A0k$!d!H#U7)H1aAND>zX^tex)_LvG6Vcv`9Sp-DrVr;1p-oBpB{+|U%e691Wt zBs3z?&NHG8O;rOf)J(s`V+lEp?LVU0_%sfSfT+HEl%`}|^y}Ppt&E^`L3GxwJLrHb zGp^Pa$x|5PrPI0Fl#Of!0-oRBX6Gqv*L7L6-aVZ`A3<84OLG%6mDp1-;i&BFOWqFF zNuL-W<)S<#L`KUC^^AqI8`|=@vt=rvB=>g6#r+daH|^{bWLm@JJ+f$g3TsV}U%fiG z5u9l~QpLCMSP-me)to2geeM>aok-k%HQ4f z%3NMTLnpniCE-^_VnfpdubLFI$B&}2r6<(NhIHOBN_o0oE=1!GzIMnIT%r!Qy4*~h zbn{4@p0~b^owin0&~sKhbUeQ#rfhh%p1oEQeK)g?D&o0uC%)FEHam4R5I0!oyinL) z-zOxN*2yORj77%Ud6^R&;t_+&+`6s5q9 zhRZPC>OXBh2cC7{cdR`Vr9P;f4ShQpIo;7~ya73jxu31HH>iGQ^fWd)OJk$pxfv+e z7n-|$%k%r#ums%0Z?b})gt99%NCG1Dq@>{6fr= zZ6sQ_Ka-g4##sw25r$Xh)7Use+|%7|&fTRfO8Iqa{Ph!f1f7huVpvS&Z7k6WxWj>R z;qx*{r*Cr}9=dR>`G-$BupHvX%lapYcZ3eY6!H1FJ7+D62LL%F9_PRZl^sJR#i ztL*z_WKVXddYZ;6xWJo7rb;M_nkGHQ!qS?X7eVfsgQOBaqCcpxgI!tyJ9hxb+Zc7y z;ND3?AvGadgT0CaVGIot1M~|y>GFte#U+c`zN}oT6Znw23G22ht=&i~QXSue7^!J1 zVYRtkW|^-iUL@1^xvVy21TfO@i)CsPmD5P=N9L=mY+GYNo1C+r&4|3pDU&6m*hXe@ zjMKS1$O@8e@A4y%lD!AMtz!jLCw<%D^RVP(?Lp3|a?;k?ugzf1z)tu$=h=Ju29t~`70fPPaQYLU}?%*yLZ_~+%OcfP*%X*~sF(567T z_b6E&TtIxrg_{l1E-p^Gk`!VfWwcl1J06cYg4T}oHw`Tms8qcG|5UTS%Kg9+ov`H_ z=Lxuv=3LiM&pY;9ep)811RkzVHZGfRun}h0fJXzi7&dg@GAv+5BrM?6s9dj2YbxcYBjz*lNm!V97>BWhzdFKt}i zR;kKdR8e)pc{&et`_k(^M^#^M9G5;{)!y!Qja9tf(`fgTqQ)X$@858kLbKR8Ib+;> zULm_S6V$Vt6-3}xJ`*9?tXnjwHm%Ig824TlBN$OxC5|Vv(PB_GU>^utQr9gfYv$B@ zDP?57X1=zw-*=07k@aJ9 zgjqm{&`yC!YLQX!`*RnGm0&8r?))Xqt10TJr&HYfPCeeSEm%Vq^fsF!Je zRFstsTs=&9$xV9lX80`3Gd!fok{0s zSw~l@^_91x^vl!AEWqiNR3n#t*SxAu`io-)nw#s`>sZ!KR%$%*Q|u;ollPT}K|_3n z&WGp8M!XCB!%c%p>tp#@QVJw|m&;SKVRF_*H?xqkK_`CXfPX) zSq8=>xWE1^#Tu)7P7GA5AHua8h@BKk!^ik6DR7WAd9)ko6h}#%I~DZ(5SK4ke|}v@ zqOR;VXL6p#_g5jFpY~8Wbh7t?FBqM);)Vj%+l-UT;QPFYi06gu0<-76$Umc>P<6Kg zoyd@^WeG4UdK3kI3z(<%kNj%aX8SEEv@-u4h!B)@X99yd_UjKfTgDZl znM&Td*lB?n5~E7=##k5(ewllF+Y(ow!@4?>THMx=SRZf8wCoVecQrgRh#^RARqmR= z-9AgU(>##(hesfz9IHT)v42N(gCiW9jsLqoI<$ByNpxx<|1;ot?6a#m_!WbMzRj{Y zk5ApWt>F~oVeYehVm|5M7|z1dig~^m13#IOElg9eq|DJ$euz4oylAbmU0`j6`0|5k zZFFV;cA|I<*Hu)4HjUCgp)JM+9(FU!@`IuC-objQoO~)|K+=tRNP>o!tBX9I^U&y> z%a~OK3(N|Bx)tr*So%3*)6griiYqDM&CE;ov-4E=q3^2rLq01dsKpd|6T+h?{=4rJ z+2_@iaVuJOqd1@Aorc(V^!u5MCZCqmQ z!S!CxkQkV%Yo*zrjqOEi23L%@!?LW^kMrW{Z7;a3u$Ar|;X1S5@U%W2vtPb7eb#;5 zg)cT`J2sdkxnDiV*Hm3L%J|5eTd1GMjRM_ z=(fKb?`^vqNo#eYS9n1N2aA(r3^1o_h(*UPW<~0f@#_Yh#sZgdTFYKvf*5FtIg47V z>hL?K(p6ky8+_DDSMTkPHWD3<+P<_F7~Www(&~}z7_qkDhwbVgRdx8qD(ez<@ToxU z+84#kyCaTeTaRIBLZj+duyazZl}izBQ=uP>Z6lo-?nsWO4gH4x)}f_oFq*#)F$5$E za3;nn6{I^npJY){%jkjoJ0w_j^-M!)6kVaq=Z85j#;ZHWGUAi8^b*TsM}SDLgS-aV znc`@wGI|@55e^ueta%OeSVc=jO$Lz%aic+pJ5i=IoG0BwcjD z>$qyQI`R2~TF-O|zeca4*J)94VMV2}eZw=uTzhl6rGmNSM-9OB;rG|5_<~ts`S^r= zV?yQrcv3816M2nwX?nm6&Md(}wy-nnoM(4MJFjJ?qrN8o{oa4T!33NO-0j^oJKGpPF-Gi%FK>{-gDF5HWCIz4=6^Ds&F$=LaqHjmks18Lwaih(%gtC|Em zE^KYNMG;W;%UzexozLrYMTC_u``dVCC{K?K;8-3FMc zZ$3o68Lh4I6`lLG2EhMA5J>c^Qa_I7cNTrc>&mT42idzGMO@0)vgEm?=);%ltw%Am zTe2;@D;CTf)GL(B0I$^_KtMq6Vn~3rb0iiN2q-2n_|xzRUN!@w7YHW1EQ{=(#g|+1 zH(nu7hd3}r8hD`0$yhg-vL@K}P?ec+R=7c(_0-bcP}Pt-`?Gm+^jmQUHT3g?RY%w5 zSrhQXI&Fs*>n@T)775*G`3j!u))waC z22N84WktO8MX5&H>0)JTLz%gU%Ie*!t>|EdmeX3>EXT<|rGN&jn~9I@ESd{;7AhO7 zO8?Vsw9%!Iy8=$dcpXscyzoEWX4#ECp4&SP9$oJAYva$XY0vzh!X7NTj^ml#ZK~4S zW~rG?1~}H?5yMn=TsrHg12+0Konm(f`4jN)5!rVC7faDFC3;EC9~G z5cvS|O8&=gP(Kne92fXZJq|5KG%^Peh7lYeBx;>f&{(+i=}cGOIrEk}BGw1jt3-??z{ zIOh&@@w8TH;a7S0E(jm)aNxBL%w8(6CUK~w>r-M+1~(P^RX{69kej}`zhxD5G6 z0Y=;Y-@LY00;t2ZQuVd&e-rRm9{(`2l*JL1s$KQpg0i|Qr|&w_@ezMj561Z)<@`tHY0TA@TVO#(tp70V-<CI;h zExezUy;;5KXYXVDZ{7je*a*S$W!J#!tM~t*lmD>e|Cdhwi;e%XM}XS=OD9{(K3f8o zt9I~Z-#*aCm~1!Hf^qN#!3G4inyp*6s_qy8TSOJCo0d?P_pNsb>;U8t*RGZ}>dQ?3 zp)hL8=BiYO^*;h8KRdsw|ErUL!JXf|1yvL(0U8C+)(%Rmt}Wh*(*Ky(-jjz&IDXMp;^+Y~&n9Z9PmB<1{3J z`wpaoO}r(*&Fclr}vJpZ-@CU;JH| z_6JR;R$6uzm4_ymQB9Yp-nfsK1S%33@Y~n@uHQG@fZ2SlBZ5tv;h-({$XmCe@N#Lc zi7n~UOi-*c=0#r!qaWBK+SYq+Gf2G8N zQGh%#rv2Y^B!&o(p0qsO0vg^&rwKeipD0+2)l#i_Uzz_i&dR&}6AB>LIO756(T8zJ zGDtn}$Jc1VYUiVEZ4F^3008ads&c>joUY0audP}^$^yfhncF7)tQUR`r^$==Humr) z!szU*w^rf(MlU2c641fxbs)+}aQ)FMJ(%a5t=M48V)AW8lh!#!pX2evwf`v0Yw?U2 zdoehdReFMYtk&`k(EP4`I=+JU%ETeL>BT>Gwx-yK&0yuVwc0Y|Wpon@3qbbD>!d-_ z#GHUn<7a#Jgw|Tn^Ie{h>KqqKbvbjRWcn4m8=JnVDS$Z+FIjJ#DY$~``WQCCmIL+E zWw>{#nn-JNt#Y3m#fSilAKUuQvgHsL&Bk0yHCB6|wsCWW!s(nbca!;jj6>r_r^Rcn zhQQL~Oys4BM{lLlM`2ly=W%1lmM!bKdBXzAV$@?B;NHZcvG4YpY>#0*Y&py<*M$=; zreoh_t1EU2!ejFgKemfoo(tlU9)S31rmcKNDIW60)}fPU_?_xA&e=YdLu0a2{)`fB z&-bgLl1M zWb5dE;5pgc`DZ#g!}UP}glgf-vd>hFNlQ*GxDh%TX!TJ9t_Rqy({>tWZ%N0o7}mSn z0CrLAgmK&i5ZyX|>D)ldQjS2|KRhRp-1y^4pk>)*t1V(xt*NZ$;8W~CTb#;cvbH>! z)QW3*Iw*zqR!Z%`^y;YM5!ds{Vrtcb%3=?gr9bS97l1OEWm^TY72$;RP4d(hOE7&~ z<@raDU6h8M4!%drmA5yfn3rWLb-{{$A$1f6K$J4ejkKT-46-a#>u$ZZR34j)E)aD9SX5&{&uewP2c)bPx@t+> z2GrAlLK%SEGxhCgEm~|eVE-ai4xR=uk`q8yZzB3~-Q$^28jv^nrx+lSN0u$^xXbg| zR2zOZ(6QQc@ip%ngTHo_ge!P(`QFD6>;U*!1ey4&AArYF^zq;qz}DhkOUejE|7Kv> z|0n&wnBKn(P+XK2pj9d8;KIuc^RE$D|ASDgmQ_lV*VbX~w|~Y3l$8^b>AbY&{d)wpMo*cj z&3136x7Py)(f__uee0N?o3!GbGjVz(;Y--Emqe0%Cno{(D=rS z;IwgiDLGc}xH{Ovkls;6R{q^U^39U4db)&S0`C6Q?wP#qY_+s>L+gYFD^?c8^~+w% ztD#}DQ;Cgwa zchz{wM_V8AgyILemuT zGYX#E6r8Ybi&uiaIngf;5UR80pP4^VRUh@ujf4+OjA9OdvN9`bA@!Ey+=FtCk_PFM z%O{}cNTadEnhcdjWF%{#Bf$D~sm0tK7E(+S=dnI#KO$QxZBim-!FE6Il* zi@GU)$LXUP6j5V+6Kwyc{{x0mFfi}7)GjaJXgQES2FKsq5fn&K*sgqxZ=VEOPyu8J z)IfX5OwF%kVYpwCQ*7EfArWvfRZQi2Wc3C!NTeyLG{^TX6Vf-6R>X^U8Bc&!DwH^5 zN)%Bq0aY$-&p}cFan0oe-J%U50Er-mZES-;G1QSElc4Wl)y{9<(YzFyHr(%Q$b&Zz zVt$w)#3_IN(V*Urh2A8{55n3Ra*emMD@9GFa>@Y~QBPs82rVGgD}$#4=d3gr9^%79 z1)FMZShfaNFQZTm+7~me*A{2-&c1^-%$=QHJ1fFPdOH}pk1i>9l5}tqzH*Tz4GUXn zo4x*>p*$)^J=(h)PJiuH0ayc=V+SrwMmgLgu5 ze0ttcA+av+9)wDrm44wwcB4fuBT;DsqqIHc_>r)4?KN%~Q%F53axAi~Q7|o6?|U)I z-VF4TbO@3Z?5#PoIw!Dcuq+uVFm?>_slMJ|5d*yw)A?&|k;G9rbOg|}^<~pE7a_yE zl48TrkSVfjaM5iu!lO2EC|6K(T55FL_U%lpFdm}gkBSc4Jt6;2oydpeF}aw1RVxAz zFgAqg7CpbA)*m%g{!zdE4AfxfXZNeDqcu;2GB79>?+^=rt?`d{hpY^k`4VGvQGA<@ zaDig};p?12mUH0`2AxeCgci#l^|7l*d0j64-PDqOwySx|Ak!>O;H1_JK@P+$OX?S^ zn18`Cu6|1Q%K9`al6vdf%lC|!B6?ZN1MYz`p)5sc;W^MSzgP~l4?8nYtKDoHL9v4i z#R2_Ct*5a!-JcHlWH7(xnm=ADf`7eqlCU_bEM0W1Kd%!DX7v=Tm%iM_(7?THtmm-5 zZbn_u1si#3Vrp$D8{N6BGCO&Q5Z0fqezs!L;V_m-X7G(UZS*y44pTXu=Y8qS4yTCe z_D*?F<%jMaKm0&YOTK0tD&jlOHd|3*xiBI7+P>Cq7ELB-n=5?*+? z3J%EInVYw9xd|~53aS;7Mp^c`@T)H$65^WKks7~pL9+caEaeoZR}S!5&W%^*^`ht3 zhdr~=zz@Tv*i}Va)I-}Z{CSHt)Tx7+ZPlA+)={r%8b|m|Zsyrdtzknmev`T!o3-<4 zx9AKl2xRZT>~IIMhecG#a;FA#R2n9yhS)oI4B+cWEl_!8GrY$Apx44QHD1n)&o>98LL2aQD4(OL zM`Y&Nks?lr2pYi_tZ$-9uc!Kz8>1^6XS#wFL)1RXV9S7iZYkGJ^xz?u8LN_?6eCT( zb3*8Rrpp);I@}x*#Lf*_7x|=Wwtjk?psARWn3UC>8zCoXhg_ScI}*z>i2ZOf{A}ZG zyad8t4OOU4lN);|-?W&*`>FBooey)~9O9{=e3%*kvqL*LQn#=)BC=IC@X>SA z%=M!Kb1e1fL>+ET@@{Va@9D7dV$eP}6;wYY#oa!{q-K^n*W^Q1KDc4qb~96bH8miE zwHJZOi9tRthyU4lPi_d=&xTr%WMiE?*gh;5w-E4^6FOmrDU5X-$)yv)7)5~_sWPM( zRXgL04|L3RJ&u{Kz=O;I?z~GY$Ez4qNk;fbk zj#!fk0x;uP#38mY7iZ@yqKhStP+EGO9zzb2m178Sf9MpP_6w*7RUTX}URz?bE!B^{ ze$(NY_sm)aA}?ESL-}Jt56j4tuC*`|!K%BQl!sFLjK@5(z>v+alO?1Kno3Y{5mK)b zWh4w5N>H_{!qcM?muv>KRb3+GK4z;N@#``kLaf(`BCB4_9)b(GS`&S!k#5n3s#>FG z=Zq>#sS5`BtL>6}Abv8gT#0YzZjyL1_M!4$FeF za&v*9=p?FmqTKAV$B+e|DpGFWq)MdUy59&HQoi0j&ew1!G$o`<(7kM}J)PwnFoEzN zvlSj98@-|nes)|VJ}*Ot3V;qKR;J#9H~3|6O&CwDM770p0ZlR$7u4sd(x5>4bqP?Q z2t7Y6;0f3;8e!YmAyX#7 z*1S5_Af3{+4!xO)f|@uOj?>j9DZl2mn*pFRKkH{ArfR1LhOIP+4HVQR7c%2tvOQwj zDh$Wg3skte+Vp9tjA{q@8rF_-m1S}2U9yN&L0u+$C&-+xEG&@80$Ap-6T3$$&?tgz zoElgoVp4Yr*pqjk9p&)C7q@~0E%fCeR|Qt!f>F0VnOfDh9kKCn@M?P1>Gg{?fX?5D z`Z>t_alSexfHeu9qSS+(6hI%3c)}hH|L&v;pslIe8o{#eC_9MAUJvih{D}GG|fu`$r#<;r>Q|q2#*0bDVQIm+6kYhU{2cOk}XeTzoS)%kb&H zUmTLRH=`bpsVrdF(`Iilq}fv?fwKPFf4|2@KmO9T*Q;IjhdYTPX(g?!MEv^v!rb9W zk$2s?q$>gm{l|y9bn>^?ePN%LtF+pk9@Zd44PBx!D1rKy<5jQXF;!0e>hEt6;QwOb zc-T!Z^y)Bw&EePxn?bJvvg8VOn303JA~ri0*>at5LSK(Af#}ECDj>xxsv>kc=Z|-D z^wsw_{A&UI{9^czH%aUqkGLaVm0svDS7R7-D^Z_DASFw6$HJUOhMFpHzndr!PP{@# zN6PFc@^B`4sBudNS^MTsBBy&X*vXXfW*=*wSU9WOf;x5Gx* ztMWmC??g^njtF-3;OzTqkJR{opA7rQ-6wvW@WG5m4dM?!*Q?;HL8 zaQyX<%ue9`6{LPR`gT+!^sTY=p)bk)?6NO znHYVYYfl`Do6B?k!59=xjqGgtqAtwMs$*$>5y?H1OOEjH`)1z(1gTDBVpy7AqQ{P1 zM+jP!g?DEIwtbbevtKD|O3ZIvTfm-R(c3P(*ZQ_kVmDLI3#~?f^pm*%lVpEcY@dy- z??v=a&OR!2nOqf?{Q|~zu*!4y-4d})tR8iTXV&z#u*kd1B;EO_ayIxuSes0zu*|pl z26gjZ)D!c=_{Xoa4U&D`l%j@E?GE1N8a7Y_bS%K9nWxDr&)ueY86w5&$!r++s%s4U zmmkV)qAskgM3j|Wr+-}QLSJZRBD#xhPqQr^3MnhAy8SV3r_=%-Z-tGBF2H^mf;`(E zC9J!$joyB#O;X>*`?>%b+9`LqVO0~?Op(I(6;!Ijb3JI3~$ah!`B}imB5qRthyB-=w}c1Y#~=YH-mcpZ1B&IX}Hv_ka;_( z9hBSe5+y+UUetTTuhh$Q=^O~NKfOF*^^xMIZYW4OC4GUXQ ztt4loH#n^K#*+zc(xxsJ&n^y5yQJHuDKp%wc2c!A*4QSH@P6a$xZGm(4nq1=#CQae z!?3I7?Evi!#;Hz`YTZM2u=?brMr8bC?n(+#__7f zR`2Cu5ii6d?zm6mJHB|tZ}2K<`*+Q!dWGvCCMij=_G?a`-~?TZ-2rEPD#LGw+P@P^5(L}W4D>Q=i$-VN!lh$@1U|2gDcK9^tLHq~NpkgPO8ynrr76%pus zo~nRmQIBFcmx*UOf7EwN&Vc0N6Y`5f1CkKdaha{c>vR=}!#FqG(tfp*o3-mvx3r;& z^}&eN5g|9cN(|HW2E-&+`846U{6CV*>HuI62BJ9ZzisU3k>V2lf~S5v?)%I~u))nq z2xGPciHnHK+gAJRV-&NhBJ}%6BeA6QmY_nZ3ipy%07R5)T57FPiUQ#tz|%^#|1DU1 z%>~nDYU!x;(J9XL?>8LgMq&Cup7!49;!-)lfj25T*JKoUr`OfjS-ocp5vIP+`q>5m zQFT04Ym{U$v9J9)s3ItU0x0+ZYt^+70xSWQevf-*TFjgP002VPM*skTkU0YY0EDa$ z0000Xk^=w$q|5~X03c)@0000X>m2|9K*&4+002Vf4FCWTvR(lI0E9>m005A(9RL7; zk{Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF0RMnVL_t(|UR3>MkR?Z!FZ%X}cRyTvW9QtN z(~?TXm9RNBGc)tvnYojhnVBjptFoAxOU%%uW_3$yNhNAQF_)wwvDE7BnYr`s`!A1_ z&Rnx)VF4Z<9y?2I{_ExL@slMF6g;@3aLJN_#lYc%g-e$TmM;@7TPi?cXVps4isix; zD@4nd32^lRzWf6P_uZd={{sa-L?HqvaR~(wIQhVTyM%aPiGbok;gSahi2Iia?tf6o zLbL?2^oMv*h%yf@U5q7cyOe_3!*(d>64gUH%a)6mEfXzYE?T)lylSNc+r?n}ID=TR zLcAQsmI{|I6QMlz5vx{7aUQ{TBrBGSu+QJSine%hx{7*Mt(2}fA=zf$e0J`G+vooJ>A815KL75=ADzB({;jL$PhY-p`qG6r&R?WB zd-2u3o`3oE^S}SY#h3qd^|d#zzy9{sSKhe(#(URafA7W{AKrN5%swd9`te?4yUHkmY%XhxI^yycZKl$d$C*NNA_`9p0e1HAc z-*0~Q?-%af{Mj$NavX^qM%oS&l#foD5nN zc8$cMk~sA;n?_>Oh%G9SSt-I#W8g#vPH0vNO$wn=E>g>+dQN1N3oS~affLv@B9B4h z(uei9Ht!dh((4+AW#^$qe9${s%)x4msaS~2vGyVEHAJs3v9{)pFtF{ zNK;NO<=~1uikMBBw97J1F6)wKobtF;8ZwDp?4c%k0V;871rBu~4s8m$-K`a%K+q_% zD+{6)Nr^`hHcJqw5cQzWAnG@XV-~75WDtdoVjPByB8RHLsV?*zL^egfQ$v-YTC+SK zb>h&jLYwpK%6zX*;L{6n3FX5kal|a4LsbDv;)%G|LOc0p4(0QWGTff8mlhag`7WIR zfp<4?c{u6R6ngc7fL`d;3Vd2Y)GUr$B_Wf@qZ7Ebg+86oqb+o43jKPaRi0McWX2_rS|xU69`1E&@S7m=(N46-t1Dy;F7#*%P{5@raBFaT9u5Qe zS#$!grXZ*nl(@L4Nrby1W>L~6@#_WHNjYSALG0r}xC_rhpo~LJ?MH1sy&!B7;SZg0 z$YLf@)Fe#VC25B=WEA3j!Y08M5iyIgMGd&urz=Fw8HY4&mlnBX8M`!Y5htwTa-Y1y zugE%OakH>7q^|KRsza)Vh^8ipt+qL?>qr^ellqpJt}di*j%nKxI&8~4T)Bs<_ABZ` z>MEbSHKv`ZbPN`oaTWJg1ytpJW!#FV3-LQR=@-jG;734sbcOf>p-H$zSJn9;g8+r` zXHD9qlQ#>71&&Lci5zT=z*QuJo!*zk96`qYL)39IF>6W&b*HkJVY&5JK z@o*DCH9t0pkF!c$OczyhM zZG2a$uhSte<(9PBL>sb>sg$$HETpiAdp)YPN$Y4t*Wppjq%0e=u71CEL)Nt}NPBfor zDISg(c2~!CSH-uNhY!`KaAr?Ud~12|Kz-_PeQHCA_py%hpO3ZUQomm{ld`qggs5aL z>pa;}Hkq^yhYZ+mDDk1rnWSxfv3opfnoinB)85&%vpZy}x5|d1riqk&C~EBuTe||r zR8$5uYwoGu>K)~= z-4)Tp^%+!qyea-ncja?^wNG_dJ=U6fyg87FJ7NLVzN+Y+B6%ci@w=75plN@pes8JX z>(TqXdaql%C!^eykh$z?hlTUHb=wn#`*QkF$l|ffgI?WJjh=_94T+d7nRFsv><+)! z;hpHnwpN8knj$}Iu|Hj-pKeQT=}w*)N&l%u`h1;cYk$!bGbI!)*%x}sPK{+xj%7}c zW_~f+@X|!f(Sao5*idS+!ZDPyZEFi3>`!iK4UU%D$I9&U4ZgiS@%0V9p%Uv@nFEK1 z2a}sxg0pqr`nZ0o#xvjOJ2;SBTkD*wb1gLar>b0=ngbK%w&9#*UteNRZ(^?A*PbyA zmDy2vS5JIbcWg9go33=u*LpTK_%=28=Biz5t6YbB;zxSo8|%HZRj$Ee3(n)rq2BmR zwPUW5DAkiO&eeI245tx?hEi*5-J4nh`v;ROQoUKjWTo@KP(v;+oowuwsT_Ri>*_Q-s_cc$7kR*EyOz5R(z?IAq6C8=L%4IUZG9Gl2)YzyF) zZJpsA-I1f?neE-d4Ncz1=F3jblpGpO?HP>i?u#6q$m|b4M`eTR3(!2U%9YyAKjlT8G{sTkFlM|V-D#t{% zb8~xWp)I(fInb6e4wpMNwgyj36wNmW`b%wNRjv&!fuB4GHauAP;F1FP0bP88%`!j& zXGkeOy`SQL-B<9_`wH&ApP}V`ME(Qt%!2}6N4WQa2mW8$K{4Jri`pUE2#GXII0&{+ z+aLA?Jb{Qev<0OE)UY3%!$QQ{hA;zw0V*sY7HDMEN?tOc1*julO5~7W2cjUl5KCx_ zU5p3; zIXq@?3k8S*sH~C0Hi#7~Wnc`G42M`O#_H#Ha4$%cmnYB9lVgjMILy!ENHzKL!a{|h zP$?9su+7g`aft*_q&bfDPoO}D)`M0l~ee=TE z*Uz7S{VarY;V&OueD&S)FTZx-k1t<&^^I$PdF$F=-iB~)p8n|L(`T^# zOMebW!%DfDAR#44h$KdtOs`Wa%xW1r@#xJX9D12uCqoC_q7;KPMunJ@Xe44SUP>aw zd#Pm-wL+>?%Q!73<0N=-{4xwS(2fW!(Tc^oLV;Ew)FB`oY;g$KF!1O>9ngh-52=pZ-4Ul+c*FABXU0Z0Xd&C3K(Pp ztwdnrs9MzK(Fvg!Y+(l6h@GHG9JR_qK!_E};yij`*dmGBWK0esNCpKU1hquS`s?{n z4ekXn_)6dem$ncZ;r$aZ&@Bk)0#*TRP!csjDQdA0_gWPBa1<&uaWF}NPD-`KtTINX z0u)9`6vN{H36vpA7{z!B&ci2eD22M?q#f|XttkX=yn6gO=yrr3vQm*T(BCD<$kX5-eN+c2F~_1qJaN!Vh?K*epgd zowN`?0_w!G02>q|Y#4=Uhb&>0Ko{uWV~b9Cv5SK=&`l5M1s+WSPKJ#lKOPFCL0pP8 zW;xon1}!vm`E~`}m2t|7J#s|a3BJm(tqQ3tgX(g>sw$`gCyLxuXTl~$1P#KV5qLxU z@jK8yk;z7$$vCAYUO-xkGZB+0=aJWkNh6g3Wrbf^?o%{IwXJb|d(zNXWbVtFdo$*q zw5c_&s}HNI1FG7f3gk#yL`k!-KB#O6De;b37gyqumwFXw9)5EW1q~p`=^$PZ5r3>a zyJC%-hy~FVLL)Fq(h7qK!7~5`KL|9%TcwmW36!ezqjLNe^3Z;}I?t`89|{D*>%(t& z9lQdbj-MJ<>^2u}OlapLs;Pi%z$t7suI@6eYEUoP5HrjM)!h!sfLpe!#D20SaHuA< zkhM=oG`(&~r$f+eT-9t`GaJ+GDRphmn5QBd&}A&B+K@8tE^#a*&2tf5lR1Aps5)L7 zJYE~xoVCrREO5@+xS`L(&BXP?enqW*MY}@)>fjJHY%6tcDRCaHiLQ-XfgA{@TD!W& zSUBLdAu zzSs*D3~2``?0R_UyL>%Zz-OLn!uZG zmlEw6i5PZP#b#2DEx7>v@JL(fuBs>wx0Qu}oHmzgBx)T`+J_R(7N>kTZXHY5A(Ot4 zsW(6|lXinElWEt+^2qvJWJ`H$Yk6#2ReWnj{8)1-h;q0-yRAI(SVzT)*3v`una!n< zZ56Tgxgg*)ny~Gu4DGH-LV&>4+N|eDeewR9#HOb(8MR&3!J=mk80e8wuA==#GLvo#)Ah!D~o?9Q6j)_KvJ z2MOS!{k?HqZA+Q3Jur|wFqk?tOmLd0bf6M+ra^^~aytM3`RwaYEWkpQuE7!;Ky`dD zd9*J9^MEK@ftH>)8n)2nU1;bI4~OmHQ&YvKri%fL*?Jew@9B%<_u11Q-PIp?bZzeB zbTL@6vpYOn?|o!02l>E4BbCnaTKCq@$c~=aT(iHU$TD5;-9Ma!cEFplYWG}&=g?>x z0W8hbx`3qx}MU+ATGqA(>!J7oU!AX=^Mv{>& zUm;nxLP}W_%IAo2_ybFR^a(kH{Ig6%cd@`zSj|*9pTps)gL-i3!DY0wcstA6V24k| z;Bawg@r(>xma!p?KqhPQ!DSEw1nL@?Mp`Bw3+G${buN8#>Ec&F&e;#|o&V@AkaPCkPtLyc@tL=; z^T@gI)|GQ_oIm&a+4FxnbK#Z0UikA{d>ZG7wbY^KoCdkWz(F-`lN_GGj!7kvhzTTcT|vGAuYfiS2`xI12K$^;jZkr5 z8z`dWq$;UIBNCHpghDEY?T@MfawHO+OsYZPE|f&zB(@6t9&|{sfp)}@44>G+?IKF= z5WU0(v6zs<2SlXg)PLRm!uvn}@b%YkzWeU2kAR%>UjaGSu6}p(+TT9?+%<$UL@pvdf_gRbLTS4Bd`qEAC zhQ%k}U%&g0OZRU4=Jy_p2EPx%Psd@4Ur7(P$`l$-X5rnU5^FiBRSo%ZN~s)M@J}I8 z$R!Gm3`!I_wGy967PBkDRyhn4vCBg?IgsPfN$eUi7-LqT!!3q(>}p}iB14(DLtgCH zq+F`BM-{bkpa}c};h-3w&p}B@#-u2)sRd50(4i3m9u76?5&8_0fQiCykOa-rBConE zsEy;HW@*gErJM>#02+aI{6+}~gsKog4w$6EzjX=zFbqYiLNizB)}bqm{;NDh6^epJ zanjCZT=KY82EfGa9Kx#?A;23b0^qSI(08P)5yGk&rE55!L4>;;0E3RQMyQ+;|qX!Sn;OQs^ z%wQiKR#cU7az$?Z6qKT&3IQ!L38@ApQ3-ZDc)D4fu*=eJc^2OAC^Bw&+QlX8Qg{Oe z+}gs7i$kB=uNP40C;%bQ1+YQ2pbHEGwBRYA1jshPYKisT*)hl@G?G?K1S^DdS|spMY{KxP)Fiws;Vb!zVGY z#qBsm_Z?Iy4=CY~q+NnT^y$m|3P=X9A>p7lix^eKt@vla>}SAxp|4M`iF$xBoI!0d zv$))^Y)>0eTh`6hg*9MIsZW8xnVPV=CZs}_0==lNv~jS+(wfk9XH0ELLt{)=7gmEA z6<$T!E(z)LA(OCC5ag@H(;YHM2HwEy;LnQo^I0qeeiIXMbR6pYu<*WZe2{fKBjIq=g-CU+e_@5Qs#9@ z-H?xKHW$?DRen2q^6xJ5 z%q7hWS?8W||Hh1MHsctNXh%cZ@sM^y#s=H$D06n&r9(m0+N23FpR__UU3RX?SkPt@ z&!_BLi+!82PVCGk&8T5Cq8sq57K%OVGxmPJb~LC5U1pQkJ>|h(p9Y56SmNDR85$1h z+MTkE#omdi5k2+&)v>K*{z05{$#4m(8I2luRfHj*EoFfgyR6C}Y<0@#v##N=37!7w zv;%NLh0`hf?#l4STmZ1yRvsP*>L4G8<%OZz6D_&z<>5!W%742sa;hyipLO@4JrTpY zk{}+jq1b(>HnBDve5f_|ba&0k*5b`2e$WeQA}M7(vndkJx|Dq~>l%z(M-uiXmue_# zN6cnDd+XBca=|TC@rAO`mh$+H>df})#Kwx~hO*GU`t;$(;;FRfp|*-+Ev3hsOV*bJ zcT^>|R7BSmd55Ex9p#}-<-x7x;mu{?^(BFQ)zLjwiR~4!J!Os!Mcy5y_Gr`|52}w< zJC9Y{Vi8NwEf0pB2P+-xV;sa1OL{^<^MMk@!BV};uJm|K9+zfYQoJp#0B>w2iN~cr zSZdf`#Ce@6kR}u`9j`F`s?{;mn%LeEnd->=u1){TR_of%6!qzcQ;#&HUTW5X5YP_# z%75%Jzc%RH(3{=Zot$iqJyos!O{*4teOO|Df8tnO;*q8lc!M}Pn0lxo^>}Ock;x)H ze!sT$5A*HEN7BcKQyUt6AV*)Zb)v$#r#rT{H-@hNP>~58{eco2%rjQ*07CY3#ddZ? zCM#X_QSEe%8_t0Z;EmBTdvDgfzQGG1ZEg-sp>Ty`Q*+?ZP#WfebB4=oaL#_TWF)h; z-ZNS0*odn*98S+SxHh->5A`Pz+uB0IC6#Q7L0wT)NU*Eds_eM3udy4r=efD?B0#z7h!PF1#&GZYCLdU}w$8KA z64==r-#eI`Z}Nk1+qxphr;8rjP`;%rvcB23tt$#t09pr!6Wh8&kIt1nJexZ{nO)!F zgJ-~%gQMxqond$efB{{04C;H1BgQ%)Iy1q3y+vJ~V@U~^m^DRLXJ~3T9UFX5C zx2HdTe5z>QU;O2KtLwS`#H9S*L2%nH@ z^79o?3ZJE+v`ikCN6sP7{E)7p9h70i(kM&AIHUk|3JVm1LIp1$k%07qtx!P15em^| zBIocs==cc*H0n$w(g+bk4Gs$^+oLQjPzeC7LN#^@3+W`bG{Q}w#ty(EBK%MnAANmb zM;fDn`hp>dG>9}*xOV)|K;5Ja5#fR2&+q6$&&3`FKaQQmT}SH3(1ym_a+y z%cUHPM5E*&8Nh~eIFxT;1Oi3)0ej3pIIm?x)D}ZYIV(B!@}(+;OvT?0%)l`G*fZWy z0)e)W=a87PI&cnu6@~F!+yzH5N~u*cm6}sxtKc+m?R@5)-<*B(&5!^3-kmdNKEH6` zt1FkkxpDn(pWOH!$hr0DKW}~V56a}gIXAw$eeIi1E`Rk2gmdY0Le7P|i)9-KI`}cEq>g#GuN-#zO$*`>ihiXoNt&K*b zQI-ZfNdTH3I2w3D0PSDKR)sT$PszL`{$mejt9$=;emkAKy5I}-M_yNUyq!dxiE)SX|*v4$~xJ@3la!H2* zJ5Y^R4-^UE8K05zIk-zFr7fxgV_1HM_RVri@<3K$tITH*hs{!8CTv3gSnAeN+6RX$ zZ?l+P@#@f<7eGOFHJ>AbWC~H0MPA_53GGUBzF{pf?gc864lZV;oDU5`Q^G&w5F@2u z^4XTMF;EKi&bb0$3498g#Ly8Qga$xO*hj|^*r35(9F+uepdIv9VG;tH5&Vz?OK}S< zL^&Tw00QCBf*m{;J7|oNI=CbgI;qHasnLTMdtn9*`u8;Q4O=M1qZdT1sE3|wk>{hk zoOQ`j5;8#t+NT##VY4{xkl|9oCM|Kx7yH&Q6;NRo11&*=C~lLW8;wJr0a1$>hJi*9 zHa1=khj<*HkO2UgktnAGz2GX(9v(AjGe2(4sVM+Opdg$_Pg)`3|KAtiyI3Fc^&z{KZioH#WtzRRI;=3pB!2MA&28;1`c3 zLK|X+@qn_&AsKK;dTpY5&GLH9vQBIMd|bCVV_HZW20Sv*WyG(*c5PfY=z%)&DizE6 zJzSqtI_6h(;a-nydx>LPu>jfJ#Z zOPu@4ecQ{to3i#nzj8;Z=U8oIZ@F(aY3OltO=iJ(M7OoXy}Qgm6*Z1QBQ`Mru&XRM z7q{&z55X|oN`1I%W7a+#(hm4Fy&n16q#3cX*ae&n1~t=h%es^mefo{Xo?f2{M45~l zVU?LA_4{$PFJKr5>BbVa*_3rdiSI~5@}bru5U5(8U!qvnVwY|%@l2;|+sh-^;`Z5$ zV|NvV5ZhfH-``NQt13PcF(UTW#(zHA@OXC>d<8bZIma5a01t>Ym9%Xx3!=`=C0>+V zm-XTH=ZESZ>#o>elbDQ}N8rOE-(<=)nRaz})RS?`bk>KM&HB2$+P;9U$*EY#1rIhB zfiz<&=R$dOYeiynMSN>j0l#ip{zzMAZwx->{Lj$3lR zaoDUnzO^h2z`!%R(vqD;+HlD1wM+d0)21Z1C8_jzjUI<85HQWB-CNTthfV3QYu$F` zzGC%}Dl_O3PkOx`!}g3~SFr(@aoUwGhYIp}vB|!?dgf{>x)0yoO-q`iyeyo#2-40FSXmzLp?cBw5~Jte4Y0BI>XwoBJg0k zJ^ez1^;lh;0K+mir<&4-YC^!w$&vKQ(abYlWq<6n^LdiPgGqp7s?xcoHF#twMPt>< zZ1Z)Vy*;trUD2KG;n8wOZ;=J^+25Bq(4Rm_XlJI{HITD`1l?KFV9vIwH3ZCn3e(l@ ziAonxgu(~=lMoB!v!f$)U@)<@J+#o|TUX~iHCY7PpcjryfCo#+BoQ;!Zd3?$JTzVW z$ZW|%qj$dEv#mX}yC()Xt*dnp7n%0=B=&a4c6G(jhKULX$U%_k2=^Bm$I9&+ntX>x z((nwLG*V^2m^v>+G?cTT$G@>PxT`M? z63kRP=W5*thmv3zU;~~FmRh&8hY)<_y~P$F;o;emN7t3k)w;HK1a|escK0U;JpE`- z@TrZJPi&~bAxwgRXJC?J6WL+FuRVnGFbtwKW13*;n)#N%#`e%ejcdHxwXK_^w7n-f zUgI7rw{PkQ0YAqkvvZA}scPr(sqCJC_=%aKwN1X+2H(l4;)iBRwsu9QYg{w6u1D9E z;qb&{(PkQx<_CMQkL|ifFNA|%_~>xz#CT?++BsF@#$Vy&L>Ai}JyF1E|8VljjTMy1 z0coHV9xx!m5|+C8>HW0D{(}z+mM(=-3h&1uP2ee5`XGW$zoFy|i3lfY=o*{P!>48V zp=E4znQ+B2;mYN-<#Q(d*f3aykV9f2ax7m#+F{uhW)GG;;m@#uRYa7Zp^OR%hp&Nl z=w1n{4Je|@Q6U?gMnGcPA+9jh{D>b?4V`Bd^1(1elHp5Yi+zx04bHEWfH(ZmHTF2^ zGRhtCX&f4swtAI>jUOYWAmA1z9E!ZfEDcv!Kts#KLb*)L0VD(-h88~OvwDq!Mz0Z~ zWNTOrs1UaRGq_7Agh_}rd#_**kbN zd8U8`PEz&*;1N(72e#pUoqrR4u?+c(aW2sQAP zi^X&!Ulr=a7B_-1lq8U9_@odkj2bk&h2&D&VQC^Li)QJ_q*_j96aS|e8`V(}Z# zz4z81F1&U6llT96_w3m(@cUf5`t9}WfBW>4e}4M$-*12Vk2|;jdFR$Y$vG^ObNlL7 zx2}Bo$%W58xp4PKGi8+)h zk2++P12Y+)Chk;5?TVn4!|h=!6a*1T92yaJ5MF~MWRXEHev{N|l(@7amrjIzw_Y5v zaoF)0Bou5`jNd2?n4}J{M@{Sjifl^s;|16PA&eh|z!ETnLu_%z14Y<5_y;aZI^+Qp z`iPX_L2Yo3-zW)LWmaXOS%E0v$Gl;m#=p_bpF*cvVB(+!VaOy2nj|GYRasDjsvr%1 z^cs}nVreCfM2M%ORa%AjvqtA`sL5Rk{R~oT^(l|^?1~yFvJze00Wm)0($wN zNPuRx(2N}z17d+mKpmXHK5m4C;3B+E%E{ppZVa=#;#Mi2%t7S5iY#Sy2sTN(EMb?S zXAe9Sd*wNw5}o@Z7Y7dj2@C)Q`~WjJ1W-W>(FM24^ZYbjM*wT#DX1q#_Mmw?cqx?_ zZ%6ZRa61CMb{yK2G}H=RcGQMWKTP7*&_F44_bGj3qht{-;h{W}aQk8n@Q*4Vzc2!4 zASD!IRuQA4k1e|XI1^;|0s~$)3J!gGU@2h{139R~&gR}=$IB+GAfO;Tnx?FnMJcki(55E$Z^U7NjdKzX{WbRIz+7gDrVry+k-4xR`M76bHO^HWd?gtwr zL4AQ=Pcp&Nv9-w8pxJn-u!*17MAM4!Bj5)_;Li=l;7^Y~H-0q!C$%fq(10{e0bV4+ z+>*4?tQfotwmG-F%CF41IW)B)q;8LC%kg(~%BuW|EPMj5#t9E$?$HkJf|^RR;Ezc>$h&kGx8=vc+7my~MdWYn@9P=i?<5V<4!T z$=DW3yp-*!jX&0vgJA}Px=QWpMvD+)*cWPl%jInn%hZ`EYdHW{}aZp_eJo$5Gh*q96KZ79ZeG-|}*Ov(xWyg1bOv(ZKr z7>gSBRmIk4eH(MZ4OthOfdUh0-%Q52t|ZvyHw;ECoqpZ6^4Ouq;%zm_vABIc7ur#s z-d>&DUR%7WG`3J00d;_!?G^FOrI9Ck>rQo6Y$}iLtIbA}fv{gWU*exD@ufnVxL@hF zOGl%&p|HiKFARnqK96o&Mm`-DTg`HtiF4W2+md2{$LUZzY%04&zAdfTo|gN)T8~Qu z3q4fl{C#h5Q-8@!duqHr{quIui>;1zo$0+jiT!=a7b^;%sgUjJj_&M??&yg8W~v2Z z+|d~!-t;GaFd zFKT6L+Y@u`$@#9#Gu@RBHKjllh-Ft7{`B$V4atN3iT%CtjjiE9^zUojEY*`jKo090 zXk^;qK?-EHwEywFJh?YzXLuudTP(+LbY*y9|UJ9Zt_wImb(_@XY@H#PN~L zP|iBv;Kq4iXA5z5NO3Xj5wd&BN7o4cx2+|7@)rq66f>m0dltp)xz1gJSy!k~6iQwxoWh*1e-EwyOtRNlaC{ zy0hl_Cjb6{1X_XyZ*2DN>WNO)xB-Lx{gFL=ktf!b9vVq+>xqq3ySH>kcK5{~pOe$Y z!<9}TgqIJZH)n-mHnasH7Hn~;r^LFhIk0aiwRbQ%RAC2iwsu7}w9=TdnL0PrvAsKT zXgm$itb=FjT)1&ZZ)|68Y+b#3zR|s-H?nsq0rRku(T8SB9-7UankiXm4Qy%)J~CH| zfO*z8;c9pf+CP~+gjcA;FB9U0wr?rX$M6V9UmXkve$i zfCnpRPCuQ5f`~&*DOAr7I>L=q3^IXy_>*ksNBNL&==L9mpDhB0@UwIo;fL)|F`VS} zvKWg}qF6=w8QS6uiv7qTepU}k;zk5H2cBU|2;{Gk=B**v&`CCV1|}iN{E&+I?;rs- zP=Ex*CfkssXxRWd3C}<^pix0SBT#`{Bvc3mL>ED!96NmQ^%Md{l*R#m*b)Ul%-Er^ zaI0jL8e)@ns3im~>?|UO7AnY7{t!?No36uzQz%g96_9h*@<&!twz5C7wU%Y?z%MWSQfp5-V`u4)*?=D~Y_Tr^) zE?)c^o%r)-KfiG1^Yb6xJ^#TSAm_|GH$Qso+8OZX^rdreT|WETnRBn7IscarFZ}uK zi+_6a;vfHf<(1cIHqPsB-#q>Pwb$Mz=e+UJ?Kdxc_r}F^HcKfQHpYw>NTEPW^JMts z3_AmgU>_mGnLG1nP*#T~jtt zV5<&XzC;spZe0KV)~5_PxBhwe&cENg{qJ`_{RfR$yY|fw3lDtp$%T8jE`D|!$hpXn zL#qya{>9ZVzPS4Nmsjq6b@>)QR_&WBAOG#zt$*CS`~CIX-=DkH-`VUka2_LP*GRlZ zT2}zJacHFoi;||?m=t2{IJ6RvQ5LoFpNShQQ}{K z1Y)5K4^4~#W@MCyL1!I@ykuxdn6kjGrbP?91`$7pr`W4352#DL%AgUbkY(LUpMi$M z(Oeo*iqK5S9GXtUFHT^QQ<8@t*d`ZA_`z&A$@9jcE_7;WKo|59wMZi9)?1~1qsXbD zo-xkjMV#n8YYXWldiFX�p7@_$|nRS4Nvr9{Z#n6B;8xu>1^-I)g4CpJKPX)TgWt zYjPfRe`$=IUr(d*B4)gl6b}U<&`n1GLK&wV_oDAkBj2?64fB%@4#)wtjIw+h3rh=? z2!S`esZoYErKAL!0oA}5=;)&XL>j#SPIIaXXr_%>jJM!bgOa!lJ$~LKcyR>Z<`nwt zRtcJoHp3_UfHVY3qFSn)jf=yB_%pZ!Z=e{@21Xhh-p2R-OWYg?0cGI~O30t{Y_ zpA>|X`19dk0^EhGj9b7Skp|5GHqbn{i_%%xw~BEUCc&k;pbAmsl;TpcLso{rnwzWe zDsUrS4F!r^GVJ5_7-5epgm8-CG#6Lqk*BO;B9L7I8sQc2`XCMI&MCurJOcmSHI(+( zmUK7NPPX@LYwO+CldbJ`avc^yvvJL6P&pn{>?w0^D|Svtw7pJggKI%I&GpY8ONw!(_|FX=~nM8^T9d0O5GC?ZI?sRW)t;! zxV`1RZ6(f)S=*pb*=mz^Ik|16P6%Xcsb^nxXlsdkHfbL6tC}ssPA4}O(rqj8ZOk}v z*kTj6Ii)>50OuG1smQ%O|l^{G0X^5KwfM_B-M zPG>zEi(S~6ikn;Q(k7b_=l51d)@9v2KK14@@8&Z9_R28a^4wUmd9tr|F6-V< z;@e-Be4@MZP-6zS?5>IdJlo16b6MwxBHvuvy{RPdNJsgL!;O1tk~I6JB6_SbGnI0( zH4mKY%TjC8p1EA8FJKsonug=n(S&PnP5MAn*;Ljym3D5aOw4AiAQ1L<*JQU>C#KTA zQymq_uy%WikXbb#4b$f4oxnnU8)(5*zQBB=Z=}q=wLNrX zBzh34u!2uKOkL2POc%v2L^_?W4*(*U#X zC_g4`uEsT2>jqa42L_Upm5z~88`J^JKs8Vn4%g9q9>;uxZzyM*s&F0|$?Wcp!!|=D z7SxOz4-Kbq@7j8Ad)fqnpx=LlwQ601XG>df??7T>TL{{L$IzjN2f&HGoOPta0oagd z`Vxbsc9?Bbd+7K?(ZjR3b@g6wXiG;J1j4;r+wte{oSH0pbZri`&DMK2v<4rU$)WuV zEy2DL+gzi6b9;DeCr!mcGa!d;Aj()~Q%88Z&eNN-K{W@4Q`oj=O!F;)ZQaoW!^y|j zm#wXJZEg>3?F#Q3N**3d<6cyLa;608*xnlhc&2Kc*grK}0_}`fI>xIU2S?NUhm-IL zF5wVwbZ{hfa;A7gqi4Fx@yJ~6kT1r9#}(f;RK;qht8A6CMd5%kw1xq;%Op#dVGGZYY6vro zHwYAC)@g@%aH)WeSfhp435e31~DO6+@srP0L}kbY#@!QwfC{uh;+U zb&vi2g^zysr|W-y^OHBIdgvdGF#YZ(sc5E0_NC%9U5&xccgwHz5=}IWxS4G}!*=AAX=3 z!_T6Ea3~fLZ1_wL^>3Mi5F$1p?S~}?;3&OVtW(I;28B#7=V+^tYUOgRLZMe;t5nI= z*fFZ*CN*bNaT7V?uGZ>`19qrPJjHt`}f#bwQsLq``gVMgd7BrbMNkd z@W{Dy^ZVP^zvYp0>+>8S-V^jz!jl)(^v#BXX*zG|Y@T>kyGJXqKQn!le@dGpGas z3z_6JR!uLZl#W?mVB`w%bXp8eU6^#p!xouM0S^di92$1iLa&bCWRU{^cm*^G9Z&&a z!!K+Av>*T*l~@ebs3jt!90dyDC8b!59yuRcat@72)5$1}gWLHf4KgkTt&rxFm-+i4ps-Cu7wBS<(#mWWO2~jc@Bj}s^!Onke$h5mWmV7$X21+CK`DHm2bcH^N!G<> z(QKnJgAJd<85)f%`EC|~jav=c(V}N)Cv<^7ijNJJgG{{I0-P!J z5KAh3ifX^IEv~EaD=NHl1kTj@l@%TiX8@jZp8_1BRS*pL_aGo*X$$c)qBi^pcx9Z# zyED?rQ8~<$woAiC0ThIj2;d52!aodPDIRppRkk!#Pjqx|+z>Y`#P#DLL%&nfQV)pI=@3_IS7s#-N%gxFw~EWjV#NwCI6K&B|_%au9z+k9Z7K2YsfaBU zdB-BgE#sHpK4Q??{H&web#=wrDSV)czZ?UR9kL; zU1E1t^s(-WpN%#gs7vjtib5&7YLd?m(g?IoIUfKsLCn5X^H5vvg`xU~J4$iOq59O* zy;Uf=u`IZ`EWA(>*ihtsxTE4{!;O3E(g*4@54V-z(OYr>IBG8I+fWpkPJ4zz#tx@q zJnbBbXcx*t`)jjX$`hjr=XlDwtD&SgVHk;8H&?_8#9l0U7)M!{E){-uSaM#uw|1<1I-*XsjjqY_0K6?dk*F(S4nfy`ACT zHR~U3N^frtAa=F}=Bk|=pn?HP<{TYPudVeCm(g?@*yiwHYF&+UrpmsvBYdDQacZn+ zw$`=K;ypf^fzWn!M`x=YGc~T0Y=N&mJ<*|3J4?AlaOR<@;`I&QxjOfb&hX}z;NITY z`dY_^TE`>Pxre4oPK+1LRugY_cE$Mo3<~265CzO^YVohFbx&0~HZ=PW4JEPdFR?;6 z3(Wz3T-j``cOYk5-{=Q;jzb#F{&n@>N)$xd-51-~43^oUo%PM=^e2vvW!Kfa5vX=&cXYlvFyH9Mjk|lI zM@CYcT7%mG@#IcbyZX77J&DMF@5^etRN+;TObQsu692`szm)X`g`PaAj z0hkk0MH^ZJ-6d8u03>^4rg)*nzpF2Ha*_s&oti1x))ijY=-tv8hG(D}@CG_MIbDK7 z1PU*-1|C|QgMW@q7C}%`)sFom>4T%0!(-X4t=^4|?n5J)W8);Wg=XKTw&3yUB6#NL zSQ^^d(iQ;ij!zXKwsnROcm(!=tGNcxLR$dbLK~njAcsi9r($@Au#64A-Wr)?=~B8x zvt^dEMWt!f8K0SfYJ|&|(Hhgl7-9)rv1pzZK*dUEL4*KN_>(+u5GeeEf*50n7DOiO z{74r{>9BpA=No_uQNtpK*y9!}WM}wf%c@nhBpN^8hR^4)6b;R{;Rn32(Q7=4Xo0mK zYvY4ih<1LcjfSg%C4dK5!Vf3I7M@vLT8;6E&aaZ@uaV`grfoqUm%nDwLV(bZyn$q( zCKO;ayk#lJ73WZ3d;b?Vfjo%k~ z{nXpPf9d?ouYLUL>03N<7ANFfq)g7m%imqT{0(JtD2?;QxsN_O&yaKG-H*@Gx@tGi zz76DDI{W4YAcv)KKDzMAJLg}1_0peTx%%4aYp=geQ*mgl+Iu%oe|YoFvtORRboG}n zd%Rxq3CqSO?qLn{Ge5LUI=p^@0tVw*}7G;`1n@Z&Sd0%i_}kWa#?#7@{M2W-3s z%FLMMLbqPx(urv?XtfAuJO+t_AR+SU;S)j;B;z$mEDB2CpnygSeTt28ny7=j>}-($ zJ5A0J*|61$bTXk_%*jM@xmae9(X1P*vM_9x(J(WaAZVtQpg{{@hEMWnM8sahIj#SB2B z(ezSUmLO)80ul+kEMx-tgt!sa0zc3TPDW^|46RbY=W`f}Xw?CfL@|DKX?_G+kz1Z} z$N-51Tk$OEkkXuTEltsZPq0neXm)-SuRwK50EUc<%lVX97cJOT9#9o~X*DxcXromM z$YcCqDoQoT;jTOf3_~+&3eYwX1uQ{hG!lRlZ(+MGj zIy#S4X3qI`rt`qq~nTKEFN~Xp}%yAmI4!~4L33%0O)*`4L{k}1!c?@x zGn}9&X1H|#Dw5P0l65nJPbl z2l&Z2q$~j?qNU;3z(UH~uz`6Iqp-xyp`IThhr@)GY?HA|VE zWu8x4m~?PcnWCoVb*=5|w`Z*z61s_iqQ@y}Hs|+yr0bH#iHK%Aq!|vX+H9gy#quKQ zk|v9w*Ue3ZHT@p0R=>JTwKP)rKcj{J8e07?zLozYwB}zT`TrwU_^;9Y|CyHD*X5M- zy5$fKVm597V`}wz3BkXWtCrOn*R+Wz-A_zuWn{@&|n~GhJc9rg`iXW&?p+o<4U)8qqz|#Y@znEwSU5+-Uw^v2>*QEB< z#*Z{+H{}AT>S{&0QAhfh%HX?GF zgdUJSV%}Tf*qt-_eMYBA1kY?tNM^G^S{}fq@wzlyGpd~_k=w3tE zxzL$j-;sHt)%RkveWpEih!P`-huTV?>aE`28wYO?c#)qsX!iBQ`GH}-nr=H>o7~$I zgJ(9^gMXRl1}YcoeGB#et5|n6afb2;Ll} zMWyYVoBa<>WRDD`fSh%;?)CK^H0k7MhL#5?wE;p8O_%Voxy3hM;{Y?zgWuFb^JfOL zMv&?7Q1akFarbw$ajmO$9T-f}6qlyJx_U3ouIUJ$n9KqRqhk@I$eF5fj8{5v9_<8;@RXfh zH2WXQLL=8TdLW<2=5qM0fE?&$vc`d@Kt7MG&EXQx?Cgyl8P7a4n_CaCwTIvw>_0M> z+tljc(jIttuJn=lvPagHZS4$gL{;m{QQ)x+_twmo8l)Lom{CD?pmn%2jKWJY5!7AV6Ve8+I4Rdxo7M$?!|J zk$-5Qno>}pT(g?Swh?0rXyy;k9)1KG8hrj>*r9ZrSgC^v>|HXSBefhyTHX-LCtvYb&%6I24etq%c*XYEb zJM;N@LeAYYfBp2_d!K&v_VqJ}(^t;CdFkvM7tX$Z?(AzHo_poJ^M88d{2%{#`IXoB zfog~wZ@y1cao+ss(>Kq5`{u<&IwN5AkV&Bw>@1E+`|lxyTUZcaelQGPLCko@u}=WW zBs8;#%0M;L>&7LTlcSU=Xqf>DXhflv%hjA*r{J`5g`Csqm2$mOCYBh`0Q>^HdCY1l zFk@8WK#5-lq2SbNxf1t+Lpp_ADW`>`0%|90obw|B064dmRq{P}IfB{m`FGR3{i zpM81#tFLc<#nx3L>3G#gRm+^U<``kj8QI9O63NQX6fiSvJhYcs02(XDGiuqE}aC7 zaZn0KhCy*#494A&FG;D~POe|MOWC*Q{h7ZamoK;23M(bsTAu|*q zacP7=ggWItCdyA%%-{QlUa3gHl*5J(8Rge_u^fmScT?*LQLq#!$a20vPPP>sjo zDQFB{nSK+tWHVlz{po4;6i)IPBsdMhJ`hB>id)5?MZ!kI;m~Z<40pj86&`tQP}P+* zv?ugUQEhXKzK2s4P$DXP3fKeXY4HFyq71x&ZPIoLWP&qM6V6NG%t)voY6=+y8M_3S zfsTrtT*N>#i=rlB(gNy;u!U{1ZVr!zUc5A{4*$St!jF>%)a5ypYY?~v)t37dXhTy> z3-#r)?X6uK$0rVrmbW!$TWg|~oen{Vt+3g=W-O?p;beAcsbXbLwlpPrphU5>(<$xu z$XjgUD*fsb<+8Zw-?GvNQlk3;tN*2xTbdO;kQUvS}Y) zUXOA(MAK<{{AyYQI%(Tm6&#D`W|QW<<-yIRo?f4_M7g}lCT_LMW|Fpz#jcr@1yJb; z7{QoMml7>+v`MGq=CQbGebzn_w~fcm8?vs!kPcVJqbA%nm9&k9jJ+Y#c*Hmm)Xk-x zpv(Fa@1tE6`|DB=w_&9UYzt{!hG*;}1B)s}m4 zxE>^Uyt|4ee@b5*Z$%AHbyps)&m3+nnJ@Akt#SWiqT|=IU4X=6t&mS>V~IB#(=U`p zC!&^2Hc*mr`n-lVkE+F`@VnJMtJq@}&1C(vMSibUZ+#PfndOE7Hrx^-JK z>b*Hb(5rFT6kexlS5Eg#y=|f?QCIBls`NiqYkHyCG2N2f-x)pF9Y0W)Inr2spewqs zGrG4U@?3*$UtM}zdw6?C1c9cWY%Sf|7Dnu7k37*``EW<+u_0RG>_Bh)L|fToU1i(b zLOa{TyE`L$YGW^sHi9=NhEk_SGJk9o|EXPp!-Ktvycb7?!Op6{ zsWSC1Yh@_BzbAI6H}+Dq@nlmHu$irLZlNW-LW3pdM< zoE0|M*&T&aM#}8q!KvwD@Me2Q7+jgIp;2Lw2|O^Ev+-=e&j=1}Z1!(%3GC>M>>o&C zJ5y-~X?Ar-4-6!?w1+9TQ)WL5t+DsTz0;_9vgr6k7AjcR;GL|Y55J&c;LT9EW3t+{ zyDxTPs_5aFlJ$-5Z5{p-lf{QdGrM|XW0g(-2HH7_SD+DMZrEm_EqHJ^wYJgMTVm}g zu>c$33fhJiuC4PxGP`?YcwbOwl)jeZJ2*&7H~aGAKcx@Pmh9<|&o}uNTKvbSijU#yR56sYu`NL3 z&9>GY8cV}A+d4!02IEg{s@&Bdn``g@JYWwjgnKF9)e?AeVjXLwMaWkQ%wen_pL7=m&sY?=)O0(&riP0Vwq zw7*RJ!>2;U4=$5D!1np`Y^WP$mS|KPlMgkC)?|Y#NG5nAv;k0oG}yQ@ng)}{r&Aa? zh%szcG+ImGhmmP)jG1)Jszt^?H6RTgGP)qJvudSy4Ra1I@xq~84SUL(HMH>BDwgf} zVUYv+tS4K^jXbk#g={(V%!A9N4=x99I9z3m5O6Ga1g=n`hUIo-%U6Lta^5qPz+oQ} zMd5s!r9&lIkZ`~uoGHksL=9VnjaFJiM^nm{Su3QK1{Sk4g#tA{luJnS^7-#tYLzmT zRVy{C#1@U%s+Aa2Vz37#<#N++=N|jh3uk`+$18t&6=Se zzP)t$8wiKSssTA?K0EvV?Q`$nI{WU&Y&Oo-GjCiv^ZLbeZ(KO{`nhwjzJGzfjq~dH z-~ZwApI^WF7x3o2YqWj;2CX-6=9|-(KYaKZiPX55oS~)?y#N(TF<}Q76KT+ug<&{a z2~DL}h;?$QoR(ZePnbrd(d-)bRUA3{?2kb%=I71e1#MayY=$r>X@}oJDPRn7MXENd zB=8K10WkFS8;MrUDfJ3YE@g`ia2m)5mElK2XgE188C5bMN5!d3N{K-sLk(6KLofg9 z;TPZg!}+(~{P?2}?wvpP)#Xdy+_?Vz&6~8S+MPT9arf?jes=Fa*}?<=xbx}X?|l6I zotxj?zV`KUUrE1DJO2fv0Sq{V4we-{bnk~b=6AHATD-V;n+0ZW>8abj7ng`fe*cWWT6-3-ldI33b9$WhM zsFSlZjo|jITb{7X00Uqq>5!p32!XD7%E9HlN;n7Sv4g&T#zpC!s6~P&qJBsQMsm;$ zpMsE?R$wEI7zsiiEj<^Pj4~Q9rWOnF>mdLb^y$&Fr}1VwTC17{Xf2Whx}Z^N5E{R4 zQ&JKG1hUF0SHq7$0}sF+u!=Y$LHGf{lLifJ zL>XI14KK?yBJ#5cn&=ZrEF(ul2botX(F70hykYqnT9O-{p%$w0Q3=1+99wBk21Nii zP={AnfE_j}jB5yMy3@w?l%dQEUMc~bP8Kx*Ww}>gA5xcj|99O6MKJI%vMF#q622q))~r5%!-PoAY6`nZipQvkQPSyMq)KHUT& z0y&h|vPyDpt`1N4$^kz#rZJ*zi|ea>v^ZN1|9+B9jg4#jM-F!PZS5*)9SbTDeQr^s zId8WyPaHvF|W-g8un`@g8Ct!61M5{aV<9CT+%!e($yLZuwS8CS)pFp z<>WSI?dvnvUcYiQqFb9Zm8(|5Ha#xopkLQu5)SxP>r&Qkk8&WW#&&C&e>`rPh#F>7 z=5-nS?yB&{5*HAalswSsQ6RvT%_UwGUYj&er9JCY_GX)`R$tIy5kfUP%Kcl*ytoBr zHWqu^ow6EZ!DQUFt;7%H426sf8P~du3)>yJAdoX(5`* zM*xpw&BYHl7qPTS>TrMZnZBBXb(urxk@v*+bj6;=n-16WBiZ(KM?t%12Wqzs<_?b* z&3C1qt2e*W?by^9*wPXjZ;G94O1xOB9;}aS>x`q3&(>&PYEbRziq18K2I|5`YoaIs zHErvNjx@%8*=YPjqhwEa4AEB`db~{eSec@~KGISd+|?C*vc~j>Chkao60xD)+h1g! zZwwsijU$fsC1$H!14Wi~HSXgB$&nXMM zmpk~GIVilPBY0pq_SA;TN7v@IcSn12w&6Ry3UQm$2XK87)jzs zSl8s+JCxWx5XTmUH?;cq3?-l1RJNr)vZ9faFa$pa6H z5IPAY3YdbJ%(VOmut=^hB1HSzOEjn0b)R_MwmV z{4h+8Ptp94sF5!PY*uhfSITJ++A5m8vtkuQL`$&&NR;zo^a8ZVIkcF;;>;X=u>r6L zh$^6!rYT1xEK~{#h&nhUC{&09WE|Z}UOA~UgpM`VY1ai)wCES-FK#?m-9Pk(gt&9iskyztM{SF*)L)MnOl*oKlbG;>Bx??USV5OUbb z#q5oYR$Wu^ANFBigW*_OMv5IVTPJ{~(MyKHPN)AN9J|{(OI&_}- zHK4H%O3_3e30rcF5=ykLno_3JavUBZm#D023Bs&|6Qq8#JZMq)Omgf5tcsvb8L%qd zM)|u3pL^@~=iYhieD^Sis(zqxzut2VaeooWQC;=brXq z9u%Owi%=mIDIgY*2DagctFeze$vFvJM7bKm56j!YJirE}Vx+XL093<=T0%<;KoK6c zyeXK;1d`IB8pff z=%52a{MfCqQH&k(4^0}OF;~D6j1;j@wgh)U5ugRg;nvWE8JhyOp_fui1S&DD*?>Mh zy7CBIf@JtS4A8=R2Io;fszouq6i6dHpxJmdKcxq~bH7f2zBPK-APr?&th7pXh}M9n zSvTl^qaJ?v8O_^aUl;YVv5pS zp#nT2Y!rkk!$V)lL1XY-+!(Wn`3W<4)?%|MOD3=?^U!juPc6p_w_*V}!j3%~rCA z(oShrP*q<$)z-bKwQ07asA(#q9rDQml2%JWrFLbtc15LXS&v84X_wZU1f4b!V3SiW zFXEO3^ZzX)T~cE#gm!?F8dG7HLkidwaZ7qVT(?`Ak=~b6EUPsMOSol`{C}-bEt`oL zCL@N?kOq1gi)ea$V2q*JChhjgJ6&>A(qWgb&)D}?`o|+WuxBc1o`@PjpdOEMHf|n| zn3^o&*_3r6ZfU_?aE@QIrPQ@hY#&cK+grbrQW?&;T@HMJ(b}dWr6vutHYzfT?<9tZMo2vlEBsy zKjEjuySXH=w<1c&Nx8OHL=My?V3_Ae8s@T&EoH%nJ91C=)jT^`_sn49{+h)0@-PhZ zSXcQ&J@q*GtLe7q1}XrXz14}b^4K#Sq360IHC54)q_LzlHkGpP$!SwbSHz=8#;ixm zHTz5TF%OsU$-$V7(fp$ohHyadacO)m)y|A+SFtt{GKRu7mtC_SNBMF<=&3S zp7sc~$J@$|x0PZa^4ZlE26dhrY~0-z#+iMc(I>mBpX#kWHIg|snmIX|!Mi|5pu*;+ zz=nGN)4f%X_f{MkOr9E}0cj^%ieG55LOXjpB6~ZdFEm(x*=X3<;BPPUHy68)rDe~R zN^pK>XRN<2{Af<~e6?z*KD@6d1|2E5T3Q8Bl62S z)nn!Af%@?F&KP)u{h!q;aehZfbXR9|Fy|O7wgO}Ox?>xgf-_aFIbfhIw6!I;snI`{ zv#qUm@%Y&U3?vPMCARHtq0KG9g{I(WsU4o#+!C6sawGbSEx5XwJrwqss&o#s)dIkq z_07JSS{IEjYw<%4w4igXdu^?2L!)n3S7cL*e^ax6zTUIHKeneQx~rS!&*0Lj@yt;g z=ayJ#^5Jl6d+^|3655%pw9nPK(FVu?yqRV5a~_?^9U4k4v;=!gXr|4k_VCFm*dRAv z;|4{Jj%VPg9o>=fD(6fcrA>}cWanD~t!Yz7k!5|0e|t|9+G)ZImf5j`8s?e;omoqJ z){K3SW1%H5Uf~!lwaquvS8=dK$+1f3h8D`JfH63ntZ~6PPzO$~YxIs+5a$jKCt;rT zd_ra{i#Rz^w6@+0M}c{0Bz<6~*+1Lhfo%>BrzY#X4N3iAg=0f|=+sQf6Z2&|yF!~< zyx2K1n%XxI-`wio)E0PjUD>h8qMf}_KyGcL_o3Mm0A_PnWVX=@JMA4J$?OAQT6_y_ zfkR`d{lm#4gQ5bC!x8prFhQ zS!fB}1sd_wfzTMfX7)t71%yB>W9Xp>&H7H3}>0Ta1tU_9%fF)iimf#hZ zEglkJ@VG@5(l18s1cx9WS}H)Xissl*Zf6Z!S9%S7))R!#03nbJ+=7!ds*N9(#?Ih; z-WrbdMML0dAA$D;W=$ES@0WEs#l)DgXWMY^{B%)zN zLK>U~!w_Kjd=6VnngX6#ou^!bogX4EU!7l|b~^p9Km5*bUpn{uKVN_C?b~m>d-uJM z_{F2YVN0uh1K}{_e03JWA>`aU_raYr@3AxvTRfV^s=aZEg!7j(XaDrhxtCwR@Tb3A z`tvIg&egxXO&?zXFqxU-1l!?x$xMta*of{P`U=eKIfuPNab?&X%|2Q z0l;WDnN+Hg%V_Kwed|W9(8%RVPQ^Z(qf>E8gqGF`pig0{IR&61kgwHZuH63i%BO$7e&_Gk zZ_#X=oA>_Xqfa{;YS0+8&90`ed>ZAnFf@olU&UeJHORtNMTjjw5MXm}yauU*K92*{ z&{}GYHxi3dxVRL7T&R-Cq+%dMrIO0n=ry4gsMClXT9OZ-0@Vb~aD~jxrt6q+i$qGJ z)Fe_UMJA%O3_>B2;Usti&tR*8btE$V;#YJ?Aa?deQJ+!Fe;davr;mhs_2Q5T9eQ#L zFheUc+hiG+0z33E9G!^Rpb=V>1+b8TKBPlS3n(QLxmboR0g34awV|+?6Yx17oW~P+ z%z!9tKpLfnaMj8dUc*Ujv5$K#3Uq>n4)$>#{v<6Pz!g}P1z{^3B|#ftDux-{MY>2j zWMu*PM3(j__!R=c3?I!`5vHB;j8hJ!z(szx?im2XdkJR9`Bb(rs(a@1aPE&L!34vKlFJOQ&kVDELL*OLZN#IczMA*kV(eLLc2=Pf6h=r#D zY=i!Hh^E3*r`)N^hiyFCf{2kOyOUectFuZ<-0}=feNlihRUuV%1ZGcHj-drlb|9fi3`y zPw!xh_dja<4Dfd8rN6&6f_zws;ThFtNe-*w+wVi*u-ok8wbhYWov@!ssIF{D0Xv|Y_u3^ z3+e?)t2m$|($J@MboiBoQ5vC#b`}PWv|L+IUzoB>P+@sMS>{(jMCI(GJ?wip#3Z;V z=TT(rvXqtfnU^FPClDn`*~M9h6#I1{Ra-*GM=4t@uFNZMYn^YY7;BD}*V;WpUi0>p zeaKPJW)rkoC>sNu40=?39(k`@T5l1TsaASc{ZHre{}EX8ueJKTE+b|9_UNS61uuv)mGRX*y!qmUXW$_RghDn~LqzapOc(S8FOLQ?DF} z8d{z5V&$?fw|q;fXFlryY})M74wt;uF6;Mc#v+F86|n)ow#g#Je!WQ;7u?tCl+7f~ zD7?MQKN&R+1hr#P<7C|2Vwcw0IXt(6E*&GMhb2-&fer;L*#Hy_i~E@{5U?GJ~EJeyuaavX8Zo` z_`a?f;*q}kLv3aJ{y=r$M3LxJcQr6@pf`T7H~#E!W9T3hrnL;p#Jk4Zz#+q15qVMEdEGj-S*BbICLQcgK2s)pB&X=E3T|u;!81=+aF3U9gZ1IveW|q_sh3+dzi2W|v}a~p zV_Vz8PnSv#7pa?b-q|{TSGo7m67Hdf)Xq+@ftH;9d4u}#Djl4I*xeOfu=m_V9^ zrofTGG_WyUdiNT4@o>nOHN z)p>?1T@$sQ`lO*LZ5pX|k5{|KYu&(1OUek|OxJmEwIgfpEHY2x7ijcP*0|dM9UdW4=!I4uquDYXjS#~&p9Y&Tc#u6PbHcVOSbheQp?gU?BDkd>PYSoJ zTmf&8WLB-DC*moLbF`0=IL`x#QaV)gB4#KdLxbWZODOOn(&eiZu*%XEG`b9)S-z56 zzDkZQPZt^*#{h;lpxJqO94Z95_%nRlPyoSJ8lbUoe8z@P-O%W`)iOZ=hb?a8$GNRu zMQgG_K7vB}^e6xQP_|A0rD*t>Gg6kj&`{r9icY;wj_#zKT~)Cy&9p)ApS!^s8m>l* z6UY%O`6)dVO2q0sUN!2x0`-r=A@JlW3k14f4<3B;nU8+^y9v&^hY<}IQ!L`mp=a0pTgmQLZ$>}Xl$5N32CS}gc3?o z%19tuh1{%`STquoQleKtIpB*z%gM}Y%GH26YEG%(=p!~9Bfj?l}+I*vZ-X^_(*%N7;!fK^Cb(bMoVG3df5MeJb(Xh53B#36iUIl`fn zK{YWp*FS7mMI7p~qU@EQy?6Rg7vFp5)<+-Q{Si43&fUBJ`Q;b?h4|vL|KyQ#_trn| ze*FEN8{gc${>`1MU){a><=rb^+`aty-OHbScI}HVnQ*?o`Sn*fKL6(0-EXhl`tItj zzg_$E`|F?n{pOv&U%C77uYMJA8Js$)$H)cD@~DlHIX)v7v?x3VkVft^anKH0Zjg)c zvIvtxtYYtuz`Ns&QBL3ew5de^k4Ygka6(!nKqYkRBmt8w=}?5t5ELb6tV$tUNKNR} zh;fTiPU#n&ObFEgFiNphD;2^mPAx>VxC6R)4Pu``?9q!7c69V9%@SZA1`S(Kx!g}H ztqEwQ0jE3;&p5a!eI=6;GAQQLixE}@4J||EG#f|ENkv2^xCMV^oaZw?O8n=+R+Ki$ z`OFNn4V|Rr0cboMlZ-<{Nfqx8>k9mE60c9`9j$~^!xykAXmMxA2lwJGx0b#T3jCn` zWDgB3`=*t`LNr@F>EN<%MaU#hSfyzveNmK_CQ}z8=;NejItjf5!2|YoIj<_?q5)}f zT8)4Pm0`;dsq*qubhKz&z8yYcRzc?;hej@sRs~?+<>Z%c1C#J*)PqjEl`R{Dkd4EvfV3X_*qwCVsn05V~V+W5u9h)MJ%O%CPZnS@P3p9*DDYj6vM z!0IVPwE!DShR|>?Kms@7xe1%J%&$V^yb4GLw+HkB^uOVvj8oPa({-dxohcLXz^}w5 zy|h41Inx4*d<|NHCZQQY%07{2DBq%@5m`VTer*)6DM@Jfv+CGN0N5Hi8aQXAZ_dzK z4hX!3nPoiq4{^dUupG8Hq-D@ldDxFyXj~kcopeYO(1MG@PF+M(=2Mh;;TApU(vvaw zX3RAqRcG4Rl`%B|GjUx_SY69j-!AtmQ+E2uW{H~vU~0qahN!katbrn8G*nMo6;MJQ zkOo^4jXvoEyd|vkl}}m#8vi7mG8hRz4us=S<^ee#O@7)YDRpzS-hho3EkJE--VWu9 z$~?GHR_>M4LIvzII6zU{LYhLe`4MrAQB8A9+Za*Thtwch#4N(o;}%iKAONVMCTc)c z#ZW`8yCqdW9dXa40yRNZV?>+vsi*AA8;p4ssueV}j3(7^phb}~FD`l@E_fhP_|qC~ z-k@LGXb~21%aS56CJ&?u7ydLUT~e%Go>MGMh<@5^5q3GHGdgR>3cP9 zS_!Sh-s#m2`jw3qafg#uFhf;69_3(A+rTIVtF$>)c<6N8G7>S(#x0{EL$62G>6B-r z%TS=%CS53Y_4rjC9{EhtGMluH#cj<_d8r>TRC2dYczh5(#v288$?x_mzsSK~n zIC^|4u%|DmuCs_YmUuRlc=y)EHs|~sOT0rN18$#+8xPecj@G4*H>3|%C-zh)u{~Uy zdZaanp7eA?xvj(o-aI={bF$7pow6OM4Oe8Xry7C~ORm^co-wB*+J`%G4>!2tFkLoVn&&#wQ*DXy*5u>0rk^+JM_N;xyApuJ3ysFZrG}om@JKU3;*rjp zV{H}K+18y{-<5rMu=A+~*P*^70@8T0ul{6CF<2Me)fF3QO1#))eR8mIcV}c@cWiH0 z>}0v|L}w*n0|{(z4gGwq{e`jit%*G`!q_~&P1&4(H@J6a=% zUG32qhZ`Pl%N^`Z;6d0vH&A=1CbGRHjM&u?eWbbQ@%Ey1o$1}Z$&se`uNqWORB6Xr z5_27?>Gsr%^~RT443A9}BOaY8`E#4}`Fh<+8LQoI3A# zxqY|0ysdSYGfQCfm5&{J%MH@0;|<{H2r|46xguoS}aAAl7{GPAXA;Ac-?{MZD|a+#`j z0usk3ijIzDH?#x*nBEdvzInLHHC69zP8orgS%_sIF;(m7WS+s*O&#I2O}@UIwX4`N z)8O6O8Clol2VlC2EZEuFO{t!)Vrze?eW5jYU?{b=!Piq{p24GA0-M?+xZ0DmQ3j?h zcw(|>V|!?%(m7h?+|(XE$~-evW(SiXF2ttx5L$)C?Cgu5nkm^km~1b$b`)8*c7_j+ zW>9`zgJ)A)fTrS5x`sS6RqNh0ka&2mbaQvKr_?rB?pWU%WP{TplQpiHdJpP+XqMJz z8?UfKJ9xXzT@e%*taPkv4eTCHKE1sbs#)I}m~Zy&8B9L4scKzou&u~4ROQ;(5y68{ z!*rc{u+;h!7zRCl0sx;&VfLWGW;oBBvvN6tayvW{5cHj#C4&1YgbzGOYM3HLE4O(C8IVhP?$*hh=FfBg96Rp+XpjFtbcbL&#Qe z%V^q+l<2~y)1VovSYC)`)bMj@R&s1Q4FwLDz&y)>lhQ7E^fC7b!vu>al0t^{u zam{FOXiXkX;30;wC8t->lGDo7YuGn)7FTIg<JM0(Oao+3a{} z_K`ooaOU?fU;Q&bA?Jh7-#_~mkaPahcNZ>ycmC2h=P%N_YP944OXHmV;O<8d&O4tl zz&b@Z#{9n#oeC_=UFTV!lTxBb&-8}sPtsMOZEgOC7%?tlHeYvzWr<5sa zqKjOrmCJMp1?6pE43AL`a$rX#lT&U-Mu{36YUP}U<8*Sm#0Hf?H6%dPLqL*ov=*9J z1ZlRTqg)oecld_R!5|=^dGI9=s%&wE^6}0{sNP{QhUhLa665a+*z0_@xc}*M) z6LF~6s%1)_Sz*(VE1(*;fitTl7J`-x{&5+&%96~*U%Yqvl}ohhz(=27x%|!btKWU{ z@jq_gUYw2d)tCRj&+q-;pWWe?kpBCfPyTiX!nyXoH<`TF|j zd>ZHbYq$P>{np>Ee*BM{cmHwz_Hb8I)S-g1@DmvoVm`BkUxqEfpu*3nmqT$fH7CcR zRIJ8t$Z}IO$Hr@vx^xncUV`5TXbGBRVG9=`)hLU+>ZlF;kf9_ZXyM!jsZ$RQff<}! zOyeZQLRw$|;PL9EF`GPSmPM@SvZEg_g=!!i(89vfHSBYr5P~4UGBX*sGG>*5E>Rm7 zG)sL(iBktb(OSZI@Cs44Bkn8NQx~S;8v_@}bdCCK?9?;UsO0H_SGu z$}FdeA}o7DdZ8^_hkzwjsMikd_>GhW0s~+S1iJfB4QK(tM9sAF7%ETEq4fTjXhY?UxdYk)BT0|FdEzzJTO(M}l~ScMh? zFp5$(DSd*5eVr5C^bE^Z6|rxRmU#dtEeH8Rtaj$(99fZiA#oR8zNdj5yXOy%Hc6=+2U*owg>?v6EqY? z%_JEFe3i0_n@ix4RT2>NVqW^LX6YV3!R=D5cY2m!O_j zziw^H+RPRz*j*7l*;sU|W9=ty1aNMrHi?PX7PRGw%kswuH=P0Jr{bk~#z(s651 z+;Fhkb*##qjGE(qWl`GkP@Uy?wGEz$_>_sb*VJu;X?XZqnP{YyN@_@KVM|wUYYV?L-t^K$ z)9$Xw-tNfy25*0{WwOGtuFf-4?K;qxn5lA(mD&~>{bOa0^$q@s3dc~16}*9b@N0CZ zjl((X2JogcvZXZ$8i6z{OO`r5l$x%z&DA)Mu-_TKHsmv2W<$xN!)X*o$+b1kQ}o^a zEC4f9W}C0~?CFUUSC$_%9y{R?u$V~3Y zaC)lFTN~A4ySam?Fkb6vPMKOWrpa0l!~%r07nxhqM(_sG15vuN=AL2;c1A0m^DTki z5-Th;-{e0$nqJ@RA1t-g!q68V7lH5kN`iZd2fGWqQ+et*FiWa zd}uVyKd8Ulv939=wJSQ`5*)2^<0`cC*lg*h&Pa2{+>|km)q0MBVdL4^I{HWsY_@MG zwY?`gQ|E?Qw)e&!nJ?ea5$-9scj0I6jO^%(?;T1`)VhW$9P8UcdxjwP2un;kw)Mn7 z6uiQgt_Tdae>C;fma5G?(G9JExdzX!!Nk^{D55ECn5^^c97;UCP_dys1pEL?TYF+# zdnr)Wc#R8%Pt2D50%8w8tjlAh)t0?x&To+eHrThbX)O+&jK+Ym+>wHsp@tkF9JG^1 z4z@nCJmJ=OjgWvWXjL><N~d z0(HK>cIWPE?^KtjfGdq$&gK`<3JPc&)Cbj=Xn+~~Amx7+I}J;ddJIyxUSea5LDLKz zJ-X&%oa9%LhIt?s2OF_wRf_bSNGXwnG%}GwLaSNG)l&MYal2MVH2_F1omel!4&j97 zhgBsATV+X?0;KU9#8E5fP(uX*2U|;8FB9mbG`3A4mZ2)#h+Ci_PzP6G8w9T!?4U5V zU(T9II#LzjY5=`PHhl#?NjNw}+D+sDGaw3_EDfl0 z0To+XO@hunw)~m_*g`CL9JB+yfEjw4pkDxfSlOpM@i;=1oR%)YgRsxvf~rabDnv2m zE+{_}G@?nuuvtQB91D$Yqs)mKzYo96G<_roPl0W45)Yzv0#pTnO4>o6i-8v4hXD29 z^C1D41k?eR_>bX)SmkIr_<=)aEus-HKF>5U>Sxa69gWg(y8`k)Q{hbx{iuahoLV;@FbS8U#GhoS@_k zlMj9I2AE++61a7=78$m93WC`zpHfD8N+_X`*a9kOyoIf2&5txg(BvqVXoA*w`G7Yl zz_*YRHLThAiGl_ZA3z`=0fsr$`H%zJ9A}>s#mQo?96TuZE35FAVhaF(E@(eY2-skU zk~wxtkCcH8J{lVaoY0IHp90Rot6@w00CK!?9F}`&)3E_0cb?q@-g;&1b_%A89(q)vmmj8=4|2}{Iztw2-I&89X2xrZ|8SeW( z?GOHof7QPR^M9I=EX6i0UD9AKs5ck1*~MAuvJwU5WTumbKA*DQB&anBvD4#I4g|Hc zNz-6ZTWyhbI%!xM{DVUj269^LGPX#xgw5MAPRDICNlSx8*x{6ys#jGR^85W-6stBB z!Y4B++jz>=?bmg96wOZgY|2(|l|V-mY{9hc<)OW`v8|Qi(WtRpU)W~LUz>G|CCy!a z^*~5hW6W!FDZ2gYzL0K1v1>AE84hX3gWQf%cU5)rk+$5C`c!AFr>Wf8Sn4=gn_Xr7NToLBF1n~A9TrlZq1B$>7g<;s1x%k;F-fY>9bvl*4kJksQ3Hyn-Y@! z#mer6*rCDH_R*SO_xOI-X`Aav9~jIGHpYH6-F~1xdte|1?dQ2(eYjHd^E%~t3k{Ll+Y^6mxcfj$`9w$2 zOj~jQSIbq8S8#9OmKNCF7J8vV`dkIK zqb-C0W1cF`f2l^YslmUQ#q%T0PYu>%XKPas@l1vMWM?I8v#WzLA-|e#d%Cw8o&j$T z^dz3?tvS`4hI9BhULSw9w-V?&G>|$xkb0y(_E3Eko%^FBnG<8#pEX&ZY)XMWh?C<* zzizj_)Mh$3oZdf}9%)WIQ?30)oxHyxGSU>=-4lPYUi*BV7M*(vC!lnF0)NkI&jxs^xB8h>+3wTRnBc~!HG)e?(XPRrG2i}xvwvNa-s;5X-XO= zYdp}%v9auIy{|oMu8-@dYCQ*sQZPwpk-0N#Uf&cz;f0n!f6m%hV%^Y8U#FRG^us6J z#g+{%bQQ>H&zRsD+;spR;{j7_B|lU+#%tWo_|K3n+J*va>%HA2*0zj!qSmvsFFr$_ zu{5QOlXc!B}#P*mMn6JPnfJ+E?l!(oJS!k$d@73tfui}G*W97r9>7nvq&J8&sjmq z95zXYNB{_}StaHrgF5lVWi)E85CCIspzn|(mNCOHkNvP^(_r`<&I(HMEarLGKsC`S z8jyw^5(u`GLSfTv7-q;bv_o{E!EdysV3(L@D41k;7m;n2v)f@Ch8YqLKUj{f$wou$ z=<}e9pVNUupcFpYA{MD7VwFsy&~iexOstZMIf+ax0ygAu3oS5^FXs(I-_-$W@)db& zU?EyO4JcyCCCVUS3)oP3k__ETd7DMaz%2?IzsIk}##WT3!D*{Gz5u`QG|SkKaA=^!80AoGTxlre&kqqH1T({rSBMufBKj&#wbHm;e0wwb$Od zdHRFvZ@ho)_4jVPapsFRFW#VmYC)w;1<&XeGKEY@%Wly~Ga9r8kRY(5<7jA^S|&3o zgj$ZWHt2|>*X}jSKnntilEz;d)q%|@z?&23uqcLynTcVH*TW>&$lX9`lsw(uE zBsP@*_0ZRNj1ok|B1<|Iafdu)ktUq-uoaCFMy=9>L*}P>FCt)rAGk#s7&Bx=$cb5{ zv>E}MJOgjI*)$jwPC7Z%z%wRb6r&7)1ls^DC>FEHvL0o`D)s2;Gc~}EQC8qLijz(` zeXa+zFp06XDrse5D_bx+VuhwCnS-4GjW-kFUP|mRz}VQj(y#}-M9UbUr%rQt7Dvsc zScZpn_i5fg`s+9h8^s}mDC?Btb!Y(tw%9bTqC=0`5C8z5@j$g^TB(dOOQZ!AO}|Of z=rzjB(CsY0fnsP0g)$%Bz*A5suF~=VN;GV7IRX4=l#THyz#;eql0m1Rj||#rmNdom z9cfcjT%UEzqb8A)@-XyGPo^DJ${`DxL_mn1)?cQ_;pu29&Jbf1c|JVaKyt%NK{Y&S z6k@SlBvy%OSqS_-YOxT9N|6XZ6vC=lgOV;y0g%QgWPmQ0md3ErdeHQP&=)!VG*V6o zCF1p=8b}PP!497o0RR9PetJ*JA%$T|XxTbS=HNwe3HziPue{W+s0^uEk_He6m6W1u z>s3HCpiYUKs|hO0{qly0rYWka@+)A5oSWk_A=m*+KpnQU0DX!S?Tng59&G`BsA8wA z#;*N3EiDqS*p#2<#+nl2VTx!igA#3A3ogDQ$^r+T+@4 zG=^3zpw;9m0?O{J5yGhrtI#U6mQrK}0mOwz6gj17njdi z1#ETUvW`%uI&SGq=-Oi1+JF)SqH%W~t~R8?8^J{>I+Rxy{2$tX{XZNl{ztVouR^^# zRCu51f&ViqUJ(~P7#BSN^CUzM#zYT5G9XH$MO>m-o>Q#E)ou@sI?F1SC8SHr_4(rw z!*JLHfy}2It#)aPQ`PHJb$a9rCGKvYs@hn9GT;gnRIFSv8Zk9k#N94sqfOdulU3;R zt4+cNyR5^5lEO+uKACrcDUSzQJ-K_l1m0viGZ@QJosdz{fS0b zDrQNA)Y+8tnHJAOWkSD43*N-S#=Y5s{Uw~wql@@8@tFN+PBEWUHB|*qO_t2{6yfkl znP#dZy|J&jw;}fXh2B^8&jB-QJ5s&1p-0M9$689rHoX*2bX7goU5(!Vv61Y?fwJE< zNsc#{;_%QAy8H3Rs;$pATZh}yn|o4y4belT`rkDx+H1n&O_8k~(H*tv{S8Iv_wVSA zkF+EotF@e}vUJx)XPP48E%BeN?SHyX*Hs%?XpIclhxay>?rSL8+fDhFeciDW9kst| zF?XY?`e1vx?++UI*_uxV>kfOyj!{B?u!rRjFK2)02d{x?mk zM>ck z`y+Mn!^0UqjyEKqY0n-Q&g>gZ?;lG4w%zo2t#wyV0&ldlJN`nQ?q`k0Lqn-O1L@h$ z6sYruCXOGswyP`po3Z-ejW;Y#)aj1S)cU3>9cbRp4qDr~Cu<%own8R*d!jqK!hd)kOw4h|$v zjc3<4`Ma`auw=T{v%5DjUFU&zTGOVv1|JNwuEEz^OjCe1H2KFW9Q-Vu!BYBQ=;Jdv z{@&hV>ujy})I>3Az>UxmoC7yb*Lj;$rp{vP+D89elYhP?FkEhLO&P!&`Xp#e5GCOs zcz_?wHdgHhZ{VDVr*n|iM)vW|U45~AgUQWpq46pwVxcv-r$4c+GcsB2nyhti>yDmU zo7>(S>o2v9R5|wzryf~X3SIP;JBF)WTe>5-w27^RhKHi?TuWfO$q&-NGdl;98{30G z$WVoSqS}R$5DV_z)Dha+8G^5lP8LBvJ!N(@a<17A;h?DiOk38pzAboat`uGxD7UX| z_Jd4&hLfAR!reJ5_Sd%uxAaCgbcA85fl9|hSNJFJ3?HN#1{(kakf8Z9Y;YQzNJB{; z@BCrXAKR(qWu-@`#F3%1;uFRf9GTUq zEv{j}2mf4lJI&a^CCaW)f`w$lM!`{FpGOFGR?MupI>6}t`SvP+yg3ag4{#XvGF2_sU;6c7;&#FElLEXaqlH#&*m zj84A{_d+A|v40Z>+qeKB)T5_m$E+F}*@efU9*15UgiP#8Xa_KWQha7P+=9E{88E=l zJY!eWg3E9YFoUaRr9{KYRWe#g4b1SG6m|`b6En!A0ju)d-Y3uh;o^To&eu0-X*C`> z{{`m&IbRZT{^PUT|9}ni3Wy?Nk%lN`BnleEKAO`{AEiO}9aJFa*rb32 zzvLS10TDq9L6ewLD=aM&vEffFMm+!$n4B=r~p_(1VU~ZaGel5=F+xcHVxqf5e2&86kLIxq)*Ml-e8y< z5Q3ve)0}t9axN(;IG>Sj<5`(g1qk$uf2JH#VSaFhQM@FeYjV+k9q`s@Q#HZx3Rp0( ziaTO4wR6C0b@I;fG0?$*JrNPQg5Q3g85Eqywk%8>Kufp5y@td&G*0#(fX6VL6Kc~liD!PRGgUEI*=l9aqMED}};DJwx` z!6U_cm3{L5sCqcAtwq%#tH^rcf449C7uVun`J2wQFaDM8qJPXv79~ZO=46W^yi2pv z%X_S{KC>_?xF{;PuuI#J5M2uL0paA7R}^#&VZkK;n5tD+GVm&9!H7#X?p99wG_VP( za$~C6#2vbpUT~&*X+nBw%_dIE7xh^s<6b40r`I8ii7x50$uiPK3DG4zc#!C#QLl0; zsBKj*?Q_UN{0nOiNy*4>*ECNDbvxSpSLS`AKJ8>c1*TdSkPTXwxP#6$8P{yY)Yaw& z(zK>*6G7da^Ahk(+^s>WQ={JJr$ZYjJ5~&)28zC?H;g~IdSK&Nc3C|()t9)p z$MjrXedAnu?{s=uf9kqY;=Y1%rV^U#jVvF`{I=J4|47$$lgaC*lQ`Zx-1XpC`I^ya ztr)#(B=XXL@~(mo+kLdJ8jar7rMfOFuXp-3)kFPVl$vsXNej-|+8-J#`FEw|PxXkl zG4BoRu7c{>s)%d%ws~&Ih#xKRxAzC9dt+<*6OXMPd2Hn%@Z;Ly$Xq3KTV8TYyK1fy z>1+4&cX;k-6F*UC*irMtKrD|g)Snx6QMFK3%jKzV{#BhJl0K{XVfVI6uj&YGuKFlu ztk-uFh-D~u%}^LK!)_nQ-PxN0>ToGQ_w^<2t|ovVfTb(z!H4?O4-KTR90+soczsv+ z=APK@$@t#s#J;)IGZpD|?cP0830&Dd9(%ZAx~koWSKxy8c6WsLloCLlokL+T&-1JM zUsyA6)le9=Ya}w3F~YzzSJnfYDxRsFaXhQv(Bq!Sm{xT;Kt5oS{WHlMrs4n(beqW& zSL_~*URn1oYd5bcI#(8*V4F=uXmp04Qy2ZbRr6{sl_z?aUD2kO}A@R$=MgzP3A4jyBw@24G{~jtSCCLVBk$P zrWwf?!86-xeq0<%8^AfM%1%6JMbTM{>xR-sfDQOzu3+zuYI+m86=l~-%v^S&Gnc5d zxjz8Bsl>FSIrHiYW%&b91~W!<2IuUZB_Xo4-Oddxryr-=heIp6>}$JSx2?+UnMrK! z_b)FwmKE%1+_k=A^I(uf*g9-ij)d3Md~5rBfT+2WV@;nA9D*6R!)C&NS6--8LG&drK#<=NwSPSsw_6bzOcLz<^@C05F{37!`*h@i9(s$ z7}8KG4nXMAOF&1YTL8KsGP$VnvP+tna9PXcmyzQIV>u@b3nwE$!YP%_Im1-cW*yEt zXE>PwPz^&G&i6tNBJz`vwlWOh!MrYK6L^SZNFm^2^1YCXz=db*j5ZoaHC((I<=9+C z!Dhd(4W^>-v&#jpF`L)Z*EkkKMFpihdff*Ny29n`U=`I5v^4`FfFsBWb;vqj0?h+cE z^~@0MaNVfqQVBXQCFczJXE?VKfemMkY>+gR0+WS8o_~hd| z@71t;7^9p=5oI#c1klX9*YP9B=B$b~|^v>8WqbLvF~c?(gEQGz4PsG#Av z2q2*ZdX~|I$t6_UMT9o(^(l;vZ&M2l(iVV|i)EW|nJ2gowt)c;j4~czhV;`^tojW> z4uz;`qyiyH70A^R0jE!ZHDjF^LUcruYvT8I-T%(hR3zv9cfUMzkiyjfIb68fmtT^u z+IQdmKR5z%zC88UFF!x)$sx%3mO;)}B&x;&)xP`e2L?Ic{CM>APe(r|H_q`>KOH^s z=TA-@d;CeKQHfP?Sxgp{(5fb<7By7#>FC2^VM+mKARK%IsSs=?k_tos6}^P?1H5_> zxCJm{QBYx=pjjNXN`po*kOq*0TMTkI{WOwI1ICzS&5U!JltLa?@snv1kTJX=$pM?9 z1)QT3HJN}n;wF|nLzO^bI&mWy#vlXs5Xpdftny~Ro+^R5H9QvxM0+MP2SZc>iddua zpp>q|bL;qFix?1MSCO{_Y~$Bc<_zcsW|4z`nqw9b$N?+_ZlMY`oX|6Qb-*^H=^Q2D zX#sZRV2QL-((Y5FozfU~T4*@%?t*}h!ptyp&_F?Meghv!gW;G5U<0I4VrxzcfXxa4 zNl}Yis2VAk0%T#zX#fB$#;zp)5>D|@EQ1Rw!$s`!(Z&%x7GO`oMbHQk1y|6S5er4N zfgdm&ok1)(5@3)+gWNAL&clPT02l{T6u|rhQOqfXA-I*WiqkAX2;dhnlcy`pYH|7i zJlYnZPC2Y@^UCoZaGjK+WlJqmrckUu^Ht3Xin7DZcpQ#^A{YlM+^WvJi;@_Iu9Itm zRN#!#CAfu);1dcS)3tE&Xl#*0DK0f|6lf%fSx8e3izG0U6UH!Ifd-5P;{k+NSsohV z(KJQP6n=*Neaj)8Lr37f{c@#Gnf;{4!@!|uCFHym9PdR1Lpb9cmwcg zWr1GgrSZwCVHGf@9@BJ!Nhqp~DvjbPz?GPpFbUn*bs0LB0&*ZnIiP?Q{qii6P$QoY z88J_kQ~{cSA93a+Nm>L2uM9&NagnE`-6a8Cj3jh@5fz>lF|=eHBw#>KaY^t*PB|LP zgQ-Abm53UP$x+aqq93@D(U*J zS61=M$Kvff)83*-+80vx1mu-~0u5L#tODEgg;lV@sJb_zszy{Hi@3Yx?+xeu57Q<8 zvt>bP8ryyXyElZ#O<1; zgDkaX!mq<5Df#7K7=O$8V69g9qE21ofJ?^EsJTB(yN?t=K?9_8(;^03=h zUb`nu`VLOu3CN%_cpjo4-cv=jYpReeX7Zm<*{Ee8flp&N6O z8*U_J(_w~aH!-TDu?bZ8*eL`uO5jEchm0w=^oJydCg$KKV9|> zb@}$TszF)9#o*TA_=d6kUE{qE_812WzNwz@RCn<1Hqotl$xzWhTny|S2tL}Qd7`4c zVIp?pbaLx>_JPUn$ClTx9SL7G7}{PB>?=oa>1zcE%v7T@mGIu~{i z0B>9C!OgY6{!;kXa%592xS=nwxi9c=N&QH-=4x=%NCa4NOHbmiT6W)Le9w4n=XCqq zW6E_E?+zADwsRmfld}LkfLo-*FdALxuuf!6SmC~Ds^dA^W}eI$Z8t_~&67Z=vqDBMX3Me?$ zX6=rs0WIVJ>9Ear+Up73aM}Ru0nY#-NX$A*{+WqZ^NKEKe-eMA^q`(+O24ejv3DxIrpLXq;_iuQK_I&) zW1DNfHB7qyT+nxD@0kdowlpTqqnTgZXTd`v%Z8LU~}U_ z1~UL8W(#(J%|gkEX~%Nr(N+@x}1>Z)fXYXq@u83^3Hv4aaC8)`Le9SUAIm&9>p z*}1G>+tMFc*X!LjbjI@o%G$p?yRPORZ@1RdhV}ja{VTH@1_DzZHVof96kOip;@maM zijGbFen8sVUN7-XTEDW#b>p%$j+1%wSk8n6P#RCKcecwuk~eQ0@b4IpY#RyTbh^ua z4kw_@g^e-b0c?<81$NH)5x0cyJZY&9DWp9m_>aum5=&XNy|d^;Dn08TE&o}P1MkjsMh z`j=lJVlYFFnu{)>pfV0}z%v9qTrLg67!F$gQ)Jp193t9bFayp3ZvZF2Crg)d!DdpX z?Iz?ki+R{2^CT?yh6DqaTtNkPSdATK3~2x=#7JNmhB0LSiDwwGU^qz{fOEL0Hr(Q{ z3P%`C4me@5(ThonfPjZl5Md9+p0UO+9vjZj!zJ)EHvwHpdjLlgCupQoc7^;l3~9(3 zn`BIHnvjNeX!L)bQ?XyPvK>FZyA^X_+_X5!JT4Cohc{qdW3-v5>e=g3b- zj{f|~k)IBK^5aJz{_x>JssZ}JA5MSp&Z&0~eEPwG;~%_vNa@#Ukh9{BXNKOB4Y?PH{?_U@_IKm6N)qdmnAAPptQiwR}~d_@aS z#pA0qQl3f4*UMVWN=p4_UKEi_F9OL}HB{pTcMWo$NI)_JU>*^lj-Vhd(1pkZKtj;s zF^KJI0aHdM?E!4!fiw;c1-Ut>G7QU6(FiDfOGVRyRV+#Y2!}FtJLn zSU+CP$zGiM0v^3EWR@iC@_>;927G`$H3<^nD}fK?0zRk)FoPpt1`W`QTp&=3h;77t zadVTD`bemcSZ9Y16iVOpG0!5jg(bTGvCpHRf5X~7lH4lagGLXZO(Ch3#_ zU9e3DrDUAaj7tjs$v7koa`zT{JYVKAf`R2IFmj7^wiSvMGxvi$H9uZY7svb^g zSwn-jYr{s|j9*Exdu81|!kc;^W>FFeJvM8MHjazm&Qbwx|W_B z7F`|}Tmnkz&@~hc&A^+vsA(=}8ux1I4q441skw2KjrueN11}-ItludIz;qaz0Wf_w zNnS%PAPlUU8iGx~GGFpfQU1Bs%l;`NIj?SS@dd4O-li#6V_VkIk#lynxi{s!J37ME zyrna#PX-jz_DffJE&?b!J_xEh2BSc4R@}}@0iNY_C@#S#J6_HKoMKV(>E<( z_g}nipl#E5ZqsOL$4vV}rRM81Ewg=*y;F(n#^d`c>09b;*Nw&Yj>m79OgvCjJW`fU zRHIwQQsAXW2LlgHbl)(Y+C34!W-RvjTIB)ba!7nw*H)9;0<}z zU@0_S3D4J}zwMUaIMf9$8m~l_4TmOxKX)3w9l>kGaI2XcGHBG(Lut{Mp3-=BGCsBQOfXwN91CH!1neP=BNyxCF@ zZt4r%PmZ9(Hp;^ZUOgPTvzENIUA3$dq|U=(P}WVA1jVYc4l7F@P6nDQbTgdPtSs2j z07L;l)|MR0JFI}2jlEtFLT_9*+hGH-Tss!MYA8IGG2)-+`ffJ}2SmrT1ngMwzR3iL zXj!{;d8chluMcE}KEr9_WSbR;0>oNYa8&VcGpboA*fACmQj6|! zT-+LCmBur63E3sgO9RxQESgSd%8%Os5rqQ*v1Lj$QfbD2CKF+d=vipJ#^0YX?%9Ql_> z!oIwVVMM80WeHNbvboOcO?2LA7*9yICwyygRt& z*p0t``M!6bdG_$LFCTyTjgzmv{pDNle)I0Z?*KWU9Qpaku|IQ=^WlfzeRSyCgYSLy z{yQfRy>se=w?2FS&0`y>3t7a)IzPKnR!&iHmwj01A4Kj1ulccjJ8T((~7W7$0lAPl!_=t zN1!APHKC5HVpKV8Z1@l zGO7M>^&PK2bMUPkerK%N;ejD#;z2>C2| zM$G977-cPL5pIEb1S(vSw>UKTAT3rkAI71hO^t6WaOs4&<<<$pX0cntgRv|ZkOQT= zI6xpeo>|sJ?iUqiCg%)@g@w8`;#4l6dNmTB0Hzi++LhQDlcIFU0+W~&&FIO9h-Xza z8zmGf=4QDx0iyr_lLEci#9@mFkOMLa8HGR^Z0pHCLr_6wZ2$wH5%3Hepa@(63&99W z*MHV zIYJsiBMgjWWU_3aBL%++hBh8#rd*u{Ba=tNj^74klH+UOI_V$aA_p)I=B2??LPkN< zBE-uEjQpfS;?{x;Df|ozLkBLC2XCEnNP0q=cCRAumgPP2kV(J-#+F!Q02Sa9xU0dU zXauEDPQQ2w8dw8m$dFa^lSW$Wm(1r8x zV9h=~ktZ6I7ev8kKfXAFH&LYls)wieUk2tsK0$nsQp zREP;vXM?^t1?QfS3Rd*X32&Ig2UrC|2e1T;)#Y3o#-<;*WfQeJM15fuXk;{@8%yeX zgNk}Y)f-X{<4T$yT@9-MQ3c-_BhWgdB|tEfu?xF=(w?A#NQT*XMn9C$RD+5EY>AS( z!MGNz0t0KsOe}QGB4~4ny8{Z&zeHviCCq{p)?*b=;*Cez<(3e}B(xJr-9SV&9Mept zb@N%nWJ(9N0nZFX)w8Vz;+$6FT;4R6(%~)2SfNLncZyRMey2xL4#+A&#YjRk7^RA$ zSQ2K|OB>ET=bZm`&N-L=*K?Ns!{0UhkH1r%|IemN|HW|0Kf4;w^S4}NTYRqOf`5z( zE=tQ66?Dx79Y4&w#CXv^Wu%MHD4X~-hj`E-9rda@G|e5F#tzNWxOmZsPo0!5DjNBn zI$lP;xZALJBB+}TD63ZT(sY}eN=AOwChV~a-5!0LnQ7nVM~? z=tpPp-o0Jw8}o|ME+4DnA9!@3_IQcEx#rtY^{ngh++NSzTn^{wJ=SUglYn->X~Sv5KvECv**zLrQ+5%+bXc*BwPol2srXFJ zJl$%*8m=9QtS&hRllqx9%f5*O#;)jc*5f*kNv7JYbDj2{h^7+NEbDS?tWi=v2n0+5 zp1FD`h^H^_wANx8zy_FPb=g^GDKRTb&aL&p@}jer(Dh^TcI(DoAExS#sJlYSi8e}u znJd`QvlLO`?gZ87wBtyp9kz89_rB@)RL(TlVcAmm?i>ki>h&xGV^lnN%Ko|Jratc& z$f01{+V97z)>l3AowlKj0hn?1cyvSEH^w|6V3I9EA+QASrZ=fu(c_xyvahaqMq5pQ z7K#chIX3kB=8N{xoEad2{-7E_2t|dBgznweg^O6^aL&92Kf!^(%8I8yW585vs@|)| zV;lPe(;e1jMF%?Hy|u7wCJqq7DM$vS1Y%)4W5y{~wW>kUNFL z4}uv&4pJ!qq2Vc<_B7?;a8IN;`DbBGgA9?O~6syKm2fiU)wZlJta_r}$$Nqfe$WNb;C+E8lDIw>J58gR>@b^?6hic=z zahL_F9Xj;t2Oqxj?#HjZ{o!-ZgK&<$df@nLe;|9~-Q#b(|LvO}pM3Jgj!e`HjG+iC z0U!aJb%j_g7l~D3fkp!45GjB)0#ZW5t{uz+TrtRalv1xGCegE`9qi-D52GdxF#|KT zgikWlLWx`?!I4Cv0X573ROle&$<$&39t>v+Yyyf>(~C)sKu1aWev_1Q&R8`-7oiRG zqQE*uW+m`R2TE#-#&2igZIBV{P7Q; z9{K6>6MsE@`rjy4jdSCC{qN+)`QmS1p8N|S=QJSa*!N!?{qBoTzWM4XgPc#l`|h*v zzyJJCKYaH6pN@a`k>%P5FWDI#eEpGkt1 zr#vcPn3uV*$R#Cd(TaI$5zio{5I({ZB{cwn25B=sqnc2VkOnZL6E|BJx^P$Yk|qnK z{tH+}4KWXQ3m0vw7Q2e)(FvFl$+)#R;tJoV7q~P$zk%{w&<>kL9zCC8(pYA{UQ8u8 z#Vu4ARMaAr^7w!j@DHOMQcI($7$aHaO}K(a$Rs4a0gDJn%wv`}k%XF#mv+ih1T(U( zfGTB|F#Tdl%p$^OH)0lIpB=FX<2DI}v{4#8RpG=QnqY>d;A17=4dNLEWy=6~q83WO z;ruPwKy&eII6A4Q4o5x>6!u0Q2?|9EQkxQiSQHk>twGLf)=<3{@`2z81~>yta(X)$ zAi>Po$-tD6al~EV1dbp#>cA3;xcE9C9C?S%vXdP=rfhO+Tku@GI60;e|%YcGtwM#)YXu!CrGZ-Mm zp>Fc(=z9X60FC&_ejU}`F*5;Zy@)1fSVgCJeHujqZj|cdqZ&aZ48SR#1;9c&$`QgX zw}xt%0&GA&xQGr(ySOK+05(C%zO5$=gK1M|KnbM5PNfi3w)qucxh_8uP9>}vNa#m1 z#<8ra8r63A6}a0KQWrz2u7DD!87HOaw7R8j9vOwVxg~=sLnWdH?SMMcb}{fKYUKMg z%`uZ8Y~VQ*RJW9K5Md=)6>tb(lXsFx0C1=lQI8~bl^~_B3}HhP*A8N*64!NjWgQ+_ zK-WU-#A>Uv1gA5!87%Bltw!*T6I+AxvQ z4JWjCBA}~3qJpt!8OSn*>8x=urmcr5EUg|wInsaq2m9h*n=kvd5ytw$}t-=Wg_aZU*q#=rtFJW_?C90tpI?&f`504e@$B2U-VB`BO~R& z9Ub!hdBtEkv}Q0iUX9+=seiU#vvMG@bu`M%iGeX9Lg@q8_M z?NoZS61~1n^9bN!G!EN6p1gacU&SYn6(QDH3N2{u9MiZL{qATmk2gbYa zthenNjomPvx@A7|(t!MdvToH->ehuU@aFb`w%=CuH%uk~JPY;2-Cg>-yL8KIF|Z8? z=Y=%`j}JIzYKc8lNiffSB^3oKNl;46N>U0b0N_H_a!n8V->^s$j+Gwz>}-HI_Aia5nYg)X(bt7^d4SARj90 zIS?4m8Yl9m6=mn%nZ!Eg7@2OjZtkaYI)l>S3HuJX8(5~s& z=HcLM!3KEPF&?>VW83Dz0N@8$vYZsCGjkqp-aF3z_9*=VY4&Gh=xmrByv{d{{hs zb=9+fc^UxIm(&6LHV;v;(G~acbk^H*AsW=}Ozj=UIZQc#5e`8P+F%&U zu_3<@h=KtF3k(A-uzmj(OT8L=3(9#ZeeG`)v$(NmVr~Epd}(sFdDps zi-005kKST2!3+yaBWDf_gu{|*h-8|Zq#~Y3A`l69XUgVqL1;ufjq*lVgB;w#ClxC> zpD>23rG*#<#-h~ZT$=+M9056Kpnu34`0Um{ym8;V&piF%GcO){>GjWFdE?ZZ?|cQw z`QW1;J_g$y{rSi-3RnB&@Si?px@r`w_WREdzJ20@1IG`(dGyeMBL`pq=)>0!9enw{ zLod93=s5~h`}DQ9PaJsf_-pTc_Qt!P9r)nH>xX`P<8Z0arj@h+JOn%ip9*)%hOBL1)SY29eh&2G5}3)Qe(HWx}J5I+b3tG;CM+Ei$`KY*vdb8j(RE zz!9eoofu>VwlOOy7)&V=X(d1fPz@#I0B;O3zC|SjDWyaHLwCLY`U@XZCD3=tlk?f9 zKcD#QFBGfx6=mZ9Z@&KO-@g3fZye-&b>h!o9{z@i?E6N`GQuY;9*2!*Yaxh!TZJgl`2iDO#*d zKLBP{v>2r=8WBFDNGc!+H3l|76roE4guq=&t#NAjUV|uXm4vJka0O_G(~kzmIJJD6 zvW3<6q=KGCmS#iB(GqNksjU)lI?=F3wUCs5H6pqT{_!&b0FRa*GzqbT2TtG=u))Nj zsgRCYMy?NBu_|cCZ#z-G=_SZdU@Rnk{$*iti%V4c7+)ZIsGFYXhg@y#Ne;J&#=^ zCb0p-)XiWCf*inri9n09ltYqqNTOB|SPT4?a7b{G%lW~F0X1X zWHDwS4b0DYW(i0}L2}F#hXy9W@?gX^GR#1z1H7TU8b(w2EO;HZ3`*(26}%&QVk(di zs0kASX}~jp9P;Y0qCFnw(gC_)61)h^NneJP4>%QR{0PtueZnS6@z1&_oGfV<6@$uJ zT-WB7wR`0`w+!#w=~wndG`%rxUtE`Ph|3Ypc+OH!=z%m~o^n`2@Do(w$Yt8V`hZ4J z-9*;Z8`Wl=l7NBN=~sYrl1xG^ZWYEX6q6P(@?b$`z$(B@↰068j@siKIR1%6hz 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ʹZ$@OWdC`4VNr92x7s2;gWf( z$=;RG2QB>mya}u_ls9!Gv^kHYDNHhJ&x}Mmle&nNUkoVPW7_E^M@v)NnCA4g; zTEZd3_>nrxhT#w(1jrG0i9rZTrkXo z4|Az8F!Lyr`p^1gfE=*8Slf#Q8+4cm83GKT2;+WXs?9u36f}PU0Ry*2DCSlx_zQqK z6i&vV3s?m>1k?eL5dV<*1=w}{`&k!U!A-9mkW1) zzi_8-ct9f2_?_4Sb|;FhDJxs;{(i80vZ6S0lL66x72dUpCHDt`+{k( z$T5#vOw_~(wF&Wg`5cjqj}Od4Gbp%vIY%iZl{qby#DPIf0cn6JHa-m`6EKTm$CF1$ z&GQ(9l#!z15(Y4qJwsNM@MDy70TpHy-=!DQDK$T6kpg>M2Ki4rj-5Sn``*a|HxF#N z^2V|=&yMe1y=YT+?!~d}TPwN`Ju`jgowXO`A7c2gG&x9 ztv|7C$%jwR+?eeMx{MkLM=zy{p9%q2P6bl=wM@Pc^BM8!z}%nRQ||$2&BOt`e;H9 z6|2SjDHo92N3W>C_hlrh45~qd_mj`zS67O7OpZ-8ekoL4iX1o~f4tZXEb&?R!H)u9 z1F8Y=5Zm*r05i3WAe*oT2P^Rl#c>6XJT^GRIA`t$r;+=Gkquy>#Vn(GI9d@Xg(T6~ zW|mW|7di$h-X(mqR4PX&qQOQf`9sifEdU0n5H^z&22=yvI<8qKIg)E_(8CcMTkiNJU9qO!X-FPIAq}2Rg^`8Qwe-_BL%d@$u0}SZTkW6Jv+z#_&HW!nb!y*|F2;jl$ zs>LlrFb|+2!{qZ|&VozQ$42YsfR&tXBS=>xhQE44j zbrM`>)D{E>9sl1>vbxk3p$^e!^D&SwyuWZj43!z%#8IvGl6E!Dw zjd5*zS|7EG!d4+rC+ZZJ!nJI5nv_@CoY3V%s<1_n_bNIPh83Ouft)4g5CeV3i?-)S z6MZRDoljZsSM{e&j6gG`wE$X%(x$Z?{)xO5K++MVK(BS>z@kQHcU(7+Ho$y`sSU{K zPZ>I6+KHkS4Ris69)vSlX9rr0*V#cVtr5*kgJWHH094Z+)wD%5!#VT%?!Z{Vf*Umi zR0CPl1}6LrP>Op2gq|LZf?)tr?O`f7v%K94jHzQZ47w7AwOv7MvmO};r#Ed}UG@)V zO)Ss!r;X!9&<^1Z>n7SXK!ICeo7Q0MaK;3_>WS+?J0*|2FJV~P;KH`xk`AVfIKI9d z0F$(aYD-@E08?!fWK!>^`!Wt0|6GHkC#Ee&HPa<>RZSKwRB$GyTiE0v1?rrs-Y3Tc zS<>QJ+Un^`8q*Fj?v6*nrtScQz&}*Sv+T#Uoe?#57dJXE+sZcgRM8BQS>EDYSN4&+ zCZ?IGvpv%ve!4HbsKM49Rrf?SGeyg?7WcX?KdVcQ!Hb*hbB(s{xMm^`h;pv)_Al-5 zogXqC84Q9ewv5C`SFPQ$w`>F3JU0~GIvPLLDmvaSTGkatf7@t$U)l6-ljenS(iH&J z9O$+l=(cPfjBFhUqn&IQ9q6&rF8F6Sy0_E(LAzngVEDO#@aCb&n?>!udeMsB*g%8# ziJ=7Ua4DW%_>9MB!;W@HJLkoN|7^WJa) zwDZzzYWq~;&7SmYr56iyjIS<-jfHaZJVI9pCgNUdJDGM7RuV6ZnQJf0u-I~ zB&D@jTSBTjzZ@X3q{T7GI7Yw{AerUuE*xwQt6=kA*!oP|a>f9# z$@*lCky?+ThVUk)p1~s1RA`vw&KLn}%n-5hlWs9^YekQ@zhI30K|71fp20eE+AGD( zqm9;bRuAUE*_2y6P%tj*^7P~kK`Sp8l;hgx#v(u6P>rO}kf@ zKsbII|4)?PPsDOx295F65YkZG8q#+U4lt&2KCf~C>7-Rv02nCPtg3=|0ANG; zIgjxkdz`I@!=nH>CdP~f1{OTnBpF6&KmfV`y)b2Jg!AVM9-l|?V?ZEA?u=xbX$+~Q z!N3wO0KEWyDyRu+I7dC6 zUORd1=IQJAF5J3%`tsdl$3HuL4v_Qpg^#~Jf90!l*M2#5`@b&TZOo^EE}$IAIs2xA;-zJX*0 zs<9+k`5wK9b$S4t)Z!Y@nqI~QRJe@FpSGPiwfm#%r?1^Red^YMt(SK#JF{ca>vN;q z$J*Xr-FNbZ$*UKS+`fGJ#;I2?zC3htb^PFz^VquPclu24k9yzgwZ7J-+uf>pp(NRw z<-E~l`e4+%f82dyb@uS0==taC&ThzEeW&-@`=j4|y!*?`CvKiR^VQ{#zkhXWIv&uH zx&Rm4<;?3VT^AF{KLAZFwD+~um#PMfJp+z!xO+3pWT5+!SsPZcpv~0 zrXEg(p7EJTcszU;45$D&DTfLT!$3!Po)ibD!jT&Ey#`XNbL#{k9Gwhztic<|sUiV% z@VSt*(YWjuZz>vI;2K7^y{dv5I-Dw!E<_{9A+Se>2hJz`G#-AHASK%3hrsw`7?@$S z1Q@w$DyoAH){G0$BxR4j6?lEuD&kAB+MIEOo|{!{*qeozkd9gqHWn*-3yRz$X*nN=%_;*jf~n zMZ*T0ndMb#!F&dyNWFkr^8)t;0ixg+~*~2;zmX}4bWwh zRz$7%pGoFo1lhnatopN4RqayOpu;#rM6fk;ZY)oz7cT%{)Oi&&rDaY`a)0p@q8s-q?WxCJPJvuW7$egzfz4l46b36KNE zXx=69Gm>J!hO}LnbBYsIA;yDGKt4raiA9Jb;2#!&aIoM8p2=X3)_G;P90#K&K4xq7 zD}DGlV6)n4yRs69Wsz4Kam=){~gEUrPWMG7I|~9do^b{(5U;xVGStbuhIx zi$Nu;zYM$qz~lqUf?r+?s+!{DkjV#?F_+Y9;6)r_piVBJNV_C4fRkU2!P%f9W*6fP z8OmB#wE2c|00|Yicd}?-*yI|{TQhFiK*l^;uwnr425(nS!T_-8VeqCYplYH3GuwtP znC#?>=!|N|3)Uxk$RShkP@4WsgLAIQiCwS_Z~_prrX1)^8G%U+!P<$EZApuJxIm>j z$(d8M%{9BmOIE-P00UR`r|6P~0Psc$PIzV@3UUB8uzC5L1|w4?!m93seyZNSaUe2M zv|-w;Ti#EqYp&k3320REDL@Xm5#XmiqHdwUHWL60TiB7f5zqpsux$z`n}Vvol#yT~ zXKssVaqU3HG+DHPh?;}7ITzkQ13u|M%7E{;KWV_KW=giPthp^z+Xl)iSXZ=r*>F1m z3_5_W?zkRrX*sT2+~8oJ5_kr0BfzXRqy_|{(-Bq=rHwQ7j%96L>|*l8jm{^!11nqI z!zn{wTmzC>)#jNjnEMi13|Q0QTg&9k48*lVDIIubVT1k2p5SBvI6=q0&e#)CPZup? zIn%;A>%uzQSVq6H)w!`hI8$exDw+F|WbBR>ENi>`9^t%@3UY^Z>CEjZ_zTTkQJQUqB9Njt+J2B?lU$$;6`=9FYJ>3=9*KT^h zQOo*vHV=dkHA~L4acOse+6Nt$J*`Hd5$1VuI<>EXf2>`!b2g3LZR7ESea`*e&ZqlA zXn?D|_5364LdwILj00oNbaD4K2^Mw+*AK>a&Lq$EiTAfkUs;&hIY*Zt84Mp8jO?J9 zQ=ppj%S#__XaVN{X|Q{^Q~O@M9BlUd2<7>F&_g9b0Y#vlmlkG@_iB#xn07DC?_QRF zb$Q`~uFwZPVRT+yo?kzaJ5bi{X;UoePrSG|zjPq|L8qS8ReO0cCF<-S%Dvy0-L;Gy zJG)mD4)$1&_vx`qNV72WT4x*$6a<*TkvGbz_Xi6&&T`b5Vco%g8!kj2ZO?H1f$4UP z#DEuO(@Q(t4MD|N$qZZ>%oza&^+DxWz4iI&CXQB?jK^1w8 z8mwE!qqsY!t@F!fn`~^Ao7S+hGp43`nuDRitP#jj^2@ZRg&(mA`*OxrJ^s#=K4j*lJ(8hr*OSp>aLB?3{Itf@ohe;gTobbiIuhEahQr+%eM3kYu?c!}#>E|O3L&!# zfhd^s+3{Fc#t<;`LKqCfCpiIg&_d$Q0GotMjBU`w4H&stbIvcrv>`JWRE9a5Vrm9& z1ZYD=Gk~WrPr+$vj~J6|o{E!S$RW%JWFVGBWjDqEb)pWzaGiPgvK&|_;R3J;`wGSl z!y$}`yTu{9V6@4$vOmy=!EO?y#_sFu>$~zsubCTh3j0guKY?lofU3r8e)*c|*sbJ)%7d-q3)$4rtAv*Zy2iW>KRSz>x8??tCt!4wv z<~>$}K5q2*V>Ojbh}!&l_iJ|o3BW3kkbj0;G)#dS5_bmefM@tMT#^c4l4KYdpz&xl z=28AbkMJKxdz2a&gEC}bIsFlVhPz-A5EK}LNvUCxqXyUl)2gP5IEMyPz!(WeGbR`A zLM24!Gb(LV@umXiI1K=Y;J!c+Ch!bUK}kDU5?ext&*5Qm+=5kkLIVzASalUOd=PFm zAE%_;N-zwz5^gn{HZ3Req47)_bQLfLSONo)Q;m;6p=%WtBwc_batd05jR=Mj2+6S{ zxc_H$25->e)&K*zN&##^m{8>RpcG#(U9({T3k(JqlldgT!sS~fgaq-eO=Rf-EB}QHC#?4>u-u>;~-CsYw z``fjTzP)(*lS?OVUOIB+<6~E^9>03~?Cm>euH8Oy?%wf}pPd5aT>k3($Dg0R^!14= z|NGRvUoPFe_xu*{m7LGzb3_0Yos?r$3yeyEj6}2LQh`7%!Xj(X0g*}g0;Q1F49tLe zEu)Vt1l!;f2)RPJfIJvDu9tH_9VR6j2V_E#RN^X7jh#_Qvoo1LRuv`xu*oD8&xXE& zQh?M{NT-^dLZBlV9f38klak*?BOxCV*uba&FjRwTWCFfQRD)GX`2rA{Q2`{N7&eDN z@#EH$cQ&6td;0UwKl$y853k%i_Ug4g8_w)l`qqjiyO)ifeslGequaju^4o8|`1u+COyL@xsiaUp%zVYsgk6&H#@k^6mz4`RdJD>gX?Kg01ot&?caMfsHKqFTxCFXJI zNdh}$k&+aFi9+mf#KyRx@W26VRy7~c0{RtmNc9200~WH>^3m`-an`99*|h?6@bU5d zsURzlw5QQ0rxrbDyx}-S6<6^{DS?MHpt)KJX%gV2C8te|P)R-f^LaS=s%iiyK0V*6tT9kROSM-A+~vn?V(?7FEQ;GC0RzRJ1@wZjN$An?On@RK#gbus z)G7+z_r_30KCZRb)_`6BEnp-xbXe^H@C=(p!KwX%(hyBBmIqIBOTz`A9wiNRS7>Fac(1n-J7N z`8E!5#x5#(q@*A1q}rgQjb;~tj&K|>(-KeuW{6=_fKL$Me2|P$I^Qg-26*M2H@1-m)Ch@m?32q7Mv2`5XOLQa5;zt&8ez#C@VoS0Vb;_&X85ez{9jy zKx;%Z-r^c+b~HvcF}uj8=M{n~dQ0hkHf zMY*7|6j6g`;tp{L-&a7{T{M^TX6z;%lBqf;5Cu3<^eZziX-~q~n}p#@FwmDV4Q4FM zn!ST*Q_L#Lxa6HN{b=6WoiMO|KM>B6CU-Z*eaRYwwPOX_;uiN*iBj!h&;v8pbTKLZ zK4sCT=u4Ys8(p9aO1sZnChP3$x`P8*GaFGhUbL<44gz3$VBbfzIJ;#mIn&^14r}U| z@tcR^Gxc_G2nK_8W*Zy}o19>wo}^)Uhxdi))J&rTYrdcHk}=^%FxhcAcx+W?00$c> zQ%i-#FKTjuTUtZ4c%8r`bB#{m7U&v0gA0381`rMfKzij^-l|SNroy#ocuFff{j-fu za1q{Q@Cg`ZI7206fHb37Gw22DCx;9pk_KyXC}(Z}T1T-A)5@|B2k{%px=2fHX|uaG z0Yj6-tg)WKtZA%Z!8!r$Ks6A{bjb>M>y2v{HQ3gd{Tmr#=?E&G==9DNEi=HIm}VrU zpDS5cw7LK}V;RF>g5=If(V=J=O6#Zcrln1er+R{zsw1LaSZ`a>=y<9xNcDxh@}gfc zRd3tS6PRprHH6g%n)u7Qqt6Y;mUZ}Aqnf=PZpz?i^7s$8DNdJ#FHNOhm?Q{!uT{Ud z)BIF#5N*>y_@jQoxw$AP2owR#c&lD>xLNXSZ*X%zIdk4`HNDxO0oXj-A6eWHI?^gS z)aQPFD2j%&dpm46 z2L~hP7H6IsORpV>t?W;n?pL4a(>*z!ndl5ZJDuBC_UHhqyt4fEbn~u!3 z5(qJ_p#zJ0FR#vT7>>U%ml>HzCD+n?yCNVYn^9Kh3` zHBQu9M@yF0s53qf=<|lfT*?I zzVV_N^wJ)wovODkZFd85fI8*4W)cSdSd_rYEpCg{;@XAH4$wu!$_K*$U7qX@u(XqQ zQWV^hHaEjFLZHGx-t^>982kV}0eEz!4bP57J5o9pLdt1}6v65{1541n22NW- zJ6JFSZ*VP60ZV$b#wUhCAfmWanDvr)0PCNLIYmH=u8e-ucx{Pgfbp&;14cli^ zJvs8g#GRu4yz#|F8Eg|yVbUe)%NZ87IYBiTnej?MGOw;Ij5pa*UP;s?>MaFobOs!Ag4e$xe zV6td{F|3{eZbZARw})Rt-X!KAc!S61a6wIACj}o2#KVQK+@(yFLw1){b7J`lr_cfa zR4foygTyL8V&rJTcK&=E!H2*{qk$qWmHmgASPkl-XgY#4Ciy|goF%W0O1Pj_SRv+7 zGQC=i6$?dNzCu8v%xr23Wl*TdHDO_5wES-SwM`$~dHu!@*Khviqa)v4diUPpXW!kp z^M%pIy_;r_?tbdT&c(-{XxcmK*gKcMc;eJYAAR%Tl^-u(`Rm75zQ2C;ubcl^|6r_O$L{-e)Mo&V(M`Jd0+ z{y)cWd~^BZ&-T7&P>D5S4s7O{8kvO0uN6|Bj8@926~P3S$^-)J0?BGcm2xU$icdjX z*w!E-Sm$OXrH+8yj0%oP3CO8}Z4HW32`aUcYP*_}bKK;O;pk=6K9k6A6asRLj6?yA zWVF{nHP~V*bO1KsB9#!fHJ&pdN{qEh`8)sv?0A^?W)%-j586?39a@1?EA*Sh5t|Hn zqnClKcus@jmrcj-K6mcO{#zF=ef!0ozkYk;)6dWDyS0DQhr8AudiII4`(M3u{_rQ) zFaP}WZ@>Tkuit+9^{4Ot^4G7v{_)E%zPx(=vk#BoJ-6r9sn>6x+);q_x+&sMb z_KBD79DnWZiC1nOeEP=zwU>8|oqw+V;-F#B&Il#2`0(9DFE><&$y1ata|3j#JAN zDFV*nO94INc&!k0M~*BsMyG+^D20H)1`iyM4o$-4DEL(L6OB+rTvb&muBs4%XCyps zt*{bIF5=)vP3(;qUPzvt8oabXCQv$j$o|zheicM9+ zk_?VelT@krl?pD!n|XD7LJ^XB6M#k{7DkuMCQdo2T&7FIbrPru(3~3l95~=2G>f7p zGgZie z#hLTS1N!?i&>5K2HW7uKX}Kn8g!n zxXIa@HKkk<`fF&`*ju!e!nFyvv@@Y^jA^1yaWSY$xuqCT45?Zfo(TZ(+|uT_wzp(% ziEA@%S8qZK8pkWleWztlm)!s2W1*$$IDNuHamgyUq{mzqTW8=+9W1 zLK3Ro{0AK(} zm?+tob@=;fS5fjS2XmI;ycL7-KGX$jF>I>dF_<;CMYT=%yd@jp0Y^YAu=UY@W-vO_ z=q&gYxDaOnPJo}bhz5kPq{aQ>bQWVURa00!oHOGfm;~P%%Qj#wU=QF8Xw;PeXgP2Y z00XGNfc3p$fKyLgTPE2kGl*rpU~LU+z+hP3(l+`;SXI^~>(7`r^oDRrXGGl{qi{Rc z^V1eq17JpS_y~5K1?{v)G@}K}3b0Vl40r|$btUynI(+4%K7scqpu|)Yb+$6Is763-u-S6M6Goo$ZP4z>-G$U_#R$*R1RC zu559QWsF6aWFVm%&l+)LVaYO+H!Un0pY0E!fdlKAUk&JMWt(R#Z^pE35%p-!w7k{b z8P`Ru!i-xA0DGb*FqFfWBExHjhrDql1*ADW89O~0eP$xRc|85XL>v(EZjlBRzId1X$wvk=VP}(B{6-+u7>lEj7!#!%qyx7k5PtwMve+i=G-y zzciOy-JdwxsW{c61pJ`wT9iG~E;-&IetIIaYguv4aPoA&?9zy8_i~a=o9ha{QzyAJ zB*#eB0d;0k@$90)PVCMyi|o>z9?-wOy6(;Ojc=}NIJ2~f_R5kh+ODO!LuJi}<7x_W zTaw+qBzt%yePlEX)M49+LG!!ak#(aaKaJh}-PZHNy4_21FU)3MnoS)Wu)bYRuyJcI zF3h}HPQ2P%+(EKw+1<+tU=GhVZC={?+N%29%Zo>bJ-{2*b+dbU;b5QrwT?9F_CY(k zsB_VgXJ z&vc{hh1t|pgRMEFYzQhR8>}E45KGZ3Z3(N!OP1M2`((+|ozT`ZVQ(OoNk$v3oX}3x zSvHMCFdowatNL@sr-#CWIb+l&NV&vaN!>u!fNjntPTGaTdDE8BNMBkXwemAANjaf= zdN2fDira+|s{kOebu!VJ)P?OrPzTT@>z8+B46GgiIOo~%SVvOlHF6_%AuwaOXsHjW z{6?P7$i=nm`+{_>m5=-4ld}GqgjF}$!ajV-1M0h}^=z*2ik zhdwx}CvV&^6vExnXMH;pjg)KyV)5#0uz-wLT2AYNW**oHB(q~-sw->2jaapSZ41-G zbr#SI@l4*>5?A-+D9#PU(v{WMM^v3@eas~S;Q)KK&nB@A+4vd16tuH$I5gU13p<2p z1ND}R$flE0#fBw%3z{X=F`pkN7 zNPB>-2m0qfS3W?AItw0qwEFQ!YyR-$ki&;@`w;4YPrv|=K0<5*!Xe0EIOop~);#bK zH6RTRvRcmoiTU$L02+jVs|bN$+0PR&^)v~A&>m(;>9NNcU_}nt215`>YDn`ygkdlN8K)C%VIUIZR0+{&WF<^SzL-~Y-;@+l#17-S zp+AUoNHa|?76?QFp-c!Pov##BQ3gLOdqxl$=DrDrzJmN7wc_ep2`3u#|M=duTd!aL z>#Z+-ymI>cOM5>%x$W?_ojYfH54^DYXb?xA>+lP zu3o`~{Y~xyrhX+F;6%nFb!mVKn8eEX4Rq4`4Td$WZJ6e)V*$HBBN?Bo20k%@)PNQN zR|tB+v#R09xm+n=M!*xx1bj7~2}4;h`mKxzH5LQ5ap{C!1C`ozX@yQL2@K#A)z+kp z7mVTQq|^tSSv9hso;vo?b7$Uq{o4K`_dfdghfi;O^VhrIeEZ?KPmjO!@!L-x+y3g= zLvMWc$)~^m`ul(X_y76VfB&EV`Jey!`)_~y=YRe8Pv8CU)tx)HFC4vkq<+e=TI)Iws9Gw(sgkKIHJcAclNG?qv zJvAw>M$X5Nh0#6ZGoBeCAfeJ)i)+b617czE=Dr6;T&b5ex=+^R`RQr|OcRr)Q0hrNnJ$k<1B#hd`z!oLl!JUX65QSGRugSZROg%ty^(n0d=0BJA)paqCxojITvuZFVu zg9g4`RRx0{orInK#vEY^%fu}(@g-rCko40?;C;EXv>uH)ClL9WO$PEsdy;k0s{X4OTauZ{$T8OC-rD8VKpYf!a!Ca zB6Kh^jKNGG96%0C1+sFg@wq4@%*K=owa6<0MSdN*K7dldj3&RLH3)#Ar2L{&(%_Y~ z1eEPzRlQ#kG4lfkZqy=Z^ecK|+QxvQ&MPZ=Wmz`~xUrRg0(vf*Lq#!fxuOR z(c}S|yva|MZQ@oz(jf{Nc_9NYZV`Ajln8`nc*sjr1O7pan0PK#6?n!Xt3U@BhEH7z z)=riElVx95-kkPG;|_60+E5p+1-Fz!s$vlT1zNfb=K4r&*eYmF=<1{D!3J9)MD;g) zCO*KXC8=*s>C-MLjA`=fgj7kNJn5DtoYKL(ZR=#FGigY9WD&b~uxQ&joEU3xbj0;7 z5$(cu-_v6-fSjFiJrJdz5hd%08Cs&SfJGfKeQQM9mx8&k%X(xzDHB)-W9ovnIiI2{ zY3$3GyAnoR2-3h{v~ofZtf~*FFh8+S7Uq#Mjze@CK$f z8ccsc1!l&y?QuQUvuQX!UT1HMYA86ZXah=N0KS*ef)&?p9EkR$jkr-qOot8zbR`YI zDl8KC2bjSw`LghdGNy$s?$M$RY=bwdFJoHQ7aq!)o5O0L(O}NJqU^^QjKrFU3)VHg zA&hAb)#BE;*J{S61UBf3X~8oSMJwS=L|u++F$reIwRn**b63hRT(IC%V;LEjv^k;~ z1XLvS^+6SO0X9oJyvsX%!+CQmM<+Q$(VXn!!wkNo%>>JG*rwZmpjgD2F zzO`L}$%1(}r9*#J2by;{V;o2umbbXpw0o8}JEjW8{)85Iv!T;FmLnax=8$S}y=`r~ zXE<$W394Fys*$Ye>7F1UC+(DA8B;~;y0VWcp+nxw;hbs9NNja?2%oeepj_7Kda^gL ztSj_xhvVpAkP6pKB)|s82K`6++`AU#UR_$)y*PiaEcl?+ylpJDeIl`ABJqBc_IQUB zJoCaNwUcAPQ)9tx;{-p?4Mk6k_y9Z`dxKB+hBozu4>Sn()r%H)gf*;{tL z(`sHjn0j(3xoctec(3NQqIl&%Y{N);Szml#v-sUQ(URWSiwkproD*a5Q`0F7dv!_v z$+oL~ zlB4t5s^aUbN{2@?`*FubnU`miFV7_R4W$lrTVG+cs`2p;bQ<=ws9s=T@0CTlJ%ic3 z!-ZW-@-HtUXgSp9cyFMvdszW&vujE2&~)=_Wzwo<+kxqpBa7Nd+YPfV%D&!{KRDgO z!VlV_b~lXvsTTK>!;#5GdlCOwF|leJha)pBj-p?VHrwLdG!i8RvuG{w2Al&NLc=cb zW{}Ct#}+J9V2b*KKmahU5fyj_@Uvx{YH}NbbfDq72(86m=Y5^W-m^S5+ zU=n;^{Y5k8VQGiunV^*)u<*bePY#DWSa*$$JTT9UM+cdRvapTM?t*zD4k2d7wHrqx zm^tbYfN%gXpqC*=Hah7Rcjt@^(c1R3&TZh}LJ-KdnPmGPGh>qBM%zfE4ZBH?q$8tW z(dWmQfRztoL1)*BJhlKKw7!CI?NG2QXYey2b6Dg{3)7exJcGgYG4-Odw;`s%jU2k_ zmZWy$SnN*^K0tMH{^LIwQMEr;Jn#T1K|f4tW)yOU#uNr+Am?!|X#g;g1Hu8ZFac?# zC{1;8*budcsve=LH7v}K5*iiUoJYz5;0n+MLo(b49^#U6z=M^KKgPvz;t-6iB+m&< z8I@qZfJ<(f3Z|w_O*Ih$7zyOVI*YKyttohHJ|9%Wx>*)1p#HphJmAg4jG`Lu4!Qu4 zupSsf7Y^Wn%Zdj8V3fcTrb)O}j1!5+tEN*}b5$iD=z>PEXFQmC;0n5s+$%MV(m*x1 zi)t6*7VHXHaKfsv%c>FJ6h09q1omJax;x#P2P?3;N>s5x1k|BRn0Ptx3@+r?kdTyw zRB<_s!kf6NT2fOZt*Vk%S5y882du||2}{;I3{WW#25Xf`#nq5iN}|!=95J5@TEMPS zRD-6G!ZfG9-y0M>lZw|?U-zg}&`T6FhA3i?z)!ElBy!G;X8`m6vXY=_( zuYP>?$ek-!uAkX+{F%-V#+`dcorj+qxOVaC^$VBp-TLX?t)H)5`r_(^Pp+T7eeLwk zO9#$f-goBuk&D+49lvqlz>WRy-#vQd(-Wue9y#{ui3?vIyZqBTCqFrU{QHlu+&Ov> zD{<%qHVq%vvl*;HLSE!(0+tB50(4ADQWtai6W~!C`^{Hd$o;~x{8&}@m zbK~%d&#&M3`TMW__Vc&D{pI?{U!HsG#(^z2PVc#X>D0Ghe)ZeWzy9-||NYb@rv{3p=MSygYgS#jy`xo%#5!CD-?@z53Ro3(t3- zeX@~(oR;%Xww~G0_S=Tx|9N`u%VUSzTM7=XP%Y-@V4*@l@qzei@RY#G3PBa#G3FH-l>9JSaivL7?bPrr zN)Gx!Al9XW0bmT^gjEU9rKB1*gbauhv5JFckw-_>c(4W1I4DPmV^ebjW+Cy6Q4lZ* zeFlMD%|Syy!sOU^^>iF~lk>{SX#@Dta#@Kp^20EC0H6+1g=S!e^Z=xlI7@XlB@3*o zYOkIP%O-9YHw9}My#dlp%e!R6Bo=amQ1u%##P`TOO9H$BW$DGV zHmiaV4s$xxHRvRqVjxgsR5RV}Up5-=Z*;`)w5_7SM*HHvU~j>k_bJjIS$oD%&f`B+ zP1G)m*hO`b+I&z6o=Lc+L5r{uQuUQAI07yT+eM{tZBtxZ45|_?NzSWS-W3?Hx6ib= zyC@V&(wjEVHG6;u4FMI5{^YXD++ep!l*QuN~4&*Frd%~jy zTW8!*=U0ssY+J`u6Ll0M))1_nY;dgV4i1-WK$M1%8ZdxcjFfDBSu==bAa4OL^`uSM zrU4!a110KY%tgNngafd7YA}Wy;o1_+?xO9ff!NY^FZib}paRJ(YV!^PZx~F1wcV2e z?ckKMF;qKJw65(5fe`SX0DizT7|@%hYMW@d1ZIUxD z>kMESc)MC78rm%fFd;iLhCMMD#U)rjrou2{Atqs_JxZlQ0UpD73s46QJhQCBhigFs z*u~26oIy23W*O~q9iC55%7C+t0VS@&_|bwH^R$Fi=zwRY8%ejSKdqmvx2@?7uI&qh zc5r02$vM;LSkgx2=f`u#HQmA0oqkZwbe**vQLkwCt?3HP)!W8%rm>uHuF6G-Rjgv*oRKWu50p6g2WXAL41;VQELmo^S*0g#05(fOx@B<%68)xcl-3fgPwBwcz zWlbA<0?XTd2Zkd1dV?#wqZ=5F>E4Xxe7ESuiTI1-@$D3iX5Z6pe{m}H;&f`qRO@oJZ)K}z+x;Lbv_1KX{Y|3T_5dhry3PMa zw&uMOcVTC6Wp89>sb7G%r==k)g!;quUJ2vSv{CuJCr`ysX5mtUOkk2 zb}IYic%IxfeHy^YD~t1M2Ga-2#>1WZS7y?y`x9fW{x?h9^F#6tW4Ub$b4&UYN4j-K zx;0NuKEt8d-Fy)^?I3nJ1;D)-!#{Fcv1QIioPw&+Mb(CuIvjH0*V57rrrC(!pvNY z1ANjLQqHwFUznraIzN6#YV1Be5?RvjCXunYcC=)9YB)4fG(q*fRP7K zv_)%&3Z^Y%G1gsE3Mc?J&yK|gn2i6pLxkN$ZLZOhx#*SF2jmm=*7g0to{S-37pC2$ zVbGh_cQXNIK$@<$wQ+ds2C*!~joWcMcU)1Rar~q}yT~jpW z1M;q{-fQB<+~T&B4w%%M)P`()uoEZ?<3U6&T{Q-Ssis>Tn#`= z)ivQ@iB#7xVZh46$e{-7OsA{6VDy+cz?-(TZp}ad@Z&LZox19B&ai$s)RxuI=BXH_YK@Y#gR4}cN*$A40;^Ofg~3Xi zT7UscgV6}Td};sZ?_ayT@9v#z-~Dp;&QI6Re1B=*twXzay?E^X9Z#G+`u>f}7jArX z`SZJ<-n;VQ`S&**UY0>SXET5-=(D@p#~YH#iL_UadA@^>lPJN6a_K?a_kyDZjENGrLZoAkcTD{@FfDF zh@P&L%a!8+OUX+n5DUZriCO|49%zS=iR0UKir=3*b8Pe3ci+AC-oe{@k9>0C>{mB# z{rs2j|Mlx%|Ml0KSHHfv|I=ez?w#9ne(#gteE#`A|M{=~@BjOsfBfwq-+uDRrP6VX$&wKP%J-Fh#*t8NWrgWi^=}G{o$V>2M!4pkec&-q(Re&DycDE zHIp0`D%YjunH4n@S|+8aIX2TqNvdd7GHwmFHdT#7%>l~V)m*>~#sgG3LuhEPzsIBo#m!wz8*N!vS?LQ8ChjPXSXNL{Sfl2&l+KV-|X~ zR4@k@y3||{5h%zBPB00wZW3XmYBNSYET=lZ0yYz{1o%0Wu6xB9{ zHF2k8s9;;x>F)(&_>~E#6g<JA<%p6E0afX&fy%rW;*-IZIU=UU;v0xA5;$) zZA;p{fSiI~*`Ck?dtkD|;?Mh(tx+AwVSR5HyaX<)4+2pz*f&(LVk#^HBmm=nyx!5D zF^v|j*zL=jFmu!#_D(O}tw1?%!oADE{-rUee+ zsug8FW&o1_V8)8pr-x(1jAC0`R6CG0V*s!XzoU-0zBgr>X>@|JU`pZ_fe(U}3}P_} zJ;noXmb7}7wz^02rlE{sdAoOYS72G2XS`(XN$OX22LX!Mj%W45DecOh;IguRNr!K| zU>+-2R`-RmjD^k4*+%o1n4dR)wKn|{3+Z7nellKO{ zP2dgY?@t-=gTfK?HxGom<9d*M(k2>68J_A2V3*a&7|EJewz>z?#-@N0{QpdUX!B46 zZEuhF-FD}*{h^gTk!>Tf_gfwN%Jvr~lP^wzSTYC7wu9aF?URH$V4m~6!o3ar?Nh03 zlZofY6Q|1D15Lc;J<;Lj;I4(agFTLYomOxTg{w^@50oA6x0qNz51@sV)B2pa1sZlQ zb@SgX31-@ZFHENwcSVkuWqZr^)&23!Bk_qA-+Lv_8`KwvCem>d;W=)PU}ZvCQt}rPo#zFAm9%bgDoj zFU@6_^v2&QiS{&z7x%R4Hh!7nT>tQtxm8!(?3Fad0KE=;c)N`26( zJ=U##c`m(sQ5KMMY^s3v+Ooo{0G`F!{gX`xMhmYk&2OB@;|MtFP`4R)^DI`wv6 z`t80f`XqR;ICr4ibYjr-%98v`i?S~+%$!`=dwfYZTU}@8;@rEvxx<5Q&N z9ap0*Zgs5c@lmzSgr*~|nW(cqJrtg9wABUV7!T|j%o(vwyQ$#JNXfFI%Lg(k_+&+& z4A`@}$KRhdBppH=X^U$q%RjDR+$MsSI3>&s7tJ^Yfa%W}mv(x(Gy14ikoQTk3p#2` z>HsrIkF+JG**FwximF3q{O8CiCv{6Z+zj3b5>8P^LOWctVDhk45Oaz^K?~blU5pMv z(834y;6~*%$wreiC!w8aumNL$H(?tefbryLgy6@-1!&>;G(K!f@7C8OJQ5rS?cm>7 zpNSi=@VoQIXC|UuSp#@1>5&Z9S!O$2;3XhOz|6<-SC;2M9X=xmq=ajyS{-dEt=GT_ zS@}S$(FSWvLKCp^-3Cs3M!%xh4>C!6r7@Ripk#h-CJwC1cqN2YdE*O<(pU_Z5qF6( z)pO&qhG?xtUF9@zIx_m9lBGGJ!K#8*UT0R{l{d6!^=>04XcsgmwOx5*N7jH{mx0@v zH{P$419W-lLCU%T)%+*gpD7LveYD3OshRf}=g~*0QYT>J@yBTQaVq=|2;n^VVD*1e zg-{AhdxWiQ^B5Pf0hVClLBU_ZtKqVmX^dt78#YFo0S`XRedJNf%t7a&NBECELgECK z7&)KDS6A|Cs_wg7*v5E5I7ARQRmo%LWM$dNyHZWA7!EZ;6r2KdvABXsFaVdcIW{cP zfQ#7MF`gFo*8ECRg{D?jA*f*D*;pzA7jdfi)r=k#NJd19;DKbwufr%15Xn%59FmX* zr!l2Pfk{;8lg+LXFv7b$CfNoJ$LG%%E~vl&aShepAst=?zoJ%Hp_9QDuY%zSo)Pk3 zZ3}=gQUOoQ=VMpNcrajwq609fh1DpoQHiRxOnwEdQkbWJ1ja)`$6@Bmg)P4YN`KQl+`u*P3AFrMK;_MqocfbAi)(scV9J_b()>of>{rxvT z{P68xe*fk7FK=DDdidEhTRM&|iym23+%xJtw6fvwnvT=kmVNmC%Quf7zkc}Wt)s_o z?0e(J-ZyR^cy zDdYQ6^05Ur$b|$y_#VJN3K3r~=Npv*i$?m(rZY#jo!hhj)`4T69XS5k!4sdKJpav= z>py+*`9FU7?(e^R`sI%|E`4?Wt;=t(I=BC&AHVViRI|k0bIC7B)XB@PH{@E>ECpVOiE{Pvr7~el0dVj!ws6TjWAo}xM^WUGG`R2@t zJ4fCvHRmM&7`_M?rV#Q$Ut+#U$P;6!QURZ-oI`2^Mm#G8#qTlh8aya^JpgqEQk16G z244zjM=s!qxFltPZ-LR};|sY2KT>`TaFltqDz#!#@n)mf*rrA!2?r)Wic+NTw5fqB z@QpBD9sGEyLMR4}$EaLP$9!7K)#0!xgTM^O{9h{Gg& zC$!dbTv|S+1qgwB;!YX1fGA7_wh3Fs;3Ag>?-iBi1hJ3^fwao5=Gba$?6qX{dqGOI z9MBY-kOL3`&$zW*P(;>69vE~$4pGVrmu8&OIxkfigjEzUl3+9@w~#jpcjRh>3xGG6 zGhvt1`&A{T@;YPHX*y#%7?IeGSQso(a~Kx~$)EvXOtMPSgVyn4HW3E+bUd&Y2H@6c zejQLj07~&{2|T)Dy4H{y*J1$pgp>(jlQGiF7?XF)KqgH18RWk`Bt*?_VosjrV}niJZLSDyDP zT9dk=COfuCx1>3y>A-*CFbLB6tWTbBN$Ml&#+arQuFZl@9TFJ&<8_X%gt3EhXmllw zb4_m02q?M@W_Q|DP8eZ)7d#3W_d{9B(l&oj+61udh#SyG3ih#*qb01V^Q$m&w#nU- zG66!GLTU_K+~%8VaCRpQ&0$S{&eD@Mj}&Z0pAsZG*`FFofO$YW7&Fn}94^^G zXi4z4P1G9Gk2N>|IYq{)f&rZgeRs;(9I7RgJ!Qan;81I*wk-l+Gt=!DS5I3^i}ft; z3KIMTRC%AGD{WfAc%0H68St++X8}b_H#%YW_ofXK^>*w|)H^z2+U}$tyHkzM$$EQF zLI;qTZm>_)JBD*4hky@NP8enyT^%uf#!bG*&bWSIlY4oGpRL`AWnd&&s4Yflgj;MJ zimvGj3}%c#pvA53rv_r{`obg_5Z5eebpv45^oFoIk})oB_bx5_K~q>&Ij)^*aI7DQ zPB%I_==#h7>l3o6rAf3vyP74 z3$t%EX%DxG)(#{Fn*!5qz89nO_LQoZmP0R1B|!-1x_NKsYk)UT4#lv=*>{Uo6D{6V zy`hO#|62wA*&e|zkicvjkn>)H05HeaTms=3ZTr-_spCF;n;2^1`bioTa&wOPfwDZo*(3!R-!B)a~tZZWu4VvIv87 zNBS&O6=ycHYc9KMVfNy%_E6claya|y^1|-rg|ic`y^|fUEX||sT2^?YoPD!10bF5@ zvxvnKv6A_j!7z67UP(Er1-d*xmBcpZl>%S@CmV+&pqh+Zf+OIZEn~64 zya~ur3Mx91y2(a6{#^oBfCmQh<_&%1y@@%58INQjZ<=nh_vcM%k0kGt0Zz6~C4e+R z69t&z?8+`Lb}=|=6LhEa>w5h_qY#Oqky^mE=_I%XJQFbSTI1T~WgnQtXW#%)KtU}r zb!$TFF>r9}_Jodc<`_UezziIpY;u5h+Pk=wme-Rt z)JJQvDvy!Vp4Op(qr7G=#)D_-BDMIJ-=?X;;O3+*A6B*i*lc_Zpa?gwv?FKu(_@cO zbQx(6JV0S!1T&9w*l@K6NLrwpvTMkbQ~BV7RS!H^O_~9ZQ0_kLcoGkIm_t!vRYDl@ zKnOO_3m}1hHB(6wEQHw}d4xPak7D}>RnD0|kFKg<)YVw03a$d%R04=dMwY;XTg|Nm z?JOYL0lI*cSo~n|23rhcoim^*PzMnXtwZ~!xWu1LTW zVOIkZfZ@)BS~1=XO4cV!UCv=GSCz0zz!lYst5xD^nUF^zNE|V&Sl#`?np~K$XhsDO zmO2dm#$w@b2kze9b@kNSH!pwu!?)l5^Y>5g{(Aev?>{>D(Sg_ZzIF7YiywaT<+nfm z^xMxr{r0ba{onulfB)xizyH_Ye*ec`zxnRYhsQqLxBlGoUB{M0_fNPFuPhx~UA(w! z_RiUTpI$tE^YBZTUYNc8&eW~fW^TN-_R3q&UEI9-;_Bg>n-+d{{PYhWUHs+V5AkdQ z6hR?%JlMT5s(QjjBYL6FPTBtg7~$PNv&OVi zKrRSC4i(#x(H4Y*8Ng0Lo(Ok@{SQ9Dy;!>+oCA^plTp$Z90GI!-hgv-5>lE*(~1|UY2N*_} zP0lGTdE{UZ&h`VSh(*M#+evTVv~9iwfa7Tm7~3P=D*6kHVima>Z?X3DyW+k`Cv zRZBqG=vUxW-YtdohAr#!N!mrQ-U@CRRt5a9Fd}cP`-nQS1wa%=3xQ~dsK&@kf>?AM z&3qF<5q$N?dsm-d*UIi|&Tiq6W;Ah!5& z!6e|Bh0Puu=}zd|qT2q9d9KNWOW2WZQOcj0sCNNoqBe1TP(5Df94*>GGF?dnFll)? zG*Yw!IdCm_V_~ZoTgqU`Szz~L7mx$u1?}LHzKj`LtdMeVQl^<^!YTj^w%7&j^k&Ri zj|_vsBp@O}6rU1!dRbc^#G6(PH9ipjI&csuD+}V?`_Gi1e`1_ z2S7xPp<3*giDw*hZC<>qc(;2p#`d_bFJr`Dyt=prz^Nx~%(`Vwq1wKTiN%||S6&xX z4dg7i(RjVRGp-xVn}G)l+kN8<&-7=EYx^TByMs8`9wkxf@se#re`K_1Z49c)N&Vsu z@4_}OZiH7FM{tW3o&K2y2c8@51%3m8%r!a730+r$(ubC{`_^^``_cwX4%ES5@XSQs zG@8*bZgwpN!?gRxa;C0G?R33sajSQ>!7)>3o2#>}?hdT&50jFFQ#_P6kCv>fd&6ZA zsY}|PFmz>1qxB9vv4T&*YAqD~Di99IyLse88PoH_v7xLv!_+P9PZ=kQ*8Zdcr|<(I zcTL&fpCIo|$s-%jnO8HS(!B{CX{j~ZXX|VW8|-B~*kJ8c$vW3y$Eteb+J#L{u+6i> zv8COy-F3zTZMDFg=Z0b+oL7tLL(S41Oihc(#wlUYbmJz_L;7vArw~Qsh1E+d*$3}wBPUf~xXIAvZ-YHhR6n|{6!L?;Pv3WFh zxLy2Cfj8S3T00QmIhQ#-6FWPkUNe;1Hk*B7BzdG$vA67gV^s-kg9b#oJR%2#fH43Y zmnTf`)pJLiyjv$yyJpe{dO}A>;uKo85FC=(Q}!JhjDlpSEiGIel%MaHtsc%U?@Iu3 z_H`OR9M$9at|f)d3!9Ek)SX=1ynAt$_3fNl)qZAG=Nl_axb+*W>dy8^j}2INEzUnb zlUp@Xc&#(BZ=&wyxg5z%FUsxfavmMD?_8AMxrlTN_V(B>jOht=nD%aO?t|fa9B12^ z4Wl2ePCqrC-a3_B)#GoEX_~{evn|f$UB1O_?(T%PFQuDnay&O0n{Kexhg3Nq*x2%9 ze-IdxbxR6f*=WfEv;e5UxG(zU{W;T<1EKz$G2swqJ(9kRfz=X-SjnlXc z5Vpj%&rQVJlSCaZT@9|qcrXvqj+IkPo0H?5xJU_sUHGKha3oxS; zRO0xuE^l*OgEf%nCu`U?l?2oUOhh}FYISb_V<DcQzt;81`WbE+w!b?R#XE%h;VH{-O&S=<_(*)~^8Qp@JvG{!X;P#;xe z7vp>K#=e3HXhe~04grR(9SAl=Yjv`DrAY0ch(nl!nMWQW#pg#Ksbb68fO&v750Y{K z2Vg^jW(&Xue-!0>h_YW`_miQ&fO2D)N}bdmVn~Udli?h4%TzAlR+4ju490b}HJP$DL2A z1NX10B%tC~f?P=Sj3fRd0|yu*HPe(-Q169vVu5s;%xT2(FO z)JV8BBAAsFYNdbyS_$T%tb8UqOT-rld3-QIt(Xc~!Y~!WXy-^^uM_Zy$g5-5@J&h@ zFBj5Z5YNLv8Q1Z#3rx-6Wk0*mce0TfaFW&oS0 zZy#AddUUq=+LlG19XkBu)vLdJ{!=;|1HiC_ZqU()s_~%!V|p2zEyHo?1Rxow20v6G zwy>x1SYS!RwpIzq$Yv91V0>ej$rz#FD>l6zBvVr(tE`ey?H!Ix%ohT0Bm%yYd@>ZU z#{_6`G*Tc9o+_9}BBnSlp_F`Oc+{Xu9^s9EDBV82B5092^vW+b9zC+_;^AYToILy0@iSkYzVHp&(bHd^IseU#n?HZ|-T(f-|L1@H z{^d76UcK<`xp!~9w-KCk@BGo5=l5UU_tcpeC(gV$eqvMiu}!^)*R~v3S~{?_@aACf zwSnNX_1fp^R9j2xJ(JPP2cG=+$d(U}z5d~f_J8#!zFar_&8hvLo;_$*2@DFpUQPsy ztxiT@hQ3kB2iBr7{u#nNhV*EQ*9K2aDWGHvbW z5t9g*gh7+grQvz?0nz&V*u!}t!E>5{MBxMFB zF)ONkdS2WiPP-%}p8`fNUOBFUMO7qjQBcN?UD6rV!l;6s)QXuy>aMu1iIFglSU^@34+btW%PY|= ziYh&TK~h0Z4^=g2$Eo1}MR22-MVN6&V2b6O5&%g+&!bv2q`D@Fnn;8IOod%w5BYgW zcmVLmWf-PXPx@~QKqG8X9YB#+%dsn~04i*q&BlNtY6jzR{dz8_CTbD5GyvL4do4MO zz*Jxr01vBD;MLRw^R;-{@M~7n^EuVHeX5 z%5njL;9lqqm+Uy3_bGv7AeLoa!Oj%L zP&EW=F}N|JZHXITvIi}q&a`QuV575Md76GyfrJa79ZJ?|k)llBLw8OWs**%ms zqAhFlJkcLs-r=1nn7iZJ={noG?%|_x_}Z4LsXfi0K6o4-lw22 zzcwGx5oDNl%kYJQ+;rYzYxy+$n(Y`Jz@aERx*g{`ucboX>Rt-)coK8Vr z>5{(ID`GM-$L}4F?k-!O>(p%@4ObHtywGbpT$DUYC3I3dW|B{}==OC;fjSS(BsLC4 zceQf&cZnWmf_63yCyouu_f#CWj8GCb^m(q+uz%2f$58OL!Qib!p%;5CuU6zMis5@^ zQyYil`v-i7D)J2@DUi=iW2plr#qNsx$xW?KZEm}DDtDwTe6ESLWhDOCDj-Vk)dAg0 zCD((q$@`|0_e{p0?Y8e83Rg`%0G?wb`n>~zN6FqoNb~lf{GCxL0EUs=Yb&y^Efzpo zcTOfBS&`b+qd45Js16I+-=}=3Lx{$sOW8*j(?>Uzk8U0ObEsAMqgyI(Y^glHrtrXG z0moMd)O-3gw@w#!E*0)tXgj#N^y;`1-5y<;+qsl|tS7O%?09e?Tcw@Hi|MBa3Y1iO zP2thCh22vfM{k>YWHAGIbX9Iuf2@+wE_6De(1U84eX_x{ex}uS?`(3i+0yKnwFKm7 zj1Ogt(F0(@OyQTChXMo4DVb}shVGbZBx}gJ zggK80*t6K}94nXtCT?FsJKk&oTJ$7z0V~gMCf_aa0CALC1Xuzo0jqjq8Vb{Q3c*x& zOho&c^Z*b%2>rg4G5Af~d_WFXxn(pwm^0!QrY@)SYm45Fh&p8ELV!28OPFEdk`*PP z?MZ6!2sk0Y7<0A^2EZ+#9Uu)T=%(QyRBgp>1^P8uK9q00yjLRMdfIz&5MP zUR<=O>d+sZr@I`@4DEoO&@CH~1Az?kTD`O;;Su*Hb$!q z<9kLyI1s=C1_a)KPkg&bO+HpZh$;cX& z{92QOP0nm$5`X~(-bfn3KMFxTG*<<`LCocXe^@MNwn8wHoKK3ZNeQi&tq?S1a_L_W zoj&u_#|NJK_@(DRd3N84_ddLQ;nX)jpZ@Z@&)>W7&fa(T?tbH~PcK}!`s=U%`TgJ5 zuUx)*>dRA~y#MZd$6h&h@cF~fZ9lMc^WjIf?7Mw>{~c4W+&T05qc9=RE<(iTp4N!_% zLHVE!6f#8GGwnr8Q933$MUacwEW9@vr2(iC4w-bSMjl8bOH$t;g)nYxVlGD{6>uPw z4}dLF3CUOi*n>6?&Jl6(VhLkFEc8+sS2QN}1}}u*M@y7NRW(6_S}_|iQ)L^V0%N-2 z*|mazS>iW|{T7MGBz74@E`!ji7n+oO0FT3{Jh|=F15dnj;LwRT-a7aCn_s{2*7-O8 zb>YadvxnX|bM&qAAAfx9>#u+P_VO>^ow|7KxW;h}{u2cm@JBs1nyhSA$v^vI;zUt{q6DBD5f-U&{s*Ma)!%vjAu@V`_jF z$EW9pnIvXF5nRc+r0sr1A2fKs0;B<d?A2tSVVu^2dJYx9F_V4fe-pc5gBTX4SQ2oE)<(v$S~Y*Ul)YTZT~^J4K-|UT zc|$jcx)JXOFoOq^Zs|P)j-;`vIpv~soAH1MYT&sn89sudM`o5(bb@&L@YuKh@^I5zk^G==vjh3&w8_ zD6tH@mg#0Yw0yjoR=;8h8zf^6Mdkp>27xzC)=|m~rl9y4bZ&EC1kBqL(+%e>>-&Sm zZ)ECG4&^NiU2fnFK0$n@lTFsm1EGZuCtzkcW1NNdUkPp=43A}vxN`eQ?6#rE*8bo` z)=-J4Kr&#P^}XH^D0XT6>Q2{EyJN1|I+WCmW{kMIp-A};@*YVksaxuFZN)fEL}-`` z>sj6F8_Ak_V%pBI3OoiB#9jQrg6K*~!>S(2y8xcS%LH_-?e*d!USq;3!6`mpd`WU1 zDd2E0Wmwzk?#H|G$(p^gsjLY+Gn+S;BAV`yYQDvO=SXy2k7usQ+8@_qg&-X8%vf4K zoYLWRvBR;l(}^EL01~igQ`tA)?&wcwi&4#r4(ClHu?J^Ud%LB3yTw4AyC#ye-GOKG zycb${+ec$}4o7Yq3?J+w__=31e*0K_zBlkv3w!T?9k{Y{E(xA_wo|uzz*Ef}0Oon7 z-S`~Uy`jJx+%T#?y0lG@!V+uJJx+kkK&uaTRa?SEa!UY$-Inal2+ zitn6??VOJ99ge)hfDOr9@^HU;e^G}9P9I&!94>1PmW`XovODH8pqgj80{iFN8ADJ8 z!1K~jmcg5*sytVYJyTBJGTj8c!Rf)W_Pq%u@Mim5?xyMHgG1J*ikU}OlU)e1Yru1G z)CsV846?52z=-#$N*0aB*Ei$Ju{&o!+>~5j^4~WVU)Ajby|f19Q%&ZPoN=nzl6HwY zLP~(mBTKoVtTE*x7qY>u@y_w+NZuH=3*rvJaMrl4&kYobIRp_aZ!~WhZ!!(%^njVH zTL`e(HU{$72TYtaPV>eG=i&gBu#FFL=#FW+V`{)a)XGb_sou`&qNkG4CtN}ZFk|yj z0H5@i2IAO1E`1 z)R(3(9&i+RW5Zwo!~zJh;@OA_w^Ck-O;u-6)@D3n4480_`#{B0bo-p7%@Ib$z$YnB(%fL=JvQoC#}J=g`i@* z&5G$jS$|n}BkLc3tFI=H{yQ2}`i2VN0ALvSq4tgcB-0HUc5a}w(RAfTHe=$b+Ds@= z2hT!)I*@9<>3{wm#|E4NQR)aq{+o4x@gk$>oqteyoMktn(fAL_*hVAc;*B@5sCEs> z{~wSrZfrmrUL&hYKDEn%Oq5rkfy$+mo7sQEa%e8b1&&8a+ZeM?)eHr8qR66uHeyxG z;AC~FRgt4yj~P{-fzHPS71T<(04K85K=|w`tMCL|ay)~8 zTX<}=p&iy5q>WM@010|FhY|*`xwy}6B&vb#h|Ud-VgZ*A0nF4lQ06qoM#Q+{Fg`gd zK@9}TA4XH~A$2%&i%=O(jUwh@b@4r0t{h2G3N(Xdbr<&{1 z@N{A_Bj6PQ`OttGP5QSO;KE|#wQ$G|Bj5;_HzUQzA>~u<1nBDu#y1c8x{?W+M>n7g z6IvriL(1n+CNVMNbtWKxGvFUtd-!C=0nAvboDPquhB7GwayTFvvx?`^3q3}$OD}Tj z1#W}Ts^(kO0*96w206!}6IRV)Iw?DBlN#k5C2&Z@F>9q?-u>!@0pMSpo-Gv{&{rsa#?;be)+T$O*aOH)ElhU;@*@lej&Q|4p-HNv!2)%hv`|*9Ze17D?6R&PN^~T-jj=yo?a`cE%DNqTC(3q;AjDH$c1*L2gCIttZ#ZKuWa868Kd`6~} zCoU3XQmxNM@=~Lh1Hz&7*_1C^&bF&KAP}1h(86}=_+h)mXA+`OO}u7RQ_UrOa6nT` z;V}y1Zh6!p^_zqM80G^7UDxAFj{Xp)mt^x-6s#(Z1 z0i$w`fLS(|^6#&M7G=L&$ho~c{D7YnQy9iX1vJ0^iv||iN0IO()MxH|hdTg*N8?>St zPzQzL;3%vyN@_7q(k{diQ^d^_Yy-sVjcA~kgXjQDaT{J5O$X)yP+8>lYQb^<4A!O< zE?4uG;aH_FNYyE>n(7)8X#~skn8G5MF8NoDM2ZEA+raf2d6j}?s@qk{8atpYCiEk% zw#ABXveOCW4}YzTX~PixE2h3Ps_9MXiz)qVud9iiCG-)8xHY2bh-sTbs;pm;bV-<; zV~nlCuYi6Js6ZR4DwKN&blJ5+{G@?pd`yV z%VevgJ)-p)cwnK)-+PEwnO_5DDdo9-ZGjq6Ov&l zpiwaZjX&>|VHd!g)qOq?3%(xMemQ9X&r~wTxI+ZAC?@q)!w5R#$7Hn0wskZ<+GOpC zs3DUrw$(*H)vJkVfj29=T%eS@#$!Vn0~E*GN5Z!bhJZKIdE-bzvz~ID`PTM$0W;%S z@JwJ0m?UlJ3W7ORz=m~wUNB^nU!HbLpkfYYjQ!;HCI!QcQ@oI$cqXFBd!>Cz!=`}{ z_65)d&W#i-cTOg-cf7`^Q(R0Lw~fV?y4;|(EQU%$EA`rs^^&Chlicg!Xkvq^S$ z*|C?&Kz-YIVxceaWUiVjEjZofo9_!g+r)dRRj{%W*)R~^Fc`yw)${<5uFP&7P44Rv z?(O8Rsze@I%5NM=zSJQB;cOg^-#Q-OG#m%LyfrF*bdeH6Kfb1La5QkJU-#rX;)->H z(I;}O*UN(SgE916C`DfEptR9g5(o#fe=M?RF!<=o9EjzX$=tKOt`{pl5DQ=i^2Vx` z=lZ;lVdRC(V~g3h1|_eS6pt@vAvk@ZKlW08vg+ja@LcL&W6F27jiUkDf$X1ZeQj-# z##zkb_`-1hnSspBQ~A|H=}i+&FZLJ?l(mm6Q9V$|-irC)fF5{5vaYai(EjR#4HR_W zeEN=={QH}7Z`?Lbofk8AOy{AgC!E63g89ygXn#tdb5nH9aK?bIE-(hlebytXr1X<5 z)}b8bK91V?AeND=aXfEKJB0<07>#vB_h3dJV|>*rDcxPFF&E&s?&HDWLP^27o!a~neeX0TP)aJ)+-rmGTk+w#Kovn5VZ0-iO1Ak6sW_- zP{5m;h63$TRnWr027x{6%HEEc8a)9{-3iT2Bf;*Z7CnPZnzflOdv99j)HUKtM_j$w z=k7`AfE-R83;5x;@<1$L605pC<&!KG-8eNX>x}Z6LP$~0Q05qms*ZfsB1$Z*E1{ua z8$GKfs-$GrX(skY&jROc81QHPGPP(~!Xw60cn?XB#HgsTDC;tQ*<_ow5Rx0@HDIBn zSMnF2MU`9r&P2|j%|zo+_zi>tb^Z!~Av4bZ{9g*o`70%HCO5VlZa`-|LZAYqVOWUV z#sDoh0#vA?4$%uUIPOyU8Y-CccMjwqe+LNtnPVCP2&uvhsHt{2Tf(VP@|Hnw1=0|u z)Krfgpb=wV!W2w&&5hh@h(AWdr09cNboviUegMJ6<;>t9A`X+pS;VfBa%)7K2CxLs z1prf9Ls{L>XsD-bX*?F?A!ar3gd9qlAmFe>9F~+)z_A({guoSG2@pua=ZUx+b|YWF z0sK(KLm97LNWNsCmpU1*2K*!A)v_CT=)-1_C5P~bvQh~#0yql8in)#87N~t1F{K$m ze>uNK!LO0?sST=8iRz#!YN1L>8Tru@te5c{1zfC( z3TSG`JkkIhGBPzEq3ery+-yGk`x|Gj?fK%h=RbaV_vg>;JMsMflZW5B@cD@!ez^AQ z&!@lq{)^)m-#hr>Yllvrym;cHk3aqJ_|aFM-}T5H`yah|_uWe`ZXJDksq3++{NvNj zk58r_8HqhP7JF(e{M=;Xh4J9a6Tv-G!CmA2J(Gd`GvPx^sUu5;ch_~E+*tg6|AXJX z`P$E?zxvOmA5OorhY~sqDfUB5{&j3%370H4l7>cU14{-_VKow~h`2mpiIft@F^D2) z)JmYlHwr0+gzn-Z00!#2k`f{VCfPVb7{djnWMI-pQ%DlHhyV#nJW~YItmHa0e78>E zH;FuYq2DC-8AVh#Q^C_nIC?qH1Z)riN7FU+UK%kUTwTa*ABotA>g#Cc@`CgA%Tv- zKX`R^4bN*7#vIb5TM={0A`Yot%Qq>QB0>Z+oKiT0@RxJ{>n<7w6rwm{k-q3xh_APRY3e5@NKgl|7A8 z$}3H22Begx*{|oKGe{=wl(zU31+T0Hin3b@Ev-F3zG39C#uTfmI(-2=yjnJ3!*AdM zb^i3Qa!WuIAtqUK${}j@QGxl4TY>@G0;+^VTn)Uz^33vjtFqC@qc9qd;u^JJnVP>$#b4%Bv+yif#i3}l%PH$x5?e6yUCKtPu&JlAp)DRMlR}N^ z@Ho_X`M^ICit6Dn6SMItU^GhBj4AYDa=L@)s16UE0&IeI(RA6rWiCD3?f}eqjojX> zak|Gn+v^6;v_{lL##}Q{FpsA6rHE##+X(^56#R1hJ;rt5O;1t}?HMEqp6PEgcg1xf zprcpb9@VZX2KqDRzLYU!6OFex`ZE@=LBX%gd*xt*feaB2$fq-+MPsVj4#??=YVko- zlE&#)XNinC3ee6{w{M}-1H1tnH2D?ij4PuBTXzgvg$6qMP|kv53kW1*o^N+<9SYC3 zIl2K|G2K|f0;IvneKB1rt_KCJ?)9$daP~#0KIUXI#pK|K5r8*X5|modOK+SkHlv`d zcIRY^9S`=!brUW2t;4Z_EG1F{Axt#efhfI6iWu=4cmNyFPIFKdbBH1~VQWY|-{k@1 zV1rqY49GOq=EQ)VVKsF6i6+~Yp(u{sQEg9*lCW(WiVPPlDGz@172!yu)A5-TYs4b?ny)rs)z9Funer}#c&BOrn5cEJ3VlmP$( z!s&@=Tm1?E#@cdVs>NQ8>o7Q|V{OTgmot!Lk`Qz`H&p_+4M$eA+9oo(tpmZ0MIX3j zIHjG;8*d@h2`skT`y%R*v>vE%(?9?ilk-%oeCik4on@vPPqSYRa9v;W4`s<%hehH; z+1wuldV%Gz$I)i%x{4p{m-bNcB7B{08VcjI>bizi-7*rL2UN$k#h7NH!+Ga;Vxq~4 z>tLsuHph+?S&$fjWGJOy+v|B?F15bTv!cZ^-(=p<>%MC&y0XJDkkF20408oDIA^xW zQjDt6d8yrT_e644m#aUn9Zefnb-6M4VuurOSWM^^Ivm@^<7>-7yxVqP3og)A=a?pD6oYuh{&D>pf}49E5jdokAolkvMIsoc%( z4*u&E;g*ra&J~#r!->NcITrTh+QK7Cx%ESdS4xV#U4p4j4>~_Imja$0?BxU19+*ko zKb^qHul1`L2Q%_dJ6aLHRS^P{?wm|Lwv;*0r#m{Nd2~Mg=n4={cHc;J&qx&QN0?M; z&-Mmh?vFgaGWX=_!V{|shvwUMjW=T`vggdFUl_>l8E<)LhH@A@I2C&ycr%#$GtJsu z@~v^ri#?hL=8_Bj@rM>Nhlg}PnuiuMlv-_7?zIWa{twfR)>u(%n0k0N#){nt_GA+%*-&sYy|b9kqrPcaDZzLJFLMg_?p2 z3Y!cm46+&^P0AZ<9t0X?{L-GdHsTQIaaUQ3cM^39flnIoG7KK~h&K)TG2LG%H#C!Spo%VN z|IZENhjzpNkY(ntH`Lzne{0AC?Vk~P0dlDNCzG6jgko|iy8w>WD?p%s z{(~|>;|S!yI7~PVrA-6XfM?L4=oehCW6Ug|qkpoS?KsREJRy)lgKY5`bV{S7TKiJ3;D7P#{-2I~b>@i= z4(&g&|Ild=&P#{C+WW@W?|lU2`#(RQJ^RDS&#ry`_E&H2Kk)M2eNQ}aboc#lymZ&D z2XET_=v^;vTlvhY(qq%j4^QQGj%NTlj}Av3ABjFS7JYUi`rJt1*+KhrCF2W&uIDPY zT_e8zlaW^^lkYFJT-a3pY447!pMLfI7bma(eErp1R!e#K6v)}EzEQ?Fn29AkE@OWn zyGu#HPAu&Mb0i-ZYWsTZ=@ta^c5$b!fOECn;g{|2|1l^`FUj&TW7 zi>eDCa?pr5W}WPlhh97M!h5eCIsM-Im*4;J%7@3ld5<~1fBecj?-Ta?>)ngE_2Gw? zKl|kBl}o>Wck!3suKe)hiI2WHe(cgahrfPv??=1ue)o}u_nsL0Y|reeH}1ap$y+~N zz4q<-OQ+u4_36v&-g|!Sm#;nf@%|lOzWeT(qldnF?a52;y!zA0lfPWJ+FtHb17H}o zsoJk_1dIV|u?4IXqLYALxK540qToUpq+wfBJdaW2)CnwVK6b}!kP89cXepsKxtWD5 z;+Rv8R|n29$~oj%D54lDi~t<+==gr4&>*dr2mRB3(yU-vm6Y$!u43HPh=1_4BpNX( zFf1!*7I^hkuO?~}fkpr!K$oyt5H<;-79q6%X0JSE6@md04vAOK_vtBg$F1Q29>_C| zp&;@ZgU05Tpn)TFweASHDglbRLh8In7Nu%4Jd2#l>{u0G52|}(S2codz(OGtKj)HQ zuB1(rb4lC$iYAbZON`NgJwP2$O%{w4R5b;Z5u3=Z<=T}jBa?U z^QhSXj1c292383fxG9^U$tO!Qu4P~q4C`T%BU9=&6Iq9{&@b&G>^j8wykQ)Jn4)EX zG?WQIQU~h5BOn=*jEaqtLCGPuG461nAfJvCvj{M0#KiY$Ic^mjG=(LBc>rA)vl@W| zG{R6o8bAw<7#}>N;4agOC}}l#MvuFU2bx*l5O#`ZDuG)U^P}A!yN+wuvP(_o***^# zrW*=wN)J96>vW8@+eb2np_Fc>*FD+g>`m*NgGx{h*rt>-b>c5sKnX1zV1p}NNqxj2 zN_%7jSqqf-QreXE%J4qBqWXy@JB~T8BI{N3r_JPGmbIkZGPHpcV|gnYxRvqX3P{5N zI4Q;r(EdmAmiZ1hj^K?JKS9fQ!M45>1ZLnn0Ipc-^H+mpfCm5@GO848T@h_tP&J&j z%(S`Im4bsQJpg7JY|u;p*x#Sj_eHh9p7o^wE)HjmLmAVG4%g;^5HO>IsDtt^LsP_n zXoEVyGxOcyip@|BBfgsdwDCoc{Y+*%@uau&^YSq+g;2D5K&Laaz6qAO!g%7E`P1dX+2KaSAR<4$ooW9-iuM++7Z zMXO&9p1EZ#I^Ajq-eAjU+&+<5+2biCbWqWt`~hz^_J?MhtivfCKnPHQKK%*pMBcPz zAPB-C<3?CjiECGNIkyf3MzW@YM_NhhCkqzP&QQjfBF$2U(N=c3fsWwb48AHc-P&Gn zS5zCZi=qy&uI=QZT zXj->~FLv56-(nj`=zugc&DN=c8N0@?gJ~nU?*7^IWRrEO-Mz1qyQ)97Z6dyXDzS@l zE=v|Fk((!hH>rKSl2<_vB9ip`Z(eAu`u^fK6L-0b6`Jol*ZBwaL z1F?f8#q&Mpjl=PKCS!LDhhJ(H?C%nw{oq{kp%tk;U84QH(wz(G?Q^M>1F_xR;@!Q{ zb;F69Cz5N25^t0nAJ5dy7K8UMW+!_6Pv#q+ZfXSljCc8_yL?aOIWM-bw~s|vm%~$? zzTNGDHwPu4rdx)in}_3j2Yh=6JU5LbcFZIf`a&Ki?{Tts=i^ zB)x7R@$g*g#a`F0l6TWkVr?b7suF#n zZx2dt8Bag9k}NRK^?IM_^?`PPI-r^ZJ?bN66~G2~1KB;4er2Zl@l{MB>80#ztNUIa z%91gM%tWb!^BqUl7V#dc6;yXkH1C^jy?wsz_Q~|7(eyK2#=T|3O;h>DHnu#rq2-Bk z>V=~I=GpvX8=65lFV7SYj=I*3=XNY*X1iSpr)Z|tw!RVst=&GI2g%@jI9{+kFrDa6 z=@SkicwoF>USIT%uIe^%5lFIhS?Zh*^QFVJr>D9A*1~y>kR*Iid$85YL z04Ajy&znk2PYDlPD-;j-ed+Xlu~-q_5Jb+`HZRh8IXwB`BcQl%4-V9 zT~zmm-5gS^EBm?|M)su*Xagf$c(WQ#TJmEx8`UXu^Vv9M}t0RT)VetWdrn!`$~x&cfA8ky^M<}j3| z0Z7vtQ}^eM%@LJeT4UEX7Q%|LRx3sT`~YbHHa-(4>JX}gH&)4NzS9wL2-Tt+wUT9M z_{^NRN1_%kGstTxCZ}2h2gm;*%S>dRsagO4|MW>jK~%#({|QPV!uk7OseTTK1*}q~ zpuaLX37CY@>>K_D;rxyAK2sD;9g_(F088*zo;hf-1F1{c@ajXW`jGMhn^f;zIfa2mvHieQ#;YZScY zDgha4$X3Ixg-E%z=)+}k0aR7vkCeMy$zP7^L?*m?g`if>r^p-`uNGVcl2J<c?-rwfnK1Gp%=wbv(SL|AE=c%_D8M z59PKEq<2iV?wn|Te5$Z>IQGzB_@1I~XT|^Iu+NYm=i^lQeSAjk6eQ^2x4=#W3 z!R3#RU;g})tLM-DeCez2e!l$UZy`V{1M=_|V7uAHMw22VcK==<)}z|M2Cfe_Z+Q$B)li^>T%f z>XSmM1#=VvvN)ju?5Vyw0F1{d_8JNBd`6KTG)RR(8_CKiW!W`6m!4lW(E#~?g$5?H z2Ixqs1*9xIg7-%7!vyMxxokO)vaadGRF&1C<^gG{>Ab-+02_RD^%6>XXOcCV8L_Ka z0TUlOP0S_&fwTwJZ2?u)I0G7SQ9?68)sh2os@XmYvL|;nkCp?%0WI`IG!S46*rvs& zAorxO8f1bIfFER9F;Jw9jWP{TvH`CSNrB7 zVOvm{a*Bf{J{Sg^kaUQ{76AqX^LRCEipc>T=@_=5GBp$l1GZr@l96YZN5cj+CG8?m z2Sx+fP-Po4AH3w%;Z4@-M70`04TBuD7y(d02@hoTV78!v?^Lm|o}5$cQL$1sVZuhK z5g^T8Sv89Q1XH`288Mw+Tnm1yI+cODFgS<>4U3`?v&cBh)q>@i!iZbwscZz&SXGS- z)zq5g4H36wZZLG)%G_9w+pgod^xTmS$A+=+Y>#`Q#X8gB0N4z*S_hjfLpc-vh>o|} z=1U&@f$5HG%UQ!>#W&aI?uhGRE(tX6o|K_0p=*z7!&q=o)t%5U_4=T=19c(}abLthZ{&Zp>280OmDgBeRPVQ3Ag04me1PN=Y1kG#oG5He49%~0-f7uPrThXD+o z5nawJpK5ggByd`w3}zaj%f<>I#7glwaospmQU*xV6W4b|bz{x;6Cc+6 z9UQ3)PSP;eY}+=S!pM23EZ~H!d3}FyAZLj=B}v90gGIK4H9jLh?vmoQ3>PdtR6&xe zEdem_a=<(owk@RY2TJvL$6Fi)zY;h-++@3XEJ03jK~>Ht2P4gPxUkf6LXX`|HQN?C z-6J_mS6E$2=qCzR+=9|y&5i(`sS04AGpy-L8o)(ZUMXcvyQM>UGvEglgztH?Uq0Dt z+d3MVZnO17HBjOwn#n6{w%t+H?WS66TZh8i#^aND(^%HH0_;}~;QfGM=3A|IO(vO8 z92aP?;FALjw_(j~&WuOe9o0a0ylXrPjKO9p(Lz!WTm&Q}U6Qy%1hBzIIwBf;B0-A) zOgP6R4NrR{fG)tymch_)&WvYU14=wK+iD-on37I0w8L@iG@=>Kn_Gj*){t^Vx9jfd z#JaK{ggKNo0c`G^PHq_tl1(XRT;1!rX(+ssa%btLo6Mk{TZTf59S-nVe^R%y%X#}~ zWDO|2U>eODR`2l4}NHdwa!udqr!9<2%<$ds9_@)ex`vVs z>|Dz3u2|om)b3cI;-QaX-Vs?>#yZt%+qojMWhk<$7(6=V+Rz_HiAb}i$7H&saiEm&jsY{Rx8LvI8yk$68${1oU zp-b0@#%7GnMEpaFX~V5!k%62sV4?amVEAp5F<=b%B;^*3Qf1OeIcxNpxgnbXzpn3| zP2v|dKnN27sCtvSeyT9T0)c>7?wyJQv~cRuHe%jYJuV8iVLZx!H|xsY?u5pothZ|# zN*Vpe0e?qaQ?<_&Gy0vYvYkmSm?U830Z#5;Otr_#3YfV{{*4A%ZNeiS$Qz?BkxsfCgcEiMLO@fONGqvP z374TU-e!%t=~+m^D{&jyf4Sj?`oI0H4lMCc##Zw`H`M>1|7rMt{x4Jd6JSG0qRBWz z<#Cu`8}#|dKPU|}IE3P7{)xL(OK16we}=>`&_b4$YNSoo_Ok3o@*e{%{q66pzy6IW zj6)7==s<&zUl|iE10te4Y>Y5TqS-=L1O99SS@`T~l^YO?u%?E;>_*JOsj1;HE@4bo zG!`2TJO%!dbC&~D2qC}`jpSw~V6y=_Vs@=oRI7uw@&AUq)PiJ$9J1$tOwb0~fH#!< zT0jVw#liSY)&VM&g9|)1TSWD4I2;z2!fV)#3?q?kN6u751Svrj4B<$44Ojrsi_H>X zNg82|Mnu!;rBELmlzg00u#Jd5!yTxO3pGWxTkjQ|LNG-v->`I zYu87w93aTqefXWqx|MlF(pH83o@rzF`zW3@g^QpzOWFRKV z*#)g`E=NR_-cRyVJ@sH!L?3au9Jhp(+ml0-w9|UA}5V9mxg@!BQ za;YS!xUuRY1Oe^8h&prTD!^UO%+w<2T=;Txy?ua_y7Pz6IfY{`vQxeg6F?pL~mpAANN7 z_($IyKYr!-@ynllbmg;;E}#1Jn~Nu}UiHAkd z`rwBzKL7TMQx`w^;Ov|GF1`QeHy?fQ{TE+AzWem}cb|On)5$NdU;Fm@&)3hr`A(rD zuV)eu7-U?dg6B4hJtnb5El@IrL7jSG$R@L>`PF^l?U~g)i<;-Nh$2o|$R@=bv#EJN zM9g=_^e_8|(hl&c_fFG<1GR}l3^%*~9r&P{C1GmK|Z}Tg1 zE~xN|Snx-5 zrrQOE>BS#)k2D)p4mDfG+U=z*h(*#GR+sZ83aUv{z)aLB0l-YPIROBjFW&+F zAPGa>r$~Eby-DL>-io`>;Bg9teyZICM5!v}!#UuG5meLcSLQr&G#0zOIQB$!#kd{- zvwbQv(c)+gs`23xuVNM zv=h}rtDb9jtt$F~2T+C((YRwGv8tECLPm4u*)}IMcmPb+ufzt6 z6l@ddrVxJ_If+3>Z*kxV+QF)dNh2Tx+aw<rD{Ik4tF=;f_;Cddb{rvc0Who^w4-F*IwobR$RGf}&gccTXn)Ijj4;11WvAv7zLfX|iBPYx_L(NXa{t)&qEO zy0Pq=ZL@cWRYNH~cxJlUvefAqWDG$I9geL-p`}h&F{-J=wJX8B&DISAkt2huXF5#V zClhy$$L<)7KAPd}>6SjUm|Zs%-#D6lxl4GcCDNb%?<^+vhUtC^wpTPp@qAcx2{*vOAk{mp9-(qg-MDm4J?(6*&PIE8V zU`^q`h<|Uz4Q-whC9llBHYk3wi9OjH*fNovFNdFM74Gg5E>t4@t*%?AvhR$_o^KV; z^#<>rOaN(~YBwM370wq!_s>wqwwFq-Lz7|f*lb_mwyE^4vh%=L_|e78QZck)Aa=AQ zeX+-W|9EuEP;6y6x~oI-bhB{%U}9w{yk#VDpiljLj~zgA=TvIlVElzv@!oFfV@sL4 zCzGoyv6tG_M=Mg0%)K+2J7)_ACsGF|(@YYA6!_=qUjLKb-bdys)4(H(*@M$fFOPt2 zvQ;^@W#El1Bai)=qAmaWpbW2?!g83zYx@T5FHbb%IzZ@=rR=d$?VgJ1fw|<4`4nXD zpzV=T{$UKuq(eA3?0l+{y?v(X=8^cO!SLSM?p@QJD|@}zAczHc6SeWdGY`+FOG&-o z$o1$c=km6Z@DMrH@c z0HpwIZXF9_D2xLcX)*(E27osXA!ui!&GyLZLVwPL&Os{=jm2IMhVq*@VLQJytlU`f zbwt&G3Wuh#Evo8C=vu-`&FGypJ6l4uI+$6bb47${;~)c*E2)<6DEFvIW+@P;7g zMk*Cb6>@5qvzOo4h+{)7(1?WF_-8USGW*o=7!wVTu?Vr3FXuw)>-Y`zd|YQtKy(CS za2h$RMjit*l!Z*lX#ntmDny)mDVK->EFtC8$~ZUzV8BZ(5DTRl;MS5~7Zq*?kl=YD z8E_G31do6p$BF$#VS_(UzL!{Z|ISmT0)gp?$K3hYo% z5EPI@REu?jloT{tt(0O>C_jOa!v+XxMD-8=k5NuB+)yiVoyX=kHj3)&MGcI7hRfn( zMhec6P>jAAI+=>iq$Q{~$pJQv;2c1XSxEsWT7ZGLQ6+4kLMT+xk^;(;vB0NK?z(pP z#3wI*`0D=8UOD*r!BkGgC_UrZE&R_WX^vNH;{N$@Q zpMP#H^33|4N9Oa}hN3qO#77dUHY=;i+?dwX^f@^_*2Y0Mw`grB+Z!g_+%;jzElK4= z&4yk5{)02|qf@DmW}A+0sa$;X(9fsO{Bri}^&fvb``O7*EFk7`s=+hW;1H}C8aC8x zos=^UuwQeGnkKCwki z{xl9q2Ct&3mou?FWVgYQ3Eg3`P752fQnCnvtOQKD0x6#j5CVXS8O|XeIX(}lpp#Nw zX7UZ>2$@{cc*#@=R4?Ocr98b#{LT|cj~w{y?SGyBj(i5l_d!G{J)BtRMe zaD-Gp1n87(W?kYICcb4LWhljT&5U^mh!V4bz62IogG

di+G|#C4zu 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 Il7@l*17e`+k^lez diff --git a/Screenshots/frame_data.png b/Screenshots/frame_data.png index 2b7102fc88c0cf4d6ece7fc4eb0cb16913f5630c..47e734b79dad9bdc9f7aa3220804f749f9636dbd 100644 GIT binary patch literal 248267 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“mJ9zEJ_HX*v@;ZX_o^yZD_ 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

{( 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 diff --git a/TekkenData/tekken_bot.png b/TekkenData/tekken_bot.png index e5236aa8ee04ec121555eaf8fecd64be2d9bf5ab..3940331e7ff3b522a96f2b3500957241f6786148 100644 GIT binary patch literal 4381 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 diff --git a/TekkenData/tekken_bot_close.png b/TekkenData/tekken_bot_close.png index 1b3ec27676989f92f7655b724f15c50462cb189f..8478fe2e61c049069fa5f06a09cf097e02d8a8af 100644 GIT binary patch delta 2178 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 From 55e23841918a7248375000abaf82955e1e55ef74 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Mon, 26 Mar 2018 19:44:42 +0200 Subject: [PATCH 04/85] "pip install requests" no longer needed to run from source --- requests/__init__.py | 121 +++++ requests/__version__.py | 14 + requests/_internal_utils.py | 42 ++ requests/adapters.py | 525 ++++++++++++++++++++ requests/api.py | 152 ++++++ requests/auth.py | 293 +++++++++++ requests/certs.py | 18 + requests/compat.py | 69 +++ requests/cookies.py | 542 +++++++++++++++++++++ requests/exceptions.py | 122 +++++ requests/help.py | 120 +++++ requests/hooks.py | 34 ++ requests/models.py | 948 ++++++++++++++++++++++++++++++++++++ requests/packages.py | 14 + requests/sessions.py | 737 ++++++++++++++++++++++++++++ requests/status_codes.py | 91 ++++ requests/structures.py | 105 ++++ requests/utils.py | 904 ++++++++++++++++++++++++++++++++++ 18 files changed, 4851 insertions(+) create mode 100644 requests/__init__.py create mode 100644 requests/__version__.py create mode 100644 requests/_internal_utils.py create mode 100644 requests/adapters.py create mode 100644 requests/api.py create mode 100644 requests/auth.py create mode 100644 requests/certs.py create mode 100644 requests/compat.py create mode 100644 requests/cookies.py create mode 100644 requests/exceptions.py create mode 100644 requests/help.py create mode 100644 requests/hooks.py create mode 100644 requests/models.py create mode 100644 requests/packages.py create mode 100644 requests/sessions.py create mode 100644 requests/status_codes.py create mode 100644 requests/structures.py create mode 100644 requests/utils.py diff --git a/requests/__init__.py b/requests/__init__.py new file mode 100644 index 00000000..268e7dcc --- /dev/null +++ b/requests/__init__.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- + +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +Requests HTTP Library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. Basic GET +usage: + + >>> import requests + >>> r = requests.get('https://www.python.org') + >>> r.status_code + 200 + >>> 'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post('http://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key2": "value2", + "key1": "value1" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at . + +:copyright: (c) 2017 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. +""" + +import urllib3 +import chardet +import warnings +from .exceptions import RequestsDependencyWarning + + +def check_compatibility(urllib3_version, chardet_version): + urllib3_version = urllib3_version.split('.') + assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append('0') + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1, <= 1.22 + assert major == 1 + assert minor >= 21 + assert minor <= 22 + + # Check chardet for compatibility. + major, minor, patch = chardet_version.split('.')[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet >= 3.0.2, < 3.1.0 + assert major == 3 + assert minor < 1 + assert patch >= 2 + + +# Check imported dependencies for compatibility. +try: + check_compatibility(urllib3.__version__, chardet.__version__) +except (AssertionError, ValueError): + warnings.warn("urllib3 ({0}) or chardet ({1}) doesn't match a supported " + "version!".format(urllib3.__version__, chardet.__version__), + RequestsDependencyWarning) + +# Attempt to enable urllib3's SNI support, if possible +try: + from urllib3.contrib import pyopenssl + pyopenssl.inject_into_urllib3() +except ImportError: + pass + +# urllib3's DependencyWarnings should be silenced. +from urllib3.exceptions import DependencyWarning +warnings.simplefilter('ignore', DependencyWarning) + +from .__version__ import __title__, __description__, __url__, __version__ +from .__version__ import __build__, __author__, __author_email__, __license__ +from .__version__ import __copyright__, __cake__ + +from . import utils +from . import packages +from .models import Request, Response, PreparedRequest +from .api import request, get, head, post, patch, put, delete, options +from .sessions import session, Session +from .status_codes import codes +from .exceptions import ( + RequestException, Timeout, URLRequired, + TooManyRedirects, HTTPError, ConnectionError, + FileModeWarning, ConnectTimeout, ReadTimeout +) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/requests/__version__.py b/requests/__version__.py new file mode 100644 index 00000000..dc33eef6 --- /dev/null +++ b/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = 'requests' +__description__ = 'Python HTTP for Humans.' +__url__ = 'http://python-requests.org' +__version__ = '2.18.4' +__build__ = 0x021804 +__author__ = 'Kenneth Reitz' +__author_email__ = 'me@kennethreitz.org' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2017 Kenneth Reitz' +__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/requests/_internal_utils.py b/requests/_internal_utils.py new file mode 100644 index 00000000..759d9a56 --- /dev/null +++ b/requests/_internal_utils.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +""" +requests._internal_utils +~~~~~~~~~~~~~~ + +Provides utility functions that are consumed internally by Requests +which depend on extremely few external helpers (such as compat) +""" + +from .compat import is_py2, builtin_str, str + + +def to_native_string(string, encoding='ascii'): + """Given a string object, regardless of type, returns a representation of + that string in the native string type, encoding and decoding where + necessary. This assumes ASCII unless told otherwise. + """ + if isinstance(string, builtin_str): + out = string + else: + if is_py2: + out = string.encode(encoding) + else: + out = string.decode(encoding) + + return out + + +def unicode_is_ascii(u_string): + """Determine if unicode string only contains ASCII characters. + + :param str u_string: unicode string to check. Must be unicode + and not Python 2 `str`. + :rtype: bool + """ + assert isinstance(u_string, str) + try: + u_string.encode('ascii') + return True + except UnicodeEncodeError: + return False diff --git a/requests/adapters.py b/requests/adapters.py new file mode 100644 index 00000000..00f8792b --- /dev/null +++ b/requests/adapters.py @@ -0,0 +1,525 @@ +# -*- coding: utf-8 -*- + +""" +requests.adapters +~~~~~~~~~~~~~~~~~ + +This module contains the transport adapters that Requests uses to define +and maintain connections. +""" + +import os.path +import socket + +from urllib3.poolmanager import PoolManager, proxy_from_url +from urllib3.response import HTTPResponse +from urllib3.util import Timeout as TimeoutSauce +from urllib3.util.retry import Retry +from urllib3.exceptions import ClosedPoolError +from urllib3.exceptions import ConnectTimeoutError +from urllib3.exceptions import HTTPError as _HTTPError +from urllib3.exceptions import MaxRetryError +from urllib3.exceptions import NewConnectionError +from urllib3.exceptions import ProxyError as _ProxyError +from urllib3.exceptions import ProtocolError +from urllib3.exceptions import ReadTimeoutError +from urllib3.exceptions import SSLError as _SSLError +from urllib3.exceptions import ResponseError + +from .models import Response +from .compat import urlparse, basestring +from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers, + prepend_scheme_if_needed, get_auth_from_url, urldefragauth, + select_proxy) +from .structures import CaseInsensitiveDict +from .cookies import extract_cookies_to_jar +from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, + ProxyError, RetryError, InvalidSchema) +from .auth import _basic_auth_str + +try: + from urllib3.contrib.socks import SOCKSProxyManager +except ImportError: + def SOCKSProxyManager(*args, **kwargs): + raise InvalidSchema("Missing dependencies for SOCKS support.") + +DEFAULT_POOLBLOCK = False +DEFAULT_POOLSIZE = 10 +DEFAULT_RETRIES = 0 +DEFAULT_POOL_TIMEOUT = None + + +class BaseAdapter(object): + """The Base Transport Adapter""" + + def __init__(self): + super(BaseAdapter, self).__init__() + + def send(self, request, stream=False, timeout=None, verify=True, + cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + """ + raise NotImplementedError + + def close(self): + """Cleans up adapter specific items.""" + raise NotImplementedError + + +class HTTPAdapter(BaseAdapter): + """The built-in HTTP Adapter for urllib3. + + Provides a general-case interface for Requests sessions to contact HTTP and + HTTPS urls by implementing the Transport Adapter interface. This class will + usually be created by the :class:`Session ` class under the + covers. + + :param pool_connections: The number of urllib3 connection pools to cache. + :param pool_maxsize: The maximum number of connections to save in the pool. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. + :param pool_block: Whether the connection pool should block for connections. + + Usage:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', + '_pool_block'] + + def __init__(self, pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) + self.config = {} + self.proxy_manager = {} + + super(HTTPAdapter, self).__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return dict((attr, getattr(self, attr, None)) for attr in + self.__attrs__) + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager(self._pool_connections, self._pool_maxsize, + block=self._pool_block) + + def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, + block=block, strict=True, **pool_kwargs) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + :rtype: urllib3.ProxyManager + """ + if proxy in self.proxy_manager: + manager = self.proxy_manager[proxy] + elif proxy.lower().startswith('socks'): + username, password = get_auth_from_url(proxy) + manager = self.proxy_manager[proxy] = SOCKSProxyManager( + proxy, + username=username, + password=password, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs + ) + else: + proxy_headers = self.proxy_headers(proxy) + manager = self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs) + + return manager + + def cert_verify(self, conn, url, verify, cert): + """Verify a SSL certificate. This method should not be called from user + code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param conn: The urllib3 connection object associated with the cert. + :param url: The requested URL. + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: The SSL certificate to verify. + """ + if url.lower().startswith('https') and verify: + + cert_loc = None + + # Allow self-specified cert location. + if verify is not True: + cert_loc = verify + + if not cert_loc: + cert_loc = DEFAULT_CA_BUNDLE_PATH + + if not cert_loc or not os.path.exists(cert_loc): + raise IOError("Could not find a suitable TLS CA certificate bundle, " + "invalid path: {0}".format(cert_loc)) + + conn.cert_reqs = 'CERT_REQUIRED' + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc + else: + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + conn.ca_cert_dir = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise IOError("Could not find the TLS certificate file, " + "invalid path: {0}".format(conn.cert_file)) + if conn.key_file and not os.path.exists(conn.key_file): + raise IOError("Could not find the TLS key file, " + "invalid path: {0}".format(conn.key_file)) + + def build_response(self, req, resp): + """Builds a :class:`Response ` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter ` + + :param req: The :class:`PreparedRequest ` used to generate the response. + :param resp: The urllib3 response object. + :rtype: requests.Response + """ + response = Response() + + # Fallback to None if there's no status_code, for whatever reason. + response.status_code = getattr(resp, 'status', None) + + # Make headers case-insensitive. + response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) + + # Set encoding. + response.encoding = get_encoding_from_headers(response.headers) + response.raw = resp + response.reason = response.raw.reason + + if isinstance(req.url, bytes): + response.url = req.url.decode('utf-8') + else: + response.url = req.url + + # Add new cookies from the server. + extract_cookies_to_jar(response.cookies, req, resp) + + # Give the Response some context. + response.request = req + response.connection = self + + return response + + def get_connection(self, url, proxies=None): + """Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + :rtype: urllib3.ConnectionPool + """ + proxy = select_proxy(url, proxies) + + if proxy: + proxy = prepend_scheme_if_needed(proxy, 'http') + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) + else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() + conn = self.poolmanager.connection_from_url(url) + + return conn + + def close(self): + """Disposes of any internal state. + + Currently, this closes the PoolManager and any active ProxyManager, + which closes any pooled connections. + """ + self.poolmanager.clear() + for proxy in self.proxy_manager.values(): + proxy.clear() + + def request_url(self, request, proxies): + """Obtain the url to use when making the final request. + + If the message is being sent through a HTTP proxy, the full URL has to + be used. Otherwise, we should only use the path portion of the URL. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` being sent. + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. + :rtype: str + """ + proxy = select_proxy(request.url, proxies) + scheme = urlparse(request.url).scheme + + is_proxied_http_request = (proxy and scheme != 'https') + using_socks_proxy = False + if proxy: + proxy_scheme = urlparse(proxy).scheme.lower() + using_socks_proxy = proxy_scheme.startswith('socks') + + url = request.path_url + if is_proxied_http_request and not using_socks_proxy: + url = urldefragauth(request.url) + + return url + + def add_headers(self, request, **kwargs): + """Add any headers needed by the connection. As of v2.0 this does + nothing by default, but is left for overriding by users that subclass + the :class:`HTTPAdapter `. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` to add headers to. + :param kwargs: The keyword arguments from the call to send(). + """ + pass + + def proxy_headers(self, proxy): + """Returns a dictionary of the headers to add to any request sent + through a proxy. This works with urllib3 magic to ensure that they are + correctly sent to the proxy, rather than in a tunnelled request if + CONNECT is being used. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param proxies: The url of the proxy being used for this request. + :rtype: dict + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username: + headers['Proxy-Authorization'] = _basic_auth_str(username, + password) + + return headers + + def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response + """ + + conn = self.get_connection(request.url, proxies) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers(request) + + chunked = not (request.body is None or 'Content-Length' in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError as e: + # this may raise a string formatting error. + err = ("Invalid timeout {0}. Pass a (connect, read) " + "timeout tuple, or a single float to set " + "both timeouts to the same value".format(timeout)) + raise ValueError(err) + elif isinstance(timeout, TimeoutSauce): + pass + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) + + try: + if not chunked: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout + ) + + # Send the request. + else: + if hasattr(conn, 'proxy_pool'): + conn = conn.proxy_pool + + low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) + + try: + low_conn.putrequest(request.method, + url, + skip_accept_encoding=True) + + for header, value in request.headers.items(): + low_conn.putheader(header, value) + + low_conn.endheaders() + + for i in request.body: + low_conn.send(hex(len(i))[2:].encode('utf-8')) + low_conn.send(b'\r\n') + low_conn.send(i) + low_conn.send(b'\r\n') + low_conn.send(b'0\r\n\r\n') + + # Receive the response from the server + try: + # For Python 2.7+ versions, use buffering of HTTP + # responses + r = low_conn.getresponse(buffering=True) + except TypeError: + # For compatibility with Python 2.6 versions and back + r = low_conn.getresponse() + + resp = HTTPResponse.from_httplib( + r, + pool=conn, + connection=low_conn, + preload_content=False, + decode_content=False + ) + except: + # If we hit any problems here, clean up the connection. + # Then, reraise so that we can handle the actual exception. + low_conn.close() + raise + + except (ProtocolError, socket.error) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/requests/api.py b/requests/api.py new file mode 100644 index 00000000..bc2115c1 --- /dev/null +++ b/requests/api.py @@ -0,0 +1,152 @@ +# -*- coding: utf-8 -*- + +""" +requests.api +~~~~~~~~~~~~ + +This module implements the Requests API. + +:copyright: (c) 2012 by Kenneth Reitz. +:license: Apache2, see LICENSE for more details. +""" + +from . import sessions + + +def request(method, url, **kwargs): + """Constructs and sends a :class:`Request `. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. + :param data: (optional) Dictionary or list of tuples ``[(key, value)]`` (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + to add for the file. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How many seconds to wait for the server to send data + before giving up, as a float, or a :ref:`(connect timeout, read + timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + :return: :class:`Response ` object + :rtype: requests.Response + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'http://httpbin.org/get') + + """ + + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) + + +def get(url, params=None, **kwargs): + r"""Sends a GET request. + + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('get', url, params=params, **kwargs) + + +def options(url, **kwargs): + r"""Sends an OPTIONS request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('options', url, **kwargs) + + +def head(url, **kwargs): + r"""Sends a HEAD request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return request('head', url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + r"""Sends a POST request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('post', url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + r"""Sends a PUT request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('put', url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + r"""Sends a PATCH request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('patch', url, data=data, **kwargs) + + +def delete(url, **kwargs): + r"""Sends a DELETE request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('delete', url, **kwargs) diff --git a/requests/auth.py b/requests/auth.py new file mode 100644 index 00000000..1a182dff --- /dev/null +++ b/requests/auth.py @@ -0,0 +1,293 @@ +# -*- coding: utf-8 -*- + +""" +requests.auth +~~~~~~~~~~~~~ + +This module contains the authentication handlers for Requests. +""" + +import os +import re +import time +import hashlib +import threading +import warnings + +from base64 import b64encode + +from .compat import urlparse, str, basestring +from .cookies import extract_cookies_to_jar +from ._internal_utils import to_native_string +from .utils import parse_dict_header + +CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' +CONTENT_TYPE_MULTI_PART = 'multipart/form-data' + + +def _basic_auth_str(username, password): + """Returns a Basic Auth string.""" + + # "I want us to put a big-ol' comment on top of it that + # says that this behaviour is dumb but we need to preserve + # it because people are relying on it." + # - Lukasa + # + # These are here solely to maintain backwards compatibility + # for things like ints. This will be removed in 3.0.0. + if not isinstance(username, basestring): + warnings.warn( + "Non-string usernames will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({0!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(username), + category=DeprecationWarning, + ) + username = str(username) + + if not isinstance(password, basestring): + warnings.warn( + "Non-string passwords will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({0!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(password), + category=DeprecationWarning, + ) + password = str(password) + # -- End Removal -- + + if isinstance(username, str): + username = username.encode('latin1') + + if isinstance(password, str): + password = password.encode('latin1') + + authstr = 'Basic ' + to_native_string( + b64encode(b':'.join((username, password))).strip() + ) + + return authstr + + +class AuthBase(object): + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError('Auth hooks must be callable.') + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other + + def __call__(self, r): + r.headers['Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + + def __call__(self, r): + r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, 'init'): + self._thread_local.init = True + self._thread_local.last_nonce = '' + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None + + def build_digest_header(self, method, url): + """ + :rtype: str + """ + + realm = self._thread_local.chal['realm'] + nonce = self._thread_local.chal['nonce'] + qop = self._thread_local.chal.get('qop') + algorithm = self._thread_local.chal.get('algorithm') + opaque = self._thread_local.chal.get('opaque') + hash_utf8 = None + + if algorithm is None: + _algorithm = 'MD5' + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': + def md5_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.md5(x).hexdigest() + hash_utf8 = md5_utf8 + elif _algorithm == 'SHA': + def sha_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha1(x).hexdigest() + hash_utf8 = sha_utf8 + + KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" + if p_parsed.query: + path += '?' + p_parsed.query + + A1 = '%s:%s:%s' % (self.username, realm, self.password) + A2 = '%s:%s' % (method, path) + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = '%08x' % self._thread_local.nonce_count + s = str(self._thread_local.nonce_count).encode('utf-8') + s += nonce.encode('utf-8') + s += time.ctime().encode('utf-8') + s += os.urandom(8) + + cnonce = (hashlib.sha1(s).hexdigest()[:16]) + if _algorithm == 'MD5-SESS': + HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) + + if not qop: + respdig = KD(HA1, "%s:%s" % (nonce, HA2)) + elif qop == 'auth' or 'auth' in qop.split(','): + noncebit = "%s:%s:%s:%s:%s" % ( + nonce, ncvalue, cnonce, 'auth', HA2 + ) + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self._thread_local.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ + 'response="%s"' % (self.username, realm, nonce, path, respdig) + if opaque: + base += ', opaque="%s"' % opaque + if algorithm: + base += ', algorithm="%s"' % algorithm + if entdig: + base += ', digest="%s"' % entdig + if qop: + base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) + + return 'Digest %s' % (base) + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/requests/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) + s_auth = r.headers.get('www-authenticate', '') + + if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: + + self._thread_local.num_401_calls += 1 + pat = re.compile(r'digest ', flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers['Authorization'] = self.build_digest_header( + prep.method, prep.url) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + self._thread_local.num_401_calls = 1 + return r + + def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() + # If we have a saved nonce, skip the 401 + if self._thread_local.last_nonce: + r.headers['Authorization'] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None + r.register_hook('response', self.handle_401) + r.register_hook('response', self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other diff --git a/requests/certs.py b/requests/certs.py new file mode 100644 index 00000000..d1a378d7 --- /dev/null +++ b/requests/certs.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +requests.certs +~~~~~~~~~~~~~~ + +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" +from certifi import where + +if __name__ == '__main__': + print(where()) diff --git a/requests/compat.py b/requests/compat.py new file mode 100644 index 00000000..f417cfd8 --- /dev/null +++ b/requests/compat.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- + +""" +requests.compat +~~~~~~~~~~~~~~~ + +This module handles import compatibility issues between Python 2 and +Python 3. +""" + +import chardet + +import sys + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = (_ver[0] == 2) + +#: Python 3.x? +is_py3 = (_ver[0] == 3) + +try: + import simplejson as json +except ImportError: + import json + +# --------- +# Specifics +# --------- + +if is_py2: + from urllib import ( + quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, + proxy_bypass, proxy_bypass_environment, getproxies_environment) + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag + from urllib2 import parse_http_list + import cookielib + from Cookie import Morsel + from StringIO import StringIO + + from urllib3.packages.ordered_dict import OrderedDict + + builtin_str = str + bytes = str + str = unicode + basestring = basestring + numeric_types = (int, long, float) + integer_types = (int, long) + +elif is_py3: + from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag + from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment + from http import cookiejar as cookielib + from http.cookies import Morsel + from io import StringIO + from collections import OrderedDict + + builtin_str = str + str = str + bytes = bytes + basestring = (str, bytes) + numeric_types = (int, float) + integer_types = (int,) diff --git a/requests/cookies.py b/requests/cookies.py new file mode 100644 index 00000000..ab3c88b9 --- /dev/null +++ b/requests/cookies.py @@ -0,0 +1,542 @@ +# -*- coding: utf-8 -*- + +""" +requests.cookies +~~~~~~~~~~~~~~~~ + +Compatibility code to be able to use `cookielib.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import copy +import time +import calendar +import collections + +from ._internal_utils import to_native_string +from .compat import cookielib, urlparse, urlunparse, Morsel + +try: + import threading +except ImportError: + import dummy_threading as threading + + +class MockRequest(object): + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `cookielib.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + # Only return the response's URL if the user hadn't set the Host + # header + if not self._r.headers.get('Host'): + return self._r.url + # If they did set it, retrieve it and reconstruct the expected domain + host = to_native_string(self._r.headers['Host'], encoding='utf-8') + parsed = urlparse(self._r.url) + # Reconstruct the URL as we expect it + return urlunparse([ + parsed.scheme, host, parsed.path, parsed.params, parsed.query, + parsed.fragment + ]) + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookielib has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + @property + def origin_req_host(self): + return self.get_origin_req_host() + + @property + def host(self): + return self.get_host() + + +class MockResponse(object): + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `cookielib` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookielib` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + if not (hasattr(response, '_original_response') and + response._original_response): + return + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get('Cookie') + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific. + """ + + +class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): + """Compatibility class; is a cookielib.CookieJar, but exposes a dict + interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. + + Unlike a regular CookieJar, this class is pickleable. + + .. warning:: dictionary operations that are normally O(1) may be O(n). + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + """ + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def iterkeys(self): + """Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + .. seealso:: itervalues() and iteritems(). + """ + for cookie in iter(self): + yield cookie.name + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the + jar. + + .. seealso:: values() and items(). + """ + return list(self.iterkeys()) + + def itervalues(self): + """Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + .. seealso:: iterkeys() and iteritems(). + """ + for cookie in iter(self): + yield cookie.value + + def values(self): + """Dict-like values() that returns a list of values of cookies from the + jar. + + .. seealso:: keys() and items(). + """ + return list(self.itervalues()) + + def iteritems(self): + """Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + .. seealso:: iterkeys() and itervalues(). + """ + for cookie in iter(self): + yield cookie.name, cookie.value + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + .. seealso:: keys() and values(). + """ + return list(self.iteritems()) + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise. + + :rtype: bool + """ + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + :rtype: dict + """ + dictionary = {} + for cookie in iter(self): + if ( + (domain is None or cookie.domain == domain) and + (path is None or cookie.path == path) + ): + dictionary[cookie.name] = cookie.value + return dictionary + + def __contains__(self, name): + try: + return super(RequestsCookieJar, self).__contains__(name) + except CookieConflictError: + return True + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + ``remove_cookie_by_name()``. + """ + remove_cookie_by_name(self, name) + + def set_cookie(self, cookie, *args, **kwargs): + if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): + cookie.value = cookie.value.replace('\\"', '') + return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(copy.copy(cookie)) + else: + super(RequestsCookieJar, self).update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def _find_no_duplicates(self, name, domain=None, path=None): + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: # if there are multiple cookies that meet passed in criteria + raise CookieConflictError('There are multiple cookies with name, %r' % (name)) + toReturn = cookie.value # we will eventually return this as long as no cookie conflict + + if toReturn: + return toReturn + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop('_cookies_lock') + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if '_cookies_lock' not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.update(self) + return new_cj + + +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, 'copy'): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = dict( + version=0, + name=name, + value=value, + port=None, + domain='', + path='/', + secure=False, + expires=None, + discard=True, + comment=None, + comment_url=None, + rest={'HttpOnly': None}, + rfc2109=False,) + + badargs = set(kwargs) - set(result) + if badargs: + err = 'create_cookie() got unexpected keyword arguments: %s' + raise TypeError(err % list(badargs)) + + result.update(kwargs) + result['port_specified'] = bool(result['port']) + result['domain_specified'] = bool(result['domain']) + result['domain_initial_dot'] = result['domain'].startswith('.') + result['path_specified'] = bool(result['path']) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + + expires = None + if morsel['max-age']: + try: + expires = int(time.time() + int(morsel['max-age'])) + except ValueError: + raise TypeError('max-age: %s must be integer' % morsel['max-age']) + elif morsel['expires']: + time_template = '%a, %d-%b-%Y %H:%M:%S GMT' + expires = calendar.timegm( + time.strptime(morsel['expires'], time_template) + ) + return create_cookie( + comment=morsel['comment'], + comment_url=bool(morsel['comment']), + discard=False, + domain=morsel['domain'], + expires=expires, + name=morsel.key, + path=morsel['path'], + port=None, + rest={'HttpOnly': morsel['httponly']}, + rfc2109=False, + secure=bool(morsel['secure']), + value=morsel.value, + version=morsel['version'] or 0, + ) + + +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + :param cookiejar: (optional) A cookiejar to add the cookies to. + :param overwrite: (optional) If False, will not replace cookies + already in the jar with new ones. + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] + for name in cookie_dict: + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + + return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError('You can only merge into CookieJar') + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/requests/exceptions.py b/requests/exceptions.py new file mode 100644 index 00000000..be7eaed6 --- /dev/null +++ b/requests/exceptions.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- + +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. +""" +from urllib3.exceptions import HTTPError as BaseHTTPError + + +class RequestException(IOError): + """There was an ambiguous exception that occurred while handling your + request. + """ + + def __init__(self, *args, **kwargs): + """Initialize RequestException with `request` and `response` objects.""" + response = kwargs.pop('response', None) + self.response = response + self.request = kwargs.pop('request', None) + if (response is not None and not self.request and + hasattr(response, 'request')): + self.request = self.response.request + super(RequestException, self).__init__(*args, **kwargs) + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class ProxyError(ConnectionError): + """A proxy error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL schema (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """See defaults.py for valid schemas.""" + + +class InvalidURL(RequestException, ValueError): + """The URL provided was somehow invalid.""" + + +class InvalidHeader(RequestException, ValueError): + """The header value provided was somehow invalid.""" + + +class ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +class UnrewindableBodyError(RequestException): + """Requests encountered an error when trying to rewind a body""" + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + pass + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + pass + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" + pass diff --git a/requests/help.py b/requests/help.py new file mode 100644 index 00000000..5440ee61 --- /dev/null +++ b/requests/help.py @@ -0,0 +1,120 @@ +"""Module containing bug report helper(s).""" +from __future__ import print_function + +import json +import platform +import sys +import ssl + +import idna +import urllib3 +import chardet + +from . import __version__ as requests_version + +try: + from .packages.urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import OpenSSL + import cryptography + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 2.7.5 it will return + {'name': 'CPython', 'version': '2.7.5'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == 'CPython': + implementation_version = platform.python_version() + elif implementation == 'PyPy': + implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + implementation_version = ''.join([ + implementation_version, sys.pypy_version_info.releaselevel + ]) + elif implementation == 'Jython': + implementation_version = platform.python_version() # Complete Guess + elif implementation == 'IronPython': + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = 'Unknown' + + return {'name': implementation, 'version': implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + 'system': platform.system(), + 'release': platform.release(), + } + except IOError: + platform_info = { + 'system': 'Unknown', + 'release': 'Unknown', + } + + implementation_info = _implementation() + urllib3_info = {'version': urllib3.__version__} + chardet_info = {'version': chardet.__version__} + + pyopenssl_info = { + 'version': None, + 'openssl_version': '', + } + if OpenSSL: + pyopenssl_info = { + 'version': OpenSSL.__version__, + 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, + } + cryptography_info = { + 'version': getattr(cryptography, '__version__', ''), + } + idna_info = { + 'version': getattr(idna, '__version__', ''), + } + + # OPENSSL_VERSION_NUMBER doesn't exist in the Python 2.6 ssl module. + system_ssl = getattr(ssl, 'OPENSSL_VERSION_NUMBER', None) + system_ssl_info = { + 'version': '%x' % system_ssl if system_ssl is not None else '' + } + + return { + 'platform': platform_info, + 'implementation': implementation_info, + 'system_ssl': system_ssl_info, + 'using_pyopenssl': pyopenssl is not None, + 'pyOpenSSL': pyopenssl_info, + 'urllib3': urllib3_info, + 'chardet': chardet_info, + 'cryptography': cryptography_info, + 'idna': idna_info, + 'requests': { + 'version': requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/requests/hooks.py b/requests/hooks.py new file mode 100644 index 00000000..32b32de7 --- /dev/null +++ b/requests/hooks.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. +""" +HOOKS = ['response'] + + +def default_hooks(): + return dict((event, []) for event in HOOKS) + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + hooks = hooks or dict() + hooks = hooks.get(key) + if hooks: + if hasattr(hooks, '__call__'): + hooks = [hooks] + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + return hook_data diff --git a/requests/models.py b/requests/models.py new file mode 100644 index 00000000..4041cac3 --- /dev/null +++ b/requests/models.py @@ -0,0 +1,948 @@ +# -*- coding: utf-8 -*- + +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import collections +import datetime +import sys + +# Import encoding now, to avoid implicit import later. +# Implicit import within threads may cause LookupError when standard library is in a ZIP, +# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. +import encodings.idna + +from urllib3.fields import RequestField +from urllib3.filepost import encode_multipart_formdata +from urllib3.util import parse_url +from urllib3.exceptions import ( + DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) + +from io import UnsupportedOperation +from .hooks import default_hooks +from .structures import CaseInsensitiveDict + +from .auth import HTTPBasicAuth +from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar +from .exceptions import ( + HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, + ContentDecodingError, ConnectionError, StreamConsumedError) +from ._internal_utils import to_native_string, unicode_is_ascii +from .utils import ( + guess_filename, get_auth_from_url, requote_uri, + stream_decode_response_unicode, to_key_val_list, parse_header_links, + iter_slices, guess_json_utf, super_len, check_header_validity) +from .compat import ( + cookielib, urlunparse, urlsplit, urlencode, str, bytes, + is_py2, chardet, builtin_str, basestring) +from .compat import json as complexjson +from .status_codes import codes + +#: The set of HTTP status codes that indicate an automatically +#: processable redirect. +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 +) + +DEFAULT_REDIRECT_LIMIT = 30 +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + + +class RequestEncodingMixin(object): + @property + def path_url(self): + """Build the path URL to use.""" + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = '/' + + url.append(path) + + query = p.query + if query: + url.append('?') + url.append(query) + + return ''.join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, 'read'): + return data + elif hasattr(data, '__iter__'): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): + vs = [vs] + for v in vs: + if v is not None: + result.append( + (k.encode('utf-8') if isinstance(k, str) else k, + v.encode('utf-8') if isinstance(v, str) else v)) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + tuples. Order is retained if data is a list of tuples but arbitrary + if parameters are supplied as a dict. + The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) + or 4-tuples (filename, fileobj, contentype, custom_headers). + """ + if (not files): + raise ValueError("Files must be provided.") + elif isinstance(data, basestring): + raise ValueError("Data must not be a string.") + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, basestring) or not hasattr(val, '__iter__'): + val = [val] + for v in val: + if v is not None: + # Don't call str() on bytestrings: in Py3 it all goes wrong. + if not isinstance(v, bytes): + v = str(v) + + new_fields.append( + (field.decode('utf-8') if isinstance(field, bytes) else field, + v.encode('utf-8') if isinstance(v, str) else v)) + + for (k, v) in files: + # support for explicit filename + ft = None + fh = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + elif len(v) == 3: + fn, fp, ft = v + else: + fn, fp, ft, fh = v + else: + fn = guess_filename(v) or k + fp = v + + if isinstance(fp, (str, bytes, bytearray)): + fdata = fp + else: + fdata = fp.read() + + rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) + rf.make_multipart(content_type=ft) + new_fields.append(rf) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin(object): + def register_hook(self, event, hook): + """Properly register a hook.""" + + if event not in self.hooks: + raise ValueError('Unsupported event specified, with event name "%s"' % (event)) + + if isinstance(hook, collections.Callable): + self.hooks[event].append(hook) + elif hasattr(hook, '__iter__'): + self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable)) + + def deregister_hook(self, event, hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """A user-created :class:`Request ` object. + + Used to prepare a :class:`PreparedRequest `, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place. + :param json: json for the body to attach to the request (if files or data is not specified). + :param params: dictionary of URL parameters to append to the URL. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> req.prepare() + + """ + + def __init__(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for (k, v) in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.json = json + self.params = params + self.auth = auth + self.cookies = cookies + + def __repr__(self): + return '' % (self.method) + + def prepare(self): + """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" + p = PreparedRequest() + p.prepare( + method=self.method, + url=self.url, + headers=self.headers, + files=self.files, + data=self.data, + json=self.json, + params=self.params, + auth=self.auth, + cookies=self.cookies, + hooks=self.hooks, + ) + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest ` object, + containing the exact bytes that will be sent to the server. + + Generated from either a :class:`Request ` object or manually. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> r = req.prepare() + + + >>> s = requests.Session() + >>> s.send(r) + + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + #: integer denoting starting position of a readable file-like body. + self._body_position = None + + def prepare(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + """Prepares the entire request with the given parameters.""" + + self.prepare_method(method) + self.prepare_url(url, params) + self.prepare_headers(headers) + self.prepare_cookies(cookies) + self.prepare_body(data, files, json) + self.prepare_auth(auth, url) + + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + self.prepare_hooks(hooks) + + def __repr__(self): + return '' % (self.method) + + def copy(self): + p = PreparedRequest() + p.method = self.method + p.url = self.url + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = _copy_cookie_jar(self._cookies) + p.body = self.body + p.hooks = self.hooks + p._body_position = self._body_position + return p + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = to_native_string(self.method.upper()) + + @staticmethod + def _get_idna_encoded_host(host): + import idna + + try: + host = idna.encode(host, uts46=True).decode('utf-8') + except idna.IDNAError: + raise UnicodeError + return host + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + #: We're unable to blindly call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/requests/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode('utf8') + else: + url = unicode(url) if is_py2 else str(url) + + # Remove leading whitespaces from url + url = url.lstrip() + + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. + if ':' in url and not url.lower().startswith('http'): + self.url = url + return + + # Support for unicode domain names and paths. + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) + + if not scheme: + error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?") + error = error.format(to_native_string(url, 'utf8')) + + raise MissingSchema(error) + + if not host: + raise InvalidURL("Invalid URL %r: No host supplied" % url) + + # In general, we want to try IDNA encoding the hostname if the string contains + # non-ASCII characters. This allows users to automatically get the correct IDNA + # behaviour. For strings containing only ASCII characters, we need to also verify + # it doesn't start with a wildcard (*), before allowing the unencoded hostname. + if not unicode_is_ascii(host): + try: + host = self._get_idna_encoded_host(host) + except UnicodeError: + raise InvalidURL('URL has an invalid label.') + elif host.startswith(u'*'): + raise InvalidURL('URL has an invalid label.') + + # Carefully reconstruct the network location + netloc = auth or '' + if netloc: + netloc += '@' + netloc += host + if port: + netloc += ':' + str(port) + + # Bare domains aren't valid URLs. + if not path: + path = '/' + + if is_py2: + if isinstance(scheme, str): + scheme = scheme.encode('utf-8') + if isinstance(netloc, str): + netloc = netloc.encode('utf-8') + if isinstance(path, str): + path = path.encode('utf-8') + if isinstance(query, str): + query = query.encode('utf-8') + if isinstance(fragment, str): + fragment = fragment.encode('utf-8') + + if isinstance(params, (str, bytes)): + params = to_native_string(params) + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = '%s&%s' % (query, enc_params) + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + self.headers = CaseInsensitiveDict() + if headers: + for header in headers.items(): + # Raise exception on invalid header value. + check_header_validity(header) + name, value = header + self.headers[to_native_string(name)] = value + + def prepare_body(self, data, files, json=None): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + + if not data and json is not None: + # urllib3 requires a bytes-like body. Python 2's json.dumps + # provides this natively, but Python 3 gives a Unicode string. + content_type = 'application/json' + body = complexjson.dumps(json) + if not isinstance(body, bytes): + body = body.encode('utf-8') + + is_stream = all([ + hasattr(data, '__iter__'), + not isinstance(data, (basestring, list, tuple, collections.Mapping)) + ]) + + try: + length = super_len(data) + except (TypeError, AttributeError, UnsupportedOperation): + length = None + + if is_stream: + body = data + + if getattr(body, 'tell', None) is not None: + # Record the current file position before reading. + # This will allow us to rewind a file in the event + # of a redirect. + try: + self._body_position = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body + self._body_position = object() + + if files: + raise NotImplementedError('Streamed bodies and files are mutually exclusive.') + + if length: + self.headers['Content-Length'] = builtin_str(length) + else: + self.headers['Transfer-Encoding'] = 'chunked' + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, basestring) or hasattr(data, 'read'): + content_type = None + else: + content_type = 'application/x-www-form-urlencoded' + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if content_type and ('content-type' not in self.headers): + self.headers['Content-Type'] = content_type + + self.body = body + + def prepare_content_length(self, body): + """Prepare Content-Length header based on request method and body""" + if body is not None: + length = super_len(body) + if length: + # If length exists, set it. Otherwise, we fallback + # to Transfer-Encoding: chunked. + self.headers['Content-Length'] = builtin_str(length) + elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: + # Set Content-Length to 0 for methods that can have a body + # but don't provide one. (i.e. not GET or HEAD) + self.headers['Content-Length'] = '0' + + def prepare_auth(self, auth, url=''): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data. + + This function eventually generates a ``Cookie`` header from the + given cookies using cookielib. Due to cookielib's design, the header + will not be regenerated if it already exists, meaning this function + can only be called once for the life of the + :class:`PreparedRequest ` object. Any subsequent calls + to ``prepare_cookies`` will have no actual effect, unless the "Cookie" + header is removed beforehand. + """ + if isinstance(cookies, cookielib.CookieJar): + self._cookies = cookies + else: + self._cookies = cookiejar_from_dict(cookies) + + cookie_header = get_cookie_header(self._cookies, self) + if cookie_header is not None: + self.headers['Cookie'] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + # hooks can be passed as None to the prepare method and to this + # method. To prevent iterating over None, simply use an empty list + # if hooks is False-y + hooks = hooks or [] + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response(object): + """The :class:`Response ` object, which contains a + server's response to an HTTP request. + """ + + __attrs__ = [ + '_content', 'status_code', 'headers', 'url', 'history', + 'encoding', 'reason', 'cookies', 'elapsed', 'request' + ] + + def __init__(self): + self._content = False + self._content_consumed = False + self._next = None + + #: Integer Code of responded HTTP Status, e.g. 404 or 200. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Use of ``raw`` requires that ``stream=True`` be set on the request. + # This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response ` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta). + #: This property specifically measures the time taken between sending + #: the first byte of the request and finishing parsing the headers. It + #: is therefore unaffected by consuming the response content or the + #: value of the ``stream`` keyword argument. + self.elapsed = datetime.timedelta(0) + + #: The :class:`PreparedRequest ` object to which this + #: is a response. + self.request = None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return dict( + (attr, getattr(self, attr, None)) + for attr in self.__attrs__ + ) + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, '_content_consumed', True) + setattr(self, 'raw', None) + + def __repr__(self): + return '' % (self.status_code) + + def __bool__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __nonzero__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + try: + self.raise_for_status() + except HTTPError: + return False + return True + + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return ('location' in self.headers and self.status_code in REDIRECT_STATI) + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanent versions of redirect.""" + return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the chardet library.""" + return chardet.detect(self.content)['encoding'] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + + def generate(): + # Special case for urllib3. + if hasattr(self.raw, 'stream'): + try: + for chunk in self.raw.stream(chunk_size, decode_content=True): + yield chunk + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + else: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + + .. note:: This method is not reentrant safe. + """ + + pending = None + + for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): + + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + for line in lines: + yield line + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + if self._content_consumed: + raise RuntimeError( + 'The content for this response was already consumed') + + if self.status_code == 0 or self.raw is None: + self._content = None + else: + self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes() + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return str('') + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors='replace') + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors='replace') + + return content + + def json(self, **kwargs): + r"""Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + :raises ValueError: If the response body does not contain valid json. + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using chardet to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads( + self.content.decode(encoding), **kwargs + ) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + return complexjson.loads(self.text, **kwargs) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get('link') + + # l = MultiDict() + l = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get('rel') or link.get('url') + l[key] = link + + return l + + def raise_for_status(self): + """Raises stored :class:`HTTPError`, if one occurred.""" + + http_error_msg = '' + if isinstance(self.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. (See PR #3538) + try: + reason = self.reason.decode('utf-8') + except UnicodeDecodeError: + reason = self.reason.decode('iso-8859-1') + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) + + elif 500 <= self.status_code < 600: + http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, 'release_conn', None) + if release_conn is not None: + release_conn() diff --git a/requests/packages.py b/requests/packages.py new file mode 100644 index 00000000..7232fe0f --- /dev/null +++ b/requests/packages.py @@ -0,0 +1,14 @@ +import sys + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ('urllib3', 'idna', 'chardet'): + locals()[package] = __import__(package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == package or mod.startswith(package + '.'): + sys.modules['requests.packages.' + mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/requests/sessions.py b/requests/sessions.py new file mode 100644 index 00000000..6570e733 --- /dev/null +++ b/requests/sessions.py @@ -0,0 +1,737 @@ +# -*- coding: utf-8 -*- + +""" +requests.session +~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import platform +import time +from collections import Mapping +from datetime import timedelta + +from .auth import _basic_auth_str +from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse +from .cookies import ( + cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) +from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT +from .hooks import default_hooks, dispatch_hook +from ._internal_utils import to_native_string +from .utils import to_key_val_list, default_headers +from .exceptions import ( + TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) + +from .structures import CaseInsensitiveDict +from .adapters import HTTPAdapter + +from .utils import ( + requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, + get_auth_from_url, rewind_body +) + +from .status_codes import codes + +# formerly defined here, reexposed here for backward compatibility +from .models import REDIRECT_STATI + +# Preferred clock, based on which one is more accurate on a given system. +if platform.system() == 'Windows': + try: # Python 3.3+ + preferred_clock = time.perf_counter + except AttributeError: # Earlier than Python 3. + preferred_clock = time.clock +else: + preferred_clock = time.time + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and + isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get('response') == []: + return request_hooks + + if request_hooks is None or request_hooks.get('response') == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin(object): + + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers['location'] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + if is_py3: + location = location.encode('latin1') + return to_native_string(location, 'utf8') + return None + + def resolve_redirects(self, resp, req, stream=False, timeout=None, + verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): + """Receives a Response. Returns a generator of Responses or Requests.""" + + hist = [] # keep track of history + + url = self.get_redirect_target(resp) + while url: + prepared_request = req.copy() + + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if len(resp.history) >= self.max_redirects: + raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) + + # Release the connection back into the pool. + resp.close() + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith('//'): + parsed_rurl = urlparse(resp.url) + url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) + + # The scheme should be lower case... + parsed = urlparse(url) + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + + self.rebuild_method(prepared_request, resp) + + # https://github.com/requests/requests/issues/1084 + if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): + # https://github.com/requests/requests/issues/3490 + purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') + for header in purged_headers: + prepared_request.headers.pop(header, None) + prepared_request.body = None + + headers = prepared_request.headers + try: + del headers['Cookie'] + except KeyError: + pass + + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) + merge_cookies(prepared_request._cookies, self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # A failed tell() sets `_body_position` to `object()`. This non-None + # value ensures `rewindable` will be True, allowing us to raise an + # UnrewindableBodyError, instead of hanging the connection. + rewindable = ( + prepared_request._body_position is not None and + ('Content-Length' in headers or 'Transfer-Encoding' in headers) + ) + + # Attempt to rewind consumed file-like object. + if rewindable: + rewind_body(prepared_request) + + # Override the original request. + req = prepared_request + + if yield_requests: + yield req + else: + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp + + def rebuild_auth(self, prepared_request, response): + """When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if 'Authorization' in headers: + # If we get redirected to a new host, we should strip out any + # authentication headers. + original_parsed = urlparse(response.request.url) + redirect_parsed = urlparse(url) + + if (original_parsed.hostname != redirect_parsed.hostname): + del headers['Authorization'] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + return + + def rebuild_proxies(self, prepared_request, proxies): + """This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + + :rtype: dict + """ + proxies = proxies if proxies is not None else {} + headers = prepared_request.headers + url = prepared_request.url + scheme = urlparse(url).scheme + new_proxies = proxies.copy() + no_proxy = proxies.get('no_proxy') + + bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) + if self.trust_env and not bypass_proxy: + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) + + proxy = environ_proxies.get(scheme, environ_proxies.get('all')) + + if proxy: + new_proxies.setdefault(scheme, proxy) + + if 'Proxy-Authorization' in headers: + del headers['Proxy-Authorization'] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + if username and password: + headers['Proxy-Authorization'] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = prepared_request.method + + # http://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != 'HEAD': + method = 'GET' + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != 'HEAD': + method = 'GET' + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == 'POST': + method = 'GET' + + prepared_request.method = method + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistence, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('http://httpbin.org/get') + + + Or as a context manager:: + + >>> with requests.Session() as s: + >>> s.get('http://httpbin.org/get') + + """ + + __attrs__ = [ + 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', + 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', + 'max_redirects', + ] + + def __init__(self): + + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request ` sent from this + #: :class:`Session `. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request `. + self.auth = None + + #: Dictionary mapping protocol or protocol and host to the URL of the proxy + #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to + #: be used on each :class:`Request `. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request `. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + self.verify = True + + #: SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. + self.cert = None + + #: Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. + #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is + #: 30. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Trust environment settings for proxy configuration, default + #: authentication and similar. + self.trust_env = True + + #: A CookieJar containing all currently outstanding cookies set on this + #: session. By default it is a + #: :class:`RequestsCookieJar `, but + #: may be any other ``cookielib.CookieJar`` compatible object. + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = OrderedDict() + self.mount('https://', HTTPAdapter()) + self.mount('http://', HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def prepare_request(self, request): + """Constructs a :class:`PreparedRequest ` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`Request ` instance and those of the + :class:`Session`. + + :param request: :class:`Request` instance to prepare with this + session's settings. + :rtype: requests.PreparedRequest + """ + cookies = request.cookies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies) + + # Set environment's basic authentication if not explicitly set. + auth = request.auth + if self.trust_env and not auth and not self.auth: + auth = get_netrc_auth(request.url) + + p = PreparedRequest() + p.prepare( + method=request.method.upper(), + url=request.url, + files=request.files, + data=request.data, + json=request.json, + headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), + params=merge_setting(request.params, self.params), + auth=merge_setting(auth, self.auth), + cookies=merged_cookies, + hooks=merge_hooks(request.hooks, self.hooks), + ) + return p + + def request(self, method, url, + params=None, data=None, headers=None, cookies=None, files=None, + auth=None, timeout=None, allow_redirects=True, proxies=None, + hooks=None, stream=None, verify=None, cert=None, json=None): + """Constructs a :class:`Request `, prepares it and sends it. + Returns :class:`Response ` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary, bytes, or file-like object to send + in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of ``'filename': file-like-objects`` + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol or protocol and + hostname to the URL of the proxy. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + :rtype: requests.Response + """ + # Create the Request. + req = Request( + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + 'timeout': timeout, + 'allow_redirects': allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + r"""Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('GET', url, **kwargs) + + def options(self, url, **kwargs): + r"""Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('OPTIONS', url, **kwargs) + + def head(self, url, **kwargs): + r"""Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return self.request('HEAD', url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + r"""Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('POST', url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + r"""Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PUT', url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + r"""Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PATCH', url, data=data, **kwargs) + + def delete(self, url, **kwargs): + r"""Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('DELETE', url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest. + + :rtype: requests.Response + """ + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault('stream', self.stream) + kwargs.setdefault('verify', self.verify) + kwargs.setdefault('cert', self.cert) + kwargs.setdefault('proxies', self.proxies) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if isinstance(request, Request): + raise ValueError('You can only send PreparedRequests.') + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop('allow_redirects', True) + stream = kwargs.get('stream') + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = preferred_clock() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) + + # Response manipulation hooks + r = dispatch_hook('response', hooks, r, **kwargs) + + # Persist cookies + if r.history: + + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, **kwargs) + + # Resolve redirects if allowed. + history = [resp for resp in gen] if allow_redirects else [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) + except StopIteration: + pass + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + Check the environment and merge it with some settings. + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + no_proxy = proxies.get('no_proxy') if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration and be compatible + # with cURL. + if verify is True or verify is None: + verify = (os.environ.get('REQUESTS_CA_BUNDLE') or + os.environ.get('CURL_CA_BUNDLE')) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {'verify': verify, 'proxies': proxies, 'stream': stream, + 'cert': cert} + + def get_adapter(self, url): + """ + Returns the appropriate connection adapter for the given URL. + + :rtype: requests.adapters.BaseAdapter + """ + for (prefix, adapter) in self.adapters.items(): + + if url.lower().startswith(prefix): + return adapter + + # Nothing matches :-/ + raise InvalidSchema("No connection adapters were found for '%s'" % url) + + def close(self): + """Closes all adapters and as such the session""" + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix. + + Adapters are sorted in descending order by prefix length. + """ + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) + return state + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """ + Returns a :class:`Session` for context-management. + + :rtype: Session + """ + + return Session() diff --git a/requests/status_codes.py b/requests/status_codes.py new file mode 100644 index 00000000..dee89190 --- /dev/null +++ b/requests/status_codes.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- + +from .structures import LookupDict + +_codes = { + + # Informational. + 100: ('continue',), + 101: ('switching_protocols',), + 102: ('processing',), + 103: ('checkpoint',), + 122: ('uri_too_long', 'request_uri_too_long'), + 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), + 201: ('created',), + 202: ('accepted',), + 203: ('non_authoritative_info', 'non_authoritative_information'), + 204: ('no_content',), + 205: ('reset_content', 'reset'), + 206: ('partial_content', 'partial'), + 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), + 208: ('already_reported',), + 226: ('im_used',), + + # Redirection. + 300: ('multiple_choices',), + 301: ('moved_permanently', 'moved', '\\o-'), + 302: ('found',), + 303: ('see_other', 'other'), + 304: ('not_modified',), + 305: ('use_proxy',), + 306: ('switch_proxy',), + 307: ('temporary_redirect', 'temporary_moved', 'temporary'), + 308: ('permanent_redirect', + 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 + + # Client Error. + 400: ('bad_request', 'bad'), + 401: ('unauthorized',), + 402: ('payment_required', 'payment'), + 403: ('forbidden',), + 404: ('not_found', '-o-'), + 405: ('method_not_allowed', 'not_allowed'), + 406: ('not_acceptable',), + 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), + 408: ('request_timeout', 'timeout'), + 409: ('conflict',), + 410: ('gone',), + 411: ('length_required',), + 412: ('precondition_failed', 'precondition'), + 413: ('request_entity_too_large',), + 414: ('request_uri_too_large',), + 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), + 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), + 417: ('expectation_failed',), + 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), + 421: ('misdirected_request',), + 422: ('unprocessable_entity', 'unprocessable'), + 423: ('locked',), + 424: ('failed_dependency', 'dependency'), + 425: ('unordered_collection', 'unordered'), + 426: ('upgrade_required', 'upgrade'), + 428: ('precondition_required', 'precondition'), + 429: ('too_many_requests', 'too_many'), + 431: ('header_fields_too_large', 'fields_too_large'), + 444: ('no_response', 'none'), + 449: ('retry_with', 'retry'), + 450: ('blocked_by_windows_parental_controls', 'parental_controls'), + 451: ('unavailable_for_legal_reasons', 'legal_reasons'), + 499: ('client_closed_request',), + + # Server Error. + 500: ('internal_server_error', 'server_error', '/o\\', '✗'), + 501: ('not_implemented',), + 502: ('bad_gateway',), + 503: ('service_unavailable', 'unavailable'), + 504: ('gateway_timeout',), + 505: ('http_version_not_supported', 'http_version'), + 506: ('variant_also_negotiates',), + 507: ('insufficient_storage',), + 509: ('bandwidth_limit_exceeded', 'bandwidth'), + 510: ('not_extended',), + 511: ('network_authentication_required', 'network_auth', 'network_authentication'), +} + +codes = LookupDict(name='status_codes') + +for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(('\\', '/')): + setattr(codes, title.upper(), code) diff --git a/requests/structures.py b/requests/structures.py new file mode 100644 index 00000000..05d2b3f5 --- /dev/null +++ b/requests/structures.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- + +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. +""" + +import collections + +from .compat import OrderedDict + + +class CaseInsensitiveDict(collections.MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``collections.MutableMapping`` as well as dict's ``copy``. Also + provides ``lower_items``. + + All keys are expected to be strings. The structure remembers the + case of the last key to be set, and ``iter(instance)``, + ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` + will contain case-sensitive keys. However, querying and contains + testing is case insensitive:: + + cid = CaseInsensitiveDict() + cid['Accept'] = 'application/json' + cid['aCCEPT'] == 'application/json' # True + list(cid) == ['Accept'] # True + + For example, ``headers['content-encoding']`` will return the + value of a ``'Content-Encoding'`` response header, regardless + of how the header name was originally stored. + + If the constructor, ``.update``, or equality comparison + operations are given keys that have equal ``.lower()``s, the + behavior is undefined. + """ + + def __init__(self, data=None, **kwargs): + self._store = OrderedDict() + if data is None: + data = {} + self.update(data, **kwargs) + + def __setitem__(self, key, value): + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] + + def __delitem__(self, key): + del self._store[key.lower()] + + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) + + def __len__(self): + return len(self._store) + + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + return ( + (lowerkey, keyval[1]) + for (lowerkey, keyval) + in self._store.items() + ) + + def __eq__(self, other): + if isinstance(other, collections.Mapping): + other = CaseInsensitiveDict(other) + else: + return NotImplemented + # Compare insensitively + return dict(self.lower_items()) == dict(other.lower_items()) + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return str(dict(self.items())) + + +class LookupDict(dict): + """Dictionary lookup object.""" + + def __init__(self, name=None): + self.name = name + super(LookupDict, self).__init__() + + def __repr__(self): + return '' % (self.name) + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/requests/utils.py b/requests/utils.py new file mode 100644 index 00000000..5c47de98 --- /dev/null +++ b/requests/utils.py @@ -0,0 +1,904 @@ +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import cgi +import codecs +import collections +import contextlib +import io +import os +import platform +import re +import socket +import struct +import warnings + +from .__version__ import __version__ +from . import certs +# to_native_string is unused here, but imported here for backwards compatibility +from ._internal_utils import to_native_string +from .compat import parse_http_list as _parse_list_header +from .compat import ( + quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, + proxy_bypass, urlunparse, basestring, integer_types, is_py3, + proxy_bypass_environment, getproxies_environment) +from .cookies import cookiejar_from_dict +from .structures import CaseInsensitiveDict +from .exceptions import ( + InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) + +NETRC_FILES = ('.netrc', '_netrc') + +DEFAULT_CA_BUNDLE_PATH = certs.where() + + +if platform.system() == 'Windows': + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + if is_py3: + import winreg + else: + import _winreg as winreg + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + proxyEnable = winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0] + proxyOverride = winreg.QueryValueEx(internetSettings, + 'ProxyOverride')[0] + except OSError: + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(';') + # now check if we match one of the registry values. + for test in proxyOverride: + if test == '': + if '.' not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, 'items'): + d = d.items() + + return d + + +def super_len(o): + total_length = None + current_position = 0 + + if hasattr(o, '__len__'): + total_length = len(o) + + elif hasattr(o, 'len'): + total_length = o.len + + elif hasattr(o, 'fileno'): + try: + fileno = o.fileno() + except io.UnsupportedOperation: + pass + else: + total_length = os.fstat(fileno).st_size + + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if 'b' not in o.mode: + warnings.warn(( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode."), + FileModeWarning + ) + + if hasattr(o, 'tell'): + try: + current_position = o.tell() + except (OSError, IOError): + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + if total_length is not None: + current_position = total_length + else: + if hasattr(o, 'seek') and total_length is None: + # StringIO and BytesIO have seek but no useable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() + + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except (OSError, IOError): + total_length = 0 + + if total_length is None: + total_length = 0 + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): + """Returns the Requests tuple auth for a given url from netrc.""" + + try: + from netrc import netrc, NetrcParseError + + netrc_path = None + + for f in NETRC_FILES: + try: + loc = os.path.expanduser('~/{0}'.format(f)) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See http://bugs.python.org/issue20164 & + # https://github.com/requests/requests/issues/1846 + return + + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + + # Strip port numbers from netloc. This weird `if...encode`` dance is + # used for Python 3.2, which doesn't support unicode literals. + splitstr = b':' + if isinstance(url, str): + splitstr = splitstr.decode('ascii') + host = ri.netloc.split(splitstr)[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = (0 if _netrc[0] else 1) + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, IOError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise + + # AppEngine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, 'name', None) + if (name and isinstance(name, basestring) and name[0] != '<' and + name[-1] != '>'): + return os.path.basename(name) + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + ValueError: need more than 1 value to unpack + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + + :rtype: OrderedDict + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples. + + :rtype: list + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + if isinstance(value, collections.Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + :rtype: list + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + :rtype: dict + """ + result = {} + for item in _parse_list_header(value): + if '=' not in item: + result[item] = None + continue + name, value = item.split('=', 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + :rtype: str + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != '\\\\': + return value.replace('\\\\', '\\').replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + :rtype: dict + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + :rtype: CookieJar + """ + + return cookiejar_from_dict(cookie_dict, cj) + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + warnings.warn(( + 'In requests 3.0, get_encodings_from_content will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + charset_re = re.compile(r']', flags=re.I) + pragma_re = re.compile(r']', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return (charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content)) + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + :rtype: str + """ + + content_type = headers.get('content-type') + + if not content_type: + return None + + content_type, params = cgi.parse_header(content_type) + + if 'charset' in params: + return params['charset'].strip("'\"") + + if 'text' in content_type: + return 'ISO-8859-1' + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes a iterator.""" + + if r.encoding is None: + for item in iterator: + yield item + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b'', final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) + while pos < len(string): + yield string[pos:pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + 2. fall back and replace all unicode characters + + :rtype: str + """ + warnings.warn(( + 'In requests 3.0, get_unicode_from_response will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors='replace') + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str + """ + parts = uri.split('%') + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = '%' + parts[i] + else: + parts[i] = '%' + parts[i] + return ''.join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + + :rtype: str + """ + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) + + +def address_in_network(ip, net): + """This function allows you to check if an IP belongs to a network subnet + + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool + """ + ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] + netaddr, bits = net.split('/') + netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """Converts mask from /xx format to xxx.xxx.xxx.xxx + + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str + """ + bits = 0xffffffff ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack('>I', bits)) + + +def is_ipv4_address(string_ip): + """ + :rtype: bool + """ + try: + socket.inet_aton(string_ip) + except socket.error: + return False + return True + + +def is_valid_cidr(string_network): + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ + if string_network.count('/') == 1: + try: + mask = int(string_network.split('/')[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split('/')[0]) + except socket.error: + return False + else: + return False + return True + + +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): + """ + Returns whether we should bypass proxies or not. + + :rtype: bool + """ + get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy('no_proxy') + netloc = urlparse(url).netloc + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the netloc, both with and without the port. + no_proxy = ( + host for host in no_proxy.replace(' ', '').split(',') if host + ) + + ip = netloc.split(':')[0] + if is_ipv4_address(ip): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(ip, proxy_ip): + return True + elif ip == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True + else: + for host in no_proxy: + if netloc.endswith(host) or netloc.split(':')[0].endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + # If the system proxy settings indicate that this URL should be bypassed, + # don't proxy. + # The proxy_bypass function is incredibly buggy on OS X in early versions + # of Python 2.6, so allow this call to fail. Only catch the specific + # exceptions we've seen, though: this call failing in other ways can reveal + # legitimate problems. + with set_environ('no_proxy', no_proxy_arg): + try: + bypass = proxy_bypass(netloc) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + + +def get_environ_proxies(url, no_proxy=None): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url, no_proxy=no_proxy): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get(urlparts.scheme, proxies.get('all')) + + proxy_keys = [ + urlparts.scheme + '://' + urlparts.hostname, + urlparts.scheme, + 'all://' + urlparts.hostname, + 'all', + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy + + +def default_user_agent(name="python-requests"): + """ + Return a string representing the default user agent. + + :rtype: str + """ + return '%s/%s' % (name, __version__) + + +def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ + return CaseInsensitiveDict({ + 'User-Agent': default_user_agent(), + 'Accept-Encoding': ', '.join(('gzip', 'deflate')), + 'Accept': '*/*', + 'Connection': 'keep-alive', + }) + + +def parse_header_links(value): + """Return a dict of parsed link headers proxies. + + i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" + + :rtype: list + """ + + links = [] + + replace_chars = ' \'"' + + for val in re.split(', *<', value): + try: + url, params = val.split(';', 1) + except ValueError: + url, params = val, '' + + link = {'url': url.strip('<> \'"')} + + for param in params.split(';'): + try: + key, value = param.split('=') + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + """ + :rtype: str + """ + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return 'utf-32' # BOM included + if sample[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return 'utf-16' # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return 'utf-8' + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return 'utf-16-be' + if sample[1::2] == _null2: # 2nd and 4th are null + return 'utf-16-le' + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return 'utf-32-be' + if sample[1:] == _null3: + return 'utf-32-le' + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) + + # urlparse is a finicky beast, and sometimes decides that there isn't a + # netloc present. Assume that it's being over-cautious, and switch netloc + # and path if urlparse decided there was no netloc. + if not netloc: + netloc, path = path, netloc + + return urlunparse((scheme, netloc, path, params, query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ('', '') + + return auth + + +# Moved outside of function to avoid recompile every call +_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') +_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') + + +def check_header_validity(header): + """Verifies that header value is a string which doesn't contain + leading whitespace or return characters. This prevents unintended + header injection. + + :param header: tuple, in the format (name, value). + """ + name, value = header + + if isinstance(value, bytes): + pat = _CLEAN_HEADER_REGEX_BYTE + else: + pat = _CLEAN_HEADER_REGEX_STR + try: + if not pat.match(value): + raise InvalidHeader("Invalid return character or leading space in header: %s" % name) + except TypeError: + raise InvalidHeader("Value for header {%s: %s} must be of type str or " + "bytes, not %s" % (name, value, type(value))) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit('@', 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, '')) + + +def rewind_body(prepared_request): + """Move file pointer back to its recorded starting position + so it can be read again on redirect. + """ + body_seek = getattr(prepared_request.body, 'seek', None) + if body_seek is not None and isinstance(prepared_request._body_position, integer_types): + try: + body_seek(prepared_request._body_position) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect.") + else: + raise UnrewindableBodyError("Unable to rewind request body for redirect.") From 5c4ab5a49efed66bff94736ae9701714e7f8141b Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Mon, 26 Mar 2018 19:45:43 +0200 Subject: [PATCH 05/85] better overlay defaults --- TekkenData/frame_data_overlay.ini | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/TekkenData/frame_data_overlay.ini b/TekkenData/frame_data_overlay.ini index f22e5d40..95fd7109 100644 --- a/TekkenData/frame_data_overlay.ini +++ b/TekkenData/frame_data_overlay.ini @@ -1,10 +1,10 @@ [DisplaySettings] overlay_as_draggable_window = 0 only_appears_when_tekken_7_has_focus = 1 -#transparent_background = 0 #off by default for windows 7, on for 8/10 +;transparent_background = 0 ;off by default for windows 7, on for 8/10 overlay_on_bottom = 0 data_for_nerds = False -tiny_live_frame_data_numbers = False +tiny_live_frame_data_numbers = True [DataColumns] xcommx = True @@ -12,14 +12,13 @@ xidx = False name = False xtypexx = True xstx = True -blox = True -hitx = True -xchxx = True +blox = False +hitx = False +xchxx = False act = True -t = False +t = True tot = True rec = True opp = True notes = True - From 55b2ca5de0cd97c3c4181631f868985ca15de1cc Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Mon, 26 Mar 2018 19:47:17 +0200 Subject: [PATCH 06/85] 2018-03-19 patch addresses --- CE_NonMatchAddresses.CT | 3 +- CE_TekkenBot.CT | 1095 ++++++++++++++++++++++++++++++--- TekkenData/memory_address.ini | 125 ++-- 3 files changed, 1081 insertions(+), 142 deletions(-) diff --git a/CE_NonMatchAddresses.CT b/CE_NonMatchAddresses.CT index 2591a12c..15941f34 100644 --- a/CE_NonMatchAddresses.CT +++ b/CE_NonMatchAddresses.CT @@ -166,6 +166,5 @@ - Info about this table: - + outdated, please use CE_TekkenBot.CT instead diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index ecd70485..efb584a3 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -4,91 +4,1016 @@ b7Ej%2nldAU:MM2b.}cxWeIh0Gi32eO*Ft]WMuP5%{mcIVgA6t9Fkwal+AgInNpI$=7,zGoLEqjnV-i7R=ffx00 - 1005 "player_data_second_pointer_offset" 4 Bytes

"TekkenGame-Win64-Shipping.exe"+3363540
00 - 1006 "p2_data_offset" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
66b00
- 1007 "p2_end_block_offset" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
c80
- 1008 "rollback_frame_offset" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
19f700
- 1009 "frame_count" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
19ad00
- 1010 "facing" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
ac40
- 1011 "timer_in_frames" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
19ad80
- 1012 "p1_char_id" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
d40
- 1013 "p2_char_id" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
67840
- 1014 "p1_move_timer" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
1f00
- 1015 "p2_move_timer" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
68a00
- 1016 "p1_attack_damage" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
2fc0
- 1017 "p2_attack_damage" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
69ac0
- 1018 "p1_move_id" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
31c0
- 1019 "p2_move_id" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
69cc0
- 1020 "p1_recovery" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
3600
- 1021 "p2_recovery" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
6a100
- 1022 "p1_hit_outcome" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
39c0
- 1023 "p2_hit_outcome" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
6a4c0
- 1024 "p1_attack_type" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
3d40
- 1025 "p2_attack_type" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
6a840
- 1026 "p1_simple_move_state" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
3d80
- 1027 "p2_simple_move_state" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
6a880
- 1028 "p1_stun_type" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
3dc0
- 1029 "p2_stun_type" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
6a8c0
- 1030 "p1_throw_tech" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
3ec0
- 1031 "p2_throw_tech" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
6a9c0
- 1032 "p1_throw_flag" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
3f80
- 1033 "p2_throw_flag" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
6aa80
- 1034 "p1_complex_move_state" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
4000
- 1035 "p2_complex_move_state" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
6ab00
- 1036 "p1_power_crush" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
4f60
- 1037 "p2_power_crush" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
6ba60
- 1038 "p1_jump_flags" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
5440
- 1039 "p2_jump_flags" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
6bf40
- 1040 "p1_cancel_window" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
5680
- 1041 "p2_cancel_window" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
6c180
- 1042 "p1_damage_taken" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
6ec0
- 1043 "p2_damage_taken" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
6d9c0
- 1044 "p1_x" Float
"TekkenGame-Win64-Shipping.exe"+3363540
bf00
- 1045 "p2_x" Float
"TekkenGame-Win64-Shipping.exe"+3363540
72a00
- 1046 "p1_y" Float
"TekkenGame-Win64-Shipping.exe"+3363540
bf40
- 1047 "p2_y" Float
"TekkenGame-Win64-Shipping.exe"+3363540
72a40
- 1048 "p1_z" Float
"TekkenGame-Win64-Shipping.exe"+3363540
bf80
- 1049 "p2_z" Float
"TekkenGame-Win64-Shipping.exe"+3363540
72a80
- 1050 "p1_hitbox1" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
bfc0
- 1051 "p2_hitbox1" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
72ac0
- 1052 "p1_hitbox2" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
c000
- 1053 "p2_hitbox2" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
72b00
- 1054 "p1_hitbox3" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
c040
- 1055 "p2_hitbox3" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
72b40
- 1056 "p1_hitbox4" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
c080
- 1057 "p2_hitbox4" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
72b80
- 1058 "p1_hitbox5" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
c0c0
- 1059 "p2_hitbox5" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
72bc0
- 1060 "p1_activebox_x" Float
"TekkenGame-Win64-Shipping.exe"+3363540
10500
- 1061 "p2_activebox_x" Float
"TekkenGame-Win64-Shipping.exe"+3363540
77000
- 1062 "p1_activebox_y" Float
"TekkenGame-Win64-Shipping.exe"+3363540
10540
- 1063 "p2_activebox_y" Float
"TekkenGame-Win64-Shipping.exe"+3363540
77040
- 1064 "p1_activebox_z" Float
"TekkenGame-Win64-Shipping.exe"+3363540
10580
- 1065 "p2_activebox_z" Float
"TekkenGame-Win64-Shipping.exe"+3363540
77080
- 1066 "p1_health_percent" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
11d80
- 1067 "p2_health_percent" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
78880
- 1068 "p1_input_counter" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
14e80
- 1069 "p2_input_counter" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
7b980
- 1070 "p1_input_attack" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
14ec0
- 1071 "p2_input_attack" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
7b9c0
- 1072 "p1_input_direction" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
14f00
- 1073 "p2_input_direction" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
7ba00
- 1074 "p1_attack_startup" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
66a00
- 1075 "p2_attack_startup" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
cd500
- 1076 "p1_attack_startup_end" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
66a40
- 1077 "p2_attack_startup_end" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
cd540
- 1078 "p1_rage_flag" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
99a0
- 1079 "p2_rage_flag" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
704a0
- 1080 "p1_mystery_state" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
9940
- 1081 "p2_mystery_state" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
70440
- 1082 "p1_round_wins" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
19aec0
- 1083 "p2_round_wins" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
19bb40
- 1084 "p1_display_combo_counter" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
19b500
- 1085 "p2_display_combo_counter" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
19c180
- 1086 "p1_display_combo_damage" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
19b580
- 1087 "p2_display_combo_damage" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
19c200
- 1088 "p1_display_juggle_damage" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
19b5c0
- 1089 "p2_display_juggle_damage" 4 Bytes
"TekkenGame-Win64-Shipping.exe"+3363540
19c240
+ + 1005 + "player_data_second_pointer_offset" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 0 + 0 + +
+ + 1102 + "player_data_second_pointer_offset" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1208 + 0 + +
+ + 1006 + "p2_data_offset" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6850 + 0 + +
+ + 1007 + "p2_end_block_offset" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + c8 + 0 + +
+ + 1008 + "rollback_frame_offset" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1A620 + 0 + +
+ + 1009 + "frame_count" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1A150 + 0 + +
+ + 1010 + "facing" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + ad4 + 0 + +
+ + 1011 + "timer_in_frames" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1A158 + 0 + +
+ + 1012 + "p1_char_id" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + d4 + 0 + +
+ + 1013 + "p2_char_id" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6924 + 0 + +
+ + 1014 + "p1_move_timer" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1f0 + 0 + +
+ + 1015 + "p2_move_timer" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6A40 + 0 + +
+ + 1016 + "p1_attack_damage" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 2fc + 0 + +
+ + 1017 + "p2_attack_damage" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6B4C + 0 + +
+ + 1018 + "p1_move_id" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 31c + 0 + +
+ + 1019 + "p2_move_id" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6B6C + 0 + +
+ + 1020 + "p1_recovery" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 360 + 0 + +
+ + 1021 + "p2_recovery" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6BB0 + 0 + +
+ + 1022 + "p1_hit_outcome" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 39c + 0 + +
+ + 1023 + "p2_hit_outcome" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6BEC + 0 + +
+ + 1024 + "p1_attack_type" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 3d4 + 0 + +
+ + 1025 + "p2_attack_type" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6C24 + 0 + +
+ + 1026 + "p1_simple_move_state" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 3d8 + 0 + +
+ + 1027 + "p2_simple_move_state" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6C28 + 0 + +
+ + 1028 + "p1_stun_type" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 3dc + 0 + +
+ + 1029 + "p2_stun_type" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6C2C + 0 + +
+ + 1030 + "p1_throw_tech" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 3ec + 0 + +
+ + 1031 + "p2_throw_tech" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6C3C + 0 + +
+ + 1032 + "p1_throw_flag" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 3f8 + 0 + +
+ + 1033 + "p2_throw_flag" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6C48 + 0 + +
+ + 1034 + "p1_complex_move_state" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 400 + 0 + +
+ + 1133 + "p2_complex_move_state" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6C50 + 0 + +
+ + 1123 + "p1_power_crush" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 4FA + 0 + +
+ + 1124 + "p2_power_crush" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6D4A + 0 + +
+ + 1038 + "p1_jump_flags" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 544 + 0 + +
+ + 1039 + "p2_jump_flags" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6D94 + 0 + +
+ + 1040 + "p1_cancel_window" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 568 + 0 + +
+ + 1041 + "p2_cancel_window" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6DB8 + 0 + +
+ + 1042 + "p1_damage_taken" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6ec + 0 + +
+ + 1043 + "p2_damage_taken" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6F3C + 0 + +
+ + 1044 + "p1_x" + + Float +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + c00 + 0 + +
+ + 1045 + "p2_x" + + Float +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 7450 + 0 + +
+ + 1046 + "p1_y" + + Float +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + c04 + 0 + +
+ + 1047 + "p2_y" + + Float +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 7454 + 0 + +
+ + 1048 + "p1_z" + + Float +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + c08 + 0 + +
+ + 1049 + "p2_z" + + Float +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 7458 + 0 + +
+ + 1050 + "p1_hitbox1" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + c0c + 0 + +
+ + 1051 + "p2_hitbox1" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 745C + 0 + +
+ + 1052 + "p1_hitbox2" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + c10 + 0 + +
+ + 1053 + "p2_hitbox2" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 7460 + 0 + +
+ + 1054 + "p1_hitbox3" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + c14 + 0 + +
+ + 1055 + "p2_hitbox3" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 7464 + 0 + +
+ + 1056 + "p1_hitbox4" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + c18 + 0 + +
+ + 1057 + "p2_hitbox4" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 7468 + 0 + +
+ + 1058 + "p1_hitbox5" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + c1c + 0 + +
+ + 1059 + "p2_hitbox5" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 746C + 0 + +
+ + 1060 + "p1_activebox_x" + + 000000 + Float +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1060 + 0 + +
+ + 1061 + "p2_activebox_x" + + 000000 + Float +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 78B0 + 0 + +
+ + 1062 + "p1_activebox_y" + + 000000 + Float +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1064 + 0 + +
+ + 1063 + "p2_activebox_y" + + 000000 + Float +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 78B4 + 0 + +
+ + 1064 + "p1_activebox_z" + + 000000 + Float +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1068 + 0 + +
+ + 1065 + "p2_activebox_z" + + 000000 + Float +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 78B8 + 0 + +
+ + 1066 + "p1_health_percent" + + 000000 + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 11e8 + 0 + +
+ + 1067 + "p2_health_percent" + + 000000 + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 7A38 + 0 + +
+ + 1068 + "p1_input_counter" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 15B8 + 0 + +
+ + 1069 + "p2_input_counter" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 7E08 + 0 + +
+ + 1070 + "p1_input_attack" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 15BC + 0 + +
+ + 1071 + "p2_input_attack" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 7E0C + 0 + +
+ + 1072 + "p1_input_direction" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 15C0 + 0 + +
+ + 1073 + "p2_input_direction" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 7E10 + 0 + +
+ + 1074 + "p1_attack_startup" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6840 + 0 + +
+ + 1075 + "p2_attack_startup" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + D090 + 0 + +
+ + 1076 + "p1_attack_startup_end" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 6844 + 0 + +
+ + 1077 + "p2_attack_startup_end" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + EE94 + 0 + +
+ + 1078 + "p1_rage_flag" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 99C + 0 + +
+ + 1079 + "p2_rage_flag" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 71EC + 0 + +
+ + 1080 + "p1_mystery_state" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 990 + 0 + +
+ + 1135 + "p2_mystery_state" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 71E0 + 0 + +
+ + 1125 + "p1_round_wins" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1A16c + 0 + +
+ + 1126 + "p2_round_wins" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1A23c + 0 + +
+ + 1084 + "p1_display_combo_counter" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1A200 + 0 + +
+ + 1120 + "p2_display_combo_counter" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1A2D0 + 0 + +
+ + 1086 + "p1_display_combo_damage" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1A1D8 + 0 + +
+ + 1087 + "p2_display_combo_damage" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1A2A8 + 0 + +
+ + 1121 + "p1_display_juggle_damage" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1A1DC + 0 + +
+ + 1122 + "p2_display_juggle_damage" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+ + 1A2AC + 0 + +
+ + 1105 + "p1_movelist" + + String + 10 + 0 + 0 + 1 +
"TekkenGame-Win64-Shipping.exe"+3400DD0
+ + 2e8 + +
+ + 1127 + "p2_movelist" + + String + 10 + 0 + 0 + 1 +
"TekkenGame-Win64-Shipping.exe"+340F800
+ + 2e8 + +
+ + 1129 + "OPPONENT_NAME" + + String + 13 + 0 + 0 + 1 +
"TekkenGame-Win64-Shipping.exe"+033EB200
+ + 114 + 8 + 0 + +
+ + 1131 + "OPPONENT_SIDE" + + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+033EB200
+ + 70 + 8 + 0 + +
Info about this table: diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index 94ce82ac..d17fe811 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,32 +1,51 @@ +;2018-03-19 patch addresses (Noctis update, timestamp 1521496706, date from https://steamdb.info/app/389730/history/) +;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. + [MemoryAddressOffsets] player_data_pointer_offset = 0x033FFBC8 -player_data_second_pointer_offset = 0 p2_data_offset = 0x6850 +rollback_frame_offset = 0x1a600 +;----IGNORABLE START---- +player_data_second_pointer_offset = 0 p2_end_block_offset = 0xD0 -rollback_frame_offset = 0x1A4F0 movelist_size = 2000000 -expected_module_address = 0x140000000 # Might not have to be configurable +expected_module_address = 0x140000000 ;Might not have to be configurable +;----IGNORABLE END---- + + [GameDataAddress] -frame_count = 0x19AD0 #resets sometimes on p1 backdash??? caps at 0xFF -facing = 0xAD4 -timer_in_frames = 0x1A054 +frame_count = 0x1A150 +;----IGNORABLE START---- +;frame_count = 0x6a0 ;resets sometimes on p1 backdash??? +;frame_count = 0x70C ;caps at 0xFF +facing = 0xad4 +timer_in_frames = 0x1A158 +;----IGNORABLE END---- + + [EndBlockPlayerDataAddress] -round_wins = 0x19AEC -display_combo_counter = 0x1A0D0 -display_combo_damage = 0x1A0D8 -display_juggle_damage = 0x1A0DC -total_attacks_made = 0x19B5C #Outdated #NotUsed -total_moves_blocked = 0x19B5C #Outdated #NotUsed +;----IGNORABLE START---- +round_wins = 0x1A16c +;p2_wins = 0x19BB4 +display_combo_counter = 0x1A200 +display_combo_damage = 0x1A1D8 +display_juggle_damage = 0x1A1DC +total_attacks_made = 0x19B5C ;Outdated ;NotUsed +total_moves_blocked = 0x19B5C ;Outdated ;NotUsed +;p2_display_combo_counter = 0x19c18 +;p2_display_combo_damage = 0x19c20 +;p2_display_juggle_damage = 0x19c24 +;----IGNORABLE END---- + + [PlayerDataAddress] -char_id = 0xD4 move_timer = 0x1f0 -attack_damage = 0x2FC move_id = 0x31C recovery = 0x360 hit_outcome = 0x39C @@ -34,64 +53,60 @@ attack_type = 0x3D4 simple_move_state = 0x3D8 stun_type = 0x3DC throw_tech = 0x3EC -throw_flag = 0x3F8 complex_move_state = 0x400 - power_crush = 0x4FA jump_flags = 0x544 cancel_window = 0x568 damage_taken = 0x6EC - -x = 0xC00 -y = 0xC04 -z = 0xC08 -hitbox1 = 0xC0C -hitbox2 = 0xC10 -hitbox3 = 0xC14 -hitbox4 = 0xC18 -hitbox5 = 0xC1C - +input_attack = 0x15BC +input_direction = 0x15C0 +attack_startup = 0x6840 +attack_startup_end = 0x6844 +;----IGNORABLE START---- +char_id = 0xd4 +attack_damage = 0x2fc +throw_flag = 0x3f8 +x = 0xc00 +y = 0xc04 +z = 0xc08 +hitbox1 = 0xc0c +hitbox2 = 0xc10 +hitbox3 = 0xc14 +hitbox4 = 0xc18 +hitbox5 = 0xc1c activebox_x = 0x1060 activebox_y = 0x1064 activebox_z = 0x1068 - -health_percent = 0x11E8 +health_percent = 0x11e8 movelist_to_use = 0x1208 -# raw_array_start = 0xABC #this is the raw 'buttons' pressed before they are assigned to 1,2,3,4, 1+2, etc -input_counter = 0x1598 # goes up one every new input state, caps at 0x27 -input_attack = 0x15BC -input_direction = 0xACC - -attack_startup = 0x6840 -attack_startup_end = 0x6844 - +input_counter = 0x15B8 ;goes up one every new input state, caps at 0x27 +;raw_array_start = 0xABC ;this is the raw 'buttons' pressed before they are assigned to 1,2,3,4, 1+2, etc rage_flag = 0x99C +;mystery_state = 0x534 +mystery_state = 0x990 ;Possibly Max_Mode ;Uncertain Value +juggle_height = 0x11D8 ;Outdated ;NotUsed +;super meter p1 0x9F4 +;----IGNORABLE END---- -mystery_state = 0x990 #Possibly Max_Mode #Uncertain Value -juggle_height = 0x11D8 #Outdated #NotUsed - -#super meter p1 0x9F4 [NonPlayerDataAddresses] -OPPONENT_NAME = 0x033B7860 0x0 0x8 0x114 #NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x033B7860 0x0 0x8 0x70 #0 means they are player 1, 1 means they are player 2 - -P1_CHAR_SELECT = 0x033B7E68 0x80 0x3CC #Alisa 19, Claudio 20 +OPPONENT_NAME = 0x033EB200 0x0 0x8 0x114 ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x033EB200 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 +P1_Movelist = 0x03400DD0 0x2E8 ;There's a pointer to this in player data block +P2_Movelist = 0x0340F800 0x2E8 +;----IGNORABLE START---- +P1_CHAR_SELECT = 0x033B7E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B7E68 0x80 0x584 STAGE_SELECT = 0x033B7E68 0x80 0x78 - -#Matchlist0_PlayerName = 0x03336410 0x2C0 0x138 -#Matchlist0_PING = 0x03336410 0x2C0 0x114 -#Matchlist0_CharId = 0x03336410 0x2C0 0x180 -#Matchlist0_Rank = 0x03336410 0x2C0 0x184 -#Matchlist0_Wins = 0x03336410 0x2C0 0x188 - -WARMUP_PLAYER_NAME1 = 0x033B7408 0x50 0x0 #OutOfDate #look for name + opponent's name 320 bytes apart in online match +;Matchlist0_PlayerName = 0x03336410 0x2C0 0x138 +;Matchlist0_PING = 0x03336410 0x2C0 0x114 +;Matchlist0_CharId = 0x03336410 0x2C0 0x180 +;Matchlist0_Rank = 0x03336410 0x2C0 0x184 +;Matchlist0_Wins = 0x03336410 0x2C0 0x188 +WARMUP_PLAYER_NAME1 = 0x033B7408 0x50 0x0 ;OutOfDate ;look for name + opponent's name 320 bytes apart in online match WARMUP_PLAYER_WINS1 = 0x033B7408 0x50 -0x34 WARMUP_PLAYER_NAME2 = 0x033B7408 0x50 0x140 WARMUP_PLAYER_WINS2 = 0x033B7408 0x50 0x10C - -P1_Movelist = 0x03400DD0 0x2E8 # There's a pointer to this in player data block -P2_Movelist = 0x0340F800 0x2E8 +;----IGNORABLE END---- \ No newline at end of file From 264bae8795368b7154dfa2188415b8b46f618cb6 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Mon, 26 Mar 2018 19:48:55 +0200 Subject: [PATCH 07/85] updating readmes --- README.md | 11 +++++++---- TekkenData/tekken_bot_readme.txt | 7 ++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f245df75..53bd2835 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,12 @@ # TekkenBot AI and tools for playing and understanding Tekken 7. +Created by roguelike2d. Maintained by the community. MAKE SURE YOU ALWAYS HAVE THE LATEST VERSION OF memory_address.ini + ## Tools -Available from https://github.com/roguelike2d/TekkenBot/releases +Download from https://github.com/WAZAAAAA0/TekkenBot/releases + +If you're using a compiled release version, run TekkenBotPrime.exe. If you're running from source with Python 3 installed, run GUI_TekkenBotPrime.py ### FrameDataOverlay A window that can go over the game to display real time move information read from memory. Requires the game to be in windowed or borderless to work or can be run as a standalone window on a second screen. @@ -23,7 +27,7 @@ Tekken Bot bots are programs that plays Tekken 7 on PC by reading the game's mem Pushes jab or a user inputted move when getting out of block stun. ### Punisher Bot -Attempts to punish negative attacks with the best avaiable punish. Punishes are listed in the character's file in the /TekkenData folder. +Attempts to punish negative attacks with the best available punish. Punishes are listed in the character's file in the /TekkenData folder. ## Project details @@ -44,5 +48,4 @@ To find the player data object you can use the following values for player 1 ani Alternately, you can search for move damage which is displayed in training mode and active (usually) for the duration of the move. -Whatever you find, there should be 9 values, eight in addresses located close together and one far away. Find the offset to the pointer to the pointer of any of the first 8 and replace the 'player_data_pointer_offset' value in MemoryAddressEnum.py. - +Whatever you find, there should be 9 values, eight in addresses located close together and one far away. Find the offset to the pointer to the pointer of any of the first 8 and replace the 'player_data_pointer_offset' value in MemoryAddressEnum.py. \ No newline at end of file diff --git a/TekkenData/tekken_bot_readme.txt b/TekkenData/tekken_bot_readme.txt index c568867f..10e26992 100644 --- a/TekkenData/tekken_bot_readme.txt +++ b/TekkenData/tekken_bot_readme.txt @@ -1,5 +1,6 @@ -------TEKKEN BOT README (https://github.com/roguelike2d/TekkenBot/releases)------ -* Launch Tekken 7, then launch Tekken Bot by clicking on TekkenBotPrime.exe. Tekken Bot should automatically locate the running Tekken 7 instance and start reading its memory. +------TEKKEN BOT README------ +*** MAKE SURE YOU ALWAYS HAVE THE LATEST VERSION OF memory_address.ini*** +* Launch Tekken 7, then launch Tekken Bot by clicking on TekkenBotPrime.exe. Tekken Bot should automatically locate the running Tekken 7 instance and start reading its memory. If Tekken 7 is running with admin rights, make sure you also run Tekken Bot with them. * Frame Data Overlay requires Tekken 7 to be in windowed or windowed borderless mode (switch first to windowed, THEN to borderless). -* Users with multiple monitors can get the overlay as a seperate, draggable window on their second monitor (display -> overlay_as_draggable_window). +* Users with multiple monitors can get the overlay as a separate, draggable window on their second monitor (display -> overlay_as_draggable_window). ------ \ No newline at end of file From db040872f6aa8bfa1e417e327ec57c3a945a62d4 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Mon, 26 Mar 2018 20:31:13 +0200 Subject: [PATCH 08/85] missing "requests" requirements --- certifi/__init__.py | 3 + certifi/__main__.py | 2 + certifi/cacert.pem | 4834 +++++++++++ certifi/core.py | 36 + certifi/old_root.pem | 414 + certifi/weak.pem | 5248 +++++++++++ chardet/__init__.py | 39 + chardet/big5freq.py | 386 + chardet/big5prober.py | 47 + chardet/chardistribution.py | 233 + chardet/charsetgroupprober.py | 106 + chardet/charsetprober.py | 145 + chardet/cli/__init__.py | 1 + chardet/cli/chardetect.py | 85 + chardet/codingstatemachine.py | 88 + chardet/compat.py | 34 + chardet/cp949prober.py | 49 + chardet/enums.py | 76 + chardet/escprober.py | 101 + chardet/escsm.py | 246 + chardet/eucjpprober.py | 92 + chardet/euckrfreq.py | 195 + chardet/euckrprober.py | 47 + chardet/euctwfreq.py | 387 + chardet/euctwprober.py | 46 + chardet/gb2312freq.py | 283 + chardet/gb2312prober.py | 46 + chardet/hebrewprober.py | 292 + chardet/jisfreq.py | 325 + chardet/jpcntx.py | 233 + chardet/langbulgarianmodel.py | 228 + chardet/langcyrillicmodel.py | 333 + chardet/langgreekmodel.py | 225 + chardet/langhebrewmodel.py | 200 + chardet/langhungarianmodel.py | 225 + chardet/langthaimodel.py | 199 + chardet/langturkishmodel.py | 193 + chardet/latin1prober.py | 145 + chardet/mbcharsetprober.py | 91 + chardet/mbcsgroupprober.py | 54 + chardet/mbcssm.py | 572 ++ chardet/sbcharsetprober.py | 132 + chardet/sbcsgroupprober.py | 73 + chardet/sjisprober.py | 92 + chardet/universaldetector.py | 286 + chardet/utf8prober.py | 82 + chardet/version.py | 9 + idna/__init__.py | 2 + idna/codec.py | 118 + idna/compat.py | 12 + idna/core.py | 387 + idna/idnadata.py | 1585 ++++ idna/intranges.py | 53 + idna/package_data.py | 2 + idna/uts46data.py | 7634 +++++++++++++++++ urllib3/__init__.py | 97 + urllib3/_collections.py | 319 + urllib3/connection.py | 373 + urllib3/connectionpool.py | 905 ++ urllib3/contrib/__init__.py | 0 urllib3/contrib/_securetransport/__init__.py | 0 urllib3/contrib/_securetransport/bindings.py | 593 ++ urllib3/contrib/_securetransport/low_level.py | 343 + urllib3/contrib/appengine.py | 296 + urllib3/contrib/ntlmpool.py | 112 + urllib3/contrib/pyopenssl.py | 455 + urllib3/contrib/securetransport.py | 810 ++ urllib3/contrib/socks.py | 188 + urllib3/exceptions.py | 246 + urllib3/fields.py | 178 + urllib3/filepost.py | 94 + urllib3/packages/__init__.py | 5 + urllib3/packages/backports/__init__.py | 0 urllib3/packages/backports/makefile.py | 53 + urllib3/packages/ordered_dict.py | 259 + urllib3/packages/six.py | 868 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../ssl_match_hostname/_implementation.py | 157 + urllib3/poolmanager.py | 440 + urllib3/request.py | 148 + urllib3/response.py | 626 ++ urllib3/util/__init__.py | 54 + urllib3/util/connection.py | 130 + urllib3/util/request.py | 118 + urllib3/util/response.py | 81 + urllib3/util/retry.py | 401 + urllib3/util/selectors.py | 581 ++ urllib3/util/ssl_.py | 341 + urllib3/util/timeout.py | 242 + urllib3/util/url.py | 230 + urllib3/util/wait.py | 40 + 91 files changed, 36853 insertions(+) create mode 100644 certifi/__init__.py create mode 100644 certifi/__main__.py create mode 100644 certifi/cacert.pem create mode 100644 certifi/core.py create mode 100644 certifi/old_root.pem create mode 100644 certifi/weak.pem create mode 100644 chardet/__init__.py create mode 100644 chardet/big5freq.py create mode 100644 chardet/big5prober.py create mode 100644 chardet/chardistribution.py create mode 100644 chardet/charsetgroupprober.py create mode 100644 chardet/charsetprober.py create mode 100644 chardet/cli/__init__.py create mode 100644 chardet/cli/chardetect.py create mode 100644 chardet/codingstatemachine.py create mode 100644 chardet/compat.py create mode 100644 chardet/cp949prober.py create mode 100644 chardet/enums.py create mode 100644 chardet/escprober.py create mode 100644 chardet/escsm.py create mode 100644 chardet/eucjpprober.py create mode 100644 chardet/euckrfreq.py create mode 100644 chardet/euckrprober.py create mode 100644 chardet/euctwfreq.py create mode 100644 chardet/euctwprober.py create mode 100644 chardet/gb2312freq.py create mode 100644 chardet/gb2312prober.py create mode 100644 chardet/hebrewprober.py create mode 100644 chardet/jisfreq.py create mode 100644 chardet/jpcntx.py create mode 100644 chardet/langbulgarianmodel.py create mode 100644 chardet/langcyrillicmodel.py create mode 100644 chardet/langgreekmodel.py create mode 100644 chardet/langhebrewmodel.py create mode 100644 chardet/langhungarianmodel.py create mode 100644 chardet/langthaimodel.py create mode 100644 chardet/langturkishmodel.py create mode 100644 chardet/latin1prober.py create mode 100644 chardet/mbcharsetprober.py create mode 100644 chardet/mbcsgroupprober.py create mode 100644 chardet/mbcssm.py create mode 100644 chardet/sbcharsetprober.py create mode 100644 chardet/sbcsgroupprober.py create mode 100644 chardet/sjisprober.py create mode 100644 chardet/universaldetector.py create mode 100644 chardet/utf8prober.py create mode 100644 chardet/version.py create mode 100644 idna/__init__.py create mode 100644 idna/codec.py create mode 100644 idna/compat.py create mode 100644 idna/core.py create mode 100644 idna/idnadata.py create mode 100644 idna/intranges.py create mode 100644 idna/package_data.py create mode 100644 idna/uts46data.py create mode 100644 urllib3/__init__.py create mode 100644 urllib3/_collections.py create mode 100644 urllib3/connection.py create mode 100644 urllib3/connectionpool.py create mode 100644 urllib3/contrib/__init__.py create mode 100644 urllib3/contrib/_securetransport/__init__.py create mode 100644 urllib3/contrib/_securetransport/bindings.py create mode 100644 urllib3/contrib/_securetransport/low_level.py create mode 100644 urllib3/contrib/appengine.py create mode 100644 urllib3/contrib/ntlmpool.py create mode 100644 urllib3/contrib/pyopenssl.py create mode 100644 urllib3/contrib/securetransport.py create mode 100644 urllib3/contrib/socks.py create mode 100644 urllib3/exceptions.py create mode 100644 urllib3/fields.py create mode 100644 urllib3/filepost.py create mode 100644 urllib3/packages/__init__.py create mode 100644 urllib3/packages/backports/__init__.py create mode 100644 urllib3/packages/backports/makefile.py create mode 100644 urllib3/packages/ordered_dict.py create mode 100644 urllib3/packages/six.py create mode 100644 urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 urllib3/poolmanager.py create mode 100644 urllib3/request.py create mode 100644 urllib3/response.py create mode 100644 urllib3/util/__init__.py create mode 100644 urllib3/util/connection.py create mode 100644 urllib3/util/request.py create mode 100644 urllib3/util/response.py create mode 100644 urllib3/util/retry.py create mode 100644 urllib3/util/selectors.py create mode 100644 urllib3/util/ssl_.py create mode 100644 urllib3/util/timeout.py create mode 100644 urllib3/util/url.py create mode 100644 urllib3/util/wait.py diff --git a/certifi/__init__.py b/certifi/__init__.py new file mode 100644 index 00000000..a76cd477 --- /dev/null +++ b/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where, old_where + +__version__ = "2017.07.27.1" diff --git a/certifi/__main__.py b/certifi/__main__.py new file mode 100644 index 00000000..5f1da0dd --- /dev/null +++ b/certifi/__main__.py @@ -0,0 +1,2 @@ +from certifi import where +print(where()) diff --git a/certifi/cacert.pem b/certifi/cacert.pem new file mode 100644 index 00000000..44313cb0 --- /dev/null +++ b/certifi/cacert.pem @@ -0,0 +1,4834 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Label: "Visa eCommerce Root" +# Serial: 25952180776285836048024890241505565794 +# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 +# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 +# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum CA O=Unizeto Sp. z o.o. +# Subject: CN=Certum CA O=Unizeto Sp. z o.o. +# Label: "Certum Root CA" +# Serial: 65568 +# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9 +# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18 +# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24 +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Label: "Camerfirma Chambers of Commerce Root" +# Serial: 0 +# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84 +# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1 +# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3 +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Label: "Camerfirma Global Chambersign Root" +# Serial: 0 +# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19 +# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9 +# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 1 +# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 +# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f +# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=Class 2 Primary CA O=Certplus +# Subject: CN=Class 2 Primary CA O=Certplus +# Label: "Certplus Class 2 Primary CA" +# Serial: 177770208045934040241468760488327595043 +# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b +# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb +# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES +# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES +# Label: "DST ACES CA X6" +# Serial: 17771143917277623872238992636097467865 +# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8 +# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d +# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40 +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 +# Label: "Security Communication EV RootCA1" +# Serial: 0 +# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3 +# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d +# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37 +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz +MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N +IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 +bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE +RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO +zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 +bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF +MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 +VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC +OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW +tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ +q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb +EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ +Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O +VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Label: "Deutsche Telekom Root CA 2" +# Serial: 38 +# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 +# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf +# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: CN=T\xdcB\u0130TAK UEKAE K\xf6k Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 - S\xfcr\xfcm 3 O=T\xfcrkiye Bilimsel ve Teknolojik Ara\u015ft\u0131rma Kurumu - T\xdcB\u0130TAK OU=Ulusal Elektronik ve Kriptoloji Ara\u015ft\u0131rma Enstit\xfcs\xfc - UEKAE/Kamu Sertifikasyon Merkezi +# Subject: CN=T\xdcB\u0130TAK UEKAE K\xf6k Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 - S\xfcr\xfcm 3 O=T\xfcrkiye Bilimsel ve Teknolojik Ara\u015ft\u0131rma Kurumu - T\xdcB\u0130TAK OU=Ulusal Elektronik ve Kriptoloji Ara\u015ft\u0131rma Enstit\xfcs\xfc - UEKAE/Kamu Sertifikasyon Merkezi +# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3" +# Serial: 17 +# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26 +# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96 +# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS +MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp +bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw +VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy +YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy +dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe +Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx +GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls +aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU +QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh +xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 +aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr +IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h +gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK +O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO +fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw +lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID +AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP +NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t +wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM +7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh +gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n +oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs +yZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=ACEDICOM Root O=EDICOM OU=PKI +# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI +# Label: "ACEDICOM Root" +# Serial: 7029493972724711941 +# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6 +# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84 +# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE +AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x +CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW +MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF +RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC +AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 +09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 +XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P +Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK +t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb +X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 +MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU +fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI +2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH +K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae +ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP +BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ +MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw +RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm +fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 +gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe +I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i +5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi +ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn +MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ +o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 +zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN +GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt +r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK +Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Autorit\xe9 Racine O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Autorit\xe9 Racine O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Autorit\xe9 Racine" +# Serial: 1 +# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a +# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3 +# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17 +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk +BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 +Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl +cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 +aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY +F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N +8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe +rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K +/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu +7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC +28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 +lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E +nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB +0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 +5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj +WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN +jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s +ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM +OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q +619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn +2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj +o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v +nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG +5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq +pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb +dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 +BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 45 +# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 +# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 +# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul +F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC +ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w +ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk +aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 +YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg +c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 +d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG +CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF +wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS +Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst +0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc +pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl +CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF +P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK +1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm +KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ +8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm +fyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Label: "StartCom Certification Authority G2" +# Serial: 59 +# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 +# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 +# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 +OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG +A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ +JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD +vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo +D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ +Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW +RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK +HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN +nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM +0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i +UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 +Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg +TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL +BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX +UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl +6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK +9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ +HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI +wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY +XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l +IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo +hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr +so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. (c) Aral\u0131k 2007 +# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. (c) Aral\u0131k 2007 +# Label: "TURKTRUST Certificate Services Provider Root 2007" +# Serial: 1 +# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72 +# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33 +# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50 +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx +OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry +b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC +VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE +sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F +ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY +KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG ++7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG +HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P +IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M +733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk +Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW +AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 +mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa +XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ +qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica +# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT +# Label: "PSCProcert" +# Serial: 11 +# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec +# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74 +# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0 +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s +YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz +dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 +aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh +IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ +KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw +MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy +b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx +KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG +A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u +aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 +7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 +BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G +ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 +JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 +PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 +0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ +6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m +v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 +K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev +bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw +MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w +MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD +gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 +b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh +bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 +cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp +ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg +ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq +hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD +AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w +MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag +RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t +UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl +cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG +AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN +AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS +1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB +3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv +Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh +HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm +pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz +sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE +qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb +mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 +opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H +YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R1 O=Disig a.s. +# Subject: CN=CA Disig Root R1 O=Disig a.s. +# Label: "CA Disig Root R1" +# Serial: 14052245610670616104 +# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a +# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6 +# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy +MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk +D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o +OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A +fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe +IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n +oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK +/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj +rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD +3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE +7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC +yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd +qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI +hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA +SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo +HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB +emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC +AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb +7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x +DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk +F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF +a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT +Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=Certification Authority of WoSign O=WoSign CA Limited +# Subject: CN=Certification Authority of WoSign O=WoSign CA Limited +# Label: "WoSign" +# Serial: 125491772294754854453622855443212256657 +# MD5 Fingerprint: a1:f2:f9:b5:d2:c8:7a:74:b8:f3:05:f1:d7:e1:84:8d +# SHA1 Fingerprint: b9:42:94:bf:91:ea:8f:b6:4b:e6:10:97:c7:fb:00:13:59:b6:76:cb +# SHA256 Fingerprint: 4b:22:d5:a6:ae:c9:9f:3c:db:79:aa:5e:c0:68:38:47:9c:d5:ec:ba:71:64:f7:f2:2d:c1:d6:5f:63:d8:57:08 +-----BEGIN CERTIFICATE----- +MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBV +MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV +BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw +MTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX +b1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvcqN +rLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1U +fcIiePyOCbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcScc +f+Hb0v1naMQFXQoOXXDX2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2 +ZjC1vt7tj/id07sBMOby8w7gLJKA84X5KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4M +x1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR+ScPewavVIMYe+HdVHpR +aG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ezEC8wQjch +zDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDar +uHqklWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221K +mYo0SLwX3OSACCK28jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvA +Sh0JWzko/amrzgD5LkhLJuYwTKVYyrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWv +HYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0CAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R8bNLtwYgFP6H +EtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 +LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJ +MuYhOZO9sxXqT2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2e +JXLOC62qx1ViC777Y7NhRCOjy+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VN +g64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC2nz4SNAzqfkHx5Xh9T71XXG68pWp +dIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes5cVAWubXbHssw1ab +R80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/EaEQ +PkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGce +xGATVdVhmVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+ +J7x6v+Db9NpSvd4MVHAxkUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMl +OtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGikpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWT +ee5Ehr7XHuQe+w== +-----END CERTIFICATE----- + +# Issuer: CN=CA \u6c83\u901a\u6839\u8bc1\u4e66 O=WoSign CA Limited +# Subject: CN=CA \u6c83\u901a\u6839\u8bc1\u4e66 O=WoSign CA Limited +# Label: "WoSign China" +# Serial: 106921963437422998931660691310149453965 +# MD5 Fingerprint: 78:83:5b:52:16:76:c4:24:3b:83:78:e8:ac:da:9a:93 +# SHA1 Fingerprint: 16:32:47:8d:89:f9:21:3a:92:00:85:63:f5:a4:a7:d3:12:40:8a:d6 +# SHA256 Fingerprint: d6:f0:34:bd:94:aa:23:3f:02:97:ec:a4:24:5b:28:39:73:e4:47:aa:59:0f:31:0c:77:f4:8f:df:83:11:22:54 +-----BEGIN CERTIFICATE----- +MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBG +MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNV +BAMMEkNBIOayg+mAmuagueivgeS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgw +MTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRl +ZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k8H/r +D195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld1 +9AXbbQs5uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExf +v5RxadmWPgxDT74wwJ85dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnk +UkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+L +NVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFyb7Ao65vh4YOhn0pdr8yb ++gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc76DbT52V +qyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6K +yX2m+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0G +AbQOXDBGVWCvOGU6yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaK +J/kR8slC/k7e3x9cxKSGhxYzoacXGKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwEC +AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUAA4ICAQBqinA4 +WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 +yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj +/feTZU7n85iYr83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6 +jBAyvd0zaziGfjk9DgNyp115j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2 +ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0AkLppRQjbbpCBhqcqBT/mhDn4t/lX +X0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97qA4bLJyuQHCH2u2n +FoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Yjj4D +u9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10l +O1Hm13ZBONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Le +ie2uPAmvylezkolwQOQvT8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR1 +2KvxAmLBsX5VYc8T1yaw15zLKYs4SgsOkI26oQ== +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" +# Serial: 156233699172481 +# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e +# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb +# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE +BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn +aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg +QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 +MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD +VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom +/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR +Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 +4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z +5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 +hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID +AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX +SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l +VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf +peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF +Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW ++qtB4Uu2NQvAmxU= +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Root CA" +# Serial: 1 +# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f +# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 +# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb +BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz +MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx +FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g +Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 +fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl +LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV +WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF +TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb +5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc +CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri +wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ +wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG +m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 +F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng +WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 +2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ +0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw +F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS +g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj +qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN +h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ +ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V +btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj +Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ +8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW +gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=Certification Authority of WoSign G2 O=WoSign CA Limited +# Subject: CN=Certification Authority of WoSign G2 O=WoSign CA Limited +# Label: "Certification Authority of WoSign G2" +# Serial: 142423943073812161787490648904721057092 +# MD5 Fingerprint: c8:1c:7d:19:aa:cb:71:93:f2:50:f8:52:a8:1e:ba:60 +# SHA1 Fingerprint: fb:ed:dc:90:65:b7:27:20:37:bc:55:0c:9c:56:de:bb:f2:78:94:e1 +# SHA256 Fingerprint: d4:87:a5:6f:83:b0:74:82:e8:5e:96:33:94:c1:ec:c2:c9:e5:1d:09:03:ee:94:6b:02:c3:01:58:1e:d9:9e:16 +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBY +MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNV +BAMTJENlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDEx +MDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgxCzAJBgNVBAYTAkNOMRowGAYDVQQK +ExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPX +JYY1kBaiXW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgO +gHzKtB0TiGsOqCR3A9DuW/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg +5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg95k4ot+vElbGs/V6r+kHLXZ1L3PR8du9n +fwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BKv0mUYQs4kI9dJGwlezt5 +2eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJ +KoZIhvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8 +fHulwqZm46qwtyeYP0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G +3CE4Q3RM+zD4F3LBMvzIkRfEzFg3TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yy +SrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu+sif/a+RZQp4OBXllxcU3fng +LDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+7Q9LGOHSJDy7 +XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= +-----END CERTIFICATE----- + +# Issuer: CN=CA WoSign ECC Root O=WoSign CA Limited +# Subject: CN=CA WoSign ECC Root O=WoSign CA Limited +# Label: "CA WoSign ECC Root" +# Serial: 138625735294506723296996289575837012112 +# MD5 Fingerprint: 80:c6:53:ee:61:82:28:72:f0:ff:21:b9:17:ca:b2:20 +# SHA1 Fingerprint: d2:7a:d2:be:ed:94:c0:a1:3c:c7:25:21:ea:5d:71:be:81:19:f3:2b +# SHA256 Fingerprint: 8b:45:da:1c:06:f7:91:eb:0c:ab:f2:6b:e5:88:f5:fb:23:16:5c:2e:61:4b:f8:85:56:2d:0d:ce:50:b2:9b:02 +-----BEGIN CERTIFICATE----- +MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQsw +CQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMT +EkNBIFdvU2lnbiBFQ0MgUm9vdDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4 +NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEb +MBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZIzj0CAQYFK4EEACID +YgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiUt5v8 +KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES +1ns2o0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUqv3VWqP2h4syhf3RMluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB +1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0Daupn75OcsqF1NnstTJFGG+rrQIwfcf3 +aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYua/GRspBl9JrmkO5K +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=Certplus Root CA G1 O=Certplus +# Subject: CN=Certplus Root CA G1 O=Certplus +# Label: "Certplus Root CA G1" +# Serial: 1491911565779898356709731176965615564637713 +# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 +# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 +# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA +MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa +MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a +iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt +6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP +0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f +6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE +EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN +1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc +h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT +mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV +4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO +WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud +DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd +Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq +hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh +66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 +/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS +S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j +2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R +Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr +RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy +6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV +V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 +g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl +++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= +-----END CERTIFICATE----- + +# Issuer: CN=Certplus Root CA G2 O=Certplus +# Subject: CN=Certplus Root CA G2 O=Certplus +# Label: "Certplus Root CA G2" +# Serial: 1492087096131536844209563509228951875861589 +# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 +# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a +# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 +-----BEGIN CERTIFICATE----- +MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x +CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x +CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat +93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x +Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj +FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG +SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch +p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal +U5ORGpOucGpnutee5WEaXw== +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust +# Subject: CN=OpenTrust Root CA G1 O=OpenTrust +# Label: "OpenTrust Root CA G1" +# Serial: 1492036577811947013770400127034825178844775 +# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da +# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e +# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA +MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw +MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b +wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX +/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 +77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP +uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx +p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx +Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 +TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W +G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw +vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY +EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 +2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw +DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E +PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf +gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS +FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 +V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P +XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I +i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t +TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 +09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky +Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ +AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj +1oxx +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust +# Subject: CN=OpenTrust Root CA G2 O=OpenTrust +# Label: "OpenTrust Root CA G2" +# Serial: 1492012448042702096986875987676935573415441 +# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb +# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b +# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA +MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw +MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh +/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e +CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 +1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE +FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS +gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X +G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy +YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH +vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 +t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ +gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 +5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w +DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz +Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 +nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT +RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT +wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 +t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa +TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 +o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU +3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA +iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f +WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM +S1IK +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust +# Subject: CN=OpenTrust Root CA G3 O=OpenTrust +# Label: "OpenTrust Root CA G3" +# Serial: 1492104908271485653071219941864171170455615 +# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 +# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 +# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 +-----BEGIN CERTIFICATE----- +MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx +CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U +cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow +QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl +blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm +3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d +oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 +DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK +BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q +j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx +4nxp5V2a+EEfOzmTk51V6s2N8fvB +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Label: "LuxTrust Global Root 2" +# Serial: 59914338225734147123941058376788110305822489521 +# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- diff --git a/certifi/core.py b/certifi/core.py new file mode 100644 index 00000000..f41d3fd1 --- /dev/null +++ b/certifi/core.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem. +""" +import os +import warnings + + +class DeprecatedBundleWarning(DeprecationWarning): + """ + The weak security bundle is being deprecated. Please bother your service + provider to get them to stop using cross-signed roots. + """ + + +def where(): + f = os.path.dirname(__file__) + + return os.path.join(f, 'cacert.pem') + + +def old_where(): + warnings.warn( + "The weak security bundle is being deprecated.", + DeprecatedBundleWarning + ) + f = os.path.dirname(__file__) + return os.path.join(f, 'weak.pem') + +if __name__ == '__main__': + print(where()) diff --git a/certifi/old_root.pem b/certifi/old_root.pem new file mode 100644 index 00000000..af30ea71 --- /dev/null +++ b/certifi/old_root.pem @@ -0,0 +1,414 @@ +# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Secure Server CA" +# Serial: 927650371 +# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee +# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 +# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Label: "ValiCert Class 2 VA" +# Serial: 1 +# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 +# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 +# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Express (Class C) Root" +# Serial: 104 +# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 +# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b +# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Business (Class B) Root" +# Serial: 105 +# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 +# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af +# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Label: "RSA Root Certificate 1" +# Serial: 1 +# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 +# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb +# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Label: "ValiCert Class 1 VA" +# Serial: 1 +# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb +# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e +# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure eBusiness CA 1" +# Serial: 4 +# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d +# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 +# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure Global eBusiness CA" +# Serial: 1 +# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc +# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 +# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Premium Server CA" +# Serial: 1 +# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a +# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a +# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Server CA" +# Serial: 1 +# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d +# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c +# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 149843929435818692848040365716851702463 +# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 +# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 +# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 80507572722862485515306429940691309246 +# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 +# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b +# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i +2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ +2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Label: "Verisign Class 3 Public Primary Certification Authority - G2" +# Serial: 167285380242319648451154478808036881606 +# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 +# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f +# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- + +# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Label: "GTE CyberTrust Global Root" +# Serial: 421 +# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db +# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 +# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +# Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority +# Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority +# Label: "Equifax Secure Certificate Authority" +# Serial: 903804111 +# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 +# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a +# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- diff --git a/certifi/weak.pem b/certifi/weak.pem new file mode 100644 index 00000000..380c5233 --- /dev/null +++ b/certifi/weak.pem @@ -0,0 +1,5248 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Label: "Visa eCommerce Root" +# Serial: 25952180776285836048024890241505565794 +# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 +# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 +# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum CA O=Unizeto Sp. z o.o. +# Subject: CN=Certum CA O=Unizeto Sp. z o.o. +# Label: "Certum Root CA" +# Serial: 65568 +# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9 +# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18 +# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24 +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Label: "Camerfirma Chambers of Commerce Root" +# Serial: 0 +# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84 +# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1 +# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3 +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Label: "Camerfirma Global Chambersign Root" +# Serial: 0 +# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19 +# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9 +# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 1 +# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 +# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f +# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=Class 2 Primary CA O=Certplus +# Subject: CN=Class 2 Primary CA O=Certplus +# Label: "Certplus Class 2 Primary CA" +# Serial: 177770208045934040241468760488327595043 +# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b +# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb +# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES +# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES +# Label: "DST ACES CA X6" +# Serial: 17771143917277623872238992636097467865 +# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8 +# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d +# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40 +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 +# Label: "Security Communication EV RootCA1" +# Serial: 0 +# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3 +# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d +# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37 +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz +MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N +IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 +bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE +RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO +zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 +bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF +MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 +VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC +OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW +tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ +q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb +EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ +Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O +VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Label: "Deutsche Telekom Root CA 2" +# Serial: 38 +# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 +# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf +# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: CN=T\xdcB\u0130TAK UEKAE K\xf6k Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 - S\xfcr\xfcm 3 O=T\xfcrkiye Bilimsel ve Teknolojik Ara\u015ft\u0131rma Kurumu - T\xdcB\u0130TAK OU=Ulusal Elektronik ve Kriptoloji Ara\u015ft\u0131rma Enstit\xfcs\xfc - UEKAE/Kamu Sertifikasyon Merkezi +# Subject: CN=T\xdcB\u0130TAK UEKAE K\xf6k Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 - S\xfcr\xfcm 3 O=T\xfcrkiye Bilimsel ve Teknolojik Ara\u015ft\u0131rma Kurumu - T\xdcB\u0130TAK OU=Ulusal Elektronik ve Kriptoloji Ara\u015ft\u0131rma Enstit\xfcs\xfc - UEKAE/Kamu Sertifikasyon Merkezi +# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3" +# Serial: 17 +# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26 +# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96 +# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS +MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp +bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw +VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy +YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy +dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe +Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx +GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls +aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU +QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh +xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 +aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr +IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h +gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK +O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO +fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw +lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID +AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP +NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t +wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM +7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh +gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n +oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs +yZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=ACEDICOM Root O=EDICOM OU=PKI +# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI +# Label: "ACEDICOM Root" +# Serial: 7029493972724711941 +# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6 +# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84 +# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE +AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x +CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW +MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF +RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC +AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 +09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 +XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P +Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK +t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb +X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 +MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU +fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI +2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH +K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae +ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP +BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ +MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw +RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm +fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 +gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe +I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i +5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi +ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn +MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ +o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 +zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN +GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt +r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK +Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Autorit\xe9 Racine O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Autorit\xe9 Racine O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Autorit\xe9 Racine" +# Serial: 1 +# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a +# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3 +# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17 +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk +BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 +Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl +cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 +aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY +F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N +8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe +rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K +/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu +7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC +28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 +lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E +nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB +0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 +5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj +WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN +jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s +ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM +OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q +619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn +2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj +o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v +nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG +5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq +pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb +dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 +BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 45 +# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 +# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 +# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul +F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC +ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w +ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk +aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 +YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg +c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 +d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG +CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF +wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS +Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst +0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc +pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl +CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF +P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK +1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm +KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ +8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm +fyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Label: "StartCom Certification Authority G2" +# Serial: 59 +# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 +# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 +# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 +OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG +A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ +JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD +vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo +D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ +Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW +RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK +HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN +nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM +0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i +UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 +Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg +TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL +BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX +UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl +6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK +9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ +HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI +wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY +XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l +IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo +hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr +so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. (c) Aral\u0131k 2007 +# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. (c) Aral\u0131k 2007 +# Label: "TURKTRUST Certificate Services Provider Root 2007" +# Serial: 1 +# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72 +# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33 +# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50 +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx +OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry +b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC +VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE +sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F +ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY +KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG ++7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG +HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P +IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M +733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk +Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW +AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 +mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa +XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ +qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica +# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT +# Label: "PSCProcert" +# Serial: 11 +# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec +# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74 +# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0 +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s +YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz +dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 +aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh +IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ +KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw +MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy +b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx +KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG +A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u +aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 +7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 +BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G +ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 +JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 +PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 +0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ +6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m +v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 +K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev +bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw +MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w +MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD +gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 +b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh +bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 +cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp +ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg +ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq +hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD +AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w +MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag +RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t +UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl +cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG +AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN +AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS +1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB +3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv +Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh +HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm +pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz +sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE +qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb +mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 +opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H +YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R1 O=Disig a.s. +# Subject: CN=CA Disig Root R1 O=Disig a.s. +# Label: "CA Disig Root R1" +# Serial: 14052245610670616104 +# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a +# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6 +# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy +MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk +D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o +OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A +fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe +IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n +oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK +/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj +rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD +3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE +7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC +yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd +qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI +hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA +SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo +HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB +emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC +AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb +7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x +DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk +F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF +a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT +Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=Certification Authority of WoSign O=WoSign CA Limited +# Subject: CN=Certification Authority of WoSign O=WoSign CA Limited +# Label: "WoSign" +# Serial: 125491772294754854453622855443212256657 +# MD5 Fingerprint: a1:f2:f9:b5:d2:c8:7a:74:b8:f3:05:f1:d7:e1:84:8d +# SHA1 Fingerprint: b9:42:94:bf:91:ea:8f:b6:4b:e6:10:97:c7:fb:00:13:59:b6:76:cb +# SHA256 Fingerprint: 4b:22:d5:a6:ae:c9:9f:3c:db:79:aa:5e:c0:68:38:47:9c:d5:ec:ba:71:64:f7:f2:2d:c1:d6:5f:63:d8:57:08 +-----BEGIN CERTIFICATE----- +MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBV +MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV +BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw +MTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX +b1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvcqN +rLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1U +fcIiePyOCbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcScc +f+Hb0v1naMQFXQoOXXDX2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2 +ZjC1vt7tj/id07sBMOby8w7gLJKA84X5KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4M +x1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR+ScPewavVIMYe+HdVHpR +aG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ezEC8wQjch +zDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDar +uHqklWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221K +mYo0SLwX3OSACCK28jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvA +Sh0JWzko/amrzgD5LkhLJuYwTKVYyrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWv +HYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0CAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R8bNLtwYgFP6H +EtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 +LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJ +MuYhOZO9sxXqT2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2e +JXLOC62qx1ViC777Y7NhRCOjy+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VN +g64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC2nz4SNAzqfkHx5Xh9T71XXG68pWp +dIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes5cVAWubXbHssw1ab +R80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/EaEQ +PkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGce +xGATVdVhmVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+ +J7x6v+Db9NpSvd4MVHAxkUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMl +OtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGikpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWT +ee5Ehr7XHuQe+w== +-----END CERTIFICATE----- + +# Issuer: CN=CA \u6c83\u901a\u6839\u8bc1\u4e66 O=WoSign CA Limited +# Subject: CN=CA \u6c83\u901a\u6839\u8bc1\u4e66 O=WoSign CA Limited +# Label: "WoSign China" +# Serial: 106921963437422998931660691310149453965 +# MD5 Fingerprint: 78:83:5b:52:16:76:c4:24:3b:83:78:e8:ac:da:9a:93 +# SHA1 Fingerprint: 16:32:47:8d:89:f9:21:3a:92:00:85:63:f5:a4:a7:d3:12:40:8a:d6 +# SHA256 Fingerprint: d6:f0:34:bd:94:aa:23:3f:02:97:ec:a4:24:5b:28:39:73:e4:47:aa:59:0f:31:0c:77:f4:8f:df:83:11:22:54 +-----BEGIN CERTIFICATE----- +MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBG +MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNV +BAMMEkNBIOayg+mAmuagueivgeS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgw +MTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRl +ZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k8H/r +D195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld1 +9AXbbQs5uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExf +v5RxadmWPgxDT74wwJ85dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnk +UkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+L +NVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFyb7Ao65vh4YOhn0pdr8yb ++gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc76DbT52V +qyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6K +yX2m+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0G +AbQOXDBGVWCvOGU6yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaK +J/kR8slC/k7e3x9cxKSGhxYzoacXGKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwEC +AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUAA4ICAQBqinA4 +WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 +yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj +/feTZU7n85iYr83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6 +jBAyvd0zaziGfjk9DgNyp115j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2 +ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0AkLppRQjbbpCBhqcqBT/mhDn4t/lX +X0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97qA4bLJyuQHCH2u2n +FoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Yjj4D +u9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10l +O1Hm13ZBONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Le +ie2uPAmvylezkolwQOQvT8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR1 +2KvxAmLBsX5VYc8T1yaw15zLKYs4SgsOkI26oQ== +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" +# Serial: 156233699172481 +# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e +# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb +# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE +BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn +aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg +QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 +MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD +VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom +/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR +Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 +4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z +5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 +hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID +AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX +SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l +VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf +peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF +Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW ++qtB4Uu2NQvAmxU= +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Root CA" +# Serial: 1 +# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f +# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 +# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb +BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz +MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx +FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g +Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 +fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl +LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV +WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF +TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb +5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc +CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri +wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ +wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG +m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 +F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng +WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 +2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ +0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw +F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS +g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj +qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN +h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ +ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V +btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj +Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ +8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW +gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=Certification Authority of WoSign G2 O=WoSign CA Limited +# Subject: CN=Certification Authority of WoSign G2 O=WoSign CA Limited +# Label: "Certification Authority of WoSign G2" +# Serial: 142423943073812161787490648904721057092 +# MD5 Fingerprint: c8:1c:7d:19:aa:cb:71:93:f2:50:f8:52:a8:1e:ba:60 +# SHA1 Fingerprint: fb:ed:dc:90:65:b7:27:20:37:bc:55:0c:9c:56:de:bb:f2:78:94:e1 +# SHA256 Fingerprint: d4:87:a5:6f:83:b0:74:82:e8:5e:96:33:94:c1:ec:c2:c9:e5:1d:09:03:ee:94:6b:02:c3:01:58:1e:d9:9e:16 +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBY +MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNV +BAMTJENlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDEx +MDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgxCzAJBgNVBAYTAkNOMRowGAYDVQQK +ExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPX +JYY1kBaiXW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgO +gHzKtB0TiGsOqCR3A9DuW/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg +5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg95k4ot+vElbGs/V6r+kHLXZ1L3PR8du9n +fwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BKv0mUYQs4kI9dJGwlezt5 +2eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJ +KoZIhvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8 +fHulwqZm46qwtyeYP0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G +3CE4Q3RM+zD4F3LBMvzIkRfEzFg3TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yy +SrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu+sif/a+RZQp4OBXllxcU3fng +LDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+7Q9LGOHSJDy7 +XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= +-----END CERTIFICATE----- + +# Issuer: CN=CA WoSign ECC Root O=WoSign CA Limited +# Subject: CN=CA WoSign ECC Root O=WoSign CA Limited +# Label: "CA WoSign ECC Root" +# Serial: 138625735294506723296996289575837012112 +# MD5 Fingerprint: 80:c6:53:ee:61:82:28:72:f0:ff:21:b9:17:ca:b2:20 +# SHA1 Fingerprint: d2:7a:d2:be:ed:94:c0:a1:3c:c7:25:21:ea:5d:71:be:81:19:f3:2b +# SHA256 Fingerprint: 8b:45:da:1c:06:f7:91:eb:0c:ab:f2:6b:e5:88:f5:fb:23:16:5c:2e:61:4b:f8:85:56:2d:0d:ce:50:b2:9b:02 +-----BEGIN CERTIFICATE----- +MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQsw +CQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMT +EkNBIFdvU2lnbiBFQ0MgUm9vdDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4 +NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEb +MBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZIzj0CAQYFK4EEACID +YgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiUt5v8 +KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES +1ns2o0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUqv3VWqP2h4syhf3RMluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB +1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0Daupn75OcsqF1NnstTJFGG+rrQIwfcf3 +aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYua/GRspBl9JrmkO5K +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=Certplus Root CA G1 O=Certplus +# Subject: CN=Certplus Root CA G1 O=Certplus +# Label: "Certplus Root CA G1" +# Serial: 1491911565779898356709731176965615564637713 +# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 +# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 +# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA +MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa +MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a +iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt +6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP +0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f +6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE +EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN +1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc +h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT +mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV +4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO +WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud +DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd +Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq +hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh +66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 +/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS +S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j +2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R +Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr +RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy +6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV +V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 +g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl +++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= +-----END CERTIFICATE----- + +# Issuer: CN=Certplus Root CA G2 O=Certplus +# Subject: CN=Certplus Root CA G2 O=Certplus +# Label: "Certplus Root CA G2" +# Serial: 1492087096131536844209563509228951875861589 +# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 +# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a +# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 +-----BEGIN CERTIFICATE----- +MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x +CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x +CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat +93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x +Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj +FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG +SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch +p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal +U5ORGpOucGpnutee5WEaXw== +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust +# Subject: CN=OpenTrust Root CA G1 O=OpenTrust +# Label: "OpenTrust Root CA G1" +# Serial: 1492036577811947013770400127034825178844775 +# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da +# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e +# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA +MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw +MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b +wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX +/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 +77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP +uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx +p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx +Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 +TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W +G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw +vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY +EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 +2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw +DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E +PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf +gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS +FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 +V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P +XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I +i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t +TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 +09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky +Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ +AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj +1oxx +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust +# Subject: CN=OpenTrust Root CA G2 O=OpenTrust +# Label: "OpenTrust Root CA G2" +# Serial: 1492012448042702096986875987676935573415441 +# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb +# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b +# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA +MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw +MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh +/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e +CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 +1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE +FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS +gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X +G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy +YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH +vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 +t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ +gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 +5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w +DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz +Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 +nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT +RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT +wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 +t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa +TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 +o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU +3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA +iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f +WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM +S1IK +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust +# Subject: CN=OpenTrust Root CA G3 O=OpenTrust +# Label: "OpenTrust Root CA G3" +# Serial: 1492104908271485653071219941864171170455615 +# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 +# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 +# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 +-----BEGIN CERTIFICATE----- +MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx +CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U +cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow +QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl +blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm +3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d +oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 +DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK +BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q +j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx +4nxp5V2a+EEfOzmTk51V6s2N8fvB +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Label: "LuxTrust Global Root 2" +# Serial: 59914338225734147123941058376788110305822489521 +# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- +# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Secure Server CA" +# Serial: 927650371 +# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee +# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 +# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Label: "ValiCert Class 2 VA" +# Serial: 1 +# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 +# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 +# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Express (Class C) Root" +# Serial: 104 +# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 +# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b +# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Business (Class B) Root" +# Serial: 105 +# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 +# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af +# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Label: "RSA Root Certificate 1" +# Serial: 1 +# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 +# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb +# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Label: "ValiCert Class 1 VA" +# Serial: 1 +# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb +# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e +# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure eBusiness CA 1" +# Serial: 4 +# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d +# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 +# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure Global eBusiness CA" +# Serial: 1 +# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc +# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 +# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Premium Server CA" +# Serial: 1 +# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a +# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a +# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Server CA" +# Serial: 1 +# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d +# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c +# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 149843929435818692848040365716851702463 +# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 +# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 +# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 80507572722862485515306429940691309246 +# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 +# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b +# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i +2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ +2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Label: "Verisign Class 3 Public Primary Certification Authority - G2" +# Serial: 167285380242319648451154478808036881606 +# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 +# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f +# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- + +# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Label: "GTE CyberTrust Global Root" +# Serial: 421 +# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db +# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 +# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +# Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority +# Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority +# Label: "Equifax Secure Certificate Authority" +# Serial: 903804111 +# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 +# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a +# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- diff --git a/chardet/__init__.py b/chardet/__init__.py new file mode 100644 index 00000000..0f9f820e --- /dev/null +++ b/chardet/__init__.py @@ -0,0 +1,39 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +from .compat import PY2, PY3 +from .universaldetector import UniversalDetector +from .version import __version__, VERSION + + +def detect(byte_str): + """ + Detect the encoding of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError('Expected object of type bytes or bytearray, got: ' + '{0}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() diff --git a/chardet/big5freq.py b/chardet/big5freq.py new file mode 100644 index 00000000..38f32517 --- /dev/null +++ b/chardet/big5freq.py @@ -0,0 +1,386 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/chardet/big5prober.py b/chardet/big5prober.py new file mode 100644 index 00000000..98f99701 --- /dev/null +++ b/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import BIG5_SM_MODEL + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + super(Big5Prober, self).__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "Big5" + + @property + def language(self): + return "Chinese" diff --git a/chardet/chardistribution.py b/chardet/chardistribution.py new file mode 100644 index 00000000..c0395f4a --- /dev/null +++ b/chardet/chardistribution.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO) +from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO) +from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO) +from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO) +from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO) + + +class CharDistributionAnalysis(object): + ENOUGH_DATA_THRESHOLD = 1024 + SURE_YES = 0.99 + SURE_NO = 0.01 + MINIMUM_DATA_THRESHOLD = 3 + + def __init__(self): + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._char_to_freq_order = None + self._table_size = None # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self.typical_distribution_ratio = None + self._done = None + self._total_chars = None + self._freq_chars = None + self.reset() + + def reset(self): + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + self._total_chars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._freq_chars = 0 + + def feed(self, char, char_len): + """feed a character with known length""" + if char_len == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(char) + else: + order = -1 + if order >= 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, byte_str): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 + else: + return -1 diff --git a/chardet/charsetgroupprober.py b/chardet/charsetgroupprober.py new file mode 100644 index 00000000..8b3738ef --- /dev/null +++ b/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self, lang_filter=None): + super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) + self._active_num = 0 + self.probers = [] + self._best_guess_prober = None + + def reset(self): + super(CharSetGroupProber, self).reset() + self._active_num = 0 + for prober in self.probers: + if prober: + prober.reset() + prober.active = True + self._active_num += 1 + self._best_guess_prober = None + + @property + def charset_name(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.charset_name + + @property + def language(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.language + + def feed(self, byte_str): + for prober in self.probers: + if not prober: + continue + if not prober.active: + continue + state = prober.feed(byte_str) + if not state: + continue + if state == ProbingState.FOUND_IT: + self._best_guess_prober = prober + return self.state + elif state == ProbingState.NOT_ME: + prober.active = False + self._active_num -= 1 + if self._active_num <= 0: + self._state = ProbingState.NOT_ME + return self.state + return self.state + + def get_confidence(self): + state = self.state + if state == ProbingState.FOUND_IT: + return 0.99 + elif state == ProbingState.NOT_ME: + return 0.01 + best_conf = 0.0 + self._best_guess_prober = None + for prober in self.probers: + if not prober: + continue + if not prober.active: + self.logger.debug('%s not active', prober.charset_name) + continue + conf = prober.get_confidence() + self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) + if best_conf < conf: + best_conf = conf + self._best_guess_prober = prober + if not self._best_guess_prober: + return 0.0 + return best_conf diff --git a/chardet/charsetprober.py b/chardet/charsetprober.py new file mode 100644 index 00000000..eac4e598 --- /dev/null +++ b/chardet/charsetprober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging +import re + +from .enums import ProbingState + + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + + def reset(self): + self._state = ProbingState.DETECTING + + @property + def charset_name(self): + return None + + def feed(self, buf): + pass + + @property + def state(self): + return self._state + + def get_confidence(self): + return 0.0 + + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/chardet/cli/__init__.py b/chardet/cli/__init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/chardet/cli/chardetect.py b/chardet/cli/chardetect.py new file mode 100644 index 00000000..f0a4cc5d --- /dev/null +++ b/chardet/cli/chardetect.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +""" +Script which takes one or more file paths and reports on their detected +encodings + +Example:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +If no paths are provided, it takes its input from stdin. + +""" + +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys + +from chardet import __version__ +from chardet.compat import PY2 +from chardet.universaldetector import UniversalDetector + + +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ + u = UniversalDetector() + for line in lines: + line = bytearray(line) + u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break + u.close() + result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') + if result['encoding']: + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) + else: + return '{0}: no result'.format(name) + + +def main(argv=None): + """ + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + """ + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings") + parser.add_argument('input', + help='File whose encoding we would like to determine. \ + (default: stdin)', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin if PY2 else sys.stdin.buffer]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) + + +if __name__ == '__main__': + main() diff --git a/chardet/codingstatemachine.py b/chardet/codingstatemachine.py new file mode 100644 index 00000000..68fba44f --- /dev/null +++ b/chardet/codingstatemachine.py @@ -0,0 +1,88 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging + +from .enums import MachineState + + +class CodingStateMachine(object): + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ + def __init__(self, sm): + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = None + self.logger = logging.getLogger(__name__) + self.reset() + + def reset(self): + self._curr_state = MachineState.START + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + byte_class = self._model['class_table'][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model['char_len_table'][byte_class] + # from byte's class and state_table, we get its next state + curr_state = (self._curr_state * self._model['class_factor'] + + byte_class) + self._curr_state = self._model['state_table'][curr_state] + self._curr_byte_pos += 1 + return self._curr_state + + def get_current_charlen(self): + return self._curr_char_len + + def get_coding_state_machine(self): + return self._model['name'] + + @property + def language(self): + return self._model['language'] diff --git a/chardet/compat.py b/chardet/compat.py new file mode 100644 index 00000000..ddd74687 --- /dev/null +++ b/chardet/compat.py @@ -0,0 +1,34 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Dan Blanchard +# Ian Cordasco +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + PY2 = True + PY3 = False + base_str = (str, unicode) + text_type = unicode +else: + PY2 = False + PY3 = True + base_str = (bytes, str) + text_type = str diff --git a/chardet/cp949prober.py b/chardet/cp949prober.py new file mode 100644 index 00000000..efd793ab --- /dev/null +++ b/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "CP949" + + @property + def language(self): + return "Korean" diff --git a/chardet/enums.py b/chardet/enums.py new file mode 100644 index 00000000..04512072 --- /dev/null +++ b/chardet/enums.py @@ -0,0 +1,76 @@ +""" +All of the Enums that are used throughout the chardet package. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + + +class InputState(object): + """ + This enum represents the different states a universal detector can be in. + """ + PURE_ASCII = 0 + ESC_ASCII = 1 + HIGH_BYTE = 2 + + +class LanguageFilter(object): + """ + This enum represents the different language filters we can apply to a + ``UniversalDetector``. + """ + CHINESE_SIMPLIFIED = 0x01 + CHINESE_TRADITIONAL = 0x02 + JAPANESE = 0x04 + KOREAN = 0x08 + NON_CJK = 0x10 + ALL = 0x1F + CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL + CJK = CHINESE | JAPANESE | KOREAN + + +class ProbingState(object): + """ + This enum represents the different states a prober can be in. + """ + DETECTING = 0 + FOUND_IT = 1 + NOT_ME = 2 + + +class MachineState(object): + """ + This enum represents the different states a state machine can be in. + """ + START = 0 + ERROR = 1 + ITS_ME = 2 + + +class SequenceLikelihood(object): + """ + This enum represents the likelihood of a character following the previous one. + """ + NEGATIVE = 0 + UNLIKELY = 1 + LIKELY = 2 + POSITIVE = 3 + + @classmethod + def get_num_categories(cls): + """:returns: The number of likelihood categories in the enum.""" + return 4 + + +class CharacterCategory(object): + """ + This enum represents the different categories language models for + ``SingleByteCharsetProber`` put characters into. + + Anything less than CONTROL is considered a letter. + """ + UNDEFINED = 255 + LINE_BREAK = 254 + SYMBOL = 253 + DIGIT = 252 + CONTROL = 251 diff --git a/chardet/escprober.py b/chardet/escprober.py new file mode 100644 index 00000000..c70493f2 --- /dev/null +++ b/chardet/escprober.py @@ -0,0 +1,101 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, ProbingState, MachineState +from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL) + + +class EscCharSetProber(CharSetProber): + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter=None): + super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = None + self._detected_charset = None + self._detected_language = None + self._state = None + self.reset() + + def reset(self): + super(EscCharSetProber, self).reset() + for coding_sm in self.coding_sm: + if not coding_sm: + continue + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self): + return self._detected_charset + + @property + def language(self): + return self._detected_language + + def get_confidence(self): + if self._detected_charset: + return 0.99 + else: + return 0.00 + + def feed(self, byte_str): + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm or not coding_sm.active: + continue + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state + + return self.state diff --git a/chardet/escsm.py b/chardet/escsm.py new file mode 100644 index 00000000..0069523a --- /dev/null +++ b/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +HZ_CLS = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +) + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} + +ISO2022CN_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +) + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} + +ISO2022JP_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +) + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} + +ISO2022KR_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +) + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} + + diff --git a/chardet/eucjpprober.py b/chardet/eucjpprober.py new file mode 100644 index 00000000..20ce8f7d --- /dev/null +++ b/chardet/eucjpprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState, MachineState +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJP_SM_MODEL + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + super(EUCJPProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return "EUC-JP" + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/chardet/euckrfreq.py b/chardet/euckrfreq.py new file mode 100644 index 00000000..b68078cb --- /dev/null +++ b/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/chardet/euckrprober.py b/chardet/euckrprober.py new file mode 100644 index 00000000..345a060d --- /dev/null +++ b/chardet/euckrprober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import EUCKR_SM_MODEL + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + super(EUCKRProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-KR" + + @property + def language(self): + return "Korean" diff --git a/chardet/euctwfreq.py b/chardet/euctwfreq.py new file mode 100644 index 00000000..ed7a995a --- /dev/null +++ b/chardet/euctwfreq.py @@ -0,0 +1,387 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 5376 + +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) + diff --git a/chardet/euctwprober.py b/chardet/euctwprober.py new file mode 100644 index 00000000..35669cc4 --- /dev/null +++ b/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTW_SM_MODEL + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/chardet/gb2312freq.py b/chardet/gb2312freq.py new file mode 100644 index 00000000..697837bd --- /dev/null +++ b/chardet/gb2312freq.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) + diff --git a/chardet/gb2312prober.py b/chardet/gb2312prober.py new file mode 100644 index 00000000..8446d2dd --- /dev/null +++ b/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312_SM_MODEL + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/chardet/hebrewprober.py b/chardet/hebrewprober.py new file mode 100644 index 00000000..b0e1bf49 --- /dev/null +++ b/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self): + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None + self.reset() + + def reset(self): + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = ' ' + self._before_prev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._logical_prober = logicalProber + self._visual_prober = visualProber + + def is_final(self, c): + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == ' ': + # We stand on a space - a word just ended + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' + + @property + def state(self): + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/chardet/jisfreq.py b/chardet/jisfreq.py new file mode 100644 index 00000000..83fc082b --- /dev/null +++ b/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/chardet/jpcntx.py b/chardet/jpcntx.py new file mode 100644 index 00000000..20044e4b --- /dev/null +++ b/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None + self.reset() + + def reset(self): + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str, num_bytes): + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/chardet/langbulgarianmodel.py b/chardet/langbulgarianmodel.py new file mode 100644 index 00000000..2aa4fb2e --- /dev/null +++ b/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { + 'char_to_order_map': Latin5_BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Bulgairan', +} + +Win1251BulgarianModel = { + 'char_to_order_map': win1251BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Bulgarian', +} diff --git a/chardet/langcyrillicmodel.py b/chardet/langcyrillicmodel.py new file mode 100644 index 00000000..e5f9a1fd --- /dev/null +++ b/chardet/langcyrillicmodel.py @@ -0,0 +1,333 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', +} + +Win1251CyrillicModel = { + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', +} + +Latin5CyrillicModel = { + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', +} + +MacCyrillicModel = { + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} + +Ibm866Model = { + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', +} + +Ibm855Model = { + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', +} diff --git a/chardet/langgreekmodel.py b/chardet/langgreekmodel.py new file mode 100644 index 00000000..53322216 --- /dev/null +++ b/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', +} + +Win1253GreekModel = { + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', +} diff --git a/chardet/langhebrewmodel.py b/chardet/langhebrewmodel.py new file mode 100644 index 00000000..58f4c875 --- /dev/null +++ b/chardet/langhebrewmodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +WIN1255_CHAR_TO_ORDER_MAP = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HEBREW_LANG_MODEL = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', +} diff --git a/chardet/langhungarianmodel.py b/chardet/langhungarianmodel.py new file mode 100644 index 00000000..bb7c095e --- /dev/null +++ b/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', +} + +Win1250HungarianModel = { + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', +} diff --git a/chardet/langthaimodel.py b/chardet/langthaimodel.py new file mode 100644 index 00000000..15f94c2d --- /dev/null +++ b/chardet/langthaimodel.py @@ -0,0 +1,199 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', +} diff --git a/chardet/langturkishmodel.py b/chardet/langturkishmodel.py new file mode 100644 index 00000000..a427a457 --- /dev/null +++ b/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Özgür Baskın - Turkish Language Model +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/chardet/latin1prober.py b/chardet/latin1prober.py new file mode 100644 index 00000000..7d1e8c20 --- /dev/null +++ b/chardet/latin1prober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None + self.reset() + + def reset(self): + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + @property + def charset_name(self): + return "ISO-8859-1" + + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self): + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) + / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.73 + return confidence diff --git a/chardet/mbcharsetprober.py b/chardet/mbcharsetprober.py new file mode 100644 index 00000000..6256ecfd --- /dev/null +++ b/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] + + def reset(self): + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError + + @property + def language(self): + raise NotImplementedError + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + return self.distribution_analyzer.get_confidence() diff --git a/chardet/mbcsgroupprober.py b/chardet/mbcsgroupprober.py new file mode 100644 index 00000000..530abe75 --- /dev/null +++ b/chardet/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self, lang_filter=None): + super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + self.probers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/chardet/mbcssm.py b/chardet/mbcssm.py new file mode 100644 index 00000000..8360d0f2 --- /dev/null +++ b/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +# BIG5 + +BIG5_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +) + +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) + +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} + +# CP949 + +CP949_CLS = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_ST = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +) + +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +) + +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) + +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +) + +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) + +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_CLS = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) + +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validating +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) + +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,2,2,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff + + +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +) + +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) + +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) + +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) + +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +) + +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/chardet/sbcharsetprober.py b/chardet/sbcharsetprober.py new file mode 100644 index 00000000..0adb51de --- /dev/null +++ b/chardet/sbcharsetprober.py @@ -0,0 +1,132 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +class SingleByteCharSetProber(CharSetProber): + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model + # TRUE if we need to reverse every pair in the model lookup + self._reversed = reversed + # Optional auxiliary prober for name decision + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None + self.reset() + + def reset(self): + super(SingleByteCharSetProber, self).reset() + # char order of last character + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 + # characters that fall in our sampling range + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] + + @property + def language(self): + if self._name_prober: + return self._name_prober.language + else: + return self._model.get('language') + + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = order + + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME + + return self.state + + def get_confidence(self): + r = 0.01 + if self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char + if r >= 1.0: + r = 0.99 + return r diff --git a/chardet/sbcsgroupprober.py b/chardet/sbcsgroupprober.py new file mode 100644 index 00000000..98e95dc1 --- /dev/null +++ b/chardet/sbcsgroupprober.py @@ -0,0 +1,73 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + super(SBCSGroupProber, self).__init__() + self.probers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), + ] + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) + + self.reset() diff --git a/chardet/sjisprober.py b/chardet/sjisprober.py new file mode 100644 index 00000000..9e29623b --- /dev/null +++ b/chardet/sjisprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + super(SJISProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return self.context_analyzer.charset_name + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/chardet/universaldetector.py b/chardet/universaldetector.py new file mode 100644 index 00000000..7b4e92d6 --- /dev/null +++ b/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + + +import codecs +import logging +import re + +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result + + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None + self.reset() + + def reset(self): + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} + self.done = False + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: + prober.reset() + + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ + if self.done: + return + + if not len(byte_str): + return + + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: + # If the data starts with BOM, we know it is UTF + if byte_str.startswith(codecs.BOM_UTF8): + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): + # FF FE 00 00 UTF-32, little-endian BOM + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\xFE\xFF\x00\x00'): + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\x00\x00\xFF\xFE'): + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): + # FF FE UTF-16, little endian BOM + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} + + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] + + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} + self.done = True + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} + self.done = True + break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True + + def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done + if self.done: + return self.result + self.done = True + + if not self._got_data: + self.logger.debug('no data received!') + + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: + if not prober: + continue + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/chardet/utf8prober.py b/chardet/utf8prober.py new file mode 100644 index 00000000..6c3196cc --- /dev/null +++ b/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8_SM_MODEL + + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self): + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None + self.reset() + + def reset(self): + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self): + return "utf-8" + + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + return 1.0 - unlike + else: + return unlike diff --git a/chardet/version.py b/chardet/version.py new file mode 100644 index 00000000..bb2a34a7 --- /dev/null +++ b/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "3.0.4" +VERSION = __version__.split('.') diff --git a/idna/__init__.py b/idna/__init__.py new file mode 100644 index 00000000..847bf935 --- /dev/null +++ b/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/idna/codec.py b/idna/codec.py new file mode 100644 index 00000000..98c65ead --- /dev/null +++ b/idna/codec.py @@ -0,0 +1,118 @@ +from .core import encode, decode, alabel, ulabel, IDNAError +import codecs +import re + +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +class Codec(codecs.Codec): + + def encode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return "", 0 + + return encode(data), len(data) + + def decode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return u"", 0 + + return decode(data), len(data) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return ("", 0) + + labels = _unicode_dots_re.split(data) + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return (u"", 0) + + # IDNA allows decoding to operate on Unicode strings, too. + if isinstance(data, unicode): + labels = _unicode_dots_re.split(data) + else: + # Must be ASCII string + data = str(data) + unicode(data, "ascii") + labels = data.split(".") + + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = u'.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = u'.' + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result = u".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + +class StreamReader(Codec, codecs.StreamReader): + pass + +def getregentry(): + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/idna/compat.py b/idna/compat.py new file mode 100644 index 00000000..4d47f336 --- /dev/null +++ b/idna/compat.py @@ -0,0 +1,12 @@ +from .core import * +from .codec import * + +def ToASCII(label): + return encode(label) + +def ToUnicode(label): + return decode(label) + +def nameprep(s): + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") + diff --git a/idna/core.py b/idna/core.py new file mode 100644 index 00000000..b55b6645 --- /dev/null +++ b/idna/core.py @@ -0,0 +1,387 @@ +from . import idnadata +import bisect +import unicodedata +import re +import sys +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b'xn--' +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +if sys.version_info[0] == 3: + unicode = str + unichr = chr + +class IDNAError(UnicodeError): + """ Base exception for all IDNA-encoding related problems """ + pass + + +class IDNABidiError(IDNAError): + """ Exception when bidirectional requirements are not satisfied """ + pass + + +class InvalidCodepoint(IDNAError): + """ Exception when a disallowed or unallocated codepoint is used """ + pass + + +class InvalidCodepointContext(IDNAError): + """ Exception when the codepoint is not valid in the context it is used """ + pass + + +def _combining_class(cp): + return unicodedata.combining(unichr(cp)) + +def _is_script(cp, script): + return intranges_contain(ord(cp), idnadata.scripts[script]) + +def _punycode(s): + return s.encode('punycode') + +def _unot(s): + return 'U+{0:04X}'.format(s) + + +def valid_label_length(label): + + if len(label) > 63: + return False + return True + + +def valid_string_length(label, trailing_dot): + + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label, check_ltr=False): + + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == '': + # String likely comes from a newer version of Unicode + raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) + if direction in ['R', 'AL', 'AN']: + bidi_label = True + break + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ['R', 'AL']: + rtl = True + elif direction == 'L': + rtl = False + else: + raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) + + valid_ending = False + number_type = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) + # Bidi rule 3 + if direction in ['R', 'AL', 'EN', 'AN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + # Bidi rule 4 + if direction in ['AN', 'EN']: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError('Can not mix numeral types in a right-to-left label') + else: + # Bidi rule 5 + if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) + # Bidi rule 6 + if direction in ['L', 'EN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + + if not valid_ending: + raise IDNABidiError('Label ends with illegal codepoint directionality') + + return True + + +def check_initial_combiner(label): + + if unicodedata.category(label[0])[0] == 'M': + raise IDNAError('Label begins with an illegal combining character') + return True + + +def check_hyphen_ok(label): + + if label[2:4] == '--': + raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') + if label[0] == '-' or label[-1] == '-': + raise IDNAError('Label must not start or end with a hyphen') + return True + + +def check_nfc(label): + + if unicodedata.normalize('NFC', label) != label: + raise IDNAError('Label must be in Normalization Form C') + + +def valid_contextj(label, pos): + + cp_value = ord(label[pos]) + + if cp_value == 0x200c: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos-1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('L'), ord('D')]: + ok = True + break + + if not ok: + return False + + ok = False + for i in range(pos+1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('R'), ord('D')]: + ok = True + break + return ok + + if cp_value == 0x200d: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + + return False + + +def valid_contexto(label, pos, exception=False): + + cp_value = ord(label[pos]) + + if cp_value == 0x00b7: + if 0 < pos < len(label)-1: + if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label)-1 and len(label) > 1: + return _is_script(label[pos + 1], 'Greek') + return False + + elif cp_value == 0x05f3 or cp_value == 0x05f4: + if pos > 0: + return _is_script(label[pos - 1], 'Hebrew') + return False + + elif cp_value == 0x30fb: + for cp in label: + if cp == u'\u30fb': + continue + if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6f0 <= ord(cp) <= 0x06f9: + return False + return True + + elif 0x6f0 <= cp_value <= 0x6f9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + +def check_label(label): + + if isinstance(label, (bytes, bytearray)): + label = label.decode('utf-8') + if len(label) == 0: + raise IDNAError('Empty Label') + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for (pos, cp) in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + if not valid_contexto(label, pos): + raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) + else: + raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) + + check_bidi(label) + + +def alabel(label): + + try: + label = label.encode('ascii') + try: + ulabel(label) + except IDNAError: + raise IDNAError('The label {0} is not a valid A-label'.format(label)) + if not valid_label_length(label): + raise IDNAError('Label too long') + return label + except UnicodeEncodeError: + pass + + if not label: + raise IDNAError('No Input') + + label = unicode(label) + check_label(label) + label = _punycode(label) + label = _alabel_prefix + label + + if not valid_label_length(label): + raise IDNAError('Label too long') + + return label + + +def ulabel(label): + + if not isinstance(label, (bytes, bytearray)): + try: + label = label.encode('ascii') + except UnicodeEncodeError: + check_label(label) + return label + + label = label.lower() + if label.startswith(_alabel_prefix): + label = label[len(_alabel_prefix):] + else: + check_label(label) + return label.decode('ascii') + + label = label.decode('punycode') + check_label(label) + return label + + +def uts46_remap(domain, std3_rules=True, transitional=False): + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + output = u"" + try: + for pos, char in enumerate(domain): + code_point = ord(char) + uts46row = uts46data[code_point if code_point < 256 else + bisect.bisect_left(uts46data, (code_point, "Z")) - 1] + status = uts46row[1] + replacement = uts46row[2] if len(uts46row) == 3 else None + if (status == "V" or + (status == "D" and not transitional) or + (status == "3" and std3_rules and replacement is None)): + output += char + elif replacement is not None and (status == "M" or + (status == "3" and std3_rules) or + (status == "D" and transitional)): + output += replacement + elif status != "I": + raise IndexError() + return unicodedata.normalize("NFC", output) + except IndexError: + raise InvalidCodepoint( + "Codepoint {0} not allowed at position {1} in {2}".format( + _unot(code_point), pos + 1, repr(domain))) + + +def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split('.') + else: + labels = _unicode_dots_re.split(s) + while labels and not labels[0]: + del labels[0] + if not labels: + raise IDNAError('Empty domain') + if labels[-1] == '': + del labels[-1] + trailing_dot = True + for label in labels: + result.append(alabel(label)) + if trailing_dot: + result.append(b'') + s = b'.'.join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError('Domain too long') + return s + + +def decode(s, strict=False, uts46=False, std3_rules=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split(u'.') + while labels and not labels[0]: + del labels[0] + if not labels: + raise IDNAError('Empty domain') + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + result.append(ulabel(label)) + if trailing_dot: + result.append(u'') + return u'.'.join(result) diff --git a/idna/idnadata.py b/idna/idnadata.py new file mode 100644 index 00000000..c48f1b50 --- /dev/null +++ b/idna/idnadata.py @@ -0,0 +1,1585 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "6.3.0" +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 0x38400000385, + 0x38600000387, + 0x3880000038b, + 0x38c0000038d, + 0x38e000003a2, + 0x3a3000003e2, + 0x3f000000400, + 0x1d2600001d2b, + 0x1d5d00001d62, + 0x1d6600001d6b, + 0x1dbf00001dc0, + 0x1f0000001f16, + 0x1f1800001f1e, + 0x1f2000001f46, + 0x1f4800001f4e, + 0x1f5000001f58, + 0x1f5900001f5a, + 0x1f5b00001f5c, + 0x1f5d00001f5e, + 0x1f5f00001f7e, + 0x1f8000001fb5, + 0x1fb600001fc5, + 0x1fc600001fd4, + 0x1fd600001fdc, + 0x1fdd00001ff0, + 0x1ff200001ff5, + 0x1ff600001fff, + 0x212600002127, + 0x101400001018b, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004db6, + 0x4e0000009fcd, + 0xf9000000fa6e, + 0xfa700000fada, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2f8000002fa1e, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5f0000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b002, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1b0000001b001, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 85, + 0x608: 85, + 0x60b: 85, + 0x620: 68, + 0x621: 85, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62a: 68, + 0x62b: 68, + 0x62c: 68, + 0x62d: 68, + 0x62e: 68, + 0x62f: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63a: 68, + 0x63b: 68, + 0x63c: 68, + 0x63d: 68, + 0x63e: 68, + 0x63f: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64a: 68, + 0x66e: 68, + 0x66f: 68, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x674: 85, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67a: 68, + 0x67b: 68, + 0x67c: 68, + 0x67d: 68, + 0x67e: 68, + 0x67f: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68a: 82, + 0x68b: 82, + 0x68c: 82, + 0x68d: 82, + 0x68e: 82, + 0x68f: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69a: 68, + 0x69b: 68, + 0x69c: 68, + 0x69d: 68, + 0x69e: 68, + 0x69f: 68, + 0x6a0: 68, + 0x6a1: 68, + 0x6a2: 68, + 0x6a3: 68, + 0x6a4: 68, + 0x6a5: 68, + 0x6a6: 68, + 0x6a7: 68, + 0x6a8: 68, + 0x6a9: 68, + 0x6aa: 68, + 0x6ab: 68, + 0x6ac: 68, + 0x6ad: 68, + 0x6ae: 68, + 0x6af: 68, + 0x6b0: 68, + 0x6b1: 68, + 0x6b2: 68, + 0x6b3: 68, + 0x6b4: 68, + 0x6b5: 68, + 0x6b6: 68, + 0x6b7: 68, + 0x6b8: 68, + 0x6b9: 68, + 0x6ba: 68, + 0x6bb: 68, + 0x6bc: 68, + 0x6bd: 68, + 0x6be: 68, + 0x6bf: 68, + 0x6c0: 82, + 0x6c1: 68, + 0x6c2: 68, + 0x6c3: 82, + 0x6c4: 82, + 0x6c5: 82, + 0x6c6: 82, + 0x6c7: 82, + 0x6c8: 82, + 0x6c9: 82, + 0x6ca: 82, + 0x6cb: 82, + 0x6cc: 68, + 0x6cd: 82, + 0x6ce: 68, + 0x6cf: 82, + 0x6d0: 68, + 0x6d1: 68, + 0x6d2: 82, + 0x6d3: 82, + 0x6d5: 82, + 0x6dd: 85, + 0x6ee: 82, + 0x6ef: 82, + 0x6fa: 68, + 0x6fb: 68, + 0x6fc: 68, + 0x6ff: 68, + 0x710: 82, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71a: 68, + 0x71b: 68, + 0x71c: 68, + 0x71d: 68, + 0x71e: 82, + 0x71f: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72a: 82, + 0x72b: 68, + 0x72c: 82, + 0x72d: 68, + 0x72e: 68, + 0x72f: 82, + 0x74d: 82, + 0x74e: 68, + 0x74f: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75a: 82, + 0x75b: 82, + 0x75c: 68, + 0x75d: 68, + 0x75e: 68, + 0x75f: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76a: 68, + 0x76b: 82, + 0x76c: 82, + 0x76d: 68, + 0x76e: 68, + 0x76f: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77a: 68, + 0x77b: 68, + 0x77c: 68, + 0x77d: 68, + 0x77e: 68, + 0x77f: 68, + 0x7ca: 68, + 0x7cb: 68, + 0x7cc: 68, + 0x7cd: 68, + 0x7ce: 68, + 0x7cf: 68, + 0x7d0: 68, + 0x7d1: 68, + 0x7d2: 68, + 0x7d3: 68, + 0x7d4: 68, + 0x7d5: 68, + 0x7d6: 68, + 0x7d7: 68, + 0x7d8: 68, + 0x7d9: 68, + 0x7da: 68, + 0x7db: 68, + 0x7dc: 68, + 0x7dd: 68, + 0x7de: 68, + 0x7df: 68, + 0x7e0: 68, + 0x7e1: 68, + 0x7e2: 68, + 0x7e3: 68, + 0x7e4: 68, + 0x7e5: 68, + 0x7e6: 68, + 0x7e7: 68, + 0x7e8: 68, + 0x7e9: 68, + 0x7ea: 68, + 0x7fa: 67, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 68, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 82, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 85, + 0x857: 85, + 0x858: 85, + 0x8a0: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 0x1806: 85, + 0x1807: 68, + 0x180a: 67, + 0x180e: 85, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182a: 68, + 0x182b: 68, + 0x182c: 68, + 0x182d: 68, + 0x182e: 68, + 0x182f: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183a: 68, + 0x183b: 68, + 0x183c: 68, + 0x183d: 68, + 0x183e: 68, + 0x183f: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184a: 68, + 0x184b: 68, + 0x184c: 68, + 0x184d: 68, + 0x184e: 68, + 0x184f: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185a: 68, + 0x185b: 68, + 0x185c: 68, + 0x185d: 68, + 0x185e: 68, + 0x185f: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186a: 68, + 0x186b: 68, + 0x186c: 68, + 0x186d: 68, + 0x186e: 68, + 0x186f: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 85, + 0x1886: 85, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188a: 68, + 0x188b: 68, + 0x188c: 68, + 0x188d: 68, + 0x188e: 68, + 0x188f: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189a: 68, + 0x189b: 68, + 0x189c: 68, + 0x189d: 68, + 0x189e: 68, + 0x189f: 68, + 0x18a0: 68, + 0x18a1: 68, + 0x18a2: 68, + 0x18a3: 68, + 0x18a4: 68, + 0x18a5: 68, + 0x18a6: 68, + 0x18a7: 68, + 0x18a8: 68, + 0x18aa: 68, + 0x200c: 85, + 0x200d: 67, + 0x2066: 85, + 0x2067: 85, + 0x2068: 85, + 0x2069: 85, + 0xa840: 68, + 0xa841: 68, + 0xa842: 68, + 0xa843: 68, + 0xa844: 68, + 0xa845: 68, + 0xa846: 68, + 0xa847: 68, + 0xa848: 68, + 0xa849: 68, + 0xa84a: 68, + 0xa84b: 68, + 0xa84c: 68, + 0xa84d: 68, + 0xa84e: 68, + 0xa84f: 68, + 0xa850: 68, + 0xa851: 68, + 0xa852: 68, + 0xa853: 68, + 0xa854: 68, + 0xa855: 68, + 0xa856: 68, + 0xa857: 68, + 0xa858: 68, + 0xa859: 68, + 0xa85a: 68, + 0xa85b: 68, + 0xa85c: 68, + 0xa85d: 68, + 0xa85e: 68, + 0xa85f: 68, + 0xa860: 68, + 0xa861: 68, + 0xa862: 68, + 0xa863: 68, + 0xa864: 68, + 0xa865: 68, + 0xa866: 68, + 0xa867: 68, + 0xa868: 68, + 0xa869: 68, + 0xa86a: 68, + 0xa86b: 68, + 0xa86c: 68, + 0xa86d: 68, + 0xa86e: 68, + 0xa86f: 68, + 0xa870: 68, + 0xa871: 68, + 0xa872: 76, + 0xa873: 85, +} +codepoint_classes = { + 'PVALID': ( + 0x2d0000002e, + 0x300000003a, + 0x610000007b, + 0xdf000000f7, + 0xf800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010a, + 0x10b0000010c, + 0x10d0000010e, + 0x10f00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011a, + 0x11b0000011c, + 0x11d0000011e, + 0x11f00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012a, + 0x12b0000012c, + 0x12d0000012e, + 0x12f00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13a0000013b, + 0x13c0000013d, + 0x13e0000013f, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14b0000014c, + 0x14d0000014e, + 0x14f00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015a, + 0x15b0000015c, + 0x15d0000015e, + 0x15f00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016a, + 0x16b0000016c, + 0x16d0000016e, + 0x16f00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17a0000017b, + 0x17c0000017d, + 0x17e0000017f, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18c0000018e, + 0x19200000193, + 0x19500000196, + 0x1990000019c, + 0x19e0000019f, + 0x1a1000001a2, + 0x1a3000001a4, + 0x1a5000001a6, + 0x1a8000001a9, + 0x1aa000001ac, + 0x1ad000001ae, + 0x1b0000001b1, + 0x1b4000001b5, + 0x1b6000001b7, + 0x1b9000001bc, + 0x1bd000001c4, + 0x1ce000001cf, + 0x1d0000001d1, + 0x1d2000001d3, + 0x1d4000001d5, + 0x1d6000001d7, + 0x1d8000001d9, + 0x1da000001db, + 0x1dc000001de, + 0x1df000001e0, + 0x1e1000001e2, + 0x1e3000001e4, + 0x1e5000001e6, + 0x1e7000001e8, + 0x1e9000001ea, + 0x1eb000001ec, + 0x1ed000001ee, + 0x1ef000001f1, + 0x1f5000001f6, + 0x1f9000001fa, + 0x1fb000001fc, + 0x1fd000001fe, + 0x1ff00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020a, + 0x20b0000020c, + 0x20d0000020e, + 0x20f00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021a, + 0x21b0000021c, + 0x21d0000021e, + 0x21f00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022a, + 0x22b0000022c, + 0x22d0000022e, + 0x22f00000230, + 0x23100000232, + 0x2330000023a, + 0x23c0000023d, + 0x23f00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024a, + 0x24b0000024c, + 0x24d0000024e, + 0x24f000002b0, + 0x2b9000002c2, + 0x2c6000002d2, + 0x2ec000002ed, + 0x2ee000002ef, + 0x30000000340, + 0x34200000343, + 0x3460000034f, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37b0000037e, + 0x39000000391, + 0x3ac000003cf, + 0x3d7000003d8, + 0x3d9000003da, + 0x3db000003dc, + 0x3dd000003de, + 0x3df000003e0, + 0x3e1000003e2, + 0x3e3000003e4, + 0x3e5000003e6, + 0x3e7000003e8, + 0x3e9000003ea, + 0x3eb000003ec, + 0x3ed000003ee, + 0x3ef000003f0, + 0x3f3000003f4, + 0x3f8000003f9, + 0x3fb000003fd, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046a, + 0x46b0000046c, + 0x46d0000046e, + 0x46f00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047a, + 0x47b0000047c, + 0x47d0000047e, + 0x47f00000480, + 0x48100000482, + 0x48300000488, + 0x48b0000048c, + 0x48d0000048e, + 0x48f00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049a, + 0x49b0000049c, + 0x49d0000049e, + 0x49f000004a0, + 0x4a1000004a2, + 0x4a3000004a4, + 0x4a5000004a6, + 0x4a7000004a8, + 0x4a9000004aa, + 0x4ab000004ac, + 0x4ad000004ae, + 0x4af000004b0, + 0x4b1000004b2, + 0x4b3000004b4, + 0x4b5000004b6, + 0x4b7000004b8, + 0x4b9000004ba, + 0x4bb000004bc, + 0x4bd000004be, + 0x4bf000004c0, + 0x4c2000004c3, + 0x4c4000004c5, + 0x4c6000004c7, + 0x4c8000004c9, + 0x4ca000004cb, + 0x4cc000004cd, + 0x4ce000004d0, + 0x4d1000004d2, + 0x4d3000004d4, + 0x4d5000004d6, + 0x4d7000004d8, + 0x4d9000004da, + 0x4db000004dc, + 0x4dd000004de, + 0x4df000004e0, + 0x4e1000004e2, + 0x4e3000004e4, + 0x4e5000004e6, + 0x4e7000004e8, + 0x4e9000004ea, + 0x4eb000004ec, + 0x4ed000004ee, + 0x4ef000004f0, + 0x4f1000004f2, + 0x4f3000004f4, + 0x4f5000004f6, + 0x4f7000004f8, + 0x4f9000004fa, + 0x4fb000004fc, + 0x4fd000004fe, + 0x4ff00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050a, + 0x50b0000050c, + 0x50d0000050e, + 0x50f00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051a, + 0x51b0000051c, + 0x51d0000051e, + 0x51f00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5590000055a, + 0x56100000587, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5f0000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x8000000082e, + 0x8400000085c, + 0x8a0000008a1, + 0x8a2000008ad, + 0x8e4000008ff, + 0x90000000958, + 0x96000000964, + 0x96600000970, + 0x97100000978, + 0x97900000980, + 0x98100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0xa0100000a04, + 0xa0500000a0b, + 0xa0f00000a11, + 0xa1300000a29, + 0xa2a00000a31, + 0xa3200000a33, + 0xa3500000a36, + 0xa3800000a3a, + 0xa3c00000a3d, + 0xa3e00000a43, + 0xa4700000a49, + 0xa4b00000a4e, + 0xa5100000a52, + 0xa5c00000a5d, + 0xa6600000a76, + 0xa8100000a84, + 0xa8500000a8e, + 0xa8f00000a92, + 0xa9300000aa9, + 0xaaa00000ab1, + 0xab200000ab4, + 0xab500000aba, + 0xabc00000ac6, + 0xac700000aca, + 0xacb00000ace, + 0xad000000ad1, + 0xae000000ae4, + 0xae600000af0, + 0xb0100000b04, + 0xb0500000b0d, + 0xb0f00000b11, + 0xb1300000b29, + 0xb2a00000b31, + 0xb3200000b34, + 0xb3500000b3a, + 0xb3c00000b45, + 0xb4700000b49, + 0xb4b00000b4e, + 0xb5600000b58, + 0xb5f00000b64, + 0xb6600000b70, + 0xb7100000b72, + 0xb8200000b84, + 0xb8500000b8b, + 0xb8e00000b91, + 0xb9200000b96, + 0xb9900000b9b, + 0xb9c00000b9d, + 0xb9e00000ba0, + 0xba300000ba5, + 0xba800000bab, + 0xbae00000bba, + 0xbbe00000bc3, + 0xbc600000bc9, + 0xbca00000bce, + 0xbd000000bd1, + 0xbd700000bd8, + 0xbe600000bf0, + 0xc0100000c04, + 0xc0500000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c34, + 0xc3500000c3a, + 0xc3d00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5a, + 0xc6000000c64, + 0xc6600000c70, + 0xc8200000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcde00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, + 0xd0200000d04, + 0xd0500000d0d, + 0xd0e00000d11, + 0xd1200000d3b, + 0xd3d00000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5700000d58, + 0xd6000000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8200000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 0xdf200000df4, + 0xe0100000e33, + 0xe3400000e3b, + 0xe4000000e4f, + 0xe5000000e5a, + 0xe8100000e83, + 0xe8400000e85, + 0xe8700000e89, + 0xe8a00000e8b, + 0xe8d00000e8e, + 0xe9400000e98, + 0xe9900000ea0, + 0xea100000ea4, + 0xea500000ea6, + 0xea700000ea8, + 0xeaa00000eac, + 0xead00000eb3, + 0xeb400000eba, + 0xebb00000ebe, + 0xec000000ec5, + 0xec600000ec7, + 0xec800000ece, + 0xed000000eda, + 0xede00000ee0, + 0xf0000000f01, + 0xf0b00000f0c, + 0xf1800000f1a, + 0xf2000000f2a, + 0xf3500000f36, + 0xf3700000f38, + 0xf3900000f3a, + 0xf3e00000f43, + 0xf4400000f48, + 0xf4900000f4d, + 0xf4e00000f52, + 0xf5300000f57, + 0xf5800000f5c, + 0xf5d00000f69, + 0xf6a00000f6d, + 0xf7100000f73, + 0xf7400000f75, + 0xf7a00000f81, + 0xf8200000f85, + 0xf8600000f93, + 0xf9400000f98, + 0xf9900000f9d, + 0xf9e00000fa2, + 0xfa300000fa7, + 0xfa800000fac, + 0xfad00000fb9, + 0xfba00000fbd, + 0xfc600000fc7, + 0x10000000104a, + 0x10500000109e, + 0x10d0000010fb, + 0x10fd00001100, + 0x120000001249, + 0x124a0000124e, + 0x125000001257, + 0x125800001259, + 0x125a0000125e, + 0x126000001289, + 0x128a0000128e, + 0x1290000012b1, + 0x12b2000012b6, + 0x12b8000012bf, + 0x12c0000012c1, + 0x12c2000012c6, + 0x12c8000012d7, + 0x12d800001311, + 0x131200001316, + 0x13180000135b, + 0x135d00001360, + 0x138000001390, + 0x13a0000013f5, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x17000000170d, + 0x170e00001715, + 0x172000001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001878, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191d, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1b0000001b4c, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cf7, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001de7, + 0x1dfc00001e00, + 0x1e0100001e02, + 0x1e0300001e04, + 0x1e0500001e06, + 0x1e0700001e08, + 0x1e0900001e0a, + 0x1e0b00001e0c, + 0x1e0d00001e0e, + 0x1e0f00001e10, + 0x1e1100001e12, + 0x1e1300001e14, + 0x1e1500001e16, + 0x1e1700001e18, + 0x1e1900001e1a, + 0x1e1b00001e1c, + 0x1e1d00001e1e, + 0x1e1f00001e20, + 0x1e2100001e22, + 0x1e2300001e24, + 0x1e2500001e26, + 0x1e2700001e28, + 0x1e2900001e2a, + 0x1e2b00001e2c, + 0x1e2d00001e2e, + 0x1e2f00001e30, + 0x1e3100001e32, + 0x1e3300001e34, + 0x1e3500001e36, + 0x1e3700001e38, + 0x1e3900001e3a, + 0x1e3b00001e3c, + 0x1e3d00001e3e, + 0x1e3f00001e40, + 0x1e4100001e42, + 0x1e4300001e44, + 0x1e4500001e46, + 0x1e4700001e48, + 0x1e4900001e4a, + 0x1e4b00001e4c, + 0x1e4d00001e4e, + 0x1e4f00001e50, + 0x1e5100001e52, + 0x1e5300001e54, + 0x1e5500001e56, + 0x1e5700001e58, + 0x1e5900001e5a, + 0x1e5b00001e5c, + 0x1e5d00001e5e, + 0x1e5f00001e60, + 0x1e6100001e62, + 0x1e6300001e64, + 0x1e6500001e66, + 0x1e6700001e68, + 0x1e6900001e6a, + 0x1e6b00001e6c, + 0x1e6d00001e6e, + 0x1e6f00001e70, + 0x1e7100001e72, + 0x1e7300001e74, + 0x1e7500001e76, + 0x1e7700001e78, + 0x1e7900001e7a, + 0x1e7b00001e7c, + 0x1e7d00001e7e, + 0x1e7f00001e80, + 0x1e8100001e82, + 0x1e8300001e84, + 0x1e8500001e86, + 0x1e8700001e88, + 0x1e8900001e8a, + 0x1e8b00001e8c, + 0x1e8d00001e8e, + 0x1e8f00001e90, + 0x1e9100001e92, + 0x1e9300001e94, + 0x1e9500001e9a, + 0x1e9c00001e9e, + 0x1e9f00001ea0, + 0x1ea100001ea2, + 0x1ea300001ea4, + 0x1ea500001ea6, + 0x1ea700001ea8, + 0x1ea900001eaa, + 0x1eab00001eac, + 0x1ead00001eae, + 0x1eaf00001eb0, + 0x1eb100001eb2, + 0x1eb300001eb4, + 0x1eb500001eb6, + 0x1eb700001eb8, + 0x1eb900001eba, + 0x1ebb00001ebc, + 0x1ebd00001ebe, + 0x1ebf00001ec0, + 0x1ec100001ec2, + 0x1ec300001ec4, + 0x1ec500001ec6, + 0x1ec700001ec8, + 0x1ec900001eca, + 0x1ecb00001ecc, + 0x1ecd00001ece, + 0x1ecf00001ed0, + 0x1ed100001ed2, + 0x1ed300001ed4, + 0x1ed500001ed6, + 0x1ed700001ed8, + 0x1ed900001eda, + 0x1edb00001edc, + 0x1edd00001ede, + 0x1edf00001ee0, + 0x1ee100001ee2, + 0x1ee300001ee4, + 0x1ee500001ee6, + 0x1ee700001ee8, + 0x1ee900001eea, + 0x1eeb00001eec, + 0x1eed00001eee, + 0x1eef00001ef0, + 0x1ef100001ef2, + 0x1ef300001ef4, + 0x1ef500001ef6, + 0x1ef700001ef8, + 0x1ef900001efa, + 0x1efb00001efc, + 0x1efd00001efe, + 0x1eff00001f08, + 0x1f1000001f16, + 0x1f2000001f28, + 0x1f3000001f38, + 0x1f4000001f46, + 0x1f5000001f58, + 0x1f6000001f68, + 0x1f7000001f71, + 0x1f7200001f73, + 0x1f7400001f75, + 0x1f7600001f77, + 0x1f7800001f79, + 0x1f7a00001f7b, + 0x1f7c00001f7d, + 0x1fb000001fb2, + 0x1fb600001fb7, + 0x1fc600001fc7, + 0x1fd000001fd3, + 0x1fd600001fd8, + 0x1fe000001fe3, + 0x1fe400001fe8, + 0x1ff600001ff7, + 0x214e0000214f, + 0x218400002185, + 0x2c3000002c5f, + 0x2c6100002c62, + 0x2c6500002c67, + 0x2c6800002c69, + 0x2c6a00002c6b, + 0x2c6c00002c6d, + 0x2c7100002c72, + 0x2c7300002c75, + 0x2c7600002c7c, + 0x2c8100002c82, + 0x2c8300002c84, + 0x2c8500002c86, + 0x2c8700002c88, + 0x2c8900002c8a, + 0x2c8b00002c8c, + 0x2c8d00002c8e, + 0x2c8f00002c90, + 0x2c9100002c92, + 0x2c9300002c94, + 0x2c9500002c96, + 0x2c9700002c98, + 0x2c9900002c9a, + 0x2c9b00002c9c, + 0x2c9d00002c9e, + 0x2c9f00002ca0, + 0x2ca100002ca2, + 0x2ca300002ca4, + 0x2ca500002ca6, + 0x2ca700002ca8, + 0x2ca900002caa, + 0x2cab00002cac, + 0x2cad00002cae, + 0x2caf00002cb0, + 0x2cb100002cb2, + 0x2cb300002cb4, + 0x2cb500002cb6, + 0x2cb700002cb8, + 0x2cb900002cba, + 0x2cbb00002cbc, + 0x2cbd00002cbe, + 0x2cbf00002cc0, + 0x2cc100002cc2, + 0x2cc300002cc4, + 0x2cc500002cc6, + 0x2cc700002cc8, + 0x2cc900002cca, + 0x2ccb00002ccc, + 0x2ccd00002cce, + 0x2ccf00002cd0, + 0x2cd100002cd2, + 0x2cd300002cd4, + 0x2cd500002cd6, + 0x2cd700002cd8, + 0x2cd900002cda, + 0x2cdb00002cdc, + 0x2cdd00002cde, + 0x2cdf00002ce0, + 0x2ce100002ce2, + 0x2ce300002ce5, + 0x2cec00002ced, + 0x2cee00002cf2, + 0x2cf300002cf4, + 0x2d0000002d26, + 0x2d2700002d28, + 0x2d2d00002d2e, + 0x2d3000002d68, + 0x2d7f00002d97, + 0x2da000002da7, + 0x2da800002daf, + 0x2db000002db7, + 0x2db800002dbf, + 0x2dc000002dc7, + 0x2dc800002dcf, + 0x2dd000002dd7, + 0x2dd800002ddf, + 0x2de000002e00, + 0x2e2f00002e30, + 0x300500003008, + 0x302a0000302e, + 0x303c0000303d, + 0x304100003097, + 0x30990000309b, + 0x309d0000309f, + 0x30a1000030fb, + 0x30fc000030ff, + 0x31050000312e, + 0x31a0000031bb, + 0x31f000003200, + 0x340000004db6, + 0x4e0000009fcd, + 0xa0000000a48d, + 0xa4d00000a4fe, + 0xa5000000a60d, + 0xa6100000a62c, + 0xa6410000a642, + 0xa6430000a644, + 0xa6450000a646, + 0xa6470000a648, + 0xa6490000a64a, + 0xa64b0000a64c, + 0xa64d0000a64e, + 0xa64f0000a650, + 0xa6510000a652, + 0xa6530000a654, + 0xa6550000a656, + 0xa6570000a658, + 0xa6590000a65a, + 0xa65b0000a65c, + 0xa65d0000a65e, + 0xa65f0000a660, + 0xa6610000a662, + 0xa6630000a664, + 0xa6650000a666, + 0xa6670000a668, + 0xa6690000a66a, + 0xa66b0000a66c, + 0xa66d0000a670, + 0xa6740000a67e, + 0xa67f0000a680, + 0xa6810000a682, + 0xa6830000a684, + 0xa6850000a686, + 0xa6870000a688, + 0xa6890000a68a, + 0xa68b0000a68c, + 0xa68d0000a68e, + 0xa68f0000a690, + 0xa6910000a692, + 0xa6930000a694, + 0xa6950000a696, + 0xa6970000a698, + 0xa69f0000a6e6, + 0xa6f00000a6f2, + 0xa7170000a720, + 0xa7230000a724, + 0xa7250000a726, + 0xa7270000a728, + 0xa7290000a72a, + 0xa72b0000a72c, + 0xa72d0000a72e, + 0xa72f0000a732, + 0xa7330000a734, + 0xa7350000a736, + 0xa7370000a738, + 0xa7390000a73a, + 0xa73b0000a73c, + 0xa73d0000a73e, + 0xa73f0000a740, + 0xa7410000a742, + 0xa7430000a744, + 0xa7450000a746, + 0xa7470000a748, + 0xa7490000a74a, + 0xa74b0000a74c, + 0xa74d0000a74e, + 0xa74f0000a750, + 0xa7510000a752, + 0xa7530000a754, + 0xa7550000a756, + 0xa7570000a758, + 0xa7590000a75a, + 0xa75b0000a75c, + 0xa75d0000a75e, + 0xa75f0000a760, + 0xa7610000a762, + 0xa7630000a764, + 0xa7650000a766, + 0xa7670000a768, + 0xa7690000a76a, + 0xa76b0000a76c, + 0xa76d0000a76e, + 0xa76f0000a770, + 0xa7710000a779, + 0xa77a0000a77b, + 0xa77c0000a77d, + 0xa77f0000a780, + 0xa7810000a782, + 0xa7830000a784, + 0xa7850000a786, + 0xa7870000a789, + 0xa78c0000a78d, + 0xa78e0000a78f, + 0xa7910000a792, + 0xa7930000a794, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7fa0000a828, + 0xa8400000a874, + 0xa8800000a8c5, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa9000000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aa7c, + 0xaa800000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe27, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x103000001031f, + 0x1033000010341, + 0x103420001034a, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a34, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10c0000010c49, + 0x1100000011047, + 0x1106600011070, + 0x11080000110bb, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x11180000111c5, + 0x111d0000111da, + 0x11680000116b8, + 0x116c0000116ca, + 0x120000001236f, + 0x130000001342f, + 0x1680000016a39, + 0x16f0000016f45, + 0x16f5000016f7f, + 0x16f8f00016fa0, + 0x1b0000001b002, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/idna/intranges.py b/idna/intranges.py new file mode 100644 index 00000000..fa8a7356 --- /dev/null +++ b/idna/intranges.py @@ -0,0 +1,53 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect + +def intranges_from_list(list_): + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i+1 < len(sorted_list): + if sorted_list[i] == sorted_list[i+1]-1: + continue + current_range = sorted_list[last_write+1:i+1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + +def _encode_range(start, end): + return (start << 32) | end + +def _decode_range(r): + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_, ranges): + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos-1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/idna/package_data.py b/idna/package_data.py new file mode 100644 index 00000000..fc331392 --- /dev/null +++ b/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.6' + diff --git a/idna/uts46data.py b/idna/uts46data.py new file mode 100644 index 00000000..f9b3236f --- /dev/null +++ b/idna/uts46data.py @@ -0,0 +1,7634 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "6.3.0" +def _seg_0(): + return [ + (0x0, '3'), + (0x1, '3'), + (0x2, '3'), + (0x3, '3'), + (0x4, '3'), + (0x5, '3'), + (0x6, '3'), + (0x7, '3'), + (0x8, '3'), + (0x9, '3'), + (0xA, '3'), + (0xB, '3'), + (0xC, '3'), + (0xD, '3'), + (0xE, '3'), + (0xF, '3'), + (0x10, '3'), + (0x11, '3'), + (0x12, '3'), + (0x13, '3'), + (0x14, '3'), + (0x15, '3'), + (0x16, '3'), + (0x17, '3'), + (0x18, '3'), + (0x19, '3'), + (0x1A, '3'), + (0x1B, '3'), + (0x1C, '3'), + (0x1D, '3'), + (0x1E, '3'), + (0x1F, '3'), + (0x20, '3'), + (0x21, '3'), + (0x22, '3'), + (0x23, '3'), + (0x24, '3'), + (0x25, '3'), + (0x26, '3'), + (0x27, '3'), + (0x28, '3'), + (0x29, '3'), + (0x2A, '3'), + (0x2B, '3'), + (0x2C, '3'), + (0x2D, 'V'), + (0x2E, 'V'), + (0x2F, '3'), + (0x30, 'V'), + (0x31, 'V'), + (0x32, 'V'), + (0x33, 'V'), + (0x34, 'V'), + (0x35, 'V'), + (0x36, 'V'), + (0x37, 'V'), + (0x38, 'V'), + (0x39, 'V'), + (0x3A, '3'), + (0x3B, '3'), + (0x3C, '3'), + (0x3D, '3'), + (0x3E, '3'), + (0x3F, '3'), + (0x40, '3'), + (0x41, 'M', u'a'), + (0x42, 'M', u'b'), + (0x43, 'M', u'c'), + (0x44, 'M', u'd'), + (0x45, 'M', u'e'), + (0x46, 'M', u'f'), + (0x47, 'M', u'g'), + (0x48, 'M', u'h'), + (0x49, 'M', u'i'), + (0x4A, 'M', u'j'), + (0x4B, 'M', u'k'), + (0x4C, 'M', u'l'), + (0x4D, 'M', u'm'), + (0x4E, 'M', u'n'), + (0x4F, 'M', u'o'), + (0x50, 'M', u'p'), + (0x51, 'M', u'q'), + (0x52, 'M', u'r'), + (0x53, 'M', u's'), + (0x54, 'M', u't'), + (0x55, 'M', u'u'), + (0x56, 'M', u'v'), + (0x57, 'M', u'w'), + (0x58, 'M', u'x'), + (0x59, 'M', u'y'), + (0x5A, 'M', u'z'), + (0x5B, '3'), + (0x5C, '3'), + (0x5D, '3'), + (0x5E, '3'), + (0x5F, '3'), + (0x60, '3'), + (0x61, 'V'), + (0x62, 'V'), + (0x63, 'V'), + ] + +def _seg_1(): + return [ + (0x64, 'V'), + (0x65, 'V'), + (0x66, 'V'), + (0x67, 'V'), + (0x68, 'V'), + (0x69, 'V'), + (0x6A, 'V'), + (0x6B, 'V'), + (0x6C, 'V'), + (0x6D, 'V'), + (0x6E, 'V'), + (0x6F, 'V'), + (0x70, 'V'), + (0x71, 'V'), + (0x72, 'V'), + (0x73, 'V'), + (0x74, 'V'), + (0x75, 'V'), + (0x76, 'V'), + (0x77, 'V'), + (0x78, 'V'), + (0x79, 'V'), + (0x7A, 'V'), + (0x7B, '3'), + (0x7C, '3'), + (0x7D, '3'), + (0x7E, '3'), + (0x7F, '3'), + (0x80, 'X'), + (0x81, 'X'), + (0x82, 'X'), + (0x83, 'X'), + (0x84, 'X'), + (0x85, 'X'), + (0x86, 'X'), + (0x87, 'X'), + (0x88, 'X'), + (0x89, 'X'), + (0x8A, 'X'), + (0x8B, 'X'), + (0x8C, 'X'), + (0x8D, 'X'), + (0x8E, 'X'), + (0x8F, 'X'), + (0x90, 'X'), + (0x91, 'X'), + (0x92, 'X'), + (0x93, 'X'), + (0x94, 'X'), + (0x95, 'X'), + (0x96, 'X'), + (0x97, 'X'), + (0x98, 'X'), + (0x99, 'X'), + (0x9A, 'X'), + (0x9B, 'X'), + (0x9C, 'X'), + (0x9D, 'X'), + (0x9E, 'X'), + (0x9F, 'X'), + (0xA0, '3', u' '), + (0xA1, 'V'), + (0xA2, 'V'), + (0xA3, 'V'), + (0xA4, 'V'), + (0xA5, 'V'), + (0xA6, 'V'), + (0xA7, 'V'), + (0xA8, '3', u' ̈'), + (0xA9, 'V'), + (0xAA, 'M', u'a'), + (0xAB, 'V'), + (0xAC, 'V'), + (0xAD, 'I'), + (0xAE, 'V'), + (0xAF, '3', u' ̄'), + (0xB0, 'V'), + (0xB1, 'V'), + (0xB2, 'M', u'2'), + (0xB3, 'M', u'3'), + (0xB4, '3', u' ́'), + (0xB5, 'M', u'μ'), + (0xB6, 'V'), + (0xB7, 'V'), + (0xB8, '3', u' ̧'), + (0xB9, 'M', u'1'), + (0xBA, 'M', u'o'), + (0xBB, 'V'), + (0xBC, 'M', u'1⁄4'), + (0xBD, 'M', u'1⁄2'), + (0xBE, 'M', u'3⁄4'), + (0xBF, 'V'), + (0xC0, 'M', u'à'), + (0xC1, 'M', u'á'), + (0xC2, 'M', u'â'), + (0xC3, 'M', u'ã'), + (0xC4, 'M', u'ä'), + (0xC5, 'M', u'å'), + (0xC6, 'M', u'æ'), + (0xC7, 'M', u'ç'), + ] + +def _seg_2(): + return [ + (0xC8, 'M', u'è'), + (0xC9, 'M', u'é'), + (0xCA, 'M', u'ê'), + (0xCB, 'M', u'ë'), + (0xCC, 'M', u'ì'), + (0xCD, 'M', u'í'), + (0xCE, 'M', u'î'), + (0xCF, 'M', u'ï'), + (0xD0, 'M', u'ð'), + (0xD1, 'M', u'ñ'), + (0xD2, 'M', u'ò'), + (0xD3, 'M', u'ó'), + (0xD4, 'M', u'ô'), + (0xD5, 'M', u'õ'), + (0xD6, 'M', u'ö'), + (0xD7, 'V'), + (0xD8, 'M', u'ø'), + (0xD9, 'M', u'ù'), + (0xDA, 'M', u'ú'), + (0xDB, 'M', u'û'), + (0xDC, 'M', u'ü'), + (0xDD, 'M', u'ý'), + (0xDE, 'M', u'þ'), + (0xDF, 'D', u'ss'), + (0xE0, 'V'), + (0xE1, 'V'), + (0xE2, 'V'), + (0xE3, 'V'), + (0xE4, 'V'), + (0xE5, 'V'), + (0xE6, 'V'), + (0xE7, 'V'), + (0xE8, 'V'), + (0xE9, 'V'), + (0xEA, 'V'), + (0xEB, 'V'), + (0xEC, 'V'), + (0xED, 'V'), + (0xEE, 'V'), + (0xEF, 'V'), + (0xF0, 'V'), + (0xF1, 'V'), + (0xF2, 'V'), + (0xF3, 'V'), + (0xF4, 'V'), + (0xF5, 'V'), + (0xF6, 'V'), + (0xF7, 'V'), + (0xF8, 'V'), + (0xF9, 'V'), + (0xFA, 'V'), + (0xFB, 'V'), + (0xFC, 'V'), + (0xFD, 'V'), + (0xFE, 'V'), + (0xFF, 'V'), + (0x100, 'M', u'ā'), + (0x101, 'V'), + (0x102, 'M', u'ă'), + (0x103, 'V'), + (0x104, 'M', u'ą'), + (0x105, 'V'), + (0x106, 'M', u'ć'), + (0x107, 'V'), + (0x108, 'M', u'ĉ'), + (0x109, 'V'), + (0x10A, 'M', u'ċ'), + (0x10B, 'V'), + (0x10C, 'M', u'č'), + (0x10D, 'V'), + (0x10E, 'M', u'ď'), + (0x10F, 'V'), + (0x110, 'M', u'đ'), + (0x111, 'V'), + (0x112, 'M', u'ē'), + (0x113, 'V'), + (0x114, 'M', u'ĕ'), + (0x115, 'V'), + (0x116, 'M', u'ė'), + (0x117, 'V'), + (0x118, 'M', u'ę'), + (0x119, 'V'), + (0x11A, 'M', u'ě'), + (0x11B, 'V'), + (0x11C, 'M', u'ĝ'), + (0x11D, 'V'), + (0x11E, 'M', u'ğ'), + (0x11F, 'V'), + (0x120, 'M', u'ġ'), + (0x121, 'V'), + (0x122, 'M', u'ģ'), + (0x123, 'V'), + (0x124, 'M', u'ĥ'), + (0x125, 'V'), + (0x126, 'M', u'ħ'), + (0x127, 'V'), + (0x128, 'M', u'ĩ'), + (0x129, 'V'), + (0x12A, 'M', u'ī'), + (0x12B, 'V'), + ] + +def _seg_3(): + return [ + (0x12C, 'M', u'ĭ'), + (0x12D, 'V'), + (0x12E, 'M', u'į'), + (0x12F, 'V'), + (0x130, 'M', u'i̇'), + (0x131, 'V'), + (0x132, 'M', u'ij'), + (0x134, 'M', u'ĵ'), + (0x135, 'V'), + (0x136, 'M', u'ķ'), + (0x137, 'V'), + (0x139, 'M', u'ĺ'), + (0x13A, 'V'), + (0x13B, 'M', u'ļ'), + (0x13C, 'V'), + (0x13D, 'M', u'ľ'), + (0x13E, 'V'), + (0x13F, 'M', u'l·'), + (0x141, 'M', u'ł'), + (0x142, 'V'), + (0x143, 'M', u'ń'), + (0x144, 'V'), + (0x145, 'M', u'ņ'), + (0x146, 'V'), + (0x147, 'M', u'ň'), + (0x148, 'V'), + (0x149, 'M', u'ʼn'), + (0x14A, 'M', u'ŋ'), + (0x14B, 'V'), + (0x14C, 'M', u'ō'), + (0x14D, 'V'), + (0x14E, 'M', u'ŏ'), + (0x14F, 'V'), + (0x150, 'M', u'ő'), + (0x151, 'V'), + (0x152, 'M', u'œ'), + (0x153, 'V'), + (0x154, 'M', u'ŕ'), + (0x155, 'V'), + (0x156, 'M', u'ŗ'), + (0x157, 'V'), + (0x158, 'M', u'ř'), + (0x159, 'V'), + (0x15A, 'M', u'ś'), + (0x15B, 'V'), + (0x15C, 'M', u'ŝ'), + (0x15D, 'V'), + (0x15E, 'M', u'ş'), + (0x15F, 'V'), + (0x160, 'M', u'š'), + (0x161, 'V'), + (0x162, 'M', u'ţ'), + (0x163, 'V'), + (0x164, 'M', u'ť'), + (0x165, 'V'), + (0x166, 'M', u'ŧ'), + (0x167, 'V'), + (0x168, 'M', u'ũ'), + (0x169, 'V'), + (0x16A, 'M', u'ū'), + (0x16B, 'V'), + (0x16C, 'M', u'ŭ'), + (0x16D, 'V'), + (0x16E, 'M', u'ů'), + (0x16F, 'V'), + (0x170, 'M', u'ű'), + (0x171, 'V'), + (0x172, 'M', u'ų'), + (0x173, 'V'), + (0x174, 'M', u'ŵ'), + (0x175, 'V'), + (0x176, 'M', u'ŷ'), + (0x177, 'V'), + (0x178, 'M', u'ÿ'), + (0x179, 'M', u'ź'), + (0x17A, 'V'), + (0x17B, 'M', u'ż'), + (0x17C, 'V'), + (0x17D, 'M', u'ž'), + (0x17E, 'V'), + (0x17F, 'M', u's'), + (0x180, 'V'), + (0x181, 'M', u'ɓ'), + (0x182, 'M', u'ƃ'), + (0x183, 'V'), + (0x184, 'M', u'ƅ'), + (0x185, 'V'), + (0x186, 'M', u'ɔ'), + (0x187, 'M', u'ƈ'), + (0x188, 'V'), + (0x189, 'M', u'ɖ'), + (0x18A, 'M', u'ɗ'), + (0x18B, 'M', u'ƌ'), + (0x18C, 'V'), + (0x18E, 'M', u'ǝ'), + (0x18F, 'M', u'ə'), + (0x190, 'M', u'ɛ'), + (0x191, 'M', u'ƒ'), + (0x192, 'V'), + (0x193, 'M', u'ɠ'), + ] + +def _seg_4(): + return [ + (0x194, 'M', u'ɣ'), + (0x195, 'V'), + (0x196, 'M', u'ɩ'), + (0x197, 'M', u'ɨ'), + (0x198, 'M', u'ƙ'), + (0x199, 'V'), + (0x19C, 'M', u'ɯ'), + (0x19D, 'M', u'ɲ'), + (0x19E, 'V'), + (0x19F, 'M', u'ɵ'), + (0x1A0, 'M', u'ơ'), + (0x1A1, 'V'), + (0x1A2, 'M', u'ƣ'), + (0x1A3, 'V'), + (0x1A4, 'M', u'ƥ'), + (0x1A5, 'V'), + (0x1A6, 'M', u'ʀ'), + (0x1A7, 'M', u'ƨ'), + (0x1A8, 'V'), + (0x1A9, 'M', u'ʃ'), + (0x1AA, 'V'), + (0x1AC, 'M', u'ƭ'), + (0x1AD, 'V'), + (0x1AE, 'M', u'ʈ'), + (0x1AF, 'M', u'ư'), + (0x1B0, 'V'), + (0x1B1, 'M', u'ʊ'), + (0x1B2, 'M', u'ʋ'), + (0x1B3, 'M', u'ƴ'), + (0x1B4, 'V'), + (0x1B5, 'M', u'ƶ'), + (0x1B6, 'V'), + (0x1B7, 'M', u'ʒ'), + (0x1B8, 'M', u'ƹ'), + (0x1B9, 'V'), + (0x1BC, 'M', u'ƽ'), + (0x1BD, 'V'), + (0x1C4, 'M', u'dž'), + (0x1C7, 'M', u'lj'), + (0x1CA, 'M', u'nj'), + (0x1CD, 'M', u'ǎ'), + (0x1CE, 'V'), + (0x1CF, 'M', u'ǐ'), + (0x1D0, 'V'), + (0x1D1, 'M', u'ǒ'), + (0x1D2, 'V'), + (0x1D3, 'M', u'ǔ'), + (0x1D4, 'V'), + (0x1D5, 'M', u'ǖ'), + (0x1D6, 'V'), + (0x1D7, 'M', u'ǘ'), + (0x1D8, 'V'), + (0x1D9, 'M', u'ǚ'), + (0x1DA, 'V'), + (0x1DB, 'M', u'ǜ'), + (0x1DC, 'V'), + (0x1DE, 'M', u'ǟ'), + (0x1DF, 'V'), + (0x1E0, 'M', u'ǡ'), + (0x1E1, 'V'), + (0x1E2, 'M', u'ǣ'), + (0x1E3, 'V'), + (0x1E4, 'M', u'ǥ'), + (0x1E5, 'V'), + (0x1E6, 'M', u'ǧ'), + (0x1E7, 'V'), + (0x1E8, 'M', u'ǩ'), + (0x1E9, 'V'), + (0x1EA, 'M', u'ǫ'), + (0x1EB, 'V'), + (0x1EC, 'M', u'ǭ'), + (0x1ED, 'V'), + (0x1EE, 'M', u'ǯ'), + (0x1EF, 'V'), + (0x1F1, 'M', u'dz'), + (0x1F4, 'M', u'ǵ'), + (0x1F5, 'V'), + (0x1F6, 'M', u'ƕ'), + (0x1F7, 'M', u'ƿ'), + (0x1F8, 'M', u'ǹ'), + (0x1F9, 'V'), + (0x1FA, 'M', u'ǻ'), + (0x1FB, 'V'), + (0x1FC, 'M', u'ǽ'), + (0x1FD, 'V'), + (0x1FE, 'M', u'ǿ'), + (0x1FF, 'V'), + (0x200, 'M', u'ȁ'), + (0x201, 'V'), + (0x202, 'M', u'ȃ'), + (0x203, 'V'), + (0x204, 'M', u'ȅ'), + (0x205, 'V'), + (0x206, 'M', u'ȇ'), + (0x207, 'V'), + (0x208, 'M', u'ȉ'), + (0x209, 'V'), + (0x20A, 'M', u'ȋ'), + (0x20B, 'V'), + (0x20C, 'M', u'ȍ'), + ] + +def _seg_5(): + return [ + (0x20D, 'V'), + (0x20E, 'M', u'ȏ'), + (0x20F, 'V'), + (0x210, 'M', u'ȑ'), + (0x211, 'V'), + (0x212, 'M', u'ȓ'), + (0x213, 'V'), + (0x214, 'M', u'ȕ'), + (0x215, 'V'), + (0x216, 'M', u'ȗ'), + (0x217, 'V'), + (0x218, 'M', u'ș'), + (0x219, 'V'), + (0x21A, 'M', u'ț'), + (0x21B, 'V'), + (0x21C, 'M', u'ȝ'), + (0x21D, 'V'), + (0x21E, 'M', u'ȟ'), + (0x21F, 'V'), + (0x220, 'M', u'ƞ'), + (0x221, 'V'), + (0x222, 'M', u'ȣ'), + (0x223, 'V'), + (0x224, 'M', u'ȥ'), + (0x225, 'V'), + (0x226, 'M', u'ȧ'), + (0x227, 'V'), + (0x228, 'M', u'ȩ'), + (0x229, 'V'), + (0x22A, 'M', u'ȫ'), + (0x22B, 'V'), + (0x22C, 'M', u'ȭ'), + (0x22D, 'V'), + (0x22E, 'M', u'ȯ'), + (0x22F, 'V'), + (0x230, 'M', u'ȱ'), + (0x231, 'V'), + (0x232, 'M', u'ȳ'), + (0x233, 'V'), + (0x23A, 'M', u'ⱥ'), + (0x23B, 'M', u'ȼ'), + (0x23C, 'V'), + (0x23D, 'M', u'ƚ'), + (0x23E, 'M', u'ⱦ'), + (0x23F, 'V'), + (0x241, 'M', u'ɂ'), + (0x242, 'V'), + (0x243, 'M', u'ƀ'), + (0x244, 'M', u'ʉ'), + (0x245, 'M', u'ʌ'), + (0x246, 'M', u'ɇ'), + (0x247, 'V'), + (0x248, 'M', u'ɉ'), + (0x249, 'V'), + (0x24A, 'M', u'ɋ'), + (0x24B, 'V'), + (0x24C, 'M', u'ɍ'), + (0x24D, 'V'), + (0x24E, 'M', u'ɏ'), + (0x24F, 'V'), + (0x2B0, 'M', u'h'), + (0x2B1, 'M', u'ɦ'), + (0x2B2, 'M', u'j'), + (0x2B3, 'M', u'r'), + (0x2B4, 'M', u'ɹ'), + (0x2B5, 'M', u'ɻ'), + (0x2B6, 'M', u'ʁ'), + (0x2B7, 'M', u'w'), + (0x2B8, 'M', u'y'), + (0x2B9, 'V'), + (0x2D8, '3', u' ̆'), + (0x2D9, '3', u' ̇'), + (0x2DA, '3', u' ̊'), + (0x2DB, '3', u' ̨'), + (0x2DC, '3', u' ̃'), + (0x2DD, '3', u' ̋'), + (0x2DE, 'V'), + (0x2E0, 'M', u'ɣ'), + (0x2E1, 'M', u'l'), + (0x2E2, 'M', u's'), + (0x2E3, 'M', u'x'), + (0x2E4, 'M', u'ʕ'), + (0x2E5, 'V'), + (0x340, 'M', u'̀'), + (0x341, 'M', u'́'), + (0x342, 'V'), + (0x343, 'M', u'̓'), + (0x344, 'M', u'̈́'), + (0x345, 'M', u'ι'), + (0x346, 'V'), + (0x34F, 'I'), + (0x350, 'V'), + (0x370, 'M', u'ͱ'), + (0x371, 'V'), + (0x372, 'M', u'ͳ'), + (0x373, 'V'), + (0x374, 'M', u'ʹ'), + (0x375, 'V'), + (0x376, 'M', u'ͷ'), + (0x377, 'V'), + ] + +def _seg_6(): + return [ + (0x378, 'X'), + (0x37A, '3', u' ι'), + (0x37B, 'V'), + (0x37E, '3', u';'), + (0x37F, 'X'), + (0x384, '3', u' ́'), + (0x385, '3', u' ̈́'), + (0x386, 'M', u'ά'), + (0x387, 'M', u'·'), + (0x388, 'M', u'έ'), + (0x389, 'M', u'ή'), + (0x38A, 'M', u'ί'), + (0x38B, 'X'), + (0x38C, 'M', u'ό'), + (0x38D, 'X'), + (0x38E, 'M', u'ύ'), + (0x38F, 'M', u'ώ'), + (0x390, 'V'), + (0x391, 'M', u'α'), + (0x392, 'M', u'β'), + (0x393, 'M', u'γ'), + (0x394, 'M', u'δ'), + (0x395, 'M', u'ε'), + (0x396, 'M', u'ζ'), + (0x397, 'M', u'η'), + (0x398, 'M', u'θ'), + (0x399, 'M', u'ι'), + (0x39A, 'M', u'κ'), + (0x39B, 'M', u'λ'), + (0x39C, 'M', u'μ'), + (0x39D, 'M', u'ν'), + (0x39E, 'M', u'ξ'), + (0x39F, 'M', u'ο'), + (0x3A0, 'M', u'π'), + (0x3A1, 'M', u'ρ'), + (0x3A2, 'X'), + (0x3A3, 'M', u'σ'), + (0x3A4, 'M', u'τ'), + (0x3A5, 'M', u'υ'), + (0x3A6, 'M', u'φ'), + (0x3A7, 'M', u'χ'), + (0x3A8, 'M', u'ψ'), + (0x3A9, 'M', u'ω'), + (0x3AA, 'M', u'ϊ'), + (0x3AB, 'M', u'ϋ'), + (0x3AC, 'V'), + (0x3C2, 'D', u'σ'), + (0x3C3, 'V'), + (0x3CF, 'M', u'ϗ'), + (0x3D0, 'M', u'β'), + (0x3D1, 'M', u'θ'), + (0x3D2, 'M', u'υ'), + (0x3D3, 'M', u'ύ'), + (0x3D4, 'M', u'ϋ'), + (0x3D5, 'M', u'φ'), + (0x3D6, 'M', u'π'), + (0x3D7, 'V'), + (0x3D8, 'M', u'ϙ'), + (0x3D9, 'V'), + (0x3DA, 'M', u'ϛ'), + (0x3DB, 'V'), + (0x3DC, 'M', u'ϝ'), + (0x3DD, 'V'), + (0x3DE, 'M', u'ϟ'), + (0x3DF, 'V'), + (0x3E0, 'M', u'ϡ'), + (0x3E1, 'V'), + (0x3E2, 'M', u'ϣ'), + (0x3E3, 'V'), + (0x3E4, 'M', u'ϥ'), + (0x3E5, 'V'), + (0x3E6, 'M', u'ϧ'), + (0x3E7, 'V'), + (0x3E8, 'M', u'ϩ'), + (0x3E9, 'V'), + (0x3EA, 'M', u'ϫ'), + (0x3EB, 'V'), + (0x3EC, 'M', u'ϭ'), + (0x3ED, 'V'), + (0x3EE, 'M', u'ϯ'), + (0x3EF, 'V'), + (0x3F0, 'M', u'κ'), + (0x3F1, 'M', u'ρ'), + (0x3F2, 'M', u'σ'), + (0x3F3, 'V'), + (0x3F4, 'M', u'θ'), + (0x3F5, 'M', u'ε'), + (0x3F6, 'V'), + (0x3F7, 'M', u'ϸ'), + (0x3F8, 'V'), + (0x3F9, 'M', u'σ'), + (0x3FA, 'M', u'ϻ'), + (0x3FB, 'V'), + (0x3FD, 'M', u'ͻ'), + (0x3FE, 'M', u'ͼ'), + (0x3FF, 'M', u'ͽ'), + (0x400, 'M', u'ѐ'), + (0x401, 'M', u'ё'), + (0x402, 'M', u'ђ'), + (0x403, 'M', u'ѓ'), + ] + +def _seg_7(): + return [ + (0x404, 'M', u'є'), + (0x405, 'M', u'ѕ'), + (0x406, 'M', u'і'), + (0x407, 'M', u'ї'), + (0x408, 'M', u'ј'), + (0x409, 'M', u'љ'), + (0x40A, 'M', u'њ'), + (0x40B, 'M', u'ћ'), + (0x40C, 'M', u'ќ'), + (0x40D, 'M', u'ѝ'), + (0x40E, 'M', u'ў'), + (0x40F, 'M', u'џ'), + (0x410, 'M', u'а'), + (0x411, 'M', u'б'), + (0x412, 'M', u'в'), + (0x413, 'M', u'г'), + (0x414, 'M', u'д'), + (0x415, 'M', u'е'), + (0x416, 'M', u'ж'), + (0x417, 'M', u'з'), + (0x418, 'M', u'и'), + (0x419, 'M', u'й'), + (0x41A, 'M', u'к'), + (0x41B, 'M', u'л'), + (0x41C, 'M', u'м'), + (0x41D, 'M', u'н'), + (0x41E, 'M', u'о'), + (0x41F, 'M', u'п'), + (0x420, 'M', u'р'), + (0x421, 'M', u'с'), + (0x422, 'M', u'т'), + (0x423, 'M', u'у'), + (0x424, 'M', u'ф'), + (0x425, 'M', u'х'), + (0x426, 'M', u'ц'), + (0x427, 'M', u'ч'), + (0x428, 'M', u'ш'), + (0x429, 'M', u'щ'), + (0x42A, 'M', u'ъ'), + (0x42B, 'M', u'ы'), + (0x42C, 'M', u'ь'), + (0x42D, 'M', u'э'), + (0x42E, 'M', u'ю'), + (0x42F, 'M', u'я'), + (0x430, 'V'), + (0x460, 'M', u'ѡ'), + (0x461, 'V'), + (0x462, 'M', u'ѣ'), + (0x463, 'V'), + (0x464, 'M', u'ѥ'), + (0x465, 'V'), + (0x466, 'M', u'ѧ'), + (0x467, 'V'), + (0x468, 'M', u'ѩ'), + (0x469, 'V'), + (0x46A, 'M', u'ѫ'), + (0x46B, 'V'), + (0x46C, 'M', u'ѭ'), + (0x46D, 'V'), + (0x46E, 'M', u'ѯ'), + (0x46F, 'V'), + (0x470, 'M', u'ѱ'), + (0x471, 'V'), + (0x472, 'M', u'ѳ'), + (0x473, 'V'), + (0x474, 'M', u'ѵ'), + (0x475, 'V'), + (0x476, 'M', u'ѷ'), + (0x477, 'V'), + (0x478, 'M', u'ѹ'), + (0x479, 'V'), + (0x47A, 'M', u'ѻ'), + (0x47B, 'V'), + (0x47C, 'M', u'ѽ'), + (0x47D, 'V'), + (0x47E, 'M', u'ѿ'), + (0x47F, 'V'), + (0x480, 'M', u'ҁ'), + (0x481, 'V'), + (0x48A, 'M', u'ҋ'), + (0x48B, 'V'), + (0x48C, 'M', u'ҍ'), + (0x48D, 'V'), + (0x48E, 'M', u'ҏ'), + (0x48F, 'V'), + (0x490, 'M', u'ґ'), + (0x491, 'V'), + (0x492, 'M', u'ғ'), + (0x493, 'V'), + (0x494, 'M', u'ҕ'), + (0x495, 'V'), + (0x496, 'M', u'җ'), + (0x497, 'V'), + (0x498, 'M', u'ҙ'), + (0x499, 'V'), + (0x49A, 'M', u'қ'), + (0x49B, 'V'), + (0x49C, 'M', u'ҝ'), + (0x49D, 'V'), + (0x49E, 'M', u'ҟ'), + ] + +def _seg_8(): + return [ + (0x49F, 'V'), + (0x4A0, 'M', u'ҡ'), + (0x4A1, 'V'), + (0x4A2, 'M', u'ң'), + (0x4A3, 'V'), + (0x4A4, 'M', u'ҥ'), + (0x4A5, 'V'), + (0x4A6, 'M', u'ҧ'), + (0x4A7, 'V'), + (0x4A8, 'M', u'ҩ'), + (0x4A9, 'V'), + (0x4AA, 'M', u'ҫ'), + (0x4AB, 'V'), + (0x4AC, 'M', u'ҭ'), + (0x4AD, 'V'), + (0x4AE, 'M', u'ү'), + (0x4AF, 'V'), + (0x4B0, 'M', u'ұ'), + (0x4B1, 'V'), + (0x4B2, 'M', u'ҳ'), + (0x4B3, 'V'), + (0x4B4, 'M', u'ҵ'), + (0x4B5, 'V'), + (0x4B6, 'M', u'ҷ'), + (0x4B7, 'V'), + (0x4B8, 'M', u'ҹ'), + (0x4B9, 'V'), + (0x4BA, 'M', u'һ'), + (0x4BB, 'V'), + (0x4BC, 'M', u'ҽ'), + (0x4BD, 'V'), + (0x4BE, 'M', u'ҿ'), + (0x4BF, 'V'), + (0x4C0, 'X'), + (0x4C1, 'M', u'ӂ'), + (0x4C2, 'V'), + (0x4C3, 'M', u'ӄ'), + (0x4C4, 'V'), + (0x4C5, 'M', u'ӆ'), + (0x4C6, 'V'), + (0x4C7, 'M', u'ӈ'), + (0x4C8, 'V'), + (0x4C9, 'M', u'ӊ'), + (0x4CA, 'V'), + (0x4CB, 'M', u'ӌ'), + (0x4CC, 'V'), + (0x4CD, 'M', u'ӎ'), + (0x4CE, 'V'), + (0x4D0, 'M', u'ӑ'), + (0x4D1, 'V'), + (0x4D2, 'M', u'ӓ'), + (0x4D3, 'V'), + (0x4D4, 'M', u'ӕ'), + (0x4D5, 'V'), + (0x4D6, 'M', u'ӗ'), + (0x4D7, 'V'), + (0x4D8, 'M', u'ә'), + (0x4D9, 'V'), + (0x4DA, 'M', u'ӛ'), + (0x4DB, 'V'), + (0x4DC, 'M', u'ӝ'), + (0x4DD, 'V'), + (0x4DE, 'M', u'ӟ'), + (0x4DF, 'V'), + (0x4E0, 'M', u'ӡ'), + (0x4E1, 'V'), + (0x4E2, 'M', u'ӣ'), + (0x4E3, 'V'), + (0x4E4, 'M', u'ӥ'), + (0x4E5, 'V'), + (0x4E6, 'M', u'ӧ'), + (0x4E7, 'V'), + (0x4E8, 'M', u'ө'), + (0x4E9, 'V'), + (0x4EA, 'M', u'ӫ'), + (0x4EB, 'V'), + (0x4EC, 'M', u'ӭ'), + (0x4ED, 'V'), + (0x4EE, 'M', u'ӯ'), + (0x4EF, 'V'), + (0x4F0, 'M', u'ӱ'), + (0x4F1, 'V'), + (0x4F2, 'M', u'ӳ'), + (0x4F3, 'V'), + (0x4F4, 'M', u'ӵ'), + (0x4F5, 'V'), + (0x4F6, 'M', u'ӷ'), + (0x4F7, 'V'), + (0x4F8, 'M', u'ӹ'), + (0x4F9, 'V'), + (0x4FA, 'M', u'ӻ'), + (0x4FB, 'V'), + (0x4FC, 'M', u'ӽ'), + (0x4FD, 'V'), + (0x4FE, 'M', u'ӿ'), + (0x4FF, 'V'), + (0x500, 'M', u'ԁ'), + (0x501, 'V'), + (0x502, 'M', u'ԃ'), + (0x503, 'V'), + ] + +def _seg_9(): + return [ + (0x504, 'M', u'ԅ'), + (0x505, 'V'), + (0x506, 'M', u'ԇ'), + (0x507, 'V'), + (0x508, 'M', u'ԉ'), + (0x509, 'V'), + (0x50A, 'M', u'ԋ'), + (0x50B, 'V'), + (0x50C, 'M', u'ԍ'), + (0x50D, 'V'), + (0x50E, 'M', u'ԏ'), + (0x50F, 'V'), + (0x510, 'M', u'ԑ'), + (0x511, 'V'), + (0x512, 'M', u'ԓ'), + (0x513, 'V'), + (0x514, 'M', u'ԕ'), + (0x515, 'V'), + (0x516, 'M', u'ԗ'), + (0x517, 'V'), + (0x518, 'M', u'ԙ'), + (0x519, 'V'), + (0x51A, 'M', u'ԛ'), + (0x51B, 'V'), + (0x51C, 'M', u'ԝ'), + (0x51D, 'V'), + (0x51E, 'M', u'ԟ'), + (0x51F, 'V'), + (0x520, 'M', u'ԡ'), + (0x521, 'V'), + (0x522, 'M', u'ԣ'), + (0x523, 'V'), + (0x524, 'M', u'ԥ'), + (0x525, 'V'), + (0x526, 'M', u'ԧ'), + (0x527, 'V'), + (0x528, 'X'), + (0x531, 'M', u'ա'), + (0x532, 'M', u'բ'), + (0x533, 'M', u'գ'), + (0x534, 'M', u'դ'), + (0x535, 'M', u'ե'), + (0x536, 'M', u'զ'), + (0x537, 'M', u'է'), + (0x538, 'M', u'ը'), + (0x539, 'M', u'թ'), + (0x53A, 'M', u'ժ'), + (0x53B, 'M', u'ի'), + (0x53C, 'M', u'լ'), + (0x53D, 'M', u'խ'), + (0x53E, 'M', u'ծ'), + (0x53F, 'M', u'կ'), + (0x540, 'M', u'հ'), + (0x541, 'M', u'ձ'), + (0x542, 'M', u'ղ'), + (0x543, 'M', u'ճ'), + (0x544, 'M', u'մ'), + (0x545, 'M', u'յ'), + (0x546, 'M', u'ն'), + (0x547, 'M', u'շ'), + (0x548, 'M', u'ո'), + (0x549, 'M', u'չ'), + (0x54A, 'M', u'պ'), + (0x54B, 'M', u'ջ'), + (0x54C, 'M', u'ռ'), + (0x54D, 'M', u'ս'), + (0x54E, 'M', u'վ'), + (0x54F, 'M', u'տ'), + (0x550, 'M', u'ր'), + (0x551, 'M', u'ց'), + (0x552, 'M', u'ւ'), + (0x553, 'M', u'փ'), + (0x554, 'M', u'ք'), + (0x555, 'M', u'օ'), + (0x556, 'M', u'ֆ'), + (0x557, 'X'), + (0x559, 'V'), + (0x560, 'X'), + (0x561, 'V'), + (0x587, 'M', u'եւ'), + (0x588, 'X'), + (0x589, 'V'), + (0x58B, 'X'), + (0x58F, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5F0, 'V'), + (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), + (0x61E, 'V'), + (0x675, 'M', u'اٴ'), + (0x676, 'M', u'وٴ'), + (0x677, 'M', u'ۇٴ'), + (0x678, 'M', u'يٴ'), + (0x679, 'V'), + (0x6DD, 'X'), + ] + +def _seg_10(): + return [ + (0x6DE, 'V'), + (0x70E, 'X'), + (0x710, 'V'), + (0x74B, 'X'), + (0x74D, 'V'), + (0x7B2, 'X'), + (0x7C0, 'V'), + (0x7FB, 'X'), + (0x800, 'V'), + (0x82E, 'X'), + (0x830, 'V'), + (0x83F, 'X'), + (0x840, 'V'), + (0x85C, 'X'), + (0x85E, 'V'), + (0x85F, 'X'), + (0x8A0, 'V'), + (0x8A1, 'X'), + (0x8A2, 'V'), + (0x8AD, 'X'), + (0x8E4, 'V'), + (0x8FF, 'X'), + (0x900, 'V'), + (0x958, 'M', u'क़'), + (0x959, 'M', u'ख़'), + (0x95A, 'M', u'ग़'), + (0x95B, 'M', u'ज़'), + (0x95C, 'M', u'ड़'), + (0x95D, 'M', u'ढ़'), + (0x95E, 'M', u'फ़'), + (0x95F, 'M', u'य़'), + (0x960, 'V'), + (0x978, 'X'), + (0x979, 'V'), + (0x980, 'X'), + (0x981, 'V'), + (0x984, 'X'), + (0x985, 'V'), + (0x98D, 'X'), + (0x98F, 'V'), + (0x991, 'X'), + (0x993, 'V'), + (0x9A9, 'X'), + (0x9AA, 'V'), + (0x9B1, 'X'), + (0x9B2, 'V'), + (0x9B3, 'X'), + (0x9B6, 'V'), + (0x9BA, 'X'), + (0x9BC, 'V'), + (0x9C5, 'X'), + (0x9C7, 'V'), + (0x9C9, 'X'), + (0x9CB, 'V'), + (0x9CF, 'X'), + (0x9D7, 'V'), + (0x9D8, 'X'), + (0x9DC, 'M', u'ড়'), + (0x9DD, 'M', u'ঢ়'), + (0x9DE, 'X'), + (0x9DF, 'M', u'য়'), + (0x9E0, 'V'), + (0x9E4, 'X'), + (0x9E6, 'V'), + (0x9FC, 'X'), + (0xA01, 'V'), + (0xA04, 'X'), + (0xA05, 'V'), + (0xA0B, 'X'), + (0xA0F, 'V'), + (0xA11, 'X'), + (0xA13, 'V'), + (0xA29, 'X'), + (0xA2A, 'V'), + (0xA31, 'X'), + (0xA32, 'V'), + (0xA33, 'M', u'ਲ਼'), + (0xA34, 'X'), + (0xA35, 'V'), + (0xA36, 'M', u'ਸ਼'), + (0xA37, 'X'), + (0xA38, 'V'), + (0xA3A, 'X'), + (0xA3C, 'V'), + (0xA3D, 'X'), + (0xA3E, 'V'), + (0xA43, 'X'), + (0xA47, 'V'), + (0xA49, 'X'), + (0xA4B, 'V'), + (0xA4E, 'X'), + (0xA51, 'V'), + (0xA52, 'X'), + (0xA59, 'M', u'ਖ਼'), + (0xA5A, 'M', u'ਗ਼'), + (0xA5B, 'M', u'ਜ਼'), + (0xA5C, 'V'), + (0xA5D, 'X'), + (0xA5E, 'M', u'ਫ਼'), + (0xA5F, 'X'), + ] + +def _seg_11(): + return [ + (0xA66, 'V'), + (0xA76, 'X'), + (0xA81, 'V'), + (0xA84, 'X'), + (0xA85, 'V'), + (0xA8E, 'X'), + (0xA8F, 'V'), + (0xA92, 'X'), + (0xA93, 'V'), + (0xAA9, 'X'), + (0xAAA, 'V'), + (0xAB1, 'X'), + (0xAB2, 'V'), + (0xAB4, 'X'), + (0xAB5, 'V'), + (0xABA, 'X'), + (0xABC, 'V'), + (0xAC6, 'X'), + (0xAC7, 'V'), + (0xACA, 'X'), + (0xACB, 'V'), + (0xACE, 'X'), + (0xAD0, 'V'), + (0xAD1, 'X'), + (0xAE0, 'V'), + (0xAE4, 'X'), + (0xAE6, 'V'), + (0xAF2, 'X'), + (0xB01, 'V'), + (0xB04, 'X'), + (0xB05, 'V'), + (0xB0D, 'X'), + (0xB0F, 'V'), + (0xB11, 'X'), + (0xB13, 'V'), + (0xB29, 'X'), + (0xB2A, 'V'), + (0xB31, 'X'), + (0xB32, 'V'), + (0xB34, 'X'), + (0xB35, 'V'), + (0xB3A, 'X'), + (0xB3C, 'V'), + (0xB45, 'X'), + (0xB47, 'V'), + (0xB49, 'X'), + (0xB4B, 'V'), + (0xB4E, 'X'), + (0xB56, 'V'), + (0xB58, 'X'), + (0xB5C, 'M', u'ଡ଼'), + (0xB5D, 'M', u'ଢ଼'), + (0xB5E, 'X'), + (0xB5F, 'V'), + (0xB64, 'X'), + (0xB66, 'V'), + (0xB78, 'X'), + (0xB82, 'V'), + (0xB84, 'X'), + (0xB85, 'V'), + (0xB8B, 'X'), + (0xB8E, 'V'), + (0xB91, 'X'), + (0xB92, 'V'), + (0xB96, 'X'), + (0xB99, 'V'), + (0xB9B, 'X'), + (0xB9C, 'V'), + (0xB9D, 'X'), + (0xB9E, 'V'), + (0xBA0, 'X'), + (0xBA3, 'V'), + (0xBA5, 'X'), + (0xBA8, 'V'), + (0xBAB, 'X'), + (0xBAE, 'V'), + (0xBBA, 'X'), + (0xBBE, 'V'), + (0xBC3, 'X'), + (0xBC6, 'V'), + (0xBC9, 'X'), + (0xBCA, 'V'), + (0xBCE, 'X'), + (0xBD0, 'V'), + (0xBD1, 'X'), + (0xBD7, 'V'), + (0xBD8, 'X'), + (0xBE6, 'V'), + (0xBFB, 'X'), + (0xC01, 'V'), + (0xC04, 'X'), + (0xC05, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + (0xC29, 'X'), + (0xC2A, 'V'), + (0xC34, 'X'), + (0xC35, 'V'), + ] + +def _seg_12(): + return [ + (0xC3A, 'X'), + (0xC3D, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), + (0xC4A, 'V'), + (0xC4E, 'X'), + (0xC55, 'V'), + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5A, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), + (0xC70, 'X'), + (0xC78, 'V'), + (0xC80, 'X'), + (0xC82, 'V'), + (0xC84, 'X'), + (0xC85, 'V'), + (0xC8D, 'X'), + (0xC8E, 'V'), + (0xC91, 'X'), + (0xC92, 'V'), + (0xCA9, 'X'), + (0xCAA, 'V'), + (0xCB4, 'X'), + (0xCB5, 'V'), + (0xCBA, 'X'), + (0xCBC, 'V'), + (0xCC5, 'X'), + (0xCC6, 'V'), + (0xCC9, 'X'), + (0xCCA, 'V'), + (0xCCE, 'X'), + (0xCD5, 'V'), + (0xCD7, 'X'), + (0xCDE, 'V'), + (0xCDF, 'X'), + (0xCE0, 'V'), + (0xCE4, 'X'), + (0xCE6, 'V'), + (0xCF0, 'X'), + (0xCF1, 'V'), + (0xCF3, 'X'), + (0xD02, 'V'), + (0xD04, 'X'), + (0xD05, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), + (0xD11, 'X'), + (0xD12, 'V'), + (0xD3B, 'X'), + (0xD3D, 'V'), + (0xD45, 'X'), + (0xD46, 'V'), + (0xD49, 'X'), + (0xD4A, 'V'), + (0xD4F, 'X'), + (0xD57, 'V'), + (0xD58, 'X'), + (0xD60, 'V'), + (0xD64, 'X'), + (0xD66, 'V'), + (0xD76, 'X'), + (0xD79, 'V'), + (0xD80, 'X'), + (0xD82, 'V'), + (0xD84, 'X'), + (0xD85, 'V'), + (0xD97, 'X'), + (0xD9A, 'V'), + (0xDB2, 'X'), + (0xDB3, 'V'), + (0xDBC, 'X'), + (0xDBD, 'V'), + (0xDBE, 'X'), + (0xDC0, 'V'), + (0xDC7, 'X'), + (0xDCA, 'V'), + (0xDCB, 'X'), + (0xDCF, 'V'), + (0xDD5, 'X'), + (0xDD6, 'V'), + (0xDD7, 'X'), + (0xDD8, 'V'), + (0xDE0, 'X'), + (0xDF2, 'V'), + (0xDF5, 'X'), + (0xE01, 'V'), + (0xE33, 'M', u'ํา'), + (0xE34, 'V'), + (0xE3B, 'X'), + (0xE3F, 'V'), + (0xE5C, 'X'), + (0xE81, 'V'), + (0xE83, 'X'), + (0xE84, 'V'), + (0xE85, 'X'), + (0xE87, 'V'), + ] + +def _seg_13(): + return [ + (0xE89, 'X'), + (0xE8A, 'V'), + (0xE8B, 'X'), + (0xE8D, 'V'), + (0xE8E, 'X'), + (0xE94, 'V'), + (0xE98, 'X'), + (0xE99, 'V'), + (0xEA0, 'X'), + (0xEA1, 'V'), + (0xEA4, 'X'), + (0xEA5, 'V'), + (0xEA6, 'X'), + (0xEA7, 'V'), + (0xEA8, 'X'), + (0xEAA, 'V'), + (0xEAC, 'X'), + (0xEAD, 'V'), + (0xEB3, 'M', u'ໍາ'), + (0xEB4, 'V'), + (0xEBA, 'X'), + (0xEBB, 'V'), + (0xEBE, 'X'), + (0xEC0, 'V'), + (0xEC5, 'X'), + (0xEC6, 'V'), + (0xEC7, 'X'), + (0xEC8, 'V'), + (0xECE, 'X'), + (0xED0, 'V'), + (0xEDA, 'X'), + (0xEDC, 'M', u'ຫນ'), + (0xEDD, 'M', u'ຫມ'), + (0xEDE, 'V'), + (0xEE0, 'X'), + (0xF00, 'V'), + (0xF0C, 'M', u'་'), + (0xF0D, 'V'), + (0xF43, 'M', u'གྷ'), + (0xF44, 'V'), + (0xF48, 'X'), + (0xF49, 'V'), + (0xF4D, 'M', u'ཌྷ'), + (0xF4E, 'V'), + (0xF52, 'M', u'དྷ'), + (0xF53, 'V'), + (0xF57, 'M', u'བྷ'), + (0xF58, 'V'), + (0xF5C, 'M', u'ཛྷ'), + (0xF5D, 'V'), + (0xF69, 'M', u'ཀྵ'), + (0xF6A, 'V'), + (0xF6D, 'X'), + (0xF71, 'V'), + (0xF73, 'M', u'ཱི'), + (0xF74, 'V'), + (0xF75, 'M', u'ཱུ'), + (0xF76, 'M', u'ྲྀ'), + (0xF77, 'M', u'ྲཱྀ'), + (0xF78, 'M', u'ླྀ'), + (0xF79, 'M', u'ླཱྀ'), + (0xF7A, 'V'), + (0xF81, 'M', u'ཱྀ'), + (0xF82, 'V'), + (0xF93, 'M', u'ྒྷ'), + (0xF94, 'V'), + (0xF98, 'X'), + (0xF99, 'V'), + (0xF9D, 'M', u'ྜྷ'), + (0xF9E, 'V'), + (0xFA2, 'M', u'ྡྷ'), + (0xFA3, 'V'), + (0xFA7, 'M', u'ྦྷ'), + (0xFA8, 'V'), + (0xFAC, 'M', u'ྫྷ'), + (0xFAD, 'V'), + (0xFB9, 'M', u'ྐྵ'), + (0xFBA, 'V'), + (0xFBD, 'X'), + (0xFBE, 'V'), + (0xFCD, 'X'), + (0xFCE, 'V'), + (0xFDB, 'X'), + (0x1000, 'V'), + (0x10A0, 'X'), + (0x10C7, 'M', u'ⴧ'), + (0x10C8, 'X'), + (0x10CD, 'M', u'ⴭ'), + (0x10CE, 'X'), + (0x10D0, 'V'), + (0x10FC, 'M', u'ნ'), + (0x10FD, 'V'), + (0x115F, 'X'), + (0x1161, 'V'), + (0x1249, 'X'), + (0x124A, 'V'), + (0x124E, 'X'), + (0x1250, 'V'), + (0x1257, 'X'), + (0x1258, 'V'), + ] + +def _seg_14(): + return [ + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + (0x128E, 'X'), + (0x1290, 'V'), + (0x12B1, 'X'), + (0x12B2, 'V'), + (0x12B6, 'X'), + (0x12B8, 'V'), + (0x12BF, 'X'), + (0x12C0, 'V'), + (0x12C1, 'X'), + (0x12C2, 'V'), + (0x12C6, 'X'), + (0x12C8, 'V'), + (0x12D7, 'X'), + (0x12D8, 'V'), + (0x1311, 'X'), + (0x1312, 'V'), + (0x1316, 'X'), + (0x1318, 'V'), + (0x135B, 'X'), + (0x135D, 'V'), + (0x137D, 'X'), + (0x1380, 'V'), + (0x139A, 'X'), + (0x13A0, 'V'), + (0x13F5, 'X'), + (0x1400, 'V'), + (0x1680, 'X'), + (0x1681, 'V'), + (0x169D, 'X'), + (0x16A0, 'V'), + (0x16F1, 'X'), + (0x1700, 'V'), + (0x170D, 'X'), + (0x170E, 'V'), + (0x1715, 'X'), + (0x1720, 'V'), + (0x1737, 'X'), + (0x1740, 'V'), + (0x1754, 'X'), + (0x1760, 'V'), + (0x176D, 'X'), + (0x176E, 'V'), + (0x1771, 'X'), + (0x1772, 'V'), + (0x1774, 'X'), + (0x1780, 'V'), + (0x17B4, 'X'), + (0x17B6, 'V'), + (0x17DE, 'X'), + (0x17E0, 'V'), + (0x17EA, 'X'), + (0x17F0, 'V'), + (0x17FA, 'X'), + (0x1800, 'V'), + (0x1806, 'X'), + (0x1807, 'V'), + (0x180B, 'I'), + (0x180E, 'X'), + (0x1810, 'V'), + (0x181A, 'X'), + (0x1820, 'V'), + (0x1878, 'X'), + (0x1880, 'V'), + (0x18AB, 'X'), + (0x18B0, 'V'), + (0x18F6, 'X'), + (0x1900, 'V'), + (0x191D, 'X'), + (0x1920, 'V'), + (0x192C, 'X'), + (0x1930, 'V'), + (0x193C, 'X'), + (0x1940, 'V'), + (0x1941, 'X'), + (0x1944, 'V'), + (0x196E, 'X'), + (0x1970, 'V'), + (0x1975, 'X'), + (0x1980, 'V'), + (0x19AC, 'X'), + (0x19B0, 'V'), + (0x19CA, 'X'), + (0x19D0, 'V'), + (0x19DB, 'X'), + (0x19DE, 'V'), + (0x1A1C, 'X'), + (0x1A1E, 'V'), + (0x1A5F, 'X'), + (0x1A60, 'V'), + (0x1A7D, 'X'), + (0x1A7F, 'V'), + (0x1A8A, 'X'), + (0x1A90, 'V'), + (0x1A9A, 'X'), + ] + +def _seg_15(): + return [ + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1B00, 'V'), + (0x1B4C, 'X'), + (0x1B50, 'V'), + (0x1B7D, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'X'), + (0x1CC0, 'V'), + (0x1CC8, 'X'), + (0x1CD0, 'V'), + (0x1CF7, 'X'), + (0x1D00, 'V'), + (0x1D2C, 'M', u'a'), + (0x1D2D, 'M', u'æ'), + (0x1D2E, 'M', u'b'), + (0x1D2F, 'V'), + (0x1D30, 'M', u'd'), + (0x1D31, 'M', u'e'), + (0x1D32, 'M', u'ǝ'), + (0x1D33, 'M', u'g'), + (0x1D34, 'M', u'h'), + (0x1D35, 'M', u'i'), + (0x1D36, 'M', u'j'), + (0x1D37, 'M', u'k'), + (0x1D38, 'M', u'l'), + (0x1D39, 'M', u'm'), + (0x1D3A, 'M', u'n'), + (0x1D3B, 'V'), + (0x1D3C, 'M', u'o'), + (0x1D3D, 'M', u'ȣ'), + (0x1D3E, 'M', u'p'), + (0x1D3F, 'M', u'r'), + (0x1D40, 'M', u't'), + (0x1D41, 'M', u'u'), + (0x1D42, 'M', u'w'), + (0x1D43, 'M', u'a'), + (0x1D44, 'M', u'ɐ'), + (0x1D45, 'M', u'ɑ'), + (0x1D46, 'M', u'ᴂ'), + (0x1D47, 'M', u'b'), + (0x1D48, 'M', u'd'), + (0x1D49, 'M', u'e'), + (0x1D4A, 'M', u'ə'), + (0x1D4B, 'M', u'ɛ'), + (0x1D4C, 'M', u'ɜ'), + (0x1D4D, 'M', u'g'), + (0x1D4E, 'V'), + (0x1D4F, 'M', u'k'), + (0x1D50, 'M', u'm'), + (0x1D51, 'M', u'ŋ'), + (0x1D52, 'M', u'o'), + (0x1D53, 'M', u'ɔ'), + (0x1D54, 'M', u'ᴖ'), + (0x1D55, 'M', u'ᴗ'), + (0x1D56, 'M', u'p'), + (0x1D57, 'M', u't'), + (0x1D58, 'M', u'u'), + (0x1D59, 'M', u'ᴝ'), + (0x1D5A, 'M', u'ɯ'), + (0x1D5B, 'M', u'v'), + (0x1D5C, 'M', u'ᴥ'), + (0x1D5D, 'M', u'β'), + (0x1D5E, 'M', u'γ'), + (0x1D5F, 'M', u'δ'), + (0x1D60, 'M', u'φ'), + (0x1D61, 'M', u'χ'), + (0x1D62, 'M', u'i'), + (0x1D63, 'M', u'r'), + (0x1D64, 'M', u'u'), + (0x1D65, 'M', u'v'), + (0x1D66, 'M', u'β'), + (0x1D67, 'M', u'γ'), + (0x1D68, 'M', u'ρ'), + (0x1D69, 'M', u'φ'), + (0x1D6A, 'M', u'χ'), + (0x1D6B, 'V'), + (0x1D78, 'M', u'н'), + (0x1D79, 'V'), + (0x1D9B, 'M', u'ɒ'), + (0x1D9C, 'M', u'c'), + (0x1D9D, 'M', u'ɕ'), + (0x1D9E, 'M', u'ð'), + (0x1D9F, 'M', u'ɜ'), + (0x1DA0, 'M', u'f'), + (0x1DA1, 'M', u'ɟ'), + (0x1DA2, 'M', u'ɡ'), + (0x1DA3, 'M', u'ɥ'), + (0x1DA4, 'M', u'ɨ'), + (0x1DA5, 'M', u'ɩ'), + (0x1DA6, 'M', u'ɪ'), + (0x1DA7, 'M', u'ᵻ'), + (0x1DA8, 'M', u'ʝ'), + (0x1DA9, 'M', u'ɭ'), + ] + +def _seg_16(): + return [ + (0x1DAA, 'M', u'ᶅ'), + (0x1DAB, 'M', u'ʟ'), + (0x1DAC, 'M', u'ɱ'), + (0x1DAD, 'M', u'ɰ'), + (0x1DAE, 'M', u'ɲ'), + (0x1DAF, 'M', u'ɳ'), + (0x1DB0, 'M', u'ɴ'), + (0x1DB1, 'M', u'ɵ'), + (0x1DB2, 'M', u'ɸ'), + (0x1DB3, 'M', u'ʂ'), + (0x1DB4, 'M', u'ʃ'), + (0x1DB5, 'M', u'ƫ'), + (0x1DB6, 'M', u'ʉ'), + (0x1DB7, 'M', u'ʊ'), + (0x1DB8, 'M', u'ᴜ'), + (0x1DB9, 'M', u'ʋ'), + (0x1DBA, 'M', u'ʌ'), + (0x1DBB, 'M', u'z'), + (0x1DBC, 'M', u'ʐ'), + (0x1DBD, 'M', u'ʑ'), + (0x1DBE, 'M', u'ʒ'), + (0x1DBF, 'M', u'θ'), + (0x1DC0, 'V'), + (0x1DE7, 'X'), + (0x1DFC, 'V'), + (0x1E00, 'M', u'ḁ'), + (0x1E01, 'V'), + (0x1E02, 'M', u'ḃ'), + (0x1E03, 'V'), + (0x1E04, 'M', u'ḅ'), + (0x1E05, 'V'), + (0x1E06, 'M', u'ḇ'), + (0x1E07, 'V'), + (0x1E08, 'M', u'ḉ'), + (0x1E09, 'V'), + (0x1E0A, 'M', u'ḋ'), + (0x1E0B, 'V'), + (0x1E0C, 'M', u'ḍ'), + (0x1E0D, 'V'), + (0x1E0E, 'M', u'ḏ'), + (0x1E0F, 'V'), + (0x1E10, 'M', u'ḑ'), + (0x1E11, 'V'), + (0x1E12, 'M', u'ḓ'), + (0x1E13, 'V'), + (0x1E14, 'M', u'ḕ'), + (0x1E15, 'V'), + (0x1E16, 'M', u'ḗ'), + (0x1E17, 'V'), + (0x1E18, 'M', u'ḙ'), + (0x1E19, 'V'), + (0x1E1A, 'M', u'ḛ'), + (0x1E1B, 'V'), + (0x1E1C, 'M', u'ḝ'), + (0x1E1D, 'V'), + (0x1E1E, 'M', u'ḟ'), + (0x1E1F, 'V'), + (0x1E20, 'M', u'ḡ'), + (0x1E21, 'V'), + (0x1E22, 'M', u'ḣ'), + (0x1E23, 'V'), + (0x1E24, 'M', u'ḥ'), + (0x1E25, 'V'), + (0x1E26, 'M', u'ḧ'), + (0x1E27, 'V'), + (0x1E28, 'M', u'ḩ'), + (0x1E29, 'V'), + (0x1E2A, 'M', u'ḫ'), + (0x1E2B, 'V'), + (0x1E2C, 'M', u'ḭ'), + (0x1E2D, 'V'), + (0x1E2E, 'M', u'ḯ'), + (0x1E2F, 'V'), + (0x1E30, 'M', u'ḱ'), + (0x1E31, 'V'), + (0x1E32, 'M', u'ḳ'), + (0x1E33, 'V'), + (0x1E34, 'M', u'ḵ'), + (0x1E35, 'V'), + (0x1E36, 'M', u'ḷ'), + (0x1E37, 'V'), + (0x1E38, 'M', u'ḹ'), + (0x1E39, 'V'), + (0x1E3A, 'M', u'ḻ'), + (0x1E3B, 'V'), + (0x1E3C, 'M', u'ḽ'), + (0x1E3D, 'V'), + (0x1E3E, 'M', u'ḿ'), + (0x1E3F, 'V'), + (0x1E40, 'M', u'ṁ'), + (0x1E41, 'V'), + (0x1E42, 'M', u'ṃ'), + (0x1E43, 'V'), + (0x1E44, 'M', u'ṅ'), + (0x1E45, 'V'), + (0x1E46, 'M', u'ṇ'), + (0x1E47, 'V'), + (0x1E48, 'M', u'ṉ'), + (0x1E49, 'V'), + (0x1E4A, 'M', u'ṋ'), + ] + +def _seg_17(): + return [ + (0x1E4B, 'V'), + (0x1E4C, 'M', u'ṍ'), + (0x1E4D, 'V'), + (0x1E4E, 'M', u'ṏ'), + (0x1E4F, 'V'), + (0x1E50, 'M', u'ṑ'), + (0x1E51, 'V'), + (0x1E52, 'M', u'ṓ'), + (0x1E53, 'V'), + (0x1E54, 'M', u'ṕ'), + (0x1E55, 'V'), + (0x1E56, 'M', u'ṗ'), + (0x1E57, 'V'), + (0x1E58, 'M', u'ṙ'), + (0x1E59, 'V'), + (0x1E5A, 'M', u'ṛ'), + (0x1E5B, 'V'), + (0x1E5C, 'M', u'ṝ'), + (0x1E5D, 'V'), + (0x1E5E, 'M', u'ṟ'), + (0x1E5F, 'V'), + (0x1E60, 'M', u'ṡ'), + (0x1E61, 'V'), + (0x1E62, 'M', u'ṣ'), + (0x1E63, 'V'), + (0x1E64, 'M', u'ṥ'), + (0x1E65, 'V'), + (0x1E66, 'M', u'ṧ'), + (0x1E67, 'V'), + (0x1E68, 'M', u'ṩ'), + (0x1E69, 'V'), + (0x1E6A, 'M', u'ṫ'), + (0x1E6B, 'V'), + (0x1E6C, 'M', u'ṭ'), + (0x1E6D, 'V'), + (0x1E6E, 'M', u'ṯ'), + (0x1E6F, 'V'), + (0x1E70, 'M', u'ṱ'), + (0x1E71, 'V'), + (0x1E72, 'M', u'ṳ'), + (0x1E73, 'V'), + (0x1E74, 'M', u'ṵ'), + (0x1E75, 'V'), + (0x1E76, 'M', u'ṷ'), + (0x1E77, 'V'), + (0x1E78, 'M', u'ṹ'), + (0x1E79, 'V'), + (0x1E7A, 'M', u'ṻ'), + (0x1E7B, 'V'), + (0x1E7C, 'M', u'ṽ'), + (0x1E7D, 'V'), + (0x1E7E, 'M', u'ṿ'), + (0x1E7F, 'V'), + (0x1E80, 'M', u'ẁ'), + (0x1E81, 'V'), + (0x1E82, 'M', u'ẃ'), + (0x1E83, 'V'), + (0x1E84, 'M', u'ẅ'), + (0x1E85, 'V'), + (0x1E86, 'M', u'ẇ'), + (0x1E87, 'V'), + (0x1E88, 'M', u'ẉ'), + (0x1E89, 'V'), + (0x1E8A, 'M', u'ẋ'), + (0x1E8B, 'V'), + (0x1E8C, 'M', u'ẍ'), + (0x1E8D, 'V'), + (0x1E8E, 'M', u'ẏ'), + (0x1E8F, 'V'), + (0x1E90, 'M', u'ẑ'), + (0x1E91, 'V'), + (0x1E92, 'M', u'ẓ'), + (0x1E93, 'V'), + (0x1E94, 'M', u'ẕ'), + (0x1E95, 'V'), + (0x1E9A, 'M', u'aʾ'), + (0x1E9B, 'M', u'ṡ'), + (0x1E9C, 'V'), + (0x1E9E, 'M', u'ss'), + (0x1E9F, 'V'), + (0x1EA0, 'M', u'ạ'), + (0x1EA1, 'V'), + (0x1EA2, 'M', u'ả'), + (0x1EA3, 'V'), + (0x1EA4, 'M', u'ấ'), + (0x1EA5, 'V'), + (0x1EA6, 'M', u'ầ'), + (0x1EA7, 'V'), + (0x1EA8, 'M', u'ẩ'), + (0x1EA9, 'V'), + (0x1EAA, 'M', u'ẫ'), + (0x1EAB, 'V'), + (0x1EAC, 'M', u'ậ'), + (0x1EAD, 'V'), + (0x1EAE, 'M', u'ắ'), + (0x1EAF, 'V'), + (0x1EB0, 'M', u'ằ'), + (0x1EB1, 'V'), + (0x1EB2, 'M', u'ẳ'), + (0x1EB3, 'V'), + ] + +def _seg_18(): + return [ + (0x1EB4, 'M', u'ẵ'), + (0x1EB5, 'V'), + (0x1EB6, 'M', u'ặ'), + (0x1EB7, 'V'), + (0x1EB8, 'M', u'ẹ'), + (0x1EB9, 'V'), + (0x1EBA, 'M', u'ẻ'), + (0x1EBB, 'V'), + (0x1EBC, 'M', u'ẽ'), + (0x1EBD, 'V'), + (0x1EBE, 'M', u'ế'), + (0x1EBF, 'V'), + (0x1EC0, 'M', u'ề'), + (0x1EC1, 'V'), + (0x1EC2, 'M', u'ể'), + (0x1EC3, 'V'), + (0x1EC4, 'M', u'ễ'), + (0x1EC5, 'V'), + (0x1EC6, 'M', u'ệ'), + (0x1EC7, 'V'), + (0x1EC8, 'M', u'ỉ'), + (0x1EC9, 'V'), + (0x1ECA, 'M', u'ị'), + (0x1ECB, 'V'), + (0x1ECC, 'M', u'ọ'), + (0x1ECD, 'V'), + (0x1ECE, 'M', u'ỏ'), + (0x1ECF, 'V'), + (0x1ED0, 'M', u'ố'), + (0x1ED1, 'V'), + (0x1ED2, 'M', u'ồ'), + (0x1ED3, 'V'), + (0x1ED4, 'M', u'ổ'), + (0x1ED5, 'V'), + (0x1ED6, 'M', u'ỗ'), + (0x1ED7, 'V'), + (0x1ED8, 'M', u'ộ'), + (0x1ED9, 'V'), + (0x1EDA, 'M', u'ớ'), + (0x1EDB, 'V'), + (0x1EDC, 'M', u'ờ'), + (0x1EDD, 'V'), + (0x1EDE, 'M', u'ở'), + (0x1EDF, 'V'), + (0x1EE0, 'M', u'ỡ'), + (0x1EE1, 'V'), + (0x1EE2, 'M', u'ợ'), + (0x1EE3, 'V'), + (0x1EE4, 'M', u'ụ'), + (0x1EE5, 'V'), + (0x1EE6, 'M', u'ủ'), + (0x1EE7, 'V'), + (0x1EE8, 'M', u'ứ'), + (0x1EE9, 'V'), + (0x1EEA, 'M', u'ừ'), + (0x1EEB, 'V'), + (0x1EEC, 'M', u'ử'), + (0x1EED, 'V'), + (0x1EEE, 'M', u'ữ'), + (0x1EEF, 'V'), + (0x1EF0, 'M', u'ự'), + (0x1EF1, 'V'), + (0x1EF2, 'M', u'ỳ'), + (0x1EF3, 'V'), + (0x1EF4, 'M', u'ỵ'), + (0x1EF5, 'V'), + (0x1EF6, 'M', u'ỷ'), + (0x1EF7, 'V'), + (0x1EF8, 'M', u'ỹ'), + (0x1EF9, 'V'), + (0x1EFA, 'M', u'ỻ'), + (0x1EFB, 'V'), + (0x1EFC, 'M', u'ỽ'), + (0x1EFD, 'V'), + (0x1EFE, 'M', u'ỿ'), + (0x1EFF, 'V'), + (0x1F08, 'M', u'ἀ'), + (0x1F09, 'M', u'ἁ'), + (0x1F0A, 'M', u'ἂ'), + (0x1F0B, 'M', u'ἃ'), + (0x1F0C, 'M', u'ἄ'), + (0x1F0D, 'M', u'ἅ'), + (0x1F0E, 'M', u'ἆ'), + (0x1F0F, 'M', u'ἇ'), + (0x1F10, 'V'), + (0x1F16, 'X'), + (0x1F18, 'M', u'ἐ'), + (0x1F19, 'M', u'ἑ'), + (0x1F1A, 'M', u'ἒ'), + (0x1F1B, 'M', u'ἓ'), + (0x1F1C, 'M', u'ἔ'), + (0x1F1D, 'M', u'ἕ'), + (0x1F1E, 'X'), + (0x1F20, 'V'), + (0x1F28, 'M', u'ἠ'), + (0x1F29, 'M', u'ἡ'), + (0x1F2A, 'M', u'ἢ'), + (0x1F2B, 'M', u'ἣ'), + (0x1F2C, 'M', u'ἤ'), + (0x1F2D, 'M', u'ἥ'), + ] + +def _seg_19(): + return [ + (0x1F2E, 'M', u'ἦ'), + (0x1F2F, 'M', u'ἧ'), + (0x1F30, 'V'), + (0x1F38, 'M', u'ἰ'), + (0x1F39, 'M', u'ἱ'), + (0x1F3A, 'M', u'ἲ'), + (0x1F3B, 'M', u'ἳ'), + (0x1F3C, 'M', u'ἴ'), + (0x1F3D, 'M', u'ἵ'), + (0x1F3E, 'M', u'ἶ'), + (0x1F3F, 'M', u'ἷ'), + (0x1F40, 'V'), + (0x1F46, 'X'), + (0x1F48, 'M', u'ὀ'), + (0x1F49, 'M', u'ὁ'), + (0x1F4A, 'M', u'ὂ'), + (0x1F4B, 'M', u'ὃ'), + (0x1F4C, 'M', u'ὄ'), + (0x1F4D, 'M', u'ὅ'), + (0x1F4E, 'X'), + (0x1F50, 'V'), + (0x1F58, 'X'), + (0x1F59, 'M', u'ὑ'), + (0x1F5A, 'X'), + (0x1F5B, 'M', u'ὓ'), + (0x1F5C, 'X'), + (0x1F5D, 'M', u'ὕ'), + (0x1F5E, 'X'), + (0x1F5F, 'M', u'ὗ'), + (0x1F60, 'V'), + (0x1F68, 'M', u'ὠ'), + (0x1F69, 'M', u'ὡ'), + (0x1F6A, 'M', u'ὢ'), + (0x1F6B, 'M', u'ὣ'), + (0x1F6C, 'M', u'ὤ'), + (0x1F6D, 'M', u'ὥ'), + (0x1F6E, 'M', u'ὦ'), + (0x1F6F, 'M', u'ὧ'), + (0x1F70, 'V'), + (0x1F71, 'M', u'ά'), + (0x1F72, 'V'), + (0x1F73, 'M', u'έ'), + (0x1F74, 'V'), + (0x1F75, 'M', u'ή'), + (0x1F76, 'V'), + (0x1F77, 'M', u'ί'), + (0x1F78, 'V'), + (0x1F79, 'M', u'ό'), + (0x1F7A, 'V'), + (0x1F7B, 'M', u'ύ'), + (0x1F7C, 'V'), + (0x1F7D, 'M', u'ώ'), + (0x1F7E, 'X'), + (0x1F80, 'M', u'ἀι'), + (0x1F81, 'M', u'ἁι'), + (0x1F82, 'M', u'ἂι'), + (0x1F83, 'M', u'ἃι'), + (0x1F84, 'M', u'ἄι'), + (0x1F85, 'M', u'ἅι'), + (0x1F86, 'M', u'ἆι'), + (0x1F87, 'M', u'ἇι'), + (0x1F88, 'M', u'ἀι'), + (0x1F89, 'M', u'ἁι'), + (0x1F8A, 'M', u'ἂι'), + (0x1F8B, 'M', u'ἃι'), + (0x1F8C, 'M', u'ἄι'), + (0x1F8D, 'M', u'ἅι'), + (0x1F8E, 'M', u'ἆι'), + (0x1F8F, 'M', u'ἇι'), + (0x1F90, 'M', u'ἠι'), + (0x1F91, 'M', u'ἡι'), + (0x1F92, 'M', u'ἢι'), + (0x1F93, 'M', u'ἣι'), + (0x1F94, 'M', u'ἤι'), + (0x1F95, 'M', u'ἥι'), + (0x1F96, 'M', u'ἦι'), + (0x1F97, 'M', u'ἧι'), + (0x1F98, 'M', u'ἠι'), + (0x1F99, 'M', u'ἡι'), + (0x1F9A, 'M', u'ἢι'), + (0x1F9B, 'M', u'ἣι'), + (0x1F9C, 'M', u'ἤι'), + (0x1F9D, 'M', u'ἥι'), + (0x1F9E, 'M', u'ἦι'), + (0x1F9F, 'M', u'ἧι'), + (0x1FA0, 'M', u'ὠι'), + (0x1FA1, 'M', u'ὡι'), + (0x1FA2, 'M', u'ὢι'), + (0x1FA3, 'M', u'ὣι'), + (0x1FA4, 'M', u'ὤι'), + (0x1FA5, 'M', u'ὥι'), + (0x1FA6, 'M', u'ὦι'), + (0x1FA7, 'M', u'ὧι'), + (0x1FA8, 'M', u'ὠι'), + (0x1FA9, 'M', u'ὡι'), + (0x1FAA, 'M', u'ὢι'), + (0x1FAB, 'M', u'ὣι'), + (0x1FAC, 'M', u'ὤι'), + (0x1FAD, 'M', u'ὥι'), + (0x1FAE, 'M', u'ὦι'), + ] + +def _seg_20(): + return [ + (0x1FAF, 'M', u'ὧι'), + (0x1FB0, 'V'), + (0x1FB2, 'M', u'ὰι'), + (0x1FB3, 'M', u'αι'), + (0x1FB4, 'M', u'άι'), + (0x1FB5, 'X'), + (0x1FB6, 'V'), + (0x1FB7, 'M', u'ᾶι'), + (0x1FB8, 'M', u'ᾰ'), + (0x1FB9, 'M', u'ᾱ'), + (0x1FBA, 'M', u'ὰ'), + (0x1FBB, 'M', u'ά'), + (0x1FBC, 'M', u'αι'), + (0x1FBD, '3', u' ̓'), + (0x1FBE, 'M', u'ι'), + (0x1FBF, '3', u' ̓'), + (0x1FC0, '3', u' ͂'), + (0x1FC1, '3', u' ̈͂'), + (0x1FC2, 'M', u'ὴι'), + (0x1FC3, 'M', u'ηι'), + (0x1FC4, 'M', u'ήι'), + (0x1FC5, 'X'), + (0x1FC6, 'V'), + (0x1FC7, 'M', u'ῆι'), + (0x1FC8, 'M', u'ὲ'), + (0x1FC9, 'M', u'έ'), + (0x1FCA, 'M', u'ὴ'), + (0x1FCB, 'M', u'ή'), + (0x1FCC, 'M', u'ηι'), + (0x1FCD, '3', u' ̓̀'), + (0x1FCE, '3', u' ̓́'), + (0x1FCF, '3', u' ̓͂'), + (0x1FD0, 'V'), + (0x1FD3, 'M', u'ΐ'), + (0x1FD4, 'X'), + (0x1FD6, 'V'), + (0x1FD8, 'M', u'ῐ'), + (0x1FD9, 'M', u'ῑ'), + (0x1FDA, 'M', u'ὶ'), + (0x1FDB, 'M', u'ί'), + (0x1FDC, 'X'), + (0x1FDD, '3', u' ̔̀'), + (0x1FDE, '3', u' ̔́'), + (0x1FDF, '3', u' ̔͂'), + (0x1FE0, 'V'), + (0x1FE3, 'M', u'ΰ'), + (0x1FE4, 'V'), + (0x1FE8, 'M', u'ῠ'), + (0x1FE9, 'M', u'ῡ'), + (0x1FEA, 'M', u'ὺ'), + (0x1FEB, 'M', u'ύ'), + (0x1FEC, 'M', u'ῥ'), + (0x1FED, '3', u' ̈̀'), + (0x1FEE, '3', u' ̈́'), + (0x1FEF, '3', u'`'), + (0x1FF0, 'X'), + (0x1FF2, 'M', u'ὼι'), + (0x1FF3, 'M', u'ωι'), + (0x1FF4, 'M', u'ώι'), + (0x1FF5, 'X'), + (0x1FF6, 'V'), + (0x1FF7, 'M', u'ῶι'), + (0x1FF8, 'M', u'ὸ'), + (0x1FF9, 'M', u'ό'), + (0x1FFA, 'M', u'ὼ'), + (0x1FFB, 'M', u'ώ'), + (0x1FFC, 'M', u'ωι'), + (0x1FFD, '3', u' ́'), + (0x1FFE, '3', u' ̔'), + (0x1FFF, 'X'), + (0x2000, '3', u' '), + (0x200B, 'I'), + (0x200C, 'D', u''), + (0x200E, 'X'), + (0x2010, 'V'), + (0x2011, 'M', u'‐'), + (0x2012, 'V'), + (0x2017, '3', u' ̳'), + (0x2018, 'V'), + (0x2024, 'X'), + (0x2027, 'V'), + (0x2028, 'X'), + (0x202F, '3', u' '), + (0x2030, 'V'), + (0x2033, 'M', u'′′'), + (0x2034, 'M', u'′′′'), + (0x2035, 'V'), + (0x2036, 'M', u'‵‵'), + (0x2037, 'M', u'‵‵‵'), + (0x2038, 'V'), + (0x203C, '3', u'!!'), + (0x203D, 'V'), + (0x203E, '3', u' ̅'), + (0x203F, 'V'), + (0x2047, '3', u'??'), + (0x2048, '3', u'?!'), + (0x2049, '3', u'!?'), + (0x204A, 'V'), + (0x2057, 'M', u'′′′′'), + (0x2058, 'V'), + ] + +def _seg_21(): + return [ + (0x205F, '3', u' '), + (0x2060, 'I'), + (0x2061, 'X'), + (0x2064, 'I'), + (0x2065, 'X'), + (0x2070, 'M', u'0'), + (0x2071, 'M', u'i'), + (0x2072, 'X'), + (0x2074, 'M', u'4'), + (0x2075, 'M', u'5'), + (0x2076, 'M', u'6'), + (0x2077, 'M', u'7'), + (0x2078, 'M', u'8'), + (0x2079, 'M', u'9'), + (0x207A, '3', u'+'), + (0x207B, 'M', u'−'), + (0x207C, '3', u'='), + (0x207D, '3', u'('), + (0x207E, '3', u')'), + (0x207F, 'M', u'n'), + (0x2080, 'M', u'0'), + (0x2081, 'M', u'1'), + (0x2082, 'M', u'2'), + (0x2083, 'M', u'3'), + (0x2084, 'M', u'4'), + (0x2085, 'M', u'5'), + (0x2086, 'M', u'6'), + (0x2087, 'M', u'7'), + (0x2088, 'M', u'8'), + (0x2089, 'M', u'9'), + (0x208A, '3', u'+'), + (0x208B, 'M', u'−'), + (0x208C, '3', u'='), + (0x208D, '3', u'('), + (0x208E, '3', u')'), + (0x208F, 'X'), + (0x2090, 'M', u'a'), + (0x2091, 'M', u'e'), + (0x2092, 'M', u'o'), + (0x2093, 'M', u'x'), + (0x2094, 'M', u'ə'), + (0x2095, 'M', u'h'), + (0x2096, 'M', u'k'), + (0x2097, 'M', u'l'), + (0x2098, 'M', u'm'), + (0x2099, 'M', u'n'), + (0x209A, 'M', u'p'), + (0x209B, 'M', u's'), + (0x209C, 'M', u't'), + (0x209D, 'X'), + (0x20A0, 'V'), + (0x20A8, 'M', u'rs'), + (0x20A9, 'V'), + (0x20BB, 'X'), + (0x20D0, 'V'), + (0x20F1, 'X'), + (0x2100, '3', u'a/c'), + (0x2101, '3', u'a/s'), + (0x2102, 'M', u'c'), + (0x2103, 'M', u'°c'), + (0x2104, 'V'), + (0x2105, '3', u'c/o'), + (0x2106, '3', u'c/u'), + (0x2107, 'M', u'ɛ'), + (0x2108, 'V'), + (0x2109, 'M', u'°f'), + (0x210A, 'M', u'g'), + (0x210B, 'M', u'h'), + (0x210F, 'M', u'ħ'), + (0x2110, 'M', u'i'), + (0x2112, 'M', u'l'), + (0x2114, 'V'), + (0x2115, 'M', u'n'), + (0x2116, 'M', u'no'), + (0x2117, 'V'), + (0x2119, 'M', u'p'), + (0x211A, 'M', u'q'), + (0x211B, 'M', u'r'), + (0x211E, 'V'), + (0x2120, 'M', u'sm'), + (0x2121, 'M', u'tel'), + (0x2122, 'M', u'tm'), + (0x2123, 'V'), + (0x2124, 'M', u'z'), + (0x2125, 'V'), + (0x2126, 'M', u'ω'), + (0x2127, 'V'), + (0x2128, 'M', u'z'), + (0x2129, 'V'), + (0x212A, 'M', u'k'), + (0x212B, 'M', u'å'), + (0x212C, 'M', u'b'), + (0x212D, 'M', u'c'), + (0x212E, 'V'), + (0x212F, 'M', u'e'), + (0x2131, 'M', u'f'), + (0x2132, 'X'), + (0x2133, 'M', u'm'), + (0x2134, 'M', u'o'), + (0x2135, 'M', u'א'), + ] + +def _seg_22(): + return [ + (0x2136, 'M', u'ב'), + (0x2137, 'M', u'ג'), + (0x2138, 'M', u'ד'), + (0x2139, 'M', u'i'), + (0x213A, 'V'), + (0x213B, 'M', u'fax'), + (0x213C, 'M', u'π'), + (0x213D, 'M', u'γ'), + (0x213F, 'M', u'π'), + (0x2140, 'M', u'∑'), + (0x2141, 'V'), + (0x2145, 'M', u'd'), + (0x2147, 'M', u'e'), + (0x2148, 'M', u'i'), + (0x2149, 'M', u'j'), + (0x214A, 'V'), + (0x2150, 'M', u'1⁄7'), + (0x2151, 'M', u'1⁄9'), + (0x2152, 'M', u'1⁄10'), + (0x2153, 'M', u'1⁄3'), + (0x2154, 'M', u'2⁄3'), + (0x2155, 'M', u'1⁄5'), + (0x2156, 'M', u'2⁄5'), + (0x2157, 'M', u'3⁄5'), + (0x2158, 'M', u'4⁄5'), + (0x2159, 'M', u'1⁄6'), + (0x215A, 'M', u'5⁄6'), + (0x215B, 'M', u'1⁄8'), + (0x215C, 'M', u'3⁄8'), + (0x215D, 'M', u'5⁄8'), + (0x215E, 'M', u'7⁄8'), + (0x215F, 'M', u'1⁄'), + (0x2160, 'M', u'i'), + (0x2161, 'M', u'ii'), + (0x2162, 'M', u'iii'), + (0x2163, 'M', u'iv'), + (0x2164, 'M', u'v'), + (0x2165, 'M', u'vi'), + (0x2166, 'M', u'vii'), + (0x2167, 'M', u'viii'), + (0x2168, 'M', u'ix'), + (0x2169, 'M', u'x'), + (0x216A, 'M', u'xi'), + (0x216B, 'M', u'xii'), + (0x216C, 'M', u'l'), + (0x216D, 'M', u'c'), + (0x216E, 'M', u'd'), + (0x216F, 'M', u'm'), + (0x2170, 'M', u'i'), + (0x2171, 'M', u'ii'), + (0x2172, 'M', u'iii'), + (0x2173, 'M', u'iv'), + (0x2174, 'M', u'v'), + (0x2175, 'M', u'vi'), + (0x2176, 'M', u'vii'), + (0x2177, 'M', u'viii'), + (0x2178, 'M', u'ix'), + (0x2179, 'M', u'x'), + (0x217A, 'M', u'xi'), + (0x217B, 'M', u'xii'), + (0x217C, 'M', u'l'), + (0x217D, 'M', u'c'), + (0x217E, 'M', u'd'), + (0x217F, 'M', u'm'), + (0x2180, 'V'), + (0x2183, 'X'), + (0x2184, 'V'), + (0x2189, 'M', u'0⁄3'), + (0x218A, 'X'), + (0x2190, 'V'), + (0x222C, 'M', u'∫∫'), + (0x222D, 'M', u'∫∫∫'), + (0x222E, 'V'), + (0x222F, 'M', u'∮∮'), + (0x2230, 'M', u'∮∮∮'), + (0x2231, 'V'), + (0x2260, '3'), + (0x2261, 'V'), + (0x226E, '3'), + (0x2270, 'V'), + (0x2329, 'M', u'〈'), + (0x232A, 'M', u'〉'), + (0x232B, 'V'), + (0x23F4, 'X'), + (0x2400, 'V'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', u'1'), + (0x2461, 'M', u'2'), + (0x2462, 'M', u'3'), + (0x2463, 'M', u'4'), + (0x2464, 'M', u'5'), + (0x2465, 'M', u'6'), + (0x2466, 'M', u'7'), + (0x2467, 'M', u'8'), + (0x2468, 'M', u'9'), + (0x2469, 'M', u'10'), + (0x246A, 'M', u'11'), + (0x246B, 'M', u'12'), + ] + +def _seg_23(): + return [ + (0x246C, 'M', u'13'), + (0x246D, 'M', u'14'), + (0x246E, 'M', u'15'), + (0x246F, 'M', u'16'), + (0x2470, 'M', u'17'), + (0x2471, 'M', u'18'), + (0x2472, 'M', u'19'), + (0x2473, 'M', u'20'), + (0x2474, '3', u'(1)'), + (0x2475, '3', u'(2)'), + (0x2476, '3', u'(3)'), + (0x2477, '3', u'(4)'), + (0x2478, '3', u'(5)'), + (0x2479, '3', u'(6)'), + (0x247A, '3', u'(7)'), + (0x247B, '3', u'(8)'), + (0x247C, '3', u'(9)'), + (0x247D, '3', u'(10)'), + (0x247E, '3', u'(11)'), + (0x247F, '3', u'(12)'), + (0x2480, '3', u'(13)'), + (0x2481, '3', u'(14)'), + (0x2482, '3', u'(15)'), + (0x2483, '3', u'(16)'), + (0x2484, '3', u'(17)'), + (0x2485, '3', u'(18)'), + (0x2486, '3', u'(19)'), + (0x2487, '3', u'(20)'), + (0x2488, 'X'), + (0x249C, '3', u'(a)'), + (0x249D, '3', u'(b)'), + (0x249E, '3', u'(c)'), + (0x249F, '3', u'(d)'), + (0x24A0, '3', u'(e)'), + (0x24A1, '3', u'(f)'), + (0x24A2, '3', u'(g)'), + (0x24A3, '3', u'(h)'), + (0x24A4, '3', u'(i)'), + (0x24A5, '3', u'(j)'), + (0x24A6, '3', u'(k)'), + (0x24A7, '3', u'(l)'), + (0x24A8, '3', u'(m)'), + (0x24A9, '3', u'(n)'), + (0x24AA, '3', u'(o)'), + (0x24AB, '3', u'(p)'), + (0x24AC, '3', u'(q)'), + (0x24AD, '3', u'(r)'), + (0x24AE, '3', u'(s)'), + (0x24AF, '3', u'(t)'), + (0x24B0, '3', u'(u)'), + (0x24B1, '3', u'(v)'), + (0x24B2, '3', u'(w)'), + (0x24B3, '3', u'(x)'), + (0x24B4, '3', u'(y)'), + (0x24B5, '3', u'(z)'), + (0x24B6, 'M', u'a'), + (0x24B7, 'M', u'b'), + (0x24B8, 'M', u'c'), + (0x24B9, 'M', u'd'), + (0x24BA, 'M', u'e'), + (0x24BB, 'M', u'f'), + (0x24BC, 'M', u'g'), + (0x24BD, 'M', u'h'), + (0x24BE, 'M', u'i'), + (0x24BF, 'M', u'j'), + (0x24C0, 'M', u'k'), + (0x24C1, 'M', u'l'), + (0x24C2, 'M', u'm'), + (0x24C3, 'M', u'n'), + (0x24C4, 'M', u'o'), + (0x24C5, 'M', u'p'), + (0x24C6, 'M', u'q'), + (0x24C7, 'M', u'r'), + (0x24C8, 'M', u's'), + (0x24C9, 'M', u't'), + (0x24CA, 'M', u'u'), + (0x24CB, 'M', u'v'), + (0x24CC, 'M', u'w'), + (0x24CD, 'M', u'x'), + (0x24CE, 'M', u'y'), + (0x24CF, 'M', u'z'), + (0x24D0, 'M', u'a'), + (0x24D1, 'M', u'b'), + (0x24D2, 'M', u'c'), + (0x24D3, 'M', u'd'), + (0x24D4, 'M', u'e'), + (0x24D5, 'M', u'f'), + (0x24D6, 'M', u'g'), + (0x24D7, 'M', u'h'), + (0x24D8, 'M', u'i'), + (0x24D9, 'M', u'j'), + (0x24DA, 'M', u'k'), + (0x24DB, 'M', u'l'), + (0x24DC, 'M', u'm'), + (0x24DD, 'M', u'n'), + (0x24DE, 'M', u'o'), + (0x24DF, 'M', u'p'), + (0x24E0, 'M', u'q'), + (0x24E1, 'M', u'r'), + (0x24E2, 'M', u's'), + ] + +def _seg_24(): + return [ + (0x24E3, 'M', u't'), + (0x24E4, 'M', u'u'), + (0x24E5, 'M', u'v'), + (0x24E6, 'M', u'w'), + (0x24E7, 'M', u'x'), + (0x24E8, 'M', u'y'), + (0x24E9, 'M', u'z'), + (0x24EA, 'M', u'0'), + (0x24EB, 'V'), + (0x2700, 'X'), + (0x2701, 'V'), + (0x2A0C, 'M', u'∫∫∫∫'), + (0x2A0D, 'V'), + (0x2A74, '3', u'::='), + (0x2A75, '3', u'=='), + (0x2A76, '3', u'==='), + (0x2A77, 'V'), + (0x2ADC, 'M', u'⫝̸'), + (0x2ADD, 'V'), + (0x2B4D, 'X'), + (0x2B50, 'V'), + (0x2B5A, 'X'), + (0x2C00, 'M', u'ⰰ'), + (0x2C01, 'M', u'ⰱ'), + (0x2C02, 'M', u'ⰲ'), + (0x2C03, 'M', u'ⰳ'), + (0x2C04, 'M', u'ⰴ'), + (0x2C05, 'M', u'ⰵ'), + (0x2C06, 'M', u'ⰶ'), + (0x2C07, 'M', u'ⰷ'), + (0x2C08, 'M', u'ⰸ'), + (0x2C09, 'M', u'ⰹ'), + (0x2C0A, 'M', u'ⰺ'), + (0x2C0B, 'M', u'ⰻ'), + (0x2C0C, 'M', u'ⰼ'), + (0x2C0D, 'M', u'ⰽ'), + (0x2C0E, 'M', u'ⰾ'), + (0x2C0F, 'M', u'ⰿ'), + (0x2C10, 'M', u'ⱀ'), + (0x2C11, 'M', u'ⱁ'), + (0x2C12, 'M', u'ⱂ'), + (0x2C13, 'M', u'ⱃ'), + (0x2C14, 'M', u'ⱄ'), + (0x2C15, 'M', u'ⱅ'), + (0x2C16, 'M', u'ⱆ'), + (0x2C17, 'M', u'ⱇ'), + (0x2C18, 'M', u'ⱈ'), + (0x2C19, 'M', u'ⱉ'), + (0x2C1A, 'M', u'ⱊ'), + (0x2C1B, 'M', u'ⱋ'), + (0x2C1C, 'M', u'ⱌ'), + (0x2C1D, 'M', u'ⱍ'), + (0x2C1E, 'M', u'ⱎ'), + (0x2C1F, 'M', u'ⱏ'), + (0x2C20, 'M', u'ⱐ'), + (0x2C21, 'M', u'ⱑ'), + (0x2C22, 'M', u'ⱒ'), + (0x2C23, 'M', u'ⱓ'), + (0x2C24, 'M', u'ⱔ'), + (0x2C25, 'M', u'ⱕ'), + (0x2C26, 'M', u'ⱖ'), + (0x2C27, 'M', u'ⱗ'), + (0x2C28, 'M', u'ⱘ'), + (0x2C29, 'M', u'ⱙ'), + (0x2C2A, 'M', u'ⱚ'), + (0x2C2B, 'M', u'ⱛ'), + (0x2C2C, 'M', u'ⱜ'), + (0x2C2D, 'M', u'ⱝ'), + (0x2C2E, 'M', u'ⱞ'), + (0x2C2F, 'X'), + (0x2C30, 'V'), + (0x2C5F, 'X'), + (0x2C60, 'M', u'ⱡ'), + (0x2C61, 'V'), + (0x2C62, 'M', u'ɫ'), + (0x2C63, 'M', u'ᵽ'), + (0x2C64, 'M', u'ɽ'), + (0x2C65, 'V'), + (0x2C67, 'M', u'ⱨ'), + (0x2C68, 'V'), + (0x2C69, 'M', u'ⱪ'), + (0x2C6A, 'V'), + (0x2C6B, 'M', u'ⱬ'), + (0x2C6C, 'V'), + (0x2C6D, 'M', u'ɑ'), + (0x2C6E, 'M', u'ɱ'), + (0x2C6F, 'M', u'ɐ'), + (0x2C70, 'M', u'ɒ'), + (0x2C71, 'V'), + (0x2C72, 'M', u'ⱳ'), + (0x2C73, 'V'), + (0x2C75, 'M', u'ⱶ'), + (0x2C76, 'V'), + (0x2C7C, 'M', u'j'), + (0x2C7D, 'M', u'v'), + (0x2C7E, 'M', u'ȿ'), + (0x2C7F, 'M', u'ɀ'), + (0x2C80, 'M', u'ⲁ'), + (0x2C81, 'V'), + (0x2C82, 'M', u'ⲃ'), + ] + +def _seg_25(): + return [ + (0x2C83, 'V'), + (0x2C84, 'M', u'ⲅ'), + (0x2C85, 'V'), + (0x2C86, 'M', u'ⲇ'), + (0x2C87, 'V'), + (0x2C88, 'M', u'ⲉ'), + (0x2C89, 'V'), + (0x2C8A, 'M', u'ⲋ'), + (0x2C8B, 'V'), + (0x2C8C, 'M', u'ⲍ'), + (0x2C8D, 'V'), + (0x2C8E, 'M', u'ⲏ'), + (0x2C8F, 'V'), + (0x2C90, 'M', u'ⲑ'), + (0x2C91, 'V'), + (0x2C92, 'M', u'ⲓ'), + (0x2C93, 'V'), + (0x2C94, 'M', u'ⲕ'), + (0x2C95, 'V'), + (0x2C96, 'M', u'ⲗ'), + (0x2C97, 'V'), + (0x2C98, 'M', u'ⲙ'), + (0x2C99, 'V'), + (0x2C9A, 'M', u'ⲛ'), + (0x2C9B, 'V'), + (0x2C9C, 'M', u'ⲝ'), + (0x2C9D, 'V'), + (0x2C9E, 'M', u'ⲟ'), + (0x2C9F, 'V'), + (0x2CA0, 'M', u'ⲡ'), + (0x2CA1, 'V'), + (0x2CA2, 'M', u'ⲣ'), + (0x2CA3, 'V'), + (0x2CA4, 'M', u'ⲥ'), + (0x2CA5, 'V'), + (0x2CA6, 'M', u'ⲧ'), + (0x2CA7, 'V'), + (0x2CA8, 'M', u'ⲩ'), + (0x2CA9, 'V'), + (0x2CAA, 'M', u'ⲫ'), + (0x2CAB, 'V'), + (0x2CAC, 'M', u'ⲭ'), + (0x2CAD, 'V'), + (0x2CAE, 'M', u'ⲯ'), + (0x2CAF, 'V'), + (0x2CB0, 'M', u'ⲱ'), + (0x2CB1, 'V'), + (0x2CB2, 'M', u'ⲳ'), + (0x2CB3, 'V'), + (0x2CB4, 'M', u'ⲵ'), + (0x2CB5, 'V'), + (0x2CB6, 'M', u'ⲷ'), + (0x2CB7, 'V'), + (0x2CB8, 'M', u'ⲹ'), + (0x2CB9, 'V'), + (0x2CBA, 'M', u'ⲻ'), + (0x2CBB, 'V'), + (0x2CBC, 'M', u'ⲽ'), + (0x2CBD, 'V'), + (0x2CBE, 'M', u'ⲿ'), + (0x2CBF, 'V'), + (0x2CC0, 'M', u'ⳁ'), + (0x2CC1, 'V'), + (0x2CC2, 'M', u'ⳃ'), + (0x2CC3, 'V'), + (0x2CC4, 'M', u'ⳅ'), + (0x2CC5, 'V'), + (0x2CC6, 'M', u'ⳇ'), + (0x2CC7, 'V'), + (0x2CC8, 'M', u'ⳉ'), + (0x2CC9, 'V'), + (0x2CCA, 'M', u'ⳋ'), + (0x2CCB, 'V'), + (0x2CCC, 'M', u'ⳍ'), + (0x2CCD, 'V'), + (0x2CCE, 'M', u'ⳏ'), + (0x2CCF, 'V'), + (0x2CD0, 'M', u'ⳑ'), + (0x2CD1, 'V'), + (0x2CD2, 'M', u'ⳓ'), + (0x2CD3, 'V'), + (0x2CD4, 'M', u'ⳕ'), + (0x2CD5, 'V'), + (0x2CD6, 'M', u'ⳗ'), + (0x2CD7, 'V'), + (0x2CD8, 'M', u'ⳙ'), + (0x2CD9, 'V'), + (0x2CDA, 'M', u'ⳛ'), + (0x2CDB, 'V'), + (0x2CDC, 'M', u'ⳝ'), + (0x2CDD, 'V'), + (0x2CDE, 'M', u'ⳟ'), + (0x2CDF, 'V'), + (0x2CE0, 'M', u'ⳡ'), + (0x2CE1, 'V'), + (0x2CE2, 'M', u'ⳣ'), + (0x2CE3, 'V'), + (0x2CEB, 'M', u'ⳬ'), + (0x2CEC, 'V'), + (0x2CED, 'M', u'ⳮ'), + ] + +def _seg_26(): + return [ + (0x2CEE, 'V'), + (0x2CF2, 'M', u'ⳳ'), + (0x2CF3, 'V'), + (0x2CF4, 'X'), + (0x2CF9, 'V'), + (0x2D26, 'X'), + (0x2D27, 'V'), + (0x2D28, 'X'), + (0x2D2D, 'V'), + (0x2D2E, 'X'), + (0x2D30, 'V'), + (0x2D68, 'X'), + (0x2D6F, 'M', u'ⵡ'), + (0x2D70, 'V'), + (0x2D71, 'X'), + (0x2D7F, 'V'), + (0x2D97, 'X'), + (0x2DA0, 'V'), + (0x2DA7, 'X'), + (0x2DA8, 'V'), + (0x2DAF, 'X'), + (0x2DB0, 'V'), + (0x2DB7, 'X'), + (0x2DB8, 'V'), + (0x2DBF, 'X'), + (0x2DC0, 'V'), + (0x2DC7, 'X'), + (0x2DC8, 'V'), + (0x2DCF, 'X'), + (0x2DD0, 'V'), + (0x2DD7, 'X'), + (0x2DD8, 'V'), + (0x2DDF, 'X'), + (0x2DE0, 'V'), + (0x2E3C, 'X'), + (0x2E80, 'V'), + (0x2E9A, 'X'), + (0x2E9B, 'V'), + (0x2E9F, 'M', u'母'), + (0x2EA0, 'V'), + (0x2EF3, 'M', u'龟'), + (0x2EF4, 'X'), + (0x2F00, 'M', u'一'), + (0x2F01, 'M', u'丨'), + (0x2F02, 'M', u'丶'), + (0x2F03, 'M', u'丿'), + (0x2F04, 'M', u'乙'), + (0x2F05, 'M', u'亅'), + (0x2F06, 'M', u'二'), + (0x2F07, 'M', u'亠'), + (0x2F08, 'M', u'人'), + (0x2F09, 'M', u'儿'), + (0x2F0A, 'M', u'入'), + (0x2F0B, 'M', u'八'), + (0x2F0C, 'M', u'冂'), + (0x2F0D, 'M', u'冖'), + (0x2F0E, 'M', u'冫'), + (0x2F0F, 'M', u'几'), + (0x2F10, 'M', u'凵'), + (0x2F11, 'M', u'刀'), + (0x2F12, 'M', u'力'), + (0x2F13, 'M', u'勹'), + (0x2F14, 'M', u'匕'), + (0x2F15, 'M', u'匚'), + (0x2F16, 'M', u'匸'), + (0x2F17, 'M', u'十'), + (0x2F18, 'M', u'卜'), + (0x2F19, 'M', u'卩'), + (0x2F1A, 'M', u'厂'), + (0x2F1B, 'M', u'厶'), + (0x2F1C, 'M', u'又'), + (0x2F1D, 'M', u'口'), + (0x2F1E, 'M', u'囗'), + (0x2F1F, 'M', u'土'), + (0x2F20, 'M', u'士'), + (0x2F21, 'M', u'夂'), + (0x2F22, 'M', u'夊'), + (0x2F23, 'M', u'夕'), + (0x2F24, 'M', u'大'), + (0x2F25, 'M', u'女'), + (0x2F26, 'M', u'子'), + (0x2F27, 'M', u'宀'), + (0x2F28, 'M', u'寸'), + (0x2F29, 'M', u'小'), + (0x2F2A, 'M', u'尢'), + (0x2F2B, 'M', u'尸'), + (0x2F2C, 'M', u'屮'), + (0x2F2D, 'M', u'山'), + (0x2F2E, 'M', u'巛'), + (0x2F2F, 'M', u'工'), + (0x2F30, 'M', u'己'), + (0x2F31, 'M', u'巾'), + (0x2F32, 'M', u'干'), + (0x2F33, 'M', u'幺'), + (0x2F34, 'M', u'广'), + (0x2F35, 'M', u'廴'), + (0x2F36, 'M', u'廾'), + (0x2F37, 'M', u'弋'), + (0x2F38, 'M', u'弓'), + (0x2F39, 'M', u'彐'), + ] + +def _seg_27(): + return [ + (0x2F3A, 'M', u'彡'), + (0x2F3B, 'M', u'彳'), + (0x2F3C, 'M', u'心'), + (0x2F3D, 'M', u'戈'), + (0x2F3E, 'M', u'戶'), + (0x2F3F, 'M', u'手'), + (0x2F40, 'M', u'支'), + (0x2F41, 'M', u'攴'), + (0x2F42, 'M', u'文'), + (0x2F43, 'M', u'斗'), + (0x2F44, 'M', u'斤'), + (0x2F45, 'M', u'方'), + (0x2F46, 'M', u'无'), + (0x2F47, 'M', u'日'), + (0x2F48, 'M', u'曰'), + (0x2F49, 'M', u'月'), + (0x2F4A, 'M', u'木'), + (0x2F4B, 'M', u'欠'), + (0x2F4C, 'M', u'止'), + (0x2F4D, 'M', u'歹'), + (0x2F4E, 'M', u'殳'), + (0x2F4F, 'M', u'毋'), + (0x2F50, 'M', u'比'), + (0x2F51, 'M', u'毛'), + (0x2F52, 'M', u'氏'), + (0x2F53, 'M', u'气'), + (0x2F54, 'M', u'水'), + (0x2F55, 'M', u'火'), + (0x2F56, 'M', u'爪'), + (0x2F57, 'M', u'父'), + (0x2F58, 'M', u'爻'), + (0x2F59, 'M', u'爿'), + (0x2F5A, 'M', u'片'), + (0x2F5B, 'M', u'牙'), + (0x2F5C, 'M', u'牛'), + (0x2F5D, 'M', u'犬'), + (0x2F5E, 'M', u'玄'), + (0x2F5F, 'M', u'玉'), + (0x2F60, 'M', u'瓜'), + (0x2F61, 'M', u'瓦'), + (0x2F62, 'M', u'甘'), + (0x2F63, 'M', u'生'), + (0x2F64, 'M', u'用'), + (0x2F65, 'M', u'田'), + (0x2F66, 'M', u'疋'), + (0x2F67, 'M', u'疒'), + (0x2F68, 'M', u'癶'), + (0x2F69, 'M', u'白'), + (0x2F6A, 'M', u'皮'), + (0x2F6B, 'M', u'皿'), + (0x2F6C, 'M', u'目'), + (0x2F6D, 'M', u'矛'), + (0x2F6E, 'M', u'矢'), + (0x2F6F, 'M', u'石'), + (0x2F70, 'M', u'示'), + (0x2F71, 'M', u'禸'), + (0x2F72, 'M', u'禾'), + (0x2F73, 'M', u'穴'), + (0x2F74, 'M', u'立'), + (0x2F75, 'M', u'竹'), + (0x2F76, 'M', u'米'), + (0x2F77, 'M', u'糸'), + (0x2F78, 'M', u'缶'), + (0x2F79, 'M', u'网'), + (0x2F7A, 'M', u'羊'), + (0x2F7B, 'M', u'羽'), + (0x2F7C, 'M', u'老'), + (0x2F7D, 'M', u'而'), + (0x2F7E, 'M', u'耒'), + (0x2F7F, 'M', u'耳'), + (0x2F80, 'M', u'聿'), + (0x2F81, 'M', u'肉'), + (0x2F82, 'M', u'臣'), + (0x2F83, 'M', u'自'), + (0x2F84, 'M', u'至'), + (0x2F85, 'M', u'臼'), + (0x2F86, 'M', u'舌'), + (0x2F87, 'M', u'舛'), + (0x2F88, 'M', u'舟'), + (0x2F89, 'M', u'艮'), + (0x2F8A, 'M', u'色'), + (0x2F8B, 'M', u'艸'), + (0x2F8C, 'M', u'虍'), + (0x2F8D, 'M', u'虫'), + (0x2F8E, 'M', u'血'), + (0x2F8F, 'M', u'行'), + (0x2F90, 'M', u'衣'), + (0x2F91, 'M', u'襾'), + (0x2F92, 'M', u'見'), + (0x2F93, 'M', u'角'), + (0x2F94, 'M', u'言'), + (0x2F95, 'M', u'谷'), + (0x2F96, 'M', u'豆'), + (0x2F97, 'M', u'豕'), + (0x2F98, 'M', u'豸'), + (0x2F99, 'M', u'貝'), + (0x2F9A, 'M', u'赤'), + (0x2F9B, 'M', u'走'), + (0x2F9C, 'M', u'足'), + (0x2F9D, 'M', u'身'), + ] + +def _seg_28(): + return [ + (0x2F9E, 'M', u'車'), + (0x2F9F, 'M', u'辛'), + (0x2FA0, 'M', u'辰'), + (0x2FA1, 'M', u'辵'), + (0x2FA2, 'M', u'邑'), + (0x2FA3, 'M', u'酉'), + (0x2FA4, 'M', u'釆'), + (0x2FA5, 'M', u'里'), + (0x2FA6, 'M', u'金'), + (0x2FA7, 'M', u'長'), + (0x2FA8, 'M', u'門'), + (0x2FA9, 'M', u'阜'), + (0x2FAA, 'M', u'隶'), + (0x2FAB, 'M', u'隹'), + (0x2FAC, 'M', u'雨'), + (0x2FAD, 'M', u'靑'), + (0x2FAE, 'M', u'非'), + (0x2FAF, 'M', u'面'), + (0x2FB0, 'M', u'革'), + (0x2FB1, 'M', u'韋'), + (0x2FB2, 'M', u'韭'), + (0x2FB3, 'M', u'音'), + (0x2FB4, 'M', u'頁'), + (0x2FB5, 'M', u'風'), + (0x2FB6, 'M', u'飛'), + (0x2FB7, 'M', u'食'), + (0x2FB8, 'M', u'首'), + (0x2FB9, 'M', u'香'), + (0x2FBA, 'M', u'馬'), + (0x2FBB, 'M', u'骨'), + (0x2FBC, 'M', u'高'), + (0x2FBD, 'M', u'髟'), + (0x2FBE, 'M', u'鬥'), + (0x2FBF, 'M', u'鬯'), + (0x2FC0, 'M', u'鬲'), + (0x2FC1, 'M', u'鬼'), + (0x2FC2, 'M', u'魚'), + (0x2FC3, 'M', u'鳥'), + (0x2FC4, 'M', u'鹵'), + (0x2FC5, 'M', u'鹿'), + (0x2FC6, 'M', u'麥'), + (0x2FC7, 'M', u'麻'), + (0x2FC8, 'M', u'黃'), + (0x2FC9, 'M', u'黍'), + (0x2FCA, 'M', u'黑'), + (0x2FCB, 'M', u'黹'), + (0x2FCC, 'M', u'黽'), + (0x2FCD, 'M', u'鼎'), + (0x2FCE, 'M', u'鼓'), + (0x2FCF, 'M', u'鼠'), + (0x2FD0, 'M', u'鼻'), + (0x2FD1, 'M', u'齊'), + (0x2FD2, 'M', u'齒'), + (0x2FD3, 'M', u'龍'), + (0x2FD4, 'M', u'龜'), + (0x2FD5, 'M', u'龠'), + (0x2FD6, 'X'), + (0x3000, '3', u' '), + (0x3001, 'V'), + (0x3002, 'M', u'.'), + (0x3003, 'V'), + (0x3036, 'M', u'〒'), + (0x3037, 'V'), + (0x3038, 'M', u'十'), + (0x3039, 'M', u'卄'), + (0x303A, 'M', u'卅'), + (0x303B, 'V'), + (0x3040, 'X'), + (0x3041, 'V'), + (0x3097, 'X'), + (0x3099, 'V'), + (0x309B, '3', u' ゙'), + (0x309C, '3', u' ゚'), + (0x309D, 'V'), + (0x309F, 'M', u'より'), + (0x30A0, 'V'), + (0x30FF, 'M', u'コト'), + (0x3100, 'X'), + (0x3105, 'V'), + (0x312E, 'X'), + (0x3131, 'M', u'ᄀ'), + (0x3132, 'M', u'ᄁ'), + (0x3133, 'M', u'ᆪ'), + (0x3134, 'M', u'ᄂ'), + (0x3135, 'M', u'ᆬ'), + (0x3136, 'M', u'ᆭ'), + (0x3137, 'M', u'ᄃ'), + (0x3138, 'M', u'ᄄ'), + (0x3139, 'M', u'ᄅ'), + (0x313A, 'M', u'ᆰ'), + (0x313B, 'M', u'ᆱ'), + (0x313C, 'M', u'ᆲ'), + (0x313D, 'M', u'ᆳ'), + (0x313E, 'M', u'ᆴ'), + (0x313F, 'M', u'ᆵ'), + (0x3140, 'M', u'ᄚ'), + (0x3141, 'M', u'ᄆ'), + (0x3142, 'M', u'ᄇ'), + (0x3143, 'M', u'ᄈ'), + (0x3144, 'M', u'ᄡ'), + ] + +def _seg_29(): + return [ + (0x3145, 'M', u'ᄉ'), + (0x3146, 'M', u'ᄊ'), + (0x3147, 'M', u'ᄋ'), + (0x3148, 'M', u'ᄌ'), + (0x3149, 'M', u'ᄍ'), + (0x314A, 'M', u'ᄎ'), + (0x314B, 'M', u'ᄏ'), + (0x314C, 'M', u'ᄐ'), + (0x314D, 'M', u'ᄑ'), + (0x314E, 'M', u'ᄒ'), + (0x314F, 'M', u'ᅡ'), + (0x3150, 'M', u'ᅢ'), + (0x3151, 'M', u'ᅣ'), + (0x3152, 'M', u'ᅤ'), + (0x3153, 'M', u'ᅥ'), + (0x3154, 'M', u'ᅦ'), + (0x3155, 'M', u'ᅧ'), + (0x3156, 'M', u'ᅨ'), + (0x3157, 'M', u'ᅩ'), + (0x3158, 'M', u'ᅪ'), + (0x3159, 'M', u'ᅫ'), + (0x315A, 'M', u'ᅬ'), + (0x315B, 'M', u'ᅭ'), + (0x315C, 'M', u'ᅮ'), + (0x315D, 'M', u'ᅯ'), + (0x315E, 'M', u'ᅰ'), + (0x315F, 'M', u'ᅱ'), + (0x3160, 'M', u'ᅲ'), + (0x3161, 'M', u'ᅳ'), + (0x3162, 'M', u'ᅴ'), + (0x3163, 'M', u'ᅵ'), + (0x3164, 'X'), + (0x3165, 'M', u'ᄔ'), + (0x3166, 'M', u'ᄕ'), + (0x3167, 'M', u'ᇇ'), + (0x3168, 'M', u'ᇈ'), + (0x3169, 'M', u'ᇌ'), + (0x316A, 'M', u'ᇎ'), + (0x316B, 'M', u'ᇓ'), + (0x316C, 'M', u'ᇗ'), + (0x316D, 'M', u'ᇙ'), + (0x316E, 'M', u'ᄜ'), + (0x316F, 'M', u'ᇝ'), + (0x3170, 'M', u'ᇟ'), + (0x3171, 'M', u'ᄝ'), + (0x3172, 'M', u'ᄞ'), + (0x3173, 'M', u'ᄠ'), + (0x3174, 'M', u'ᄢ'), + (0x3175, 'M', u'ᄣ'), + (0x3176, 'M', u'ᄧ'), + (0x3177, 'M', u'ᄩ'), + (0x3178, 'M', u'ᄫ'), + (0x3179, 'M', u'ᄬ'), + (0x317A, 'M', u'ᄭ'), + (0x317B, 'M', u'ᄮ'), + (0x317C, 'M', u'ᄯ'), + (0x317D, 'M', u'ᄲ'), + (0x317E, 'M', u'ᄶ'), + (0x317F, 'M', u'ᅀ'), + (0x3180, 'M', u'ᅇ'), + (0x3181, 'M', u'ᅌ'), + (0x3182, 'M', u'ᇱ'), + (0x3183, 'M', u'ᇲ'), + (0x3184, 'M', u'ᅗ'), + (0x3185, 'M', u'ᅘ'), + (0x3186, 'M', u'ᅙ'), + (0x3187, 'M', u'ᆄ'), + (0x3188, 'M', u'ᆅ'), + (0x3189, 'M', u'ᆈ'), + (0x318A, 'M', u'ᆑ'), + (0x318B, 'M', u'ᆒ'), + (0x318C, 'M', u'ᆔ'), + (0x318D, 'M', u'ᆞ'), + (0x318E, 'M', u'ᆡ'), + (0x318F, 'X'), + (0x3190, 'V'), + (0x3192, 'M', u'一'), + (0x3193, 'M', u'二'), + (0x3194, 'M', u'三'), + (0x3195, 'M', u'四'), + (0x3196, 'M', u'上'), + (0x3197, 'M', u'中'), + (0x3198, 'M', u'下'), + (0x3199, 'M', u'甲'), + (0x319A, 'M', u'乙'), + (0x319B, 'M', u'丙'), + (0x319C, 'M', u'丁'), + (0x319D, 'M', u'天'), + (0x319E, 'M', u'地'), + (0x319F, 'M', u'人'), + (0x31A0, 'V'), + (0x31BB, 'X'), + (0x31C0, 'V'), + (0x31E4, 'X'), + (0x31F0, 'V'), + (0x3200, '3', u'(ᄀ)'), + (0x3201, '3', u'(ᄂ)'), + (0x3202, '3', u'(ᄃ)'), + (0x3203, '3', u'(ᄅ)'), + (0x3204, '3', u'(ᄆ)'), + ] + +def _seg_30(): + return [ + (0x3205, '3', u'(ᄇ)'), + (0x3206, '3', u'(ᄉ)'), + (0x3207, '3', u'(ᄋ)'), + (0x3208, '3', u'(ᄌ)'), + (0x3209, '3', u'(ᄎ)'), + (0x320A, '3', u'(ᄏ)'), + (0x320B, '3', u'(ᄐ)'), + (0x320C, '3', u'(ᄑ)'), + (0x320D, '3', u'(ᄒ)'), + (0x320E, '3', u'(가)'), + (0x320F, '3', u'(나)'), + (0x3210, '3', u'(다)'), + (0x3211, '3', u'(라)'), + (0x3212, '3', u'(마)'), + (0x3213, '3', u'(바)'), + (0x3214, '3', u'(사)'), + (0x3215, '3', u'(아)'), + (0x3216, '3', u'(자)'), + (0x3217, '3', u'(차)'), + (0x3218, '3', u'(카)'), + (0x3219, '3', u'(타)'), + (0x321A, '3', u'(파)'), + (0x321B, '3', u'(하)'), + (0x321C, '3', u'(주)'), + (0x321D, '3', u'(오전)'), + (0x321E, '3', u'(오후)'), + (0x321F, 'X'), + (0x3220, '3', u'(一)'), + (0x3221, '3', u'(二)'), + (0x3222, '3', u'(三)'), + (0x3223, '3', u'(四)'), + (0x3224, '3', u'(五)'), + (0x3225, '3', u'(六)'), + (0x3226, '3', u'(七)'), + (0x3227, '3', u'(八)'), + (0x3228, '3', u'(九)'), + (0x3229, '3', u'(十)'), + (0x322A, '3', u'(月)'), + (0x322B, '3', u'(火)'), + (0x322C, '3', u'(水)'), + (0x322D, '3', u'(木)'), + (0x322E, '3', u'(金)'), + (0x322F, '3', u'(土)'), + (0x3230, '3', u'(日)'), + (0x3231, '3', u'(株)'), + (0x3232, '3', u'(有)'), + (0x3233, '3', u'(社)'), + (0x3234, '3', u'(名)'), + (0x3235, '3', u'(特)'), + (0x3236, '3', u'(財)'), + (0x3237, '3', u'(祝)'), + (0x3238, '3', u'(労)'), + (0x3239, '3', u'(代)'), + (0x323A, '3', u'(呼)'), + (0x323B, '3', u'(学)'), + (0x323C, '3', u'(監)'), + (0x323D, '3', u'(企)'), + (0x323E, '3', u'(資)'), + (0x323F, '3', u'(協)'), + (0x3240, '3', u'(祭)'), + (0x3241, '3', u'(休)'), + (0x3242, '3', u'(自)'), + (0x3243, '3', u'(至)'), + (0x3244, 'M', u'問'), + (0x3245, 'M', u'幼'), + (0x3246, 'M', u'文'), + (0x3247, 'M', u'箏'), + (0x3248, 'V'), + (0x3250, 'M', u'pte'), + (0x3251, 'M', u'21'), + (0x3252, 'M', u'22'), + (0x3253, 'M', u'23'), + (0x3254, 'M', u'24'), + (0x3255, 'M', u'25'), + (0x3256, 'M', u'26'), + (0x3257, 'M', u'27'), + (0x3258, 'M', u'28'), + (0x3259, 'M', u'29'), + (0x325A, 'M', u'30'), + (0x325B, 'M', u'31'), + (0x325C, 'M', u'32'), + (0x325D, 'M', u'33'), + (0x325E, 'M', u'34'), + (0x325F, 'M', u'35'), + (0x3260, 'M', u'ᄀ'), + (0x3261, 'M', u'ᄂ'), + (0x3262, 'M', u'ᄃ'), + (0x3263, 'M', u'ᄅ'), + (0x3264, 'M', u'ᄆ'), + (0x3265, 'M', u'ᄇ'), + (0x3266, 'M', u'ᄉ'), + (0x3267, 'M', u'ᄋ'), + (0x3268, 'M', u'ᄌ'), + (0x3269, 'M', u'ᄎ'), + (0x326A, 'M', u'ᄏ'), + (0x326B, 'M', u'ᄐ'), + (0x326C, 'M', u'ᄑ'), + (0x326D, 'M', u'ᄒ'), + (0x326E, 'M', u'가'), + (0x326F, 'M', u'나'), + ] + +def _seg_31(): + return [ + (0x3270, 'M', u'다'), + (0x3271, 'M', u'라'), + (0x3272, 'M', u'마'), + (0x3273, 'M', u'바'), + (0x3274, 'M', u'사'), + (0x3275, 'M', u'아'), + (0x3276, 'M', u'자'), + (0x3277, 'M', u'차'), + (0x3278, 'M', u'카'), + (0x3279, 'M', u'타'), + (0x327A, 'M', u'파'), + (0x327B, 'M', u'하'), + (0x327C, 'M', u'참고'), + (0x327D, 'M', u'주의'), + (0x327E, 'M', u'우'), + (0x327F, 'V'), + (0x3280, 'M', u'一'), + (0x3281, 'M', u'二'), + (0x3282, 'M', u'三'), + (0x3283, 'M', u'四'), + (0x3284, 'M', u'五'), + (0x3285, 'M', u'六'), + (0x3286, 'M', u'七'), + (0x3287, 'M', u'八'), + (0x3288, 'M', u'九'), + (0x3289, 'M', u'十'), + (0x328A, 'M', u'月'), + (0x328B, 'M', u'火'), + (0x328C, 'M', u'水'), + (0x328D, 'M', u'木'), + (0x328E, 'M', u'金'), + (0x328F, 'M', u'土'), + (0x3290, 'M', u'日'), + (0x3291, 'M', u'株'), + (0x3292, 'M', u'有'), + (0x3293, 'M', u'社'), + (0x3294, 'M', u'名'), + (0x3295, 'M', u'特'), + (0x3296, 'M', u'財'), + (0x3297, 'M', u'祝'), + (0x3298, 'M', u'労'), + (0x3299, 'M', u'秘'), + (0x329A, 'M', u'男'), + (0x329B, 'M', u'女'), + (0x329C, 'M', u'適'), + (0x329D, 'M', u'優'), + (0x329E, 'M', u'印'), + (0x329F, 'M', u'注'), + (0x32A0, 'M', u'項'), + (0x32A1, 'M', u'休'), + (0x32A2, 'M', u'写'), + (0x32A3, 'M', u'正'), + (0x32A4, 'M', u'上'), + (0x32A5, 'M', u'中'), + (0x32A6, 'M', u'下'), + (0x32A7, 'M', u'左'), + (0x32A8, 'M', u'右'), + (0x32A9, 'M', u'医'), + (0x32AA, 'M', u'宗'), + (0x32AB, 'M', u'学'), + (0x32AC, 'M', u'監'), + (0x32AD, 'M', u'企'), + (0x32AE, 'M', u'資'), + (0x32AF, 'M', u'協'), + (0x32B0, 'M', u'夜'), + (0x32B1, 'M', u'36'), + (0x32B2, 'M', u'37'), + (0x32B3, 'M', u'38'), + (0x32B4, 'M', u'39'), + (0x32B5, 'M', u'40'), + (0x32B6, 'M', u'41'), + (0x32B7, 'M', u'42'), + (0x32B8, 'M', u'43'), + (0x32B9, 'M', u'44'), + (0x32BA, 'M', u'45'), + (0x32BB, 'M', u'46'), + (0x32BC, 'M', u'47'), + (0x32BD, 'M', u'48'), + (0x32BE, 'M', u'49'), + (0x32BF, 'M', u'50'), + (0x32C0, 'M', u'1月'), + (0x32C1, 'M', u'2月'), + (0x32C2, 'M', u'3月'), + (0x32C3, 'M', u'4月'), + (0x32C4, 'M', u'5月'), + (0x32C5, 'M', u'6月'), + (0x32C6, 'M', u'7月'), + (0x32C7, 'M', u'8月'), + (0x32C8, 'M', u'9月'), + (0x32C9, 'M', u'10月'), + (0x32CA, 'M', u'11月'), + (0x32CB, 'M', u'12月'), + (0x32CC, 'M', u'hg'), + (0x32CD, 'M', u'erg'), + (0x32CE, 'M', u'ev'), + (0x32CF, 'M', u'ltd'), + (0x32D0, 'M', u'ア'), + (0x32D1, 'M', u'イ'), + (0x32D2, 'M', u'ウ'), + (0x32D3, 'M', u'エ'), + ] + +def _seg_32(): + return [ + (0x32D4, 'M', u'オ'), + (0x32D5, 'M', u'カ'), + (0x32D6, 'M', u'キ'), + (0x32D7, 'M', u'ク'), + (0x32D8, 'M', u'ケ'), + (0x32D9, 'M', u'コ'), + (0x32DA, 'M', u'サ'), + (0x32DB, 'M', u'シ'), + (0x32DC, 'M', u'ス'), + (0x32DD, 'M', u'セ'), + (0x32DE, 'M', u'ソ'), + (0x32DF, 'M', u'タ'), + (0x32E0, 'M', u'チ'), + (0x32E1, 'M', u'ツ'), + (0x32E2, 'M', u'テ'), + (0x32E3, 'M', u'ト'), + (0x32E4, 'M', u'ナ'), + (0x32E5, 'M', u'ニ'), + (0x32E6, 'M', u'ヌ'), + (0x32E7, 'M', u'ネ'), + (0x32E8, 'M', u'ノ'), + (0x32E9, 'M', u'ハ'), + (0x32EA, 'M', u'ヒ'), + (0x32EB, 'M', u'フ'), + (0x32EC, 'M', u'ヘ'), + (0x32ED, 'M', u'ホ'), + (0x32EE, 'M', u'マ'), + (0x32EF, 'M', u'ミ'), + (0x32F0, 'M', u'ム'), + (0x32F1, 'M', u'メ'), + (0x32F2, 'M', u'モ'), + (0x32F3, 'M', u'ヤ'), + (0x32F4, 'M', u'ユ'), + (0x32F5, 'M', u'ヨ'), + (0x32F6, 'M', u'ラ'), + (0x32F7, 'M', u'リ'), + (0x32F8, 'M', u'ル'), + (0x32F9, 'M', u'レ'), + (0x32FA, 'M', u'ロ'), + (0x32FB, 'M', u'ワ'), + (0x32FC, 'M', u'ヰ'), + (0x32FD, 'M', u'ヱ'), + (0x32FE, 'M', u'ヲ'), + (0x32FF, 'X'), + (0x3300, 'M', u'アパート'), + (0x3301, 'M', u'アルファ'), + (0x3302, 'M', u'アンペア'), + (0x3303, 'M', u'アール'), + (0x3304, 'M', u'イニング'), + (0x3305, 'M', u'インチ'), + (0x3306, 'M', u'ウォン'), + (0x3307, 'M', u'エスクード'), + (0x3308, 'M', u'エーカー'), + (0x3309, 'M', u'オンス'), + (0x330A, 'M', u'オーム'), + (0x330B, 'M', u'カイリ'), + (0x330C, 'M', u'カラット'), + (0x330D, 'M', u'カロリー'), + (0x330E, 'M', u'ガロン'), + (0x330F, 'M', u'ガンマ'), + (0x3310, 'M', u'ギガ'), + (0x3311, 'M', u'ギニー'), + (0x3312, 'M', u'キュリー'), + (0x3313, 'M', u'ギルダー'), + (0x3314, 'M', u'キロ'), + (0x3315, 'M', u'キログラム'), + (0x3316, 'M', u'キロメートル'), + (0x3317, 'M', u'キロワット'), + (0x3318, 'M', u'グラム'), + (0x3319, 'M', u'グラムトン'), + (0x331A, 'M', u'クルゼイロ'), + (0x331B, 'M', u'クローネ'), + (0x331C, 'M', u'ケース'), + (0x331D, 'M', u'コルナ'), + (0x331E, 'M', u'コーポ'), + (0x331F, 'M', u'サイクル'), + (0x3320, 'M', u'サンチーム'), + (0x3321, 'M', u'シリング'), + (0x3322, 'M', u'センチ'), + (0x3323, 'M', u'セント'), + (0x3324, 'M', u'ダース'), + (0x3325, 'M', u'デシ'), + (0x3326, 'M', u'ドル'), + (0x3327, 'M', u'トン'), + (0x3328, 'M', u'ナノ'), + (0x3329, 'M', u'ノット'), + (0x332A, 'M', u'ハイツ'), + (0x332B, 'M', u'パーセント'), + (0x332C, 'M', u'パーツ'), + (0x332D, 'M', u'バーレル'), + (0x332E, 'M', u'ピアストル'), + (0x332F, 'M', u'ピクル'), + (0x3330, 'M', u'ピコ'), + (0x3331, 'M', u'ビル'), + (0x3332, 'M', u'ファラッド'), + (0x3333, 'M', u'フィート'), + (0x3334, 'M', u'ブッシェル'), + (0x3335, 'M', u'フラン'), + (0x3336, 'M', u'ヘクタール'), + (0x3337, 'M', u'ペソ'), + ] + +def _seg_33(): + return [ + (0x3338, 'M', u'ペニヒ'), + (0x3339, 'M', u'ヘルツ'), + (0x333A, 'M', u'ペンス'), + (0x333B, 'M', u'ページ'), + (0x333C, 'M', u'ベータ'), + (0x333D, 'M', u'ポイント'), + (0x333E, 'M', u'ボルト'), + (0x333F, 'M', u'ホン'), + (0x3340, 'M', u'ポンド'), + (0x3341, 'M', u'ホール'), + (0x3342, 'M', u'ホーン'), + (0x3343, 'M', u'マイクロ'), + (0x3344, 'M', u'マイル'), + (0x3345, 'M', u'マッハ'), + (0x3346, 'M', u'マルク'), + (0x3347, 'M', u'マンション'), + (0x3348, 'M', u'ミクロン'), + (0x3349, 'M', u'ミリ'), + (0x334A, 'M', u'ミリバール'), + (0x334B, 'M', u'メガ'), + (0x334C, 'M', u'メガトン'), + (0x334D, 'M', u'メートル'), + (0x334E, 'M', u'ヤード'), + (0x334F, 'M', u'ヤール'), + (0x3350, 'M', u'ユアン'), + (0x3351, 'M', u'リットル'), + (0x3352, 'M', u'リラ'), + (0x3353, 'M', u'ルピー'), + (0x3354, 'M', u'ルーブル'), + (0x3355, 'M', u'レム'), + (0x3356, 'M', u'レントゲン'), + (0x3357, 'M', u'ワット'), + (0x3358, 'M', u'0点'), + (0x3359, 'M', u'1点'), + (0x335A, 'M', u'2点'), + (0x335B, 'M', u'3点'), + (0x335C, 'M', u'4点'), + (0x335D, 'M', u'5点'), + (0x335E, 'M', u'6点'), + (0x335F, 'M', u'7点'), + (0x3360, 'M', u'8点'), + (0x3361, 'M', u'9点'), + (0x3362, 'M', u'10点'), + (0x3363, 'M', u'11点'), + (0x3364, 'M', u'12点'), + (0x3365, 'M', u'13点'), + (0x3366, 'M', u'14点'), + (0x3367, 'M', u'15点'), + (0x3368, 'M', u'16点'), + (0x3369, 'M', u'17点'), + (0x336A, 'M', u'18点'), + (0x336B, 'M', u'19点'), + (0x336C, 'M', u'20点'), + (0x336D, 'M', u'21点'), + (0x336E, 'M', u'22点'), + (0x336F, 'M', u'23点'), + (0x3370, 'M', u'24点'), + (0x3371, 'M', u'hpa'), + (0x3372, 'M', u'da'), + (0x3373, 'M', u'au'), + (0x3374, 'M', u'bar'), + (0x3375, 'M', u'ov'), + (0x3376, 'M', u'pc'), + (0x3377, 'M', u'dm'), + (0x3378, 'M', u'dm2'), + (0x3379, 'M', u'dm3'), + (0x337A, 'M', u'iu'), + (0x337B, 'M', u'平成'), + (0x337C, 'M', u'昭和'), + (0x337D, 'M', u'大正'), + (0x337E, 'M', u'明治'), + (0x337F, 'M', u'株式会社'), + (0x3380, 'M', u'pa'), + (0x3381, 'M', u'na'), + (0x3382, 'M', u'μa'), + (0x3383, 'M', u'ma'), + (0x3384, 'M', u'ka'), + (0x3385, 'M', u'kb'), + (0x3386, 'M', u'mb'), + (0x3387, 'M', u'gb'), + (0x3388, 'M', u'cal'), + (0x3389, 'M', u'kcal'), + (0x338A, 'M', u'pf'), + (0x338B, 'M', u'nf'), + (0x338C, 'M', u'μf'), + (0x338D, 'M', u'μg'), + (0x338E, 'M', u'mg'), + (0x338F, 'M', u'kg'), + (0x3390, 'M', u'hz'), + (0x3391, 'M', u'khz'), + (0x3392, 'M', u'mhz'), + (0x3393, 'M', u'ghz'), + (0x3394, 'M', u'thz'), + (0x3395, 'M', u'μl'), + (0x3396, 'M', u'ml'), + (0x3397, 'M', u'dl'), + (0x3398, 'M', u'kl'), + (0x3399, 'M', u'fm'), + (0x339A, 'M', u'nm'), + (0x339B, 'M', u'μm'), + ] + +def _seg_34(): + return [ + (0x339C, 'M', u'mm'), + (0x339D, 'M', u'cm'), + (0x339E, 'M', u'km'), + (0x339F, 'M', u'mm2'), + (0x33A0, 'M', u'cm2'), + (0x33A1, 'M', u'm2'), + (0x33A2, 'M', u'km2'), + (0x33A3, 'M', u'mm3'), + (0x33A4, 'M', u'cm3'), + (0x33A5, 'M', u'm3'), + (0x33A6, 'M', u'km3'), + (0x33A7, 'M', u'm∕s'), + (0x33A8, 'M', u'm∕s2'), + (0x33A9, 'M', u'pa'), + (0x33AA, 'M', u'kpa'), + (0x33AB, 'M', u'mpa'), + (0x33AC, 'M', u'gpa'), + (0x33AD, 'M', u'rad'), + (0x33AE, 'M', u'rad∕s'), + (0x33AF, 'M', u'rad∕s2'), + (0x33B0, 'M', u'ps'), + (0x33B1, 'M', u'ns'), + (0x33B2, 'M', u'μs'), + (0x33B3, 'M', u'ms'), + (0x33B4, 'M', u'pv'), + (0x33B5, 'M', u'nv'), + (0x33B6, 'M', u'μv'), + (0x33B7, 'M', u'mv'), + (0x33B8, 'M', u'kv'), + (0x33B9, 'M', u'mv'), + (0x33BA, 'M', u'pw'), + (0x33BB, 'M', u'nw'), + (0x33BC, 'M', u'μw'), + (0x33BD, 'M', u'mw'), + (0x33BE, 'M', u'kw'), + (0x33BF, 'M', u'mw'), + (0x33C0, 'M', u'kω'), + (0x33C1, 'M', u'mω'), + (0x33C2, 'X'), + (0x33C3, 'M', u'bq'), + (0x33C4, 'M', u'cc'), + (0x33C5, 'M', u'cd'), + (0x33C6, 'M', u'c∕kg'), + (0x33C7, 'X'), + (0x33C8, 'M', u'db'), + (0x33C9, 'M', u'gy'), + (0x33CA, 'M', u'ha'), + (0x33CB, 'M', u'hp'), + (0x33CC, 'M', u'in'), + (0x33CD, 'M', u'kk'), + (0x33CE, 'M', u'km'), + (0x33CF, 'M', u'kt'), + (0x33D0, 'M', u'lm'), + (0x33D1, 'M', u'ln'), + (0x33D2, 'M', u'log'), + (0x33D3, 'M', u'lx'), + (0x33D4, 'M', u'mb'), + (0x33D5, 'M', u'mil'), + (0x33D6, 'M', u'mol'), + (0x33D7, 'M', u'ph'), + (0x33D8, 'X'), + (0x33D9, 'M', u'ppm'), + (0x33DA, 'M', u'pr'), + (0x33DB, 'M', u'sr'), + (0x33DC, 'M', u'sv'), + (0x33DD, 'M', u'wb'), + (0x33DE, 'M', u'v∕m'), + (0x33DF, 'M', u'a∕m'), + (0x33E0, 'M', u'1日'), + (0x33E1, 'M', u'2日'), + (0x33E2, 'M', u'3日'), + (0x33E3, 'M', u'4日'), + (0x33E4, 'M', u'5日'), + (0x33E5, 'M', u'6日'), + (0x33E6, 'M', u'7日'), + (0x33E7, 'M', u'8日'), + (0x33E8, 'M', u'9日'), + (0x33E9, 'M', u'10日'), + (0x33EA, 'M', u'11日'), + (0x33EB, 'M', u'12日'), + (0x33EC, 'M', u'13日'), + (0x33ED, 'M', u'14日'), + (0x33EE, 'M', u'15日'), + (0x33EF, 'M', u'16日'), + (0x33F0, 'M', u'17日'), + (0x33F1, 'M', u'18日'), + (0x33F2, 'M', u'19日'), + (0x33F3, 'M', u'20日'), + (0x33F4, 'M', u'21日'), + (0x33F5, 'M', u'22日'), + (0x33F6, 'M', u'23日'), + (0x33F7, 'M', u'24日'), + (0x33F8, 'M', u'25日'), + (0x33F9, 'M', u'26日'), + (0x33FA, 'M', u'27日'), + (0x33FB, 'M', u'28日'), + (0x33FC, 'M', u'29日'), + (0x33FD, 'M', u'30日'), + (0x33FE, 'M', u'31日'), + (0x33FF, 'M', u'gal'), + ] + +def _seg_35(): + return [ + (0x3400, 'V'), + (0x4DB6, 'X'), + (0x4DC0, 'V'), + (0x9FCD, 'X'), + (0xA000, 'V'), + (0xA48D, 'X'), + (0xA490, 'V'), + (0xA4C7, 'X'), + (0xA4D0, 'V'), + (0xA62C, 'X'), + (0xA640, 'M', u'ꙁ'), + (0xA641, 'V'), + (0xA642, 'M', u'ꙃ'), + (0xA643, 'V'), + (0xA644, 'M', u'ꙅ'), + (0xA645, 'V'), + (0xA646, 'M', u'ꙇ'), + (0xA647, 'V'), + (0xA648, 'M', u'ꙉ'), + (0xA649, 'V'), + (0xA64A, 'M', u'ꙋ'), + (0xA64B, 'V'), + (0xA64C, 'M', u'ꙍ'), + (0xA64D, 'V'), + (0xA64E, 'M', u'ꙏ'), + (0xA64F, 'V'), + (0xA650, 'M', u'ꙑ'), + (0xA651, 'V'), + (0xA652, 'M', u'ꙓ'), + (0xA653, 'V'), + (0xA654, 'M', u'ꙕ'), + (0xA655, 'V'), + (0xA656, 'M', u'ꙗ'), + (0xA657, 'V'), + (0xA658, 'M', u'ꙙ'), + (0xA659, 'V'), + (0xA65A, 'M', u'ꙛ'), + (0xA65B, 'V'), + (0xA65C, 'M', u'ꙝ'), + (0xA65D, 'V'), + (0xA65E, 'M', u'ꙟ'), + (0xA65F, 'V'), + (0xA660, 'M', u'ꙡ'), + (0xA661, 'V'), + (0xA662, 'M', u'ꙣ'), + (0xA663, 'V'), + (0xA664, 'M', u'ꙥ'), + (0xA665, 'V'), + (0xA666, 'M', u'ꙧ'), + (0xA667, 'V'), + (0xA668, 'M', u'ꙩ'), + (0xA669, 'V'), + (0xA66A, 'M', u'ꙫ'), + (0xA66B, 'V'), + (0xA66C, 'M', u'ꙭ'), + (0xA66D, 'V'), + (0xA680, 'M', u'ꚁ'), + (0xA681, 'V'), + (0xA682, 'M', u'ꚃ'), + (0xA683, 'V'), + (0xA684, 'M', u'ꚅ'), + (0xA685, 'V'), + (0xA686, 'M', u'ꚇ'), + (0xA687, 'V'), + (0xA688, 'M', u'ꚉ'), + (0xA689, 'V'), + (0xA68A, 'M', u'ꚋ'), + (0xA68B, 'V'), + (0xA68C, 'M', u'ꚍ'), + (0xA68D, 'V'), + (0xA68E, 'M', u'ꚏ'), + (0xA68F, 'V'), + (0xA690, 'M', u'ꚑ'), + (0xA691, 'V'), + (0xA692, 'M', u'ꚓ'), + (0xA693, 'V'), + (0xA694, 'M', u'ꚕ'), + (0xA695, 'V'), + (0xA696, 'M', u'ꚗ'), + (0xA697, 'V'), + (0xA698, 'X'), + (0xA69F, 'V'), + (0xA6F8, 'X'), + (0xA700, 'V'), + (0xA722, 'M', u'ꜣ'), + (0xA723, 'V'), + (0xA724, 'M', u'ꜥ'), + (0xA725, 'V'), + (0xA726, 'M', u'ꜧ'), + (0xA727, 'V'), + (0xA728, 'M', u'ꜩ'), + (0xA729, 'V'), + (0xA72A, 'M', u'ꜫ'), + (0xA72B, 'V'), + (0xA72C, 'M', u'ꜭ'), + (0xA72D, 'V'), + (0xA72E, 'M', u'ꜯ'), + (0xA72F, 'V'), + (0xA732, 'M', u'ꜳ'), + (0xA733, 'V'), + ] + +def _seg_36(): + return [ + (0xA734, 'M', u'ꜵ'), + (0xA735, 'V'), + (0xA736, 'M', u'ꜷ'), + (0xA737, 'V'), + (0xA738, 'M', u'ꜹ'), + (0xA739, 'V'), + (0xA73A, 'M', u'ꜻ'), + (0xA73B, 'V'), + (0xA73C, 'M', u'ꜽ'), + (0xA73D, 'V'), + (0xA73E, 'M', u'ꜿ'), + (0xA73F, 'V'), + (0xA740, 'M', u'ꝁ'), + (0xA741, 'V'), + (0xA742, 'M', u'ꝃ'), + (0xA743, 'V'), + (0xA744, 'M', u'ꝅ'), + (0xA745, 'V'), + (0xA746, 'M', u'ꝇ'), + (0xA747, 'V'), + (0xA748, 'M', u'ꝉ'), + (0xA749, 'V'), + (0xA74A, 'M', u'ꝋ'), + (0xA74B, 'V'), + (0xA74C, 'M', u'ꝍ'), + (0xA74D, 'V'), + (0xA74E, 'M', u'ꝏ'), + (0xA74F, 'V'), + (0xA750, 'M', u'ꝑ'), + (0xA751, 'V'), + (0xA752, 'M', u'ꝓ'), + (0xA753, 'V'), + (0xA754, 'M', u'ꝕ'), + (0xA755, 'V'), + (0xA756, 'M', u'ꝗ'), + (0xA757, 'V'), + (0xA758, 'M', u'ꝙ'), + (0xA759, 'V'), + (0xA75A, 'M', u'ꝛ'), + (0xA75B, 'V'), + (0xA75C, 'M', u'ꝝ'), + (0xA75D, 'V'), + (0xA75E, 'M', u'ꝟ'), + (0xA75F, 'V'), + (0xA760, 'M', u'ꝡ'), + (0xA761, 'V'), + (0xA762, 'M', u'ꝣ'), + (0xA763, 'V'), + (0xA764, 'M', u'ꝥ'), + (0xA765, 'V'), + (0xA766, 'M', u'ꝧ'), + (0xA767, 'V'), + (0xA768, 'M', u'ꝩ'), + (0xA769, 'V'), + (0xA76A, 'M', u'ꝫ'), + (0xA76B, 'V'), + (0xA76C, 'M', u'ꝭ'), + (0xA76D, 'V'), + (0xA76E, 'M', u'ꝯ'), + (0xA76F, 'V'), + (0xA770, 'M', u'ꝯ'), + (0xA771, 'V'), + (0xA779, 'M', u'ꝺ'), + (0xA77A, 'V'), + (0xA77B, 'M', u'ꝼ'), + (0xA77C, 'V'), + (0xA77D, 'M', u'ᵹ'), + (0xA77E, 'M', u'ꝿ'), + (0xA77F, 'V'), + (0xA780, 'M', u'ꞁ'), + (0xA781, 'V'), + (0xA782, 'M', u'ꞃ'), + (0xA783, 'V'), + (0xA784, 'M', u'ꞅ'), + (0xA785, 'V'), + (0xA786, 'M', u'ꞇ'), + (0xA787, 'V'), + (0xA78B, 'M', u'ꞌ'), + (0xA78C, 'V'), + (0xA78D, 'M', u'ɥ'), + (0xA78E, 'V'), + (0xA78F, 'X'), + (0xA790, 'M', u'ꞑ'), + (0xA791, 'V'), + (0xA792, 'M', u'ꞓ'), + (0xA793, 'V'), + (0xA794, 'X'), + (0xA7A0, 'M', u'ꞡ'), + (0xA7A1, 'V'), + (0xA7A2, 'M', u'ꞣ'), + (0xA7A3, 'V'), + (0xA7A4, 'M', u'ꞥ'), + (0xA7A5, 'V'), + (0xA7A6, 'M', u'ꞧ'), + (0xA7A7, 'V'), + (0xA7A8, 'M', u'ꞩ'), + (0xA7A9, 'V'), + (0xA7AA, 'M', u'ɦ'), + (0xA7AB, 'X'), + (0xA7F8, 'M', u'ħ'), + ] + +def _seg_37(): + return [ + (0xA7F9, 'M', u'œ'), + (0xA7FA, 'V'), + (0xA82C, 'X'), + (0xA830, 'V'), + (0xA83A, 'X'), + (0xA840, 'V'), + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C5, 'X'), + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), + (0xA8FC, 'X'), + (0xA900, 'V'), + (0xA954, 'X'), + (0xA95F, 'V'), + (0xA97D, 'X'), + (0xA980, 'V'), + (0xA9CE, 'X'), + (0xA9CF, 'V'), + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9E0, 'X'), + (0xAA00, 'V'), + (0xAA37, 'X'), + (0xAA40, 'V'), + (0xAA4E, 'X'), + (0xAA50, 'V'), + (0xAA5A, 'X'), + (0xAA5C, 'V'), + (0xAA7C, 'X'), + (0xAA80, 'V'), + (0xAAC3, 'X'), + (0xAADB, 'V'), + (0xAAF7, 'X'), + (0xAB01, 'V'), + (0xAB07, 'X'), + (0xAB09, 'V'), + (0xAB0F, 'X'), + (0xAB11, 'V'), + (0xAB17, 'X'), + (0xAB20, 'V'), + (0xAB27, 'X'), + (0xAB28, 'V'), + (0xAB2F, 'X'), + (0xABC0, 'V'), + (0xABEE, 'X'), + (0xABF0, 'V'), + (0xABFA, 'X'), + (0xAC00, 'V'), + (0xD7A4, 'X'), + (0xD7B0, 'V'), + (0xD7C7, 'X'), + (0xD7CB, 'V'), + (0xD7FC, 'X'), + (0xF900, 'M', u'豈'), + (0xF901, 'M', u'更'), + (0xF902, 'M', u'車'), + (0xF903, 'M', u'賈'), + (0xF904, 'M', u'滑'), + (0xF905, 'M', u'串'), + (0xF906, 'M', u'句'), + (0xF907, 'M', u'龜'), + (0xF909, 'M', u'契'), + (0xF90A, 'M', u'金'), + (0xF90B, 'M', u'喇'), + (0xF90C, 'M', u'奈'), + (0xF90D, 'M', u'懶'), + (0xF90E, 'M', u'癩'), + (0xF90F, 'M', u'羅'), + (0xF910, 'M', u'蘿'), + (0xF911, 'M', u'螺'), + (0xF912, 'M', u'裸'), + (0xF913, 'M', u'邏'), + (0xF914, 'M', u'樂'), + (0xF915, 'M', u'洛'), + (0xF916, 'M', u'烙'), + (0xF917, 'M', u'珞'), + (0xF918, 'M', u'落'), + (0xF919, 'M', u'酪'), + (0xF91A, 'M', u'駱'), + (0xF91B, 'M', u'亂'), + (0xF91C, 'M', u'卵'), + (0xF91D, 'M', u'欄'), + (0xF91E, 'M', u'爛'), + (0xF91F, 'M', u'蘭'), + (0xF920, 'M', u'鸞'), + (0xF921, 'M', u'嵐'), + (0xF922, 'M', u'濫'), + (0xF923, 'M', u'藍'), + (0xF924, 'M', u'襤'), + (0xF925, 'M', u'拉'), + (0xF926, 'M', u'臘'), + (0xF927, 'M', u'蠟'), + (0xF928, 'M', u'廊'), + (0xF929, 'M', u'朗'), + (0xF92A, 'M', u'浪'), + (0xF92B, 'M', u'狼'), + (0xF92C, 'M', u'郎'), + (0xF92D, 'M', u'來'), + ] + +def _seg_38(): + return [ + (0xF92E, 'M', u'冷'), + (0xF92F, 'M', u'勞'), + (0xF930, 'M', u'擄'), + (0xF931, 'M', u'櫓'), + (0xF932, 'M', u'爐'), + (0xF933, 'M', u'盧'), + (0xF934, 'M', u'老'), + (0xF935, 'M', u'蘆'), + (0xF936, 'M', u'虜'), + (0xF937, 'M', u'路'), + (0xF938, 'M', u'露'), + (0xF939, 'M', u'魯'), + (0xF93A, 'M', u'鷺'), + (0xF93B, 'M', u'碌'), + (0xF93C, 'M', u'祿'), + (0xF93D, 'M', u'綠'), + (0xF93E, 'M', u'菉'), + (0xF93F, 'M', u'錄'), + (0xF940, 'M', u'鹿'), + (0xF941, 'M', u'論'), + (0xF942, 'M', u'壟'), + (0xF943, 'M', u'弄'), + (0xF944, 'M', u'籠'), + (0xF945, 'M', u'聾'), + (0xF946, 'M', u'牢'), + (0xF947, 'M', u'磊'), + (0xF948, 'M', u'賂'), + (0xF949, 'M', u'雷'), + (0xF94A, 'M', u'壘'), + (0xF94B, 'M', u'屢'), + (0xF94C, 'M', u'樓'), + (0xF94D, 'M', u'淚'), + (0xF94E, 'M', u'漏'), + (0xF94F, 'M', u'累'), + (0xF950, 'M', u'縷'), + (0xF951, 'M', u'陋'), + (0xF952, 'M', u'勒'), + (0xF953, 'M', u'肋'), + (0xF954, 'M', u'凜'), + (0xF955, 'M', u'凌'), + (0xF956, 'M', u'稜'), + (0xF957, 'M', u'綾'), + (0xF958, 'M', u'菱'), + (0xF959, 'M', u'陵'), + (0xF95A, 'M', u'讀'), + (0xF95B, 'M', u'拏'), + (0xF95C, 'M', u'樂'), + (0xF95D, 'M', u'諾'), + (0xF95E, 'M', u'丹'), + (0xF95F, 'M', u'寧'), + (0xF960, 'M', u'怒'), + (0xF961, 'M', u'率'), + (0xF962, 'M', u'異'), + (0xF963, 'M', u'北'), + (0xF964, 'M', u'磻'), + (0xF965, 'M', u'便'), + (0xF966, 'M', u'復'), + (0xF967, 'M', u'不'), + (0xF968, 'M', u'泌'), + (0xF969, 'M', u'數'), + (0xF96A, 'M', u'索'), + (0xF96B, 'M', u'參'), + (0xF96C, 'M', u'塞'), + (0xF96D, 'M', u'省'), + (0xF96E, 'M', u'葉'), + (0xF96F, 'M', u'說'), + (0xF970, 'M', u'殺'), + (0xF971, 'M', u'辰'), + (0xF972, 'M', u'沈'), + (0xF973, 'M', u'拾'), + (0xF974, 'M', u'若'), + (0xF975, 'M', u'掠'), + (0xF976, 'M', u'略'), + (0xF977, 'M', u'亮'), + (0xF978, 'M', u'兩'), + (0xF979, 'M', u'凉'), + (0xF97A, 'M', u'梁'), + (0xF97B, 'M', u'糧'), + (0xF97C, 'M', u'良'), + (0xF97D, 'M', u'諒'), + (0xF97E, 'M', u'量'), + (0xF97F, 'M', u'勵'), + (0xF980, 'M', u'呂'), + (0xF981, 'M', u'女'), + (0xF982, 'M', u'廬'), + (0xF983, 'M', u'旅'), + (0xF984, 'M', u'濾'), + (0xF985, 'M', u'礪'), + (0xF986, 'M', u'閭'), + (0xF987, 'M', u'驪'), + (0xF988, 'M', u'麗'), + (0xF989, 'M', u'黎'), + (0xF98A, 'M', u'力'), + (0xF98B, 'M', u'曆'), + (0xF98C, 'M', u'歷'), + (0xF98D, 'M', u'轢'), + (0xF98E, 'M', u'年'), + (0xF98F, 'M', u'憐'), + (0xF990, 'M', u'戀'), + (0xF991, 'M', u'撚'), + ] + +def _seg_39(): + return [ + (0xF992, 'M', u'漣'), + (0xF993, 'M', u'煉'), + (0xF994, 'M', u'璉'), + (0xF995, 'M', u'秊'), + (0xF996, 'M', u'練'), + (0xF997, 'M', u'聯'), + (0xF998, 'M', u'輦'), + (0xF999, 'M', u'蓮'), + (0xF99A, 'M', u'連'), + (0xF99B, 'M', u'鍊'), + (0xF99C, 'M', u'列'), + (0xF99D, 'M', u'劣'), + (0xF99E, 'M', u'咽'), + (0xF99F, 'M', u'烈'), + (0xF9A0, 'M', u'裂'), + (0xF9A1, 'M', u'說'), + (0xF9A2, 'M', u'廉'), + (0xF9A3, 'M', u'念'), + (0xF9A4, 'M', u'捻'), + (0xF9A5, 'M', u'殮'), + (0xF9A6, 'M', u'簾'), + (0xF9A7, 'M', u'獵'), + (0xF9A8, 'M', u'令'), + (0xF9A9, 'M', u'囹'), + (0xF9AA, 'M', u'寧'), + (0xF9AB, 'M', u'嶺'), + (0xF9AC, 'M', u'怜'), + (0xF9AD, 'M', u'玲'), + (0xF9AE, 'M', u'瑩'), + (0xF9AF, 'M', u'羚'), + (0xF9B0, 'M', u'聆'), + (0xF9B1, 'M', u'鈴'), + (0xF9B2, 'M', u'零'), + (0xF9B3, 'M', u'靈'), + (0xF9B4, 'M', u'領'), + (0xF9B5, 'M', u'例'), + (0xF9B6, 'M', u'禮'), + (0xF9B7, 'M', u'醴'), + (0xF9B8, 'M', u'隸'), + (0xF9B9, 'M', u'惡'), + (0xF9BA, 'M', u'了'), + (0xF9BB, 'M', u'僚'), + (0xF9BC, 'M', u'寮'), + (0xF9BD, 'M', u'尿'), + (0xF9BE, 'M', u'料'), + (0xF9BF, 'M', u'樂'), + (0xF9C0, 'M', u'燎'), + (0xF9C1, 'M', u'療'), + (0xF9C2, 'M', u'蓼'), + (0xF9C3, 'M', u'遼'), + (0xF9C4, 'M', u'龍'), + (0xF9C5, 'M', u'暈'), + (0xF9C6, 'M', u'阮'), + (0xF9C7, 'M', u'劉'), + (0xF9C8, 'M', u'杻'), + (0xF9C9, 'M', u'柳'), + (0xF9CA, 'M', u'流'), + (0xF9CB, 'M', u'溜'), + (0xF9CC, 'M', u'琉'), + (0xF9CD, 'M', u'留'), + (0xF9CE, 'M', u'硫'), + (0xF9CF, 'M', u'紐'), + (0xF9D0, 'M', u'類'), + (0xF9D1, 'M', u'六'), + (0xF9D2, 'M', u'戮'), + (0xF9D3, 'M', u'陸'), + (0xF9D4, 'M', u'倫'), + (0xF9D5, 'M', u'崙'), + (0xF9D6, 'M', u'淪'), + (0xF9D7, 'M', u'輪'), + (0xF9D8, 'M', u'律'), + (0xF9D9, 'M', u'慄'), + (0xF9DA, 'M', u'栗'), + (0xF9DB, 'M', u'率'), + (0xF9DC, 'M', u'隆'), + (0xF9DD, 'M', u'利'), + (0xF9DE, 'M', u'吏'), + (0xF9DF, 'M', u'履'), + (0xF9E0, 'M', u'易'), + (0xF9E1, 'M', u'李'), + (0xF9E2, 'M', u'梨'), + (0xF9E3, 'M', u'泥'), + (0xF9E4, 'M', u'理'), + (0xF9E5, 'M', u'痢'), + (0xF9E6, 'M', u'罹'), + (0xF9E7, 'M', u'裏'), + (0xF9E8, 'M', u'裡'), + (0xF9E9, 'M', u'里'), + (0xF9EA, 'M', u'離'), + (0xF9EB, 'M', u'匿'), + (0xF9EC, 'M', u'溺'), + (0xF9ED, 'M', u'吝'), + (0xF9EE, 'M', u'燐'), + (0xF9EF, 'M', u'璘'), + (0xF9F0, 'M', u'藺'), + (0xF9F1, 'M', u'隣'), + (0xF9F2, 'M', u'鱗'), + (0xF9F3, 'M', u'麟'), + (0xF9F4, 'M', u'林'), + (0xF9F5, 'M', u'淋'), + ] + +def _seg_40(): + return [ + (0xF9F6, 'M', u'臨'), + (0xF9F7, 'M', u'立'), + (0xF9F8, 'M', u'笠'), + (0xF9F9, 'M', u'粒'), + (0xF9FA, 'M', u'狀'), + (0xF9FB, 'M', u'炙'), + (0xF9FC, 'M', u'識'), + (0xF9FD, 'M', u'什'), + (0xF9FE, 'M', u'茶'), + (0xF9FF, 'M', u'刺'), + (0xFA00, 'M', u'切'), + (0xFA01, 'M', u'度'), + (0xFA02, 'M', u'拓'), + (0xFA03, 'M', u'糖'), + (0xFA04, 'M', u'宅'), + (0xFA05, 'M', u'洞'), + (0xFA06, 'M', u'暴'), + (0xFA07, 'M', u'輻'), + (0xFA08, 'M', u'行'), + (0xFA09, 'M', u'降'), + (0xFA0A, 'M', u'見'), + (0xFA0B, 'M', u'廓'), + (0xFA0C, 'M', u'兀'), + (0xFA0D, 'M', u'嗀'), + (0xFA0E, 'V'), + (0xFA10, 'M', u'塚'), + (0xFA11, 'V'), + (0xFA12, 'M', u'晴'), + (0xFA13, 'V'), + (0xFA15, 'M', u'凞'), + (0xFA16, 'M', u'猪'), + (0xFA17, 'M', u'益'), + (0xFA18, 'M', u'礼'), + (0xFA19, 'M', u'神'), + (0xFA1A, 'M', u'祥'), + (0xFA1B, 'M', u'福'), + (0xFA1C, 'M', u'靖'), + (0xFA1D, 'M', u'精'), + (0xFA1E, 'M', u'羽'), + (0xFA1F, 'V'), + (0xFA20, 'M', u'蘒'), + (0xFA21, 'V'), + (0xFA22, 'M', u'諸'), + (0xFA23, 'V'), + (0xFA25, 'M', u'逸'), + (0xFA26, 'M', u'都'), + (0xFA27, 'V'), + (0xFA2A, 'M', u'飯'), + (0xFA2B, 'M', u'飼'), + (0xFA2C, 'M', u'館'), + (0xFA2D, 'M', u'鶴'), + (0xFA2E, 'M', u'郞'), + (0xFA2F, 'M', u'隷'), + (0xFA30, 'M', u'侮'), + (0xFA31, 'M', u'僧'), + (0xFA32, 'M', u'免'), + (0xFA33, 'M', u'勉'), + (0xFA34, 'M', u'勤'), + (0xFA35, 'M', u'卑'), + (0xFA36, 'M', u'喝'), + (0xFA37, 'M', u'嘆'), + (0xFA38, 'M', u'器'), + (0xFA39, 'M', u'塀'), + (0xFA3A, 'M', u'墨'), + (0xFA3B, 'M', u'層'), + (0xFA3C, 'M', u'屮'), + (0xFA3D, 'M', u'悔'), + (0xFA3E, 'M', u'慨'), + (0xFA3F, 'M', u'憎'), + (0xFA40, 'M', u'懲'), + (0xFA41, 'M', u'敏'), + (0xFA42, 'M', u'既'), + (0xFA43, 'M', u'暑'), + (0xFA44, 'M', u'梅'), + (0xFA45, 'M', u'海'), + (0xFA46, 'M', u'渚'), + (0xFA47, 'M', u'漢'), + (0xFA48, 'M', u'煮'), + (0xFA49, 'M', u'爫'), + (0xFA4A, 'M', u'琢'), + (0xFA4B, 'M', u'碑'), + (0xFA4C, 'M', u'社'), + (0xFA4D, 'M', u'祉'), + (0xFA4E, 'M', u'祈'), + (0xFA4F, 'M', u'祐'), + (0xFA50, 'M', u'祖'), + (0xFA51, 'M', u'祝'), + (0xFA52, 'M', u'禍'), + (0xFA53, 'M', u'禎'), + (0xFA54, 'M', u'穀'), + (0xFA55, 'M', u'突'), + (0xFA56, 'M', u'節'), + (0xFA57, 'M', u'練'), + (0xFA58, 'M', u'縉'), + (0xFA59, 'M', u'繁'), + (0xFA5A, 'M', u'署'), + (0xFA5B, 'M', u'者'), + (0xFA5C, 'M', u'臭'), + (0xFA5D, 'M', u'艹'), + (0xFA5F, 'M', u'著'), + ] + +def _seg_41(): + return [ + (0xFA60, 'M', u'褐'), + (0xFA61, 'M', u'視'), + (0xFA62, 'M', u'謁'), + (0xFA63, 'M', u'謹'), + (0xFA64, 'M', u'賓'), + (0xFA65, 'M', u'贈'), + (0xFA66, 'M', u'辶'), + (0xFA67, 'M', u'逸'), + (0xFA68, 'M', u'難'), + (0xFA69, 'M', u'響'), + (0xFA6A, 'M', u'頻'), + (0xFA6B, 'M', u'恵'), + (0xFA6C, 'M', u'𤋮'), + (0xFA6D, 'M', u'舘'), + (0xFA6E, 'X'), + (0xFA70, 'M', u'並'), + (0xFA71, 'M', u'况'), + (0xFA72, 'M', u'全'), + (0xFA73, 'M', u'侀'), + (0xFA74, 'M', u'充'), + (0xFA75, 'M', u'冀'), + (0xFA76, 'M', u'勇'), + (0xFA77, 'M', u'勺'), + (0xFA78, 'M', u'喝'), + (0xFA79, 'M', u'啕'), + (0xFA7A, 'M', u'喙'), + (0xFA7B, 'M', u'嗢'), + (0xFA7C, 'M', u'塚'), + (0xFA7D, 'M', u'墳'), + (0xFA7E, 'M', u'奄'), + (0xFA7F, 'M', u'奔'), + (0xFA80, 'M', u'婢'), + (0xFA81, 'M', u'嬨'), + (0xFA82, 'M', u'廒'), + (0xFA83, 'M', u'廙'), + (0xFA84, 'M', u'彩'), + (0xFA85, 'M', u'徭'), + (0xFA86, 'M', u'惘'), + (0xFA87, 'M', u'慎'), + (0xFA88, 'M', u'愈'), + (0xFA89, 'M', u'憎'), + (0xFA8A, 'M', u'慠'), + (0xFA8B, 'M', u'懲'), + (0xFA8C, 'M', u'戴'), + (0xFA8D, 'M', u'揄'), + (0xFA8E, 'M', u'搜'), + (0xFA8F, 'M', u'摒'), + (0xFA90, 'M', u'敖'), + (0xFA91, 'M', u'晴'), + (0xFA92, 'M', u'朗'), + (0xFA93, 'M', u'望'), + (0xFA94, 'M', u'杖'), + (0xFA95, 'M', u'歹'), + (0xFA96, 'M', u'殺'), + (0xFA97, 'M', u'流'), + (0xFA98, 'M', u'滛'), + (0xFA99, 'M', u'滋'), + (0xFA9A, 'M', u'漢'), + (0xFA9B, 'M', u'瀞'), + (0xFA9C, 'M', u'煮'), + (0xFA9D, 'M', u'瞧'), + (0xFA9E, 'M', u'爵'), + (0xFA9F, 'M', u'犯'), + (0xFAA0, 'M', u'猪'), + (0xFAA1, 'M', u'瑱'), + (0xFAA2, 'M', u'甆'), + (0xFAA3, 'M', u'画'), + (0xFAA4, 'M', u'瘝'), + (0xFAA5, 'M', u'瘟'), + (0xFAA6, 'M', u'益'), + (0xFAA7, 'M', u'盛'), + (0xFAA8, 'M', u'直'), + (0xFAA9, 'M', u'睊'), + (0xFAAA, 'M', u'着'), + (0xFAAB, 'M', u'磌'), + (0xFAAC, 'M', u'窱'), + (0xFAAD, 'M', u'節'), + (0xFAAE, 'M', u'类'), + (0xFAAF, 'M', u'絛'), + (0xFAB0, 'M', u'練'), + (0xFAB1, 'M', u'缾'), + (0xFAB2, 'M', u'者'), + (0xFAB3, 'M', u'荒'), + (0xFAB4, 'M', u'華'), + (0xFAB5, 'M', u'蝹'), + (0xFAB6, 'M', u'襁'), + (0xFAB7, 'M', u'覆'), + (0xFAB8, 'M', u'視'), + (0xFAB9, 'M', u'調'), + (0xFABA, 'M', u'諸'), + (0xFABB, 'M', u'請'), + (0xFABC, 'M', u'謁'), + (0xFABD, 'M', u'諾'), + (0xFABE, 'M', u'諭'), + (0xFABF, 'M', u'謹'), + (0xFAC0, 'M', u'變'), + (0xFAC1, 'M', u'贈'), + (0xFAC2, 'M', u'輸'), + (0xFAC3, 'M', u'遲'), + (0xFAC4, 'M', u'醙'), + ] + +def _seg_42(): + return [ + (0xFAC5, 'M', u'鉶'), + (0xFAC6, 'M', u'陼'), + (0xFAC7, 'M', u'難'), + (0xFAC8, 'M', u'靖'), + (0xFAC9, 'M', u'韛'), + (0xFACA, 'M', u'響'), + (0xFACB, 'M', u'頋'), + (0xFACC, 'M', u'頻'), + (0xFACD, 'M', u'鬒'), + (0xFACE, 'M', u'龜'), + (0xFACF, 'M', u'𢡊'), + (0xFAD0, 'M', u'𢡄'), + (0xFAD1, 'M', u'𣏕'), + (0xFAD2, 'M', u'㮝'), + (0xFAD3, 'M', u'䀘'), + (0xFAD4, 'M', u'䀹'), + (0xFAD5, 'M', u'𥉉'), + (0xFAD6, 'M', u'𥳐'), + (0xFAD7, 'M', u'𧻓'), + (0xFAD8, 'M', u'齃'), + (0xFAD9, 'M', u'龎'), + (0xFADA, 'X'), + (0xFB00, 'M', u'ff'), + (0xFB01, 'M', u'fi'), + (0xFB02, 'M', u'fl'), + (0xFB03, 'M', u'ffi'), + (0xFB04, 'M', u'ffl'), + (0xFB05, 'M', u'st'), + (0xFB07, 'X'), + (0xFB13, 'M', u'մն'), + (0xFB14, 'M', u'մե'), + (0xFB15, 'M', u'մի'), + (0xFB16, 'M', u'վն'), + (0xFB17, 'M', u'մխ'), + (0xFB18, 'X'), + (0xFB1D, 'M', u'יִ'), + (0xFB1E, 'V'), + (0xFB1F, 'M', u'ײַ'), + (0xFB20, 'M', u'ע'), + (0xFB21, 'M', u'א'), + (0xFB22, 'M', u'ד'), + (0xFB23, 'M', u'ה'), + (0xFB24, 'M', u'כ'), + (0xFB25, 'M', u'ל'), + (0xFB26, 'M', u'ם'), + (0xFB27, 'M', u'ר'), + (0xFB28, 'M', u'ת'), + (0xFB29, '3', u'+'), + (0xFB2A, 'M', u'שׁ'), + (0xFB2B, 'M', u'שׂ'), + (0xFB2C, 'M', u'שּׁ'), + (0xFB2D, 'M', u'שּׂ'), + (0xFB2E, 'M', u'אַ'), + (0xFB2F, 'M', u'אָ'), + (0xFB30, 'M', u'אּ'), + (0xFB31, 'M', u'בּ'), + (0xFB32, 'M', u'גּ'), + (0xFB33, 'M', u'דּ'), + (0xFB34, 'M', u'הּ'), + (0xFB35, 'M', u'וּ'), + (0xFB36, 'M', u'זּ'), + (0xFB37, 'X'), + (0xFB38, 'M', u'טּ'), + (0xFB39, 'M', u'יּ'), + (0xFB3A, 'M', u'ךּ'), + (0xFB3B, 'M', u'כּ'), + (0xFB3C, 'M', u'לּ'), + (0xFB3D, 'X'), + (0xFB3E, 'M', u'מּ'), + (0xFB3F, 'X'), + (0xFB40, 'M', u'נּ'), + (0xFB41, 'M', u'סּ'), + (0xFB42, 'X'), + (0xFB43, 'M', u'ףּ'), + (0xFB44, 'M', u'פּ'), + (0xFB45, 'X'), + (0xFB46, 'M', u'צּ'), + (0xFB47, 'M', u'קּ'), + (0xFB48, 'M', u'רּ'), + (0xFB49, 'M', u'שּ'), + (0xFB4A, 'M', u'תּ'), + (0xFB4B, 'M', u'וֹ'), + (0xFB4C, 'M', u'בֿ'), + (0xFB4D, 'M', u'כֿ'), + (0xFB4E, 'M', u'פֿ'), + (0xFB4F, 'M', u'אל'), + (0xFB50, 'M', u'ٱ'), + (0xFB52, 'M', u'ٻ'), + (0xFB56, 'M', u'پ'), + (0xFB5A, 'M', u'ڀ'), + (0xFB5E, 'M', u'ٺ'), + (0xFB62, 'M', u'ٿ'), + (0xFB66, 'M', u'ٹ'), + (0xFB6A, 'M', u'ڤ'), + (0xFB6E, 'M', u'ڦ'), + (0xFB72, 'M', u'ڄ'), + (0xFB76, 'M', u'ڃ'), + (0xFB7A, 'M', u'چ'), + (0xFB7E, 'M', u'ڇ'), + (0xFB82, 'M', u'ڍ'), + ] + +def _seg_43(): + return [ + (0xFB84, 'M', u'ڌ'), + (0xFB86, 'M', u'ڎ'), + (0xFB88, 'M', u'ڈ'), + (0xFB8A, 'M', u'ژ'), + (0xFB8C, 'M', u'ڑ'), + (0xFB8E, 'M', u'ک'), + (0xFB92, 'M', u'گ'), + (0xFB96, 'M', u'ڳ'), + (0xFB9A, 'M', u'ڱ'), + (0xFB9E, 'M', u'ں'), + (0xFBA0, 'M', u'ڻ'), + (0xFBA4, 'M', u'ۀ'), + (0xFBA6, 'M', u'ہ'), + (0xFBAA, 'M', u'ھ'), + (0xFBAE, 'M', u'ے'), + (0xFBB0, 'M', u'ۓ'), + (0xFBB2, 'V'), + (0xFBC2, 'X'), + (0xFBD3, 'M', u'ڭ'), + (0xFBD7, 'M', u'ۇ'), + (0xFBD9, 'M', u'ۆ'), + (0xFBDB, 'M', u'ۈ'), + (0xFBDD, 'M', u'ۇٴ'), + (0xFBDE, 'M', u'ۋ'), + (0xFBE0, 'M', u'ۅ'), + (0xFBE2, 'M', u'ۉ'), + (0xFBE4, 'M', u'ې'), + (0xFBE8, 'M', u'ى'), + (0xFBEA, 'M', u'ئا'), + (0xFBEC, 'M', u'ئە'), + (0xFBEE, 'M', u'ئو'), + (0xFBF0, 'M', u'ئۇ'), + (0xFBF2, 'M', u'ئۆ'), + (0xFBF4, 'M', u'ئۈ'), + (0xFBF6, 'M', u'ئې'), + (0xFBF9, 'M', u'ئى'), + (0xFBFC, 'M', u'ی'), + (0xFC00, 'M', u'ئج'), + (0xFC01, 'M', u'ئح'), + (0xFC02, 'M', u'ئم'), + (0xFC03, 'M', u'ئى'), + (0xFC04, 'M', u'ئي'), + (0xFC05, 'M', u'بج'), + (0xFC06, 'M', u'بح'), + (0xFC07, 'M', u'بخ'), + (0xFC08, 'M', u'بم'), + (0xFC09, 'M', u'بى'), + (0xFC0A, 'M', u'بي'), + (0xFC0B, 'M', u'تج'), + (0xFC0C, 'M', u'تح'), + (0xFC0D, 'M', u'تخ'), + (0xFC0E, 'M', u'تم'), + (0xFC0F, 'M', u'تى'), + (0xFC10, 'M', u'تي'), + (0xFC11, 'M', u'ثج'), + (0xFC12, 'M', u'ثم'), + (0xFC13, 'M', u'ثى'), + (0xFC14, 'M', u'ثي'), + (0xFC15, 'M', u'جح'), + (0xFC16, 'M', u'جم'), + (0xFC17, 'M', u'حج'), + (0xFC18, 'M', u'حم'), + (0xFC19, 'M', u'خج'), + (0xFC1A, 'M', u'خح'), + (0xFC1B, 'M', u'خم'), + (0xFC1C, 'M', u'سج'), + (0xFC1D, 'M', u'سح'), + (0xFC1E, 'M', u'سخ'), + (0xFC1F, 'M', u'سم'), + (0xFC20, 'M', u'صح'), + (0xFC21, 'M', u'صم'), + (0xFC22, 'M', u'ضج'), + (0xFC23, 'M', u'ضح'), + (0xFC24, 'M', u'ضخ'), + (0xFC25, 'M', u'ضم'), + (0xFC26, 'M', u'طح'), + (0xFC27, 'M', u'طم'), + (0xFC28, 'M', u'ظم'), + (0xFC29, 'M', u'عج'), + (0xFC2A, 'M', u'عم'), + (0xFC2B, 'M', u'غج'), + (0xFC2C, 'M', u'غم'), + (0xFC2D, 'M', u'فج'), + (0xFC2E, 'M', u'فح'), + (0xFC2F, 'M', u'فخ'), + (0xFC30, 'M', u'فم'), + (0xFC31, 'M', u'فى'), + (0xFC32, 'M', u'في'), + (0xFC33, 'M', u'قح'), + (0xFC34, 'M', u'قم'), + (0xFC35, 'M', u'قى'), + (0xFC36, 'M', u'قي'), + (0xFC37, 'M', u'كا'), + (0xFC38, 'M', u'كج'), + (0xFC39, 'M', u'كح'), + (0xFC3A, 'M', u'كخ'), + (0xFC3B, 'M', u'كل'), + (0xFC3C, 'M', u'كم'), + (0xFC3D, 'M', u'كى'), + (0xFC3E, 'M', u'كي'), + ] + +def _seg_44(): + return [ + (0xFC3F, 'M', u'لج'), + (0xFC40, 'M', u'لح'), + (0xFC41, 'M', u'لخ'), + (0xFC42, 'M', u'لم'), + (0xFC43, 'M', u'لى'), + (0xFC44, 'M', u'لي'), + (0xFC45, 'M', u'مج'), + (0xFC46, 'M', u'مح'), + (0xFC47, 'M', u'مخ'), + (0xFC48, 'M', u'مم'), + (0xFC49, 'M', u'مى'), + (0xFC4A, 'M', u'مي'), + (0xFC4B, 'M', u'نج'), + (0xFC4C, 'M', u'نح'), + (0xFC4D, 'M', u'نخ'), + (0xFC4E, 'M', u'نم'), + (0xFC4F, 'M', u'نى'), + (0xFC50, 'M', u'ني'), + (0xFC51, 'M', u'هج'), + (0xFC52, 'M', u'هم'), + (0xFC53, 'M', u'هى'), + (0xFC54, 'M', u'هي'), + (0xFC55, 'M', u'يج'), + (0xFC56, 'M', u'يح'), + (0xFC57, 'M', u'يخ'), + (0xFC58, 'M', u'يم'), + (0xFC59, 'M', u'يى'), + (0xFC5A, 'M', u'يي'), + (0xFC5B, 'M', u'ذٰ'), + (0xFC5C, 'M', u'رٰ'), + (0xFC5D, 'M', u'ىٰ'), + (0xFC5E, '3', u' ٌّ'), + (0xFC5F, '3', u' ٍّ'), + (0xFC60, '3', u' َّ'), + (0xFC61, '3', u' ُّ'), + (0xFC62, '3', u' ِّ'), + (0xFC63, '3', u' ّٰ'), + (0xFC64, 'M', u'ئر'), + (0xFC65, 'M', u'ئز'), + (0xFC66, 'M', u'ئم'), + (0xFC67, 'M', u'ئن'), + (0xFC68, 'M', u'ئى'), + (0xFC69, 'M', u'ئي'), + (0xFC6A, 'M', u'بر'), + (0xFC6B, 'M', u'بز'), + (0xFC6C, 'M', u'بم'), + (0xFC6D, 'M', u'بن'), + (0xFC6E, 'M', u'بى'), + (0xFC6F, 'M', u'بي'), + (0xFC70, 'M', u'تر'), + (0xFC71, 'M', u'تز'), + (0xFC72, 'M', u'تم'), + (0xFC73, 'M', u'تن'), + (0xFC74, 'M', u'تى'), + (0xFC75, 'M', u'تي'), + (0xFC76, 'M', u'ثر'), + (0xFC77, 'M', u'ثز'), + (0xFC78, 'M', u'ثم'), + (0xFC79, 'M', u'ثن'), + (0xFC7A, 'M', u'ثى'), + (0xFC7B, 'M', u'ثي'), + (0xFC7C, 'M', u'فى'), + (0xFC7D, 'M', u'في'), + (0xFC7E, 'M', u'قى'), + (0xFC7F, 'M', u'قي'), + (0xFC80, 'M', u'كا'), + (0xFC81, 'M', u'كل'), + (0xFC82, 'M', u'كم'), + (0xFC83, 'M', u'كى'), + (0xFC84, 'M', u'كي'), + (0xFC85, 'M', u'لم'), + (0xFC86, 'M', u'لى'), + (0xFC87, 'M', u'لي'), + (0xFC88, 'M', u'ما'), + (0xFC89, 'M', u'مم'), + (0xFC8A, 'M', u'نر'), + (0xFC8B, 'M', u'نز'), + (0xFC8C, 'M', u'نم'), + (0xFC8D, 'M', u'نن'), + (0xFC8E, 'M', u'نى'), + (0xFC8F, 'M', u'ني'), + (0xFC90, 'M', u'ىٰ'), + (0xFC91, 'M', u'ير'), + (0xFC92, 'M', u'يز'), + (0xFC93, 'M', u'يم'), + (0xFC94, 'M', u'ين'), + (0xFC95, 'M', u'يى'), + (0xFC96, 'M', u'يي'), + (0xFC97, 'M', u'ئج'), + (0xFC98, 'M', u'ئح'), + (0xFC99, 'M', u'ئخ'), + (0xFC9A, 'M', u'ئم'), + (0xFC9B, 'M', u'ئه'), + (0xFC9C, 'M', u'بج'), + (0xFC9D, 'M', u'بح'), + (0xFC9E, 'M', u'بخ'), + (0xFC9F, 'M', u'بم'), + (0xFCA0, 'M', u'به'), + (0xFCA1, 'M', u'تج'), + (0xFCA2, 'M', u'تح'), + ] + +def _seg_45(): + return [ + (0xFCA3, 'M', u'تخ'), + (0xFCA4, 'M', u'تم'), + (0xFCA5, 'M', u'ته'), + (0xFCA6, 'M', u'ثم'), + (0xFCA7, 'M', u'جح'), + (0xFCA8, 'M', u'جم'), + (0xFCA9, 'M', u'حج'), + (0xFCAA, 'M', u'حم'), + (0xFCAB, 'M', u'خج'), + (0xFCAC, 'M', u'خم'), + (0xFCAD, 'M', u'سج'), + (0xFCAE, 'M', u'سح'), + (0xFCAF, 'M', u'سخ'), + (0xFCB0, 'M', u'سم'), + (0xFCB1, 'M', u'صح'), + (0xFCB2, 'M', u'صخ'), + (0xFCB3, 'M', u'صم'), + (0xFCB4, 'M', u'ضج'), + (0xFCB5, 'M', u'ضح'), + (0xFCB6, 'M', u'ضخ'), + (0xFCB7, 'M', u'ضم'), + (0xFCB8, 'M', u'طح'), + (0xFCB9, 'M', u'ظم'), + (0xFCBA, 'M', u'عج'), + (0xFCBB, 'M', u'عم'), + (0xFCBC, 'M', u'غج'), + (0xFCBD, 'M', u'غم'), + (0xFCBE, 'M', u'فج'), + (0xFCBF, 'M', u'فح'), + (0xFCC0, 'M', u'فخ'), + (0xFCC1, 'M', u'فم'), + (0xFCC2, 'M', u'قح'), + (0xFCC3, 'M', u'قم'), + (0xFCC4, 'M', u'كج'), + (0xFCC5, 'M', u'كح'), + (0xFCC6, 'M', u'كخ'), + (0xFCC7, 'M', u'كل'), + (0xFCC8, 'M', u'كم'), + (0xFCC9, 'M', u'لج'), + (0xFCCA, 'M', u'لح'), + (0xFCCB, 'M', u'لخ'), + (0xFCCC, 'M', u'لم'), + (0xFCCD, 'M', u'له'), + (0xFCCE, 'M', u'مج'), + (0xFCCF, 'M', u'مح'), + (0xFCD0, 'M', u'مخ'), + (0xFCD1, 'M', u'مم'), + (0xFCD2, 'M', u'نج'), + (0xFCD3, 'M', u'نح'), + (0xFCD4, 'M', u'نخ'), + (0xFCD5, 'M', u'نم'), + (0xFCD6, 'M', u'نه'), + (0xFCD7, 'M', u'هج'), + (0xFCD8, 'M', u'هم'), + (0xFCD9, 'M', u'هٰ'), + (0xFCDA, 'M', u'يج'), + (0xFCDB, 'M', u'يح'), + (0xFCDC, 'M', u'يخ'), + (0xFCDD, 'M', u'يم'), + (0xFCDE, 'M', u'يه'), + (0xFCDF, 'M', u'ئم'), + (0xFCE0, 'M', u'ئه'), + (0xFCE1, 'M', u'بم'), + (0xFCE2, 'M', u'به'), + (0xFCE3, 'M', u'تم'), + (0xFCE4, 'M', u'ته'), + (0xFCE5, 'M', u'ثم'), + (0xFCE6, 'M', u'ثه'), + (0xFCE7, 'M', u'سم'), + (0xFCE8, 'M', u'سه'), + (0xFCE9, 'M', u'شم'), + (0xFCEA, 'M', u'شه'), + (0xFCEB, 'M', u'كل'), + (0xFCEC, 'M', u'كم'), + (0xFCED, 'M', u'لم'), + (0xFCEE, 'M', u'نم'), + (0xFCEF, 'M', u'نه'), + (0xFCF0, 'M', u'يم'), + (0xFCF1, 'M', u'يه'), + (0xFCF2, 'M', u'ـَّ'), + (0xFCF3, 'M', u'ـُّ'), + (0xFCF4, 'M', u'ـِّ'), + (0xFCF5, 'M', u'طى'), + (0xFCF6, 'M', u'طي'), + (0xFCF7, 'M', u'عى'), + (0xFCF8, 'M', u'عي'), + (0xFCF9, 'M', u'غى'), + (0xFCFA, 'M', u'غي'), + (0xFCFB, 'M', u'سى'), + (0xFCFC, 'M', u'سي'), + (0xFCFD, 'M', u'شى'), + (0xFCFE, 'M', u'شي'), + (0xFCFF, 'M', u'حى'), + (0xFD00, 'M', u'حي'), + (0xFD01, 'M', u'جى'), + (0xFD02, 'M', u'جي'), + (0xFD03, 'M', u'خى'), + (0xFD04, 'M', u'خي'), + (0xFD05, 'M', u'صى'), + (0xFD06, 'M', u'صي'), + ] + +def _seg_46(): + return [ + (0xFD07, 'M', u'ضى'), + (0xFD08, 'M', u'ضي'), + (0xFD09, 'M', u'شج'), + (0xFD0A, 'M', u'شح'), + (0xFD0B, 'M', u'شخ'), + (0xFD0C, 'M', u'شم'), + (0xFD0D, 'M', u'شر'), + (0xFD0E, 'M', u'سر'), + (0xFD0F, 'M', u'صر'), + (0xFD10, 'M', u'ضر'), + (0xFD11, 'M', u'طى'), + (0xFD12, 'M', u'طي'), + (0xFD13, 'M', u'عى'), + (0xFD14, 'M', u'عي'), + (0xFD15, 'M', u'غى'), + (0xFD16, 'M', u'غي'), + (0xFD17, 'M', u'سى'), + (0xFD18, 'M', u'سي'), + (0xFD19, 'M', u'شى'), + (0xFD1A, 'M', u'شي'), + (0xFD1B, 'M', u'حى'), + (0xFD1C, 'M', u'حي'), + (0xFD1D, 'M', u'جى'), + (0xFD1E, 'M', u'جي'), + (0xFD1F, 'M', u'خى'), + (0xFD20, 'M', u'خي'), + (0xFD21, 'M', u'صى'), + (0xFD22, 'M', u'صي'), + (0xFD23, 'M', u'ضى'), + (0xFD24, 'M', u'ضي'), + (0xFD25, 'M', u'شج'), + (0xFD26, 'M', u'شح'), + (0xFD27, 'M', u'شخ'), + (0xFD28, 'M', u'شم'), + (0xFD29, 'M', u'شر'), + (0xFD2A, 'M', u'سر'), + (0xFD2B, 'M', u'صر'), + (0xFD2C, 'M', u'ضر'), + (0xFD2D, 'M', u'شج'), + (0xFD2E, 'M', u'شح'), + (0xFD2F, 'M', u'شخ'), + (0xFD30, 'M', u'شم'), + (0xFD31, 'M', u'سه'), + (0xFD32, 'M', u'شه'), + (0xFD33, 'M', u'طم'), + (0xFD34, 'M', u'سج'), + (0xFD35, 'M', u'سح'), + (0xFD36, 'M', u'سخ'), + (0xFD37, 'M', u'شج'), + (0xFD38, 'M', u'شح'), + (0xFD39, 'M', u'شخ'), + (0xFD3A, 'M', u'طم'), + (0xFD3B, 'M', u'ظم'), + (0xFD3C, 'M', u'اً'), + (0xFD3E, 'V'), + (0xFD40, 'X'), + (0xFD50, 'M', u'تجم'), + (0xFD51, 'M', u'تحج'), + (0xFD53, 'M', u'تحم'), + (0xFD54, 'M', u'تخم'), + (0xFD55, 'M', u'تمج'), + (0xFD56, 'M', u'تمح'), + (0xFD57, 'M', u'تمخ'), + (0xFD58, 'M', u'جمح'), + (0xFD5A, 'M', u'حمي'), + (0xFD5B, 'M', u'حمى'), + (0xFD5C, 'M', u'سحج'), + (0xFD5D, 'M', u'سجح'), + (0xFD5E, 'M', u'سجى'), + (0xFD5F, 'M', u'سمح'), + (0xFD61, 'M', u'سمج'), + (0xFD62, 'M', u'سمم'), + (0xFD64, 'M', u'صحح'), + (0xFD66, 'M', u'صمم'), + (0xFD67, 'M', u'شحم'), + (0xFD69, 'M', u'شجي'), + (0xFD6A, 'M', u'شمخ'), + (0xFD6C, 'M', u'شمم'), + (0xFD6E, 'M', u'ضحى'), + (0xFD6F, 'M', u'ضخم'), + (0xFD71, 'M', u'طمح'), + (0xFD73, 'M', u'طمم'), + (0xFD74, 'M', u'طمي'), + (0xFD75, 'M', u'عجم'), + (0xFD76, 'M', u'عمم'), + (0xFD78, 'M', u'عمى'), + (0xFD79, 'M', u'غمم'), + (0xFD7A, 'M', u'غمي'), + (0xFD7B, 'M', u'غمى'), + (0xFD7C, 'M', u'فخم'), + (0xFD7E, 'M', u'قمح'), + (0xFD7F, 'M', u'قمم'), + (0xFD80, 'M', u'لحم'), + (0xFD81, 'M', u'لحي'), + (0xFD82, 'M', u'لحى'), + (0xFD83, 'M', u'لجج'), + (0xFD85, 'M', u'لخم'), + (0xFD87, 'M', u'لمح'), + (0xFD89, 'M', u'محج'), + (0xFD8A, 'M', u'محم'), + ] + +def _seg_47(): + return [ + (0xFD8B, 'M', u'محي'), + (0xFD8C, 'M', u'مجح'), + (0xFD8D, 'M', u'مجم'), + (0xFD8E, 'M', u'مخج'), + (0xFD8F, 'M', u'مخم'), + (0xFD90, 'X'), + (0xFD92, 'M', u'مجخ'), + (0xFD93, 'M', u'همج'), + (0xFD94, 'M', u'همم'), + (0xFD95, 'M', u'نحم'), + (0xFD96, 'M', u'نحى'), + (0xFD97, 'M', u'نجم'), + (0xFD99, 'M', u'نجى'), + (0xFD9A, 'M', u'نمي'), + (0xFD9B, 'M', u'نمى'), + (0xFD9C, 'M', u'يمم'), + (0xFD9E, 'M', u'بخي'), + (0xFD9F, 'M', u'تجي'), + (0xFDA0, 'M', u'تجى'), + (0xFDA1, 'M', u'تخي'), + (0xFDA2, 'M', u'تخى'), + (0xFDA3, 'M', u'تمي'), + (0xFDA4, 'M', u'تمى'), + (0xFDA5, 'M', u'جمي'), + (0xFDA6, 'M', u'جحى'), + (0xFDA7, 'M', u'جمى'), + (0xFDA8, 'M', u'سخى'), + (0xFDA9, 'M', u'صحي'), + (0xFDAA, 'M', u'شحي'), + (0xFDAB, 'M', u'ضحي'), + (0xFDAC, 'M', u'لجي'), + (0xFDAD, 'M', u'لمي'), + (0xFDAE, 'M', u'يحي'), + (0xFDAF, 'M', u'يجي'), + (0xFDB0, 'M', u'يمي'), + (0xFDB1, 'M', u'ممي'), + (0xFDB2, 'M', u'قمي'), + (0xFDB3, 'M', u'نحي'), + (0xFDB4, 'M', u'قمح'), + (0xFDB5, 'M', u'لحم'), + (0xFDB6, 'M', u'عمي'), + (0xFDB7, 'M', u'كمي'), + (0xFDB8, 'M', u'نجح'), + (0xFDB9, 'M', u'مخي'), + (0xFDBA, 'M', u'لجم'), + (0xFDBB, 'M', u'كمم'), + (0xFDBC, 'M', u'لجم'), + (0xFDBD, 'M', u'نجح'), + (0xFDBE, 'M', u'جحي'), + (0xFDBF, 'M', u'حجي'), + (0xFDC0, 'M', u'مجي'), + (0xFDC1, 'M', u'فمي'), + (0xFDC2, 'M', u'بحي'), + (0xFDC3, 'M', u'كمم'), + (0xFDC4, 'M', u'عجم'), + (0xFDC5, 'M', u'صمم'), + (0xFDC6, 'M', u'سخي'), + (0xFDC7, 'M', u'نجي'), + (0xFDC8, 'X'), + (0xFDF0, 'M', u'صلے'), + (0xFDF1, 'M', u'قلے'), + (0xFDF2, 'M', u'الله'), + (0xFDF3, 'M', u'اكبر'), + (0xFDF4, 'M', u'محمد'), + (0xFDF5, 'M', u'صلعم'), + (0xFDF6, 'M', u'رسول'), + (0xFDF7, 'M', u'عليه'), + (0xFDF8, 'M', u'وسلم'), + (0xFDF9, 'M', u'صلى'), + (0xFDFA, '3', u'صلى الله عليه وسلم'), + (0xFDFB, '3', u'جل جلاله'), + (0xFDFC, 'M', u'ریال'), + (0xFDFD, 'V'), + (0xFDFE, 'X'), + (0xFE00, 'I'), + (0xFE10, '3', u','), + (0xFE11, 'M', u'、'), + (0xFE12, 'X'), + (0xFE13, '3', u':'), + (0xFE14, '3', u';'), + (0xFE15, '3', u'!'), + (0xFE16, '3', u'?'), + (0xFE17, 'M', u'〖'), + (0xFE18, 'M', u'〗'), + (0xFE19, 'X'), + (0xFE20, 'V'), + (0xFE27, 'X'), + (0xFE31, 'M', u'—'), + (0xFE32, 'M', u'–'), + (0xFE33, '3', u'_'), + (0xFE35, '3', u'('), + (0xFE36, '3', u')'), + (0xFE37, '3', u'{'), + (0xFE38, '3', u'}'), + (0xFE39, 'M', u'〔'), + (0xFE3A, 'M', u'〕'), + (0xFE3B, 'M', u'【'), + (0xFE3C, 'M', u'】'), + (0xFE3D, 'M', u'《'), + (0xFE3E, 'M', u'》'), + ] + +def _seg_48(): + return [ + (0xFE3F, 'M', u'〈'), + (0xFE40, 'M', u'〉'), + (0xFE41, 'M', u'「'), + (0xFE42, 'M', u'」'), + (0xFE43, 'M', u'『'), + (0xFE44, 'M', u'』'), + (0xFE45, 'V'), + (0xFE47, '3', u'['), + (0xFE48, '3', u']'), + (0xFE49, '3', u' ̅'), + (0xFE4D, '3', u'_'), + (0xFE50, '3', u','), + (0xFE51, 'M', u'、'), + (0xFE52, 'X'), + (0xFE54, '3', u';'), + (0xFE55, '3', u':'), + (0xFE56, '3', u'?'), + (0xFE57, '3', u'!'), + (0xFE58, 'M', u'—'), + (0xFE59, '3', u'('), + (0xFE5A, '3', u')'), + (0xFE5B, '3', u'{'), + (0xFE5C, '3', u'}'), + (0xFE5D, 'M', u'〔'), + (0xFE5E, 'M', u'〕'), + (0xFE5F, '3', u'#'), + (0xFE60, '3', u'&'), + (0xFE61, '3', u'*'), + (0xFE62, '3', u'+'), + (0xFE63, 'M', u'-'), + (0xFE64, '3', u'<'), + (0xFE65, '3', u'>'), + (0xFE66, '3', u'='), + (0xFE67, 'X'), + (0xFE68, '3', u'\\'), + (0xFE69, '3', u'$'), + (0xFE6A, '3', u'%'), + (0xFE6B, '3', u'@'), + (0xFE6C, 'X'), + (0xFE70, '3', u' ً'), + (0xFE71, 'M', u'ـً'), + (0xFE72, '3', u' ٌ'), + (0xFE73, 'V'), + (0xFE74, '3', u' ٍ'), + (0xFE75, 'X'), + (0xFE76, '3', u' َ'), + (0xFE77, 'M', u'ـَ'), + (0xFE78, '3', u' ُ'), + (0xFE79, 'M', u'ـُ'), + (0xFE7A, '3', u' ِ'), + (0xFE7B, 'M', u'ـِ'), + (0xFE7C, '3', u' ّ'), + (0xFE7D, 'M', u'ـّ'), + (0xFE7E, '3', u' ْ'), + (0xFE7F, 'M', u'ـْ'), + (0xFE80, 'M', u'ء'), + (0xFE81, 'M', u'آ'), + (0xFE83, 'M', u'أ'), + (0xFE85, 'M', u'ؤ'), + (0xFE87, 'M', u'إ'), + (0xFE89, 'M', u'ئ'), + (0xFE8D, 'M', u'ا'), + (0xFE8F, 'M', u'ب'), + (0xFE93, 'M', u'ة'), + (0xFE95, 'M', u'ت'), + (0xFE99, 'M', u'ث'), + (0xFE9D, 'M', u'ج'), + (0xFEA1, 'M', u'ح'), + (0xFEA5, 'M', u'خ'), + (0xFEA9, 'M', u'د'), + (0xFEAB, 'M', u'ذ'), + (0xFEAD, 'M', u'ر'), + (0xFEAF, 'M', u'ز'), + (0xFEB1, 'M', u'س'), + (0xFEB5, 'M', u'ش'), + (0xFEB9, 'M', u'ص'), + (0xFEBD, 'M', u'ض'), + (0xFEC1, 'M', u'ط'), + (0xFEC5, 'M', u'ظ'), + (0xFEC9, 'M', u'ع'), + (0xFECD, 'M', u'غ'), + (0xFED1, 'M', u'ف'), + (0xFED5, 'M', u'ق'), + (0xFED9, 'M', u'ك'), + (0xFEDD, 'M', u'ل'), + (0xFEE1, 'M', u'م'), + (0xFEE5, 'M', u'ن'), + (0xFEE9, 'M', u'ه'), + (0xFEED, 'M', u'و'), + (0xFEEF, 'M', u'ى'), + (0xFEF1, 'M', u'ي'), + (0xFEF5, 'M', u'لآ'), + (0xFEF7, 'M', u'لأ'), + (0xFEF9, 'M', u'لإ'), + (0xFEFB, 'M', u'لا'), + (0xFEFD, 'X'), + (0xFEFF, 'I'), + (0xFF00, 'X'), + (0xFF01, '3', u'!'), + (0xFF02, '3', u'"'), + ] + +def _seg_49(): + return [ + (0xFF03, '3', u'#'), + (0xFF04, '3', u'$'), + (0xFF05, '3', u'%'), + (0xFF06, '3', u'&'), + (0xFF07, '3', u'\''), + (0xFF08, '3', u'('), + (0xFF09, '3', u')'), + (0xFF0A, '3', u'*'), + (0xFF0B, '3', u'+'), + (0xFF0C, '3', u','), + (0xFF0D, 'M', u'-'), + (0xFF0E, 'M', u'.'), + (0xFF0F, '3', u'/'), + (0xFF10, 'M', u'0'), + (0xFF11, 'M', u'1'), + (0xFF12, 'M', u'2'), + (0xFF13, 'M', u'3'), + (0xFF14, 'M', u'4'), + (0xFF15, 'M', u'5'), + (0xFF16, 'M', u'6'), + (0xFF17, 'M', u'7'), + (0xFF18, 'M', u'8'), + (0xFF19, 'M', u'9'), + (0xFF1A, '3', u':'), + (0xFF1B, '3', u';'), + (0xFF1C, '3', u'<'), + (0xFF1D, '3', u'='), + (0xFF1E, '3', u'>'), + (0xFF1F, '3', u'?'), + (0xFF20, '3', u'@'), + (0xFF21, 'M', u'a'), + (0xFF22, 'M', u'b'), + (0xFF23, 'M', u'c'), + (0xFF24, 'M', u'd'), + (0xFF25, 'M', u'e'), + (0xFF26, 'M', u'f'), + (0xFF27, 'M', u'g'), + (0xFF28, 'M', u'h'), + (0xFF29, 'M', u'i'), + (0xFF2A, 'M', u'j'), + (0xFF2B, 'M', u'k'), + (0xFF2C, 'M', u'l'), + (0xFF2D, 'M', u'm'), + (0xFF2E, 'M', u'n'), + (0xFF2F, 'M', u'o'), + (0xFF30, 'M', u'p'), + (0xFF31, 'M', u'q'), + (0xFF32, 'M', u'r'), + (0xFF33, 'M', u's'), + (0xFF34, 'M', u't'), + (0xFF35, 'M', u'u'), + (0xFF36, 'M', u'v'), + (0xFF37, 'M', u'w'), + (0xFF38, 'M', u'x'), + (0xFF39, 'M', u'y'), + (0xFF3A, 'M', u'z'), + (0xFF3B, '3', u'['), + (0xFF3C, '3', u'\\'), + (0xFF3D, '3', u']'), + (0xFF3E, '3', u'^'), + (0xFF3F, '3', u'_'), + (0xFF40, '3', u'`'), + (0xFF41, 'M', u'a'), + (0xFF42, 'M', u'b'), + (0xFF43, 'M', u'c'), + (0xFF44, 'M', u'd'), + (0xFF45, 'M', u'e'), + (0xFF46, 'M', u'f'), + (0xFF47, 'M', u'g'), + (0xFF48, 'M', u'h'), + (0xFF49, 'M', u'i'), + (0xFF4A, 'M', u'j'), + (0xFF4B, 'M', u'k'), + (0xFF4C, 'M', u'l'), + (0xFF4D, 'M', u'm'), + (0xFF4E, 'M', u'n'), + (0xFF4F, 'M', u'o'), + (0xFF50, 'M', u'p'), + (0xFF51, 'M', u'q'), + (0xFF52, 'M', u'r'), + (0xFF53, 'M', u's'), + (0xFF54, 'M', u't'), + (0xFF55, 'M', u'u'), + (0xFF56, 'M', u'v'), + (0xFF57, 'M', u'w'), + (0xFF58, 'M', u'x'), + (0xFF59, 'M', u'y'), + (0xFF5A, 'M', u'z'), + (0xFF5B, '3', u'{'), + (0xFF5C, '3', u'|'), + (0xFF5D, '3', u'}'), + (0xFF5E, '3', u'~'), + (0xFF5F, 'M', u'⦅'), + (0xFF60, 'M', u'⦆'), + (0xFF61, 'M', u'.'), + (0xFF62, 'M', u'「'), + (0xFF63, 'M', u'」'), + (0xFF64, 'M', u'、'), + (0xFF65, 'M', u'・'), + (0xFF66, 'M', u'ヲ'), + ] + +def _seg_50(): + return [ + (0xFF67, 'M', u'ァ'), + (0xFF68, 'M', u'ィ'), + (0xFF69, 'M', u'ゥ'), + (0xFF6A, 'M', u'ェ'), + (0xFF6B, 'M', u'ォ'), + (0xFF6C, 'M', u'ャ'), + (0xFF6D, 'M', u'ュ'), + (0xFF6E, 'M', u'ョ'), + (0xFF6F, 'M', u'ッ'), + (0xFF70, 'M', u'ー'), + (0xFF71, 'M', u'ア'), + (0xFF72, 'M', u'イ'), + (0xFF73, 'M', u'ウ'), + (0xFF74, 'M', u'エ'), + (0xFF75, 'M', u'オ'), + (0xFF76, 'M', u'カ'), + (0xFF77, 'M', u'キ'), + (0xFF78, 'M', u'ク'), + (0xFF79, 'M', u'ケ'), + (0xFF7A, 'M', u'コ'), + (0xFF7B, 'M', u'サ'), + (0xFF7C, 'M', u'シ'), + (0xFF7D, 'M', u'ス'), + (0xFF7E, 'M', u'セ'), + (0xFF7F, 'M', u'ソ'), + (0xFF80, 'M', u'タ'), + (0xFF81, 'M', u'チ'), + (0xFF82, 'M', u'ツ'), + (0xFF83, 'M', u'テ'), + (0xFF84, 'M', u'ト'), + (0xFF85, 'M', u'ナ'), + (0xFF86, 'M', u'ニ'), + (0xFF87, 'M', u'ヌ'), + (0xFF88, 'M', u'ネ'), + (0xFF89, 'M', u'ノ'), + (0xFF8A, 'M', u'ハ'), + (0xFF8B, 'M', u'ヒ'), + (0xFF8C, 'M', u'フ'), + (0xFF8D, 'M', u'ヘ'), + (0xFF8E, 'M', u'ホ'), + (0xFF8F, 'M', u'マ'), + (0xFF90, 'M', u'ミ'), + (0xFF91, 'M', u'ム'), + (0xFF92, 'M', u'メ'), + (0xFF93, 'M', u'モ'), + (0xFF94, 'M', u'ヤ'), + (0xFF95, 'M', u'ユ'), + (0xFF96, 'M', u'ヨ'), + (0xFF97, 'M', u'ラ'), + (0xFF98, 'M', u'リ'), + (0xFF99, 'M', u'ル'), + (0xFF9A, 'M', u'レ'), + (0xFF9B, 'M', u'ロ'), + (0xFF9C, 'M', u'ワ'), + (0xFF9D, 'M', u'ン'), + (0xFF9E, 'M', u'゙'), + (0xFF9F, 'M', u'゚'), + (0xFFA0, 'X'), + (0xFFA1, 'M', u'ᄀ'), + (0xFFA2, 'M', u'ᄁ'), + (0xFFA3, 'M', u'ᆪ'), + (0xFFA4, 'M', u'ᄂ'), + (0xFFA5, 'M', u'ᆬ'), + (0xFFA6, 'M', u'ᆭ'), + (0xFFA7, 'M', u'ᄃ'), + (0xFFA8, 'M', u'ᄄ'), + (0xFFA9, 'M', u'ᄅ'), + (0xFFAA, 'M', u'ᆰ'), + (0xFFAB, 'M', u'ᆱ'), + (0xFFAC, 'M', u'ᆲ'), + (0xFFAD, 'M', u'ᆳ'), + (0xFFAE, 'M', u'ᆴ'), + (0xFFAF, 'M', u'ᆵ'), + (0xFFB0, 'M', u'ᄚ'), + (0xFFB1, 'M', u'ᄆ'), + (0xFFB2, 'M', u'ᄇ'), + (0xFFB3, 'M', u'ᄈ'), + (0xFFB4, 'M', u'ᄡ'), + (0xFFB5, 'M', u'ᄉ'), + (0xFFB6, 'M', u'ᄊ'), + (0xFFB7, 'M', u'ᄋ'), + (0xFFB8, 'M', u'ᄌ'), + (0xFFB9, 'M', u'ᄍ'), + (0xFFBA, 'M', u'ᄎ'), + (0xFFBB, 'M', u'ᄏ'), + (0xFFBC, 'M', u'ᄐ'), + (0xFFBD, 'M', u'ᄑ'), + (0xFFBE, 'M', u'ᄒ'), + (0xFFBF, 'X'), + (0xFFC2, 'M', u'ᅡ'), + (0xFFC3, 'M', u'ᅢ'), + (0xFFC4, 'M', u'ᅣ'), + (0xFFC5, 'M', u'ᅤ'), + (0xFFC6, 'M', u'ᅥ'), + (0xFFC7, 'M', u'ᅦ'), + (0xFFC8, 'X'), + (0xFFCA, 'M', u'ᅧ'), + (0xFFCB, 'M', u'ᅨ'), + (0xFFCC, 'M', u'ᅩ'), + (0xFFCD, 'M', u'ᅪ'), + ] + +def _seg_51(): + return [ + (0xFFCE, 'M', u'ᅫ'), + (0xFFCF, 'M', u'ᅬ'), + (0xFFD0, 'X'), + (0xFFD2, 'M', u'ᅭ'), + (0xFFD3, 'M', u'ᅮ'), + (0xFFD4, 'M', u'ᅯ'), + (0xFFD5, 'M', u'ᅰ'), + (0xFFD6, 'M', u'ᅱ'), + (0xFFD7, 'M', u'ᅲ'), + (0xFFD8, 'X'), + (0xFFDA, 'M', u'ᅳ'), + (0xFFDB, 'M', u'ᅴ'), + (0xFFDC, 'M', u'ᅵ'), + (0xFFDD, 'X'), + (0xFFE0, 'M', u'¢'), + (0xFFE1, 'M', u'£'), + (0xFFE2, 'M', u'¬'), + (0xFFE3, '3', u' ̄'), + (0xFFE4, 'M', u'¦'), + (0xFFE5, 'M', u'¥'), + (0xFFE6, 'M', u'₩'), + (0xFFE7, 'X'), + (0xFFE8, 'M', u'│'), + (0xFFE9, 'M', u'←'), + (0xFFEA, 'M', u'↑'), + (0xFFEB, 'M', u'→'), + (0xFFEC, 'M', u'↓'), + (0xFFED, 'M', u'■'), + (0xFFEE, 'M', u'○'), + (0xFFEF, 'X'), + (0x10000, 'V'), + (0x1000C, 'X'), + (0x1000D, 'V'), + (0x10027, 'X'), + (0x10028, 'V'), + (0x1003B, 'X'), + (0x1003C, 'V'), + (0x1003E, 'X'), + (0x1003F, 'V'), + (0x1004E, 'X'), + (0x10050, 'V'), + (0x1005E, 'X'), + (0x10080, 'V'), + (0x100FB, 'X'), + (0x10100, 'V'), + (0x10103, 'X'), + (0x10107, 'V'), + (0x10134, 'X'), + (0x10137, 'V'), + (0x1018B, 'X'), + (0x10190, 'V'), + (0x1019C, 'X'), + (0x101D0, 'V'), + (0x101FE, 'X'), + (0x10280, 'V'), + (0x1029D, 'X'), + (0x102A0, 'V'), + (0x102D1, 'X'), + (0x10300, 'V'), + (0x1031F, 'X'), + (0x10320, 'V'), + (0x10324, 'X'), + (0x10330, 'V'), + (0x1034B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', u'𐐨'), + (0x10401, 'M', u'𐐩'), + (0x10402, 'M', u'𐐪'), + (0x10403, 'M', u'𐐫'), + (0x10404, 'M', u'𐐬'), + (0x10405, 'M', u'𐐭'), + (0x10406, 'M', u'𐐮'), + (0x10407, 'M', u'𐐯'), + (0x10408, 'M', u'𐐰'), + (0x10409, 'M', u'𐐱'), + (0x1040A, 'M', u'𐐲'), + (0x1040B, 'M', u'𐐳'), + (0x1040C, 'M', u'𐐴'), + (0x1040D, 'M', u'𐐵'), + (0x1040E, 'M', u'𐐶'), + (0x1040F, 'M', u'𐐷'), + (0x10410, 'M', u'𐐸'), + (0x10411, 'M', u'𐐹'), + (0x10412, 'M', u'𐐺'), + (0x10413, 'M', u'𐐻'), + (0x10414, 'M', u'𐐼'), + (0x10415, 'M', u'𐐽'), + (0x10416, 'M', u'𐐾'), + (0x10417, 'M', u'𐐿'), + (0x10418, 'M', u'𐑀'), + (0x10419, 'M', u'𐑁'), + (0x1041A, 'M', u'𐑂'), + (0x1041B, 'M', u'𐑃'), + (0x1041C, 'M', u'𐑄'), + (0x1041D, 'M', u'𐑅'), + ] + +def _seg_52(): + return [ + (0x1041E, 'M', u'𐑆'), + (0x1041F, 'M', u'𐑇'), + (0x10420, 'M', u'𐑈'), + (0x10421, 'M', u'𐑉'), + (0x10422, 'M', u'𐑊'), + (0x10423, 'M', u'𐑋'), + (0x10424, 'M', u'𐑌'), + (0x10425, 'M', u'𐑍'), + (0x10426, 'M', u'𐑎'), + (0x10427, 'M', u'𐑏'), + (0x10428, 'V'), + (0x1049E, 'X'), + (0x104A0, 'V'), + (0x104AA, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + (0x10839, 'X'), + (0x1083C, 'V'), + (0x1083D, 'X'), + (0x1083F, 'V'), + (0x10856, 'X'), + (0x10857, 'V'), + (0x10860, 'X'), + (0x10900, 'V'), + (0x1091C, 'X'), + (0x1091F, 'V'), + (0x1093A, 'X'), + (0x1093F, 'V'), + (0x10940, 'X'), + (0x10980, 'V'), + (0x109B8, 'X'), + (0x109BE, 'V'), + (0x109C0, 'X'), + (0x10A00, 'V'), + (0x10A04, 'X'), + (0x10A05, 'V'), + (0x10A07, 'X'), + (0x10A0C, 'V'), + (0x10A14, 'X'), + (0x10A15, 'V'), + (0x10A18, 'X'), + (0x10A19, 'V'), + (0x10A34, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A48, 'X'), + (0x10A50, 'V'), + (0x10A59, 'X'), + (0x10A60, 'V'), + (0x10A80, 'X'), + (0x10B00, 'V'), + (0x10B36, 'X'), + (0x10B39, 'V'), + (0x10B56, 'X'), + (0x10B58, 'V'), + (0x10B73, 'X'), + (0x10B78, 'V'), + (0x10B80, 'X'), + (0x10C00, 'V'), + (0x10C49, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), + (0x11070, 'X'), + (0x11080, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), + (0x110C2, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), + (0x110FA, 'X'), + (0x11100, 'V'), + (0x11135, 'X'), + (0x11136, 'V'), + (0x11144, 'X'), + (0x11180, 'V'), + (0x111C9, 'X'), + (0x111D0, 'V'), + (0x111DA, 'X'), + (0x11680, 'V'), + (0x116B8, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x12000, 'V'), + (0x1236F, 'X'), + (0x12400, 'V'), + (0x12463, 'X'), + (0x12470, 'V'), + (0x12474, 'X'), + (0x13000, 'V'), + (0x1342F, 'X'), + ] + +def _seg_53(): + return [ + (0x16800, 'V'), + (0x16A39, 'X'), + (0x16F00, 'V'), + (0x16F45, 'X'), + (0x16F50, 'V'), + (0x16F7F, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x1B000, 'V'), + (0x1B002, 'X'), + (0x1D000, 'V'), + (0x1D0F6, 'X'), + (0x1D100, 'V'), + (0x1D127, 'X'), + (0x1D129, 'V'), + (0x1D15E, 'M', u'𝅗𝅥'), + (0x1D15F, 'M', u'𝅘𝅥'), + (0x1D160, 'M', u'𝅘𝅥𝅮'), + (0x1D161, 'M', u'𝅘𝅥𝅯'), + (0x1D162, 'M', u'𝅘𝅥𝅰'), + (0x1D163, 'M', u'𝅘𝅥𝅱'), + (0x1D164, 'M', u'𝅘𝅥𝅲'), + (0x1D165, 'V'), + (0x1D173, 'X'), + (0x1D17B, 'V'), + (0x1D1BB, 'M', u'𝆹𝅥'), + (0x1D1BC, 'M', u'𝆺𝅥'), + (0x1D1BD, 'M', u'𝆹𝅥𝅮'), + (0x1D1BE, 'M', u'𝆺𝅥𝅮'), + (0x1D1BF, 'M', u'𝆹𝅥𝅯'), + (0x1D1C0, 'M', u'𝆺𝅥𝅯'), + (0x1D1C1, 'V'), + (0x1D1DE, 'X'), + (0x1D200, 'V'), + (0x1D246, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D372, 'X'), + (0x1D400, 'M', u'a'), + (0x1D401, 'M', u'b'), + (0x1D402, 'M', u'c'), + (0x1D403, 'M', u'd'), + (0x1D404, 'M', u'e'), + (0x1D405, 'M', u'f'), + (0x1D406, 'M', u'g'), + (0x1D407, 'M', u'h'), + (0x1D408, 'M', u'i'), + (0x1D409, 'M', u'j'), + (0x1D40A, 'M', u'k'), + (0x1D40B, 'M', u'l'), + (0x1D40C, 'M', u'm'), + (0x1D40D, 'M', u'n'), + (0x1D40E, 'M', u'o'), + (0x1D40F, 'M', u'p'), + (0x1D410, 'M', u'q'), + (0x1D411, 'M', u'r'), + (0x1D412, 'M', u's'), + (0x1D413, 'M', u't'), + (0x1D414, 'M', u'u'), + (0x1D415, 'M', u'v'), + (0x1D416, 'M', u'w'), + (0x1D417, 'M', u'x'), + (0x1D418, 'M', u'y'), + (0x1D419, 'M', u'z'), + (0x1D41A, 'M', u'a'), + (0x1D41B, 'M', u'b'), + (0x1D41C, 'M', u'c'), + (0x1D41D, 'M', u'd'), + (0x1D41E, 'M', u'e'), + (0x1D41F, 'M', u'f'), + (0x1D420, 'M', u'g'), + (0x1D421, 'M', u'h'), + (0x1D422, 'M', u'i'), + (0x1D423, 'M', u'j'), + (0x1D424, 'M', u'k'), + (0x1D425, 'M', u'l'), + (0x1D426, 'M', u'm'), + (0x1D427, 'M', u'n'), + (0x1D428, 'M', u'o'), + (0x1D429, 'M', u'p'), + (0x1D42A, 'M', u'q'), + (0x1D42B, 'M', u'r'), + (0x1D42C, 'M', u's'), + (0x1D42D, 'M', u't'), + (0x1D42E, 'M', u'u'), + (0x1D42F, 'M', u'v'), + (0x1D430, 'M', u'w'), + (0x1D431, 'M', u'x'), + (0x1D432, 'M', u'y'), + (0x1D433, 'M', u'z'), + (0x1D434, 'M', u'a'), + (0x1D435, 'M', u'b'), + (0x1D436, 'M', u'c'), + (0x1D437, 'M', u'd'), + (0x1D438, 'M', u'e'), + (0x1D439, 'M', u'f'), + (0x1D43A, 'M', u'g'), + (0x1D43B, 'M', u'h'), + (0x1D43C, 'M', u'i'), + ] + +def _seg_54(): + return [ + (0x1D43D, 'M', u'j'), + (0x1D43E, 'M', u'k'), + (0x1D43F, 'M', u'l'), + (0x1D440, 'M', u'm'), + (0x1D441, 'M', u'n'), + (0x1D442, 'M', u'o'), + (0x1D443, 'M', u'p'), + (0x1D444, 'M', u'q'), + (0x1D445, 'M', u'r'), + (0x1D446, 'M', u's'), + (0x1D447, 'M', u't'), + (0x1D448, 'M', u'u'), + (0x1D449, 'M', u'v'), + (0x1D44A, 'M', u'w'), + (0x1D44B, 'M', u'x'), + (0x1D44C, 'M', u'y'), + (0x1D44D, 'M', u'z'), + (0x1D44E, 'M', u'a'), + (0x1D44F, 'M', u'b'), + (0x1D450, 'M', u'c'), + (0x1D451, 'M', u'd'), + (0x1D452, 'M', u'e'), + (0x1D453, 'M', u'f'), + (0x1D454, 'M', u'g'), + (0x1D455, 'X'), + (0x1D456, 'M', u'i'), + (0x1D457, 'M', u'j'), + (0x1D458, 'M', u'k'), + (0x1D459, 'M', u'l'), + (0x1D45A, 'M', u'm'), + (0x1D45B, 'M', u'n'), + (0x1D45C, 'M', u'o'), + (0x1D45D, 'M', u'p'), + (0x1D45E, 'M', u'q'), + (0x1D45F, 'M', u'r'), + (0x1D460, 'M', u's'), + (0x1D461, 'M', u't'), + (0x1D462, 'M', u'u'), + (0x1D463, 'M', u'v'), + (0x1D464, 'M', u'w'), + (0x1D465, 'M', u'x'), + (0x1D466, 'M', u'y'), + (0x1D467, 'M', u'z'), + (0x1D468, 'M', u'a'), + (0x1D469, 'M', u'b'), + (0x1D46A, 'M', u'c'), + (0x1D46B, 'M', u'd'), + (0x1D46C, 'M', u'e'), + (0x1D46D, 'M', u'f'), + (0x1D46E, 'M', u'g'), + (0x1D46F, 'M', u'h'), + (0x1D470, 'M', u'i'), + (0x1D471, 'M', u'j'), + (0x1D472, 'M', u'k'), + (0x1D473, 'M', u'l'), + (0x1D474, 'M', u'm'), + (0x1D475, 'M', u'n'), + (0x1D476, 'M', u'o'), + (0x1D477, 'M', u'p'), + (0x1D478, 'M', u'q'), + (0x1D479, 'M', u'r'), + (0x1D47A, 'M', u's'), + (0x1D47B, 'M', u't'), + (0x1D47C, 'M', u'u'), + (0x1D47D, 'M', u'v'), + (0x1D47E, 'M', u'w'), + (0x1D47F, 'M', u'x'), + (0x1D480, 'M', u'y'), + (0x1D481, 'M', u'z'), + (0x1D482, 'M', u'a'), + (0x1D483, 'M', u'b'), + (0x1D484, 'M', u'c'), + (0x1D485, 'M', u'd'), + (0x1D486, 'M', u'e'), + (0x1D487, 'M', u'f'), + (0x1D488, 'M', u'g'), + (0x1D489, 'M', u'h'), + (0x1D48A, 'M', u'i'), + (0x1D48B, 'M', u'j'), + (0x1D48C, 'M', u'k'), + (0x1D48D, 'M', u'l'), + (0x1D48E, 'M', u'm'), + (0x1D48F, 'M', u'n'), + (0x1D490, 'M', u'o'), + (0x1D491, 'M', u'p'), + (0x1D492, 'M', u'q'), + (0x1D493, 'M', u'r'), + (0x1D494, 'M', u's'), + (0x1D495, 'M', u't'), + (0x1D496, 'M', u'u'), + (0x1D497, 'M', u'v'), + (0x1D498, 'M', u'w'), + (0x1D499, 'M', u'x'), + (0x1D49A, 'M', u'y'), + (0x1D49B, 'M', u'z'), + (0x1D49C, 'M', u'a'), + (0x1D49D, 'X'), + (0x1D49E, 'M', u'c'), + (0x1D49F, 'M', u'd'), + (0x1D4A0, 'X'), + ] + +def _seg_55(): + return [ + (0x1D4A2, 'M', u'g'), + (0x1D4A3, 'X'), + (0x1D4A5, 'M', u'j'), + (0x1D4A6, 'M', u'k'), + (0x1D4A7, 'X'), + (0x1D4A9, 'M', u'n'), + (0x1D4AA, 'M', u'o'), + (0x1D4AB, 'M', u'p'), + (0x1D4AC, 'M', u'q'), + (0x1D4AD, 'X'), + (0x1D4AE, 'M', u's'), + (0x1D4AF, 'M', u't'), + (0x1D4B0, 'M', u'u'), + (0x1D4B1, 'M', u'v'), + (0x1D4B2, 'M', u'w'), + (0x1D4B3, 'M', u'x'), + (0x1D4B4, 'M', u'y'), + (0x1D4B5, 'M', u'z'), + (0x1D4B6, 'M', u'a'), + (0x1D4B7, 'M', u'b'), + (0x1D4B8, 'M', u'c'), + (0x1D4B9, 'M', u'd'), + (0x1D4BA, 'X'), + (0x1D4BB, 'M', u'f'), + (0x1D4BC, 'X'), + (0x1D4BD, 'M', u'h'), + (0x1D4BE, 'M', u'i'), + (0x1D4BF, 'M', u'j'), + (0x1D4C0, 'M', u'k'), + (0x1D4C1, 'M', u'l'), + (0x1D4C2, 'M', u'm'), + (0x1D4C3, 'M', u'n'), + (0x1D4C4, 'X'), + (0x1D4C5, 'M', u'p'), + (0x1D4C6, 'M', u'q'), + (0x1D4C7, 'M', u'r'), + (0x1D4C8, 'M', u's'), + (0x1D4C9, 'M', u't'), + (0x1D4CA, 'M', u'u'), + (0x1D4CB, 'M', u'v'), + (0x1D4CC, 'M', u'w'), + (0x1D4CD, 'M', u'x'), + (0x1D4CE, 'M', u'y'), + (0x1D4CF, 'M', u'z'), + (0x1D4D0, 'M', u'a'), + (0x1D4D1, 'M', u'b'), + (0x1D4D2, 'M', u'c'), + (0x1D4D3, 'M', u'd'), + (0x1D4D4, 'M', u'e'), + (0x1D4D5, 'M', u'f'), + (0x1D4D6, 'M', u'g'), + (0x1D4D7, 'M', u'h'), + (0x1D4D8, 'M', u'i'), + (0x1D4D9, 'M', u'j'), + (0x1D4DA, 'M', u'k'), + (0x1D4DB, 'M', u'l'), + (0x1D4DC, 'M', u'm'), + (0x1D4DD, 'M', u'n'), + (0x1D4DE, 'M', u'o'), + (0x1D4DF, 'M', u'p'), + (0x1D4E0, 'M', u'q'), + (0x1D4E1, 'M', u'r'), + (0x1D4E2, 'M', u's'), + (0x1D4E3, 'M', u't'), + (0x1D4E4, 'M', u'u'), + (0x1D4E5, 'M', u'v'), + (0x1D4E6, 'M', u'w'), + (0x1D4E7, 'M', u'x'), + (0x1D4E8, 'M', u'y'), + (0x1D4E9, 'M', u'z'), + (0x1D4EA, 'M', u'a'), + (0x1D4EB, 'M', u'b'), + (0x1D4EC, 'M', u'c'), + (0x1D4ED, 'M', u'd'), + (0x1D4EE, 'M', u'e'), + (0x1D4EF, 'M', u'f'), + (0x1D4F0, 'M', u'g'), + (0x1D4F1, 'M', u'h'), + (0x1D4F2, 'M', u'i'), + (0x1D4F3, 'M', u'j'), + (0x1D4F4, 'M', u'k'), + (0x1D4F5, 'M', u'l'), + (0x1D4F6, 'M', u'm'), + (0x1D4F7, 'M', u'n'), + (0x1D4F8, 'M', u'o'), + (0x1D4F9, 'M', u'p'), + (0x1D4FA, 'M', u'q'), + (0x1D4FB, 'M', u'r'), + (0x1D4FC, 'M', u's'), + (0x1D4FD, 'M', u't'), + (0x1D4FE, 'M', u'u'), + (0x1D4FF, 'M', u'v'), + (0x1D500, 'M', u'w'), + (0x1D501, 'M', u'x'), + (0x1D502, 'M', u'y'), + (0x1D503, 'M', u'z'), + (0x1D504, 'M', u'a'), + (0x1D505, 'M', u'b'), + (0x1D506, 'X'), + (0x1D507, 'M', u'd'), + ] + +def _seg_56(): + return [ + (0x1D508, 'M', u'e'), + (0x1D509, 'M', u'f'), + (0x1D50A, 'M', u'g'), + (0x1D50B, 'X'), + (0x1D50D, 'M', u'j'), + (0x1D50E, 'M', u'k'), + (0x1D50F, 'M', u'l'), + (0x1D510, 'M', u'm'), + (0x1D511, 'M', u'n'), + (0x1D512, 'M', u'o'), + (0x1D513, 'M', u'p'), + (0x1D514, 'M', u'q'), + (0x1D515, 'X'), + (0x1D516, 'M', u's'), + (0x1D517, 'M', u't'), + (0x1D518, 'M', u'u'), + (0x1D519, 'M', u'v'), + (0x1D51A, 'M', u'w'), + (0x1D51B, 'M', u'x'), + (0x1D51C, 'M', u'y'), + (0x1D51D, 'X'), + (0x1D51E, 'M', u'a'), + (0x1D51F, 'M', u'b'), + (0x1D520, 'M', u'c'), + (0x1D521, 'M', u'd'), + (0x1D522, 'M', u'e'), + (0x1D523, 'M', u'f'), + (0x1D524, 'M', u'g'), + (0x1D525, 'M', u'h'), + (0x1D526, 'M', u'i'), + (0x1D527, 'M', u'j'), + (0x1D528, 'M', u'k'), + (0x1D529, 'M', u'l'), + (0x1D52A, 'M', u'm'), + (0x1D52B, 'M', u'n'), + (0x1D52C, 'M', u'o'), + (0x1D52D, 'M', u'p'), + (0x1D52E, 'M', u'q'), + (0x1D52F, 'M', u'r'), + (0x1D530, 'M', u's'), + (0x1D531, 'M', u't'), + (0x1D532, 'M', u'u'), + (0x1D533, 'M', u'v'), + (0x1D534, 'M', u'w'), + (0x1D535, 'M', u'x'), + (0x1D536, 'M', u'y'), + (0x1D537, 'M', u'z'), + (0x1D538, 'M', u'a'), + (0x1D539, 'M', u'b'), + (0x1D53A, 'X'), + (0x1D53B, 'M', u'd'), + (0x1D53C, 'M', u'e'), + (0x1D53D, 'M', u'f'), + (0x1D53E, 'M', u'g'), + (0x1D53F, 'X'), + (0x1D540, 'M', u'i'), + (0x1D541, 'M', u'j'), + (0x1D542, 'M', u'k'), + (0x1D543, 'M', u'l'), + (0x1D544, 'M', u'm'), + (0x1D545, 'X'), + (0x1D546, 'M', u'o'), + (0x1D547, 'X'), + (0x1D54A, 'M', u's'), + (0x1D54B, 'M', u't'), + (0x1D54C, 'M', u'u'), + (0x1D54D, 'M', u'v'), + (0x1D54E, 'M', u'w'), + (0x1D54F, 'M', u'x'), + (0x1D550, 'M', u'y'), + (0x1D551, 'X'), + (0x1D552, 'M', u'a'), + (0x1D553, 'M', u'b'), + (0x1D554, 'M', u'c'), + (0x1D555, 'M', u'd'), + (0x1D556, 'M', u'e'), + (0x1D557, 'M', u'f'), + (0x1D558, 'M', u'g'), + (0x1D559, 'M', u'h'), + (0x1D55A, 'M', u'i'), + (0x1D55B, 'M', u'j'), + (0x1D55C, 'M', u'k'), + (0x1D55D, 'M', u'l'), + (0x1D55E, 'M', u'm'), + (0x1D55F, 'M', u'n'), + (0x1D560, 'M', u'o'), + (0x1D561, 'M', u'p'), + (0x1D562, 'M', u'q'), + (0x1D563, 'M', u'r'), + (0x1D564, 'M', u's'), + (0x1D565, 'M', u't'), + (0x1D566, 'M', u'u'), + (0x1D567, 'M', u'v'), + (0x1D568, 'M', u'w'), + (0x1D569, 'M', u'x'), + (0x1D56A, 'M', u'y'), + (0x1D56B, 'M', u'z'), + (0x1D56C, 'M', u'a'), + (0x1D56D, 'M', u'b'), + (0x1D56E, 'M', u'c'), + ] + +def _seg_57(): + return [ + (0x1D56F, 'M', u'd'), + (0x1D570, 'M', u'e'), + (0x1D571, 'M', u'f'), + (0x1D572, 'M', u'g'), + (0x1D573, 'M', u'h'), + (0x1D574, 'M', u'i'), + (0x1D575, 'M', u'j'), + (0x1D576, 'M', u'k'), + (0x1D577, 'M', u'l'), + (0x1D578, 'M', u'm'), + (0x1D579, 'M', u'n'), + (0x1D57A, 'M', u'o'), + (0x1D57B, 'M', u'p'), + (0x1D57C, 'M', u'q'), + (0x1D57D, 'M', u'r'), + (0x1D57E, 'M', u's'), + (0x1D57F, 'M', u't'), + (0x1D580, 'M', u'u'), + (0x1D581, 'M', u'v'), + (0x1D582, 'M', u'w'), + (0x1D583, 'M', u'x'), + (0x1D584, 'M', u'y'), + (0x1D585, 'M', u'z'), + (0x1D586, 'M', u'a'), + (0x1D587, 'M', u'b'), + (0x1D588, 'M', u'c'), + (0x1D589, 'M', u'd'), + (0x1D58A, 'M', u'e'), + (0x1D58B, 'M', u'f'), + (0x1D58C, 'M', u'g'), + (0x1D58D, 'M', u'h'), + (0x1D58E, 'M', u'i'), + (0x1D58F, 'M', u'j'), + (0x1D590, 'M', u'k'), + (0x1D591, 'M', u'l'), + (0x1D592, 'M', u'm'), + (0x1D593, 'M', u'n'), + (0x1D594, 'M', u'o'), + (0x1D595, 'M', u'p'), + (0x1D596, 'M', u'q'), + (0x1D597, 'M', u'r'), + (0x1D598, 'M', u's'), + (0x1D599, 'M', u't'), + (0x1D59A, 'M', u'u'), + (0x1D59B, 'M', u'v'), + (0x1D59C, 'M', u'w'), + (0x1D59D, 'M', u'x'), + (0x1D59E, 'M', u'y'), + (0x1D59F, 'M', u'z'), + (0x1D5A0, 'M', u'a'), + (0x1D5A1, 'M', u'b'), + (0x1D5A2, 'M', u'c'), + (0x1D5A3, 'M', u'd'), + (0x1D5A4, 'M', u'e'), + (0x1D5A5, 'M', u'f'), + (0x1D5A6, 'M', u'g'), + (0x1D5A7, 'M', u'h'), + (0x1D5A8, 'M', u'i'), + (0x1D5A9, 'M', u'j'), + (0x1D5AA, 'M', u'k'), + (0x1D5AB, 'M', u'l'), + (0x1D5AC, 'M', u'm'), + (0x1D5AD, 'M', u'n'), + (0x1D5AE, 'M', u'o'), + (0x1D5AF, 'M', u'p'), + (0x1D5B0, 'M', u'q'), + (0x1D5B1, 'M', u'r'), + (0x1D5B2, 'M', u's'), + (0x1D5B3, 'M', u't'), + (0x1D5B4, 'M', u'u'), + (0x1D5B5, 'M', u'v'), + (0x1D5B6, 'M', u'w'), + (0x1D5B7, 'M', u'x'), + (0x1D5B8, 'M', u'y'), + (0x1D5B9, 'M', u'z'), + (0x1D5BA, 'M', u'a'), + (0x1D5BB, 'M', u'b'), + (0x1D5BC, 'M', u'c'), + (0x1D5BD, 'M', u'd'), + (0x1D5BE, 'M', u'e'), + (0x1D5BF, 'M', u'f'), + (0x1D5C0, 'M', u'g'), + (0x1D5C1, 'M', u'h'), + (0x1D5C2, 'M', u'i'), + (0x1D5C3, 'M', u'j'), + (0x1D5C4, 'M', u'k'), + (0x1D5C5, 'M', u'l'), + (0x1D5C6, 'M', u'm'), + (0x1D5C7, 'M', u'n'), + (0x1D5C8, 'M', u'o'), + (0x1D5C9, 'M', u'p'), + (0x1D5CA, 'M', u'q'), + (0x1D5CB, 'M', u'r'), + (0x1D5CC, 'M', u's'), + (0x1D5CD, 'M', u't'), + (0x1D5CE, 'M', u'u'), + (0x1D5CF, 'M', u'v'), + (0x1D5D0, 'M', u'w'), + (0x1D5D1, 'M', u'x'), + (0x1D5D2, 'M', u'y'), + ] + +def _seg_58(): + return [ + (0x1D5D3, 'M', u'z'), + (0x1D5D4, 'M', u'a'), + (0x1D5D5, 'M', u'b'), + (0x1D5D6, 'M', u'c'), + (0x1D5D7, 'M', u'd'), + (0x1D5D8, 'M', u'e'), + (0x1D5D9, 'M', u'f'), + (0x1D5DA, 'M', u'g'), + (0x1D5DB, 'M', u'h'), + (0x1D5DC, 'M', u'i'), + (0x1D5DD, 'M', u'j'), + (0x1D5DE, 'M', u'k'), + (0x1D5DF, 'M', u'l'), + (0x1D5E0, 'M', u'm'), + (0x1D5E1, 'M', u'n'), + (0x1D5E2, 'M', u'o'), + (0x1D5E3, 'M', u'p'), + (0x1D5E4, 'M', u'q'), + (0x1D5E5, 'M', u'r'), + (0x1D5E6, 'M', u's'), + (0x1D5E7, 'M', u't'), + (0x1D5E8, 'M', u'u'), + (0x1D5E9, 'M', u'v'), + (0x1D5EA, 'M', u'w'), + (0x1D5EB, 'M', u'x'), + (0x1D5EC, 'M', u'y'), + (0x1D5ED, 'M', u'z'), + (0x1D5EE, 'M', u'a'), + (0x1D5EF, 'M', u'b'), + (0x1D5F0, 'M', u'c'), + (0x1D5F1, 'M', u'd'), + (0x1D5F2, 'M', u'e'), + (0x1D5F3, 'M', u'f'), + (0x1D5F4, 'M', u'g'), + (0x1D5F5, 'M', u'h'), + (0x1D5F6, 'M', u'i'), + (0x1D5F7, 'M', u'j'), + (0x1D5F8, 'M', u'k'), + (0x1D5F9, 'M', u'l'), + (0x1D5FA, 'M', u'm'), + (0x1D5FB, 'M', u'n'), + (0x1D5FC, 'M', u'o'), + (0x1D5FD, 'M', u'p'), + (0x1D5FE, 'M', u'q'), + (0x1D5FF, 'M', u'r'), + (0x1D600, 'M', u's'), + (0x1D601, 'M', u't'), + (0x1D602, 'M', u'u'), + (0x1D603, 'M', u'v'), + (0x1D604, 'M', u'w'), + (0x1D605, 'M', u'x'), + (0x1D606, 'M', u'y'), + (0x1D607, 'M', u'z'), + (0x1D608, 'M', u'a'), + (0x1D609, 'M', u'b'), + (0x1D60A, 'M', u'c'), + (0x1D60B, 'M', u'd'), + (0x1D60C, 'M', u'e'), + (0x1D60D, 'M', u'f'), + (0x1D60E, 'M', u'g'), + (0x1D60F, 'M', u'h'), + (0x1D610, 'M', u'i'), + (0x1D611, 'M', u'j'), + (0x1D612, 'M', u'k'), + (0x1D613, 'M', u'l'), + (0x1D614, 'M', u'm'), + (0x1D615, 'M', u'n'), + (0x1D616, 'M', u'o'), + (0x1D617, 'M', u'p'), + (0x1D618, 'M', u'q'), + (0x1D619, 'M', u'r'), + (0x1D61A, 'M', u's'), + (0x1D61B, 'M', u't'), + (0x1D61C, 'M', u'u'), + (0x1D61D, 'M', u'v'), + (0x1D61E, 'M', u'w'), + (0x1D61F, 'M', u'x'), + (0x1D620, 'M', u'y'), + (0x1D621, 'M', u'z'), + (0x1D622, 'M', u'a'), + (0x1D623, 'M', u'b'), + (0x1D624, 'M', u'c'), + (0x1D625, 'M', u'd'), + (0x1D626, 'M', u'e'), + (0x1D627, 'M', u'f'), + (0x1D628, 'M', u'g'), + (0x1D629, 'M', u'h'), + (0x1D62A, 'M', u'i'), + (0x1D62B, 'M', u'j'), + (0x1D62C, 'M', u'k'), + (0x1D62D, 'M', u'l'), + (0x1D62E, 'M', u'm'), + (0x1D62F, 'M', u'n'), + (0x1D630, 'M', u'o'), + (0x1D631, 'M', u'p'), + (0x1D632, 'M', u'q'), + (0x1D633, 'M', u'r'), + (0x1D634, 'M', u's'), + (0x1D635, 'M', u't'), + (0x1D636, 'M', u'u'), + ] + +def _seg_59(): + return [ + (0x1D637, 'M', u'v'), + (0x1D638, 'M', u'w'), + (0x1D639, 'M', u'x'), + (0x1D63A, 'M', u'y'), + (0x1D63B, 'M', u'z'), + (0x1D63C, 'M', u'a'), + (0x1D63D, 'M', u'b'), + (0x1D63E, 'M', u'c'), + (0x1D63F, 'M', u'd'), + (0x1D640, 'M', u'e'), + (0x1D641, 'M', u'f'), + (0x1D642, 'M', u'g'), + (0x1D643, 'M', u'h'), + (0x1D644, 'M', u'i'), + (0x1D645, 'M', u'j'), + (0x1D646, 'M', u'k'), + (0x1D647, 'M', u'l'), + (0x1D648, 'M', u'm'), + (0x1D649, 'M', u'n'), + (0x1D64A, 'M', u'o'), + (0x1D64B, 'M', u'p'), + (0x1D64C, 'M', u'q'), + (0x1D64D, 'M', u'r'), + (0x1D64E, 'M', u's'), + (0x1D64F, 'M', u't'), + (0x1D650, 'M', u'u'), + (0x1D651, 'M', u'v'), + (0x1D652, 'M', u'w'), + (0x1D653, 'M', u'x'), + (0x1D654, 'M', u'y'), + (0x1D655, 'M', u'z'), + (0x1D656, 'M', u'a'), + (0x1D657, 'M', u'b'), + (0x1D658, 'M', u'c'), + (0x1D659, 'M', u'd'), + (0x1D65A, 'M', u'e'), + (0x1D65B, 'M', u'f'), + (0x1D65C, 'M', u'g'), + (0x1D65D, 'M', u'h'), + (0x1D65E, 'M', u'i'), + (0x1D65F, 'M', u'j'), + (0x1D660, 'M', u'k'), + (0x1D661, 'M', u'l'), + (0x1D662, 'M', u'm'), + (0x1D663, 'M', u'n'), + (0x1D664, 'M', u'o'), + (0x1D665, 'M', u'p'), + (0x1D666, 'M', u'q'), + (0x1D667, 'M', u'r'), + (0x1D668, 'M', u's'), + (0x1D669, 'M', u't'), + (0x1D66A, 'M', u'u'), + (0x1D66B, 'M', u'v'), + (0x1D66C, 'M', u'w'), + (0x1D66D, 'M', u'x'), + (0x1D66E, 'M', u'y'), + (0x1D66F, 'M', u'z'), + (0x1D670, 'M', u'a'), + (0x1D671, 'M', u'b'), + (0x1D672, 'M', u'c'), + (0x1D673, 'M', u'd'), + (0x1D674, 'M', u'e'), + (0x1D675, 'M', u'f'), + (0x1D676, 'M', u'g'), + (0x1D677, 'M', u'h'), + (0x1D678, 'M', u'i'), + (0x1D679, 'M', u'j'), + (0x1D67A, 'M', u'k'), + (0x1D67B, 'M', u'l'), + (0x1D67C, 'M', u'm'), + (0x1D67D, 'M', u'n'), + (0x1D67E, 'M', u'o'), + (0x1D67F, 'M', u'p'), + (0x1D680, 'M', u'q'), + (0x1D681, 'M', u'r'), + (0x1D682, 'M', u's'), + (0x1D683, 'M', u't'), + (0x1D684, 'M', u'u'), + (0x1D685, 'M', u'v'), + (0x1D686, 'M', u'w'), + (0x1D687, 'M', u'x'), + (0x1D688, 'M', u'y'), + (0x1D689, 'M', u'z'), + (0x1D68A, 'M', u'a'), + (0x1D68B, 'M', u'b'), + (0x1D68C, 'M', u'c'), + (0x1D68D, 'M', u'd'), + (0x1D68E, 'M', u'e'), + (0x1D68F, 'M', u'f'), + (0x1D690, 'M', u'g'), + (0x1D691, 'M', u'h'), + (0x1D692, 'M', u'i'), + (0x1D693, 'M', u'j'), + (0x1D694, 'M', u'k'), + (0x1D695, 'M', u'l'), + (0x1D696, 'M', u'm'), + (0x1D697, 'M', u'n'), + (0x1D698, 'M', u'o'), + (0x1D699, 'M', u'p'), + (0x1D69A, 'M', u'q'), + ] + +def _seg_60(): + return [ + (0x1D69B, 'M', u'r'), + (0x1D69C, 'M', u's'), + (0x1D69D, 'M', u't'), + (0x1D69E, 'M', u'u'), + (0x1D69F, 'M', u'v'), + (0x1D6A0, 'M', u'w'), + (0x1D6A1, 'M', u'x'), + (0x1D6A2, 'M', u'y'), + (0x1D6A3, 'M', u'z'), + (0x1D6A4, 'M', u'ı'), + (0x1D6A5, 'M', u'ȷ'), + (0x1D6A6, 'X'), + (0x1D6A8, 'M', u'α'), + (0x1D6A9, 'M', u'β'), + (0x1D6AA, 'M', u'γ'), + (0x1D6AB, 'M', u'δ'), + (0x1D6AC, 'M', u'ε'), + (0x1D6AD, 'M', u'ζ'), + (0x1D6AE, 'M', u'η'), + (0x1D6AF, 'M', u'θ'), + (0x1D6B0, 'M', u'ι'), + (0x1D6B1, 'M', u'κ'), + (0x1D6B2, 'M', u'λ'), + (0x1D6B3, 'M', u'μ'), + (0x1D6B4, 'M', u'ν'), + (0x1D6B5, 'M', u'ξ'), + (0x1D6B6, 'M', u'ο'), + (0x1D6B7, 'M', u'π'), + (0x1D6B8, 'M', u'ρ'), + (0x1D6B9, 'M', u'θ'), + (0x1D6BA, 'M', u'σ'), + (0x1D6BB, 'M', u'τ'), + (0x1D6BC, 'M', u'υ'), + (0x1D6BD, 'M', u'φ'), + (0x1D6BE, 'M', u'χ'), + (0x1D6BF, 'M', u'ψ'), + (0x1D6C0, 'M', u'ω'), + (0x1D6C1, 'M', u'∇'), + (0x1D6C2, 'M', u'α'), + (0x1D6C3, 'M', u'β'), + (0x1D6C4, 'M', u'γ'), + (0x1D6C5, 'M', u'δ'), + (0x1D6C6, 'M', u'ε'), + (0x1D6C7, 'M', u'ζ'), + (0x1D6C8, 'M', u'η'), + (0x1D6C9, 'M', u'θ'), + (0x1D6CA, 'M', u'ι'), + (0x1D6CB, 'M', u'κ'), + (0x1D6CC, 'M', u'λ'), + (0x1D6CD, 'M', u'μ'), + (0x1D6CE, 'M', u'ν'), + (0x1D6CF, 'M', u'ξ'), + (0x1D6D0, 'M', u'ο'), + (0x1D6D1, 'M', u'π'), + (0x1D6D2, 'M', u'ρ'), + (0x1D6D3, 'M', u'σ'), + (0x1D6D5, 'M', u'τ'), + (0x1D6D6, 'M', u'υ'), + (0x1D6D7, 'M', u'φ'), + (0x1D6D8, 'M', u'χ'), + (0x1D6D9, 'M', u'ψ'), + (0x1D6DA, 'M', u'ω'), + (0x1D6DB, 'M', u'∂'), + (0x1D6DC, 'M', u'ε'), + (0x1D6DD, 'M', u'θ'), + (0x1D6DE, 'M', u'κ'), + (0x1D6DF, 'M', u'φ'), + (0x1D6E0, 'M', u'ρ'), + (0x1D6E1, 'M', u'π'), + (0x1D6E2, 'M', u'α'), + (0x1D6E3, 'M', u'β'), + (0x1D6E4, 'M', u'γ'), + (0x1D6E5, 'M', u'δ'), + (0x1D6E6, 'M', u'ε'), + (0x1D6E7, 'M', u'ζ'), + (0x1D6E8, 'M', u'η'), + (0x1D6E9, 'M', u'θ'), + (0x1D6EA, 'M', u'ι'), + (0x1D6EB, 'M', u'κ'), + (0x1D6EC, 'M', u'λ'), + (0x1D6ED, 'M', u'μ'), + (0x1D6EE, 'M', u'ν'), + (0x1D6EF, 'M', u'ξ'), + (0x1D6F0, 'M', u'ο'), + (0x1D6F1, 'M', u'π'), + (0x1D6F2, 'M', u'ρ'), + (0x1D6F3, 'M', u'θ'), + (0x1D6F4, 'M', u'σ'), + (0x1D6F5, 'M', u'τ'), + (0x1D6F6, 'M', u'υ'), + (0x1D6F7, 'M', u'φ'), + (0x1D6F8, 'M', u'χ'), + (0x1D6F9, 'M', u'ψ'), + (0x1D6FA, 'M', u'ω'), + (0x1D6FB, 'M', u'∇'), + (0x1D6FC, 'M', u'α'), + (0x1D6FD, 'M', u'β'), + (0x1D6FE, 'M', u'γ'), + (0x1D6FF, 'M', u'δ'), + (0x1D700, 'M', u'ε'), + ] + +def _seg_61(): + return [ + (0x1D701, 'M', u'ζ'), + (0x1D702, 'M', u'η'), + (0x1D703, 'M', u'θ'), + (0x1D704, 'M', u'ι'), + (0x1D705, 'M', u'κ'), + (0x1D706, 'M', u'λ'), + (0x1D707, 'M', u'μ'), + (0x1D708, 'M', u'ν'), + (0x1D709, 'M', u'ξ'), + (0x1D70A, 'M', u'ο'), + (0x1D70B, 'M', u'π'), + (0x1D70C, 'M', u'ρ'), + (0x1D70D, 'M', u'σ'), + (0x1D70F, 'M', u'τ'), + (0x1D710, 'M', u'υ'), + (0x1D711, 'M', u'φ'), + (0x1D712, 'M', u'χ'), + (0x1D713, 'M', u'ψ'), + (0x1D714, 'M', u'ω'), + (0x1D715, 'M', u'∂'), + (0x1D716, 'M', u'ε'), + (0x1D717, 'M', u'θ'), + (0x1D718, 'M', u'κ'), + (0x1D719, 'M', u'φ'), + (0x1D71A, 'M', u'ρ'), + (0x1D71B, 'M', u'π'), + (0x1D71C, 'M', u'α'), + (0x1D71D, 'M', u'β'), + (0x1D71E, 'M', u'γ'), + (0x1D71F, 'M', u'δ'), + (0x1D720, 'M', u'ε'), + (0x1D721, 'M', u'ζ'), + (0x1D722, 'M', u'η'), + (0x1D723, 'M', u'θ'), + (0x1D724, 'M', u'ι'), + (0x1D725, 'M', u'κ'), + (0x1D726, 'M', u'λ'), + (0x1D727, 'M', u'μ'), + (0x1D728, 'M', u'ν'), + (0x1D729, 'M', u'ξ'), + (0x1D72A, 'M', u'ο'), + (0x1D72B, 'M', u'π'), + (0x1D72C, 'M', u'ρ'), + (0x1D72D, 'M', u'θ'), + (0x1D72E, 'M', u'σ'), + (0x1D72F, 'M', u'τ'), + (0x1D730, 'M', u'υ'), + (0x1D731, 'M', u'φ'), + (0x1D732, 'M', u'χ'), + (0x1D733, 'M', u'ψ'), + (0x1D734, 'M', u'ω'), + (0x1D735, 'M', u'∇'), + (0x1D736, 'M', u'α'), + (0x1D737, 'M', u'β'), + (0x1D738, 'M', u'γ'), + (0x1D739, 'M', u'δ'), + (0x1D73A, 'M', u'ε'), + (0x1D73B, 'M', u'ζ'), + (0x1D73C, 'M', u'η'), + (0x1D73D, 'M', u'θ'), + (0x1D73E, 'M', u'ι'), + (0x1D73F, 'M', u'κ'), + (0x1D740, 'M', u'λ'), + (0x1D741, 'M', u'μ'), + (0x1D742, 'M', u'ν'), + (0x1D743, 'M', u'ξ'), + (0x1D744, 'M', u'ο'), + (0x1D745, 'M', u'π'), + (0x1D746, 'M', u'ρ'), + (0x1D747, 'M', u'σ'), + (0x1D749, 'M', u'τ'), + (0x1D74A, 'M', u'υ'), + (0x1D74B, 'M', u'φ'), + (0x1D74C, 'M', u'χ'), + (0x1D74D, 'M', u'ψ'), + (0x1D74E, 'M', u'ω'), + (0x1D74F, 'M', u'∂'), + (0x1D750, 'M', u'ε'), + (0x1D751, 'M', u'θ'), + (0x1D752, 'M', u'κ'), + (0x1D753, 'M', u'φ'), + (0x1D754, 'M', u'ρ'), + (0x1D755, 'M', u'π'), + (0x1D756, 'M', u'α'), + (0x1D757, 'M', u'β'), + (0x1D758, 'M', u'γ'), + (0x1D759, 'M', u'δ'), + (0x1D75A, 'M', u'ε'), + (0x1D75B, 'M', u'ζ'), + (0x1D75C, 'M', u'η'), + (0x1D75D, 'M', u'θ'), + (0x1D75E, 'M', u'ι'), + (0x1D75F, 'M', u'κ'), + (0x1D760, 'M', u'λ'), + (0x1D761, 'M', u'μ'), + (0x1D762, 'M', u'ν'), + (0x1D763, 'M', u'ξ'), + (0x1D764, 'M', u'ο'), + (0x1D765, 'M', u'π'), + (0x1D766, 'M', u'ρ'), + ] + +def _seg_62(): + return [ + (0x1D767, 'M', u'θ'), + (0x1D768, 'M', u'σ'), + (0x1D769, 'M', u'τ'), + (0x1D76A, 'M', u'υ'), + (0x1D76B, 'M', u'φ'), + (0x1D76C, 'M', u'χ'), + (0x1D76D, 'M', u'ψ'), + (0x1D76E, 'M', u'ω'), + (0x1D76F, 'M', u'∇'), + (0x1D770, 'M', u'α'), + (0x1D771, 'M', u'β'), + (0x1D772, 'M', u'γ'), + (0x1D773, 'M', u'δ'), + (0x1D774, 'M', u'ε'), + (0x1D775, 'M', u'ζ'), + (0x1D776, 'M', u'η'), + (0x1D777, 'M', u'θ'), + (0x1D778, 'M', u'ι'), + (0x1D779, 'M', u'κ'), + (0x1D77A, 'M', u'λ'), + (0x1D77B, 'M', u'μ'), + (0x1D77C, 'M', u'ν'), + (0x1D77D, 'M', u'ξ'), + (0x1D77E, 'M', u'ο'), + (0x1D77F, 'M', u'π'), + (0x1D780, 'M', u'ρ'), + (0x1D781, 'M', u'σ'), + (0x1D783, 'M', u'τ'), + (0x1D784, 'M', u'υ'), + (0x1D785, 'M', u'φ'), + (0x1D786, 'M', u'χ'), + (0x1D787, 'M', u'ψ'), + (0x1D788, 'M', u'ω'), + (0x1D789, 'M', u'∂'), + (0x1D78A, 'M', u'ε'), + (0x1D78B, 'M', u'θ'), + (0x1D78C, 'M', u'κ'), + (0x1D78D, 'M', u'φ'), + (0x1D78E, 'M', u'ρ'), + (0x1D78F, 'M', u'π'), + (0x1D790, 'M', u'α'), + (0x1D791, 'M', u'β'), + (0x1D792, 'M', u'γ'), + (0x1D793, 'M', u'δ'), + (0x1D794, 'M', u'ε'), + (0x1D795, 'M', u'ζ'), + (0x1D796, 'M', u'η'), + (0x1D797, 'M', u'θ'), + (0x1D798, 'M', u'ι'), + (0x1D799, 'M', u'κ'), + (0x1D79A, 'M', u'λ'), + (0x1D79B, 'M', u'μ'), + (0x1D79C, 'M', u'ν'), + (0x1D79D, 'M', u'ξ'), + (0x1D79E, 'M', u'ο'), + (0x1D79F, 'M', u'π'), + (0x1D7A0, 'M', u'ρ'), + (0x1D7A1, 'M', u'θ'), + (0x1D7A2, 'M', u'σ'), + (0x1D7A3, 'M', u'τ'), + (0x1D7A4, 'M', u'υ'), + (0x1D7A5, 'M', u'φ'), + (0x1D7A6, 'M', u'χ'), + (0x1D7A7, 'M', u'ψ'), + (0x1D7A8, 'M', u'ω'), + (0x1D7A9, 'M', u'∇'), + (0x1D7AA, 'M', u'α'), + (0x1D7AB, 'M', u'β'), + (0x1D7AC, 'M', u'γ'), + (0x1D7AD, 'M', u'δ'), + (0x1D7AE, 'M', u'ε'), + (0x1D7AF, 'M', u'ζ'), + (0x1D7B0, 'M', u'η'), + (0x1D7B1, 'M', u'θ'), + (0x1D7B2, 'M', u'ι'), + (0x1D7B3, 'M', u'κ'), + (0x1D7B4, 'M', u'λ'), + (0x1D7B5, 'M', u'μ'), + (0x1D7B6, 'M', u'ν'), + (0x1D7B7, 'M', u'ξ'), + (0x1D7B8, 'M', u'ο'), + (0x1D7B9, 'M', u'π'), + (0x1D7BA, 'M', u'ρ'), + (0x1D7BB, 'M', u'σ'), + (0x1D7BD, 'M', u'τ'), + (0x1D7BE, 'M', u'υ'), + (0x1D7BF, 'M', u'φ'), + (0x1D7C0, 'M', u'χ'), + (0x1D7C1, 'M', u'ψ'), + (0x1D7C2, 'M', u'ω'), + (0x1D7C3, 'M', u'∂'), + (0x1D7C4, 'M', u'ε'), + (0x1D7C5, 'M', u'θ'), + (0x1D7C6, 'M', u'κ'), + (0x1D7C7, 'M', u'φ'), + (0x1D7C8, 'M', u'ρ'), + (0x1D7C9, 'M', u'π'), + (0x1D7CA, 'M', u'ϝ'), + (0x1D7CC, 'X'), + (0x1D7CE, 'M', u'0'), + ] + +def _seg_63(): + return [ + (0x1D7CF, 'M', u'1'), + (0x1D7D0, 'M', u'2'), + (0x1D7D1, 'M', u'3'), + (0x1D7D2, 'M', u'4'), + (0x1D7D3, 'M', u'5'), + (0x1D7D4, 'M', u'6'), + (0x1D7D5, 'M', u'7'), + (0x1D7D6, 'M', u'8'), + (0x1D7D7, 'M', u'9'), + (0x1D7D8, 'M', u'0'), + (0x1D7D9, 'M', u'1'), + (0x1D7DA, 'M', u'2'), + (0x1D7DB, 'M', u'3'), + (0x1D7DC, 'M', u'4'), + (0x1D7DD, 'M', u'5'), + (0x1D7DE, 'M', u'6'), + (0x1D7DF, 'M', u'7'), + (0x1D7E0, 'M', u'8'), + (0x1D7E1, 'M', u'9'), + (0x1D7E2, 'M', u'0'), + (0x1D7E3, 'M', u'1'), + (0x1D7E4, 'M', u'2'), + (0x1D7E5, 'M', u'3'), + (0x1D7E6, 'M', u'4'), + (0x1D7E7, 'M', u'5'), + (0x1D7E8, 'M', u'6'), + (0x1D7E9, 'M', u'7'), + (0x1D7EA, 'M', u'8'), + (0x1D7EB, 'M', u'9'), + (0x1D7EC, 'M', u'0'), + (0x1D7ED, 'M', u'1'), + (0x1D7EE, 'M', u'2'), + (0x1D7EF, 'M', u'3'), + (0x1D7F0, 'M', u'4'), + (0x1D7F1, 'M', u'5'), + (0x1D7F2, 'M', u'6'), + (0x1D7F3, 'M', u'7'), + (0x1D7F4, 'M', u'8'), + (0x1D7F5, 'M', u'9'), + (0x1D7F6, 'M', u'0'), + (0x1D7F7, 'M', u'1'), + (0x1D7F8, 'M', u'2'), + (0x1D7F9, 'M', u'3'), + (0x1D7FA, 'M', u'4'), + (0x1D7FB, 'M', u'5'), + (0x1D7FC, 'M', u'6'), + (0x1D7FD, 'M', u'7'), + (0x1D7FE, 'M', u'8'), + (0x1D7FF, 'M', u'9'), + (0x1D800, 'X'), + (0x1EE00, 'M', u'ا'), + (0x1EE01, 'M', u'ب'), + (0x1EE02, 'M', u'ج'), + (0x1EE03, 'M', u'د'), + (0x1EE04, 'X'), + (0x1EE05, 'M', u'و'), + (0x1EE06, 'M', u'ز'), + (0x1EE07, 'M', u'ح'), + (0x1EE08, 'M', u'ط'), + (0x1EE09, 'M', u'ي'), + (0x1EE0A, 'M', u'ك'), + (0x1EE0B, 'M', u'ل'), + (0x1EE0C, 'M', u'م'), + (0x1EE0D, 'M', u'ن'), + (0x1EE0E, 'M', u'س'), + (0x1EE0F, 'M', u'ع'), + (0x1EE10, 'M', u'ف'), + (0x1EE11, 'M', u'ص'), + (0x1EE12, 'M', u'ق'), + (0x1EE13, 'M', u'ر'), + (0x1EE14, 'M', u'ش'), + (0x1EE15, 'M', u'ت'), + (0x1EE16, 'M', u'ث'), + (0x1EE17, 'M', u'خ'), + (0x1EE18, 'M', u'ذ'), + (0x1EE19, 'M', u'ض'), + (0x1EE1A, 'M', u'ظ'), + (0x1EE1B, 'M', u'غ'), + (0x1EE1C, 'M', u'ٮ'), + (0x1EE1D, 'M', u'ں'), + (0x1EE1E, 'M', u'ڡ'), + (0x1EE1F, 'M', u'ٯ'), + (0x1EE20, 'X'), + (0x1EE21, 'M', u'ب'), + (0x1EE22, 'M', u'ج'), + (0x1EE23, 'X'), + (0x1EE24, 'M', u'ه'), + (0x1EE25, 'X'), + (0x1EE27, 'M', u'ح'), + (0x1EE28, 'X'), + (0x1EE29, 'M', u'ي'), + (0x1EE2A, 'M', u'ك'), + (0x1EE2B, 'M', u'ل'), + (0x1EE2C, 'M', u'م'), + (0x1EE2D, 'M', u'ن'), + (0x1EE2E, 'M', u'س'), + (0x1EE2F, 'M', u'ع'), + (0x1EE30, 'M', u'ف'), + (0x1EE31, 'M', u'ص'), + (0x1EE32, 'M', u'ق'), + ] + +def _seg_64(): + return [ + (0x1EE33, 'X'), + (0x1EE34, 'M', u'ش'), + (0x1EE35, 'M', u'ت'), + (0x1EE36, 'M', u'ث'), + (0x1EE37, 'M', u'خ'), + (0x1EE38, 'X'), + (0x1EE39, 'M', u'ض'), + (0x1EE3A, 'X'), + (0x1EE3B, 'M', u'غ'), + (0x1EE3C, 'X'), + (0x1EE42, 'M', u'ج'), + (0x1EE43, 'X'), + (0x1EE47, 'M', u'ح'), + (0x1EE48, 'X'), + (0x1EE49, 'M', u'ي'), + (0x1EE4A, 'X'), + (0x1EE4B, 'M', u'ل'), + (0x1EE4C, 'X'), + (0x1EE4D, 'M', u'ن'), + (0x1EE4E, 'M', u'س'), + (0x1EE4F, 'M', u'ع'), + (0x1EE50, 'X'), + (0x1EE51, 'M', u'ص'), + (0x1EE52, 'M', u'ق'), + (0x1EE53, 'X'), + (0x1EE54, 'M', u'ش'), + (0x1EE55, 'X'), + (0x1EE57, 'M', u'خ'), + (0x1EE58, 'X'), + (0x1EE59, 'M', u'ض'), + (0x1EE5A, 'X'), + (0x1EE5B, 'M', u'غ'), + (0x1EE5C, 'X'), + (0x1EE5D, 'M', u'ں'), + (0x1EE5E, 'X'), + (0x1EE5F, 'M', u'ٯ'), + (0x1EE60, 'X'), + (0x1EE61, 'M', u'ب'), + (0x1EE62, 'M', u'ج'), + (0x1EE63, 'X'), + (0x1EE64, 'M', u'ه'), + (0x1EE65, 'X'), + (0x1EE67, 'M', u'ح'), + (0x1EE68, 'M', u'ط'), + (0x1EE69, 'M', u'ي'), + (0x1EE6A, 'M', u'ك'), + (0x1EE6B, 'X'), + (0x1EE6C, 'M', u'م'), + (0x1EE6D, 'M', u'ن'), + (0x1EE6E, 'M', u'س'), + (0x1EE6F, 'M', u'ع'), + (0x1EE70, 'M', u'ف'), + (0x1EE71, 'M', u'ص'), + (0x1EE72, 'M', u'ق'), + (0x1EE73, 'X'), + (0x1EE74, 'M', u'ش'), + (0x1EE75, 'M', u'ت'), + (0x1EE76, 'M', u'ث'), + (0x1EE77, 'M', u'خ'), + (0x1EE78, 'X'), + (0x1EE79, 'M', u'ض'), + (0x1EE7A, 'M', u'ظ'), + (0x1EE7B, 'M', u'غ'), + (0x1EE7C, 'M', u'ٮ'), + (0x1EE7D, 'X'), + (0x1EE7E, 'M', u'ڡ'), + (0x1EE7F, 'X'), + (0x1EE80, 'M', u'ا'), + (0x1EE81, 'M', u'ب'), + (0x1EE82, 'M', u'ج'), + (0x1EE83, 'M', u'د'), + (0x1EE84, 'M', u'ه'), + (0x1EE85, 'M', u'و'), + (0x1EE86, 'M', u'ز'), + (0x1EE87, 'M', u'ح'), + (0x1EE88, 'M', u'ط'), + (0x1EE89, 'M', u'ي'), + (0x1EE8A, 'X'), + (0x1EE8B, 'M', u'ل'), + (0x1EE8C, 'M', u'م'), + (0x1EE8D, 'M', u'ن'), + (0x1EE8E, 'M', u'س'), + (0x1EE8F, 'M', u'ع'), + (0x1EE90, 'M', u'ف'), + (0x1EE91, 'M', u'ص'), + (0x1EE92, 'M', u'ق'), + (0x1EE93, 'M', u'ر'), + (0x1EE94, 'M', u'ش'), + (0x1EE95, 'M', u'ت'), + (0x1EE96, 'M', u'ث'), + (0x1EE97, 'M', u'خ'), + (0x1EE98, 'M', u'ذ'), + (0x1EE99, 'M', u'ض'), + (0x1EE9A, 'M', u'ظ'), + (0x1EE9B, 'M', u'غ'), + (0x1EE9C, 'X'), + (0x1EEA1, 'M', u'ب'), + (0x1EEA2, 'M', u'ج'), + (0x1EEA3, 'M', u'د'), + (0x1EEA4, 'X'), + ] + +def _seg_65(): + return [ + (0x1EEA5, 'M', u'و'), + (0x1EEA6, 'M', u'ز'), + (0x1EEA7, 'M', u'ح'), + (0x1EEA8, 'M', u'ط'), + (0x1EEA9, 'M', u'ي'), + (0x1EEAA, 'X'), + (0x1EEAB, 'M', u'ل'), + (0x1EEAC, 'M', u'م'), + (0x1EEAD, 'M', u'ن'), + (0x1EEAE, 'M', u'س'), + (0x1EEAF, 'M', u'ع'), + (0x1EEB0, 'M', u'ف'), + (0x1EEB1, 'M', u'ص'), + (0x1EEB2, 'M', u'ق'), + (0x1EEB3, 'M', u'ر'), + (0x1EEB4, 'M', u'ش'), + (0x1EEB5, 'M', u'ت'), + (0x1EEB6, 'M', u'ث'), + (0x1EEB7, 'M', u'خ'), + (0x1EEB8, 'M', u'ذ'), + (0x1EEB9, 'M', u'ض'), + (0x1EEBA, 'M', u'ظ'), + (0x1EEBB, 'M', u'غ'), + (0x1EEBC, 'X'), + (0x1EEF0, 'V'), + (0x1EEF2, 'X'), + (0x1F000, 'V'), + (0x1F02C, 'X'), + (0x1F030, 'V'), + (0x1F094, 'X'), + (0x1F0A0, 'V'), + (0x1F0AF, 'X'), + (0x1F0B1, 'V'), + (0x1F0BF, 'X'), + (0x1F0C1, 'V'), + (0x1F0D0, 'X'), + (0x1F0D1, 'V'), + (0x1F0E0, 'X'), + (0x1F101, '3', u'0,'), + (0x1F102, '3', u'1,'), + (0x1F103, '3', u'2,'), + (0x1F104, '3', u'3,'), + (0x1F105, '3', u'4,'), + (0x1F106, '3', u'5,'), + (0x1F107, '3', u'6,'), + (0x1F108, '3', u'7,'), + (0x1F109, '3', u'8,'), + (0x1F10A, '3', u'9,'), + (0x1F10B, 'X'), + (0x1F110, '3', u'(a)'), + (0x1F111, '3', u'(b)'), + (0x1F112, '3', u'(c)'), + (0x1F113, '3', u'(d)'), + (0x1F114, '3', u'(e)'), + (0x1F115, '3', u'(f)'), + (0x1F116, '3', u'(g)'), + (0x1F117, '3', u'(h)'), + (0x1F118, '3', u'(i)'), + (0x1F119, '3', u'(j)'), + (0x1F11A, '3', u'(k)'), + (0x1F11B, '3', u'(l)'), + (0x1F11C, '3', u'(m)'), + (0x1F11D, '3', u'(n)'), + (0x1F11E, '3', u'(o)'), + (0x1F11F, '3', u'(p)'), + (0x1F120, '3', u'(q)'), + (0x1F121, '3', u'(r)'), + (0x1F122, '3', u'(s)'), + (0x1F123, '3', u'(t)'), + (0x1F124, '3', u'(u)'), + (0x1F125, '3', u'(v)'), + (0x1F126, '3', u'(w)'), + (0x1F127, '3', u'(x)'), + (0x1F128, '3', u'(y)'), + (0x1F129, '3', u'(z)'), + (0x1F12A, 'M', u'〔s〕'), + (0x1F12B, 'M', u'c'), + (0x1F12C, 'M', u'r'), + (0x1F12D, 'M', u'cd'), + (0x1F12E, 'M', u'wz'), + (0x1F12F, 'X'), + (0x1F130, 'M', u'a'), + (0x1F131, 'M', u'b'), + (0x1F132, 'M', u'c'), + (0x1F133, 'M', u'd'), + (0x1F134, 'M', u'e'), + (0x1F135, 'M', u'f'), + (0x1F136, 'M', u'g'), + (0x1F137, 'M', u'h'), + (0x1F138, 'M', u'i'), + (0x1F139, 'M', u'j'), + (0x1F13A, 'M', u'k'), + (0x1F13B, 'M', u'l'), + (0x1F13C, 'M', u'm'), + (0x1F13D, 'M', u'n'), + (0x1F13E, 'M', u'o'), + (0x1F13F, 'M', u'p'), + (0x1F140, 'M', u'q'), + (0x1F141, 'M', u'r'), + (0x1F142, 'M', u's'), + ] + +def _seg_66(): + return [ + (0x1F143, 'M', u't'), + (0x1F144, 'M', u'u'), + (0x1F145, 'M', u'v'), + (0x1F146, 'M', u'w'), + (0x1F147, 'M', u'x'), + (0x1F148, 'M', u'y'), + (0x1F149, 'M', u'z'), + (0x1F14A, 'M', u'hv'), + (0x1F14B, 'M', u'mv'), + (0x1F14C, 'M', u'sd'), + (0x1F14D, 'M', u'ss'), + (0x1F14E, 'M', u'ppv'), + (0x1F14F, 'M', u'wc'), + (0x1F150, 'V'), + (0x1F16A, 'M', u'mc'), + (0x1F16B, 'M', u'md'), + (0x1F16C, 'X'), + (0x1F170, 'V'), + (0x1F190, 'M', u'dj'), + (0x1F191, 'V'), + (0x1F19B, 'X'), + (0x1F1E6, 'V'), + (0x1F200, 'M', u'ほか'), + (0x1F201, 'M', u'ココ'), + (0x1F202, 'M', u'サ'), + (0x1F203, 'X'), + (0x1F210, 'M', u'手'), + (0x1F211, 'M', u'字'), + (0x1F212, 'M', u'双'), + (0x1F213, 'M', u'デ'), + (0x1F214, 'M', u'二'), + (0x1F215, 'M', u'多'), + (0x1F216, 'M', u'解'), + (0x1F217, 'M', u'天'), + (0x1F218, 'M', u'交'), + (0x1F219, 'M', u'映'), + (0x1F21A, 'M', u'無'), + (0x1F21B, 'M', u'料'), + (0x1F21C, 'M', u'前'), + (0x1F21D, 'M', u'後'), + (0x1F21E, 'M', u'再'), + (0x1F21F, 'M', u'新'), + (0x1F220, 'M', u'初'), + (0x1F221, 'M', u'終'), + (0x1F222, 'M', u'生'), + (0x1F223, 'M', u'販'), + (0x1F224, 'M', u'声'), + (0x1F225, 'M', u'吹'), + (0x1F226, 'M', u'演'), + (0x1F227, 'M', u'投'), + (0x1F228, 'M', u'捕'), + (0x1F229, 'M', u'一'), + (0x1F22A, 'M', u'三'), + (0x1F22B, 'M', u'遊'), + (0x1F22C, 'M', u'左'), + (0x1F22D, 'M', u'中'), + (0x1F22E, 'M', u'右'), + (0x1F22F, 'M', u'指'), + (0x1F230, 'M', u'走'), + (0x1F231, 'M', u'打'), + (0x1F232, 'M', u'禁'), + (0x1F233, 'M', u'空'), + (0x1F234, 'M', u'合'), + (0x1F235, 'M', u'満'), + (0x1F236, 'M', u'有'), + (0x1F237, 'M', u'月'), + (0x1F238, 'M', u'申'), + (0x1F239, 'M', u'割'), + (0x1F23A, 'M', u'営'), + (0x1F23B, 'X'), + (0x1F240, 'M', u'〔本〕'), + (0x1F241, 'M', u'〔三〕'), + (0x1F242, 'M', u'〔二〕'), + (0x1F243, 'M', u'〔安〕'), + (0x1F244, 'M', u'〔点〕'), + (0x1F245, 'M', u'〔打〕'), + (0x1F246, 'M', u'〔盗〕'), + (0x1F247, 'M', u'〔勝〕'), + (0x1F248, 'M', u'〔敗〕'), + (0x1F249, 'X'), + (0x1F250, 'M', u'得'), + (0x1F251, 'M', u'可'), + (0x1F252, 'X'), + (0x1F300, 'V'), + (0x1F321, 'X'), + (0x1F330, 'V'), + (0x1F336, 'X'), + (0x1F337, 'V'), + (0x1F37D, 'X'), + (0x1F380, 'V'), + (0x1F394, 'X'), + (0x1F3A0, 'V'), + (0x1F3C5, 'X'), + (0x1F3C6, 'V'), + (0x1F3CB, 'X'), + (0x1F3E0, 'V'), + (0x1F3F1, 'X'), + (0x1F400, 'V'), + (0x1F43F, 'X'), + (0x1F440, 'V'), + ] + +def _seg_67(): + return [ + (0x1F441, 'X'), + (0x1F442, 'V'), + (0x1F4F8, 'X'), + (0x1F4F9, 'V'), + (0x1F4FD, 'X'), + (0x1F500, 'V'), + (0x1F53E, 'X'), + (0x1F540, 'V'), + (0x1F544, 'X'), + (0x1F550, 'V'), + (0x1F568, 'X'), + (0x1F5FB, 'V'), + (0x1F641, 'X'), + (0x1F645, 'V'), + (0x1F650, 'X'), + (0x1F680, 'V'), + (0x1F6C6, 'X'), + (0x1F700, 'V'), + (0x1F774, 'X'), + (0x20000, 'V'), + (0x2A6D7, 'X'), + (0x2A700, 'V'), + (0x2B735, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2F800, 'M', u'丽'), + (0x2F801, 'M', u'丸'), + (0x2F802, 'M', u'乁'), + (0x2F803, 'M', u'𠄢'), + (0x2F804, 'M', u'你'), + (0x2F805, 'M', u'侮'), + (0x2F806, 'M', u'侻'), + (0x2F807, 'M', u'倂'), + (0x2F808, 'M', u'偺'), + (0x2F809, 'M', u'備'), + (0x2F80A, 'M', u'僧'), + (0x2F80B, 'M', u'像'), + (0x2F80C, 'M', u'㒞'), + (0x2F80D, 'M', u'𠘺'), + (0x2F80E, 'M', u'免'), + (0x2F80F, 'M', u'兔'), + (0x2F810, 'M', u'兤'), + (0x2F811, 'M', u'具'), + (0x2F812, 'M', u'𠔜'), + (0x2F813, 'M', u'㒹'), + (0x2F814, 'M', u'內'), + (0x2F815, 'M', u'再'), + (0x2F816, 'M', u'𠕋'), + (0x2F817, 'M', u'冗'), + (0x2F818, 'M', u'冤'), + (0x2F819, 'M', u'仌'), + (0x2F81A, 'M', u'冬'), + (0x2F81B, 'M', u'况'), + (0x2F81C, 'M', u'𩇟'), + (0x2F81D, 'M', u'凵'), + (0x2F81E, 'M', u'刃'), + (0x2F81F, 'M', u'㓟'), + (0x2F820, 'M', u'刻'), + (0x2F821, 'M', u'剆'), + (0x2F822, 'M', u'割'), + (0x2F823, 'M', u'剷'), + (0x2F824, 'M', u'㔕'), + (0x2F825, 'M', u'勇'), + (0x2F826, 'M', u'勉'), + (0x2F827, 'M', u'勤'), + (0x2F828, 'M', u'勺'), + (0x2F829, 'M', u'包'), + (0x2F82A, 'M', u'匆'), + (0x2F82B, 'M', u'北'), + (0x2F82C, 'M', u'卉'), + (0x2F82D, 'M', u'卑'), + (0x2F82E, 'M', u'博'), + (0x2F82F, 'M', u'即'), + (0x2F830, 'M', u'卽'), + (0x2F831, 'M', u'卿'), + (0x2F834, 'M', u'𠨬'), + (0x2F835, 'M', u'灰'), + (0x2F836, 'M', u'及'), + (0x2F837, 'M', u'叟'), + (0x2F838, 'M', u'𠭣'), + (0x2F839, 'M', u'叫'), + (0x2F83A, 'M', u'叱'), + (0x2F83B, 'M', u'吆'), + (0x2F83C, 'M', u'咞'), + (0x2F83D, 'M', u'吸'), + (0x2F83E, 'M', u'呈'), + (0x2F83F, 'M', u'周'), + (0x2F840, 'M', u'咢'), + (0x2F841, 'M', u'哶'), + (0x2F842, 'M', u'唐'), + (0x2F843, 'M', u'啓'), + (0x2F844, 'M', u'啣'), + (0x2F845, 'M', u'善'), + (0x2F847, 'M', u'喙'), + (0x2F848, 'M', u'喫'), + (0x2F849, 'M', u'喳'), + (0x2F84A, 'M', u'嗂'), + (0x2F84B, 'M', u'圖'), + (0x2F84C, 'M', u'嘆'), + (0x2F84D, 'M', u'圗'), + ] + +def _seg_68(): + return [ + (0x2F84E, 'M', u'噑'), + (0x2F84F, 'M', u'噴'), + (0x2F850, 'M', u'切'), + (0x2F851, 'M', u'壮'), + (0x2F852, 'M', u'城'), + (0x2F853, 'M', u'埴'), + (0x2F854, 'M', u'堍'), + (0x2F855, 'M', u'型'), + (0x2F856, 'M', u'堲'), + (0x2F857, 'M', u'報'), + (0x2F858, 'M', u'墬'), + (0x2F859, 'M', u'𡓤'), + (0x2F85A, 'M', u'売'), + (0x2F85B, 'M', u'壷'), + (0x2F85C, 'M', u'夆'), + (0x2F85D, 'M', u'多'), + (0x2F85E, 'M', u'夢'), + (0x2F85F, 'M', u'奢'), + (0x2F860, 'M', u'𡚨'), + (0x2F861, 'M', u'𡛪'), + (0x2F862, 'M', u'姬'), + (0x2F863, 'M', u'娛'), + (0x2F864, 'M', u'娧'), + (0x2F865, 'M', u'姘'), + (0x2F866, 'M', u'婦'), + (0x2F867, 'M', u'㛮'), + (0x2F868, 'X'), + (0x2F869, 'M', u'嬈'), + (0x2F86A, 'M', u'嬾'), + (0x2F86C, 'M', u'𡧈'), + (0x2F86D, 'M', u'寃'), + (0x2F86E, 'M', u'寘'), + (0x2F86F, 'M', u'寧'), + (0x2F870, 'M', u'寳'), + (0x2F871, 'M', u'𡬘'), + (0x2F872, 'M', u'寿'), + (0x2F873, 'M', u'将'), + (0x2F874, 'X'), + (0x2F875, 'M', u'尢'), + (0x2F876, 'M', u'㞁'), + (0x2F877, 'M', u'屠'), + (0x2F878, 'M', u'屮'), + (0x2F879, 'M', u'峀'), + (0x2F87A, 'M', u'岍'), + (0x2F87B, 'M', u'𡷤'), + (0x2F87C, 'M', u'嵃'), + (0x2F87D, 'M', u'𡷦'), + (0x2F87E, 'M', u'嵮'), + (0x2F87F, 'M', u'嵫'), + (0x2F880, 'M', u'嵼'), + (0x2F881, 'M', u'巡'), + (0x2F882, 'M', u'巢'), + (0x2F883, 'M', u'㠯'), + (0x2F884, 'M', u'巽'), + (0x2F885, 'M', u'帨'), + (0x2F886, 'M', u'帽'), + (0x2F887, 'M', u'幩'), + (0x2F888, 'M', u'㡢'), + (0x2F889, 'M', u'𢆃'), + (0x2F88A, 'M', u'㡼'), + (0x2F88B, 'M', u'庰'), + (0x2F88C, 'M', u'庳'), + (0x2F88D, 'M', u'庶'), + (0x2F88E, 'M', u'廊'), + (0x2F88F, 'M', u'𪎒'), + (0x2F890, 'M', u'廾'), + (0x2F891, 'M', u'𢌱'), + (0x2F893, 'M', u'舁'), + (0x2F894, 'M', u'弢'), + (0x2F896, 'M', u'㣇'), + (0x2F897, 'M', u'𣊸'), + (0x2F898, 'M', u'𦇚'), + (0x2F899, 'M', u'形'), + (0x2F89A, 'M', u'彫'), + (0x2F89B, 'M', u'㣣'), + (0x2F89C, 'M', u'徚'), + (0x2F89D, 'M', u'忍'), + (0x2F89E, 'M', u'志'), + (0x2F89F, 'M', u'忹'), + (0x2F8A0, 'M', u'悁'), + (0x2F8A1, 'M', u'㤺'), + (0x2F8A2, 'M', u'㤜'), + (0x2F8A3, 'M', u'悔'), + (0x2F8A4, 'M', u'𢛔'), + (0x2F8A5, 'M', u'惇'), + (0x2F8A6, 'M', u'慈'), + (0x2F8A7, 'M', u'慌'), + (0x2F8A8, 'M', u'慎'), + (0x2F8A9, 'M', u'慌'), + (0x2F8AA, 'M', u'慺'), + (0x2F8AB, 'M', u'憎'), + (0x2F8AC, 'M', u'憲'), + (0x2F8AD, 'M', u'憤'), + (0x2F8AE, 'M', u'憯'), + (0x2F8AF, 'M', u'懞'), + (0x2F8B0, 'M', u'懲'), + (0x2F8B1, 'M', u'懶'), + (0x2F8B2, 'M', u'成'), + (0x2F8B3, 'M', u'戛'), + (0x2F8B4, 'M', u'扝'), + ] + +def _seg_69(): + return [ + (0x2F8B5, 'M', u'抱'), + (0x2F8B6, 'M', u'拔'), + (0x2F8B7, 'M', u'捐'), + (0x2F8B8, 'M', u'𢬌'), + (0x2F8B9, 'M', u'挽'), + (0x2F8BA, 'M', u'拼'), + (0x2F8BB, 'M', u'捨'), + (0x2F8BC, 'M', u'掃'), + (0x2F8BD, 'M', u'揤'), + (0x2F8BE, 'M', u'𢯱'), + (0x2F8BF, 'M', u'搢'), + (0x2F8C0, 'M', u'揅'), + (0x2F8C1, 'M', u'掩'), + (0x2F8C2, 'M', u'㨮'), + (0x2F8C3, 'M', u'摩'), + (0x2F8C4, 'M', u'摾'), + (0x2F8C5, 'M', u'撝'), + (0x2F8C6, 'M', u'摷'), + (0x2F8C7, 'M', u'㩬'), + (0x2F8C8, 'M', u'敏'), + (0x2F8C9, 'M', u'敬'), + (0x2F8CA, 'M', u'𣀊'), + (0x2F8CB, 'M', u'旣'), + (0x2F8CC, 'M', u'書'), + (0x2F8CD, 'M', u'晉'), + (0x2F8CE, 'M', u'㬙'), + (0x2F8CF, 'M', u'暑'), + (0x2F8D0, 'M', u'㬈'), + (0x2F8D1, 'M', u'㫤'), + (0x2F8D2, 'M', u'冒'), + (0x2F8D3, 'M', u'冕'), + (0x2F8D4, 'M', u'最'), + (0x2F8D5, 'M', u'暜'), + (0x2F8D6, 'M', u'肭'), + (0x2F8D7, 'M', u'䏙'), + (0x2F8D8, 'M', u'朗'), + (0x2F8D9, 'M', u'望'), + (0x2F8DA, 'M', u'朡'), + (0x2F8DB, 'M', u'杞'), + (0x2F8DC, 'M', u'杓'), + (0x2F8DD, 'M', u'𣏃'), + (0x2F8DE, 'M', u'㭉'), + (0x2F8DF, 'M', u'柺'), + (0x2F8E0, 'M', u'枅'), + (0x2F8E1, 'M', u'桒'), + (0x2F8E2, 'M', u'梅'), + (0x2F8E3, 'M', u'𣑭'), + (0x2F8E4, 'M', u'梎'), + (0x2F8E5, 'M', u'栟'), + (0x2F8E6, 'M', u'椔'), + (0x2F8E7, 'M', u'㮝'), + (0x2F8E8, 'M', u'楂'), + (0x2F8E9, 'M', u'榣'), + (0x2F8EA, 'M', u'槪'), + (0x2F8EB, 'M', u'檨'), + (0x2F8EC, 'M', u'𣚣'), + (0x2F8ED, 'M', u'櫛'), + (0x2F8EE, 'M', u'㰘'), + (0x2F8EF, 'M', u'次'), + (0x2F8F0, 'M', u'𣢧'), + (0x2F8F1, 'M', u'歔'), + (0x2F8F2, 'M', u'㱎'), + (0x2F8F3, 'M', u'歲'), + (0x2F8F4, 'M', u'殟'), + (0x2F8F5, 'M', u'殺'), + (0x2F8F6, 'M', u'殻'), + (0x2F8F7, 'M', u'𣪍'), + (0x2F8F8, 'M', u'𡴋'), + (0x2F8F9, 'M', u'𣫺'), + (0x2F8FA, 'M', u'汎'), + (0x2F8FB, 'M', u'𣲼'), + (0x2F8FC, 'M', u'沿'), + (0x2F8FD, 'M', u'泍'), + (0x2F8FE, 'M', u'汧'), + (0x2F8FF, 'M', u'洖'), + (0x2F900, 'M', u'派'), + (0x2F901, 'M', u'海'), + (0x2F902, 'M', u'流'), + (0x2F903, 'M', u'浩'), + (0x2F904, 'M', u'浸'), + (0x2F905, 'M', u'涅'), + (0x2F906, 'M', u'𣴞'), + (0x2F907, 'M', u'洴'), + (0x2F908, 'M', u'港'), + (0x2F909, 'M', u'湮'), + (0x2F90A, 'M', u'㴳'), + (0x2F90B, 'M', u'滋'), + (0x2F90C, 'M', u'滇'), + (0x2F90D, 'M', u'𣻑'), + (0x2F90E, 'M', u'淹'), + (0x2F90F, 'M', u'潮'), + (0x2F910, 'M', u'𣽞'), + (0x2F911, 'M', u'𣾎'), + (0x2F912, 'M', u'濆'), + (0x2F913, 'M', u'瀹'), + (0x2F914, 'M', u'瀞'), + (0x2F915, 'M', u'瀛'), + (0x2F916, 'M', u'㶖'), + (0x2F917, 'M', u'灊'), + (0x2F918, 'M', u'災'), + ] + +def _seg_70(): + return [ + (0x2F919, 'M', u'灷'), + (0x2F91A, 'M', u'炭'), + (0x2F91B, 'M', u'𠔥'), + (0x2F91C, 'M', u'煅'), + (0x2F91D, 'M', u'𤉣'), + (0x2F91E, 'M', u'熜'), + (0x2F91F, 'X'), + (0x2F920, 'M', u'爨'), + (0x2F921, 'M', u'爵'), + (0x2F922, 'M', u'牐'), + (0x2F923, 'M', u'𤘈'), + (0x2F924, 'M', u'犀'), + (0x2F925, 'M', u'犕'), + (0x2F926, 'M', u'𤜵'), + (0x2F927, 'M', u'𤠔'), + (0x2F928, 'M', u'獺'), + (0x2F929, 'M', u'王'), + (0x2F92A, 'M', u'㺬'), + (0x2F92B, 'M', u'玥'), + (0x2F92C, 'M', u'㺸'), + (0x2F92E, 'M', u'瑇'), + (0x2F92F, 'M', u'瑜'), + (0x2F930, 'M', u'瑱'), + (0x2F931, 'M', u'璅'), + (0x2F932, 'M', u'瓊'), + (0x2F933, 'M', u'㼛'), + (0x2F934, 'M', u'甤'), + (0x2F935, 'M', u'𤰶'), + (0x2F936, 'M', u'甾'), + (0x2F937, 'M', u'𤲒'), + (0x2F938, 'M', u'異'), + (0x2F939, 'M', u'𢆟'), + (0x2F93A, 'M', u'瘐'), + (0x2F93B, 'M', u'𤾡'), + (0x2F93C, 'M', u'𤾸'), + (0x2F93D, 'M', u'𥁄'), + (0x2F93E, 'M', u'㿼'), + (0x2F93F, 'M', u'䀈'), + (0x2F940, 'M', u'直'), + (0x2F941, 'M', u'𥃳'), + (0x2F942, 'M', u'𥃲'), + (0x2F943, 'M', u'𥄙'), + (0x2F944, 'M', u'𥄳'), + (0x2F945, 'M', u'眞'), + (0x2F946, 'M', u'真'), + (0x2F948, 'M', u'睊'), + (0x2F949, 'M', u'䀹'), + (0x2F94A, 'M', u'瞋'), + (0x2F94B, 'M', u'䁆'), + (0x2F94C, 'M', u'䂖'), + (0x2F94D, 'M', u'𥐝'), + (0x2F94E, 'M', u'硎'), + (0x2F94F, 'M', u'碌'), + (0x2F950, 'M', u'磌'), + (0x2F951, 'M', u'䃣'), + (0x2F952, 'M', u'𥘦'), + (0x2F953, 'M', u'祖'), + (0x2F954, 'M', u'𥚚'), + (0x2F955, 'M', u'𥛅'), + (0x2F956, 'M', u'福'), + (0x2F957, 'M', u'秫'), + (0x2F958, 'M', u'䄯'), + (0x2F959, 'M', u'穀'), + (0x2F95A, 'M', u'穊'), + (0x2F95B, 'M', u'穏'), + (0x2F95C, 'M', u'𥥼'), + (0x2F95D, 'M', u'𥪧'), + (0x2F95F, 'X'), + (0x2F960, 'M', u'䈂'), + (0x2F961, 'M', u'𥮫'), + (0x2F962, 'M', u'篆'), + (0x2F963, 'M', u'築'), + (0x2F964, 'M', u'䈧'), + (0x2F965, 'M', u'𥲀'), + (0x2F966, 'M', u'糒'), + (0x2F967, 'M', u'䊠'), + (0x2F968, 'M', u'糨'), + (0x2F969, 'M', u'糣'), + (0x2F96A, 'M', u'紀'), + (0x2F96B, 'M', u'𥾆'), + (0x2F96C, 'M', u'絣'), + (0x2F96D, 'M', u'䌁'), + (0x2F96E, 'M', u'緇'), + (0x2F96F, 'M', u'縂'), + (0x2F970, 'M', u'繅'), + (0x2F971, 'M', u'䌴'), + (0x2F972, 'M', u'𦈨'), + (0x2F973, 'M', u'𦉇'), + (0x2F974, 'M', u'䍙'), + (0x2F975, 'M', u'𦋙'), + (0x2F976, 'M', u'罺'), + (0x2F977, 'M', u'𦌾'), + (0x2F978, 'M', u'羕'), + (0x2F979, 'M', u'翺'), + (0x2F97A, 'M', u'者'), + (0x2F97B, 'M', u'𦓚'), + (0x2F97C, 'M', u'𦔣'), + (0x2F97D, 'M', u'聠'), + (0x2F97E, 'M', u'𦖨'), + (0x2F97F, 'M', u'聰'), + ] + +def _seg_71(): + return [ + (0x2F980, 'M', u'𣍟'), + (0x2F981, 'M', u'䏕'), + (0x2F982, 'M', u'育'), + (0x2F983, 'M', u'脃'), + (0x2F984, 'M', u'䐋'), + (0x2F985, 'M', u'脾'), + (0x2F986, 'M', u'媵'), + (0x2F987, 'M', u'𦞧'), + (0x2F988, 'M', u'𦞵'), + (0x2F989, 'M', u'𣎓'), + (0x2F98A, 'M', u'𣎜'), + (0x2F98B, 'M', u'舁'), + (0x2F98C, 'M', u'舄'), + (0x2F98D, 'M', u'辞'), + (0x2F98E, 'M', u'䑫'), + (0x2F98F, 'M', u'芑'), + (0x2F990, 'M', u'芋'), + (0x2F991, 'M', u'芝'), + (0x2F992, 'M', u'劳'), + (0x2F993, 'M', u'花'), + (0x2F994, 'M', u'芳'), + (0x2F995, 'M', u'芽'), + (0x2F996, 'M', u'苦'), + (0x2F997, 'M', u'𦬼'), + (0x2F998, 'M', u'若'), + (0x2F999, 'M', u'茝'), + (0x2F99A, 'M', u'荣'), + (0x2F99B, 'M', u'莭'), + (0x2F99C, 'M', u'茣'), + (0x2F99D, 'M', u'莽'), + (0x2F99E, 'M', u'菧'), + (0x2F99F, 'M', u'著'), + (0x2F9A0, 'M', u'荓'), + (0x2F9A1, 'M', u'菊'), + (0x2F9A2, 'M', u'菌'), + (0x2F9A3, 'M', u'菜'), + (0x2F9A4, 'M', u'𦰶'), + (0x2F9A5, 'M', u'𦵫'), + (0x2F9A6, 'M', u'𦳕'), + (0x2F9A7, 'M', u'䔫'), + (0x2F9A8, 'M', u'蓱'), + (0x2F9A9, 'M', u'蓳'), + (0x2F9AA, 'M', u'蔖'), + (0x2F9AB, 'M', u'𧏊'), + (0x2F9AC, 'M', u'蕤'), + (0x2F9AD, 'M', u'𦼬'), + (0x2F9AE, 'M', u'䕝'), + (0x2F9AF, 'M', u'䕡'), + (0x2F9B0, 'M', u'𦾱'), + (0x2F9B1, 'M', u'𧃒'), + (0x2F9B2, 'M', u'䕫'), + (0x2F9B3, 'M', u'虐'), + (0x2F9B4, 'M', u'虜'), + (0x2F9B5, 'M', u'虧'), + (0x2F9B6, 'M', u'虩'), + (0x2F9B7, 'M', u'蚩'), + (0x2F9B8, 'M', u'蚈'), + (0x2F9B9, 'M', u'蜎'), + (0x2F9BA, 'M', u'蛢'), + (0x2F9BB, 'M', u'蝹'), + (0x2F9BC, 'M', u'蜨'), + (0x2F9BD, 'M', u'蝫'), + (0x2F9BE, 'M', u'螆'), + (0x2F9BF, 'X'), + (0x2F9C0, 'M', u'蟡'), + (0x2F9C1, 'M', u'蠁'), + (0x2F9C2, 'M', u'䗹'), + (0x2F9C3, 'M', u'衠'), + (0x2F9C4, 'M', u'衣'), + (0x2F9C5, 'M', u'𧙧'), + (0x2F9C6, 'M', u'裗'), + (0x2F9C7, 'M', u'裞'), + (0x2F9C8, 'M', u'䘵'), + (0x2F9C9, 'M', u'裺'), + (0x2F9CA, 'M', u'㒻'), + (0x2F9CB, 'M', u'𧢮'), + (0x2F9CC, 'M', u'𧥦'), + (0x2F9CD, 'M', u'䚾'), + (0x2F9CE, 'M', u'䛇'), + (0x2F9CF, 'M', u'誠'), + (0x2F9D0, 'M', u'諭'), + (0x2F9D1, 'M', u'變'), + (0x2F9D2, 'M', u'豕'), + (0x2F9D3, 'M', u'𧲨'), + (0x2F9D4, 'M', u'貫'), + (0x2F9D5, 'M', u'賁'), + (0x2F9D6, 'M', u'贛'), + (0x2F9D7, 'M', u'起'), + (0x2F9D8, 'M', u'𧼯'), + (0x2F9D9, 'M', u'𠠄'), + (0x2F9DA, 'M', u'跋'), + (0x2F9DB, 'M', u'趼'), + (0x2F9DC, 'M', u'跰'), + (0x2F9DD, 'M', u'𠣞'), + (0x2F9DE, 'M', u'軔'), + (0x2F9DF, 'M', u'輸'), + (0x2F9E0, 'M', u'𨗒'), + (0x2F9E1, 'M', u'𨗭'), + (0x2F9E2, 'M', u'邔'), + (0x2F9E3, 'M', u'郱'), + ] + +def _seg_72(): + return [ + (0x2F9E4, 'M', u'鄑'), + (0x2F9E5, 'M', u'𨜮'), + (0x2F9E6, 'M', u'鄛'), + (0x2F9E7, 'M', u'鈸'), + (0x2F9E8, 'M', u'鋗'), + (0x2F9E9, 'M', u'鋘'), + (0x2F9EA, 'M', u'鉼'), + (0x2F9EB, 'M', u'鏹'), + (0x2F9EC, 'M', u'鐕'), + (0x2F9ED, 'M', u'𨯺'), + (0x2F9EE, 'M', u'開'), + (0x2F9EF, 'M', u'䦕'), + (0x2F9F0, 'M', u'閷'), + (0x2F9F1, 'M', u'𨵷'), + (0x2F9F2, 'M', u'䧦'), + (0x2F9F3, 'M', u'雃'), + (0x2F9F4, 'M', u'嶲'), + (0x2F9F5, 'M', u'霣'), + (0x2F9F6, 'M', u'𩅅'), + (0x2F9F7, 'M', u'𩈚'), + (0x2F9F8, 'M', u'䩮'), + (0x2F9F9, 'M', u'䩶'), + (0x2F9FA, 'M', u'韠'), + (0x2F9FB, 'M', u'𩐊'), + (0x2F9FC, 'M', u'䪲'), + (0x2F9FD, 'M', u'𩒖'), + (0x2F9FE, 'M', u'頋'), + (0x2FA00, 'M', u'頩'), + (0x2FA01, 'M', u'𩖶'), + (0x2FA02, 'M', u'飢'), + (0x2FA03, 'M', u'䬳'), + (0x2FA04, 'M', u'餩'), + (0x2FA05, 'M', u'馧'), + (0x2FA06, 'M', u'駂'), + (0x2FA07, 'M', u'駾'), + (0x2FA08, 'M', u'䯎'), + (0x2FA09, 'M', u'𩬰'), + (0x2FA0A, 'M', u'鬒'), + (0x2FA0B, 'M', u'鱀'), + (0x2FA0C, 'M', u'鳽'), + (0x2FA0D, 'M', u'䳎'), + (0x2FA0E, 'M', u'䳭'), + (0x2FA0F, 'M', u'鵧'), + (0x2FA10, 'M', u'𪃎'), + (0x2FA11, 'M', u'䳸'), + (0x2FA12, 'M', u'𪄅'), + (0x2FA13, 'M', u'𪈎'), + (0x2FA14, 'M', u'𪊑'), + (0x2FA15, 'M', u'麻'), + (0x2FA16, 'M', u'䵖'), + (0x2FA17, 'M', u'黹'), + (0x2FA18, 'M', u'黾'), + (0x2FA19, 'M', u'鼅'), + (0x2FA1A, 'M', u'鼏'), + (0x2FA1B, 'M', u'鼖'), + (0x2FA1C, 'M', u'鼻'), + (0x2FA1D, 'M', u'𪘀'), + (0x2FA1E, 'X'), + (0xE0100, 'I'), + (0xE01F0, 'X'), + ] + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() +) diff --git a/urllib3/__init__.py b/urllib3/__init__.py new file mode 100644 index 00000000..aaa6b1c6 --- /dev/null +++ b/urllib3/__init__.py @@ -0,0 +1,97 @@ +""" +urllib3 - Thread-safe connection pooling and re-using. +""" + +from __future__ import absolute_import +import warnings + +from .connectionpool import ( + HTTPConnectionPool, + HTTPSConnectionPool, + connection_from_url +) + +from . import exceptions +from .filepost import encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import HTTPResponse +from .util.request import make_headers +from .util.url import get_host +from .util.timeout import Timeout +from .util.retry import Retry + + +# Set default logging handler to avoid "No handler found" warnings. +import logging +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = '1.22' + +__all__ = ( + 'HTTPConnectionPool', + 'HTTPSConnectionPool', + 'PoolManager', + 'ProxyManager', + 'HTTPResponse', + 'Retry', + 'Timeout', + 'add_stderr_logger', + 'connection_from_url', + 'disable_warnings', + 'encode_multipart_formdata', + 'get_host', + 'make_headers', + 'proxy_from_url', +) + +logging.getLogger(__name__).addHandler(NullHandler()) + + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug('Added a stderr logging handler to logger: %s', __name__) + return handler + + +# ... Clean up. +del NullHandler + + +# All warning filters *must* be appended unless you're really certain that they +# shouldn't be: otherwise, it's very hard for users to use most Python +# mechanisms to silence them. +# SecurityWarning's always go off by default. +warnings.simplefilter('always', exceptions.SecurityWarning, append=True) +# SubjectAltNameWarning's should go off once per host +warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) +# InsecurePlatformWarning's don't vary between requests, so we keep it default. +warnings.simplefilter('default', exceptions.InsecurePlatformWarning, + append=True) +# SNIMissingWarnings should go off only once. +warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) + + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter('ignore', category) diff --git a/urllib3/_collections.py b/urllib3/_collections.py new file mode 100644 index 00000000..5df2372c --- /dev/null +++ b/urllib3/_collections.py @@ -0,0 +1,319 @@ +from __future__ import absolute_import +from collections import Mapping, MutableMapping +try: + from threading import RLock +except ImportError: # Platform-specific: No threads available + class RLock: + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_value, traceback): + pass + + +try: # Python 2.7+ + from collections import OrderedDict +except ImportError: + from .packages.ordered_dict import OrderedDict +from .packages.six import iterkeys, itervalues, PY3 + + +__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] + + +_Null = object() + + +class RecentlyUsedContainer(MutableMapping): + """ + Provides a thread-safe dict-like container which maintains up to + ``maxsize`` keys while throwing away the least-recently-used keys beyond + ``maxsize``. + + :param maxsize: + Maximum number of recent elements to retain. + + :param dispose_func: + Every time an item is evicted from the container, + ``dispose_func(value)`` is called. Callback which will get called + """ + + ContainerCls = OrderedDict + + def __init__(self, maxsize=10, dispose_func=None): + self._maxsize = maxsize + self.dispose_func = dispose_func + + self._container = self.ContainerCls() + self.lock = RLock() + + def __getitem__(self, key): + # Re-insert the item, moving it to the end of the eviction line. + with self.lock: + item = self._container.pop(key) + self._container[key] = item + return item + + def __setitem__(self, key, value): + evicted_value = _Null + with self.lock: + # Possibly evict the existing value of 'key' + evicted_value = self._container.get(key, _Null) + self._container[key] = value + + # If we didn't evict an existing value, we might have to evict the + # least recently used item from the beginning of the container. + if len(self._container) > self._maxsize: + _key, evicted_value = self._container.popitem(last=False) + + if self.dispose_func and evicted_value is not _Null: + self.dispose_func(evicted_value) + + def __delitem__(self, key): + with self.lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self): + with self.lock: + return len(self._container) + + def __iter__(self): + raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') + + def clear(self): + with self.lock: + # Copy pointers to all values, then wipe the mapping + values = list(itervalues(self._container)) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self): + with self.lock: + return list(iterkeys(self._container)) + + +class HTTPHeaderDict(MutableMapping): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + """ + + def __init__(self, headers=None, **kwargs): + super(HTTPHeaderDict, self).__init__() + self._container = OrderedDict() + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key, val): + self._container[key.lower()] = [key, val] + return self._container[key.lower()] + + def __getitem__(self, key): + val = self._container[key.lower()] + return ', '.join(val[1:]) + + def __delitem__(self, key): + del self._container[key.lower()] + + def __contains__(self, key): + return key.lower() in self._container + + def __eq__(self, other): + if not isinstance(other, Mapping) and not hasattr(other, 'keys'): + return False + if not isinstance(other, type(self)): + other = type(self)(other) + return (dict((k.lower(), v) for k, v in self.itermerged()) == + dict((k.lower(), v) for k, v in other.itermerged())) + + def __ne__(self, other): + return not self.__eq__(other) + + if not PY3: # Python 2 + iterkeys = MutableMapping.iterkeys + itervalues = MutableMapping.itervalues + + __marker = object() + + def __len__(self): + return len(self._container) + + def __iter__(self): + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def pop(self, key, default=__marker): + '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + ''' + # Using the MutableMapping function directly fails due to the private marker. + # Using ordinary dict.pop would expose the internal structures. + # So let's reinvent the wheel. + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def discard(self, key): + try: + del self[key] + except KeyError: + pass + + def add(self, key, val): + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + """ + key_lower = key.lower() + new_vals = [key, val] + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + vals.append(val) + + def extend(self, *args, **kwargs): + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError("extend() takes at most 1 positional " + "arguments ({0} given)".format(len(args))) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, Mapping): + for key in other: + self.add(key, other[key]) + elif hasattr(other, "keys"): + for key in other.keys(): + self.add(key, other[key]) + else: + for key, value in other: + self.add(key, value) + + for key, value in kwargs.items(): + self.add(key, value) + + def getlist(self, key, default=__marker): + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + try: + vals = self._container[key.lower()] + except KeyError: + if default is self.__marker: + return [] + return default + else: + return vals[1:] + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + # Backwards compatibility for http.cookiejar + get_all = getlist + + def __repr__(self): + return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) + + def _copy_from(self, other): + for key in other: + val = other.getlist(key) + if isinstance(val, list): + # Don't need to convert tuples + val = list(val) + self._container[key.lower()] = [key] + val + + def copy(self): + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self): + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self): + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ', '.join(val[1:]) + + def items(self): + return list(self.iteritems()) + + @classmethod + def from_httplib(cls, message): # Python 2 + """Read headers from a Python 2 httplib message object.""" + # python2.7 does not expose a proper API for exporting multiheaders + # efficiently. This function re-reads raw lines from the message + # object and extracts the multiheaders properly. + headers = [] + + for line in message.headers: + if line.startswith((' ', '\t')): + key, value = headers[-1] + headers[-1] = (key, value + '\r\n' + line.rstrip()) + continue + + key, value = line.split(':', 1) + headers.append((key, value.strip())) + + return cls(headers) diff --git a/urllib3/connection.py b/urllib3/connection.py new file mode 100644 index 00000000..c0d83299 --- /dev/null +++ b/urllib3/connection.py @@ -0,0 +1,373 @@ +from __future__ import absolute_import +import datetime +import logging +import os +import sys +import socket +from socket import error as SocketError, timeout as SocketTimeout +import warnings +from .packages import six +from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection +from .packages.six.moves.http_client import HTTPException # noqa: F401 + +try: # Compiled with SSL? + import ssl + BaseSSLError = ssl.SSLError +except (ImportError, AttributeError): # Platform-specific: No SSL. + ssl = None + + class BaseSSLError(BaseException): + pass + + +try: # Python 3: + # Not a no-op, we're adding this to the namespace so it can be imported. + ConnectionError = ConnectionError +except NameError: # Python 2: + class ConnectionError(Exception): + pass + + +from .exceptions import ( + NewConnectionError, + ConnectTimeoutError, + SubjectAltNameWarning, + SystemTimeWarning, +) +from .packages.ssl_match_hostname import match_hostname, CertificateError + +from .util.ssl_ import ( + resolve_cert_reqs, + resolve_ssl_version, + assert_fingerprint, + create_urllib3_context, + ssl_wrap_socket +) + + +from .util import connection + +from ._collections import HTTPHeaderDict + +log = logging.getLogger(__name__) + +port_by_scheme = { + 'http': 80, + 'https': 443, +} + +# When updating RECENT_DATE, move it to +# within two years of the current date, and no +# earlier than 6 months ago. +RECENT_DATE = datetime.date(2016, 1, 1) + + +class DummyConnection(object): + """Used to detect a failed ConnectionCls import.""" + pass + + +class HTTPConnection(_HTTPConnection, object): + """ + Based on httplib.HTTPConnection but provides an extra constructor + backwards-compatibility layer between older and newer Pythons. + + Additional keyword parameters are used to configure attributes of the connection. + Accepted parameters include: + + - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` + - ``source_address``: Set the source address for the current connection. + + .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x + + - ``socket_options``: Set specific options on the underlying socket. If not specified, then + defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling + Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. + + For example, if you wish to enable TCP Keep Alive in addition to the defaults, + you might pass:: + + HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + ] + + Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). + """ + + default_port = port_by_scheme['http'] + + #: Disable Nagle's algorithm by default. + #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` + default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + + #: Whether this connection verifies the host's certificate. + is_verified = False + + def __init__(self, *args, **kw): + if six.PY3: # Python 3 + kw.pop('strict', None) + + # Pre-set source_address in case we have an older Python like 2.6. + self.source_address = kw.get('source_address') + + if sys.version_info < (2, 7): # Python 2.6 + # _HTTPConnection on Python 2.6 will balk at this keyword arg, but + # not newer versions. We can still use it when creating a + # connection though, so we pop it *after* we have saved it as + # self.source_address. + kw.pop('source_address', None) + + #: The socket options provided by the user. If no options are + #: provided, we use the default options. + self.socket_options = kw.pop('socket_options', self.default_socket_options) + + # Superclass also sets self.source_address in Python 2.7+. + _HTTPConnection.__init__(self, *args, **kw) + + def _new_conn(self): + """ Establish a socket connection and set nodelay settings on it. + + :return: New socket connection. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = connection.create_connection( + (self.host, self.port), self.timeout, **extra_kw) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except SocketError as e: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + def _prepare_conn(self, conn): + self.sock = conn + # the _tunnel_host attribute was added in python 2.6.3 (via + # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do + # not have them. + if getattr(self, '_tunnel_host', None): + # TODO: Fix tunnel so it doesn't depend on self.sock state. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + def request_chunked(self, method, url, body=None, headers=None): + """ + Alternative to the common request method, which sends the + body with chunked encoding and not as one block + """ + headers = HTTPHeaderDict(headers if headers is not None else {}) + skip_accept_encoding = 'accept-encoding' in headers + skip_host = 'host' in headers + self.putrequest( + method, + url, + skip_accept_encoding=skip_accept_encoding, + skip_host=skip_host + ) + for header, value in headers.items(): + self.putheader(header, value) + if 'transfer-encoding' not in headers: + self.putheader('Transfer-Encoding', 'chunked') + self.endheaders() + + if body is not None: + stringish_types = six.string_types + (six.binary_type,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, six.binary_type): + chunk = chunk.encode('utf8') + len_str = hex(len(chunk))[2:] + self.send(len_str.encode('utf-8')) + self.send(b'\r\n') + self.send(chunk) + self.send(b'\r\n') + + # After the if clause, to always have a closed body + self.send(b'0\r\n\r\n') + + +class HTTPSConnection(HTTPConnection): + default_port = port_by_scheme['https'] + + ssl_version = None + + def __init__(self, host, port=None, key_file=None, cert_file=None, + strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + ssl_context=None, **kw): + + HTTPConnection.__init__(self, host, port, strict=strict, + timeout=timeout, **kw) + + self.key_file = key_file + self.cert_file = cert_file + self.ssl_context = ssl_context + + # Required property for Google AppEngine 1.9.0 which otherwise causes + # HTTPS requests to go out as HTTP. (See Issue #356) + self._protocol = 'https' + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(None), + cert_reqs=resolve_cert_reqs(None), + ) + + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ssl_context=self.ssl_context, + ) + + +class VerifiedHTTPSConnection(HTTPSConnection): + """ + Based on httplib.HTTPSConnection but wraps the socket with + SSL certification. + """ + cert_reqs = None + ca_certs = None + ca_cert_dir = None + ssl_version = None + assert_fingerprint = None + + def set_cert(self, key_file=None, cert_file=None, + cert_reqs=None, ca_certs=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None): + """ + This method should only be called once, before the connection is used. + """ + # If cert_reqs is not provided, we can try to guess. If the user gave + # us a cert database, we assume they want to use it: otherwise, if + # they gave us an SSL Context object we should use whatever is set for + # it. + if cert_reqs is None: + if ca_certs or ca_cert_dir: + cert_reqs = 'CERT_REQUIRED' + elif self.ssl_context is not None: + cert_reqs = self.ssl_context.verify_mode + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) + + def connect(self): + # Add certificate verification + conn = self._new_conn() + + hostname = self.host + if getattr(self, '_tunnel_host', None): + # _tunnel_host was added in Python 2.6.3 + # (See: http://hg.python.org/cpython/rev/0f57b30a152f) + + self.sock = conn + # Calls self._set_hostport(), so self.host is + # self._tunnel_host below. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + # Override the host with the one we're requesting data from. + hostname = self._tunnel_host + + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn(( + 'System time is way off (before {0}). This will probably ' + 'lead to SSL verification errors').format(RECENT_DATE), + SystemTimeWarning + ) + + # Wrap socket using verification with the root certs in + # trusted_root_certs + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(self.ssl_version), + cert_reqs=resolve_cert_reqs(self.cert_reqs), + ) + + context = self.ssl_context + context.verify_mode = resolve_cert_reqs(self.cert_reqs) + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + server_hostname=hostname, + ssl_context=context) + + if self.assert_fingerprint: + assert_fingerprint(self.sock.getpeercert(binary_form=True), + self.assert_fingerprint) + elif context.verify_mode != ssl.CERT_NONE \ + and not getattr(context, 'check_hostname', False) \ + and self.assert_hostname is not False: + # While urllib3 attempts to always turn off hostname matching from + # the TLS library, this cannot always be done. So we check whether + # the TLS Library still thinks it's matching hostnames. + cert = self.sock.getpeercert() + if not cert.get('subjectAltName', ()): + warnings.warn(( + 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' + '`commonName` for now. This feature is being removed by major browsers and ' + 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' + 'for details.)'.format(hostname)), + SubjectAltNameWarning + ) + _match_hostname(cert, self.assert_hostname or hostname) + + self.is_verified = ( + context.verify_mode == ssl.CERT_REQUIRED or + self.assert_fingerprint is not None + ) + + +def _match_hostname(cert, asserted_hostname): + try: + match_hostname(cert, asserted_hostname) + except CertificateError as e: + log.error( + 'Certificate did not match expected hostname: %s. ' + 'Certificate: %s', asserted_hostname, cert + ) + # Add cert to exception and reraise so client code can inspect + # the cert when catching the exception, if they want to + e._peer_cert = cert + raise + + +if ssl: + # Make a copy for testing. + UnverifiedHTTPSConnection = HTTPSConnection + HTTPSConnection = VerifiedHTTPSConnection +else: + HTTPSConnection = DummyConnection diff --git a/urllib3/connectionpool.py b/urllib3/connectionpool.py new file mode 100644 index 00000000..ec9600f8 --- /dev/null +++ b/urllib3/connectionpool.py @@ -0,0 +1,905 @@ +from __future__ import absolute_import +import errno +import logging +import sys +import warnings + +from socket import error as SocketError, timeout as SocketTimeout +import socket + + +from .exceptions import ( + ClosedPoolError, + ProtocolError, + EmptyPoolError, + HeaderParsingError, + HostChangedError, + LocationValueError, + MaxRetryError, + ProxyError, + ReadTimeoutError, + SSLError, + TimeoutError, + InsecureRequestWarning, + NewConnectionError, +) +from .packages.ssl_match_hostname import CertificateError +from .packages import six +from .packages.six.moves import queue +from .connection import ( + port_by_scheme, + DummyConnection, + HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, + HTTPException, BaseSSLError, +) +from .request import RequestMethods +from .response import HTTPResponse + +from .util.connection import is_connection_dropped +from .util.request import set_file_position +from .util.response import assert_header_parsing +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import get_host, Url + + +if six.PY2: + # Queue is imported for side effects on MS Windows + import Queue as _unused_module_Queue # noqa: F401 + +xrange = six.moves.xrange + +log = logging.getLogger(__name__) + +_Default = object() + + +# Pool objects +class ConnectionPool(object): + """ + Base class for all connection pools, such as + :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. + """ + + scheme = None + QueueCls = queue.LifoQueue + + def __init__(self, host, port=None): + if not host: + raise LocationValueError("No host specified.") + + self.host = _ipv6_host(host).lower() + self._proxy_host = host.lower() + self.port = port + + def __str__(self): + return '%s(host=%r, port=%r)' % (type(self).__name__, + self.host, self.port) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + # Return False to re-raise any potential exceptions + return False + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + pass + + +# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 +_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK]) + + +class HTTPConnectionPool(ConnectionPool, RequestMethods): + """ + Thread-safe connection pool for one host. + + :param host: + Host used for this HTTP Connection (e.g. "localhost"), passed into + :class:`httplib.HTTPConnection`. + + :param port: + Port used for this HTTP Connection (None is equivalent to 80), passed + into :class:`httplib.HTTPConnection`. + + :param strict: + Causes BadStatusLine to be raised if the status line can't be parsed + as a valid HTTP/1.0 or 1.1 status line, passed into + :class:`httplib.HTTPConnection`. + + .. note:: + Only works in Python 2. This parameter is ignored in Python 3. + + :param timeout: + Socket timeout in seconds for each individual connection. This can + be a float or integer, which sets the timeout for the HTTP request, + or an instance of :class:`urllib3.util.Timeout` which gives you more + fine-grained control over request timeouts. After the constructor has + been parsed, this is always a `urllib3.util.Timeout` object. + + :param maxsize: + Number of connections to save that can be reused. More than 1 is useful + in multithreaded situations. If ``block`` is set to False, more + connections will be created but they will not be saved once they've + been used. + + :param block: + If set to True, no more than ``maxsize`` connections will be used at + a time. When no free connections are available, the call will block + until a connection has been released. This is a useful side effect for + particular multithreaded situations where one does not want to use more + than maxsize connections per host to prevent flooding. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param retries: + Retry configuration to use by default with requests in this pool. + + :param _proxy: + Parsed proxy URL, should not be used directly, instead, see + :class:`urllib3.connectionpool.ProxyManager`" + + :param _proxy_headers: + A dictionary with proxy headers, should not be used directly, + instead, see :class:`urllib3.connectionpool.ProxyManager`" + + :param \\**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. + """ + + scheme = 'http' + ConnectionCls = HTTPConnection + ResponseCls = HTTPResponse + + def __init__(self, host, port=None, strict=False, + timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, + headers=None, retries=None, + _proxy=None, _proxy_headers=None, + **conn_kw): + ConnectionPool.__init__(self, host, port) + RequestMethods.__init__(self, headers) + + self.strict = strict + + if not isinstance(timeout, Timeout): + timeout = Timeout.from_float(timeout) + + if retries is None: + retries = Retry.DEFAULT + + self.timeout = timeout + self.retries = retries + + self.pool = self.QueueCls(maxsize) + self.block = block + + self.proxy = _proxy + self.proxy_headers = _proxy_headers or {} + + # Fill the queue up so that doing get() on it will block properly + for _ in xrange(maxsize): + self.pool.put(None) + + # These are mostly for testing and debugging purposes. + self.num_connections = 0 + self.num_requests = 0 + self.conn_kw = conn_kw + + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault('socket_options', []) + + def _new_conn(self): + """ + Return a fresh :class:`HTTPConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTP connection (%d): %s", + self.num_connections, self.host) + + conn = self.ConnectionCls(host=self.host, port=self.port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + return conn + + def _get_conn(self, timeout=None): + """ + Get a connection. Will return a pooled connection if one is available. + + If no connections are available and :prop:`.block` is ``False``, then a + fresh connection is returned. + + :param timeout: + Seconds to wait before giving up and raising + :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and + :prop:`.block` is ``True``. + """ + conn = None + try: + conn = self.pool.get(block=self.block, timeout=timeout) + + except AttributeError: # self.pool is None + raise ClosedPoolError(self, "Pool is closed.") + + except queue.Empty: + if self.block: + raise EmptyPoolError(self, + "Pool reached maximum size and no more " + "connections are allowed.") + pass # Oh well, we'll create a new connection then + + # If this is a persistent connection, check if it got disconnected + if conn and is_connection_dropped(conn): + log.debug("Resetting dropped connection: %s", self.host) + conn.close() + if getattr(conn, 'auto_open', 1) == 0: + # This is a proxied connection that has been mutated by + # httplib._tunnel() and cannot be reused (since it would + # attempt to bypass the proxy) + conn = None + + return conn or self._new_conn() + + def _put_conn(self, conn): + """ + Put a connection back into the pool. + + :param conn: + Connection object for the current host and port as returned by + :meth:`._new_conn` or :meth:`._get_conn`. + + If the pool is already full, the connection is closed and discarded + because we exceeded maxsize. If connections are discarded frequently, + then maxsize should be increased. + + If the pool is closed, then the connection will be closed and discarded. + """ + try: + self.pool.put(conn, block=False) + return # Everything is dandy, done. + except AttributeError: + # self.pool is None. + pass + except queue.Full: + # This should never happen if self.block == True + log.warning( + "Connection pool is full, discarding connection: %s", + self.host) + + # Connection never got put back into the pool, close it. + if conn: + conn.close() + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + pass + + def _prepare_proxy(self, conn): + # Nothing to do for HTTP connections. + pass + + def _get_timeout(self, timeout): + """ Helper that always returns a :class:`urllib3.util.Timeout` """ + if timeout is _Default: + return self.timeout.clone() + + if isinstance(timeout, Timeout): + return timeout.clone() + else: + # User passed us an int/float. This is for backwards compatibility, + # can be removed later + return Timeout.from_float(timeout) + + def _raise_timeout(self, err, url, timeout_value): + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # See the above comment about EAGAIN in Python 3. In Python 2 we have + # to specifically catch it and throw the timeout error + if hasattr(err, 'errno') and err.errno in _blocking_errnos: + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # Catch possible read timeouts thrown as SSL errors. If not the + # case, rethrow the original. We need to do this because of: + # http://bugs.python.org/issue10272 + if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python 2.6 + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + def _make_request(self, conn, method, url, timeout=_Default, chunked=False, + **httplib_request_kw): + """ + Perform a request on a given urllib connection object taken from our + pool. + + :param conn: + a connection from one of our connection pools + + :param timeout: + Socket timeout in seconds for the request. This can be a + float or integer, which will set the same timeout value for + the socket connect and the socket read, or an instance of + :class:`urllib3.util.Timeout`, which gives you more fine-grained + control over your timeouts. + """ + self.num_requests += 1 + + timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = timeout_obj.connect_timeout + + # Trigger any extra validation we need to do. + try: + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # conn.request() calls httplib.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + if chunked: + conn.request_chunked(method, url, **httplib_request_kw) + else: + conn.request(method, url, **httplib_request_kw) + + # Reset the timeout for the recv() on the socket + read_timeout = timeout_obj.read_timeout + + # App Engine doesn't have a sock attr + if getattr(conn, 'sock', None): + # In Python 3 socket.py will catch EAGAIN and return None when you + # try and read into the file pointer created by http.client, which + # instead raises a BadStatusLine exception. Instead of catching + # the exception and assuming all BadStatusLine exceptions are read + # timeouts, check for a zero timeout before making the request. + if read_timeout == 0: + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % read_timeout) + if read_timeout is Timeout.DEFAULT_TIMEOUT: + conn.sock.settimeout(socket.getdefaulttimeout()) + else: # None or a value + conn.sock.settimeout(read_timeout) + + # Receive the response from the server + try: + try: # Python 2.7, use buffering of HTTP responses + httplib_response = conn.getresponse(buffering=True) + except TypeError: # Python 2.6 and older, Python 3 + try: + httplib_response = conn.getresponse() + except Exception as e: + # Remove the TypeError from the exception chain in Python 3; + # otherwise it looks like a programming error was the cause. + six.raise_from(e, None) + except (SocketTimeout, BaseSSLError, SocketError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + raise + + # AppEngine doesn't have a version attr. + http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') + log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port, + method, url, http_version, httplib_response.status, + httplib_response.length) + + try: + assert_header_parsing(httplib_response.msg) + except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 + log.warning( + 'Failed to parse headers (url=%s): %s', + self._absolute_url(url), hpe, exc_info=True) + + return httplib_response + + def _absolute_url(self, path): + return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + # Disable access to the pool + old_pool, self.pool = self.pool, None + + try: + while True: + conn = old_pool.get(block=False) + if conn: + conn.close() + + except queue.Empty: + pass # Done. + + def is_same_host(self, url): + """ + Check if the given ``url`` is a member of the same host as this + connection pool. + """ + if url.startswith('/'): + return True + + # TODO: Add optional support for socket.gethostbyname checking. + scheme, host, port = get_host(url) + + host = _ipv6_host(host).lower() + + # Use explicit default port for comparison when none is given + if self.port and not port: + port = port_by_scheme.get(scheme) + elif not self.port and port == port_by_scheme.get(scheme): + port = None + + return (scheme, host, port) == (self.scheme, self.host, self.port) + + def urlopen(self, method, url, body=None, headers=None, retries=None, + redirect=True, assert_same_host=True, timeout=_Default, + pool_timeout=None, release_conn=None, chunked=False, + body_pos=None, **response_kw): + """ + Get a connection from the pool and perform an HTTP request. This is the + lowest level call for making a request, so you'll need to specify all + the raw details. + + .. note:: + + More commonly, it's appropriate to use a convenience method provided + by :class:`.RequestMethods`, such as :meth:`request`. + + .. note:: + + `release_conn` will only behave as expected if + `preload_content=False` because we want to make + `preload_content=False` the default behaviour someday soon without + breaking backwards compatibility. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param body: + Data to send in the request body (useful for creating + POST requests, see HTTPConnectionPool.post_url for + more convenience). + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. + + :param assert_same_host: + If ``True``, will make sure that the host of the pool requests is + consistent else will raise HostChangedError. When False, you can + use the pool on an HTTP proxy and request foreign hosts. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param pool_timeout: + If set and the pool is set to block=True, then this method will + block for ``pool_timeout`` seconds and raise EmptyPoolError if no + connection is available within the time period. + + :param release_conn: + If False, then the urlopen call will not release the connection + back into the pool once a response is received (but will release if + you read the entire contents of the response such as when + `preload_content=True`). This is useful if you're not preloading + the response's content immediately. You will need to call + ``r.release_conn()`` on the response ``r`` to return the connection + back into the pool. If None, it takes the value of + ``response_kw.get('preload_content', True)``. + + :param chunked: + If True, urllib3 will send the body using chunked transfer + encoding. Otherwise, urllib3 will send the body using the standard + content-length form. Defaults to False. + + :param int body_pos: + Position to seek to in file-like body in the event of a retry or + redirect. Typically this won't need to be set because urllib3 will + auto-populate the value when needed. + + :param \\**response_kw: + Additional parameters are passed to + :meth:`urllib3.response.HTTPResponse.from_httplib` + """ + if headers is None: + headers = self.headers + + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if release_conn is None: + release_conn = response_kw.get('preload_content', True) + + # Check host + if assert_same_host and not self.is_same_host(url): + raise HostChangedError(self, url, retries) + + conn = None + + # Track whether `conn` needs to be released before + # returning/raising/recursing. Update this variable if necessary, and + # leave `release_conn` constant throughout the function. That way, if + # the function recurses, the original value of `release_conn` will be + # passed down into the recursive call, and its value will be respected. + # + # See issue #651 [1] for details. + # + # [1] + release_this_conn = release_conn + + # Merge the proxy headers. Only do this in HTTP. We have to copy the + # headers dict so we can safely change it without those changes being + # reflected in anyone else's copy. + if self.scheme == 'http': + headers = headers.copy() + headers.update(self.proxy_headers) + + # Must keep the exception bound to a separate variable or else Python 3 + # complains about UnboundLocalError. + err = None + + # Keep track of whether we cleanly exited the except block. This + # ensures we do proper cleanup in finally. + clean_exit = False + + # Rewind body position, if needed. Record current position + # for future rewinds in the event of a redirect/retry. + body_pos = set_file_position(body, body_pos) + + try: + # Request a connection from the queue. + timeout_obj = self._get_timeout(timeout) + conn = self._get_conn(timeout=pool_timeout) + + conn.timeout = timeout_obj.connect_timeout + + is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) + if is_new_proxy_conn: + self._prepare_proxy(conn) + + # Make the request on the httplib connection object. + httplib_response = self._make_request(conn, method, url, + timeout=timeout_obj, + body=body, headers=headers, + chunked=chunked) + + # If we're going to release the connection in ``finally:``, then + # the response doesn't need to know about the connection. Otherwise + # it will also try to release it and we'll have a double-release + # mess. + response_conn = conn if not release_conn else None + + # Pass method to Response for length checking + response_kw['request_method'] = method + + # Import httplib's response into our own wrapper object + response = self.ResponseCls.from_httplib(httplib_response, + pool=self, + connection=response_conn, + retries=retries, + **response_kw) + + # Everything went great! + clean_exit = True + + except queue.Empty: + # Timed out by queue. + raise EmptyPoolError(self, "No pool connections are available.") + + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError, CertificateError) as e: + # Discard the connection for these exceptions. It will be + # replaced during the next _get_conn() call. + clean_exit = False + if isinstance(e, (BaseSSLError, CertificateError)): + e = SSLError(e) + elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: + e = ProxyError('Cannot connect to proxy.', e) + elif isinstance(e, (SocketError, HTTPException)): + e = ProtocolError('Connection aborted.', e) + + retries = retries.increment(method, url, error=e, _pool=self, + _stacktrace=sys.exc_info()[2]) + retries.sleep() + + # Keep track of the error for the retry warning. + err = e + + finally: + if not clean_exit: + # We hit some kind of exception, handled or otherwise. We need + # to throw the connection away unless explicitly told not to. + # Close the connection, set the variable to None, and make sure + # we put the None back in the pool to avoid leaking it. + conn = conn and conn.close() + release_this_conn = True + + if release_this_conn: + # Put the connection back to be reused. If the connection is + # expired then it will be None, which will get replaced with a + # fresh connection during _get_conn. + self._put_conn(conn) + + if not conn: + # Try again + log.warning("Retrying (%r) after connection " + "broken by '%r': %s", retries, err, url) + return self.urlopen(method, url, body, headers, retries, + redirect, assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + def drain_and_release_conn(response): + try: + # discard any remaining response body, the connection will be + # released back to the pool once the entire response is read + response.read() + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError) as e: + pass + + # Handle redirect? + redirect_location = redirect and response.get_redirect_location() + if redirect_location: + if response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep_for_retry(response) + log.debug("Redirecting %s -> %s", url, redirect_location) + return self.urlopen( + method, redirect_location, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(response.getheader('Retry-After')) + if retries.is_retry(method, response.status, has_retry_after): + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_status: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep(response) + log.debug("Retry: %s", url) + return self.urlopen( + method, url, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, + body_pos=body_pos, **response_kw) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + When Python is compiled with the :mod:`ssl` module, then + :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, + instead of :class:`.HTTPSConnection`. + + :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, + ``assert_hostname`` and ``host`` in this order to verify connections. + If ``assert_hostname`` is False, no verification is done. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, + ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is + available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade + the connection socket into an SSL socket. + """ + + scheme = 'https' + ConnectionCls = HTTPSConnection + + def __init__(self, host, port=None, + strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, + block=False, headers=None, retries=None, + _proxy=None, _proxy_headers=None, + key_file=None, cert_file=None, cert_reqs=None, + ca_certs=None, ssl_version=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None, **conn_kw): + + HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, + block, headers, retries, _proxy, _proxy_headers, + **conn_kw) + + if ca_certs and cert_reqs is None: + cert_reqs = 'CERT_REQUIRED' + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.ca_certs = ca_certs + self.ca_cert_dir = ca_cert_dir + self.ssl_version = ssl_version + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def _prepare_conn(self, conn): + """ + Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` + and establish the tunnel if proxy is used. + """ + + if isinstance(conn, VerifiedHTTPSConnection): + conn.set_cert(key_file=self.key_file, + cert_file=self.cert_file, + cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint) + conn.ssl_version = self.ssl_version + return conn + + def _prepare_proxy(self, conn): + """ + Establish tunnel connection early, because otherwise httplib + would improperly set Host: header to proxy's IP:port. + """ + # Python 2.7+ + try: + set_tunnel = conn.set_tunnel + except AttributeError: # Platform-specific: Python 2.6 + set_tunnel = conn._set_tunnel + + if sys.version_info <= (2, 6, 4) and not self.proxy_headers: # Python 2.6.4 and older + set_tunnel(self._proxy_host, self.port) + else: + set_tunnel(self._proxy_host, self.port, self.proxy_headers) + + conn.connect() + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPSConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTPS connection (%d): %s", + self.num_connections, self.host) + + if not self.ConnectionCls or self.ConnectionCls is DummyConnection: + raise SSLError("Can't connect to HTTPS URL because the SSL " + "module is not available.") + + actual_host = self.host + actual_port = self.port + if self.proxy is not None: + actual_host = self.proxy.host + actual_port = self.proxy.port + + conn = self.ConnectionCls(host=actual_host, port=actual_port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + + return self._prepare_conn(conn) + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + super(HTTPSConnectionPool, self)._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` + conn.connect() + + if not conn.is_verified: + warnings.warn(( + 'Unverified HTTPS request is being made. ' + 'Adding certificate verification is strongly advised. See: ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings'), + InsecureRequestWarning) + + +def connection_from_url(url, **kw): + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \\**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example:: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, host, port = get_host(url) + port = port or port_by_scheme.get(scheme, 80) + if scheme == 'https': + return HTTPSConnectionPool(host, port=port, **kw) + else: + return HTTPConnectionPool(host, port=port, **kw) + + +def _ipv6_host(host): + """ + Process IPv6 address literals + """ + + # httplib doesn't like it when we include brackets in IPv6 addresses + # Specifically, if we include brackets but also pass the port then + # httplib crazily doubles up the square brackets on the Host header. + # Instead, we need to make sure we never pass ``None`` as the port. + # However, for backward compatibility reasons we can't actually + # *assert* that. See http://bugs.python.org/issue28539 + # + # Also if an IPv6 address literal has a zone identifier, the + # percent sign might be URIencoded, convert it back into ASCII + if host.startswith('[') and host.endswith(']'): + host = host.replace('%25', '%').strip('[]') + return host diff --git a/urllib3/contrib/__init__.py b/urllib3/contrib/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/urllib3/contrib/_securetransport/__init__.py b/urllib3/contrib/_securetransport/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/urllib3/contrib/_securetransport/bindings.py b/urllib3/contrib/_securetransport/bindings.py new file mode 100644 index 00000000..bcf41c02 --- /dev/null +++ b/urllib3/contrib/_securetransport/bindings.py @@ -0,0 +1,593 @@ +""" +This module uses ctypes to bind a whole bunch of functions and constants from +SecureTransport. The goal here is to provide the low-level API to +SecureTransport. These are essentially the C-level functions and constants, and +they're pretty gross to work with. + +This code is a bastardised version of the code found in Will Bond's oscrypto +library. An enormous debt is owed to him for blazing this trail for us. For +that reason, this code should be considered to be covered both by urllib3's +license and by oscrypto's: + + Copyright (c) 2015-2016 Will Bond + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +""" +from __future__ import absolute_import + +import platform +from ctypes.util import find_library +from ctypes import ( + c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, + c_bool +) +from ctypes import CDLL, POINTER, CFUNCTYPE + + +security_path = find_library('Security') +if not security_path: + raise ImportError('The library Security could not be found') + + +core_foundation_path = find_library('CoreFoundation') +if not core_foundation_path: + raise ImportError('The library CoreFoundation could not be found') + + +version = platform.mac_ver()[0] +version_info = tuple(map(int, version.split('.'))) +if version_info < (10, 8): + raise OSError( + 'Only OS X 10.8 and newer are supported, not %s.%s' % ( + version_info[0], version_info[1] + ) + ) + +Security = CDLL(security_path, use_errno=True) +CoreFoundation = CDLL(core_foundation_path, use_errno=True) + +Boolean = c_bool +CFIndex = c_long +CFStringEncoding = c_uint32 +CFData = c_void_p +CFString = c_void_p +CFArray = c_void_p +CFMutableArray = c_void_p +CFDictionary = c_void_p +CFError = c_void_p +CFType = c_void_p +CFTypeID = c_ulong + +CFTypeRef = POINTER(CFType) +CFAllocatorRef = c_void_p + +OSStatus = c_int32 + +CFDataRef = POINTER(CFData) +CFStringRef = POINTER(CFString) +CFArrayRef = POINTER(CFArray) +CFMutableArrayRef = POINTER(CFMutableArray) +CFDictionaryRef = POINTER(CFDictionary) +CFArrayCallBacks = c_void_p +CFDictionaryKeyCallBacks = c_void_p +CFDictionaryValueCallBacks = c_void_p + +SecCertificateRef = POINTER(c_void_p) +SecExternalFormat = c_uint32 +SecExternalItemType = c_uint32 +SecIdentityRef = POINTER(c_void_p) +SecItemImportExportFlags = c_uint32 +SecItemImportExportKeyParameters = c_void_p +SecKeychainRef = POINTER(c_void_p) +SSLProtocol = c_uint32 +SSLCipherSuite = c_uint32 +SSLContextRef = POINTER(c_void_p) +SecTrustRef = POINTER(c_void_p) +SSLConnectionRef = c_uint32 +SecTrustResultType = c_uint32 +SecTrustOptionFlags = c_uint32 +SSLProtocolSide = c_uint32 +SSLConnectionType = c_uint32 +SSLSessionOption = c_uint32 + + +try: + Security.SecItemImport.argtypes = [ + CFDataRef, + CFStringRef, + POINTER(SecExternalFormat), + POINTER(SecExternalItemType), + SecItemImportExportFlags, + POINTER(SecItemImportExportKeyParameters), + SecKeychainRef, + POINTER(CFArrayRef), + ] + Security.SecItemImport.restype = OSStatus + + Security.SecCertificateGetTypeID.argtypes = [] + Security.SecCertificateGetTypeID.restype = CFTypeID + + Security.SecIdentityGetTypeID.argtypes = [] + Security.SecIdentityGetTypeID.restype = CFTypeID + + Security.SecKeyGetTypeID.argtypes = [] + Security.SecKeyGetTypeID.restype = CFTypeID + + Security.SecCertificateCreateWithData.argtypes = [ + CFAllocatorRef, + CFDataRef + ] + Security.SecCertificateCreateWithData.restype = SecCertificateRef + + Security.SecCertificateCopyData.argtypes = [ + SecCertificateRef + ] + Security.SecCertificateCopyData.restype = CFDataRef + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SecIdentityCreateWithCertificate.argtypes = [ + CFTypeRef, + SecCertificateRef, + POINTER(SecIdentityRef) + ] + Security.SecIdentityCreateWithCertificate.restype = OSStatus + + Security.SecKeychainCreate.argtypes = [ + c_char_p, + c_uint32, + c_void_p, + Boolean, + c_void_p, + POINTER(SecKeychainRef) + ] + Security.SecKeychainCreate.restype = OSStatus + + Security.SecKeychainDelete.argtypes = [ + SecKeychainRef + ] + Security.SecKeychainDelete.restype = OSStatus + + Security.SecPKCS12Import.argtypes = [ + CFDataRef, + CFDictionaryRef, + POINTER(CFArrayRef) + ] + Security.SecPKCS12Import.restype = OSStatus + + SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) + SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) + + Security.SSLSetIOFuncs.argtypes = [ + SSLContextRef, + SSLReadFunc, + SSLWriteFunc + ] + Security.SSLSetIOFuncs.restype = OSStatus + + Security.SSLSetPeerID.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerID.restype = OSStatus + + Security.SSLSetCertificate.argtypes = [ + SSLContextRef, + CFArrayRef + ] + Security.SSLSetCertificate.restype = OSStatus + + Security.SSLSetCertificateAuthorities.argtypes = [ + SSLContextRef, + CFTypeRef, + Boolean + ] + Security.SSLSetCertificateAuthorities.restype = OSStatus + + Security.SSLSetConnection.argtypes = [ + SSLContextRef, + SSLConnectionRef + ] + Security.SSLSetConnection.restype = OSStatus + + Security.SSLSetPeerDomainName.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerDomainName.restype = OSStatus + + Security.SSLHandshake.argtypes = [ + SSLContextRef + ] + Security.SSLHandshake.restype = OSStatus + + Security.SSLRead.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLRead.restype = OSStatus + + Security.SSLWrite.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLWrite.restype = OSStatus + + Security.SSLClose.argtypes = [ + SSLContextRef + ] + Security.SSLClose.restype = OSStatus + + Security.SSLGetNumberSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberSupportedCiphers.restype = OSStatus + + Security.SSLGetSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetSupportedCiphers.restype = OSStatus + + Security.SSLSetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + c_size_t + ] + Security.SSLSetEnabledCiphers.restype = OSStatus + + Security.SSLGetNumberEnabledCiphers.argtype = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberEnabledCiphers.restype = OSStatus + + Security.SSLGetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetEnabledCiphers.restype = OSStatus + + Security.SSLGetNegotiatedCipher.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite) + ] + Security.SSLGetNegotiatedCipher.restype = OSStatus + + Security.SSLGetNegotiatedProtocolVersion.argtypes = [ + SSLContextRef, + POINTER(SSLProtocol) + ] + Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus + + Security.SSLCopyPeerTrust.argtypes = [ + SSLContextRef, + POINTER(SecTrustRef) + ] + Security.SSLCopyPeerTrust.restype = OSStatus + + Security.SecTrustSetAnchorCertificates.argtypes = [ + SecTrustRef, + CFArrayRef + ] + Security.SecTrustSetAnchorCertificates.restype = OSStatus + + Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ + SecTrustRef, + Boolean + ] + Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus + + Security.SecTrustEvaluate.argtypes = [ + SecTrustRef, + POINTER(SecTrustResultType) + ] + Security.SecTrustEvaluate.restype = OSStatus + + Security.SecTrustGetCertificateCount.argtypes = [ + SecTrustRef + ] + Security.SecTrustGetCertificateCount.restype = CFIndex + + Security.SecTrustGetCertificateAtIndex.argtypes = [ + SecTrustRef, + CFIndex + ] + Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef + + Security.SSLCreateContext.argtypes = [ + CFAllocatorRef, + SSLProtocolSide, + SSLConnectionType + ] + Security.SSLCreateContext.restype = SSLContextRef + + Security.SSLSetSessionOption.argtypes = [ + SSLContextRef, + SSLSessionOption, + Boolean + ] + Security.SSLSetSessionOption.restype = OSStatus + + Security.SSLSetProtocolVersionMin.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMin.restype = OSStatus + + Security.SSLSetProtocolVersionMax.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMax.restype = OSStatus + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SSLReadFunc = SSLReadFunc + Security.SSLWriteFunc = SSLWriteFunc + Security.SSLContextRef = SSLContextRef + Security.SSLProtocol = SSLProtocol + Security.SSLCipherSuite = SSLCipherSuite + Security.SecIdentityRef = SecIdentityRef + Security.SecKeychainRef = SecKeychainRef + Security.SecTrustRef = SecTrustRef + Security.SecTrustResultType = SecTrustResultType + Security.SecExternalFormat = SecExternalFormat + Security.OSStatus = OSStatus + + Security.kSecImportExportPassphrase = CFStringRef.in_dll( + Security, 'kSecImportExportPassphrase' + ) + Security.kSecImportItemIdentity = CFStringRef.in_dll( + Security, 'kSecImportItemIdentity' + ) + + # CoreFoundation time! + CoreFoundation.CFRetain.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRetain.restype = CFTypeRef + + CoreFoundation.CFRelease.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRelease.restype = None + + CoreFoundation.CFGetTypeID.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFGetTypeID.restype = CFTypeID + + CoreFoundation.CFStringCreateWithCString.argtypes = [ + CFAllocatorRef, + c_char_p, + CFStringEncoding + ] + CoreFoundation.CFStringCreateWithCString.restype = CFStringRef + + CoreFoundation.CFStringGetCStringPtr.argtypes = [ + CFStringRef, + CFStringEncoding + ] + CoreFoundation.CFStringGetCStringPtr.restype = c_char_p + + CoreFoundation.CFStringGetCString.argtypes = [ + CFStringRef, + c_char_p, + CFIndex, + CFStringEncoding + ] + CoreFoundation.CFStringGetCString.restype = c_bool + + CoreFoundation.CFDataCreate.argtypes = [ + CFAllocatorRef, + c_char_p, + CFIndex + ] + CoreFoundation.CFDataCreate.restype = CFDataRef + + CoreFoundation.CFDataGetLength.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetLength.restype = CFIndex + + CoreFoundation.CFDataGetBytePtr.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetBytePtr.restype = c_void_p + + CoreFoundation.CFDictionaryCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + POINTER(CFTypeRef), + CFIndex, + CFDictionaryKeyCallBacks, + CFDictionaryValueCallBacks + ] + CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef + + CoreFoundation.CFDictionaryGetValue.argtypes = [ + CFDictionaryRef, + CFTypeRef + ] + CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef + + CoreFoundation.CFArrayCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreate.restype = CFArrayRef + + CoreFoundation.CFArrayCreateMutable.argtypes = [ + CFAllocatorRef, + CFIndex, + CFArrayCallBacks + ] + CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef + + CoreFoundation.CFArrayAppendValue.argtypes = [ + CFMutableArrayRef, + c_void_p + ] + CoreFoundation.CFArrayAppendValue.restype = None + + CoreFoundation.CFArrayGetCount.argtypes = [ + CFArrayRef + ] + CoreFoundation.CFArrayGetCount.restype = CFIndex + + CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ + CFArrayRef, + CFIndex + ] + CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p + + CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( + CoreFoundation, 'kCFAllocatorDefault' + ) + CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') + CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' + ) + CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryValueCallBacks' + ) + + CoreFoundation.CFTypeRef = CFTypeRef + CoreFoundation.CFArrayRef = CFArrayRef + CoreFoundation.CFStringRef = CFStringRef + CoreFoundation.CFDictionaryRef = CFDictionaryRef + +except (AttributeError): + raise ImportError('Error initializing ctypes') + + +class CFConst(object): + """ + A class object that acts as essentially a namespace for CoreFoundation + constants. + """ + kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) + + +class SecurityConst(object): + """ + A class object that acts as essentially a namespace for Security constants. + """ + kSSLSessionOptionBreakOnServerAuth = 0 + + kSSLProtocol2 = 1 + kSSLProtocol3 = 2 + kTLSProtocol1 = 4 + kTLSProtocol11 = 7 + kTLSProtocol12 = 8 + + kSSLClientSide = 1 + kSSLStreamType = 0 + + kSecFormatPEMSequence = 10 + + kSecTrustResultInvalid = 0 + kSecTrustResultProceed = 1 + # This gap is present on purpose: this was kSecTrustResultConfirm, which + # is deprecated. + kSecTrustResultDeny = 3 + kSecTrustResultUnspecified = 4 + kSecTrustResultRecoverableTrustFailure = 5 + kSecTrustResultFatalTrustFailure = 6 + kSecTrustResultOtherError = 7 + + errSSLProtocol = -9800 + errSSLWouldBlock = -9803 + errSSLClosedGraceful = -9805 + errSSLClosedNoNotify = -9816 + errSSLClosedAbort = -9806 + + errSSLXCertChainInvalid = -9807 + errSSLCrypto = -9809 + errSSLInternal = -9810 + errSSLCertExpired = -9814 + errSSLCertNotYetValid = -9815 + errSSLUnknownRootCert = -9812 + errSSLNoRootCert = -9813 + errSSLHostNameMismatch = -9843 + errSSLPeerHandshakeFail = -9824 + errSSLPeerUserCancelled = -9839 + errSSLWeakPeerEphemeralDHKey = -9850 + errSSLServerAuthCompleted = -9841 + errSSLRecordOverflow = -9847 + + errSecVerifyFailed = -67808 + errSecNoTrustSettings = -25263 + errSecItemNotFound = -25300 + errSecInvalidTrustSettings = -25262 + + # Cipher suites. We only pick the ones our default cipher string allows. + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F + TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 + TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F + TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B + TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A + TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 + TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 + TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D + TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C + TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D + TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C + TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 + TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F + TLS_AES_128_GCM_SHA256 = 0x1301 + TLS_AES_256_GCM_SHA384 = 0x1302 + TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/urllib3/contrib/_securetransport/low_level.py b/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 00000000..5e3494bc --- /dev/null +++ b/urllib3/contrib/_securetransport/low_level.py @@ -0,0 +1,343 @@ +""" +Low-level helpers for the SecureTransport bindings. + +These are Python functions that are not directly related to the high-level APIs +but are necessary to get them to work. They include a whole bunch of low-level +CoreFoundation messing about and memory management. The concerns in this module +are almost entirely about trying to avoid memory leaks and providing +appropriate and useful assistance to the higher-level code. +""" +import base64 +import ctypes +import itertools +import re +import os +import ssl +import tempfile + +from .bindings import Security, CoreFoundation, CFConst + + +# This regular expression is used to grab PEM data out of a PEM bundle. +_PEM_CERTS_RE = re.compile( + b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL +) + + +def _cf_data_from_bytes(bytestring): + """ + Given a bytestring, create a CFData object from it. This CFData object must + be CFReleased by the caller. + """ + return CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) + ) + + +def _cf_dictionary_from_tuples(tuples): + """ + Given a list of Python tuples, create an associated CFDictionary. + """ + dictionary_size = len(tuples) + + # We need to get the dictionary keys and values out in the same order. + keys = (t[0] for t in tuples) + values = (t[1] for t in tuples) + cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) + cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) + + return CoreFoundation.CFDictionaryCreate( + CoreFoundation.kCFAllocatorDefault, + cf_keys, + cf_values, + dictionary_size, + CoreFoundation.kCFTypeDictionaryKeyCallBacks, + CoreFoundation.kCFTypeDictionaryValueCallBacks, + ) + + +def _cf_string_to_unicode(value): + """ + Creates a Unicode string from a CFString object. Used entirely for error + reporting. + + Yes, it annoys me quite a lot that this function is this complex. + """ + value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) + + string = CoreFoundation.CFStringGetCStringPtr( + value_as_void_p, + CFConst.kCFStringEncodingUTF8 + ) + if string is None: + buffer = ctypes.create_string_buffer(1024) + result = CoreFoundation.CFStringGetCString( + value_as_void_p, + buffer, + 1024, + CFConst.kCFStringEncodingUTF8 + ) + if not result: + raise OSError('Error copying C string from CFStringRef') + string = buffer.value + if string is not None: + string = string.decode('utf-8') + return string + + +def _assert_no_error(error, exception_class=None): + """ + Checks the return code and throws an exception if there is an error to + report + """ + if error == 0: + return + + cf_error_string = Security.SecCopyErrorMessageString(error, None) + output = _cf_string_to_unicode(cf_error_string) + CoreFoundation.CFRelease(cf_error_string) + + if output is None or output == u'': + output = u'OSStatus %s' % error + + if exception_class is None: + exception_class = ssl.SSLError + + raise exception_class(output) + + +def _cert_array_from_pem(pem_bundle): + """ + Given a bundle of certs in PEM format, turns them into a CFArray of certs + that can be used to validate a cert chain. + """ + der_certs = [ + base64.b64decode(match.group(1)) + for match in _PEM_CERTS_RE.finditer(pem_bundle) + ] + if not der_certs: + raise ssl.SSLError("No root certificates specified") + + cert_array = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks) + ) + if not cert_array: + raise ssl.SSLError("Unable to allocate memory!") + + try: + for der_bytes in der_certs: + certdata = _cf_data_from_bytes(der_bytes) + if not certdata: + raise ssl.SSLError("Unable to allocate memory!") + cert = Security.SecCertificateCreateWithData( + CoreFoundation.kCFAllocatorDefault, certdata + ) + CoreFoundation.CFRelease(certdata) + if not cert: + raise ssl.SSLError("Unable to build cert object!") + + CoreFoundation.CFArrayAppendValue(cert_array, cert) + CoreFoundation.CFRelease(cert) + except Exception: + # We need to free the array before the exception bubbles further. + # We only want to do that if an error occurs: otherwise, the caller + # should free. + CoreFoundation.CFRelease(cert_array) + + return cert_array + + +def _is_cert(item): + """ + Returns True if a given CFTypeRef is a certificate. + """ + expected = Security.SecCertificateGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _is_identity(item): + """ + Returns True if a given CFTypeRef is an identity. + """ + expected = Security.SecIdentityGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _temporary_keychain(): + """ + This function creates a temporary Mac keychain that we can use to work with + credentials. This keychain uses a one-time password and a temporary file to + store the data. We expect to have one keychain per socket. The returned + SecKeychainRef must be freed by the caller, including calling + SecKeychainDelete. + + Returns a tuple of the SecKeychainRef and the path to the temporary + directory that contains it. + """ + # Unfortunately, SecKeychainCreate requires a path to a keychain. This + # means we cannot use mkstemp to use a generic temporary file. Instead, + # we're going to create a temporary directory and a filename to use there. + # This filename will be 8 random bytes expanded into base64. We also need + # some random bytes to password-protect the keychain we're creating, so we + # ask for 40 random bytes. + random_bytes = os.urandom(40) + filename = base64.b64encode(random_bytes[:8]).decode('utf-8') + password = base64.b64encode(random_bytes[8:]) # Must be valid UTF-8 + tempdirectory = tempfile.mkdtemp() + + keychain_path = os.path.join(tempdirectory, filename).encode('utf-8') + + # We now want to create the keychain itself. + keychain = Security.SecKeychainRef() + status = Security.SecKeychainCreate( + keychain_path, + len(password), + password, + False, + None, + ctypes.byref(keychain) + ) + _assert_no_error(status) + + # Having created the keychain, we want to pass it off to the caller. + return keychain, tempdirectory + + +def _load_items_from_file(keychain, path): + """ + Given a single file, loads all the trust objects from it into arrays and + the keychain. + Returns a tuple of lists: the first list is a list of identities, the + second a list of certs. + """ + certificates = [] + identities = [] + result_array = None + + with open(path, 'rb') as f: + raw_filedata = f.read() + + try: + filedata = CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, + raw_filedata, + len(raw_filedata) + ) + result_array = CoreFoundation.CFArrayRef() + result = Security.SecItemImport( + filedata, # cert data + None, # Filename, leaving it out for now + None, # What the type of the file is, we don't care + None, # what's in the file, we don't care + 0, # import flags + None, # key params, can include passphrase in the future + keychain, # The keychain to insert into + ctypes.byref(result_array) # Results + ) + _assert_no_error(result) + + # A CFArray is not very useful to us as an intermediary + # representation, so we are going to extract the objects we want + # and then free the array. We don't need to keep hold of keys: the + # keychain already has them! + result_count = CoreFoundation.CFArrayGetCount(result_array) + for index in range(result_count): + item = CoreFoundation.CFArrayGetValueAtIndex( + result_array, index + ) + item = ctypes.cast(item, CoreFoundation.CFTypeRef) + + if _is_cert(item): + CoreFoundation.CFRetain(item) + certificates.append(item) + elif _is_identity(item): + CoreFoundation.CFRetain(item) + identities.append(item) + finally: + if result_array: + CoreFoundation.CFRelease(result_array) + + CoreFoundation.CFRelease(filedata) + + return (identities, certificates) + + +def _load_client_cert_chain(keychain, *paths): + """ + Load certificates and maybe keys from a number of files. Has the end goal + of returning a CFArray containing one SecIdentityRef, and then zero or more + SecCertificateRef objects, suitable for use as a client certificate trust + chain. + """ + # Ok, the strategy. + # + # This relies on knowing that macOS will not give you a SecIdentityRef + # unless you have imported a key into a keychain. This is a somewhat + # artificial limitation of macOS (for example, it doesn't necessarily + # affect iOS), but there is nothing inside Security.framework that lets you + # get a SecIdentityRef without having a key in a keychain. + # + # So the policy here is we take all the files and iterate them in order. + # Each one will use SecItemImport to have one or more objects loaded from + # it. We will also point at a keychain that macOS can use to work with the + # private key. + # + # Once we have all the objects, we'll check what we actually have. If we + # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, + # we'll take the first certificate (which we assume to be our leaf) and + # ask the keychain to give us a SecIdentityRef with that cert's associated + # key. + # + # We'll then return a CFArray containing the trust chain: one + # SecIdentityRef and then zero-or-more SecCertificateRef objects. The + # responsibility for freeing this CFArray will be with the caller. This + # CFArray must remain alive for the entire connection, so in practice it + # will be stored with a single SSLSocket, along with the reference to the + # keychain. + certificates = [] + identities = [] + + # Filter out bad paths. + paths = (path for path in paths if path) + + try: + for file_path in paths: + new_identities, new_certs = _load_items_from_file( + keychain, file_path + ) + identities.extend(new_identities) + certificates.extend(new_certs) + + # Ok, we have everything. The question is: do we have an identity? If + # not, we want to grab one from the first cert we have. + if not identities: + new_identity = Security.SecIdentityRef() + status = Security.SecIdentityCreateWithCertificate( + keychain, + certificates[0], + ctypes.byref(new_identity) + ) + _assert_no_error(status) + identities.append(new_identity) + + # We now want to release the original certificate, as we no longer + # need it. + CoreFoundation.CFRelease(certificates.pop(0)) + + # We now need to build a new CFArray that holds the trust chain. + trust_chain = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + for item in itertools.chain(identities, certificates): + # ArrayAppendValue does a CFRetain on the item. That's fine, + # because the finally block will release our other refs to them. + CoreFoundation.CFArrayAppendValue(trust_chain, item) + + return trust_chain + finally: + for obj in itertools.chain(identities, certificates): + CoreFoundation.CFRelease(obj) diff --git a/urllib3/contrib/appengine.py b/urllib3/contrib/appengine.py new file mode 100644 index 00000000..814b0222 --- /dev/null +++ b/urllib3/contrib/appengine.py @@ -0,0 +1,296 @@ +""" +This module provides a pool manager that uses Google App Engine's +`URLFetch Service `_. + +Example usage:: + + from urllib3 import PoolManager + from urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox + + if is_appengine_sandbox(): + # AppEngineManager uses AppEngine's URLFetch API behind the scenes + http = AppEngineManager() + else: + # PoolManager uses a socket-level API behind the scenes + http = PoolManager() + + r = http.request('GET', 'https://google.com/') + +There are `limitations `_ to the URLFetch service and it may not be +the best choice for your application. There are three options for using +urllib3 on Google App Engine: + +1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is + cost-effective in many circumstances as long as your usage is within the + limitations. +2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. + Sockets also have `limitations and restrictions + `_ and have a lower free quota than URLFetch. + To use sockets, be sure to specify the following in your ``app.yaml``:: + + env_variables: + GAE_USE_SOCKETS_HTTPLIB : 'true' + +3. If you are using `App Engine Flexible +`_, you can use the standard +:class:`PoolManager` without any configuration or special environment variables. +""" + +from __future__ import absolute_import +import logging +import os +import warnings +from ..packages.six.moves.urllib.parse import urljoin + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + TimeoutError, + SSLError +) + +from ..packages.six import BytesIO +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.timeout import Timeout +from ..util.retry import Retry + +try: + from google.appengine.api import urlfetch +except ImportError: + urlfetch = None + + +log = logging.getLogger(__name__) + + +class AppEnginePlatformWarning(HTTPWarning): + pass + + +class AppEnginePlatformError(HTTPError): + pass + + +class AppEngineManager(RequestMethods): + """ + Connection manager for Google App Engine sandbox applications. + + This manager uses the URLFetch service directly instead of using the + emulated httplib, and is subject to URLFetch limitations as described in + the App Engine documentation `here + `_. + + Notably it will raise an :class:`AppEnginePlatformError` if: + * URLFetch is not available. + * If you attempt to use this on App Engine Flexible, as full socket + support is available. + * If a request size is more than 10 megabytes. + * If a response size is more than 32 megabtyes. + * If you use an unsupported request method such as OPTIONS. + + Beyond those cases, it will raise normal urllib3 errors. + """ + + def __init__(self, headers=None, retries=None, validate_certificate=True, + urlfetch_retries=True): + if not urlfetch: + raise AppEnginePlatformError( + "URLFetch is not available in this environment.") + + if is_prod_appengine_mvms(): + raise AppEnginePlatformError( + "Use normal urllib3.PoolManager instead of AppEngineManager" + "on Managed VMs, as using URLFetch is not necessary in " + "this environment.") + + warnings.warn( + "urllib3 is using URLFetch on Google App Engine sandbox instead " + "of sockets. To use sockets directly instead of URLFetch see " + "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", + AppEnginePlatformWarning) + + RequestMethods.__init__(self, headers) + self.validate_certificate = validate_certificate + self.urlfetch_retries = urlfetch_retries + + self.retries = retries or Retry.DEFAULT + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # Return False to re-raise any potential exceptions + return False + + def urlopen(self, method, url, body=None, headers=None, + retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, + **response_kw): + + retries = self._get_retries(retries, redirect) + + try: + follow_redirects = ( + redirect and + retries.redirect != 0 and + retries.total) + response = urlfetch.fetch( + url, + payload=body, + method=method, + headers=headers or {}, + allow_truncated=False, + follow_redirects=self.urlfetch_retries and follow_redirects, + deadline=self._get_absolute_timeout(timeout), + validate_certificate=self.validate_certificate, + ) + except urlfetch.DeadlineExceededError as e: + raise TimeoutError(self, e) + + except urlfetch.InvalidURLError as e: + if 'too large' in str(e): + raise AppEnginePlatformError( + "URLFetch request too large, URLFetch only " + "supports requests up to 10mb in size.", e) + raise ProtocolError(e) + + except urlfetch.DownloadError as e: + if 'Too many redirects' in str(e): + raise MaxRetryError(self, url, reason=e) + raise ProtocolError(e) + + except urlfetch.ResponseTooLargeError as e: + raise AppEnginePlatformError( + "URLFetch response too large, URLFetch only supports" + "responses up to 32mb in size.", e) + + except urlfetch.SSLCertificateError as e: + raise SSLError(e) + + except urlfetch.InvalidMethodError as e: + raise AppEnginePlatformError( + "URLFetch does not support method: %s" % method, e) + + http_response = self._urlfetch_response_to_http_response( + response, retries=retries, **response_kw) + + # Handle redirect? + redirect_location = redirect and http_response.get_redirect_location() + if redirect_location: + # Check for redirect response + if (self.urlfetch_retries and retries.raise_on_redirect): + raise MaxRetryError(self, url, "too many redirects") + else: + if http_response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=http_response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + raise MaxRetryError(self, url, "too many redirects") + return http_response + + retries.sleep_for_retry(http_response) + log.debug("Redirecting %s -> %s", url, redirect_location) + redirect_url = urljoin(url, redirect_location) + return self.urlopen( + method, redirect_url, body, headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(http_response.getheader('Retry-After')) + if retries.is_retry(method, http_response.status, has_retry_after): + retries = retries.increment( + method, url, response=http_response, _pool=self) + log.debug("Retry: %s", url) + retries.sleep(http_response) + return self.urlopen( + method, url, + body=body, headers=headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + return http_response + + def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): + + if is_prod_appengine(): + # Production GAE handles deflate encoding automatically, but does + # not remove the encoding header. + content_encoding = urlfetch_resp.headers.get('content-encoding') + + if content_encoding == 'deflate': + del urlfetch_resp.headers['content-encoding'] + + transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') + # We have a full response's content, + # so let's make sure we don't report ourselves as chunked data. + if transfer_encoding == 'chunked': + encodings = transfer_encoding.split(",") + encodings.remove('chunked') + urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) + + return HTTPResponse( + # In order for decoding to work, we must present the content as + # a file-like object. + body=BytesIO(urlfetch_resp.content), + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + def _get_absolute_timeout(self, timeout): + if timeout is Timeout.DEFAULT_TIMEOUT: + return None # Defer to URLFetch's default. + if isinstance(timeout, Timeout): + if timeout._read is not None or timeout._connect is not None: + warnings.warn( + "URLFetch does not support granular timeout settings, " + "reverting to total or default URLFetch timeout.", + AppEnginePlatformWarning) + return timeout.total + return timeout + + def _get_retries(self, retries, redirect): + if not isinstance(retries, Retry): + retries = Retry.from_int( + retries, redirect=redirect, default=self.retries) + + if retries.connect or retries.read or retries.redirect: + warnings.warn( + "URLFetch only supports total retries and does not " + "recognize connect, read, or redirect retry parameters.", + AppEnginePlatformWarning) + + return retries + + +def is_appengine(): + return (is_local_appengine() or + is_prod_appengine() or + is_prod_appengine_mvms()) + + +def is_appengine_sandbox(): + return is_appengine() and not is_prod_appengine_mvms() + + +def is_local_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Development/' in os.environ['SERVER_SOFTWARE']) + + +def is_prod_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and + not is_prod_appengine_mvms()) + + +def is_prod_appengine_mvms(): + return os.environ.get('GAE_VM', False) == 'true' diff --git a/urllib3/contrib/ntlmpool.py b/urllib3/contrib/ntlmpool.py new file mode 100644 index 00000000..642e99ed --- /dev/null +++ b/urllib3/contrib/ntlmpool.py @@ -0,0 +1,112 @@ +""" +NTLM authenticating pool, contributed by erikcederstran + +Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 +""" +from __future__ import absolute_import + +from logging import getLogger +from ntlm import ntlm + +from .. import HTTPSConnectionPool +from ..packages.six.moves.http_client import HTTPSConnection + + +log = getLogger(__name__) + + +class NTLMConnectionPool(HTTPSConnectionPool): + """ + Implements an NTLM authentication version of an urllib3 connection pool + """ + + scheme = 'https' + + def __init__(self, user, pw, authurl, *args, **kwargs): + """ + authurl is a random URL on the server that is protected by NTLM. + user is the Windows user, probably in the DOMAIN\\username format. + pw is the password for the user. + """ + super(NTLMConnectionPool, self).__init__(*args, **kwargs) + self.authurl = authurl + self.rawuser = user + user_parts = user.split('\\', 1) + self.domain = user_parts[0].upper() + self.user = user_parts[1] + self.pw = pw + + def _new_conn(self): + # Performs the NTLM handshake that secures the connection. The socket + # must be kept open while requests are performed. + self.num_connections += 1 + log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', + self.num_connections, self.host, self.authurl) + + headers = {} + headers['Connection'] = 'Keep-Alive' + req_header = 'Authorization' + resp_header = 'www-authenticate' + + conn = HTTPSConnection(host=self.host, port=self.port) + + # Send negotiation message + headers[req_header] = ( + 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + reshdr = dict(res.getheaders()) + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', reshdr) + log.debug('Response data: %s [...]', res.read(100)) + + # Remove the reference to the socket, so that it can not be closed by + # the response object (we want to keep the socket open) + res.fp = None + + # Server should respond with a challenge message + auth_header_values = reshdr[resp_header].split(', ') + auth_header_value = None + for s in auth_header_values: + if s[:5] == 'NTLM ': + auth_header_value = s[5:] + if auth_header_value is None: + raise Exception('Unexpected %s response header: %s' % + (resp_header, reshdr[resp_header])) + + # Send authentication message + ServerChallenge, NegotiateFlags = \ + ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) + auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, + self.user, + self.domain, + self.pw, + NegotiateFlags) + headers[req_header] = 'NTLM %s' % auth_msg + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', dict(res.getheaders())) + log.debug('Response data: %s [...]', res.read()[:100]) + if res.status != 200: + if res.status == 401: + raise Exception('Server rejected request: wrong ' + 'username or password') + raise Exception('Wrong server response: %s %s' % + (res.status, res.reason)) + + res.fp = None + log.debug('Connection established') + return conn + + def urlopen(self, method, url, body=None, headers=None, retries=3, + redirect=True, assert_same_host=True): + if headers is None: + headers = {} + headers['Connection'] = 'Keep-Alive' + return super(NTLMConnectionPool, self).urlopen(method, url, body, + headers, retries, + redirect, + assert_same_host) diff --git a/urllib3/contrib/pyopenssl.py b/urllib3/contrib/pyopenssl.py new file mode 100644 index 00000000..f63b8401 --- /dev/null +++ b/urllib3/contrib/pyopenssl.py @@ -0,0 +1,455 @@ +""" +SSL with SNI_-support for Python 2. Follow these instructions if you would +like to verify SSL certificates in Python 2. Note, the default libraries do +*not* do certificate checking; you need to do additional work to validate +certificates yourself. + +This needs the following packages installed: + +* pyOpenSSL (tested with 16.0.0) +* cryptography (minimum 1.3.4, from pyopenssl) +* idna (minimum 2.0, from cryptography) + +However, pyopenssl depends on cryptography, which depends on idna, so while we +use all three directly here we end up having relatively few packages required. + +You can install them with the following command: + + pip install pyopenssl cryptography idna + +To activate certificate checking, call +:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code +before you begin making HTTP requests. This can be done in a ``sitecustomize`` +module, or at any other time before your application begins using ``urllib3``, +like this:: + + try: + import urllib3.contrib.pyopenssl + urllib3.contrib.pyopenssl.inject_into_urllib3() + except ImportError: + pass + +Now you can use :mod:`urllib3` as you normally would, and it will support SNI +when the required modules are installed. + +Activating this module also has the positive side effect of disabling SSL/TLS +compression in Python 2 (see `CRIME attack`_). + +If you want to configure the default list of supported cipher suites, you can +set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. + +.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication +.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) +""" +from __future__ import absolute_import + +import OpenSSL.SSL +from cryptography import x509 +from cryptography.hazmat.backends.openssl import backend as openssl_backend +from cryptography.hazmat.backends.openssl.x509 import _Certificate + +from socket import timeout, error as SocketError +from io import BytesIO + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +import logging +import ssl +from ..packages import six +import sys + +from .. import util + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works. +HAS_SNI = True + +# Map from urllib3 to PyOpenSSL compatible parameter-values. +_openssl_versions = { + ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, + ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, +} + +if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD + +if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD + +try: + _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) +except AttributeError: + pass + +_stdlib_to_openssl_verify = { + ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, + ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, + ssl.CERT_REQUIRED: + OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, +} +_openssl_to_stdlib_verify = dict( + (v, k) for k, v in _stdlib_to_openssl_verify.items() +) + +# OpenSSL will only write 16K at a time +SSL_WRITE_BLOCKSIZE = 16384 + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + + +log = logging.getLogger(__name__) + + +def inject_into_urllib3(): + 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' + + _validate_dependencies_met() + + util.ssl_.SSLContext = PyOpenSSLContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_PYOPENSSL = True + util.ssl_.IS_PYOPENSSL = True + + +def extract_from_urllib3(): + 'Undo monkey-patching by :func:`inject_into_urllib3`.' + + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_PYOPENSSL = False + util.ssl_.IS_PYOPENSSL = False + + +def _validate_dependencies_met(): + """ + Verifies that PyOpenSSL's package-level dependencies have been met. + Throws `ImportError` if they are not met. + """ + # Method added in `cryptography==1.1`; not available in older versions + from cryptography.x509.extensions import Extensions + if getattr(Extensions, "get_extension_for_class", None) is None: + raise ImportError("'cryptography' module missing required functionality. " + "Try upgrading to v1.3.4 or newer.") + + # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 + # attribute is only present on those versions. + from OpenSSL.crypto import X509 + x509 = X509() + if getattr(x509, "_x509", None) is None: + raise ImportError("'pyOpenSSL' module missing required functionality. " + "Try upgrading to v0.14 or newer.") + + +def _dnsname_to_stdlib(name): + """ + Converts a dNSName SubjectAlternativeName field to the form used by the + standard library on the given Python version. + + Cryptography produces a dNSName as a unicode string that was idna-decoded + from ASCII bytes. We need to idna-encode that string to get it back, and + then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib + uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). + """ + def idna_encode(name): + """ + Borrowed wholesale from the Python Cryptography Project. It turns out + that we can't just safely call `idna.encode`: it can explode for + wildcard names. This avoids that problem. + """ + import idna + + for prefix in [u'*.', u'.']: + if name.startswith(prefix): + name = name[len(prefix):] + return prefix.encode('ascii') + idna.encode(name) + return idna.encode(name) + + name = idna_encode(name) + if sys.version_info >= (3, 0): + name = name.decode('utf-8') + return name + + +def get_subj_alt_name(peer_cert): + """ + Given an PyOpenSSL certificate, provides all the subject alternative names. + """ + # Pass the cert to cryptography, which has much better APIs for this. + if hasattr(peer_cert, "to_cryptography"): + cert = peer_cert.to_cryptography() + else: + # This is technically using private APIs, but should work across all + # relevant versions before PyOpenSSL got a proper API for this. + cert = _Certificate(openssl_backend, peer_cert._x509) + + # We want to find the SAN extension. Ask Cryptography to locate it (it's + # faster than looping in Python) + try: + ext = cert.extensions.get_extension_for_class( + x509.SubjectAlternativeName + ).value + except x509.ExtensionNotFound: + # No such extension, return the empty list. + return [] + except (x509.DuplicateExtension, x509.UnsupportedExtension, + x509.UnsupportedGeneralNameType, UnicodeError) as e: + # A problem has been found with the quality of the certificate. Assume + # no SAN field is present. + log.warning( + "A problem was encountered with the certificate that prevented " + "urllib3 from finding the SubjectAlternativeName field. This can " + "affect certificate validation. The error was %s", + e, + ) + return [] + + # We want to return dNSName and iPAddress fields. We need to cast the IPs + # back to strings because the match_hostname function wants them as + # strings. + # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 + # decoded. This is pretty frustrating, but that's what the standard library + # does with certificates, and so we need to attempt to do the same. + names = [ + ('DNS', _dnsname_to_stdlib(name)) + for name in ext.get_values_for_type(x509.DNSName) + ] + names.extend( + ('IP Address', str(name)) + for name in ext.get_values_for_type(x509.IPAddress) + ) + + return names + + +class WrappedSocket(object): + '''API-compatibility wrapper for Python OpenSSL's Connection-class. + + Note: _makefile_refs, _drop() and _reuse() are needed for the garbage + collector of pypy. + ''' + + def __init__(self, connection, socket, suppress_ragged_eofs=True): + self.connection = connection + self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._makefile_refs = 0 + self._closed = False + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, *args, **kwargs): + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return b'' + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return b'' + else: + raise + except OpenSSL.SSL.WantReadError: + rd = util.wait_for_read(self.socket, self.socket.gettimeout()) + if not rd: + raise timeout('The read operation timed out') + else: + return self.recv(*args, **kwargs) + else: + return data + + def recv_into(self, *args, **kwargs): + try: + return self.connection.recv_into(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return 0 + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return 0 + else: + raise + except OpenSSL.SSL.WantReadError: + rd = util.wait_for_read(self.socket, self.socket.gettimeout()) + if not rd: + raise timeout('The read operation timed out') + else: + return self.recv_into(*args, **kwargs) + + def settimeout(self, timeout): + return self.socket.settimeout(timeout) + + def _send_until_done(self, data): + while True: + try: + return self.connection.send(data) + except OpenSSL.SSL.WantWriteError: + wr = util.wait_for_write(self.socket, self.socket.gettimeout()) + if not wr: + raise timeout() + continue + except OpenSSL.SSL.SysCallError as e: + raise SocketError(str(e)) + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + # FIXME rethrow compatible exceptions should we ever use this + self.connection.shutdown() + + def close(self): + if self._makefile_refs < 1: + try: + self._closed = True + return self.connection.close() + except OpenSSL.SSL.Error: + return + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + x509 = self.connection.get_peer_certificate() + + if not x509: + return x509 + + if binary_form: + return OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_ASN1, + x509) + + return { + 'subject': ( + (('commonName', x509.get_subject().CN),), + ), + 'subjectAltName': get_subj_alt_name(x509) + } + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + makefile = backport_makefile + +WrappedSocket.makefile = makefile + + +class PyOpenSSLContext(object): + """ + I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible + for translating the interface of the standard library ``SSLContext`` object + to calls into PyOpenSSL. + """ + def __init__(self, protocol): + self.protocol = _openssl_versions[protocol] + self._ctx = OpenSSL.SSL.Context(self.protocol) + self._options = 0 + self.check_hostname = False + + @property + def options(self): + return self._options + + @options.setter + def options(self, value): + self._options = value + self._ctx.set_options(value) + + @property + def verify_mode(self): + return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] + + @verify_mode.setter + def verify_mode(self, value): + self._ctx.set_verify( + _stdlib_to_openssl_verify[value], + _verify_callback + ) + + def set_default_verify_paths(self): + self._ctx.set_default_verify_paths() + + def set_ciphers(self, ciphers): + if isinstance(ciphers, six.text_type): + ciphers = ciphers.encode('utf-8') + self._ctx.set_cipher_list(ciphers) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + if cafile is not None: + cafile = cafile.encode('utf-8') + if capath is not None: + capath = capath.encode('utf-8') + self._ctx.load_verify_locations(cafile, capath) + if cadata is not None: + self._ctx.load_verify_locations(BytesIO(cadata)) + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._ctx.use_certificate_file(certfile) + if password is not None: + self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) + self._ctx.use_privatekey_file(keyfile or certfile) + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + cnx = OpenSSL.SSL.Connection(self._ctx, sock) + + if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 + server_hostname = server_hostname.encode('utf-8') + + if server_hostname is not None: + cnx.set_tlsext_host_name(server_hostname) + + cnx.set_connect_state() + + while True: + try: + cnx.do_handshake() + except OpenSSL.SSL.WantReadError: + rd = util.wait_for_read(sock, sock.gettimeout()) + if not rd: + raise timeout('select timed out') + continue + except OpenSSL.SSL.Error as e: + raise ssl.SSLError('bad handshake: %r' % e) + break + + return WrappedSocket(cnx, sock) + + +def _verify_callback(cnx, x509, err_no, err_depth, return_code): + return err_no == 0 diff --git a/urllib3/contrib/securetransport.py b/urllib3/contrib/securetransport.py new file mode 100644 index 00000000..2cac70f7 --- /dev/null +++ b/urllib3/contrib/securetransport.py @@ -0,0 +1,810 @@ +""" +SecureTranport support for urllib3 via ctypes. + +This makes platform-native TLS available to urllib3 users on macOS without the +use of a compiler. This is an important feature because the Python Package +Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL +that ships with macOS is not capable of doing TLSv1.2. The only way to resolve +this is to give macOS users an alternative solution to the problem, and that +solution is to use SecureTransport. + +We use ctypes here because this solution must not require a compiler. That's +because pip is not allowed to require a compiler either. + +This is not intended to be a seriously long-term solution to this problem. +The hope is that PEP 543 will eventually solve this issue for us, at which +point we can retire this contrib module. But in the short term, we need to +solve the impending tire fire that is Python on Mac without this kind of +contrib module. So...here we are. + +To use this module, simply import and inject it:: + + import urllib3.contrib.securetransport + urllib3.contrib.securetransport.inject_into_urllib3() + +Happy TLSing! +""" +from __future__ import absolute_import + +import contextlib +import ctypes +import errno +import os.path +import shutil +import socket +import ssl +import threading +import weakref + +from .. import util +from ._securetransport.bindings import ( + Security, SecurityConst, CoreFoundation +) +from ._securetransport.low_level import ( + _assert_no_error, _cert_array_from_pem, _temporary_keychain, + _load_client_cert_chain +) + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +try: + memoryview(b'') +except NameError: + raise ImportError("SecureTransport only works on Pythons with memoryview") + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works +HAS_SNI = True + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + +# This dictionary is used by the read callback to obtain a handle to the +# calling wrapped socket. This is a pretty silly approach, but for now it'll +# do. I feel like I should be able to smuggle a handle to the wrapped socket +# directly in the SSLConnectionRef, but for now this approach will work I +# guess. +# +# We need to lock around this structure for inserts, but we don't do it for +# reads/writes in the callbacks. The reasoning here goes as follows: +# +# 1. It is not possible to call into the callbacks before the dictionary is +# populated, so once in the callback the id must be in the dictionary. +# 2. The callbacks don't mutate the dictionary, they only read from it, and +# so cannot conflict with any of the insertions. +# +# This is good: if we had to lock in the callbacks we'd drastically slow down +# the performance of this code. +_connection_refs = weakref.WeakValueDictionary() +_connection_ref_lock = threading.Lock() + +# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over +# for no better reason than we need *a* limit, and this one is right there. +SSL_WRITE_BLOCKSIZE = 16384 + +# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to +# individual cipher suites. We need to do this becuase this is how +# SecureTransport wants them. +CIPHER_SUITES = [ + SecurityConst.TLS_AES_256_GCM_SHA384, + SecurityConst.TLS_CHACHA20_POLY1305_SHA256, + SecurityConst.TLS_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, +] + +# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of +# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. +_protocol_to_min_max = { + ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), +} + +if hasattr(ssl, "PROTOCOL_SSLv2"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( + SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2 + ) +if hasattr(ssl, "PROTOCOL_SSLv3"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( + SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3 + ) +if hasattr(ssl, "PROTOCOL_TLSv1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( + SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( + SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_2"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( + SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12 + ) +if hasattr(ssl, "PROTOCOL_TLS"): + _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23] + + +def inject_into_urllib3(): + """ + Monkey-patch urllib3 with SecureTransport-backed SSL-support. + """ + util.ssl_.SSLContext = SecureTransportContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_SECURETRANSPORT = True + util.ssl_.IS_SECURETRANSPORT = True + + +def extract_from_urllib3(): + """ + Undo monkey-patching by :func:`inject_into_urllib3`. + """ + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_SECURETRANSPORT = False + util.ssl_.IS_SECURETRANSPORT = False + + +def _read_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport read callback. This is called by ST to request that data + be returned from the socket. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + requested_length = data_length_pointer[0] + + timeout = wrapped_socket.gettimeout() + error = None + read_count = 0 + buffer = (ctypes.c_char * requested_length).from_address(data_buffer) + buffer_view = memoryview(buffer) + + try: + while read_count < requested_length: + if timeout is None or timeout >= 0: + readables = util.wait_for_read([base_socket], timeout) + if not readables: + raise socket.error(errno.EAGAIN, 'timed out') + + # We need to tell ctypes that we have a buffer that can be + # written to. Upsettingly, we do that like this: + chunk_size = base_socket.recv_into( + buffer_view[read_count:requested_length] + ) + read_count += chunk_size + if not chunk_size: + if not read_count: + return SecurityConst.errSSLClosedGraceful + break + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + if error == errno.ECONNRESET: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = read_count + + if read_count != requested_length: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +def _write_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport write callback. This is called by ST to request that data + actually be sent on the network. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + bytes_to_write = data_length_pointer[0] + data = ctypes.string_at(data_buffer, bytes_to_write) + + timeout = wrapped_socket.gettimeout() + error = None + sent = 0 + + try: + while sent < bytes_to_write: + if timeout is None or timeout >= 0: + writables = util.wait_for_write([base_socket], timeout) + if not writables: + raise socket.error(errno.EAGAIN, 'timed out') + chunk_sent = base_socket.send(data) + sent += chunk_sent + + # This has some needless copying here, but I'm not sure there's + # much value in optimising this data path. + data = data[chunk_sent:] + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + if error == errno.ECONNRESET: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = sent + if sent != bytes_to_write: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +# We need to keep these two objects references alive: if they get GC'd while +# in use then SecureTransport could attempt to call a function that is in freed +# memory. That would be...uh...bad. Yeah, that's the word. Bad. +_read_callback_pointer = Security.SSLReadFunc(_read_callback) +_write_callback_pointer = Security.SSLWriteFunc(_write_callback) + + +class WrappedSocket(object): + """ + API-compatibility wrapper for Python's OpenSSL wrapped socket object. + + Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage + collector of PyPy. + """ + def __init__(self, socket): + self.socket = socket + self.context = None + self._makefile_refs = 0 + self._closed = False + self._exception = None + self._keychain = None + self._keychain_dir = None + self._client_cert_chain = None + + # We save off the previously-configured timeout and then set it to + # zero. This is done because we use select and friends to handle the + # timeouts, but if we leave the timeout set on the lower socket then + # Python will "kindly" call select on that socket again for us. Avoid + # that by forcing the timeout to zero. + self._timeout = self.socket.gettimeout() + self.socket.settimeout(0) + + @contextlib.contextmanager + def _raise_on_error(self): + """ + A context manager that can be used to wrap calls that do I/O from + SecureTransport. If any of the I/O callbacks hit an exception, this + context manager will correctly propagate the exception after the fact. + This avoids silently swallowing those exceptions. + + It also correctly forces the socket closed. + """ + self._exception = None + + # We explicitly don't catch around this yield because in the unlikely + # event that an exception was hit in the block we don't want to swallow + # it. + yield + if self._exception is not None: + exception, self._exception = self._exception, None + self.close() + raise exception + + def _set_ciphers(self): + """ + Sets up the allowed ciphers. By default this matches the set in + util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done + custom and doesn't allow changing at this time, mostly because parsing + OpenSSL cipher strings is going to be a freaking nightmare. + """ + ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) + result = Security.SSLSetEnabledCiphers( + self.context, ciphers, len(CIPHER_SUITES) + ) + _assert_no_error(result) + + def _custom_validate(self, verify, trust_bundle): + """ + Called when we have set custom validation. We do this in two cases: + first, when cert validation is entirely disabled; and second, when + using a custom trust DB. + """ + # If we disabled cert validation, just say: cool. + if not verify: + return + + # We want data in memory, so load it up. + if os.path.isfile(trust_bundle): + with open(trust_bundle, 'rb') as f: + trust_bundle = f.read() + + cert_array = None + trust = Security.SecTrustRef() + + try: + # Get a CFArray that contains the certs we want. + cert_array = _cert_array_from_pem(trust_bundle) + + # Ok, now the hard part. We want to get the SecTrustRef that ST has + # created for this connection, shove our CAs into it, tell ST to + # ignore everything else it knows, and then ask if it can build a + # chain. This is a buuuunch of code. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + raise ssl.SSLError("Failed to copy trust reference") + + result = Security.SecTrustSetAnchorCertificates(trust, cert_array) + _assert_no_error(result) + + result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) + _assert_no_error(result) + + trust_result = Security.SecTrustResultType() + result = Security.SecTrustEvaluate( + trust, ctypes.byref(trust_result) + ) + _assert_no_error(result) + finally: + if trust: + CoreFoundation.CFRelease(trust) + + if cert_array is None: + CoreFoundation.CFRelease(cert_array) + + # Ok, now we can look at what the result was. + successes = ( + SecurityConst.kSecTrustResultUnspecified, + SecurityConst.kSecTrustResultProceed + ) + if trust_result.value not in successes: + raise ssl.SSLError( + "certificate verify failed, error code: %d" % + trust_result.value + ) + + def handshake(self, + server_hostname, + verify, + trust_bundle, + min_version, + max_version, + client_cert, + client_key, + client_key_passphrase): + """ + Actually performs the TLS handshake. This is run automatically by + wrapped socket, and shouldn't be needed in user code. + """ + # First, we do the initial bits of connection setup. We need to create + # a context, set its I/O funcs, and set the connection reference. + self.context = Security.SSLCreateContext( + None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType + ) + result = Security.SSLSetIOFuncs( + self.context, _read_callback_pointer, _write_callback_pointer + ) + _assert_no_error(result) + + # Here we need to compute the handle to use. We do this by taking the + # id of self modulo 2**31 - 1. If this is already in the dictionary, we + # just keep incrementing by one until we find a free space. + with _connection_ref_lock: + handle = id(self) % 2147483647 + while handle in _connection_refs: + handle = (handle + 1) % 2147483647 + _connection_refs[handle] = self + + result = Security.SSLSetConnection(self.context, handle) + _assert_no_error(result) + + # If we have a server hostname, we should set that too. + if server_hostname: + if not isinstance(server_hostname, bytes): + server_hostname = server_hostname.encode('utf-8') + + result = Security.SSLSetPeerDomainName( + self.context, server_hostname, len(server_hostname) + ) + _assert_no_error(result) + + # Setup the ciphers. + self._set_ciphers() + + # Set the minimum and maximum TLS versions. + result = Security.SSLSetProtocolVersionMin(self.context, min_version) + _assert_no_error(result) + result = Security.SSLSetProtocolVersionMax(self.context, max_version) + _assert_no_error(result) + + # If there's a trust DB, we need to use it. We do that by telling + # SecureTransport to break on server auth. We also do that if we don't + # want to validate the certs at all: we just won't actually do any + # authing in that case. + if not verify or trust_bundle is not None: + result = Security.SSLSetSessionOption( + self.context, + SecurityConst.kSSLSessionOptionBreakOnServerAuth, + True + ) + _assert_no_error(result) + + # If there's a client cert, we need to use it. + if client_cert: + self._keychain, self._keychain_dir = _temporary_keychain() + self._client_cert_chain = _load_client_cert_chain( + self._keychain, client_cert, client_key + ) + result = Security.SSLSetCertificate( + self.context, self._client_cert_chain + ) + _assert_no_error(result) + + while True: + with self._raise_on_error(): + result = Security.SSLHandshake(self.context) + + if result == SecurityConst.errSSLWouldBlock: + raise socket.timeout("handshake timed out") + elif result == SecurityConst.errSSLServerAuthCompleted: + self._custom_validate(verify, trust_bundle) + continue + else: + _assert_no_error(result) + break + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, bufsiz): + buffer = ctypes.create_string_buffer(bufsiz) + bytes_read = self.recv_into(buffer, bufsiz) + data = buffer[:bytes_read] + return data + + def recv_into(self, buffer, nbytes=None): + # Read short on EOF. + if self._closed: + return 0 + + if nbytes is None: + nbytes = len(buffer) + + buffer = (ctypes.c_char * nbytes).from_buffer(buffer) + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLRead( + self.context, buffer, nbytes, ctypes.byref(processed_bytes) + ) + + # There are some result codes that we want to treat as "not always + # errors". Specifically, those are errSSLWouldBlock, + # errSSLClosedGraceful, and errSSLClosedNoNotify. + if (result == SecurityConst.errSSLWouldBlock): + # If we didn't process any bytes, then this was just a time out. + # However, we can get errSSLWouldBlock in situations when we *did* + # read some data, and in those cases we should just read "short" + # and return. + if processed_bytes.value == 0: + # Timed out, no data read. + raise socket.timeout("recv timed out") + elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify): + # The remote peer has closed this connection. We should do so as + # well. Note that we don't actually return here because in + # principle this could actually be fired along with return data. + # It's unlikely though. + self.close() + else: + _assert_no_error(result) + + # Ok, we read and probably succeeded. We should return whatever data + # was actually read. + return processed_bytes.value + + def settimeout(self, timeout): + self._timeout = timeout + + def gettimeout(self): + return self._timeout + + def send(self, data): + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLWrite( + self.context, data, len(data), ctypes.byref(processed_bytes) + ) + + if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: + # Timed out + raise socket.timeout("send timed out") + else: + _assert_no_error(result) + + # We sent, and probably succeeded. Tell them how much we sent. + return processed_bytes.value + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + with self._raise_on_error(): + Security.SSLClose(self.context) + + def close(self): + # TODO: should I do clean shutdown here? Do I have to? + if self._makefile_refs < 1: + self._closed = True + if self.context: + CoreFoundation.CFRelease(self.context) + self.context = None + if self._client_cert_chain: + CoreFoundation.CFRelease(self._client_cert_chain) + self._client_cert_chain = None + if self._keychain: + Security.SecKeychainDelete(self._keychain) + CoreFoundation.CFRelease(self._keychain) + shutil.rmtree(self._keychain_dir) + self._keychain = self._keychain_dir = None + return self.socket.close() + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + # Urgh, annoying. + # + # Here's how we do this: + # + # 1. Call SSLCopyPeerTrust to get hold of the trust object for this + # connection. + # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. + # 3. To get the CN, call SecCertificateCopyCommonName and process that + # string so that it's of the appropriate type. + # 4. To get the SAN, we need to do something a bit more complex: + # a. Call SecCertificateCopyValues to get the data, requesting + # kSecOIDSubjectAltName. + # b. Mess about with this dictionary to try to get the SANs out. + # + # This is gross. Really gross. It's going to be a few hundred LoC extra + # just to repeat something that SecureTransport can *already do*. So my + # operating assumption at this time is that what we want to do is + # instead to just flag to urllib3 that it shouldn't do its own hostname + # validation when using SecureTransport. + if not binary_form: + raise ValueError( + "SecureTransport only supports dumping binary certs" + ) + trust = Security.SecTrustRef() + certdata = None + der_bytes = None + + try: + # Grab the trust store. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + # Probably we haven't done the handshake yet. No biggie. + return None + + cert_count = Security.SecTrustGetCertificateCount(trust) + if not cert_count: + # Also a case that might happen if we haven't handshaked. + # Handshook? Handshaken? + return None + + leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) + assert leaf + + # Ok, now we want the DER bytes. + certdata = Security.SecCertificateCopyData(leaf) + assert certdata + + data_length = CoreFoundation.CFDataGetLength(certdata) + data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) + der_bytes = ctypes.string_at(data_buffer, data_length) + finally: + if certdata: + CoreFoundation.CFRelease(certdata) + if trust: + CoreFoundation.CFRelease(trust) + + return der_bytes + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + def makefile(self, mode="r", buffering=None, *args, **kwargs): + # We disable buffering with SecureTransport because it conflicts with + # the buffering that ST does internally (see issue #1153 for more). + buffering = 0 + return backport_makefile(self, mode, buffering, *args, **kwargs) + +WrappedSocket.makefile = makefile + + +class SecureTransportContext(object): + """ + I am a wrapper class for the SecureTransport library, to translate the + interface of the standard library ``SSLContext`` object to calls into + SecureTransport. + """ + def __init__(self, protocol): + self._min_version, self._max_version = _protocol_to_min_max[protocol] + self._options = 0 + self._verify = False + self._trust_bundle = None + self._client_cert = None + self._client_key = None + self._client_key_passphrase = None + + @property + def check_hostname(self): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + return True + + @check_hostname.setter + def check_hostname(self, value): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + pass + + @property + def options(self): + # TODO: Well, crap. + # + # So this is the bit of the code that is the most likely to cause us + # trouble. Essentially we need to enumerate all of the SSL options that + # users might want to use and try to see if we can sensibly translate + # them, or whether we should just ignore them. + return self._options + + @options.setter + def options(self, value): + # TODO: Update in line with above. + self._options = value + + @property + def verify_mode(self): + return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE + + @verify_mode.setter + def verify_mode(self, value): + self._verify = True if value == ssl.CERT_REQUIRED else False + + def set_default_verify_paths(self): + # So, this has to do something a bit weird. Specifically, what it does + # is nothing. + # + # This means that, if we had previously had load_verify_locations + # called, this does not undo that. We need to do that because it turns + # out that the rest of the urllib3 code will attempt to load the + # default verify paths if it hasn't been told about any paths, even if + # the context itself was sometime earlier. We resolve that by just + # ignoring it. + pass + + def load_default_certs(self): + return self.set_default_verify_paths() + + def set_ciphers(self, ciphers): + # For now, we just require the default cipher string. + if ciphers != util.ssl_.DEFAULT_CIPHERS: + raise ValueError( + "SecureTransport doesn't support custom cipher strings" + ) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + # OK, we only really support cadata and cafile. + if capath is not None: + raise ValueError( + "SecureTransport does not support cert directories" + ) + + self._trust_bundle = cafile or cadata + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._client_cert = certfile + self._client_key = keyfile + self._client_cert_passphrase = password + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + # So, what do we do here? Firstly, we assert some properties. This is a + # stripped down shim, so there is some functionality we don't support. + # See PEP 543 for the real deal. + assert not server_side + assert do_handshake_on_connect + assert suppress_ragged_eofs + + # Ok, we're good to go. Now we want to create the wrapped socket object + # and store it in the appropriate place. + wrapped_socket = WrappedSocket(sock) + + # Now we can handshake + wrapped_socket.handshake( + server_hostname, self._verify, self._trust_bundle, + self._min_version, self._max_version, self._client_cert, + self._client_key, self._client_key_passphrase + ) + return wrapped_socket diff --git a/urllib3/contrib/socks.py b/urllib3/contrib/socks.py new file mode 100644 index 00000000..39e92fde --- /dev/null +++ b/urllib3/contrib/socks.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- +""" +This module contains provisional support for SOCKS proxies from within +urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and +SOCKS5. To enable its functionality, either install PySocks or install this +module with the ``socks`` extra. + +The SOCKS implementation supports the full range of urllib3 features. It also +supports the following SOCKS features: + +- SOCKS4 +- SOCKS4a +- SOCKS5 +- Usernames and passwords for the SOCKS proxy + +Known Limitations: + +- Currently PySocks does not support contacting remote websites via literal + IPv6 addresses. Any such connection attempt will fail. You must use a domain + name. +- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any + such connection attempt will fail. +""" +from __future__ import absolute_import + +try: + import socks +except ImportError: + import warnings + from ..exceptions import DependencyWarning + + warnings.warn(( + 'SOCKS support in urllib3 requires the installation of optional ' + 'dependencies: specifically, PySocks. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies' + ), + DependencyWarning + ) + raise + +from socket import error as SocketError, timeout as SocketTimeout + +from ..connection import ( + HTTPConnection, HTTPSConnection +) +from ..connectionpool import ( + HTTPConnectionPool, HTTPSConnectionPool +) +from ..exceptions import ConnectTimeoutError, NewConnectionError +from ..poolmanager import PoolManager +from ..util.url import parse_url + +try: + import ssl +except ImportError: + ssl = None + + +class SOCKSConnection(HTTPConnection): + """ + A plain-text HTTP connection that connects via a SOCKS proxy. + """ + def __init__(self, *args, **kwargs): + self._socks_options = kwargs.pop('_socks_options') + super(SOCKSConnection, self).__init__(*args, **kwargs) + + def _new_conn(self): + """ + Establish a new connection via the SOCKS proxy. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = socks.create_connection( + (self.host, self.port), + proxy_type=self._socks_options['socks_version'], + proxy_addr=self._socks_options['proxy_host'], + proxy_port=self._socks_options['proxy_port'], + proxy_username=self._socks_options['username'], + proxy_password=self._socks_options['password'], + proxy_rdns=self._socks_options['rdns'], + timeout=self.timeout, + **extra_kw + ) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except socks.ProxyError as e: + # This is fragile as hell, but it seems to be the only way to raise + # useful errors here. + if e.socket_err: + error = e.socket_err + if isinstance(error, SocketTimeout): + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout) + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % error + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % e + ) + + except SocketError as e: # Defensive: PySocks should catch all these. + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + +# We don't need to duplicate the Verified/Unverified distinction from +# urllib3/connection.py here because the HTTPSConnection will already have been +# correctly set to either the Verified or Unverified form by that module. This +# means the SOCKSHTTPSConnection will automatically be the correct type. +class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): + pass + + +class SOCKSHTTPConnectionPool(HTTPConnectionPool): + ConnectionCls = SOCKSConnection + + +class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): + ConnectionCls = SOCKSHTTPSConnection + + +class SOCKSProxyManager(PoolManager): + """ + A version of the urllib3 ProxyManager that routes connections via the + defined SOCKS proxy. + """ + pool_classes_by_scheme = { + 'http': SOCKSHTTPConnectionPool, + 'https': SOCKSHTTPSConnectionPool, + } + + def __init__(self, proxy_url, username=None, password=None, + num_pools=10, headers=None, **connection_pool_kw): + parsed = parse_url(proxy_url) + + if parsed.scheme == 'socks5': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = False + elif parsed.scheme == 'socks5h': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = True + elif parsed.scheme == 'socks4': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = False + elif parsed.scheme == 'socks4a': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = True + else: + raise ValueError( + "Unable to determine SOCKS version from %s" % proxy_url + ) + + self.proxy_url = proxy_url + + socks_options = { + 'socks_version': socks_version, + 'proxy_host': parsed.host, + 'proxy_port': parsed.port, + 'username': username, + 'password': password, + 'rdns': rdns + } + connection_pool_kw['_socks_options'] = socks_options + + super(SOCKSProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw + ) + + self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/urllib3/exceptions.py b/urllib3/exceptions.py new file mode 100644 index 00000000..6c4be581 --- /dev/null +++ b/urllib3/exceptions.py @@ -0,0 +1,246 @@ +from __future__ import absolute_import +from .packages.six.moves.http_client import ( + IncompleteRead as httplib_IncompleteRead +) +# Base Exceptions + + +class HTTPError(Exception): + "Base exception used by this module." + pass + + +class HTTPWarning(Warning): + "Base warning used by this module." + pass + + +class PoolError(HTTPError): + "Base exception for errors caused within a pool." + def __init__(self, pool, message): + self.pool = pool + HTTPError.__init__(self, "%s: %s" % (pool, message)) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, None) + + +class RequestError(PoolError): + "Base exception for PoolErrors that have associated URLs." + def __init__(self, pool, url, message): + self.url = url + PoolError.__init__(self, pool, message) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, self.url, None) + + +class SSLError(HTTPError): + "Raised when SSL certificate fails in an HTTPS connection." + pass + + +class ProxyError(HTTPError): + "Raised when the connection to a proxy fails." + pass + + +class DecodeError(HTTPError): + "Raised when automatic decoding based on Content-Type fails." + pass + + +class ProtocolError(HTTPError): + "Raised when something unexpected happens mid-request/response." + pass + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + +# Leaf Exceptions + +class MaxRetryError(RequestError): + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param string url: The requested Url + :param exceptions.Exception reason: The underlying error + + """ + + def __init__(self, pool, url, reason=None): + self.reason = reason + + message = "Max retries exceeded with url: %s (Caused by %r)" % ( + url, reason) + + RequestError.__init__(self, pool, url, message) + + +class HostChangedError(RequestError): + "Raised when an existing pool gets a request for a foreign host." + + def __init__(self, pool, url, retries=3): + message = "Tried to open a foreign host with url: %s" % url + RequestError.__init__(self, pool, url, message) + self.retries = retries + + +class TimeoutStateError(HTTPError): + """ Raised when passing an invalid state to a timeout """ + pass + + +class TimeoutError(HTTPError): + """ Raised when a socket timeout error occurs. + + Catching this error will catch both :exc:`ReadTimeoutErrors + ` and :exc:`ConnectTimeoutErrors `. + """ + pass + + +class ReadTimeoutError(TimeoutError, RequestError): + "Raised when a socket timeout occurs while receiving data from a server" + pass + + +# This timeout error does not have a URL attached and needs to inherit from the +# base HTTPError +class ConnectTimeoutError(TimeoutError): + "Raised when a socket timeout occurs while connecting to a server" + pass + + +class NewConnectionError(ConnectTimeoutError, PoolError): + "Raised when we fail to establish a new connection. Usually ECONNREFUSED." + pass + + +class EmptyPoolError(PoolError): + "Raised when a pool runs out of connections and no more are allowed." + pass + + +class ClosedPoolError(PoolError): + "Raised when a request enters a pool after the pool has been closed." + pass + + +class LocationValueError(ValueError, HTTPError): + "Raised when there is something wrong with a given URL input." + pass + + +class LocationParseError(LocationValueError): + "Raised when get_host or similar fails to parse the URL input." + + def __init__(self, location): + message = "Failed to parse: %s" % location + HTTPError.__init__(self, message) + + self.location = location + + +class ResponseError(HTTPError): + "Used as a container for an error reason supplied in a MaxRetryError." + GENERIC_ERROR = 'too many error responses' + SPECIFIC_ERROR = 'too many {status_code} error responses' + + +class SecurityWarning(HTTPWarning): + "Warned when perfoming security reducing actions" + pass + + +class SubjectAltNameWarning(SecurityWarning): + "Warned when connecting to a host with a certificate missing a SAN." + pass + + +class InsecureRequestWarning(SecurityWarning): + "Warned when making an unverified HTTPS request." + pass + + +class SystemTimeWarning(SecurityWarning): + "Warned when system time is suspected to be wrong" + pass + + +class InsecurePlatformWarning(SecurityWarning): + "Warned when certain SSL configuration is not available on a platform." + pass + + +class SNIMissingWarning(HTTPWarning): + "Warned when making a HTTPS request without SNI available." + pass + + +class DependencyWarning(HTTPWarning): + """ + Warned when an attempt is made to import a module with missing optional + dependencies. + """ + pass + + +class ResponseNotChunked(ProtocolError, ValueError): + "Response needs to be chunked in order to read it as chunks." + pass + + +class BodyNotHttplibCompatible(HTTPError): + """ + Body should be httplib.HTTPResponse like (have an fp attribute which + returns raw chunks) for read_chunked(). + """ + pass + + +class IncompleteRead(HTTPError, httplib_IncompleteRead): + """ + Response length doesn't match expected Content-Length + + Subclass of http_client.IncompleteRead to allow int value + for `partial` to avoid creating large objects on streamed + reads. + """ + def __init__(self, partial, expected): + super(IncompleteRead, self).__init__(partial, expected) + + def __repr__(self): + return ('IncompleteRead(%i bytes read, ' + '%i more expected)' % (self.partial, self.expected)) + + +class InvalidHeader(HTTPError): + "The header provided was somehow invalid." + pass + + +class ProxySchemeUnknown(AssertionError, ValueError): + "ProxyManager does not support the supplied scheme" + # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. + + def __init__(self, scheme): + message = "Not supported proxy scheme %s" % scheme + super(ProxySchemeUnknown, self).__init__(message) + + +class HeaderParsingError(HTTPError): + "Raised by assert_header_parsing, but we convert it to a log.warning statement." + def __init__(self, defects, unparsed_data): + message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) + super(HeaderParsingError, self).__init__(message) + + +class UnrewindableBodyError(HTTPError): + "urllib3 encountered an error when trying to rewind a body" + pass diff --git a/urllib3/fields.py b/urllib3/fields.py new file mode 100644 index 00000000..19b0ae0c --- /dev/null +++ b/urllib3/fields.py @@ -0,0 +1,178 @@ +from __future__ import absolute_import +import email.utils +import mimetypes + +from .packages import six + + +def guess_content_type(filename, default='application/octet-stream'): + """ + Guess the "Content-Type" of a file. + + :param filename: + The filename to guess the "Content-Type" of using :mod:`mimetypes`. + :param default: + If no "Content-Type" can be guessed, default to `default`. + """ + if filename: + return mimetypes.guess_type(filename)[0] or default + return default + + +def format_header_param(name, value): + """ + Helper function to format and quote a single header parameter. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows RFC 2231, as + suggested by RFC 2388 Section 4.4. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + if not any(ch in value for ch in '"\\\r\n'): + result = '%s="%s"' % (name, value) + try: + result.encode('ascii') + except (UnicodeEncodeError, UnicodeDecodeError): + pass + else: + return result + if not six.PY3 and isinstance(value, six.text_type): # Python 2: + value = value.encode('utf-8') + value = email.utils.encode_rfc2231(value, 'utf-8') + value = '%s*=%s' % (name, value) + return value + + +class RequestField(object): + """ + A data container for request body parameters. + + :param name: + The name of this request field. + :param data: + The data/value body. + :param filename: + An optional filename of the request field. + :param headers: + An optional dict-like object of headers to initially use for the field. + """ + def __init__(self, name, data, filename=None, headers=None): + self._name = name + self._filename = filename + self.data = data + self.headers = {} + if headers: + self.headers = dict(headers) + + @classmethod + def from_tuples(cls, fieldname, value): + """ + A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. + + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: + + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + + Field names and filenames must be unicode. + """ + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = guess_content_type(filename) + else: + filename = None + content_type = None + data = value + + request_param = cls(fieldname, data, filename=filename) + request_param.make_multipart(content_type=content_type) + + return request_param + + def _render_part(self, name, value): + """ + Overridable helper function to format a single header parameter. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + return format_header_param(name, value) + + def _render_parts(self, header_parts): + """ + Helper function to format and quote a single header. + + Useful for single headers that are composed of multiple items. E.g., + 'Content-Disposition' fields. + + :param header_parts: + A sequence of (k, v) typles or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. + """ + parts = [] + iterable = header_parts + if isinstance(header_parts, dict): + iterable = header_parts.items() + + for name, value in iterable: + if value is not None: + parts.append(self._render_part(name, value)) + + return '; '.join(parts) + + def render_headers(self): + """ + Renders the headers for this request field. + """ + lines = [] + + sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] + for sort_key in sort_keys: + if self.headers.get(sort_key, False): + lines.append('%s: %s' % (sort_key, self.headers[sort_key])) + + for header_name, header_value in self.headers.items(): + if header_name not in sort_keys: + if header_value: + lines.append('%s: %s' % (header_name, header_value)) + + lines.append('\r\n') + return '\r\n'.join(lines) + + def make_multipart(self, content_disposition=None, content_type=None, + content_location=None): + """ + Makes this request field into a multipart request field. + + This method overrides "Content-Disposition", "Content-Type" and + "Content-Location" headers to the request parameter. + + :param content_type: + The 'Content-Type' of the request body. + :param content_location: + The 'Content-Location' of the request body. + + """ + self.headers['Content-Disposition'] = content_disposition or 'form-data' + self.headers['Content-Disposition'] += '; '.join([ + '', self._render_parts( + (('name', self._name), ('filename', self._filename)) + ) + ]) + self.headers['Content-Type'] = content_type + self.headers['Content-Location'] = content_location diff --git a/urllib3/filepost.py b/urllib3/filepost.py new file mode 100644 index 00000000..cd11cee4 --- /dev/null +++ b/urllib3/filepost.py @@ -0,0 +1,94 @@ +from __future__ import absolute_import +import codecs + +from uuid import uuid4 +from io import BytesIO + +from .packages import six +from .packages.six import b +from .fields import RequestField + +writer = codecs.lookup('utf-8')[3] + + +def choose_boundary(): + """ + Our embarrassingly-simple replacement for mimetools.choose_boundary. + """ + return uuid4().hex + + +def iter_field_objects(fields): + """ + Iterate over fields. + + Supports list of (k, v) tuples and dicts, and lists of + :class:`~urllib3.fields.RequestField`. + + """ + if isinstance(fields, dict): + i = six.iteritems(fields) + else: + i = iter(fields) + + for field in i: + if isinstance(field, RequestField): + yield field + else: + yield RequestField.from_tuples(*field) + + +def iter_fields(fields): + """ + .. deprecated:: 1.6 + + Iterate over fields. + + The addition of :class:`~urllib3.fields.RequestField` makes this function + obsolete. Instead, use :func:`iter_field_objects`, which returns + :class:`~urllib3.fields.RequestField` objects. + + Supports list of (k, v) tuples and dicts. + """ + if isinstance(fields, dict): + return ((k, v) for k, v in six.iteritems(fields)) + + return ((k, v) for k, v in fields) + + +def encode_multipart_formdata(fields, boundary=None): + """ + Encode a dictionary of ``fields`` using the multipart/form-data MIME format. + + :param fields: + Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). + + :param boundary: + If not specified, then a random boundary will be generated using + :func:`mimetools.choose_boundary`. + """ + body = BytesIO() + if boundary is None: + boundary = choose_boundary() + + for field in iter_field_objects(fields): + body.write(b('--%s\r\n' % (boundary))) + + writer(body).write(field.render_headers()) + data = field.data + + if isinstance(data, int): + data = str(data) # Backwards compatibility + + if isinstance(data, six.text_type): + writer(body).write(data) + else: + body.write(data) + + body.write(b'\r\n') + + body.write(b('--%s--\r\n' % (boundary))) + + content_type = str('multipart/form-data; boundary=%s' % boundary) + + return body.getvalue(), content_type diff --git a/urllib3/packages/__init__.py b/urllib3/packages/__init__.py new file mode 100644 index 00000000..170e974c --- /dev/null +++ b/urllib3/packages/__init__.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import + +from . import ssl_match_hostname + +__all__ = ('ssl_match_hostname', ) diff --git a/urllib3/packages/backports/__init__.py b/urllib3/packages/backports/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/urllib3/packages/backports/makefile.py b/urllib3/packages/backports/makefile.py new file mode 100644 index 00000000..75b80dcf --- /dev/null +++ b/urllib3/packages/backports/makefile.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +""" +backports.makefile +~~~~~~~~~~~~~~~~~~ + +Backports the Python 3 ``socket.makefile`` method for use with anything that +wants to create a "fake" socket object. +""" +import io + +from socket import SocketIO + + +def backport_makefile(self, mode="r", buffering=None, encoding=None, + errors=None, newline=None): + """ + Backport of ``socket.makefile`` from Python 3.5. + """ + if not set(mode) <= set(["r", "w", "b"]): + raise ValueError( + "invalid mode %r (only r, w, b allowed)" % (mode,) + ) + writing = "w" in mode + reading = "r" in mode or not writing + assert reading or writing + binary = "b" in mode + rawmode = "" + if reading: + rawmode += "r" + if writing: + rawmode += "w" + raw = SocketIO(self, rawmode) + self._makefile_refs += 1 + if buffering is None: + buffering = -1 + if buffering < 0: + buffering = io.DEFAULT_BUFFER_SIZE + if buffering == 0: + if not binary: + raise ValueError("unbuffered streams must be binary") + return raw + if reading and writing: + buffer = io.BufferedRWPair(raw, raw, buffering) + elif reading: + buffer = io.BufferedReader(raw, buffering) + else: + assert writing + buffer = io.BufferedWriter(raw, buffering) + if binary: + return buffer + text = io.TextIOWrapper(buffer, encoding, errors, newline) + text.mode = mode + return text diff --git a/urllib3/packages/ordered_dict.py b/urllib3/packages/ordered_dict.py new file mode 100644 index 00000000..4479363c --- /dev/null +++ b/urllib3/packages/ordered_dict.py @@ -0,0 +1,259 @@ +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. +# Copyright 2009 Raymond Hettinger, released under the MIT License. +# http://code.activestate.com/recipes/576693/ +try: + from thread import get_ident as _get_ident +except ImportError: + from dummy_thread import get_ident as _get_ident + +try: + from _abcoll import KeysView, ValuesView, ItemsView +except ImportError: + pass + + +class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running={}): + 'od.__repr__() <==> repr(od)' + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) diff --git a/urllib3/packages/six.py b/urllib3/packages/six.py new file mode 100644 index 00000000..190c0239 --- /dev/null +++ b/urllib3/packages/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson " +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/urllib3/packages/ssl_match_hostname/__init__.py b/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 00000000..d6594eb2 --- /dev/null +++ b/urllib3/packages/ssl_match_hostname/__init__.py @@ -0,0 +1,19 @@ +import sys + +try: + # Our match_hostname function is the same as 3.5's, so we only want to + # import the match_hostname function if it's at least that good. + if sys.version_info < (3, 5): + raise ImportError("Fallback to vendored code") + + from ssl import CertificateError, match_hostname +except ImportError: + try: + # Backport of the function from a pypi module + from backports.ssl_match_hostname import CertificateError, match_hostname + except ImportError: + # Our vendored copy + from ._implementation import CertificateError, match_hostname + +# Not needed, but documenting what we provide. +__all__ = ('CertificateError', 'match_hostname') diff --git a/urllib3/packages/ssl_match_hostname/_implementation.py b/urllib3/packages/ssl_match_hostname/_implementation.py new file mode 100644 index 00000000..1fd42f38 --- /dev/null +++ b/urllib3/packages/ssl_match_hostname/_implementation.py @@ -0,0 +1,157 @@ +"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" + +# Note: This file is under the PSF license as the code comes from the python +# stdlib. http://docs.python.org/3/license.html + +import re +import sys + +# ipaddress has been backported to 2.6+ in pypi. If it is installed on the +# system, use it to handle IPAddress ServerAltnames (this was added in +# python-3.5) otherwise only do DNS matching. This allows +# backports.ssl_match_hostname to continue to be used all the way back to +# python-2.4. +try: + import ipaddress +except ImportError: + ipaddress = None + +__version__ = '3.5.0.1' + + +class CertificateError(ValueError): + pass + + +def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r'.') + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + +def _to_unicode(obj): + if isinstance(obj, str) and sys.version_info < (3,): + obj = unicode(obj, encoding='ascii', errors='strict') + return obj + +def _ipaddress_match(ipname, host_ip): + """Exact matching of IP addresses. + + RFC 6125 explicitly doesn't define an algorithm for this + (section 1.7.2 - "Out of Scope"). + """ + # OpenSSL may add a trailing newline to a subjectAltName's IP address + # Divergence from upstream: ipaddress can't handle byte str + ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) + return ip == host_ip + + +def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + try: + # Divergence from upstream: ipaddress can't handle byte str + host_ip = ipaddress.ip_address(_to_unicode(hostname)) + except ValueError: + # Not an IP address (common case) + host_ip = None + except UnicodeError: + # Divergence from upstream: Have to deal with ipaddress not taking + # byte strings. addresses should be all ascii, so we consider it not + # an ipaddress in this case + host_ip = None + except AttributeError: + # Divergence from upstream: Make ipaddress library optional + if ipaddress is None: + host_ip = None + else: + raise + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if host_ip is None and _dnsname_match(value, hostname): + return + dnsnames.append(value) + elif key == 'IP Address': + if host_ip is not None and _ipaddress_match(value, host_ip): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") diff --git a/urllib3/poolmanager.py b/urllib3/poolmanager.py new file mode 100644 index 00000000..4ae91744 --- /dev/null +++ b/urllib3/poolmanager.py @@ -0,0 +1,440 @@ +from __future__ import absolute_import +import collections +import functools +import logging + +from ._collections import RecentlyUsedContainer +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool +from .connectionpool import port_by_scheme +from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown +from .packages.six.moves.urllib.parse import urljoin +from .request import RequestMethods +from .util.url import parse_url +from .util.retry import Retry + + +__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] + + +log = logging.getLogger(__name__) + +SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', + 'ssl_version', 'ca_cert_dir', 'ssl_context') + +# All known keyword arguments that could be provided to the pool manager, its +# pools, or the underlying connections. This is used to construct a pool key. +_key_fields = ( + 'key_scheme', # str + 'key_host', # str + 'key_port', # int + 'key_timeout', # int or float or Timeout + 'key_retries', # int or Retry + 'key_strict', # bool + 'key_block', # bool + 'key_source_address', # str + 'key_key_file', # str + 'key_cert_file', # str + 'key_cert_reqs', # str + 'key_ca_certs', # str + 'key_ssl_version', # str + 'key_ca_cert_dir', # str + 'key_ssl_context', # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext + 'key_maxsize', # int + 'key_headers', # dict + 'key__proxy', # parsed proxy url + 'key__proxy_headers', # dict + 'key_socket_options', # list of (level (int), optname (int), value (int or str)) tuples + 'key__socks_options', # dict + 'key_assert_hostname', # bool or string + 'key_assert_fingerprint', # str +) + +#: The namedtuple class used to construct keys for the connection pool. +#: All custom key schemes should include the fields in this key at a minimum. +PoolKey = collections.namedtuple('PoolKey', _key_fields) + + +def _default_key_normalizer(key_class, request_context): + """ + Create a pool key out of a request context dictionary. + + According to RFC 3986, both the scheme and host are case-insensitive. + Therefore, this function normalizes both before constructing the pool + key for an HTTPS request. If you wish to change this behaviour, provide + alternate callables to ``key_fn_by_scheme``. + + :param key_class: + The class to use when constructing the key. This should be a namedtuple + with the ``scheme`` and ``host`` keys at a minimum. + :type key_class: namedtuple + :param request_context: + A dictionary-like object that contain the context for a request. + :type request_context: dict + + :return: A namedtuple that can be used as a connection pool key. + :rtype: PoolKey + """ + # Since we mutate the dictionary, make a copy first + context = request_context.copy() + context['scheme'] = context['scheme'].lower() + context['host'] = context['host'].lower() + + # These are both dictionaries and need to be transformed into frozensets + for key in ('headers', '_proxy_headers', '_socks_options'): + if key in context and context[key] is not None: + context[key] = frozenset(context[key].items()) + + # The socket_options key may be a list and needs to be transformed into a + # tuple. + socket_opts = context.get('socket_options') + if socket_opts is not None: + context['socket_options'] = tuple(socket_opts) + + # Map the kwargs to the names in the namedtuple - this is necessary since + # namedtuples can't have fields starting with '_'. + for key in list(context.keys()): + context['key_' + key] = context.pop(key) + + # Default to ``None`` for keys missing from the context + for field in key_class._fields: + if field not in context: + context[field] = None + + return key_class(**context) + + +#: A dictionary that maps a scheme to a callable that creates a pool key. +#: This can be used to alter the way pool keys are constructed, if desired. +#: Each PoolManager makes a copy of this dictionary so they can be configured +#: globally here, or individually on the instance. +key_fn_by_scheme = { + 'http': functools.partial(_default_key_normalizer, PoolKey), + 'https': functools.partial(_default_key_normalizer, PoolKey), +} + +pool_classes_by_scheme = { + 'http': HTTPConnectionPool, + 'https': HTTPSConnectionPool, +} + + +class PoolManager(RequestMethods): + """ + Allows for arbitrary requests while transparently keeping track of + necessary connection pools for you. + + :param num_pools: + Number of connection pools to cache before discarding the least + recently used pool. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param \\**connection_pool_kw: + Additional parameters are used to create fresh + :class:`urllib3.connectionpool.ConnectionPool` instances. + + Example:: + + >>> manager = PoolManager(num_pools=2) + >>> r = manager.request('GET', 'http://google.com/') + >>> r = manager.request('GET', 'http://google.com/mail') + >>> r = manager.request('GET', 'http://yahoo.com/') + >>> len(manager.pools) + 2 + + """ + + proxy = None + + def __init__(self, num_pools=10, headers=None, **connection_pool_kw): + RequestMethods.__init__(self, headers) + self.connection_pool_kw = connection_pool_kw + self.pools = RecentlyUsedContainer(num_pools, + dispose_func=lambda p: p.close()) + + # Locally set the pool classes and keys so other PoolManagers can + # override them. + self.pool_classes_by_scheme = pool_classes_by_scheme + self.key_fn_by_scheme = key_fn_by_scheme.copy() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.clear() + # Return False to re-raise any potential exceptions + return False + + def _new_pool(self, scheme, host, port, request_context=None): + """ + Create a new :class:`ConnectionPool` based on host, port, scheme, and + any additional pool keyword arguments. + + If ``request_context`` is provided, it is provided as keyword arguments + to the pool class used. This method is used to actually create the + connection pools handed out by :meth:`connection_from_url` and + companion methods. It is intended to be overridden for customization. + """ + pool_cls = self.pool_classes_by_scheme[scheme] + if request_context is None: + request_context = self.connection_pool_kw.copy() + + # Although the context has everything necessary to create the pool, + # this function has historically only used the scheme, host, and port + # in the positional args. When an API change is acceptable these can + # be removed. + for key in ('scheme', 'host', 'port'): + request_context.pop(key, None) + + if scheme == 'http': + for kw in SSL_KEYWORDS: + request_context.pop(kw, None) + + return pool_cls(host, port, **request_context) + + def clear(self): + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + """ + Get a :class:`ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is + provided, it is merged with the instance's ``connection_pool_kw`` + variable and used to create the new connection pool, if one is + needed. + """ + + if not host: + raise LocationValueError("No host specified.") + + request_context = self._merge_pool_kwargs(pool_kwargs) + request_context['scheme'] = scheme or 'http' + if not port: + port = port_by_scheme.get(request_context['scheme'].lower(), 80) + request_context['port'] = port + request_context['host'] = host + + return self.connection_from_context(request_context) + + def connection_from_context(self, request_context): + """ + Get a :class:`ConnectionPool` based on the request context. + + ``request_context`` must at least contain the ``scheme`` key and its + value must be a key in ``key_fn_by_scheme`` instance variable. + """ + scheme = request_context['scheme'].lower() + pool_key_constructor = self.key_fn_by_scheme[scheme] + pool_key = pool_key_constructor(request_context) + + return self.connection_from_pool_key(pool_key, request_context=request_context) + + def connection_from_pool_key(self, pool_key, request_context=None): + """ + Get a :class:`ConnectionPool` based on the provided pool key. + + ``pool_key`` should be a namedtuple that only contains immutable + objects. At a minimum it must have the ``scheme``, ``host``, and + ``port`` fields. + """ + with self.pools.lock: + # If the scheme, host, or port doesn't match existing open + # connections, open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + scheme = request_context['scheme'] + host = request_context['host'] + port = request_context['port'] + pool = self._new_pool(scheme, host, port, request_context=request_context) + self.pools[pool_key] = pool + + return pool + + def connection_from_url(self, url, pool_kwargs=None): + """ + Similar to :func:`urllib3.connectionpool.connection_from_url`. + + If ``pool_kwargs`` is not provided and a new pool needs to be + constructed, ``self.connection_pool_kw`` is used to initialize + the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` + is provided, it is used instead. Note that if a new pool does not + need to be created for the request, the provided ``pool_kwargs`` are + not used. + """ + u = parse_url(url) + return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, + pool_kwargs=pool_kwargs) + + def _merge_pool_kwargs(self, override): + """ + Merge a dictionary of override values for self.connection_pool_kw. + + This does not modify self.connection_pool_kw and returns a new dict. + Any keys in the override dictionary with a value of ``None`` are + removed from the merged dictionary. + """ + base_pool_kwargs = self.connection_pool_kw.copy() + if override: + for key, value in override.items(): + if value is None: + try: + del base_pool_kwargs[key] + except KeyError: + pass + else: + base_pool_kwargs[key] = value + return base_pool_kwargs + + def urlopen(self, method, url, redirect=True, **kw): + """ + Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw['assert_same_host'] = False + kw['redirect'] = False + if 'headers' not in kw: + kw['headers'] = self.headers + + if self.proxy is not None and u.scheme == "http": + response = conn.urlopen(method, url, **kw) + else: + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + # Support relative URLs for redirecting. + redirect_location = urljoin(url, redirect_location) + + # RFC 7231, Section 6.4.4 + if response.status == 303: + method = 'GET' + + retries = kw.get('retries') + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + try: + retries = retries.increment(method, url, response=response, _pool=conn) + except MaxRetryError: + if retries.raise_on_redirect: + raise + return response + + kw['retries'] = retries + kw['redirect'] = redirect + + log.info("Redirecting %s -> %s", url, redirect_location) + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(PoolManager): + """ + Behaves just like :class:`PoolManager`, but sends all requests through + the defined proxy, using the CONNECT method for HTTPS URLs. + + :param proxy_url: + The URL of the proxy to be used. + + :param proxy_headers: + A dictionary contaning headers that will be sent to the proxy. In case + of HTTP they are being sent with each request, while in the + HTTPS/CONNECT case they are sent only once. Could be used for proxy + authentication. + + Example: + >>> proxy = urllib3.ProxyManager('http://localhost:3128/') + >>> r1 = proxy.request('GET', 'http://google.com/') + >>> r2 = proxy.request('GET', 'http://httpbin.org/') + >>> len(proxy.pools) + 1 + >>> r3 = proxy.request('GET', 'https://httpbin.org/') + >>> r4 = proxy.request('GET', 'https://twitter.com/') + >>> len(proxy.pools) + 3 + + """ + + def __init__(self, proxy_url, num_pools=10, headers=None, + proxy_headers=None, **connection_pool_kw): + + if isinstance(proxy_url, HTTPConnectionPool): + proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, + proxy_url.port) + proxy = parse_url(proxy_url) + if not proxy.port: + port = port_by_scheme.get(proxy.scheme, 80) + proxy = proxy._replace(port=port) + + if proxy.scheme not in ("http", "https"): + raise ProxySchemeUnknown(proxy.scheme) + + self.proxy = proxy + self.proxy_headers = proxy_headers or {} + + connection_pool_kw['_proxy'] = self.proxy + connection_pool_kw['_proxy_headers'] = self.proxy_headers + + super(ProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw) + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + if scheme == "https": + return super(ProxyManager, self).connection_from_host( + host, port, scheme, pool_kwargs=pool_kwargs) + + return super(ProxyManager, self).connection_from_host( + self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {'Accept': '*/*'} + + netloc = parse_url(url).netloc + if netloc: + headers_['Host'] = netloc + + if headers: + headers_.update(headers) + return headers_ + + def urlopen(self, method, url, redirect=True, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + u = parse_url(url) + + if u.scheme == "http": + # For proxied HTTPS requests, httplib sets the necessary headers + # on the CONNECT to the proxy. For HTTP, we'll definitely + # need to set 'Host' at the very least. + headers = kw.get('headers', self.headers) + kw['headers'] = self._set_proxy_headers(url, headers) + + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) + + +def proxy_from_url(url, **kw): + return ProxyManager(proxy_url=url, **kw) diff --git a/urllib3/request.py b/urllib3/request.py new file mode 100644 index 00000000..c0fddff0 --- /dev/null +++ b/urllib3/request.py @@ -0,0 +1,148 @@ +from __future__ import absolute_import + +from .filepost import encode_multipart_formdata +from .packages.six.moves.urllib.parse import urlencode + + +__all__ = ['RequestMethods'] + + +class RequestMethods(object): + """ + Convenience mixin for classes who implement a :meth:`urlopen` method, such + as :class:`~urllib3.connectionpool.HTTPConnectionPool` and + :class:`~urllib3.poolmanager.PoolManager`. + + Provides behavior for making common types of HTTP request methods and + decides which type of request field encoding to use. + + Specifically, + + :meth:`.request_encode_url` is for sending requests whose fields are + encoded in the URL (such as GET, HEAD, DELETE). + + :meth:`.request_encode_body` is for sending requests whose fields are + encoded in the *body* of the request using multipart or www-form-urlencoded + (such as for POST, PUT, PATCH). + + :meth:`.request` is for making any kind of request, it will look up the + appropriate encoding format and use one of the above two methods to make + the request. + + Initializer parameters: + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + """ + + _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS']) + + def __init__(self, headers=None): + self.headers = headers or {} + + def urlopen(self, method, url, body=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **kw): # Abstract + raise NotImplemented("Classes extending RequestMethods must implement " + "their own ``urlopen`` method.") + + def request(self, method, url, fields=None, headers=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the appropriate encoding of + ``fields`` based on the ``method`` used. + + This is a convenience method that requires the least amount of manual + effort. It can be used in most situations, while still having the + option to drop down to more specific methods when necessary, such as + :meth:`request_encode_url`, :meth:`request_encode_body`, + or even the lowest level :meth:`urlopen`. + """ + method = method.upper() + + if method in self._encode_url_methods: + return self.request_encode_url(method, url, fields=fields, + headers=headers, + **urlopen_kw) + else: + return self.request_encode_body(method, url, fields=fields, + headers=headers, + **urlopen_kw) + + def request_encode_url(self, method, url, fields=None, headers=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the url. This is useful for request methods like GET, HEAD, DELETE, etc. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': headers} + extra_kw.update(urlopen_kw) + + if fields: + url += '?' + urlencode(fields) + + return self.urlopen(method, url, **extra_kw) + + def request_encode_body(self, method, url, fields=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the body. This is useful for request methods like POST, PUT, PATCH, etc. + + When ``encode_multipart=True`` (default), then + :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode + the payload with the appropriate content type. Otherwise + :meth:`urllib.urlencode` is used with the + 'application/x-www-form-urlencoded' content type. + + Multipart encoding must be used when posting files, and it's reasonably + safe to use it in other times too. However, it may break request + signing, such as with OAuth. + + Supports an optional ``fields`` parameter of key/value strings AND + key/filetuple. A filetuple is a (filename, data, MIME type) tuple where + the MIME type is optional. For example:: + + fields = { + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), + 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + } + + When uploading a file, providing a filename (the first parameter of the + tuple) is optional but recommended to best mimick behavior of browsers. + + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string + which is used to compose the body of the request. The random boundary + string can be explicitly set with the ``multipart_boundary`` parameter. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': {}} + + if fields: + if 'body' in urlopen_kw: + raise TypeError( + "request got values for both 'fields' and 'body', can only specify one.") + + if encode_multipart: + body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) + else: + body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' + + extra_kw['body'] = body + extra_kw['headers'] = {'Content-Type': content_type} + + extra_kw['headers'].update(headers) + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) diff --git a/urllib3/response.py b/urllib3/response.py new file mode 100644 index 00000000..d3e5a1e6 --- /dev/null +++ b/urllib3/response.py @@ -0,0 +1,626 @@ +from __future__ import absolute_import +from contextlib import contextmanager +import zlib +import io +import logging +from socket import timeout as SocketTimeout +from socket import error as SocketError + +from ._collections import HTTPHeaderDict +from .exceptions import ( + BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, + ResponseNotChunked, IncompleteRead, InvalidHeader +) +from .packages.six import string_types as basestring, binary_type, PY3 +from .packages.six.moves import http_client as httplib +from .connection import HTTPException, BaseSSLError +from .util.response import is_fp_closed, is_response_to_head + +log = logging.getLogger(__name__) + + +class DeflateDecoder(object): + + def __init__(self): + self._first_try = True + self._data = binary_type() + self._obj = zlib.decompressobj() + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + + if not self._first_try: + return self._obj.decompress(data) + + self._data += data + try: + decompressed = self._obj.decompress(data) + if decompressed: + self._first_try = False + self._data = None + return decompressed + except zlib.error: + self._first_try = False + self._obj = zlib.decompressobj(-zlib.MAX_WBITS) + try: + return self.decompress(self._data) + finally: + self._data = None + + +class GzipDecoder(object): + + def __init__(self): + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + return self._obj.decompress(data) + + +def _get_decoder(mode): + if mode == 'gzip': + return GzipDecoder() + + return DeflateDecoder() + + +class HTTPResponse(io.IOBase): + """ + HTTP Response container. + + Backwards-compatible to httplib's HTTPResponse but the response ``body`` is + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. + + Extra parameters for behaviour not present in httplib.HTTPResponse: + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, attempts to decode specific content-encoding's based on headers + (like 'gzip' and 'deflate') will be skipped and raw data will be used + instead. + + :param original_response: + When this HTTPResponse wrapper is generated from an httplib.HTTPResponse + object, it's convenient to include the original for debug purposes. It's + otherwise unused. + + :param retries: + The retries contains the last :class:`~urllib3.util.retry.Retry` that + was used during the request. + + :param enforce_content_length: + Enforce content length checking. Body returned by server must match + value of Content-Length header, if present. Otherwise, raise error. + """ + + CONTENT_DECODERS = ['gzip', 'deflate'] + REDIRECT_STATUSES = [301, 302, 303, 307, 308] + + def __init__(self, body='', headers=None, status=0, version=0, reason=None, + strict=0, preload_content=True, decode_content=True, + original_response=None, pool=None, connection=None, + retries=None, enforce_content_length=False, request_method=None): + + if isinstance(headers, HTTPHeaderDict): + self.headers = headers + else: + self.headers = HTTPHeaderDict(headers) + self.status = status + self.version = version + self.reason = reason + self.strict = strict + self.decode_content = decode_content + self.retries = retries + self.enforce_content_length = enforce_content_length + + self._decoder = None + self._body = None + self._fp = None + self._original_response = original_response + self._fp_bytes_read = 0 + + if body and isinstance(body, (basestring, binary_type)): + self._body = body + + self._pool = pool + self._connection = connection + + if hasattr(body, 'read'): + self._fp = body + + # Are we using the chunked-style of transfer encoding? + self.chunked = False + self.chunk_left = None + tr_enc = self.headers.get('transfer-encoding', '').lower() + # Don't incur the penalty of creating a list and then discarding it + encodings = (enc.strip() for enc in tr_enc.split(",")) + if "chunked" in encodings: + self.chunked = True + + # Determine length of response + self.length_remaining = self._init_length(request_method) + + # If requested, preload the body. + if preload_content and not self._body: + self._body = self.read(decode_content=decode_content) + + def get_redirect_location(self): + """ + Should we redirect and where to? + + :returns: Truthy redirect location string if we got a redirect status + code and valid location. ``None`` if redirect status and no + location. ``False`` if not a redirect status code. + """ + if self.status in self.REDIRECT_STATUSES: + return self.headers.get('location') + + return False + + def release_conn(self): + if not self._pool or not self._connection: + return + + self._pool._put_conn(self._connection) + self._connection = None + + @property + def data(self): + # For backwords-compat with earlier urllib3 0.4 and earlier. + if self._body: + return self._body + + if self._fp: + return self.read(cache_content=True) + + @property + def connection(self): + return self._connection + + def tell(self): + """ + Obtain the number of bytes pulled over the wire so far. May differ from + the amount of content returned by :meth:``HTTPResponse.read`` if bytes + are encoded on the wire (e.g, compressed). + """ + return self._fp_bytes_read + + def _init_length(self, request_method): + """ + Set initial length value for Response content if available. + """ + length = self.headers.get('content-length') + + if length is not None and self.chunked: + # This Response will fail with an IncompleteRead if it can't be + # received as chunked. This method falls back to attempt reading + # the response before raising an exception. + log.warning("Received response with both Content-Length and " + "Transfer-Encoding set. This is expressly forbidden " + "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " + "attempting to process response as Transfer-Encoding: " + "chunked.") + return None + + elif length is not None: + try: + # RFC 7230 section 3.3.2 specifies multiple content lengths can + # be sent in a single Content-Length header + # (e.g. Content-Length: 42, 42). This line ensures the values + # are all valid ints and that as long as the `set` length is 1, + # all values are the same. Otherwise, the header is invalid. + lengths = set([int(val) for val in length.split(',')]) + if len(lengths) > 1: + raise InvalidHeader("Content-Length contained multiple " + "unmatching values (%s)" % length) + length = lengths.pop() + except ValueError: + length = None + else: + if length < 0: + length = None + + # Convert status to int for comparison + # In some cases, httplib returns a status of "_UNKNOWN" + try: + status = int(self.status) + except ValueError: + status = 0 + + # Check for responses that shouldn't include a body + if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD': + length = 0 + + return length + + def _init_decoder(self): + """ + Set-up the _decoder attribute if necessary. + """ + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 + content_encoding = self.headers.get('content-encoding', '').lower() + if self._decoder is None and content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + + def _decode(self, data, decode_content, flush_decoder): + """ + Decode the data passed in and potentially flush the decoder. + """ + try: + if decode_content and self._decoder: + data = self._decoder.decompress(data) + except (IOError, zlib.error) as e: + content_encoding = self.headers.get('content-encoding', '').lower() + raise DecodeError( + "Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding, e) + + if flush_decoder and decode_content: + data += self._flush_decoder() + + return data + + def _flush_decoder(self): + """ + Flushes the decoder. Should only be called if the decoder is actually + being used. + """ + if self._decoder: + buf = self._decoder.decompress(b'') + return buf + self._decoder.flush() + + return b'' + + @contextmanager + def _error_catcher(self): + """ + Catch low-level python exceptions, instead re-raising urllib3 + variants, so that low-level exceptions are not leaked in the + high-level api. + + On exit, release the connection back to the pool. + """ + clean_exit = False + + try: + try: + yield + + except SocketTimeout: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if 'read operation timed out' not in str(e): # Defensive: + # This shouldn't happen but just in case we're missing an edge + # case, let's avoid swallowing SSL errors. + raise + + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except (HTTPException, SocketError) as e: + # This includes IncompleteRead. + raise ProtocolError('Connection broken: %r' % e, e) + + # If no exception is thrown, we should avoid cleaning up + # unnecessarily. + clean_exit = True + finally: + # If we didn't terminate cleanly, we need to throw away our + # connection. + if not clean_exit: + # The response may not be closed but we're not going to use it + # anymore so close it now to ensure that the connection is + # released back to the pool. + if self._original_response: + self._original_response.close() + + # Closing the response may not actually be sufficient to close + # everything, so if we have a hold of the connection close that + # too. + if self._connection: + self._connection.close() + + # If we hold the original response but it's closed now, we should + # return the connection back to the pool. + if self._original_response and self._original_response.isclosed(): + self.release_conn() + + def read(self, amt=None, decode_content=None, cache_content=False): + """ + Similar to :meth:`httplib.HTTPResponse.read`, but with two additional + parameters: ``decode_content`` and ``cache_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param cache_content: + If True, will save the returned data such that the same result is + returned despite of the state of the underlying file object. This + is useful if you want the ``.data`` property to continue working + after having ``.read()`` the file object. (Overridden if ``amt`` is + set.) + """ + self._init_decoder() + if decode_content is None: + decode_content = self.decode_content + + if self._fp is None: + return + + flush_decoder = False + data = None + + with self._error_catcher(): + if amt is None: + # cStringIO doesn't like amt=None + data = self._fp.read() + flush_decoder = True + else: + cache_content = False + data = self._fp.read(amt) + if amt != 0 and not data: # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. + self._fp.close() + flush_decoder = True + if self.enforce_content_length and self.length_remaining not in (0, None): + # This is an edge case that httplib failed to cover due + # to concerns of backward compatibility. We're + # addressing it here to make sure IncompleteRead is + # raised during streaming, so all calls with incorrect + # Content-Length are caught. + raise IncompleteRead(self._fp_bytes_read, self.length_remaining) + + if data: + self._fp_bytes_read += len(data) + if self.length_remaining is not None: + self.length_remaining -= len(data) + + data = self._decode(data, decode_content, flush_decoder) + + if cache_content: + self._body = data + + return data + + def stream(self, amt=2**16, decode_content=None): + """ + A generator wrapper for the read() method. A call will block until + ``amt`` bytes have been read from the connection or until the + connection is closed. + + :param amt: + How much of the content to read. The generator will return up to + much data per iteration, but may return less. This is particularly + likely when using compressed data. However, the empty string will + never be returned. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + if self.chunked and self.supports_chunked_reads(): + for line in self.read_chunked(amt, decode_content=decode_content): + yield line + else: + while not is_fp_closed(self._fp): + data = self.read(amt=amt, decode_content=decode_content) + + if data: + yield data + + @classmethod + def from_httplib(ResponseCls, r, **response_kw): + """ + Given an :class:`httplib.HTTPResponse` instance ``r``, return a + corresponding :class:`urllib3.response.HTTPResponse` object. + + Remaining parameters are passed to the HTTPResponse constructor, along + with ``original_response=r``. + """ + headers = r.msg + + if not isinstance(headers, HTTPHeaderDict): + if PY3: # Python 3 + headers = HTTPHeaderDict(headers.items()) + else: # Python 2 + headers = HTTPHeaderDict.from_httplib(headers) + + # HTTPResponse objects in Python 3 don't have a .strict attribute + strict = getattr(r, 'strict', 0) + resp = ResponseCls(body=r, + headers=headers, + status=r.status, + version=r.version, + reason=r.reason, + strict=strict, + original_response=r, + **response_kw) + return resp + + # Backwards-compatibility methods for httplib.HTTPResponse + def getheaders(self): + return self.headers + + def getheader(self, name, default=None): + return self.headers.get(name, default) + + # Backwards compatibility for http.cookiejar + def info(self): + return self.headers + + # Overrides from io.IOBase + def close(self): + if not self.closed: + self._fp.close() + + if self._connection: + self._connection.close() + + @property + def closed(self): + if self._fp is None: + return True + elif hasattr(self._fp, 'isclosed'): + return self._fp.isclosed() + elif hasattr(self._fp, 'closed'): + return self._fp.closed + else: + return True + + def fileno(self): + if self._fp is None: + raise IOError("HTTPResponse has no file to get a fileno from") + elif hasattr(self._fp, "fileno"): + return self._fp.fileno() + else: + raise IOError("The file-like object this HTTPResponse is wrapped " + "around has no file descriptor") + + def flush(self): + if self._fp is not None and hasattr(self._fp, 'flush'): + return self._fp.flush() + + def readable(self): + # This method is required for `io` module compatibility. + return True + + def readinto(self, b): + # This method is required for `io` module compatibility. + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[:len(temp)] = temp + return len(temp) + + def supports_chunked_reads(self): + """ + Checks if the underlying file-like object looks like a + httplib.HTTPResponse object. We do this by testing for the fp + attribute. If it is present we assume it returns raw chunks as + processed by read_chunked(). + """ + return hasattr(self._fp, 'fp') + + def _update_chunk_length(self): + # First, we'll figure out length of a chunk and then + # we'll try to read it from socket. + if self.chunk_left is not None: + return + line = self._fp.fp.readline() + line = line.split(b';', 1)[0] + try: + self.chunk_left = int(line, 16) + except ValueError: + # Invalid chunked protocol response, abort. + self.close() + raise httplib.IncompleteRead(line) + + def _handle_chunk(self, amt): + returned_chunk = None + if amt is None: + chunk = self._fp._safe_read(self.chunk_left) + returned_chunk = chunk + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + elif amt < self.chunk_left: + value = self._fp._safe_read(amt) + self.chunk_left = self.chunk_left - amt + returned_chunk = value + elif amt == self.chunk_left: + value = self._fp._safe_read(amt) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + returned_chunk = value + else: # amt > self.chunk_left + returned_chunk = self._fp._safe_read(self.chunk_left) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + return returned_chunk + + def read_chunked(self, amt=None, decode_content=None): + """ + Similar to :meth:`HTTPResponse.read`, but with an additional + parameter: ``decode_content``. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + self._init_decoder() + # FIXME: Rewrite this method and make it a class with a better structured logic. + if not self.chunked: + raise ResponseNotChunked( + "Response is not chunked. " + "Header 'transfer-encoding: chunked' is missing.") + if not self.supports_chunked_reads(): + raise BodyNotHttplibCompatible( + "Body should be httplib.HTTPResponse like. " + "It should have have an fp attribute which returns raw chunks.") + + # Don't bother reading the body of a HEAD request. + if self._original_response and is_response_to_head(self._original_response): + self._original_response.close() + return + + with self._error_catcher(): + while True: + self._update_chunk_length() + if self.chunk_left == 0: + break + chunk = self._handle_chunk(amt) + decoded = self._decode(chunk, decode_content=decode_content, + flush_decoder=False) + if decoded: + yield decoded + + if decode_content: + # On CPython and PyPy, we should never need to flush the + # decoder. However, on Jython we *might* need to, so + # lets defensively do it anyway. + decoded = self._flush_decoder() + if decoded: # Platform-specific: Jython. + yield decoded + + # Chunk content ends with \r\n: discard it. + while True: + line = self._fp.fp.readline() + if not line: + # Some sites may not end with '\r\n'. + break + if line == b'\r\n': + break + + # We read everything; close the "file". + if self._original_response: + self._original_response.close() diff --git a/urllib3/util/__init__.py b/urllib3/util/__init__.py new file mode 100644 index 00000000..2f2770b6 --- /dev/null +++ b/urllib3/util/__init__.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import +# For backwards compatibility, provide imports that used to be here. +from .connection import is_connection_dropped +from .request import make_headers +from .response import is_fp_closed +from .ssl_ import ( + SSLContext, + HAS_SNI, + IS_PYOPENSSL, + IS_SECURETRANSPORT, + assert_fingerprint, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .timeout import ( + current_time, + Timeout, +) + +from .retry import Retry +from .url import ( + get_host, + parse_url, + split_first, + Url, +) +from .wait import ( + wait_for_read, + wait_for_write +) + +__all__ = ( + 'HAS_SNI', + 'IS_PYOPENSSL', + 'IS_SECURETRANSPORT', + 'SSLContext', + 'Retry', + 'Timeout', + 'Url', + 'assert_fingerprint', + 'current_time', + 'is_connection_dropped', + 'is_fp_closed', + 'get_host', + 'parse_url', + 'make_headers', + 'resolve_cert_reqs', + 'resolve_ssl_version', + 'split_first', + 'ssl_wrap_socket', + 'wait_for_read', + 'wait_for_write' +) diff --git a/urllib3/util/connection.py b/urllib3/util/connection.py new file mode 100644 index 00000000..bf699cfd --- /dev/null +++ b/urllib3/util/connection.py @@ -0,0 +1,130 @@ +from __future__ import absolute_import +import socket +from .wait import wait_for_read +from .selectors import HAS_SELECT, SelectorError + + +def is_connection_dropped(conn): # Platform-specific + """ + Returns True if the connection is dropped and should be closed. + + :param conn: + :class:`httplib.HTTPConnection` object. + + Note: For platforms like AppEngine, this will always return ``False`` to + let the platform handle connection recycling transparently for us. + """ + sock = getattr(conn, 'sock', False) + if sock is False: # Platform-specific: AppEngine + return False + if sock is None: # Connection already closed (such as by httplib). + return True + + if not HAS_SELECT: + return False + + try: + return bool(wait_for_read(sock, timeout=0.0)) + except SelectorError: + return True + + +# This function is copied from socket.py in the Python 2.7 standard +# library test suite. Added to its signature is only `socket_options`. +# One additional modification is that we avoid binding to IPv6 servers +# discovered in DNS if the system doesn't have IPv6 functionality. +def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + source_address=None, socket_options=None): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + + host, port = address + if host.startswith('['): + host = host.strip('[]') + err = None + + # Using the value from allowed_gai_family() in the context of getaddrinfo lets + # us select whether to work with IPv4 DNS records, IPv6 records, or both. + # The original create_connection function always returns all records. + family = allowed_gai_family() + + for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + + # If provided, set socket level options before connecting. + _set_socket_options(sock, socket_options) + + if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except socket.error as e: + err = e + if sock is not None: + sock.close() + sock = None + + if err is not None: + raise err + + raise socket.error("getaddrinfo returns an empty list") + + +def _set_socket_options(sock, options): + if options is None: + return + + for opt in options: + sock.setsockopt(*opt) + + +def allowed_gai_family(): + """This function is designed to work in the context of + getaddrinfo, where family=socket.AF_UNSPEC is the default and + will perform a DNS search for both IPv6 and IPv4 records.""" + + family = socket.AF_INET + if HAS_IPV6: + family = socket.AF_UNSPEC + return family + + +def _has_ipv6(host): + """ Returns True if the system can bind an IPv6 address. """ + sock = None + has_ipv6 = False + + if socket.has_ipv6: + # has_ipv6 returns true if cPython was compiled with IPv6 support. + # It does not tell us if the system has IPv6 support enabled. To + # determine that we must bind to an IPv6 address. + # https://github.com/shazow/urllib3/pull/611 + # https://bugs.python.org/issue658327 + try: + sock = socket.socket(socket.AF_INET6) + sock.bind((host, 0)) + has_ipv6 = True + except Exception: + pass + + if sock: + sock.close() + return has_ipv6 + + +HAS_IPV6 = _has_ipv6('::1') diff --git a/urllib3/util/request.py b/urllib3/util/request.py new file mode 100644 index 00000000..3ddfcd55 --- /dev/null +++ b/urllib3/util/request.py @@ -0,0 +1,118 @@ +from __future__ import absolute_import +from base64 import b64encode + +from ..packages.six import b, integer_types +from ..exceptions import UnrewindableBodyError + +ACCEPT_ENCODING = 'gzip,deflate' +_FAILEDTELL = object() + + +def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, + basic_auth=None, proxy_basic_auth=None, disable_cache=None): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + :param proxy_basic_auth: + Colon-separated username:password string for 'proxy-authorization: basic ...' + auth header. + + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example:: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ','.join(accept_encoding) + else: + accept_encoding = ACCEPT_ENCODING + headers['accept-encoding'] = accept_encoding + + if user_agent: + headers['user-agent'] = user_agent + + if keep_alive: + headers['connection'] = 'keep-alive' + + if basic_auth: + headers['authorization'] = 'Basic ' + \ + b64encode(b(basic_auth)).decode('utf-8') + + if proxy_basic_auth: + headers['proxy-authorization'] = 'Basic ' + \ + b64encode(b(proxy_basic_auth)).decode('utf-8') + + if disable_cache: + headers['cache-control'] = 'no-cache' + + return headers + + +def set_file_position(body, pos): + """ + If a position is provided, move file to that point. + Otherwise, we'll attempt to record a position for future use. + """ + if pos is not None: + rewind_body(body, pos) + elif getattr(body, 'tell', None) is not None: + try: + pos = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body. + pos = _FAILEDTELL + + return pos + + +def rewind_body(body, body_pos): + """ + Attempt to rewind body to a certain position. + Primarily used for request redirects and retries. + + :param body: + File-like object that supports seek. + + :param int pos: + Position to seek to in file. + """ + body_seek = getattr(body, 'seek', None) + if body_seek is not None and isinstance(body_pos, integer_types): + try: + body_seek(body_pos) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect/retry.") + elif body_pos is _FAILEDTELL: + raise UnrewindableBodyError("Unable to record file position for rewinding " + "request body during a redirect/retry.") + else: + raise ValueError("body_pos must be of type integer, " + "instead it was %s." % type(body_pos)) diff --git a/urllib3/util/response.py b/urllib3/util/response.py new file mode 100644 index 00000000..67cf730a --- /dev/null +++ b/urllib3/util/response.py @@ -0,0 +1,81 @@ +from __future__ import absolute_import +from ..packages.six.moves import http_client as httplib + +from ..exceptions import HeaderParsingError + + +def is_fp_closed(obj): + """ + Checks whether a given file-like object is closed. + + :param obj: + The file-like object to check. + """ + + try: + # Check `isclosed()` first, in case Python3 doesn't set `closed`. + # GH Issue #928 + return obj.isclosed() + except AttributeError: + pass + + try: + # Check via the official file-like-object way. + return obj.closed + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") + + +def assert_header_parsing(headers): + """ + Asserts whether all headers have been successfully parsed. + Extracts encountered errors from the result of parsing headers. + + Only works on Python 3. + + :param headers: Headers to verify. + :type headers: `httplib.HTTPMessage`. + + :raises urllib3.exceptions.HeaderParsingError: + If parsing errors are found. + """ + + # This will fail silently if we pass in the wrong kind of parameter. + # To make debugging easier add an explicit check. + if not isinstance(headers, httplib.HTTPMessage): + raise TypeError('expected httplib.Message, got {0}.'.format( + type(headers))) + + defects = getattr(headers, 'defects', None) + get_payload = getattr(headers, 'get_payload', None) + + unparsed_data = None + if get_payload: # Platform-specific: Python 3. + unparsed_data = get_payload() + + if defects or unparsed_data: + raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) + + +def is_response_to_head(response): + """ + Checks whether the request of a response has been a HEAD-request. + Handles the quirks of AppEngine. + + :param conn: + :type conn: :class:`httplib.HTTPResponse` + """ + # FIXME: Can we do this somehow without accessing private httplib _method? + method = response._method + if isinstance(method, int): # Platform-specific: Appengine + return method == 3 + return method.upper() == 'HEAD' diff --git a/urllib3/util/retry.py b/urllib3/util/retry.py new file mode 100644 index 00000000..c603cb49 --- /dev/null +++ b/urllib3/util/retry.py @@ -0,0 +1,401 @@ +from __future__ import absolute_import +import time +import logging +from collections import namedtuple +from itertools import takewhile +import email +import re + +from ..exceptions import ( + ConnectTimeoutError, + MaxRetryError, + ProtocolError, + ReadTimeoutError, + ResponseError, + InvalidHeader, +) +from ..packages import six + + +log = logging.getLogger(__name__) + +# Data structure for representing the metadata of requests that result in a retry. +RequestHistory = namedtuple('RequestHistory', ["method", "url", "error", + "status", "redirect_location"]) + + +class Retry(object): + """ Retry configuration. + + Each retry attempt will create a new Retry object with updated values, so + they can be safely reused. + + Retries can be defined as a default for a pool:: + + retries = Retry(connect=5, read=2, redirect=5) + http = PoolManager(retries=retries) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', retries=Retry(10)) + + Retries can be disabled by passing ``False``:: + + response = http.request('GET', 'http://example.com/', retries=False) + + Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless + retries are disabled, in which case the causing exception will be raised. + + :param int total: + Total number of retries to allow. Takes precedence over other counts. + + Set to ``None`` to remove this constraint and fall back on other + counts. It's a good idea to set this to some sensibly-high value to + account for unexpected edge cases and avoid infinite retry loops. + + Set to ``0`` to fail on the first retry. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int connect: + How many connection-related errors to retry on. + + These are errors raised before the request is sent to the remote server, + which we assume has not triggered the server to process the request. + + Set to ``0`` to fail on the first retry of this type. + + :param int read: + How many times to retry on read errors. + + These errors are raised after the request was sent to the server, so the + request may have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + :param int redirect: + How many redirects to perform. Limit this to avoid infinite redirect + loops. + + A redirect is a HTTP response with a status code 301, 302, 303, 307 or + 308. + + Set to ``0`` to fail on the first retry of this type. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int status: + How many times to retry on bad status codes. + + These are retries made on responses, where status code matches + ``status_forcelist``. + + Set to ``0`` to fail on the first retry of this type. + + :param iterable method_whitelist: + Set of uppercased HTTP method verbs that we should retry on. + + By default, we only retry on methods which are considered to be + idempotent (multiple requests with the same parameters end with the + same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. + + Set to a ``False`` value to retry on any verb. + + :param iterable status_forcelist: + A set of integer HTTP status codes that we should force a retry on. + A retry is initiated if the request method is in ``method_whitelist`` + and the response status code is in ``status_forcelist``. + + By default, this is disabled with ``None``. + + :param float backoff_factor: + A backoff factor to apply between attempts after the second try + (most errors are resolved immediately by a second try without a + delay). urllib3 will sleep for:: + + {backoff factor} * (2 ^ ({number of total retries} - 1)) + + seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep + for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer + than :attr:`Retry.BACKOFF_MAX`. + + By default, backoff is disabled (set to 0). + + :param bool raise_on_redirect: Whether, if the number of redirects is + exhausted, to raise a MaxRetryError, or to return a response with a + response code in the 3xx range. + + :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: + whether we should raise an exception, or return a response, + if status falls in ``status_forcelist`` range and retries have + been exhausted. + + :param tuple history: The history of the request encountered during + each call to :meth:`~Retry.increment`. The list is in the order + the requests occurred. Each list item is of class :class:`RequestHistory`. + + :param bool respect_retry_after_header: + Whether to respect Retry-After header on status codes defined as + :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. + + """ + + DEFAULT_METHOD_WHITELIST = frozenset([ + 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) + + RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) + + #: Maximum backoff time. + BACKOFF_MAX = 120 + + def __init__(self, total=10, connect=None, read=None, redirect=None, status=None, + method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, + backoff_factor=0, raise_on_redirect=True, raise_on_status=True, + history=None, respect_retry_after_header=True): + + self.total = total + self.connect = connect + self.read = read + self.status = status + + if redirect is False or total is False: + redirect = 0 + raise_on_redirect = False + + self.redirect = redirect + self.status_forcelist = status_forcelist or set() + self.method_whitelist = method_whitelist + self.backoff_factor = backoff_factor + self.raise_on_redirect = raise_on_redirect + self.raise_on_status = raise_on_status + self.history = history or tuple() + self.respect_retry_after_header = respect_retry_after_header + + def new(self, **kw): + params = dict( + total=self.total, + connect=self.connect, read=self.read, redirect=self.redirect, status=self.status, + method_whitelist=self.method_whitelist, + status_forcelist=self.status_forcelist, + backoff_factor=self.backoff_factor, + raise_on_redirect=self.raise_on_redirect, + raise_on_status=self.raise_on_status, + history=self.history, + ) + params.update(kw) + return type(self)(**params) + + @classmethod + def from_int(cls, retries, redirect=True, default=None): + """ Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r", retries, new_retries) + return new_retries + + def get_backoff_time(self): + """ Formula for computing the current backoff + + :rtype: float + """ + # We want to consider only the last consecutive errors sequence (Ignore redirects). + consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, + reversed(self.history)))) + if consecutive_errors_len <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) + return min(self.BACKOFF_MAX, backoff_value) + + def parse_retry_after(self, retry_after): + # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 + if re.match(r"^\s*[0-9]+\s*$", retry_after): + seconds = int(retry_after) + else: + retry_date_tuple = email.utils.parsedate(retry_after) + if retry_date_tuple is None: + raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) + retry_date = time.mktime(retry_date_tuple) + seconds = retry_date - time.time() + + if seconds < 0: + seconds = 0 + + return seconds + + def get_retry_after(self, response): + """ Get the value of Retry-After in seconds. """ + + retry_after = response.getheader("Retry-After") + + if retry_after is None: + return None + + return self.parse_retry_after(retry_after) + + def sleep_for_retry(self, response=None): + retry_after = self.get_retry_after(response) + if retry_after: + time.sleep(retry_after) + return True + + return False + + def _sleep_backoff(self): + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def sleep(self, response=None): + """ Sleep between retry attempts. + + This method will respect a server's ``Retry-After`` response header + and sleep the duration of the time requested. If that is not present, it + will use an exponential backoff. By default, the backoff factor is 0 and + this method will return immediately. + """ + + if response: + slept = self.sleep_for_retry(response) + if slept: + return + + self._sleep_backoff() + + def _is_connection_error(self, err): + """ Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err): + """ Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def _is_method_retryable(self, method): + """ Checks if a given HTTP method should be retried upon, depending if + it is included on the method whitelist. + """ + if self.method_whitelist and method.upper() not in self.method_whitelist: + return False + + return True + + def is_retry(self, method, status_code, has_retry_after=False): + """ Is this method/status code retryable? (Based on whitelists and control + variables such as the number of total retries to allow, whether to + respect the Retry-After header, whether this header is present, and + whether the returned status code is on the list of status codes to + be retried upon on the presence of the aforementioned header) + """ + if not self._is_method_retryable(method): + return False + + if self.status_forcelist and status_code in self.status_forcelist: + return True + + return (self.total and self.respect_retry_after_header and + has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES)) + + def is_exhausted(self): + """ Are we out of retries? """ + retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment(self, method=None, url=None, response=None, error=None, + _pool=None, _stacktrace=None): + """ Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.HTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise six.reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + connect = self.connect + read = self.read + redirect = self.redirect + status_count = self.status + cause = 'unknown' + status = None + redirect_location = None + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise six.reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False or not self._is_method_retryable(method): + raise six.reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = 'too many redirects' + redirect_location = response.get_redirect_location() + status = response.status + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and a the given method is in the whitelist + cause = ResponseError.GENERIC_ERROR + if response and response.status: + if status_count is not None: + status_count -= 1 + cause = ResponseError.SPECIFIC_ERROR.format( + status_code=response.status) + status = response.status + + history = self.history + (RequestHistory(method, url, error, status, redirect_location),) + + new_retry = self.new( + total=total, + connect=connect, read=read, redirect=redirect, status=status_count, + history=history) + + if new_retry.is_exhausted(): + raise MaxRetryError(_pool, url, error or ResponseError(cause)) + + log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) + + return new_retry + + def __repr__(self): + return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' + 'read={self.read}, redirect={self.redirect}, status={self.status})').format( + cls=type(self), self=self) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/urllib3/util/selectors.py b/urllib3/util/selectors.py new file mode 100644 index 00000000..d75cb266 --- /dev/null +++ b/urllib3/util/selectors.py @@ -0,0 +1,581 @@ +# Backport of selectors.py from Python 3.5+ to support Python < 3.4 +# Also has the behavior specified in PEP 475 which is to retry syscalls +# in the case of an EINTR error. This module is required because selectors34 +# does not follow this behavior and instead returns that no dile descriptor +# events have occurred rather than retry the syscall. The decision to drop +# support for select.devpoll is made to maintain 100% test coverage. + +import errno +import math +import select +import socket +import sys +import time +from collections import namedtuple, Mapping + +try: + monotonic = time.monotonic +except (AttributeError, ImportError): # Python 3.3< + monotonic = time.time + +EVENT_READ = (1 << 0) +EVENT_WRITE = (1 << 1) + +HAS_SELECT = True # Variable that shows whether the platform has a selector. +_SYSCALL_SENTINEL = object() # Sentinel in case a system call returns None. +_DEFAULT_SELECTOR = None + + +class SelectorError(Exception): + def __init__(self, errcode): + super(SelectorError, self).__init__() + self.errno = errcode + + def __repr__(self): + return "".format(self.errno) + + def __str__(self): + return self.__repr__() + + +def _fileobj_to_fd(fileobj): + """ Return a file descriptor from a file object. If + given an integer will simply return that integer back. """ + if isinstance(fileobj, int): + fd = fileobj + else: + try: + fd = int(fileobj.fileno()) + except (AttributeError, TypeError, ValueError): + raise ValueError("Invalid file object: {0!r}".format(fileobj)) + if fd < 0: + raise ValueError("Invalid file descriptor: {0}".format(fd)) + return fd + + +# Determine which function to use to wrap system calls because Python 3.5+ +# already handles the case when system calls are interrupted. +if sys.version_info >= (3, 5): + def _syscall_wrapper(func, _, *args, **kwargs): + """ This is the short-circuit version of the below logic + because in Python 3.5+ all system calls automatically restart + and recalculate their timeouts. """ + try: + return func(*args, **kwargs) + except (OSError, IOError, select.error) as e: + errcode = None + if hasattr(e, "errno"): + errcode = e.errno + raise SelectorError(errcode) +else: + def _syscall_wrapper(func, recalc_timeout, *args, **kwargs): + """ Wrapper function for syscalls that could fail due to EINTR. + All functions should be retried if there is time left in the timeout + in accordance with PEP 475. """ + timeout = kwargs.get("timeout", None) + if timeout is None: + expires = None + recalc_timeout = False + else: + timeout = float(timeout) + if timeout < 0.0: # Timeout less than 0 treated as no timeout. + expires = None + else: + expires = monotonic() + timeout + + args = list(args) + if recalc_timeout and "timeout" not in kwargs: + raise ValueError( + "Timeout must be in args or kwargs to be recalculated") + + result = _SYSCALL_SENTINEL + while result is _SYSCALL_SENTINEL: + try: + result = func(*args, **kwargs) + # OSError is thrown by select.select + # IOError is thrown by select.epoll.poll + # select.error is thrown by select.poll.poll + # Aren't we thankful for Python 3.x rework for exceptions? + except (OSError, IOError, select.error) as e: + # select.error wasn't a subclass of OSError in the past. + errcode = None + if hasattr(e, "errno"): + errcode = e.errno + elif hasattr(e, "args"): + errcode = e.args[0] + + # Also test for the Windows equivalent of EINTR. + is_interrupt = (errcode == errno.EINTR or (hasattr(errno, "WSAEINTR") and + errcode == errno.WSAEINTR)) + + if is_interrupt: + if expires is not None: + current_time = monotonic() + if current_time > expires: + raise OSError(errno=errno.ETIMEDOUT) + if recalc_timeout: + if "timeout" in kwargs: + kwargs["timeout"] = expires - current_time + continue + if errcode: + raise SelectorError(errcode) + else: + raise + return result + + +SelectorKey = namedtuple('SelectorKey', ['fileobj', 'fd', 'events', 'data']) + + +class _SelectorMapping(Mapping): + """ Mapping of file objects to selector keys """ + + def __init__(self, selector): + self._selector = selector + + def __len__(self): + return len(self._selector._fd_to_key) + + def __getitem__(self, fileobj): + try: + fd = self._selector._fileobj_lookup(fileobj) + return self._selector._fd_to_key[fd] + except KeyError: + raise KeyError("{0!r} is not registered.".format(fileobj)) + + def __iter__(self): + return iter(self._selector._fd_to_key) + + +class BaseSelector(object): + """ Abstract Selector class + + A selector supports registering file objects to be monitored + for specific I/O events. + + A file object is a file descriptor or any object with a + `fileno()` method. An arbitrary object can be attached to the + file object which can be used for example to store context info, + a callback, etc. + + A selector can use various implementations (select(), poll(), epoll(), + and kqueue()) depending on the platform. The 'DefaultSelector' class uses + the most efficient implementation for the current platform. + """ + def __init__(self): + # Maps file descriptors to keys. + self._fd_to_key = {} + + # Read-only mapping returned by get_map() + self._map = _SelectorMapping(self) + + def _fileobj_lookup(self, fileobj): + """ Return a file descriptor from a file object. + This wraps _fileobj_to_fd() to do an exhaustive + search in case the object is invalid but we still + have it in our map. Used by unregister() so we can + unregister an object that was previously registered + even if it is closed. It is also used by _SelectorMapping + """ + try: + return _fileobj_to_fd(fileobj) + except ValueError: + + # Search through all our mapped keys. + for key in self._fd_to_key.values(): + if key.fileobj is fileobj: + return key.fd + + # Raise ValueError after all. + raise + + def register(self, fileobj, events, data=None): + """ Register a file object for a set of events to monitor. """ + if (not events) or (events & ~(EVENT_READ | EVENT_WRITE)): + raise ValueError("Invalid events: {0!r}".format(events)) + + key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data) + + if key.fd in self._fd_to_key: + raise KeyError("{0!r} (FD {1}) is already registered" + .format(fileobj, key.fd)) + + self._fd_to_key[key.fd] = key + return key + + def unregister(self, fileobj): + """ Unregister a file object from being monitored. """ + try: + key = self._fd_to_key.pop(self._fileobj_lookup(fileobj)) + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + + # Getting the fileno of a closed socket on Windows errors with EBADF. + except socket.error as e: # Platform-specific: Windows. + if e.errno != errno.EBADF: + raise + else: + for key in self._fd_to_key.values(): + if key.fileobj is fileobj: + self._fd_to_key.pop(key.fd) + break + else: + raise KeyError("{0!r} is not registered".format(fileobj)) + return key + + def modify(self, fileobj, events, data=None): + """ Change a registered file object monitored events and data. """ + # NOTE: Some subclasses optimize this operation even further. + try: + key = self._fd_to_key[self._fileobj_lookup(fileobj)] + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + + if events != key.events: + self.unregister(fileobj) + key = self.register(fileobj, events, data) + + elif data != key.data: + # Use a shortcut to update the data. + key = key._replace(data=data) + self._fd_to_key[key.fd] = key + + return key + + def select(self, timeout=None): + """ Perform the actual selection until some monitored file objects + are ready or the timeout expires. """ + raise NotImplementedError() + + def close(self): + """ Close the selector. This must be called to ensure that all + underlying resources are freed. """ + self._fd_to_key.clear() + self._map = None + + def get_key(self, fileobj): + """ Return the key associated with a registered file object. """ + mapping = self.get_map() + if mapping is None: + raise RuntimeError("Selector is closed") + try: + return mapping[fileobj] + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + + def get_map(self): + """ Return a mapping of file objects to selector keys """ + return self._map + + def _key_from_fd(self, fd): + """ Return the key associated to a given file descriptor + Return None if it is not found. """ + try: + return self._fd_to_key[fd] + except KeyError: + return None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + +# Almost all platforms have select.select() +if hasattr(select, "select"): + class SelectSelector(BaseSelector): + """ Select-based selector. """ + def __init__(self): + super(SelectSelector, self).__init__() + self._readers = set() + self._writers = set() + + def register(self, fileobj, events, data=None): + key = super(SelectSelector, self).register(fileobj, events, data) + if events & EVENT_READ: + self._readers.add(key.fd) + if events & EVENT_WRITE: + self._writers.add(key.fd) + return key + + def unregister(self, fileobj): + key = super(SelectSelector, self).unregister(fileobj) + self._readers.discard(key.fd) + self._writers.discard(key.fd) + return key + + def _select(self, r, w, timeout=None): + """ Wrapper for select.select because timeout is a positional arg """ + return select.select(r, w, [], timeout) + + def select(self, timeout=None): + # Selecting on empty lists on Windows errors out. + if not len(self._readers) and not len(self._writers): + return [] + + timeout = None if timeout is None else max(timeout, 0.0) + ready = [] + r, w, _ = _syscall_wrapper(self._select, True, self._readers, + self._writers, timeout) + r = set(r) + w = set(w) + for fd in r | w: + events = 0 + if fd in r: + events |= EVENT_READ + if fd in w: + events |= EVENT_WRITE + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + return ready + + +if hasattr(select, "poll"): + class PollSelector(BaseSelector): + """ Poll-based selector """ + def __init__(self): + super(PollSelector, self).__init__() + self._poll = select.poll() + + def register(self, fileobj, events, data=None): + key = super(PollSelector, self).register(fileobj, events, data) + event_mask = 0 + if events & EVENT_READ: + event_mask |= select.POLLIN + if events & EVENT_WRITE: + event_mask |= select.POLLOUT + self._poll.register(key.fd, event_mask) + return key + + def unregister(self, fileobj): + key = super(PollSelector, self).unregister(fileobj) + self._poll.unregister(key.fd) + return key + + def _wrap_poll(self, timeout=None): + """ Wrapper function for select.poll.poll() so that + _syscall_wrapper can work with only seconds. """ + if timeout is not None: + if timeout <= 0: + timeout = 0 + else: + # select.poll.poll() has a resolution of 1 millisecond, + # round away from zero to wait *at least* timeout seconds. + timeout = math.ceil(timeout * 1e3) + + result = self._poll.poll(timeout) + return result + + def select(self, timeout=None): + ready = [] + fd_events = _syscall_wrapper(self._wrap_poll, True, timeout=timeout) + for fd, event_mask in fd_events: + events = 0 + if event_mask & ~select.POLLIN: + events |= EVENT_WRITE + if event_mask & ~select.POLLOUT: + events |= EVENT_READ + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + + return ready + + +if hasattr(select, "epoll"): + class EpollSelector(BaseSelector): + """ Epoll-based selector """ + def __init__(self): + super(EpollSelector, self).__init__() + self._epoll = select.epoll() + + def fileno(self): + return self._epoll.fileno() + + def register(self, fileobj, events, data=None): + key = super(EpollSelector, self).register(fileobj, events, data) + events_mask = 0 + if events & EVENT_READ: + events_mask |= select.EPOLLIN + if events & EVENT_WRITE: + events_mask |= select.EPOLLOUT + _syscall_wrapper(self._epoll.register, False, key.fd, events_mask) + return key + + def unregister(self, fileobj): + key = super(EpollSelector, self).unregister(fileobj) + try: + _syscall_wrapper(self._epoll.unregister, False, key.fd) + except SelectorError: + # This can occur when the fd was closed since registry. + pass + return key + + def select(self, timeout=None): + if timeout is not None: + if timeout <= 0: + timeout = 0.0 + else: + # select.epoll.poll() has a resolution of 1 millisecond + # but luckily takes seconds so we don't need a wrapper + # like PollSelector. Just for better rounding. + timeout = math.ceil(timeout * 1e3) * 1e-3 + timeout = float(timeout) + else: + timeout = -1.0 # epoll.poll() must have a float. + + # We always want at least 1 to ensure that select can be called + # with no file descriptors registered. Otherwise will fail. + max_events = max(len(self._fd_to_key), 1) + + ready = [] + fd_events = _syscall_wrapper(self._epoll.poll, True, + timeout=timeout, + maxevents=max_events) + for fd, event_mask in fd_events: + events = 0 + if event_mask & ~select.EPOLLIN: + events |= EVENT_WRITE + if event_mask & ~select.EPOLLOUT: + events |= EVENT_READ + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + return ready + + def close(self): + self._epoll.close() + super(EpollSelector, self).close() + + +if hasattr(select, "kqueue"): + class KqueueSelector(BaseSelector): + """ Kqueue / Kevent-based selector """ + def __init__(self): + super(KqueueSelector, self).__init__() + self._kqueue = select.kqueue() + + def fileno(self): + return self._kqueue.fileno() + + def register(self, fileobj, events, data=None): + key = super(KqueueSelector, self).register(fileobj, events, data) + if events & EVENT_READ: + kevent = select.kevent(key.fd, + select.KQ_FILTER_READ, + select.KQ_EV_ADD) + + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + + if events & EVENT_WRITE: + kevent = select.kevent(key.fd, + select.KQ_FILTER_WRITE, + select.KQ_EV_ADD) + + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + + return key + + def unregister(self, fileobj): + key = super(KqueueSelector, self).unregister(fileobj) + if key.events & EVENT_READ: + kevent = select.kevent(key.fd, + select.KQ_FILTER_READ, + select.KQ_EV_DELETE) + try: + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + except SelectorError: + pass + if key.events & EVENT_WRITE: + kevent = select.kevent(key.fd, + select.KQ_FILTER_WRITE, + select.KQ_EV_DELETE) + try: + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + except SelectorError: + pass + + return key + + def select(self, timeout=None): + if timeout is not None: + timeout = max(timeout, 0) + + max_events = len(self._fd_to_key) * 2 + ready_fds = {} + + kevent_list = _syscall_wrapper(self._kqueue.control, True, + None, max_events, timeout) + + for kevent in kevent_list: + fd = kevent.ident + event_mask = kevent.filter + events = 0 + if event_mask == select.KQ_FILTER_READ: + events |= EVENT_READ + if event_mask == select.KQ_FILTER_WRITE: + events |= EVENT_WRITE + + key = self._key_from_fd(fd) + if key: + if key.fd not in ready_fds: + ready_fds[key.fd] = (key, events & key.events) + else: + old_events = ready_fds[key.fd][1] + ready_fds[key.fd] = (key, (events | old_events) & key.events) + + return list(ready_fds.values()) + + def close(self): + self._kqueue.close() + super(KqueueSelector, self).close() + + +if not hasattr(select, 'select'): # Platform-specific: AppEngine + HAS_SELECT = False + + +def _can_allocate(struct): + """ Checks that select structs can be allocated by the underlying + operating system, not just advertised by the select module. We don't + check select() because we'll be hopeful that most platforms that + don't have it available will not advertise it. (ie: GAE) """ + try: + # select.poll() objects won't fail until used. + if struct == 'poll': + p = select.poll() + p.poll(0) + + # All others will fail on allocation. + else: + getattr(select, struct)().close() + return True + except (OSError, AttributeError) as e: + return False + + +# Choose the best implementation, roughly: +# kqueue == epoll > poll > select. Devpoll not supported. (See above) +# select() also can't accept a FD > FD_SETSIZE (usually around 1024) +def DefaultSelector(): + """ This function serves as a first call for DefaultSelector to + detect if the select module is being monkey-patched incorrectly + by eventlet, greenlet, and preserve proper behavior. """ + global _DEFAULT_SELECTOR + if _DEFAULT_SELECTOR is None: + if _can_allocate('kqueue'): + _DEFAULT_SELECTOR = KqueueSelector + elif _can_allocate('epoll'): + _DEFAULT_SELECTOR = EpollSelector + elif _can_allocate('poll'): + _DEFAULT_SELECTOR = PollSelector + elif hasattr(select, 'select'): + _DEFAULT_SELECTOR = SelectSelector + else: # Platform-specific: AppEngine + raise ValueError('Platform does not have a selector') + return _DEFAULT_SELECTOR() diff --git a/urllib3/util/ssl_.py b/urllib3/util/ssl_.py new file mode 100644 index 00000000..32fd9eda --- /dev/null +++ b/urllib3/util/ssl_.py @@ -0,0 +1,341 @@ +from __future__ import absolute_import +import errno +import warnings +import hmac + +from binascii import hexlify, unhexlify +from hashlib import md5, sha1, sha256 + +from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning + + +SSLContext = None +HAS_SNI = False +IS_PYOPENSSL = False +IS_SECURETRANSPORT = False + +# Maps the length of a digest to a possible hash function producing this digest +HASHFUNC_MAP = { + 32: md5, + 40: sha1, + 64: sha256, +} + + +def _const_compare_digest_backport(a, b): + """ + Compare two digests of equal length in constant time. + + The digests must be of type str/bytes. + Returns True if the digests match, and False otherwise. + """ + result = abs(len(a) - len(b)) + for l, r in zip(bytearray(a), bytearray(b)): + result |= l ^ r + return result == 0 + + +_const_compare_digest = getattr(hmac, 'compare_digest', + _const_compare_digest_backport) + + +try: # Test for SSL features + import ssl + from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + + +try: + from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION +except ImportError: + OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 + OP_NO_COMPRESSION = 0x20000 + +# A secure default. +# Sources for more information on TLS ciphers: +# +# - https://wiki.mozilla.org/Security/Server_Side_TLS +# - https://www.ssllabs.com/projects/best-practices/index.html +# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ +# +# The general intent is: +# - Prefer TLS 1.3 cipher suites +# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), +# - prefer ECDHE over DHE for better performance, +# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and +# security, +# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, +# - disable NULL authentication, MD5 MACs and DSS for security reasons. +DEFAULT_CIPHERS = ':'.join([ + 'TLS13-AES-256-GCM-SHA384', + 'TLS13-CHACHA20-POLY1305-SHA256', + 'TLS13-AES-128-GCM-SHA256', + 'ECDH+AESGCM', + 'ECDH+CHACHA20', + 'DH+AESGCM', + 'DH+CHACHA20', + 'ECDH+AES256', + 'DH+AES256', + 'ECDH+AES128', + 'DH+AES', + 'RSA+AESGCM', + 'RSA+AES', + '!aNULL', + '!eNULL', + '!MD5', +]) + +try: + from ssl import SSLContext # Modern SSL? +except ImportError: + import sys + + class SSLContext(object): # Platform-specific: Python 2 & 3.1 + supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or + (3, 2) <= sys.version_info) + + def __init__(self, protocol_version): + self.protocol = protocol_version + # Use default values from a real SSLContext + self.check_hostname = False + self.verify_mode = ssl.CERT_NONE + self.ca_certs = None + self.options = 0 + self.certfile = None + self.keyfile = None + self.ciphers = None + + def load_cert_chain(self, certfile, keyfile): + self.certfile = certfile + self.keyfile = keyfile + + def load_verify_locations(self, cafile=None, capath=None): + self.ca_certs = cafile + + if capath is not None: + raise SSLError("CA directories not supported in older Pythons") + + def set_ciphers(self, cipher_suite): + if not self.supports_set_ciphers: + raise TypeError( + 'Your version of Python does not support setting ' + 'a custom cipher suite. Please upgrade to Python ' + '2.7, 3.2, or later if you need this functionality.' + ) + self.ciphers = cipher_suite + + def wrap_socket(self, socket, server_hostname=None, server_side=False): + warnings.warn( + 'A true SSLContext object is not available. This prevents ' + 'urllib3 from configuring SSL appropriately and may cause ' + 'certain SSL connections to fail. You can upgrade to a newer ' + 'version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + InsecurePlatformWarning + ) + kwargs = { + 'keyfile': self.keyfile, + 'certfile': self.certfile, + 'ca_certs': self.ca_certs, + 'cert_reqs': self.verify_mode, + 'ssl_version': self.protocol, + 'server_side': server_side, + } + if self.supports_set_ciphers: # Platform-specific: Python 2.7+ + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + else: # Platform-specific: Python 2.6 + return wrap_socket(socket, **kwargs) + + +def assert_fingerprint(cert, fingerprint): + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + fingerprint = fingerprint.replace(':', '').lower() + digest_length = len(fingerprint) + hashfunc = HASHFUNC_MAP.get(digest_length) + if not hashfunc: + raise SSLError( + 'Fingerprint of invalid length: {0}'.format(fingerprint)) + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + cert_digest = hashfunc(cert).digest() + + if not _const_compare_digest(cert_digest, fingerprint_bytes): + raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' + .format(fingerprint, hexlify(cert_digest))) + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_NONE`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbrevation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_NONE + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'CERT_' + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_SSLv23 + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'PROTOCOL_' + candidate) + return res + + return candidate + + +def create_urllib3_context(ssl_version=None, cert_reqs=None, + options=None, ciphers=None): + """All arguments have the same meaning as ``ssl_wrap_socket``. + + By default, this function does a lot of the same work that + ``ssl.create_default_context`` does on Python 3.4+. It: + + - Disables SSLv2, SSLv3, and compression + - Sets a restricted set of server ciphers + + If you wish to enable SSLv3, you can do:: + + from urllib3.util import ssl_ + context = ssl_.create_urllib3_context() + context.options &= ~ssl_.OP_NO_SSLv3 + + You can do the same to enable compression (substituting ``COMPRESSION`` + for ``SSLv3`` in the last line above). + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. + :param ciphers: + Which cipher suites to allow the server to select. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + + # Setting the default here, as we may have no ssl module on import + cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + + context.options |= options + + if getattr(context, 'supports_set_ciphers', True): # Platform-specific: Python 2.6 + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + + context.verify_mode = cert_reqs + if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 + # We do our own verification, including fingerprints and alternative + # hostnames. So disable it here + context.check_hostname = False + return context + + +def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None, ciphers=None, ssl_context=None, + ca_cert_dir=None): + """ + All arguments except for server_hostname, ssl_context, and ca_cert_dir have + the same meaning as they do when using :func:`ssl.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. This is not + supported on Python 2.6 as the ssl module does not support it. + :param ca_cert_dir: + A directory containing CA certificates in multiple separate files, as + supported by OpenSSL's -CApath flag or the capath argument to + SSLContext.load_verify_locations(). + """ + context = ssl_context + if context is None: + # Note: This branch of code and all the variables in it are no longer + # used by urllib3 itself. We should consider deprecating and removing + # this code. + context = create_urllib3_context(ssl_version, cert_reqs, + ciphers=ciphers) + + if ca_certs or ca_cert_dir: + try: + context.load_verify_locations(ca_certs, ca_cert_dir) + except IOError as e: # Platform-specific: Python 2.6, 2.7, 3.2 + raise SSLError(e) + # Py33 raises FileNotFoundError which subclasses OSError + # These are not equivalent unless we check the errno attribute + except OSError as e: # Platform-specific: Python 3.3 and beyond + if e.errno == errno.ENOENT: + raise SSLError(e) + raise + elif getattr(context, 'load_default_certs', None) is not None: + # try to load OS default certs; works well on Windows (require Python3.4+) + context.load_default_certs() + + if certfile: + context.load_cert_chain(certfile, keyfile) + if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI + return context.wrap_socket(sock, server_hostname=server_hostname) + + warnings.warn( + 'An HTTPS request has been made, but the SNI (Subject Name ' + 'Indication) extension to TLS is not available on this platform. ' + 'This may cause the server to present an incorrect TLS ' + 'certificate, which can cause validation failures. You can upgrade to ' + 'a newer version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + SNIMissingWarning + ) + return context.wrap_socket(sock) diff --git a/urllib3/util/timeout.py b/urllib3/util/timeout.py new file mode 100644 index 00000000..cec817e6 --- /dev/null +++ b/urllib3/util/timeout.py @@ -0,0 +1,242 @@ +from __future__ import absolute_import +# The default socket timeout, used by httplib to indicate that no timeout was +# specified by the user +from socket import _GLOBAL_DEFAULT_TIMEOUT +import time + +from ..exceptions import TimeoutStateError + +# A sentinel value to indicate that no timeout was specified by the user in +# urllib3 +_Default = object() + + +# Use time.monotonic if available. +current_time = getattr(time, "monotonic", time.time) + + +class Timeout(object): + """ Timeout configuration. + + Timeouts can be defined as a default for a pool:: + + timeout = Timeout(connect=2.0, read=7.0) + http = PoolManager(timeout=timeout) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``:: + + no_timeout = Timeout(connect=None, read=None) + response = http.request('GET', 'http://example.com/, timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: integer, float, or None + + :param connect: + The maximum amount of time to wait for a connection attempt to a server + to succeed. Omitting the parameter will default the connect timeout to + the system default, probably `the global default timeout in socket.py + `_. + None will set an infinite timeout for connection attempts. + + :type connect: integer, float, or None + + :param read: + The maximum amount of time to wait between consecutive + read operations for a response from the server. Omitting + the parameter will default the read timeout to the system + default, probably `the global default timeout in socket.py + `_. + None will set an infinite timeout. + + :type read: integer, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + + If your goal is to cut off any request after a set amount of wall clock + time, consider having a second "watcher" thread to cut off a slow + request. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT + + def __init__(self, total=None, connect=_Default, read=_Default): + self._connect = self._validate_timeout(connect, 'connect') + self._read = self._validate_timeout(read, 'read') + self.total = self._validate_timeout(total, 'total') + self._start_connect = None + + def __str__(self): + return '%s(connect=%r, read=%r, total=%r)' % ( + type(self).__name__, self._connect, self._read, self.total) + + @classmethod + def _validate_timeout(cls, value, name): + """ Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If it is a numeric value less than or equal to + zero, or the type is not an integer, float, or None. + """ + if value is _Default: + return cls.DEFAULT_TIMEOUT + + if value is None or value is cls.DEFAULT_TIMEOUT: + return value + + if isinstance(value, bool): + raise ValueError("Timeout cannot be a boolean value. It must " + "be an int, float or None.") + try: + float(value) + except (TypeError, ValueError): + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + try: + if value <= 0: + raise ValueError("Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than or equal to 0." % (name, value)) + except TypeError: # Python 3 + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + return value + + @classmethod + def from_float(cls, timeout): + """ Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, sentinel default object, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self): + """ Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, + total=self.total) + + def start_connect(self): + """ Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = current_time() + return self._start_connect + + def get_connect_duration(self): + """ Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError("Can't get connect duration for timer " + "that has not started.") + return current_time() - self._start_connect + + @property + def connect_timeout(self): + """ Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) + + @property + def read_timeout(self): + """ Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if (self.total is not None and + self.total is not self.DEFAULT_TIMEOUT and + self._read is not None and + self._read is not self.DEFAULT_TIMEOUT): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), + self._read)) + elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self._read diff --git a/urllib3/util/url.py b/urllib3/util/url.py new file mode 100644 index 00000000..6b6f9968 --- /dev/null +++ b/urllib3/util/url.py @@ -0,0 +1,230 @@ +from __future__ import absolute_import +from collections import namedtuple + +from ..exceptions import LocationParseError + + +url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] + +# We only want to normalize urls with an HTTP(S) scheme. +# urllib3 infers URLs without a scheme (None) to be http. +NORMALIZABLE_SCHEMES = ('http', 'https', None) + + +class Url(namedtuple('Url', url_attrs)): + """ + Datastructure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. Both the scheme and host are normalized as they are + both case-insensitive according to RFC 3986. + """ + __slots__ = () + + def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, + query=None, fragment=None): + if path and not path.startswith('/'): + path = '/' + path + if scheme: + scheme = scheme.lower() + if host and scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return super(Url, cls).__new__(cls, scheme, auth, host, port, path, + query, fragment) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or '/' + + if self.query is not None: + uri += '?' + self.query + + return uri + + @property + def netloc(self): + """Network location including host and port""" + if self.port: + return '%s:%d' % (self.host, self.port) + return self.host + + @property + def url(self): + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: :: + + >>> U = parse_url('http://google.com/mail/') + >>> U.url + 'http://google.com/mail/' + >>> Url('http', 'username:password', 'host.com', 80, + ... '/path', 'query', 'fragment').url + 'http://username:password@host.com:80/path?query#fragment' + """ + scheme, auth, host, port, path, query, fragment = self + url = '' + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + '://' + if auth is not None: + url += auth + '@' + if host is not None: + url += host + if port is not None: + url += ':' + str(port) + if path is not None: + url += path + if query is not None: + url += '?' + query + if fragment is not None: + url += '#' + fragment + + return url + + def __str__(self): + return self.url + + +def split_first(s, delims): + """ + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example:: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, '', None + + return s[:min_idx], s[min_idx + 1:], min_delim + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + + Partly backwards-compatible with :mod:`urlparse`. + + Example:: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/mail/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + + # While this code has overlap with stdlib's urlparse, it is much + # simplified for our needs and less annoying. + # Additionally, this implementations does silly things to be optimal + # on CPython. + + if not url: + # Empty + return Url() + + scheme = None + auth = None + host = None + port = None + path = None + fragment = None + query = None + + # Scheme + if '://' in url: + scheme, url = url.split('://', 1) + + # Find the earliest Authority Terminator + # (http://tools.ietf.org/html/rfc3986#section-3.2) + url, path_, delim = split_first(url, ['/', '?', '#']) + + if delim: + # Reassemble the path + path = delim + path_ + + # Auth + if '@' in url: + # Last '@' denotes end of auth part + auth, url = url.rsplit('@', 1) + + # IPv6 + if url and url[0] == '[': + host, url = url.split(']', 1) + host += ']' + + # Port + if ':' in url: + _host, port = url.split(':', 1) + + if not host: + host = _host + + if port: + # If given, ports must be integers. No whitespace, no plus or + # minus prefixes, no non-integer digits such as ^2 (superscript). + if not port.isdigit(): + raise LocationParseError(url) + try: + port = int(port) + except ValueError: + raise LocationParseError(url) + else: + # Blank ports are cool, too. (rfc3986#section-3.2.3) + port = None + + elif not host and url: + host = url + + if not path: + return Url(scheme, auth, host, port, path, query, fragment) + + # Fragment + if '#' in path: + path, fragment = path.split('#', 1) + + # Query + if '?' in path: + path, query = path.split('?', 1) + + return Url(scheme, auth, host, port, path, query, fragment) + + +def get_host(url): + """ + Deprecated. Use :func:`parse_url` instead. + """ + p = parse_url(url) + return p.scheme or 'http', p.hostname, p.port diff --git a/urllib3/util/wait.py b/urllib3/util/wait.py new file mode 100644 index 00000000..cb396e50 --- /dev/null +++ b/urllib3/util/wait.py @@ -0,0 +1,40 @@ +from .selectors import ( + HAS_SELECT, + DefaultSelector, + EVENT_READ, + EVENT_WRITE +) + + +def _wait_for_io_events(socks, events, timeout=None): + """ Waits for IO events to be available from a list of sockets + or optionally a single socket if passed in. Returns a list of + sockets that can be interacted with immediately. """ + if not HAS_SELECT: + raise ValueError('Platform does not have a selector') + if not isinstance(socks, list): + # Probably just a single socket. + if hasattr(socks, "fileno"): + socks = [socks] + # Otherwise it might be a non-list iterable. + else: + socks = list(socks) + with DefaultSelector() as selector: + for sock in socks: + selector.register(sock, events) + return [key[0].fileobj for key in + selector.select(timeout) if key[1] & events] + + +def wait_for_read(socks, timeout=None): + """ Waits for reading to be available from a list of sockets + or optionally a single socket if passed in. Returns a list of + sockets that can be read from immediately. """ + return _wait_for_io_events(socks, EVENT_READ, timeout) + + +def wait_for_write(socks, timeout=None): + """ Waits for writing to be available from a list of sockets + or optionally a single socket if passed in. Returns a list of + sockets that can be written to immediately. """ + return _wait_for_io_events(socks, EVENT_WRITE, timeout) From 2cd43a9aaf2633ab8c680531af13e7a177eea322 Mon Sep 17 00:00:00 2001 From: KulaGGin Date: Fri, 30 Mar 2018 00:54:51 +0300 Subject: [PATCH 09/85] Add files via upload Tidy columns --- GUI_FrameDataOverlay.py | 63 +++++++++++++++++++++++++++++++++++------ GUI_TekkenBotPrime.py | 2 +- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/GUI_FrameDataOverlay.py b/GUI_FrameDataOverlay.py index 7bb718a3..120a3e93 100644 --- a/GUI_FrameDataOverlay.py +++ b/GUI_FrameDataOverlay.py @@ -10,6 +10,9 @@ import GUI_Overlay from GUI_Overlay import CurrentColorScheme, ColorSchemeEnum +from collections import Counter +from pygame import mixer # Load the required library + class DataColumns(Enum): XcommX = 0 @@ -67,8 +70,27 @@ def set_columns_to_print(self, booleans_for_columns): def populate_column_names(self, booleans_for_columns): column_names = "" for i, enum in enumerate(DataColumns): + col_name = enum.name.replace('X', '') + col_len = len(col_name) + global col_max_length + col_max_length = 8 if booleans_for_columns[i]: - column_names += "|{}".format(enum.name.replace('X', ' ')) + + if col_len < col_max_length: + if col_len % 2 == 0: + needed_spaces = col_max_length - col_len + col_name = (" " * int(needed_spaces / 2)) + col_name + (" " * int(needed_spaces / 2)) + else: + needed_spaces = col_max_length - col_len + col_name = (" " * int(needed_spaces / 2)) + col_name + (" " * int(needed_spaces / 2 + 1)) + + + col_name = '|' + col_name + + + + + column_names += col_name self.set_first_column(column_names) def set_first_column(self, first_column_string): @@ -117,12 +139,36 @@ def write(self, output_str): data = data.replace('p2:', '') text_tag = 'p2' + #if int(fa) <= -14: + #mixer.init() #you must initialize the mixer + #alert=mixer.Sound('bell.wav') + #alert.play() + if '|' in output_str: out = "" for i, col in enumerate(data.split('|')): if self.columns_to_print[i]: - out += '|' + col - + col_value = col.replace(' ', '') + col_value_len = len(col_value) + + if col_value_len < col_max_length: + if col_value_len % 2 == 0: + needed_spaces = col_max_length - col_value_len + col_value = (" " * int(needed_spaces / 2)) + col_value + (" " * int(needed_spaces / 2)) + else: + needed_spaces = col_max_length - col_value_len + col_value = (" " * int(needed_spaces / 2 + 1)) + col_value + (" " * int(needed_spaces / 2)) + + #if str(fa) == str(self.columns_to_print[3]): + #mixer.init() #you must initialize the mixer + #alert=mixer.Sound('bell.wav') + #alert.play() + + out += '|' + col_value + + print("\n" + data) + + out += "\n" self.widget.configure(state="normal") self.widget.insert("end", out, text_tag) @@ -135,7 +181,7 @@ def write(self, output_str): class GUI_FrameDataOverlay(GUI_Overlay.Overlay): def __init__(self, master, launcher): - GUI_Overlay.Overlay.__init__(self, master, (1000, 86), "Tekken Bot: Frame Data Overlay") + GUI_Overlay.Overlay.__init__(self, master, (1021, 86), "Tekken Bot: Frame Data Overlay") self.show_live_framedata = self.tekken_config.get_property(GUI_Overlay.DisplaySettings.config_name(), GUI_Overlay.DisplaySettings.tiny_live_frame_data_numbers.name, True) @@ -207,8 +253,8 @@ def create_live_recovery(self, parent, col): def create_frame_advantage_label(self, col): frame_advantage_var = StringVar() frame_advantage_var.set('?') - frame_advantage_label = Label(self.toplevel, textvariable=frame_advantage_var, font=("Consolas", 44), width=4, anchor='c', - borderwidth=4, relief='ridge') + frame_advantage_label = Label(self.toplevel, textvariable=frame_advantage_var, font=("Consolas", 44), width=3, anchor='c', + borderwidth=1, relief='ridge') frame_advantage_label.grid(row=0, column=col) return frame_advantage_var, frame_advantage_label @@ -221,7 +267,7 @@ def create_attack_type_label(self, col): return attack_type_var def create_textbox(self, col): - textbox = Text(self.toplevel, font=("Consolas", 14), wrap=NONE, highlightthickness=0, pady=0, relief='flat') + textbox = Text(self.toplevel, font=("Consolas", 11), wrap=NONE, highlightthickness=0, pady=0, relief='flat') textbox.grid(row=0, column=col, rowspan=2, sticky=N + S + W + E) textbox.configure(background=self.background_color) textbox.configure(foreground=CurrentColorScheme.dict[ColorSchemeEnum.system_text]) @@ -236,6 +282,7 @@ def update_state(self): r_recovery = str(self.launcher.gameState.GetBotFramesTillNextMove() - self.launcher.gameState.GetOppFramesTillNextMove()) if not '-' in l_recovery: l_recovery = '+' + l_recovery + if not '-' in r_recovery: r_recovery = '+' + r_recovery self.l_live_recovery.set(l_recovery) @@ -247,4 +294,4 @@ def set_columns_to_print(self, columns_to_print): def update_column_to_print(self, enum, value): self.tekken_config.set_property(DataColumns.config_name(), enum.name, value) - self.write_config_file() \ No newline at end of file + self.write_config_file() diff --git a/GUI_TekkenBotPrime.py b/GUI_TekkenBotPrime.py index b3e532b1..3e86dbb6 100644 --- a/GUI_TekkenBotPrime.py +++ b/GUI_TekkenBotPrime.py @@ -191,7 +191,7 @@ def start_overlay(self): self.overlay = cio.GUI_CommandInputOverlay(self, self.launcher) self.overlay.hide() if self.mode == OverlayMode.PunishCoach: - self.overlay = pco.GUI_PunishCoachOverlay(self, self.launcher) + self.overlay = pco.GUI_PunishCoashOverlay(self, self.launcher) self.overlay.hide() if self.mode == OverlayMode.MatchupRecord: self.overlay = mso.GUI_MatchStatOverlay(self, self.launcher) From 2b958d358a0e7fdb998425c8642c333251f6b3ba Mon Sep 17 00:00:00 2001 From: KulaGGin Date: Fri, 30 Mar 2018 01:01:32 +0300 Subject: [PATCH 10/85] Update GUI_TekkenBotPrime.py Fixed a typo --- GUI_TekkenBotPrime.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI_TekkenBotPrime.py b/GUI_TekkenBotPrime.py index 3e86dbb6..b3e532b1 100644 --- a/GUI_TekkenBotPrime.py +++ b/GUI_TekkenBotPrime.py @@ -191,7 +191,7 @@ def start_overlay(self): self.overlay = cio.GUI_CommandInputOverlay(self, self.launcher) self.overlay.hide() if self.mode == OverlayMode.PunishCoach: - self.overlay = pco.GUI_PunishCoashOverlay(self, self.launcher) + self.overlay = pco.GUI_PunishCoachOverlay(self, self.launcher) self.overlay.hide() if self.mode == OverlayMode.MatchupRecord: self.overlay = mso.GUI_MatchStatOverlay(self, self.launcher) From 249b49dfc05cf70a5a3402b5dad5de01eea11229 Mon Sep 17 00:00:00 2001 From: KulaGGin Date: Fri, 30 Mar 2018 01:35:02 +0300 Subject: [PATCH 11/85] Update GUI_FrameDataOverlay.py reverted frame label width back to default --- GUI_FrameDataOverlay.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI_FrameDataOverlay.py b/GUI_FrameDataOverlay.py index 120a3e93..534be291 100644 --- a/GUI_FrameDataOverlay.py +++ b/GUI_FrameDataOverlay.py @@ -253,7 +253,7 @@ def create_live_recovery(self, parent, col): def create_frame_advantage_label(self, col): frame_advantage_var = StringVar() frame_advantage_var.set('?') - frame_advantage_label = Label(self.toplevel, textvariable=frame_advantage_var, font=("Consolas", 44), width=3, anchor='c', + frame_advantage_label = Label(self.toplevel, textvariable=frame_advantage_var, font=("Consolas", 44), width=4, anchor='c', borderwidth=1, relief='ridge') frame_advantage_label.grid(row=0, column=col) return frame_advantage_var, frame_advantage_label From 7ba7bc5bdd9e6b81b15c9f0fac89321505f04e71 Mon Sep 17 00:00:00 2001 From: KulaGGin Date: Fri, 30 Mar 2018 01:36:04 +0300 Subject: [PATCH 12/85] Update GUI_FrameDataOverlay.py --- GUI_FrameDataOverlay.py | 1 - 1 file changed, 1 deletion(-) diff --git a/GUI_FrameDataOverlay.py b/GUI_FrameDataOverlay.py index 534be291..d0238457 100644 --- a/GUI_FrameDataOverlay.py +++ b/GUI_FrameDataOverlay.py @@ -11,7 +11,6 @@ from GUI_Overlay import CurrentColorScheme, ColorSchemeEnum from collections import Counter -from pygame import mixer # Load the required library class DataColumns(Enum): From 496cddce35e8e7b73fc1cd3513ce1ef2568d29c0 Mon Sep 17 00:00:00 2001 From: KulaGGin Date: Fri, 30 Mar 2018 01:36:16 +0300 Subject: [PATCH 13/85] Update GUI_FrameDataOverlay.py --- GUI_FrameDataOverlay.py | 1 - 1 file changed, 1 deletion(-) diff --git a/GUI_FrameDataOverlay.py b/GUI_FrameDataOverlay.py index d0238457..2f9d4b91 100644 --- a/GUI_FrameDataOverlay.py +++ b/GUI_FrameDataOverlay.py @@ -12,7 +12,6 @@ from collections import Counter - class DataColumns(Enum): XcommX = 0 XidX = 1 From 72a45a33f9e48203a2fded2e1920fd6d06ba0bad Mon Sep 17 00:00:00 2001 From: KulaGGin Date: Fri, 30 Mar 2018 01:38:41 +0300 Subject: [PATCH 14/85] Update GUI_FrameDataOverlay.py --- GUI_FrameDataOverlay.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/GUI_FrameDataOverlay.py b/GUI_FrameDataOverlay.py index 2f9d4b91..e54b7d9f 100644 --- a/GUI_FrameDataOverlay.py +++ b/GUI_FrameDataOverlay.py @@ -137,11 +137,6 @@ def write(self, output_str): data = data.replace('p2:', '') text_tag = 'p2' - #if int(fa) <= -14: - #mixer.init() #you must initialize the mixer - #alert=mixer.Sound('bell.wav') - #alert.play() - if '|' in output_str: out = "" for i, col in enumerate(data.split('|')): From abb7506af600db54d905f9a94b47203e87fdb9a6 Mon Sep 17 00:00:00 2001 From: KulaGGin Date: Fri, 30 Mar 2018 01:45:33 +0300 Subject: [PATCH 15/85] Add files via upload Fixed frame label size and dependencies From 1c38ec2edf046058065578ef9fee615d52d0455e Mon Sep 17 00:00:00 2001 From: KulaGGin Date: Fri, 30 Mar 2018 01:57:54 +0300 Subject: [PATCH 16/85] Update GUI_FrameDataOverlay.py --- GUI_FrameDataOverlay.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/GUI_FrameDataOverlay.py b/GUI_FrameDataOverlay.py index e54b7d9f..800c32ea 100644 --- a/GUI_FrameDataOverlay.py +++ b/GUI_FrameDataOverlay.py @@ -151,11 +151,6 @@ def write(self, output_str): else: needed_spaces = col_max_length - col_value_len col_value = (" " * int(needed_spaces / 2 + 1)) + col_value + (" " * int(needed_spaces / 2)) - - #if str(fa) == str(self.columns_to_print[3]): - #mixer.init() #you must initialize the mixer - #alert=mixer.Sound('bell.wav') - #alert.play() out += '|' + col_value From 35e072e3bec6df765b5ff17d46467a77e6e9b69c Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 13 Apr 2018 16:45:09 +0200 Subject: [PATCH 17/85] 2018-04-13 patch addresses (by exassasinx) --- TekkenData/memory_address.ini | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index d17fe811..70c0a4d3 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,8 +1,8 @@ -;2018-03-19 patch addresses (Noctis update, timestamp 1521496706, date from https://steamdb.info/app/389730/history/) +;2018-04-13 patch addresses (1.13 matchmaking update, timestamp 1523577612, date from https://steamdb.info/app/389730/history/) ;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. [MemoryAddressOffsets] -player_data_pointer_offset = 0x033FFBC8 +player_data_pointer_offset = 0x033FCBC8 p2_data_offset = 0x6850 rollback_frame_offset = 0x1a600 ;----IGNORABLE START---- @@ -92,21 +92,21 @@ juggle_height = 0x11D8 ;Outdated ;NotUsed [NonPlayerDataAddresses] -OPPONENT_NAME = 0x033EB200 0x0 0x8 0x114 ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x033EB200 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 -P1_Movelist = 0x03400DD0 0x2E8 ;There's a pointer to this in player data block -P2_Movelist = 0x0340F800 0x2E8 +OPPONENT_NAME = 0x033E8200 0x0 0x8 0x114 ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x033E8200 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 +P1_Movelist = 0x033FDDD0 0x2E8 ;There's a pointer to this in player data block +P2_Movelist = 0x0340C800 0x2E8 ;----IGNORABLE START---- -P1_CHAR_SELECT = 0x033B7E68 0x80 0x3CC ;Alisa 19, Claudio 20 -P2_CHAR_SELECT = 0x033B7E68 0x80 0x584 -STAGE_SELECT = 0x033B7E68 0x80 0x78 +P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 +P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 +STAGE_SELECT = 0x033B4E68 0x80 0x78 ;Matchlist0_PlayerName = 0x03336410 0x2C0 0x138 ;Matchlist0_PING = 0x03336410 0x2C0 0x114 ;Matchlist0_CharId = 0x03336410 0x2C0 0x180 ;Matchlist0_Rank = 0x03336410 0x2C0 0x184 ;Matchlist0_Wins = 0x03336410 0x2C0 0x188 -WARMUP_PLAYER_NAME1 = 0x033B7408 0x50 0x0 ;OutOfDate ;look for name + opponent's name 320 bytes apart in online match -WARMUP_PLAYER_WINS1 = 0x033B7408 0x50 -0x34 -WARMUP_PLAYER_NAME2 = 0x033B7408 0x50 0x140 -WARMUP_PLAYER_WINS2 = 0x033B7408 0x50 0x10C +WARMUP_PLAYER_NAME1 = 0x033B4408 0x50 0x0 ;OutOfDate ;look for name + opponent's name 320 bytes apart in online match +WARMUP_PLAYER_WINS1 = 0x033B4408 0x50 -0x34 +WARMUP_PLAYER_NAME2 = 0x033B4408 0x50 0x140 +WARMUP_PLAYER_WINS2 = 0x033B4408 0x50 0x10C ;----IGNORABLE END---- \ No newline at end of file From 07cdf9d9d381bf067e8e92a8eebb39b9c2b5267f Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sat, 2 Jun 2018 02:14:47 +0200 Subject: [PATCH 18/85] no more requests library dependency --- VersionChecker.py | 6 +- certifi/__init__.py | 3 - certifi/__main__.py | 2 - certifi/cacert.pem | 4834 ----------- certifi/core.py | 36 - certifi/old_root.pem | 414 - certifi/weak.pem | 5248 ----------- chardet/__init__.py | 39 - chardet/big5freq.py | 386 - chardet/big5prober.py | 47 - chardet/chardistribution.py | 233 - chardet/charsetgroupprober.py | 106 - chardet/charsetprober.py | 145 - chardet/cli/__init__.py | 1 - chardet/cli/chardetect.py | 85 - chardet/codingstatemachine.py | 88 - chardet/compat.py | 34 - chardet/cp949prober.py | 49 - chardet/enums.py | 76 - chardet/escprober.py | 101 - chardet/escsm.py | 246 - chardet/eucjpprober.py | 92 - chardet/euckrfreq.py | 195 - chardet/euckrprober.py | 47 - chardet/euctwfreq.py | 387 - chardet/euctwprober.py | 46 - chardet/gb2312freq.py | 283 - chardet/gb2312prober.py | 46 - chardet/hebrewprober.py | 292 - chardet/jisfreq.py | 325 - chardet/jpcntx.py | 233 - chardet/langbulgarianmodel.py | 228 - chardet/langcyrillicmodel.py | 333 - chardet/langgreekmodel.py | 225 - chardet/langhebrewmodel.py | 200 - chardet/langhungarianmodel.py | 225 - chardet/langthaimodel.py | 199 - chardet/langturkishmodel.py | 193 - chardet/latin1prober.py | 145 - chardet/mbcharsetprober.py | 91 - chardet/mbcsgroupprober.py | 54 - chardet/mbcssm.py | 572 -- chardet/sbcharsetprober.py | 132 - chardet/sbcsgroupprober.py | 73 - chardet/sjisprober.py | 92 - chardet/universaldetector.py | 286 - chardet/utf8prober.py | 82 - chardet/version.py | 9 - idna/__init__.py | 2 - idna/codec.py | 118 - idna/compat.py | 12 - idna/core.py | 387 - idna/idnadata.py | 1585 ---- idna/intranges.py | 53 - idna/package_data.py | 2 - idna/uts46data.py | 7634 ----------------- requests/__init__.py | 121 - requests/__version__.py | 14 - requests/_internal_utils.py | 42 - requests/adapters.py | 525 -- requests/api.py | 152 - requests/auth.py | 293 - requests/certs.py | 18 - requests/compat.py | 69 - requests/cookies.py | 542 -- requests/exceptions.py | 122 - requests/help.py | 120 - requests/hooks.py | 34 - requests/models.py | 948 -- requests/packages.py | 14 - requests/sessions.py | 737 -- requests/status_codes.py | 91 - requests/structures.py | 105 - requests/utils.py | 904 -- urllib3/__init__.py | 97 - urllib3/_collections.py | 319 - urllib3/connection.py | 373 - urllib3/connectionpool.py | 905 -- urllib3/contrib/__init__.py | 0 urllib3/contrib/_securetransport/__init__.py | 0 urllib3/contrib/_securetransport/bindings.py | 593 -- urllib3/contrib/_securetransport/low_level.py | 343 - urllib3/contrib/appengine.py | 296 - urllib3/contrib/ntlmpool.py | 112 - urllib3/contrib/pyopenssl.py | 455 - urllib3/contrib/securetransport.py | 810 -- urllib3/contrib/socks.py | 188 - urllib3/exceptions.py | 246 - urllib3/fields.py | 178 - urllib3/filepost.py | 94 - urllib3/packages/__init__.py | 5 - urllib3/packages/backports/__init__.py | 0 urllib3/packages/backports/makefile.py | 53 - urllib3/packages/ordered_dict.py | 259 - urllib3/packages/six.py | 868 -- .../packages/ssl_match_hostname/__init__.py | 19 - .../ssl_match_hostname/_implementation.py | 157 - urllib3/poolmanager.py | 440 - urllib3/request.py | 148 - urllib3/response.py | 626 -- urllib3/util/__init__.py | 54 - urllib3/util/connection.py | 130 - urllib3/util/request.py | 118 - urllib3/util/response.py | 81 - urllib3/util/retry.py | 401 - urllib3/util/selectors.py | 581 -- urllib3/util/ssl_.py | 341 - urllib3/util/timeout.py | 242 - urllib3/util/url.py | 230 - urllib3/util/wait.py | 40 - 110 files changed, 3 insertions(+), 41707 deletions(-) delete mode 100644 certifi/__init__.py delete mode 100644 certifi/__main__.py delete mode 100644 certifi/cacert.pem delete mode 100644 certifi/core.py delete mode 100644 certifi/old_root.pem delete mode 100644 certifi/weak.pem delete mode 100644 chardet/__init__.py delete mode 100644 chardet/big5freq.py delete mode 100644 chardet/big5prober.py delete mode 100644 chardet/chardistribution.py delete mode 100644 chardet/charsetgroupprober.py delete mode 100644 chardet/charsetprober.py delete mode 100644 chardet/cli/__init__.py delete mode 100644 chardet/cli/chardetect.py delete mode 100644 chardet/codingstatemachine.py delete mode 100644 chardet/compat.py delete mode 100644 chardet/cp949prober.py delete mode 100644 chardet/enums.py delete mode 100644 chardet/escprober.py delete mode 100644 chardet/escsm.py delete mode 100644 chardet/eucjpprober.py delete mode 100644 chardet/euckrfreq.py delete mode 100644 chardet/euckrprober.py delete mode 100644 chardet/euctwfreq.py delete mode 100644 chardet/euctwprober.py delete mode 100644 chardet/gb2312freq.py delete mode 100644 chardet/gb2312prober.py delete mode 100644 chardet/hebrewprober.py delete mode 100644 chardet/jisfreq.py delete mode 100644 chardet/jpcntx.py delete mode 100644 chardet/langbulgarianmodel.py delete mode 100644 chardet/langcyrillicmodel.py delete mode 100644 chardet/langgreekmodel.py delete mode 100644 chardet/langhebrewmodel.py delete mode 100644 chardet/langhungarianmodel.py delete mode 100644 chardet/langthaimodel.py delete mode 100644 chardet/langturkishmodel.py delete mode 100644 chardet/latin1prober.py delete mode 100644 chardet/mbcharsetprober.py delete mode 100644 chardet/mbcsgroupprober.py delete mode 100644 chardet/mbcssm.py delete mode 100644 chardet/sbcharsetprober.py delete mode 100644 chardet/sbcsgroupprober.py delete mode 100644 chardet/sjisprober.py delete mode 100644 chardet/universaldetector.py delete mode 100644 chardet/utf8prober.py delete mode 100644 chardet/version.py delete mode 100644 idna/__init__.py delete mode 100644 idna/codec.py delete mode 100644 idna/compat.py delete mode 100644 idna/core.py delete mode 100644 idna/idnadata.py delete mode 100644 idna/intranges.py delete mode 100644 idna/package_data.py delete mode 100644 idna/uts46data.py delete mode 100644 requests/__init__.py delete mode 100644 requests/__version__.py delete mode 100644 requests/_internal_utils.py delete mode 100644 requests/adapters.py delete mode 100644 requests/api.py delete mode 100644 requests/auth.py delete mode 100644 requests/certs.py delete mode 100644 requests/compat.py delete mode 100644 requests/cookies.py delete mode 100644 requests/exceptions.py delete mode 100644 requests/help.py delete mode 100644 requests/hooks.py delete mode 100644 requests/models.py delete mode 100644 requests/packages.py delete mode 100644 requests/sessions.py delete mode 100644 requests/status_codes.py delete mode 100644 requests/structures.py delete mode 100644 requests/utils.py delete mode 100644 urllib3/__init__.py delete mode 100644 urllib3/_collections.py delete mode 100644 urllib3/connection.py delete mode 100644 urllib3/connectionpool.py delete mode 100644 urllib3/contrib/__init__.py delete mode 100644 urllib3/contrib/_securetransport/__init__.py delete mode 100644 urllib3/contrib/_securetransport/bindings.py delete mode 100644 urllib3/contrib/_securetransport/low_level.py delete mode 100644 urllib3/contrib/appengine.py delete mode 100644 urllib3/contrib/ntlmpool.py delete mode 100644 urllib3/contrib/pyopenssl.py delete mode 100644 urllib3/contrib/securetransport.py delete mode 100644 urllib3/contrib/socks.py delete mode 100644 urllib3/exceptions.py delete mode 100644 urllib3/fields.py delete mode 100644 urllib3/filepost.py delete mode 100644 urllib3/packages/__init__.py delete mode 100644 urllib3/packages/backports/__init__.py delete mode 100644 urllib3/packages/backports/makefile.py delete mode 100644 urllib3/packages/ordered_dict.py delete mode 100644 urllib3/packages/six.py delete mode 100644 urllib3/packages/ssl_match_hostname/__init__.py delete mode 100644 urllib3/packages/ssl_match_hostname/_implementation.py delete mode 100644 urllib3/poolmanager.py delete mode 100644 urllib3/request.py delete mode 100644 urllib3/response.py delete mode 100644 urllib3/util/__init__.py delete mode 100644 urllib3/util/connection.py delete mode 100644 urllib3/util/request.py delete mode 100644 urllib3/util/response.py delete mode 100644 urllib3/util/retry.py delete mode 100644 urllib3/util/selectors.py delete mode 100644 urllib3/util/ssl_.py delete mode 100644 urllib3/util/timeout.py delete mode 100644 urllib3/util/url.py delete mode 100644 urllib3/util/wait.py diff --git a/VersionChecker.py b/VersionChecker.py index 862f8fea..5328bcf5 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -1,13 +1,13 @@ -import requests +#import requests #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.9.0' +CURRENT_VERSION = 'v0.10.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.9.0' in CURRENT_VERSION: + if 'v0.10.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: diff --git a/certifi/__init__.py b/certifi/__init__.py deleted file mode 100644 index a76cd477..00000000 --- a/certifi/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .core import where, old_where - -__version__ = "2017.07.27.1" diff --git a/certifi/__main__.py b/certifi/__main__.py deleted file mode 100644 index 5f1da0dd..00000000 --- a/certifi/__main__.py +++ /dev/null @@ -1,2 +0,0 @@ -from certifi import where -print(where()) diff --git a/certifi/cacert.pem b/certifi/cacert.pem deleted file mode 100644 index 44313cb0..00000000 --- a/certifi/cacert.pem +++ /dev/null @@ -1,4834 +0,0 @@ - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Label: "GeoTrust Universal CA" -# Serial: 1 -# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 -# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 -# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Universal CA 2" -# Serial: 1 -# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 -# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 -# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Label: "Visa eCommerce Root" -# Serial: 25952180776285836048024890241505565794 -# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 -# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 -# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -# Issuer: CN=Certum CA O=Unizeto Sp. z o.o. -# Subject: CN=Certum CA O=Unizeto Sp. z o.o. -# Label: "Certum Root CA" -# Serial: 65568 -# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9 -# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18 -# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24 ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E -jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo -ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI -ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu -Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg -AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 -HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA -uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa -TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg -xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q -CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs -6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - -# Issuer: CN=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Chambers of Commerce Root" -# Serial: 0 -# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84 -# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1 -# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3 ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg -b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa -MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB -ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw -IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B -AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb -unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d -BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq -7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 -0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX -roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG -A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j -aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA -BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud -EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN -BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB -AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd -p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi -1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc -XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 -eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu -tGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Global Chambersign Root" -# Serial: 0 -# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19 -# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9 -# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo -YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 -MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy -NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G -A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA -A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 -Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s -QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV -eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 -B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh -z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T -AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i -ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH -MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD -VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE -VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B -AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM -bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi -ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG -VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c -ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ -AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Label: "XRamp Global CA Root" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Label: "StartCom Certification Authority" -# Serial: 1 -# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 -# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f -# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j -ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js -LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM -BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy -dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh -cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh -YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg -dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp -bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ -YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT -TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ -9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 -jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW -FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz -ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 -ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L -EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu -L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC -O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V -um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh -NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= ------END CERTIFICATE----- - -# Issuer: O=Government Root Certification Authority -# Subject: O=Government Root Certification Authority -# Label: "Taiwan GRCA" -# Serial: 42023070807708724159991140556527066870 -# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e -# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 -# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Label: "DST ACES CA X6" -# Serial: 17771143917277623872238992636097467865 -# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8 -# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d -# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40 ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx -ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w -MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD -VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx -FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu -ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 -gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH -fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a -ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT -ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk -c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto -dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI -hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk -QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ -h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR -rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 -9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Label: "GeoTrust Primary Certification Authority" -# Serial: 32798226551256963324313806436981982369 -# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf -# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 -# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA" -# Serial: 69529181992039203566298953787712940909 -# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 -# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 -# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" -# Serial: 33037644167568058970164719475676101450 -# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c -# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 -# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Label: "Security Communication EV RootCA1" -# Serial: 0 -# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3 -# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d -# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37 ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz -MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N -IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 -bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE -RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO -zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 -bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF -MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 -VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC -OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW -tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ -q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb -EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ -Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O -VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GA CA" -# Serial: 86718877871133159090080555911823548314 -# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 -# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 -# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: CN=T\xdcB\u0130TAK UEKAE K\xf6k Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 - S\xfcr\xfcm 3 O=T\xfcrkiye Bilimsel ve Teknolojik Ara\u015ft\u0131rma Kurumu - T\xdcB\u0130TAK OU=Ulusal Elektronik ve Kriptoloji Ara\u015ft\u0131rma Enstit\xfcs\xfc - UEKAE/Kamu Sertifikasyon Merkezi -# Subject: CN=T\xdcB\u0130TAK UEKAE K\xf6k Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 - S\xfcr\xfcm 3 O=T\xfcrkiye Bilimsel ve Teknolojik Ara\u015ft\u0131rma Kurumu - T\xdcB\u0130TAK OU=Ulusal Elektronik ve Kriptoloji Ara\u015ft\u0131rma Enstit\xfcs\xfc - UEKAE/Kamu Sertifikasyon Merkezi -# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3" -# Serial: 17 -# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26 -# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96 -# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS -MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp -bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw -VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy -YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy -dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe -Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx -GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls -aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU -QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh -xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 -aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr -IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h -gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK -O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO -fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw -lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID -AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP -NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t -wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM -7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh -gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n -oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs -yZyQ2uypQjyttgI= ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G3" -# Serial: 28809105769928564313984085209975885599 -# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 -# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd -# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G2" -# Serial: 71758320672825410020661621085256472406 -# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f -# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 -# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G3" -# Serial: 127614157056681299805556476275995414779 -# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 -# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 -# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" -# Serial: 63143484348153506665311985501458640051 -# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 -# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a -# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=ACEDICOM Root O=EDICOM OU=PKI -# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI -# Label: "ACEDICOM Root" -# Serial: 7029493972724711941 -# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6 -# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84 -# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a ------BEGIN CERTIFICATE----- -MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE -AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x -CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW -MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF -RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC -AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 -09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 -XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P -Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK -t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb -X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 -MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU -fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI -2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH -K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae -ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP -BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ -MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw -RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv -bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm -fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 -gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe -I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i -5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi -ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn -MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ -o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 -zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN -GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt -r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK -Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Autorit\xe9 Racine O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Autorit\xe9 Racine O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Autorit\xe9 Racine" -# Serial: 1 -# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a -# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3 -# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17 ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk -BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 -Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl -cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 -aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY -F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N -8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe -rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K -/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu -7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC -28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 -lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E -nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB -0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 -5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj -WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN -jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s -ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM -OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q -619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn -2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj -o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v -nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG -5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq -pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb -dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 -BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Label: "StartCom Certification Authority" -# Serial: 45 -# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 -# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 -# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 ------BEGIN CERTIFICATE----- -MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul -F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC -ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w -ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk -aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 -YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg -c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 -d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG -CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF -wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS -Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst -0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc -pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl -CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF -P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK -1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm -KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE -JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ -8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm -fyWl8kgAwKQB2j8= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. -# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. -# Label: "StartCom Certification Authority G2" -# Serial: 59 -# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 -# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 -# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 ------BEGIN CERTIFICATE----- -MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 -OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG -A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ -JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD -vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo -D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ -Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW -RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK -HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN -nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM -0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i -UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 -Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg -TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL -BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K -2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX -UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl -6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK -9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ -HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI -wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY -XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l -IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo -hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr -so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Label: "EE Certification Centre Root CA" -# Serial: 112324828676200291871926431888494945866 -# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f -# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 -# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 -czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG -CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy -MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl -ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS -b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy -euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO -bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw -WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d -MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE -1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ -zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF -BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV -v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG -E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW -iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v -GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= ------END CERTIFICATE----- - -# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. (c) Aral\u0131k 2007 -# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. (c) Aral\u0131k 2007 -# Label: "TURKTRUST Certificate Services Provider Root 2007" -# Serial: 1 -# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72 -# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33 -# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50 ------BEGIN CERTIFICATE----- -MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS -S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg -SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx -OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry -b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC -VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE -sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F -ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY -KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG -+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG -HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P -IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M -733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk -Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW -AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I -aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 -mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa -XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ -qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica -# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT -# Label: "PSCProcert" -# Serial: 11 -# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec -# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74 -# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0 ------BEGIN CERTIFICATE----- -MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s -YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz -dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 -aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh -IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ -KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw -MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy -b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx -KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG -A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u -aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 -7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 -BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G -ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 -JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 -PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 -0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH -0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ -6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m -v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 -K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev -bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw -MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w -MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD -gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 -b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh -bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 -cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp -ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg -ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq -hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD -AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w -MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag -RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t -UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl -cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v -Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG -AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN -AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS -1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB -3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv -Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh -HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm -pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz -sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE -qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb -mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 -opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H -YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R1 O=Disig a.s. -# Subject: CN=CA Disig Root R1 O=Disig a.s. -# Label: "CA Disig Root R1" -# Serial: 14052245610670616104 -# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a -# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6 -# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy -MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk -D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o -OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A -fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe -IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n -oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK -/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj -rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD -3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE -7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC -yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd -qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI -hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR -xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA -SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo -HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB -emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC -AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb -7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x -DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk -F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF -a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT -Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=Certification Authority of WoSign O=WoSign CA Limited -# Subject: CN=Certification Authority of WoSign O=WoSign CA Limited -# Label: "WoSign" -# Serial: 125491772294754854453622855443212256657 -# MD5 Fingerprint: a1:f2:f9:b5:d2:c8:7a:74:b8:f3:05:f1:d7:e1:84:8d -# SHA1 Fingerprint: b9:42:94:bf:91:ea:8f:b6:4b:e6:10:97:c7:fb:00:13:59:b6:76:cb -# SHA256 Fingerprint: 4b:22:d5:a6:ae:c9:9f:3c:db:79:aa:5e:c0:68:38:47:9c:d5:ec:ba:71:64:f7:f2:2d:c1:d6:5f:63:d8:57:08 ------BEGIN CERTIFICATE----- -MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBV -MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV -BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw -MTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX -b1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvcqN -rLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1U -fcIiePyOCbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcScc -f+Hb0v1naMQFXQoOXXDX2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2 -ZjC1vt7tj/id07sBMOby8w7gLJKA84X5KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4M -x1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR+ScPewavVIMYe+HdVHpR -aG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ezEC8wQjch -zDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDar -uHqklWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221K -mYo0SLwX3OSACCK28jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvA -Sh0JWzko/amrzgD5LkhLJuYwTKVYyrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWv -HYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0CAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R8bNLtwYgFP6H -EtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 -LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJ -MuYhOZO9sxXqT2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2e -JXLOC62qx1ViC777Y7NhRCOjy+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VN -g64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC2nz4SNAzqfkHx5Xh9T71XXG68pWp -dIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes5cVAWubXbHssw1ab -R80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/EaEQ -PkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGce -xGATVdVhmVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+ -J7x6v+Db9NpSvd4MVHAxkUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMl -OtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGikpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWT -ee5Ehr7XHuQe+w== ------END CERTIFICATE----- - -# Issuer: CN=CA \u6c83\u901a\u6839\u8bc1\u4e66 O=WoSign CA Limited -# Subject: CN=CA \u6c83\u901a\u6839\u8bc1\u4e66 O=WoSign CA Limited -# Label: "WoSign China" -# Serial: 106921963437422998931660691310149453965 -# MD5 Fingerprint: 78:83:5b:52:16:76:c4:24:3b:83:78:e8:ac:da:9a:93 -# SHA1 Fingerprint: 16:32:47:8d:89:f9:21:3a:92:00:85:63:f5:a4:a7:d3:12:40:8a:d6 -# SHA256 Fingerprint: d6:f0:34:bd:94:aa:23:3f:02:97:ec:a4:24:5b:28:39:73:e4:47:aa:59:0f:31:0c:77:f4:8f:df:83:11:22:54 ------BEGIN CERTIFICATE----- -MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBG -MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNV -BAMMEkNBIOayg+mAmuagueivgeS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgw -MTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRl -ZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k8H/r -D195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld1 -9AXbbQs5uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExf -v5RxadmWPgxDT74wwJ85dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnk -UkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+L -NVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFyb7Ao65vh4YOhn0pdr8yb -+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc76DbT52V -qyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6K -yX2m+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0G -AbQOXDBGVWCvOGU6yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaK -J/kR8slC/k7e3x9cxKSGhxYzoacXGKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwEC -AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUAA4ICAQBqinA4 -WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 -yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj -/feTZU7n85iYr83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6 -jBAyvd0zaziGfjk9DgNyp115j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2 -ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0AkLppRQjbbpCBhqcqBT/mhDn4t/lX -X0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97qA4bLJyuQHCH2u2n -FoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Yjj4D -u9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10l -O1Hm13ZBONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Le -ie2uPAmvylezkolwQOQvT8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR1 -2KvxAmLBsX5VYc8T1yaw15zLKYs4SgsOkI26oQ== ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 14367148294922964480859022125800977897474 -# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e -# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb -# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G3" -# Serial: 10003001 -# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 -# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc -# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX -DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP -cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW -IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX -xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy -KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR -9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az -5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 -6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 -Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP -bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt -BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt -XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd -INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp -LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 -Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp -gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh -/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw -0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A -fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq -4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR -1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ -QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM -94B7IWcnMFk= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden EV Root CA" -# Serial: 10000013 -# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba -# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb -# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. -# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. -# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" -# Serial: 156233699172481 -# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e -# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb -# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 ------BEGIN CERTIFICATE----- -MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE -BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn -aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg -QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg -SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 -MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD -VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom -/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR -Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 -4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z -5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 -hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID -AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX -SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l -VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq -URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf -peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF -Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW -+qtB4Uu2NQvAmxU= ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Root CA" -# Serial: 1 -# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f -# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 -# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 ------BEGIN CERTIFICATE----- -MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb -BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz -MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx -FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g -Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 -fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl -LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV -WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF -TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb -5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc -CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri -wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ -wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG -m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 -F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng -WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 -2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF -AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ -0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw -F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS -g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj -qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN -h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ -ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V -btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj -Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ -8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW -gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=Certification Authority of WoSign G2 O=WoSign CA Limited -# Subject: CN=Certification Authority of WoSign G2 O=WoSign CA Limited -# Label: "Certification Authority of WoSign G2" -# Serial: 142423943073812161787490648904721057092 -# MD5 Fingerprint: c8:1c:7d:19:aa:cb:71:93:f2:50:f8:52:a8:1e:ba:60 -# SHA1 Fingerprint: fb:ed:dc:90:65:b7:27:20:37:bc:55:0c:9c:56:de:bb:f2:78:94:e1 -# SHA256 Fingerprint: d4:87:a5:6f:83:b0:74:82:e8:5e:96:33:94:c1:ec:c2:c9:e5:1d:09:03:ee:94:6b:02:c3:01:58:1e:d9:9e:16 ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBY -MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNV -BAMTJENlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDEx -MDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgxCzAJBgNVBAYTAkNOMRowGAYDVQQK -ExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPX -JYY1kBaiXW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgO -gHzKtB0TiGsOqCR3A9DuW/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg -5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg95k4ot+vElbGs/V6r+kHLXZ1L3PR8du9n -fwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BKv0mUYQs4kI9dJGwlezt5 -2eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJ -KoZIhvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8 -fHulwqZm46qwtyeYP0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G -3CE4Q3RM+zD4F3LBMvzIkRfEzFg3TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yy -SrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu+sif/a+RZQp4OBXllxcU3fng -LDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+7Q9LGOHSJDy7 -XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= ------END CERTIFICATE----- - -# Issuer: CN=CA WoSign ECC Root O=WoSign CA Limited -# Subject: CN=CA WoSign ECC Root O=WoSign CA Limited -# Label: "CA WoSign ECC Root" -# Serial: 138625735294506723296996289575837012112 -# MD5 Fingerprint: 80:c6:53:ee:61:82:28:72:f0:ff:21:b9:17:ca:b2:20 -# SHA1 Fingerprint: d2:7a:d2:be:ed:94:c0:a1:3c:c7:25:21:ea:5d:71:be:81:19:f3:2b -# SHA256 Fingerprint: 8b:45:da:1c:06:f7:91:eb:0c:ab:f2:6b:e5:88:f5:fb:23:16:5c:2e:61:4b:f8:85:56:2d:0d:ce:50:b2:9b:02 ------BEGIN CERTIFICATE----- -MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQsw -CQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMT -EkNBIFdvU2lnbiBFQ0MgUm9vdDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4 -NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEb -MBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZIzj0CAQYFK4EEACID -YgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiUt5v8 -KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES -1ns2o0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUqv3VWqP2h4syhf3RMluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB -1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0Daupn75OcsqF1NnstTJFGG+rrQIwfcf3 -aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYua/GRspBl9JrmkO5K ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=Certplus Root CA G1 O=Certplus -# Subject: CN=Certplus Root CA G1 O=Certplus -# Label: "Certplus Root CA G1" -# Serial: 1491911565779898356709731176965615564637713 -# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 -# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 -# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a -iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt -6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP -0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f -6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE -EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN -1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc -h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT -mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV -4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO -WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud -DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd -Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq -hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh -66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 -/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS -S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j -2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R -Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr -RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy -6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV -V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 -g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl -++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= ------END CERTIFICATE----- - -# Issuer: CN=Certplus Root CA G2 O=Certplus -# Subject: CN=Certplus Root CA G2 O=Certplus -# Label: "Certplus Root CA G2" -# Serial: 1492087096131536844209563509228951875861589 -# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 -# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a -# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 ------BEGIN CERTIFICATE----- -MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat -93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x -Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P -AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj -FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG -SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch -p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal -U5ORGpOucGpnutee5WEaXw== ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust -# Subject: CN=OpenTrust Root CA G1 O=OpenTrust -# Label: "OpenTrust Root CA G1" -# Serial: 1492036577811947013770400127034825178844775 -# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da -# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e -# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b -wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX -/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 -77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP -uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx -p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx -Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 -TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W -G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw -vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY -EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 -2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw -DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E -PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf -gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS -FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 -V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P -XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I -i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t -TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 -09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky -Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ -AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj -1oxx ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust -# Subject: CN=OpenTrust Root CA G2 O=OpenTrust -# Label: "OpenTrust Root CA G2" -# Serial: 1492012448042702096986875987676935573415441 -# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb -# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b -# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh -/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e -CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 -1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE -FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS -gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X -G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy -YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH -vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 -t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ -gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 -5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w -DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz -Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 -nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT -RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT -wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 -t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa -TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 -o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU -3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA -iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f -WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM -S1IK ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust -# Subject: CN=OpenTrust Root CA G3 O=OpenTrust -# Label: "OpenTrust Root CA G3" -# Serial: 1492104908271485653071219941864171170455615 -# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 -# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 -# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 ------BEGIN CERTIFICATE----- -MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx -CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U -cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow -QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl -blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm -3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d -oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G -A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 -DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK -BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q -j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx -4nxp5V2a+EEfOzmTk51V6s2N8fvB ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Label: "LuxTrust Global Root 2" -# Serial: 59914338225734147123941058376788110305822489521 -# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c -# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f -# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- diff --git a/certifi/core.py b/certifi/core.py deleted file mode 100644 index f41d3fd1..00000000 --- a/certifi/core.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -certifi.py -~~~~~~~~~~ - -This module returns the installation location of cacert.pem. -""" -import os -import warnings - - -class DeprecatedBundleWarning(DeprecationWarning): - """ - The weak security bundle is being deprecated. Please bother your service - provider to get them to stop using cross-signed roots. - """ - - -def where(): - f = os.path.dirname(__file__) - - return os.path.join(f, 'cacert.pem') - - -def old_where(): - warnings.warn( - "The weak security bundle is being deprecated.", - DeprecatedBundleWarning - ) - f = os.path.dirname(__file__) - return os.path.join(f, 'weak.pem') - -if __name__ == '__main__': - print(where()) diff --git a/certifi/old_root.pem b/certifi/old_root.pem deleted file mode 100644 index af30ea71..00000000 --- a/certifi/old_root.pem +++ /dev/null @@ -1,414 +0,0 @@ -# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Secure Server CA" -# Serial: 927650371 -# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee -# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 -# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Label: "ValiCert Class 2 VA" -# Serial: 1 -# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 -# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 -# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- - -# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Express (Class C) Root" -# Serial: 104 -# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 -# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b -# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Business (Class B) Root" -# Serial: 105 -# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 -# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af -# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Label: "RSA Root Certificate 1" -# Serial: 1 -# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 -# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb -# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Label: "ValiCert Class 1 VA" -# Serial: 1 -# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb -# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e -# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure eBusiness CA 1" -# Serial: 4 -# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d -# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 -# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure Global eBusiness CA" -# Serial: 1 -# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc -# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 -# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Premium Server CA" -# Serial: 1 -# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a -# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a -# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Server CA" -# Serial: 1 -# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d -# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c -# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 149843929435818692848040365716851702463 -# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 -# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 -# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 80507572722862485515306429940691309246 -# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 -# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b -# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Label: "Verisign Class 3 Public Primary Certification Authority - G2" -# Serial: 167285380242319648451154478808036881606 -# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 -# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f -# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- - -# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Label: "GTE CyberTrust Global Root" -# Serial: 421 -# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db -# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 -# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -# Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Label: "Equifax Secure Certificate Authority" -# Serial: 903804111 -# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 -# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a -# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- diff --git a/certifi/weak.pem b/certifi/weak.pem deleted file mode 100644 index 380c5233..00000000 --- a/certifi/weak.pem +++ /dev/null @@ -1,5248 +0,0 @@ - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Label: "GeoTrust Universal CA" -# Serial: 1 -# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 -# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 -# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Universal CA 2" -# Serial: 1 -# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 -# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 -# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Label: "Visa eCommerce Root" -# Serial: 25952180776285836048024890241505565794 -# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 -# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 -# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -# Issuer: CN=Certum CA O=Unizeto Sp. z o.o. -# Subject: CN=Certum CA O=Unizeto Sp. z o.o. -# Label: "Certum Root CA" -# Serial: 65568 -# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9 -# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18 -# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24 ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E -jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo -ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI -ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu -Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg -AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 -HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA -uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa -TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg -xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q -CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs -6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - -# Issuer: CN=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Chambers of Commerce Root" -# Serial: 0 -# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84 -# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1 -# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3 ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg -b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa -MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB -ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw -IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B -AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb -unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d -BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq -7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 -0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX -roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG -A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j -aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA -BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud -EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN -BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB -AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd -p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi -1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc -XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 -eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu -tGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Global Chambersign Root" -# Serial: 0 -# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19 -# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9 -# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo -YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 -MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy -NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G -A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA -A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 -Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s -QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV -eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 -B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh -z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T -AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i -ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH -MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD -VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE -VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B -AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM -bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi -ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG -VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c -ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ -AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Label: "XRamp Global CA Root" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Label: "StartCom Certification Authority" -# Serial: 1 -# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 -# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f -# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j -ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js -LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM -BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy -dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh -cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh -YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg -dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp -bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ -YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT -TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ -9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 -jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW -FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz -ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 -ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L -EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu -L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC -O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V -um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh -NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= ------END CERTIFICATE----- - -# Issuer: O=Government Root Certification Authority -# Subject: O=Government Root Certification Authority -# Label: "Taiwan GRCA" -# Serial: 42023070807708724159991140556527066870 -# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e -# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 -# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Label: "DST ACES CA X6" -# Serial: 17771143917277623872238992636097467865 -# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8 -# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d -# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40 ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx -ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w -MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD -VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx -FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu -ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 -gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH -fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a -ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT -ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk -c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto -dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI -hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk -QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ -h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR -rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 -9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Label: "GeoTrust Primary Certification Authority" -# Serial: 32798226551256963324313806436981982369 -# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf -# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 -# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA" -# Serial: 69529181992039203566298953787712940909 -# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 -# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 -# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" -# Serial: 33037644167568058970164719475676101450 -# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c -# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 -# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Label: "Security Communication EV RootCA1" -# Serial: 0 -# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3 -# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d -# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37 ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz -MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N -IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 -bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE -RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO -zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 -bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF -MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 -VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC -OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW -tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ -q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb -EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ -Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O -VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GA CA" -# Serial: 86718877871133159090080555911823548314 -# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 -# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 -# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: CN=T\xdcB\u0130TAK UEKAE K\xf6k Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 - S\xfcr\xfcm 3 O=T\xfcrkiye Bilimsel ve Teknolojik Ara\u015ft\u0131rma Kurumu - T\xdcB\u0130TAK OU=Ulusal Elektronik ve Kriptoloji Ara\u015ft\u0131rma Enstit\xfcs\xfc - UEKAE/Kamu Sertifikasyon Merkezi -# Subject: CN=T\xdcB\u0130TAK UEKAE K\xf6k Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 - S\xfcr\xfcm 3 O=T\xfcrkiye Bilimsel ve Teknolojik Ara\u015ft\u0131rma Kurumu - T\xdcB\u0130TAK OU=Ulusal Elektronik ve Kriptoloji Ara\u015ft\u0131rma Enstit\xfcs\xfc - UEKAE/Kamu Sertifikasyon Merkezi -# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3" -# Serial: 17 -# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26 -# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96 -# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS -MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp -bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw -VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy -YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy -dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe -Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx -GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls -aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU -QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh -xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 -aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr -IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h -gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK -O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO -fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw -lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID -AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP -NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t -wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM -7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh -gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n -oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs -yZyQ2uypQjyttgI= ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G3" -# Serial: 28809105769928564313984085209975885599 -# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 -# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd -# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G2" -# Serial: 71758320672825410020661621085256472406 -# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f -# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 -# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G3" -# Serial: 127614157056681299805556476275995414779 -# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 -# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 -# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" -# Serial: 63143484348153506665311985501458640051 -# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 -# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a -# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=ACEDICOM Root O=EDICOM OU=PKI -# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI -# Label: "ACEDICOM Root" -# Serial: 7029493972724711941 -# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6 -# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84 -# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a ------BEGIN CERTIFICATE----- -MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE -AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x -CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW -MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF -RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC -AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 -09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 -XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P -Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK -t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb -X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 -MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU -fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI -2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH -K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae -ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP -BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ -MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw -RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv -bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm -fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 -gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe -I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i -5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi -ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn -MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ -o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 -zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN -GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt -r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK -Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Autorit\xe9 Racine O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Autorit\xe9 Racine O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Autorit\xe9 Racine" -# Serial: 1 -# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a -# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3 -# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17 ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk -BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 -Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl -cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 -aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY -F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N -8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe -rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K -/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu -7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC -28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 -lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E -nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB -0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 -5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj -WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN -jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s -ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM -OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q -619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn -2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj -o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v -nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG -5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq -pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb -dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 -BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Label: "StartCom Certification Authority" -# Serial: 45 -# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 -# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 -# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 ------BEGIN CERTIFICATE----- -MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul -F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC -ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w -ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk -aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 -YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg -c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 -d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG -CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF -wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS -Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst -0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc -pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl -CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF -P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK -1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm -KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE -JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ -8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm -fyWl8kgAwKQB2j8= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. -# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. -# Label: "StartCom Certification Authority G2" -# Serial: 59 -# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 -# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 -# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 ------BEGIN CERTIFICATE----- -MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 -OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG -A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ -JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD -vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo -D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ -Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW -RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK -HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN -nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM -0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i -UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 -Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg -TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL -BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K -2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX -UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl -6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK -9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ -HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI -wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY -XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l -IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo -hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr -so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Label: "EE Certification Centre Root CA" -# Serial: 112324828676200291871926431888494945866 -# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f -# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 -# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 -czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG -CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy -MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl -ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS -b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy -euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO -bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw -WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d -MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE -1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ -zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF -BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV -v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG -E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW -iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v -GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= ------END CERTIFICATE----- - -# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. (c) Aral\u0131k 2007 -# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. (c) Aral\u0131k 2007 -# Label: "TURKTRUST Certificate Services Provider Root 2007" -# Serial: 1 -# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72 -# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33 -# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50 ------BEGIN CERTIFICATE----- -MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS -S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg -SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx -OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry -b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC -VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE -sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F -ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY -KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG -+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG -HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P -IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M -733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk -Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW -AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I -aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 -mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa -XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ -qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica -# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT -# Label: "PSCProcert" -# Serial: 11 -# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec -# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74 -# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0 ------BEGIN CERTIFICATE----- -MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s -YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz -dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 -aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh -IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ -KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw -MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy -b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx -KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG -A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u -aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 -7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 -BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G -ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 -JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 -PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 -0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH -0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ -6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m -v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 -K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev -bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw -MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w -MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD -gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 -b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh -bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 -cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp -ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg -ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq -hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD -AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w -MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag -RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t -UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl -cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v -Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG -AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN -AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS -1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB -3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv -Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh -HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm -pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz -sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE -qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb -mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 -opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H -YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R1 O=Disig a.s. -# Subject: CN=CA Disig Root R1 O=Disig a.s. -# Label: "CA Disig Root R1" -# Serial: 14052245610670616104 -# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a -# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6 -# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy -MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk -D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o -OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A -fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe -IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n -oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK -/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj -rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD -3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE -7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC -yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd -qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI -hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR -xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA -SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo -HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB -emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC -AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb -7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x -DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk -F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF -a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT -Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=Certification Authority of WoSign O=WoSign CA Limited -# Subject: CN=Certification Authority of WoSign O=WoSign CA Limited -# Label: "WoSign" -# Serial: 125491772294754854453622855443212256657 -# MD5 Fingerprint: a1:f2:f9:b5:d2:c8:7a:74:b8:f3:05:f1:d7:e1:84:8d -# SHA1 Fingerprint: b9:42:94:bf:91:ea:8f:b6:4b:e6:10:97:c7:fb:00:13:59:b6:76:cb -# SHA256 Fingerprint: 4b:22:d5:a6:ae:c9:9f:3c:db:79:aa:5e:c0:68:38:47:9c:d5:ec:ba:71:64:f7:f2:2d:c1:d6:5f:63:d8:57:08 ------BEGIN CERTIFICATE----- -MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBV -MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV -BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw -MTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX -b1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvcqN -rLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1U -fcIiePyOCbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcScc -f+Hb0v1naMQFXQoOXXDX2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2 -ZjC1vt7tj/id07sBMOby8w7gLJKA84X5KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4M -x1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR+ScPewavVIMYe+HdVHpR -aG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ezEC8wQjch -zDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDar -uHqklWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221K -mYo0SLwX3OSACCK28jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvA -Sh0JWzko/amrzgD5LkhLJuYwTKVYyrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWv -HYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0CAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R8bNLtwYgFP6H -EtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 -LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJ -MuYhOZO9sxXqT2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2e -JXLOC62qx1ViC777Y7NhRCOjy+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VN -g64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC2nz4SNAzqfkHx5Xh9T71XXG68pWp -dIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes5cVAWubXbHssw1ab -R80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/EaEQ -PkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGce -xGATVdVhmVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+ -J7x6v+Db9NpSvd4MVHAxkUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMl -OtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGikpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWT -ee5Ehr7XHuQe+w== ------END CERTIFICATE----- - -# Issuer: CN=CA \u6c83\u901a\u6839\u8bc1\u4e66 O=WoSign CA Limited -# Subject: CN=CA \u6c83\u901a\u6839\u8bc1\u4e66 O=WoSign CA Limited -# Label: "WoSign China" -# Serial: 106921963437422998931660691310149453965 -# MD5 Fingerprint: 78:83:5b:52:16:76:c4:24:3b:83:78:e8:ac:da:9a:93 -# SHA1 Fingerprint: 16:32:47:8d:89:f9:21:3a:92:00:85:63:f5:a4:a7:d3:12:40:8a:d6 -# SHA256 Fingerprint: d6:f0:34:bd:94:aa:23:3f:02:97:ec:a4:24:5b:28:39:73:e4:47:aa:59:0f:31:0c:77:f4:8f:df:83:11:22:54 ------BEGIN CERTIFICATE----- -MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBG -MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNV -BAMMEkNBIOayg+mAmuagueivgeS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgw -MTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRl -ZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k8H/r -D195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld1 -9AXbbQs5uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExf -v5RxadmWPgxDT74wwJ85dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnk -UkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+L -NVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFyb7Ao65vh4YOhn0pdr8yb -+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc76DbT52V -qyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6K -yX2m+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0G -AbQOXDBGVWCvOGU6yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaK -J/kR8slC/k7e3x9cxKSGhxYzoacXGKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwEC -AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUAA4ICAQBqinA4 -WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 -yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj -/feTZU7n85iYr83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6 -jBAyvd0zaziGfjk9DgNyp115j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2 -ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0AkLppRQjbbpCBhqcqBT/mhDn4t/lX -X0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97qA4bLJyuQHCH2u2n -FoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Yjj4D -u9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10l -O1Hm13ZBONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Le -ie2uPAmvylezkolwQOQvT8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR1 -2KvxAmLBsX5VYc8T1yaw15zLKYs4SgsOkI26oQ== ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 14367148294922964480859022125800977897474 -# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e -# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb -# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G3" -# Serial: 10003001 -# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 -# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc -# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX -DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP -cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW -IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX -xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy -KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR -9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az -5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 -6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 -Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP -bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt -BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt -XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd -INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp -LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 -Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp -gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh -/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw -0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A -fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq -4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR -1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ -QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM -94B7IWcnMFk= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden EV Root CA" -# Serial: 10000013 -# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba -# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb -# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. -# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. -# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" -# Serial: 156233699172481 -# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e -# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb -# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 ------BEGIN CERTIFICATE----- -MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE -BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn -aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg -QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg -SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 -MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD -VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom -/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR -Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 -4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z -5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 -hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID -AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX -SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l -VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq -URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf -peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF -Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW -+qtB4Uu2NQvAmxU= ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Root CA" -# Serial: 1 -# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f -# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 -# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 ------BEGIN CERTIFICATE----- -MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb -BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz -MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx -FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g -Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 -fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl -LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV -WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF -TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb -5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc -CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri -wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ -wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG -m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 -F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng -WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 -2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF -AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ -0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw -F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS -g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj -qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN -h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ -ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V -btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj -Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ -8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW -gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=Certification Authority of WoSign G2 O=WoSign CA Limited -# Subject: CN=Certification Authority of WoSign G2 O=WoSign CA Limited -# Label: "Certification Authority of WoSign G2" -# Serial: 142423943073812161787490648904721057092 -# MD5 Fingerprint: c8:1c:7d:19:aa:cb:71:93:f2:50:f8:52:a8:1e:ba:60 -# SHA1 Fingerprint: fb:ed:dc:90:65:b7:27:20:37:bc:55:0c:9c:56:de:bb:f2:78:94:e1 -# SHA256 Fingerprint: d4:87:a5:6f:83:b0:74:82:e8:5e:96:33:94:c1:ec:c2:c9:e5:1d:09:03:ee:94:6b:02:c3:01:58:1e:d9:9e:16 ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBY -MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNV -BAMTJENlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDEx -MDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgxCzAJBgNVBAYTAkNOMRowGAYDVQQK -ExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPX -JYY1kBaiXW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgO -gHzKtB0TiGsOqCR3A9DuW/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg -5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg95k4ot+vElbGs/V6r+kHLXZ1L3PR8du9n -fwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BKv0mUYQs4kI9dJGwlezt5 -2eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJ -KoZIhvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8 -fHulwqZm46qwtyeYP0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G -3CE4Q3RM+zD4F3LBMvzIkRfEzFg3TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yy -SrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu+sif/a+RZQp4OBXllxcU3fng -LDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+7Q9LGOHSJDy7 -XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= ------END CERTIFICATE----- - -# Issuer: CN=CA WoSign ECC Root O=WoSign CA Limited -# Subject: CN=CA WoSign ECC Root O=WoSign CA Limited -# Label: "CA WoSign ECC Root" -# Serial: 138625735294506723296996289575837012112 -# MD5 Fingerprint: 80:c6:53:ee:61:82:28:72:f0:ff:21:b9:17:ca:b2:20 -# SHA1 Fingerprint: d2:7a:d2:be:ed:94:c0:a1:3c:c7:25:21:ea:5d:71:be:81:19:f3:2b -# SHA256 Fingerprint: 8b:45:da:1c:06:f7:91:eb:0c:ab:f2:6b:e5:88:f5:fb:23:16:5c:2e:61:4b:f8:85:56:2d:0d:ce:50:b2:9b:02 ------BEGIN CERTIFICATE----- -MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQsw -CQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMT -EkNBIFdvU2lnbiBFQ0MgUm9vdDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4 -NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEb -MBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZIzj0CAQYFK4EEACID -YgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiUt5v8 -KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES -1ns2o0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUqv3VWqP2h4syhf3RMluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB -1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0Daupn75OcsqF1NnstTJFGG+rrQIwfcf3 -aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYua/GRspBl9JrmkO5K ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=Certplus Root CA G1 O=Certplus -# Subject: CN=Certplus Root CA G1 O=Certplus -# Label: "Certplus Root CA G1" -# Serial: 1491911565779898356709731176965615564637713 -# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 -# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 -# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a -iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt -6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP -0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f -6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE -EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN -1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc -h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT -mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV -4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO -WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud -DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd -Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq -hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh -66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 -/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS -S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j -2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R -Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr -RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy -6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV -V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 -g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl -++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= ------END CERTIFICATE----- - -# Issuer: CN=Certplus Root CA G2 O=Certplus -# Subject: CN=Certplus Root CA G2 O=Certplus -# Label: "Certplus Root CA G2" -# Serial: 1492087096131536844209563509228951875861589 -# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 -# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a -# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 ------BEGIN CERTIFICATE----- -MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat -93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x -Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P -AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj -FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG -SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch -p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal -U5ORGpOucGpnutee5WEaXw== ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust -# Subject: CN=OpenTrust Root CA G1 O=OpenTrust -# Label: "OpenTrust Root CA G1" -# Serial: 1492036577811947013770400127034825178844775 -# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da -# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e -# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b -wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX -/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 -77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP -uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx -p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx -Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 -TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W -G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw -vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY -EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 -2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw -DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E -PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf -gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS -FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 -V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P -XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I -i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t -TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 -09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky -Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ -AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj -1oxx ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust -# Subject: CN=OpenTrust Root CA G2 O=OpenTrust -# Label: "OpenTrust Root CA G2" -# Serial: 1492012448042702096986875987676935573415441 -# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb -# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b -# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh -/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e -CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 -1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE -FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS -gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X -G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy -YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH -vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 -t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ -gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 -5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w -DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz -Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 -nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT -RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT -wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 -t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa -TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 -o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU -3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA -iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f -WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM -S1IK ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust -# Subject: CN=OpenTrust Root CA G3 O=OpenTrust -# Label: "OpenTrust Root CA G3" -# Serial: 1492104908271485653071219941864171170455615 -# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 -# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 -# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 ------BEGIN CERTIFICATE----- -MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx -CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U -cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow -QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl -blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm -3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d -oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G -A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 -DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK -BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q -j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx -4nxp5V2a+EEfOzmTk51V6s2N8fvB ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Label: "LuxTrust Global Root 2" -# Serial: 59914338225734147123941058376788110305822489521 -# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c -# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f -# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- -# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Secure Server CA" -# Serial: 927650371 -# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee -# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 -# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Label: "ValiCert Class 2 VA" -# Serial: 1 -# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 -# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 -# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- - -# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Express (Class C) Root" -# Serial: 104 -# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 -# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b -# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Business (Class B) Root" -# Serial: 105 -# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 -# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af -# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Label: "RSA Root Certificate 1" -# Serial: 1 -# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 -# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb -# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Label: "ValiCert Class 1 VA" -# Serial: 1 -# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb -# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e -# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure eBusiness CA 1" -# Serial: 4 -# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d -# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 -# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure Global eBusiness CA" -# Serial: 1 -# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc -# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 -# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Premium Server CA" -# Serial: 1 -# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a -# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a -# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Server CA" -# Serial: 1 -# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d -# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c -# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 149843929435818692848040365716851702463 -# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 -# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 -# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 80507572722862485515306429940691309246 -# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 -# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b -# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Label: "Verisign Class 3 Public Primary Certification Authority - G2" -# Serial: 167285380242319648451154478808036881606 -# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 -# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f -# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- - -# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Label: "GTE CyberTrust Global Root" -# Serial: 421 -# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db -# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 -# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -# Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Label: "Equifax Secure Certificate Authority" -# Serial: 903804111 -# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 -# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a -# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- diff --git a/chardet/__init__.py b/chardet/__init__.py deleted file mode 100644 index 0f9f820e..00000000 --- a/chardet/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - - -from .compat import PY2, PY3 -from .universaldetector import UniversalDetector -from .version import __version__, VERSION - - -def detect(byte_str): - """ - Detect the encoding of the given byte string. - - :param byte_str: The byte sequence to examine. - :type byte_str: ``bytes`` or ``bytearray`` - """ - if not isinstance(byte_str, bytearray): - if not isinstance(byte_str, bytes): - raise TypeError('Expected object of type bytes or bytearray, got: ' - '{0}'.format(type(byte_str))) - else: - byte_str = bytearray(byte_str) - detector = UniversalDetector() - detector.feed(byte_str) - return detector.close() diff --git a/chardet/big5freq.py b/chardet/big5freq.py deleted file mode 100644 index 38f32517..00000000 --- a/chardet/big5freq.py +++ /dev/null @@ -1,386 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Big5 frequency table -# by Taiwan's Mandarin Promotion Council -# -# -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -#Char to FreqOrder table -BIG5_TABLE_SIZE = 5376 - -BIG5_CHAR_TO_FREQ_ORDER = ( - 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 -3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 -1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 - 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 -3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 -4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 -5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 - 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 - 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 - 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 -2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 -1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 -3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 - 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 -3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 -2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 - 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 -3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 -1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 -5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 - 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 -5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 -1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 - 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 - 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 -3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 -3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 - 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 -2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 -2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 - 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 - 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 -3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 -1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 -1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 -1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 -2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 - 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 -4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 -1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 -5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 -2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 - 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 - 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 - 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 - 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 -5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 - 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 -1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 - 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 - 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 -5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 -1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 - 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 -3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 -4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 -3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 - 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 - 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 -1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 -4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 -3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 -3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 -2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 -5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 -3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 -5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 -1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 -2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 -1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 - 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 -1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 -4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 -3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 - 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 - 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 - 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 -2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 -5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 -1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 -2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 -1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 -1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 -5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 -5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 -5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 -3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 -4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 -4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 -2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 -5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 -3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 - 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 -5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 -5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 -1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 -2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 -3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 -4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 -5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 -3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 -4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 -1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 -1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 -4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 -1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 - 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 -1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 -1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 -3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 - 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 -5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 -2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 -1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 -1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 -5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 - 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 -4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 - 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 -2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 - 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 -1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 -1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 - 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 -4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 -4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 -1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 -3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 -5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 -5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 -1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 -2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 -1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 -3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 -2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 -3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 -2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 -4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 -4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 -3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 - 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 -3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 - 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 -3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 -4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 -3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 -1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 -5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 - 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 -5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 -1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 - 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 -4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 -4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 - 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 -2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 -2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 -3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 -1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 -4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 -2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 -1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 -1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 -2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 -3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 -1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 -5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 -1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 -4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 -1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 - 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 -1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 -4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 -4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 -2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 -1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 -4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 - 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 -5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 -2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 -3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 -4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 - 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 -5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 -5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 -1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 -4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 -4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 -2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 -3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 -3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 -2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 -1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 -4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 -3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 -3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 -2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 -4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 -5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 -3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 -2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 -3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 -1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 -2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 -3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 -4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 -2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 -2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 -5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 -1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 -2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 -1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 -3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 -4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 -2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 -3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 -3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 -2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 -4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 -2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 -3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 -4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 -5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 -3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 - 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 -1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 -4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 -1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 -4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 -5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 - 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 -5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 -5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 -2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 -3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 -2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 -2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 - 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 -1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 -4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 -3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 -3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 - 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 -2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 - 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 -2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 -4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 -1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 -4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 -1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 -3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 - 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 -3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 -5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 -5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 -3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 -3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 -1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 -2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 -5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 -1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 -1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 -3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 - 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 -1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 -4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 -5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 -2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 -3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 - 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 -1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 -2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 -2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 -5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 -5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 -5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 -2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 -2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 -1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 -4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 -3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 -3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 -4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 -4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 -2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 -2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 -5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 -4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 -5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 -4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 - 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 - 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 -1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 -3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 -4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 -1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 -5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 -2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 -2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 -3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 -5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 -1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 -3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 -5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 -1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 -5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 -2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 -3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 -2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 -3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 -3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 -3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 -4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 - 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 -2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 -4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 -3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 -5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 -1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 -5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 - 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 -1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 - 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 -4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 -1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 -4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 -1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 - 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 -3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 -4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 -5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 - 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 -3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 - 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 -2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 -) - diff --git a/chardet/big5prober.py b/chardet/big5prober.py deleted file mode 100644 index 98f99701..00000000 --- a/chardet/big5prober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import Big5DistributionAnalysis -from .mbcssm import BIG5_SM_MODEL - - -class Big5Prober(MultiByteCharSetProber): - def __init__(self): - super(Big5Prober, self).__init__() - self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) - self.distribution_analyzer = Big5DistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "Big5" - - @property - def language(self): - return "Chinese" diff --git a/chardet/chardistribution.py b/chardet/chardistribution.py deleted file mode 100644 index c0395f4a..00000000 --- a/chardet/chardistribution.py +++ /dev/null @@ -1,233 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, - EUCTW_TYPICAL_DISTRIBUTION_RATIO) -from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, - EUCKR_TYPICAL_DISTRIBUTION_RATIO) -from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, - GB2312_TYPICAL_DISTRIBUTION_RATIO) -from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, - BIG5_TYPICAL_DISTRIBUTION_RATIO) -from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, - JIS_TYPICAL_DISTRIBUTION_RATIO) - - -class CharDistributionAnalysis(object): - ENOUGH_DATA_THRESHOLD = 1024 - SURE_YES = 0.99 - SURE_NO = 0.01 - MINIMUM_DATA_THRESHOLD = 3 - - def __init__(self): - # Mapping table to get frequency order from char order (get from - # GetOrder()) - self._char_to_freq_order = None - self._table_size = None # Size of above table - # This is a constant value which varies from language to language, - # used in calculating confidence. See - # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html - # for further detail. - self.typical_distribution_ratio = None - self._done = None - self._total_chars = None - self._freq_chars = None - self.reset() - - def reset(self): - """reset analyser, clear any state""" - # If this flag is set to True, detection is done and conclusion has - # been made - self._done = False - self._total_chars = 0 # Total characters encountered - # The number of characters whose frequency order is less than 512 - self._freq_chars = 0 - - def feed(self, char, char_len): - """feed a character with known length""" - if char_len == 2: - # we only care about 2-bytes character in our distribution analysis - order = self.get_order(char) - else: - order = -1 - if order >= 0: - self._total_chars += 1 - # order is valid - if order < self._table_size: - if 512 > self._char_to_freq_order[order]: - self._freq_chars += 1 - - def get_confidence(self): - """return confidence based on existing data""" - # if we didn't receive any character in our consideration range, - # return negative answer - if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: - return self.SURE_NO - - if self._total_chars != self._freq_chars: - r = (self._freq_chars / ((self._total_chars - self._freq_chars) - * self.typical_distribution_ratio)) - if r < self.SURE_YES: - return r - - # normalize confidence (we don't want to be 100% sure) - return self.SURE_YES - - def got_enough_data(self): - # It is not necessary to receive all data to draw conclusion. - # For charset detection, certain amount of data is enough - return self._total_chars > self.ENOUGH_DATA_THRESHOLD - - def get_order(self, byte_str): - # We do not handle characters based on the original encoding string, - # but convert this encoding string to a number, here called order. - # This allows multiple encodings of a language to share one frequency - # table. - return -1 - - -class EUCTWDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(EUCTWDistributionAnalysis, self).__init__() - self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER - self._table_size = EUCTW_TABLE_SIZE - self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for euc-TW encoding, we are interested - # first byte range: 0xc4 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = byte_str[0] - if first_char >= 0xC4: - return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 - else: - return -1 - - -class EUCKRDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(EUCKRDistributionAnalysis, self).__init__() - self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER - self._table_size = EUCKR_TABLE_SIZE - self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for euc-KR encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = byte_str[0] - if first_char >= 0xB0: - return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 - else: - return -1 - - -class GB2312DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(GB2312DistributionAnalysis, self).__init__() - self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER - self._table_size = GB2312_TABLE_SIZE - self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for GB2312 encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if (first_char >= 0xB0) and (second_char >= 0xA1): - return 94 * (first_char - 0xB0) + second_char - 0xA1 - else: - return -1 - - -class Big5DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(Big5DistributionAnalysis, self).__init__() - self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER - self._table_size = BIG5_TABLE_SIZE - self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for big5 encoding, we are interested - # first byte range: 0xa4 -- 0xfe - # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if first_char >= 0xA4: - if second_char >= 0xA1: - return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 - else: - return 157 * (first_char - 0xA4) + second_char - 0x40 - else: - return -1 - - -class SJISDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(SJISDistributionAnalysis, self).__init__() - self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER - self._table_size = JIS_TABLE_SIZE - self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for sjis encoding, we are interested - # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe - # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if (first_char >= 0x81) and (first_char <= 0x9F): - order = 188 * (first_char - 0x81) - elif (first_char >= 0xE0) and (first_char <= 0xEF): - order = 188 * (first_char - 0xE0 + 31) - else: - return -1 - order = order + second_char - 0x40 - if second_char > 0x7F: - order = -1 - return order - - -class EUCJPDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(EUCJPDistributionAnalysis, self).__init__() - self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER - self._table_size = JIS_TABLE_SIZE - self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for euc-JP encoding, we are interested - # first byte range: 0xa0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - char = byte_str[0] - if char >= 0xA0: - return 94 * (char - 0xA1) + byte_str[1] - 0xa1 - else: - return -1 diff --git a/chardet/charsetgroupprober.py b/chardet/charsetgroupprober.py deleted file mode 100644 index 8b3738ef..00000000 --- a/chardet/charsetgroupprober.py +++ /dev/null @@ -1,106 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .enums import ProbingState -from .charsetprober import CharSetProber - - -class CharSetGroupProber(CharSetProber): - def __init__(self, lang_filter=None): - super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) - self._active_num = 0 - self.probers = [] - self._best_guess_prober = None - - def reset(self): - super(CharSetGroupProber, self).reset() - self._active_num = 0 - for prober in self.probers: - if prober: - prober.reset() - prober.active = True - self._active_num += 1 - self._best_guess_prober = None - - @property - def charset_name(self): - if not self._best_guess_prober: - self.get_confidence() - if not self._best_guess_prober: - return None - return self._best_guess_prober.charset_name - - @property - def language(self): - if not self._best_guess_prober: - self.get_confidence() - if not self._best_guess_prober: - return None - return self._best_guess_prober.language - - def feed(self, byte_str): - for prober in self.probers: - if not prober: - continue - if not prober.active: - continue - state = prober.feed(byte_str) - if not state: - continue - if state == ProbingState.FOUND_IT: - self._best_guess_prober = prober - return self.state - elif state == ProbingState.NOT_ME: - prober.active = False - self._active_num -= 1 - if self._active_num <= 0: - self._state = ProbingState.NOT_ME - return self.state - return self.state - - def get_confidence(self): - state = self.state - if state == ProbingState.FOUND_IT: - return 0.99 - elif state == ProbingState.NOT_ME: - return 0.01 - best_conf = 0.0 - self._best_guess_prober = None - for prober in self.probers: - if not prober: - continue - if not prober.active: - self.logger.debug('%s not active', prober.charset_name) - continue - conf = prober.get_confidence() - self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) - if best_conf < conf: - best_conf = conf - self._best_guess_prober = prober - if not self._best_guess_prober: - return 0.0 - return best_conf diff --git a/chardet/charsetprober.py b/chardet/charsetprober.py deleted file mode 100644 index eac4e598..00000000 --- a/chardet/charsetprober.py +++ /dev/null @@ -1,145 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import logging -import re - -from .enums import ProbingState - - -class CharSetProber(object): - - SHORTCUT_THRESHOLD = 0.95 - - def __init__(self, lang_filter=None): - self._state = None - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - - def reset(self): - self._state = ProbingState.DETECTING - - @property - def charset_name(self): - return None - - def feed(self, buf): - pass - - @property - def state(self): - return self._state - - def get_confidence(self): - return 0.0 - - @staticmethod - def filter_high_byte_only(buf): - buf = re.sub(b'([\x00-\x7F])+', b' ', buf) - return buf - - @staticmethod - def filter_international_words(buf): - """ - We define three types of bytes: - alphabet: english alphabets [a-zA-Z] - international: international characters [\x80-\xFF] - marker: everything else [^a-zA-Z\x80-\xFF] - - The input buffer can be thought to contain a series of words delimited - by markers. This function works to filter all words that contain at - least one international character. All contiguous sequences of markers - are replaced by a single space ascii character. - - This filter applies to all scripts which do not use English characters. - """ - filtered = bytearray() - - # This regex expression filters out only words that have at-least one - # international character. The word may include one marker character at - # the end. - words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', - buf) - - for word in words: - filtered.extend(word[:-1]) - - # If the last character in the word is a marker, replace it with a - # space as markers shouldn't affect our analysis (they are used - # similarly across all languages and may thus have similar - # frequencies). - last_char = word[-1:] - if not last_char.isalpha() and last_char < b'\x80': - last_char = b' ' - filtered.extend(last_char) - - return filtered - - @staticmethod - def filter_with_english_letters(buf): - """ - Returns a copy of ``buf`` that retains only the sequences of English - alphabet and high byte characters that are not between <> characters. - Also retains English alphabet and high byte characters immediately - before occurrences of >. - - This filter can be applied to all scripts which contain both English - characters and extended ASCII characters, but is currently only used by - ``Latin1Prober``. - """ - filtered = bytearray() - in_tag = False - prev = 0 - - for curr in range(len(buf)): - # Slice here to get bytes instead of an int with Python 3 - buf_char = buf[curr:curr + 1] - # Check if we're coming out of or entering an HTML tag - if buf_char == b'>': - in_tag = False - elif buf_char == b'<': - in_tag = True - - # If current character is not extended-ASCII and not alphabetic... - if buf_char < b'\x80' and not buf_char.isalpha(): - # ...and we're not in a tag - if curr > prev and not in_tag: - # Keep everything after last non-extended-ASCII, - # non-alphabetic character - filtered.extend(buf[prev:curr]) - # Output a space to delimit stretch we kept - filtered.extend(b' ') - prev = curr + 1 - - # If we're not in a tag... - if not in_tag: - # Keep everything after last non-extended-ASCII, non-alphabetic - # character - filtered.extend(buf[prev:]) - - return filtered diff --git a/chardet/cli/__init__.py b/chardet/cli/__init__.py deleted file mode 100644 index 8b137891..00000000 --- a/chardet/cli/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/chardet/cli/chardetect.py b/chardet/cli/chardetect.py deleted file mode 100644 index f0a4cc5d..00000000 --- a/chardet/cli/chardetect.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env python -""" -Script which takes one or more file paths and reports on their detected -encodings - -Example:: - - % chardetect somefile someotherfile - somefile: windows-1252 with confidence 0.5 - someotherfile: ascii with confidence 1.0 - -If no paths are provided, it takes its input from stdin. - -""" - -from __future__ import absolute_import, print_function, unicode_literals - -import argparse -import sys - -from chardet import __version__ -from chardet.compat import PY2 -from chardet.universaldetector import UniversalDetector - - -def description_of(lines, name='stdin'): - """ - Return a string describing the probable encoding of a file or - list of strings. - - :param lines: The lines to get the encoding of. - :type lines: Iterable of bytes - :param name: Name of file or collection of lines - :type name: str - """ - u = UniversalDetector() - for line in lines: - line = bytearray(line) - u.feed(line) - # shortcut out of the loop to save reading further - particularly useful if we read a BOM. - if u.done: - break - u.close() - result = u.result - if PY2: - name = name.decode(sys.getfilesystemencoding(), 'ignore') - if result['encoding']: - return '{0}: {1} with confidence {2}'.format(name, result['encoding'], - result['confidence']) - else: - return '{0}: no result'.format(name) - - -def main(argv=None): - """ - Handles command line arguments and gets things started. - - :param argv: List of arguments, as if specified on the command-line. - If None, ``sys.argv[1:]`` is used instead. - :type argv: list of str - """ - # Get command line arguments - parser = argparse.ArgumentParser( - description="Takes one or more file paths and reports their detected \ - encodings") - parser.add_argument('input', - help='File whose encoding we would like to determine. \ - (default: stdin)', - type=argparse.FileType('rb'), nargs='*', - default=[sys.stdin if PY2 else sys.stdin.buffer]) - parser.add_argument('--version', action='version', - version='%(prog)s {0}'.format(__version__)) - args = parser.parse_args(argv) - - for f in args.input: - if f.isatty(): - print("You are running chardetect interactively. Press " + - "CTRL-D twice at the start of a blank line to signal the " + - "end of your input. If you want help, run chardetect " + - "--help\n", file=sys.stderr) - print(description_of(f, f.name)) - - -if __name__ == '__main__': - main() diff --git a/chardet/codingstatemachine.py b/chardet/codingstatemachine.py deleted file mode 100644 index 68fba44f..00000000 --- a/chardet/codingstatemachine.py +++ /dev/null @@ -1,88 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import logging - -from .enums import MachineState - - -class CodingStateMachine(object): - """ - A state machine to verify a byte sequence for a particular encoding. For - each byte the detector receives, it will feed that byte to every active - state machine available, one byte at a time. The state machine changes its - state based on its previous state and the byte it receives. There are 3 - states in a state machine that are of interest to an auto-detector: - - START state: This is the state to start with, or a legal byte sequence - (i.e. a valid code point) for character has been identified. - - ME state: This indicates that the state machine identified a byte sequence - that is specific to the charset it is designed for and that - there is no other possible encoding which can contain this byte - sequence. This will to lead to an immediate positive answer for - the detector. - - ERROR state: This indicates the state machine identified an illegal byte - sequence for that encoding. This will lead to an immediate - negative answer for this encoding. Detector will exclude this - encoding from consideration from here on. - """ - def __init__(self, sm): - self._model = sm - self._curr_byte_pos = 0 - self._curr_char_len = 0 - self._curr_state = None - self.logger = logging.getLogger(__name__) - self.reset() - - def reset(self): - self._curr_state = MachineState.START - - def next_state(self, c): - # for each byte we get its class - # if it is first byte, we also get byte length - byte_class = self._model['class_table'][c] - if self._curr_state == MachineState.START: - self._curr_byte_pos = 0 - self._curr_char_len = self._model['char_len_table'][byte_class] - # from byte's class and state_table, we get its next state - curr_state = (self._curr_state * self._model['class_factor'] - + byte_class) - self._curr_state = self._model['state_table'][curr_state] - self._curr_byte_pos += 1 - return self._curr_state - - def get_current_charlen(self): - return self._curr_char_len - - def get_coding_state_machine(self): - return self._model['name'] - - @property - def language(self): - return self._model['language'] diff --git a/chardet/compat.py b/chardet/compat.py deleted file mode 100644 index ddd74687..00000000 --- a/chardet/compat.py +++ /dev/null @@ -1,34 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# Contributor(s): -# Dan Blanchard -# Ian Cordasco -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys - - -if sys.version_info < (3, 0): - PY2 = True - PY3 = False - base_str = (str, unicode) - text_type = unicode -else: - PY2 = False - PY3 = True - base_str = (bytes, str) - text_type = str diff --git a/chardet/cp949prober.py b/chardet/cp949prober.py deleted file mode 100644 index efd793ab..00000000 --- a/chardet/cp949prober.py +++ /dev/null @@ -1,49 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import EUCKRDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import CP949_SM_MODEL - - -class CP949Prober(MultiByteCharSetProber): - def __init__(self): - super(CP949Prober, self).__init__() - self.coding_sm = CodingStateMachine(CP949_SM_MODEL) - # NOTE: CP949 is a superset of EUC-KR, so the distribution should be - # not different. - self.distribution_analyzer = EUCKRDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "CP949" - - @property - def language(self): - return "Korean" diff --git a/chardet/enums.py b/chardet/enums.py deleted file mode 100644 index 04512072..00000000 --- a/chardet/enums.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -All of the Enums that are used throughout the chardet package. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - - -class InputState(object): - """ - This enum represents the different states a universal detector can be in. - """ - PURE_ASCII = 0 - ESC_ASCII = 1 - HIGH_BYTE = 2 - - -class LanguageFilter(object): - """ - This enum represents the different language filters we can apply to a - ``UniversalDetector``. - """ - CHINESE_SIMPLIFIED = 0x01 - CHINESE_TRADITIONAL = 0x02 - JAPANESE = 0x04 - KOREAN = 0x08 - NON_CJK = 0x10 - ALL = 0x1F - CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL - CJK = CHINESE | JAPANESE | KOREAN - - -class ProbingState(object): - """ - This enum represents the different states a prober can be in. - """ - DETECTING = 0 - FOUND_IT = 1 - NOT_ME = 2 - - -class MachineState(object): - """ - This enum represents the different states a state machine can be in. - """ - START = 0 - ERROR = 1 - ITS_ME = 2 - - -class SequenceLikelihood(object): - """ - This enum represents the likelihood of a character following the previous one. - """ - NEGATIVE = 0 - UNLIKELY = 1 - LIKELY = 2 - POSITIVE = 3 - - @classmethod - def get_num_categories(cls): - """:returns: The number of likelihood categories in the enum.""" - return 4 - - -class CharacterCategory(object): - """ - This enum represents the different categories language models for - ``SingleByteCharsetProber`` put characters into. - - Anything less than CONTROL is considered a letter. - """ - UNDEFINED = 255 - LINE_BREAK = 254 - SYMBOL = 253 - DIGIT = 252 - CONTROL = 251 diff --git a/chardet/escprober.py b/chardet/escprober.py deleted file mode 100644 index c70493f2..00000000 --- a/chardet/escprober.py +++ /dev/null @@ -1,101 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .enums import LanguageFilter, ProbingState, MachineState -from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, - ISO2022KR_SM_MODEL) - - -class EscCharSetProber(CharSetProber): - """ - This CharSetProber uses a "code scheme" approach for detecting encodings, - whereby easily recognizable escape or shift sequences are relied on to - identify these encodings. - """ - - def __init__(self, lang_filter=None): - super(EscCharSetProber, self).__init__(lang_filter=lang_filter) - self.coding_sm = [] - if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: - self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) - self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) - if self.lang_filter & LanguageFilter.JAPANESE: - self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) - if self.lang_filter & LanguageFilter.KOREAN: - self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) - self.active_sm_count = None - self._detected_charset = None - self._detected_language = None - self._state = None - self.reset() - - def reset(self): - super(EscCharSetProber, self).reset() - for coding_sm in self.coding_sm: - if not coding_sm: - continue - coding_sm.active = True - coding_sm.reset() - self.active_sm_count = len(self.coding_sm) - self._detected_charset = None - self._detected_language = None - - @property - def charset_name(self): - return self._detected_charset - - @property - def language(self): - return self._detected_language - - def get_confidence(self): - if self._detected_charset: - return 0.99 - else: - return 0.00 - - def feed(self, byte_str): - for c in byte_str: - for coding_sm in self.coding_sm: - if not coding_sm or not coding_sm.active: - continue - coding_state = coding_sm.next_state(c) - if coding_state == MachineState.ERROR: - coding_sm.active = False - self.active_sm_count -= 1 - if self.active_sm_count <= 0: - self._state = ProbingState.NOT_ME - return self.state - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - self._detected_charset = coding_sm.get_coding_state_machine() - self._detected_language = coding_sm.language - return self.state - - return self.state diff --git a/chardet/escsm.py b/chardet/escsm.py deleted file mode 100644 index 0069523a..00000000 --- a/chardet/escsm.py +++ /dev/null @@ -1,246 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .enums import MachineState - -HZ_CLS = ( -1,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,0,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,4,0,5,2,0, # 78 - 7f -1,1,1,1,1,1,1,1, # 80 - 87 -1,1,1,1,1,1,1,1, # 88 - 8f -1,1,1,1,1,1,1,1, # 90 - 97 -1,1,1,1,1,1,1,1, # 98 - 9f -1,1,1,1,1,1,1,1, # a0 - a7 -1,1,1,1,1,1,1,1, # a8 - af -1,1,1,1,1,1,1,1, # b0 - b7 -1,1,1,1,1,1,1,1, # b8 - bf -1,1,1,1,1,1,1,1, # c0 - c7 -1,1,1,1,1,1,1,1, # c8 - cf -1,1,1,1,1,1,1,1, # d0 - d7 -1,1,1,1,1,1,1,1, # d8 - df -1,1,1,1,1,1,1,1, # e0 - e7 -1,1,1,1,1,1,1,1, # e8 - ef -1,1,1,1,1,1,1,1, # f0 - f7 -1,1,1,1,1,1,1,1, # f8 - ff -) - -HZ_ST = ( -MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 - 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f - 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 - 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f -) - -HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) - -HZ_SM_MODEL = {'class_table': HZ_CLS, - 'class_factor': 6, - 'state_table': HZ_ST, - 'char_len_table': HZ_CHAR_LEN_TABLE, - 'name': "HZ-GB-2312", - 'language': 'Chinese'} - -ISO2022CN_CLS = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,3,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,4,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022CN_ST = ( -MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 -MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f -MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 - 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f -) - -ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, - 'class_factor': 9, - 'state_table': ISO2022CN_ST, - 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, - 'name': "ISO-2022-CN", - 'language': 'Chinese'} - -ISO2022JP_CLS = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,2,2, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,7,0,0,0, # 20 - 27 -3,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -6,0,4,0,8,0,0,0, # 40 - 47 -0,9,5,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022JP_ST = ( -MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 -MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f -MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 -) - -ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, - 'class_factor': 10, - 'state_table': ISO2022JP_ST, - 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, - 'name': "ISO-2022-JP", - 'language': 'Japanese'} - -ISO2022KR_CLS = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,3,0,0,0, # 20 - 27 -0,4,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,5,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022KR_ST = ( -MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 -) - -ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) - -ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, - 'class_factor': 6, - 'state_table': ISO2022KR_ST, - 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, - 'name': "ISO-2022-KR", - 'language': 'Korean'} - - diff --git a/chardet/eucjpprober.py b/chardet/eucjpprober.py deleted file mode 100644 index 20ce8f7d..00000000 --- a/chardet/eucjpprober.py +++ /dev/null @@ -1,92 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .enums import ProbingState, MachineState -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCJPDistributionAnalysis -from .jpcntx import EUCJPContextAnalysis -from .mbcssm import EUCJP_SM_MODEL - - -class EUCJPProber(MultiByteCharSetProber): - def __init__(self): - super(EUCJPProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) - self.distribution_analyzer = EUCJPDistributionAnalysis() - self.context_analyzer = EUCJPContextAnalysis() - self.reset() - - def reset(self): - super(EUCJPProber, self).reset() - self.context_analyzer.reset() - - @property - def charset_name(self): - return "EUC-JP" - - @property - def language(self): - return "Japanese" - - def feed(self, byte_str): - for i in range(len(byte_str)): - # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte - coding_state = self.coding_sm.next_state(byte_str[i]) - if coding_state == MachineState.ERROR: - self.logger.debug('%s %s prober hit error at byte %s', - self.charset_name, self.language, i) - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - self.context_analyzer.feed(self._last_char, char_len) - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.context_analyzer.feed(byte_str[i - 1:i + 1], - char_len) - self.distribution_analyzer.feed(byte_str[i - 1:i + 1], - char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if (self.context_analyzer.got_enough_data() and - (self.get_confidence() > self.SHORTCUT_THRESHOLD)): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/chardet/euckrfreq.py b/chardet/euckrfreq.py deleted file mode 100644 index b68078cb..00000000 --- a/chardet/euckrfreq.py +++ /dev/null @@ -1,195 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology - -# 128 --> 0.79 -# 256 --> 0.92 -# 512 --> 0.986 -# 1024 --> 0.99944 -# 2048 --> 0.99999 -# -# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 -# Random Distribution Ration = 512 / (2350-512) = 0.279. -# -# Typical Distribution Ratio - -EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 - -EUCKR_TABLE_SIZE = 2352 - -# Char to FreqOrder table , -EUCKR_CHAR_TO_FREQ_ORDER = ( - 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, -1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, -1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, - 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, - 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, - 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, -1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, - 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, - 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, -1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, -1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, -1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, -1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, -1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, - 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, -1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, -1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, -1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, -1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, - 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, -1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, - 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, - 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, -1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, - 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, -1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, - 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, - 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, -1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, -1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, -1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, -1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, - 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, -1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, - 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, - 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, -1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, -1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, -1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, -1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, -1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, -1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, - 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, - 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, - 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, -1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, - 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, -1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, - 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, - 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, -2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, - 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, - 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, -2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, -2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, -2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, - 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, - 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, -2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, - 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, -1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, -2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, -1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, -2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, -2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, -1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, - 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, -2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, -2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, - 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, - 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, -2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, -1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, -2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, -2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, -2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, -2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, -2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, -2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, -1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, -2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, -2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, -2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, -2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, -2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, -1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, -1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, -2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, -1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, -2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, -1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, - 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, -2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, - 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, -2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, - 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, -2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, -2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, - 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, -2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, -1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, - 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, -1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, -2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, -1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, -2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, - 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, -2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, -1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, -2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, -1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, -2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, -1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, - 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, -2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, -2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, - 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, - 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, -1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, -1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, - 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, -2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, -2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, - 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, - 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, - 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, -2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, - 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, - 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, -2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, -2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, - 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, -2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, -1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, - 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, -2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, -2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, -2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, - 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, - 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, - 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, -2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, -2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, -2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, -1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, -2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, - 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 -) - diff --git a/chardet/euckrprober.py b/chardet/euckrprober.py deleted file mode 100644 index 345a060d..00000000 --- a/chardet/euckrprober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import EUCKR_SM_MODEL - - -class EUCKRProber(MultiByteCharSetProber): - def __init__(self): - super(EUCKRProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) - self.distribution_analyzer = EUCKRDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "EUC-KR" - - @property - def language(self): - return "Korean" diff --git a/chardet/euctwfreq.py b/chardet/euctwfreq.py deleted file mode 100644 index ed7a995a..00000000 --- a/chardet/euctwfreq.py +++ /dev/null @@ -1,387 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# EUCTW frequency table -# Converted from big5 work -# by Taiwan's Mandarin Promotion Council -# - -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -# Char to FreqOrder table , -EUCTW_TABLE_SIZE = 5376 - -EUCTW_CHAR_TO_FREQ_ORDER = ( - 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 -3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 -1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 - 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 -3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 -4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 -7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 - 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 - 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 - 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 -2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 -1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 -3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 - 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 -3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 -2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 - 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 -3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 -1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 -7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 - 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 -7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 -1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 - 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 - 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 -3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 -3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 - 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 -2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 -2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 - 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 - 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 -3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 -1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 -1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 -1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 -2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 - 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 -4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 -1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 -7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 -2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 - 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 - 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 - 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 - 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 -7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 - 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 -1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 - 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 - 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 -7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 -1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 - 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 -3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 -4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 -3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 - 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 - 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 -1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 -4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 -3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 -3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 -2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 -7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 -3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 -7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 -1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 -2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 -1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 - 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 -1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 -4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 -3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 - 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 - 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 - 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 -2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 -7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 -1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 -2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 -1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 -1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 -7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 -7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 -7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 -3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 -4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 -1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 -7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 -2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 -7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 -3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 -3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 -7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 -2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 -7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 - 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 -4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 -2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 -7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 -3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 -2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 -2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 - 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 -2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 -1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 -1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 -2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 -1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 -7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 -7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 -2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 -4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 -1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 -7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 - 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 -4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 - 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 -2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 - 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 -1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 -1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 - 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 -3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 -3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 -1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 -3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 -7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 -7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 -1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 -2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 -1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 -3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 -2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 -3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 -2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 -4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 -4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 -3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 - 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 -3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 - 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 -3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 -3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 -3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 -1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 -7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 - 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 -7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 -1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 - 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 -4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 -3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 - 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 -2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 -2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 -3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 -1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 -4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 -2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 -1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 -1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 -2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 -3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 -1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 -7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 -1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 -4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 -1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 - 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 -1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 -3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 -3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 -2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 -1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 -4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 - 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 -7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 -2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 -3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 -4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 - 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 -7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 -7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 -1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 -4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 -3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 -2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 -3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 -3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 -2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 -1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 -4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 -3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 -3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 -2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 -4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 -7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 -3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 -2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 -3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 -1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 -2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 -3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 -4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 -2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 -2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 -7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 -1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 -2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 -1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 -3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 -4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 -2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 -3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 -3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 -2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 -4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 -2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 -3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 -4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 -7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 -3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 - 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 -1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 -4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 -1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 -4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 -7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 - 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 -7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 -2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 -1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 -1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 -3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 - 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 - 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 - 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 -3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 -2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 - 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 -7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 -1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 -3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 -7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 -1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 -7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 -4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 -1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 -2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 -2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 -4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 - 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 - 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 -3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 -3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 -1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 -2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 -7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 -1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 -1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 -3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 - 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 -1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 -4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 -7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 -2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 -3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 - 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 -1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 -2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 -2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 -7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 -7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 -7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 -2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 -2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 -1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 -4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 -3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 -3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 -4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 -4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 -2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 -2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 -7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 -4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 -7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 -2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 -1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 -3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 -4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 -2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 - 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 -2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 -1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 -2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 -2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 -4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 -7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 -1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 -3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 -7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 -1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 -8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 -2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 -8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 -2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 -2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 -8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 -8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 -8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 - 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 -8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 -4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 -3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 -8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 -1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 -8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 - 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 -1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 - 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 -4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 -1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 -4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 -1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 - 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 -3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 -4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 -8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 - 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 -3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 - 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 -2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 -) - diff --git a/chardet/euctwprober.py b/chardet/euctwprober.py deleted file mode 100644 index 35669cc4..00000000 --- a/chardet/euctwprober.py +++ /dev/null @@ -1,46 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCTWDistributionAnalysis -from .mbcssm import EUCTW_SM_MODEL - -class EUCTWProber(MultiByteCharSetProber): - def __init__(self): - super(EUCTWProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) - self.distribution_analyzer = EUCTWDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "EUC-TW" - - @property - def language(self): - return "Taiwan" diff --git a/chardet/gb2312freq.py b/chardet/gb2312freq.py deleted file mode 100644 index 697837bd..00000000 --- a/chardet/gb2312freq.py +++ /dev/null @@ -1,283 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# GB2312 most frequently used character table -# -# Char to FreqOrder table , from hz6763 - -# 512 --> 0.79 -- 0.79 -# 1024 --> 0.92 -- 0.13 -# 2048 --> 0.98 -- 0.06 -# 6768 --> 1.00 -- 0.02 -# -# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 -# Random Distribution Ration = 512 / (3755 - 512) = 0.157 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR - -GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 - -GB2312_TABLE_SIZE = 3760 - -GB2312_CHAR_TO_FREQ_ORDER = ( -1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, -2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, -2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, - 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, -1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, -1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, - 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, -1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, -2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, -3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, - 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, -1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, - 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, -2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, - 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, -2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, -1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, -3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, - 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, -1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, - 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, -2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, -1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, -3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, -1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, -2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, -1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, - 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, -3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, -3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, - 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, -3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, - 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, -1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, -3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, -2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, -1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, - 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, -1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, -4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, - 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, -3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, -3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, - 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, -1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, -2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, -1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, -1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, - 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, -3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, -3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, -4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, - 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, -3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, -1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, -1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, -4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, - 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, - 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, -3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, -1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, - 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, -1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, -2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, - 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, - 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, - 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, -3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, -4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, -3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, - 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, -2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, -2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, -2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, - 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, -2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, - 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, - 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, - 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, -3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, -2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, -2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, -1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, - 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, -2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, - 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, - 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, -1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, -1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, - 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, - 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, -1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, -2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, -3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, -2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, -2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, -2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, -3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, -1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, -1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, -2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, -1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, -3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, -1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, -1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, -3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, - 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, -2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, -1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, -4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, -1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, -1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, -3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, -1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, - 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, - 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, -1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, - 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, -1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, -1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, - 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, -3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, -4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, -3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, -2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, -2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, -1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, -3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, -2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, -1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, -1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, - 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, -2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, -2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, -3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, -4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, -3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, - 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, -3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, -2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, -1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, - 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, - 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, -3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, -4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, -2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, -1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, -1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, - 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, -1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, -3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, - 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, - 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, -1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, - 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, -1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, - 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, -2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, - 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, -2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, -2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, -1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, -1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, -2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, - 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, -1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, -1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, -2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, -2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, -3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, -1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, -4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, - 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, - 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, -3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, -1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, - 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, -3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, -1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, -4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, -1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, -2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, -1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, - 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, -1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, -3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, - 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, -2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, - 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, -1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, -1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, -1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, -3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, -2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, -3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, -3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, -3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, - 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, -2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, - 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, -2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, - 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, -1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, - 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, - 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, -1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, -3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, -3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, -1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, -1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, -3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, -2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, -2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, -1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, -3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, - 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, -4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, -1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, -2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, -3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, -3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, -1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, - 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, - 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, -2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, - 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, -1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, - 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, -1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, -1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, -1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, -1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, -1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, - 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, - 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 -) - diff --git a/chardet/gb2312prober.py b/chardet/gb2312prober.py deleted file mode 100644 index 8446d2dd..00000000 --- a/chardet/gb2312prober.py +++ /dev/null @@ -1,46 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import GB2312DistributionAnalysis -from .mbcssm import GB2312_SM_MODEL - -class GB2312Prober(MultiByteCharSetProber): - def __init__(self): - super(GB2312Prober, self).__init__() - self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) - self.distribution_analyzer = GB2312DistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "GB2312" - - @property - def language(self): - return "Chinese" diff --git a/chardet/hebrewprober.py b/chardet/hebrewprober.py deleted file mode 100644 index b0e1bf49..00000000 --- a/chardet/hebrewprober.py +++ /dev/null @@ -1,292 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Shy Shalom -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import ProbingState - -# This prober doesn't actually recognize a language or a charset. -# It is a helper prober for the use of the Hebrew model probers - -### General ideas of the Hebrew charset recognition ### -# -# Four main charsets exist in Hebrew: -# "ISO-8859-8" - Visual Hebrew -# "windows-1255" - Logical Hebrew -# "ISO-8859-8-I" - Logical Hebrew -# "x-mac-hebrew" - ?? Logical Hebrew ?? -# -# Both "ISO" charsets use a completely identical set of code points, whereas -# "windows-1255" and "x-mac-hebrew" are two different proper supersets of -# these code points. windows-1255 defines additional characters in the range -# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific -# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. -# x-mac-hebrew defines similar additional code points but with a different -# mapping. -# -# As far as an average Hebrew text with no diacritics is concerned, all four -# charsets are identical with respect to code points. Meaning that for the -# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters -# (including final letters). -# -# The dominant difference between these charsets is their directionality. -# "Visual" directionality means that the text is ordered as if the renderer is -# not aware of a BIDI rendering algorithm. The renderer sees the text and -# draws it from left to right. The text itself when ordered naturally is read -# backwards. A buffer of Visual Hebrew generally looks like so: -# "[last word of first line spelled backwards] [whole line ordered backwards -# and spelled backwards] [first word of first line spelled backwards] -# [end of line] [last word of second line] ... etc' " -# adding punctuation marks, numbers and English text to visual text is -# naturally also "visual" and from left to right. -# -# "Logical" directionality means the text is ordered "naturally" according to -# the order it is read. It is the responsibility of the renderer to display -# the text from right to left. A BIDI algorithm is used to place general -# punctuation marks, numbers and English text in the text. -# -# Texts in x-mac-hebrew are almost impossible to find on the Internet. From -# what little evidence I could find, it seems that its general directionality -# is Logical. -# -# To sum up all of the above, the Hebrew probing mechanism knows about two -# charsets: -# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are -# backwards while line order is natural. For charset recognition purposes -# the line order is unimportant (In fact, for this implementation, even -# word order is unimportant). -# Logical Hebrew - "windows-1255" - normal, naturally ordered text. -# -# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be -# specifically identified. -# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew -# that contain special punctuation marks or diacritics is displayed with -# some unconverted characters showing as question marks. This problem might -# be corrected using another model prober for x-mac-hebrew. Due to the fact -# that x-mac-hebrew texts are so rare, writing another model prober isn't -# worth the effort and performance hit. -# -#### The Prober #### -# -# The prober is divided between two SBCharSetProbers and a HebrewProber, -# all of which are managed, created, fed data, inquired and deleted by the -# SBCSGroupProber. The two SBCharSetProbers identify that the text is in -# fact some kind of Hebrew, Logical or Visual. The final decision about which -# one is it is made by the HebrewProber by combining final-letter scores -# with the scores of the two SBCharSetProbers to produce a final answer. -# -# The SBCSGroupProber is responsible for stripping the original text of HTML -# tags, English characters, numbers, low-ASCII punctuation characters, spaces -# and new lines. It reduces any sequence of such characters to a single space. -# The buffer fed to each prober in the SBCS group prober is pure text in -# high-ASCII. -# The two SBCharSetProbers (model probers) share the same language model: -# Win1255Model. -# The first SBCharSetProber uses the model normally as any other -# SBCharSetProber does, to recognize windows-1255, upon which this model was -# built. The second SBCharSetProber is told to make the pair-of-letter -# lookup in the language model backwards. This in practice exactly simulates -# a visual Hebrew model using the windows-1255 logical Hebrew model. -# -# The HebrewProber is not using any language model. All it does is look for -# final-letter evidence suggesting the text is either logical Hebrew or visual -# Hebrew. Disjointed from the model probers, the results of the HebrewProber -# alone are meaningless. HebrewProber always returns 0.00 as confidence -# since it never identifies a charset by itself. Instead, the pointer to the -# HebrewProber is passed to the model probers as a helper "Name Prober". -# When the Group prober receives a positive identification from any prober, -# it asks for the name of the charset identified. If the prober queried is a -# Hebrew model prober, the model prober forwards the call to the -# HebrewProber to make the final decision. In the HebrewProber, the -# decision is made according to the final-letters scores maintained and Both -# model probers scores. The answer is returned in the form of the name of the -# charset identified, either "windows-1255" or "ISO-8859-8". - -class HebrewProber(CharSetProber): - # windows-1255 / ISO-8859-8 code points of interest - FINAL_KAF = 0xea - NORMAL_KAF = 0xeb - FINAL_MEM = 0xed - NORMAL_MEM = 0xee - FINAL_NUN = 0xef - NORMAL_NUN = 0xf0 - FINAL_PE = 0xf3 - NORMAL_PE = 0xf4 - FINAL_TSADI = 0xf5 - NORMAL_TSADI = 0xf6 - - # Minimum Visual vs Logical final letter score difference. - # If the difference is below this, don't rely solely on the final letter score - # distance. - MIN_FINAL_CHAR_DISTANCE = 5 - - # Minimum Visual vs Logical model score difference. - # If the difference is below this, don't rely at all on the model score - # distance. - MIN_MODEL_DISTANCE = 0.01 - - VISUAL_HEBREW_NAME = "ISO-8859-8" - LOGICAL_HEBREW_NAME = "windows-1255" - - def __init__(self): - super(HebrewProber, self).__init__() - self._final_char_logical_score = None - self._final_char_visual_score = None - self._prev = None - self._before_prev = None - self._logical_prober = None - self._visual_prober = None - self.reset() - - def reset(self): - self._final_char_logical_score = 0 - self._final_char_visual_score = 0 - # The two last characters seen in the previous buffer, - # mPrev and mBeforePrev are initialized to space in order to simulate - # a word delimiter at the beginning of the data - self._prev = ' ' - self._before_prev = ' ' - # These probers are owned by the group prober. - - def set_model_probers(self, logicalProber, visualProber): - self._logical_prober = logicalProber - self._visual_prober = visualProber - - def is_final(self, c): - return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, - self.FINAL_PE, self.FINAL_TSADI] - - def is_non_final(self, c): - # The normal Tsadi is not a good Non-Final letter due to words like - # 'lechotet' (to chat) containing an apostrophe after the tsadi. This - # apostrophe is converted to a space in FilterWithoutEnglishLetters - # causing the Non-Final tsadi to appear at an end of a word even - # though this is not the case in the original text. - # The letters Pe and Kaf rarely display a related behavior of not being - # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' - # for example legally end with a Non-Final Pe or Kaf. However, the - # benefit of these letters as Non-Final letters outweighs the damage - # since these words are quite rare. - return c in [self.NORMAL_KAF, self.NORMAL_MEM, - self.NORMAL_NUN, self.NORMAL_PE] - - def feed(self, byte_str): - # Final letter analysis for logical-visual decision. - # Look for evidence that the received buffer is either logical Hebrew - # or visual Hebrew. - # The following cases are checked: - # 1) A word longer than 1 letter, ending with a final letter. This is - # an indication that the text is laid out "naturally" since the - # final letter really appears at the end. +1 for logical score. - # 2) A word longer than 1 letter, ending with a Non-Final letter. In - # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, - # should not end with the Non-Final form of that letter. Exceptions - # to this rule are mentioned above in isNonFinal(). This is an - # indication that the text is laid out backwards. +1 for visual - # score - # 3) A word longer than 1 letter, starting with a final letter. Final - # letters should not appear at the beginning of a word. This is an - # indication that the text is laid out backwards. +1 for visual - # score. - # - # The visual score and logical score are accumulated throughout the - # text and are finally checked against each other in GetCharSetName(). - # No checking for final letters in the middle of words is done since - # that case is not an indication for either Logical or Visual text. - # - # We automatically filter out all 7-bit characters (replace them with - # spaces) so the word boundary detection works properly. [MAP] - - if self.state == ProbingState.NOT_ME: - # Both model probers say it's not them. No reason to continue. - return ProbingState.NOT_ME - - byte_str = self.filter_high_byte_only(byte_str) - - for cur in byte_str: - if cur == ' ': - # We stand on a space - a word just ended - if self._before_prev != ' ': - # next-to-last char was not a space so self._prev is not a - # 1 letter word - if self.is_final(self._prev): - # case (1) [-2:not space][-1:final letter][cur:space] - self._final_char_logical_score += 1 - elif self.is_non_final(self._prev): - # case (2) [-2:not space][-1:Non-Final letter][ - # cur:space] - self._final_char_visual_score += 1 - else: - # Not standing on a space - if ((self._before_prev == ' ') and - (self.is_final(self._prev)) and (cur != ' ')): - # case (3) [-2:space][-1:final letter][cur:not space] - self._final_char_visual_score += 1 - self._before_prev = self._prev - self._prev = cur - - # Forever detecting, till the end or until both model probers return - # ProbingState.NOT_ME (handled above) - return ProbingState.DETECTING - - @property - def charset_name(self): - # Make the decision: is it Logical or Visual? - # If the final letter score distance is dominant enough, rely on it. - finalsub = self._final_char_logical_score - self._final_char_visual_score - if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: - return self.LOGICAL_HEBREW_NAME - if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: - return self.VISUAL_HEBREW_NAME - - # It's not dominant enough, try to rely on the model scores instead. - modelsub = (self._logical_prober.get_confidence() - - self._visual_prober.get_confidence()) - if modelsub > self.MIN_MODEL_DISTANCE: - return self.LOGICAL_HEBREW_NAME - if modelsub < -self.MIN_MODEL_DISTANCE: - return self.VISUAL_HEBREW_NAME - - # Still no good, back to final letter distance, maybe it'll save the - # day. - if finalsub < 0.0: - return self.VISUAL_HEBREW_NAME - - # (finalsub > 0 - Logical) or (don't know what to do) default to - # Logical. - return self.LOGICAL_HEBREW_NAME - - @property - def language(self): - return 'Hebrew' - - @property - def state(self): - # Remain active as long as any of the model probers are active. - if (self._logical_prober.state == ProbingState.NOT_ME) and \ - (self._visual_prober.state == ProbingState.NOT_ME): - return ProbingState.NOT_ME - return ProbingState.DETECTING diff --git a/chardet/jisfreq.py b/chardet/jisfreq.py deleted file mode 100644 index 83fc082b..00000000 --- a/chardet/jisfreq.py +++ /dev/null @@ -1,325 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology -# -# Japanese frequency table, applied to both S-JIS and EUC-JP -# They are sorted in order. - -# 128 --> 0.77094 -# 256 --> 0.85710 -# 512 --> 0.92635 -# 1024 --> 0.97130 -# 2048 --> 0.99431 -# -# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 -# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 -# -# Typical Distribution Ratio, 25% of IDR - -JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 - -# Char to FreqOrder table , -JIS_TABLE_SIZE = 4368 - -JIS_CHAR_TO_FREQ_ORDER = ( - 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 -3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 -1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 -2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 -2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 -5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 -1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 -5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 -5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 -5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 -5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 -5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 -5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 -1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 -1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 -1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 -2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 -3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 -3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 - 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 - 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 -1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 - 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 -5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 - 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 - 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 - 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 - 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 - 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 -5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 -5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 -5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 -4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 -5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 -5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 -5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 -5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 -5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 -5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 -5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 -5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 -5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 -3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 -5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 -5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 -5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 -5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 -5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 -5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 -5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 -5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 -5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 -5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 -5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 -5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 -5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 -5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 -5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 -5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 -5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 -5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 -5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 -5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 -5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 -5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 -5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 -5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 -5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 -5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 -5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 -5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 -5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 -5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 -5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 -5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 -5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 -5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 -5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 -5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 -6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 -6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 -6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 -6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 -6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 -6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 -6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 -6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 -4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 - 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 - 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 -1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 -1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 - 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 -3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 -3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 - 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 -3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 -3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 - 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 -2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 - 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 -3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 -1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 - 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 -1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 - 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 -2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 -2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 -2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 -2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 -1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 -1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 -1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 -1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 -2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 -1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 -2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 -1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 -1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 -1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 -1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 -1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 -1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 - 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 - 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 -1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 -2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 -2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 -2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 -3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 -3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 - 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 -3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 -1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 - 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 -2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 -1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 - 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 -3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 -4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 -2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 -1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 -2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 -1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 - 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 - 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 -1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 -2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 -2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 -2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 -3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 -1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 -2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 - 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 - 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 - 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 -1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 -2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 - 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 -1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 -1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 - 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 -1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 -1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 -1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 - 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 -2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 - 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 -2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 -3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 -2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 -1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 -6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 -1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 -2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 -1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 - 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 - 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 -3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 -3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 -1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 -1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 -1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 -1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 - 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 - 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 -2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 - 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 -3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 -2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 - 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 -1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 -2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 - 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 -1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 - 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 -4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 -2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 -1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 - 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 -1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 -2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 - 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 -6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 -1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 -1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 -2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 -3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 - 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 -3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 -1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 - 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 -1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 - 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 -3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 - 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 -2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 - 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 -4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 -2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 -1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 -1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 -1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 - 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 -1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 -3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 -1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 -3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 - 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 - 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 - 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 -2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 -1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 - 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 -1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 - 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 -1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 - 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 - 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 - 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 -1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 -1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 -2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 -4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 - 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 -1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 - 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 -1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 -3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 -1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 -2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 -2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 -1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 -1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 -2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 - 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 -2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 -1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 -1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 -1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 -1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 -3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 -2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 -2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 - 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 -3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 -3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 -1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 -2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 -1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 -2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 -) - - diff --git a/chardet/jpcntx.py b/chardet/jpcntx.py deleted file mode 100644 index 20044e4b..00000000 --- a/chardet/jpcntx.py +++ /dev/null @@ -1,233 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - - -# This is hiragana 2-char sequence table, the number in each cell represents its frequency category -jp2CharContext = ( -(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), -(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), -(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), -(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), -(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), -(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), -(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), -(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), -(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), -(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), -(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), -(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), -(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), -(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), -(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), -(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), -(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), -(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), -(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), -(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), -(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), -(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), -(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), -(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), -(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), -(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), -(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), -(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), -(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), -(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), -(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), -(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), -(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), -(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), -(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), -(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), -(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), -(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), -(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), -(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), -(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), -(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), -(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), -(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), -(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), -(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), -(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), -(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), -(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), -(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), -(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), -(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), -(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), -(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), -(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), -(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), -(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), -(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), -(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), -(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), -(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), -(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), -(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), -(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), -(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), -(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), -(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), -(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), -(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), -(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), -(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), -(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), -(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), -(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), -) - -class JapaneseContextAnalysis(object): - NUM_OF_CATEGORY = 6 - DONT_KNOW = -1 - ENOUGH_REL_THRESHOLD = 100 - MAX_REL_THRESHOLD = 1000 - MINIMUM_DATA_THRESHOLD = 4 - - def __init__(self): - self._total_rel = None - self._rel_sample = None - self._need_to_skip_char_num = None - self._last_char_order = None - self._done = None - self.reset() - - def reset(self): - self._total_rel = 0 # total sequence received - # category counters, each integer counts sequence in its category - self._rel_sample = [0] * self.NUM_OF_CATEGORY - # if last byte in current buffer is not the last byte of a character, - # we need to know how many bytes to skip in next buffer - self._need_to_skip_char_num = 0 - self._last_char_order = -1 # The order of previous char - # If this flag is set to True, detection is done and conclusion has - # been made - self._done = False - - def feed(self, byte_str, num_bytes): - if self._done: - return - - # The buffer we got is byte oriented, and a character may span in more than one - # buffers. In case the last one or two byte in last buffer is not - # complete, we record how many byte needed to complete that character - # and skip these bytes here. We can choose to record those bytes as - # well and analyse the character once it is complete, but since a - # character will not make much difference, by simply skipping - # this character will simply our logic and improve performance. - i = self._need_to_skip_char_num - while i < num_bytes: - order, char_len = self.get_order(byte_str[i:i + 2]) - i += char_len - if i > num_bytes: - self._need_to_skip_char_num = i - num_bytes - self._last_char_order = -1 - else: - if (order != -1) and (self._last_char_order != -1): - self._total_rel += 1 - if self._total_rel > self.MAX_REL_THRESHOLD: - self._done = True - break - self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 - self._last_char_order = order - - def got_enough_data(self): - return self._total_rel > self.ENOUGH_REL_THRESHOLD - - def get_confidence(self): - # This is just one way to calculate confidence. It works well for me. - if self._total_rel > self.MINIMUM_DATA_THRESHOLD: - return (self._total_rel - self._rel_sample[0]) / self._total_rel - else: - return self.DONT_KNOW - - def get_order(self, byte_str): - return -1, 1 - -class SJISContextAnalysis(JapaneseContextAnalysis): - def __init__(self): - super(SJISContextAnalysis, self).__init__() - self._charset_name = "SHIFT_JIS" - - @property - def charset_name(self): - return self._charset_name - - def get_order(self, byte_str): - if not byte_str: - return -1, 1 - # find out current char's byte length - first_char = byte_str[0] - if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): - char_len = 2 - if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): - self._charset_name = "CP932" - else: - char_len = 1 - - # return its order if it is hiragana - if len(byte_str) > 1: - second_char = byte_str[1] - if (first_char == 202) and (0x9F <= second_char <= 0xF1): - return second_char - 0x9F, char_len - - return -1, char_len - -class EUCJPContextAnalysis(JapaneseContextAnalysis): - def get_order(self, byte_str): - if not byte_str: - return -1, 1 - # find out current char's byte length - first_char = byte_str[0] - if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): - char_len = 2 - elif first_char == 0x8F: - char_len = 3 - else: - char_len = 1 - - # return its order if it is hiragana - if len(byte_str) > 1: - second_char = byte_str[1] - if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): - return second_char - 0xA1, char_len - - return -1, char_len - - diff --git a/chardet/langbulgarianmodel.py b/chardet/langbulgarianmodel.py deleted file mode 100644 index 2aa4fb2e..00000000 --- a/chardet/langbulgarianmodel.py +++ /dev/null @@ -1,228 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -# this table is modified base on win1251BulgarianCharToOrderMap, so -# only number <64 is sure valid - -Latin5_BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 -210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 - 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 - 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 -) - -win1251BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 -221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 - 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 - 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 96.9392% -# first 1024 sequences:3.0618% -# rest sequences: 0.2992% -# negative sequences: 0.0020% -BulgarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, -3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, -0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, -0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, -0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, -0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, -0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, -2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, -3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, -1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, -3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, -1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, -2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, -2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, -3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, -1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, -2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, -2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, -1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, -2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, -2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, -2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, -1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, -2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, -1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, -3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, -1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, -3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, -1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, -2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, -1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, -2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, -1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, -2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, -1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, -2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, -1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, -0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, -1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, -1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, -1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, -0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, -1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, -1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -) - -Latin5BulgarianModel = { - 'char_to_order_map': Latin5_BulgarianCharToOrderMap, - 'precedence_matrix': BulgarianLangModel, - 'typical_positive_ratio': 0.969392, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-5", - 'language': 'Bulgairan', -} - -Win1251BulgarianModel = { - 'char_to_order_map': win1251BulgarianCharToOrderMap, - 'precedence_matrix': BulgarianLangModel, - 'typical_positive_ratio': 0.969392, - 'keep_english_letter': False, - 'charset_name': "windows-1251", - 'language': 'Bulgarian', -} diff --git a/chardet/langcyrillicmodel.py b/chardet/langcyrillicmodel.py deleted file mode 100644 index e5f9a1fd..00000000 --- a/chardet/langcyrillicmodel.py +++ /dev/null @@ -1,333 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# KOI8-R language model -# Character Mapping Table: -KOI8R_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 -223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 -238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 - 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 - 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 - 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 - 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 -) - -win1251_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -) - -latin5_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -macCyrillic_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, -) - -IBM855_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, -206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, - 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, -220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, -230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, - 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, - 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, -250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, -) - -IBM866_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 97.6601% -# first 1024 sequences: 2.3389% -# rest sequences: 0.1237% -# negative sequences: 0.0009% -RussianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, -1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, -1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, -2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, -1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, -3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, -1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, -2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, -1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, -1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, -1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, -1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, -3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, -1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, -2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, -1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, -2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, -1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, -1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, -1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, -3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, -3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, -1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, -1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, -0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, -1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, -1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, -0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, -1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, -2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, -1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, -1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, -2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, -1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, -1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, -1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, -0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, -0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, -0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, -2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, -0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -) - -Koi8rModel = { - 'char_to_order_map': KOI8R_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "KOI8-R", - 'language': 'Russian', -} - -Win1251CyrillicModel = { - 'char_to_order_map': win1251_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "windows-1251", - 'language': 'Russian', -} - -Latin5CyrillicModel = { - 'char_to_order_map': latin5_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-5", - 'language': 'Russian', -} - -MacCyrillicModel = { - 'char_to_order_map': macCyrillic_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "MacCyrillic", - 'language': 'Russian', -} - -Ibm866Model = { - 'char_to_order_map': IBM866_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "IBM866", - 'language': 'Russian', -} - -Ibm855Model = { - 'char_to_order_map': IBM855_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "IBM855", - 'language': 'Russian', -} diff --git a/chardet/langgreekmodel.py b/chardet/langgreekmodel.py deleted file mode 100644 index 53322216..00000000 --- a/chardet/langgreekmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin7_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -win1253_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.2851% -# first 1024 sequences:1.7001% -# rest sequences: 0.0359% -# negative sequences: 0.0148% -GreekLangModel = ( -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, -2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, -2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, -2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, -0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, -3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, -2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, -0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, -0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, -0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, -0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, -0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, -0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, -0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, -0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, -0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, -0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, -0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, -0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, -0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, -0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, -0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, -0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, -0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -Latin7GreekModel = { - 'char_to_order_map': Latin7_char_to_order_map, - 'precedence_matrix': GreekLangModel, - 'typical_positive_ratio': 0.982851, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-7", - 'language': 'Greek', -} - -Win1253GreekModel = { - 'char_to_order_map': win1253_char_to_order_map, - 'precedence_matrix': GreekLangModel, - 'typical_positive_ratio': 0.982851, - 'keep_english_letter': False, - 'charset_name': "windows-1253", - 'language': 'Greek', -} diff --git a/chardet/langhebrewmodel.py b/chardet/langhebrewmodel.py deleted file mode 100644 index 58f4c875..00000000 --- a/chardet/langhebrewmodel.py +++ /dev/null @@ -1,200 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Simon Montagu -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Shoshannah Forbes - original C code (?) -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Windows-1255 language model -# Character Mapping Table: -WIN1255_CHAR_TO_ORDER_MAP = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 - 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 -253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 - 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 -124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, -215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, - 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, -106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, - 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, -238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, - 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, - 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.4004% -# first 1024 sequences: 1.5981% -# rest sequences: 0.087% -# negative sequences: 0.0015% -HEBREW_LANG_MODEL = ( -0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, -3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, -1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, -1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, -1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, -1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, -0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, -0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, -0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, -0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, -0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, -0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, -0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, -0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, -0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, -0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, -0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, -0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, -0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, -1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, -1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, -2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, -0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, -0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, -) - -Win1255HebrewModel = { - 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, - 'precedence_matrix': HEBREW_LANG_MODEL, - 'typical_positive_ratio': 0.984004, - 'keep_english_letter': False, - 'charset_name': "windows-1255", - 'language': 'Hebrew', -} diff --git a/chardet/langhungarianmodel.py b/chardet/langhungarianmodel.py deleted file mode 100644 index bb7c095e..00000000 --- a/chardet/langhungarianmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin2_HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, -175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, - 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, - 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, -245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -win1250HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, -177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, - 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, - 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, -245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 94.7368% -# first 1024 sequences:5.2623% -# rest sequences: 0.8894% -# negative sequences: 0.0009% -HungarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, -3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, -0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, -1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, -1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, -3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, -2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, -2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, -2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, -2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, -1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, -1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, -3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, -1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, -1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, -2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, -2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, -2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, -3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, -1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, -1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, -1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, -2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, -1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, -2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, -2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, -1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, -1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, -0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, -2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, -2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, -1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, -1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, -2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, -2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, -2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, -1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, -0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -) - -Latin2HungarianModel = { - 'char_to_order_map': Latin2_HungarianCharToOrderMap, - 'precedence_matrix': HungarianLangModel, - 'typical_positive_ratio': 0.947368, - 'keep_english_letter': True, - 'charset_name': "ISO-8859-2", - 'language': 'Hungarian', -} - -Win1250HungarianModel = { - 'char_to_order_map': win1250HungarianCharToOrderMap, - 'precedence_matrix': HungarianLangModel, - 'typical_positive_ratio': 0.947368, - 'keep_english_letter': True, - 'charset_name': "windows-1250", - 'language': 'Hungarian', -} diff --git a/chardet/langthaimodel.py b/chardet/langthaimodel.py deleted file mode 100644 index 15f94c2d..00000000 --- a/chardet/langthaimodel.py +++ /dev/null @@ -1,199 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# The following result for thai was collected from a limited sample (1M). - -# Character Mapping Table: -TIS620CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 -188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 -253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 - 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 -209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, -223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, -236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, - 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, - 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, - 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, - 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, - 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 92.6386% -# first 1024 sequences:7.3177% -# rest sequences: 1.0230% -# negative sequences: 0.0436% -ThaiLangModel = ( -0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, -0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, -3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, -0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, -3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, -3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, -3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, -3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, -2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, -3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, -1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, -3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, -1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, -0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, -0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, -2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, -0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, -3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, -2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, -2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, -3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, -3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, -3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, -3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, -1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, -0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, -0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, -3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, -3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, -1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, -3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, -3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, -0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, -0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, -1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, -1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, -3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, -0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, -3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, -0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, -0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, -0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, -0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, -0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, -0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, -0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, -0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, -0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, -3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, -2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, -0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, -3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, -1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, -1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -TIS620ThaiModel = { - 'char_to_order_map': TIS620CharToOrderMap, - 'precedence_matrix': ThaiLangModel, - 'typical_positive_ratio': 0.926386, - 'keep_english_letter': False, - 'charset_name': "TIS-620", - 'language': 'Thai', -} diff --git a/chardet/langturkishmodel.py b/chardet/langturkishmodel.py deleted file mode 100644 index a427a457..00000000 --- a/chardet/langturkishmodel.py +++ /dev/null @@ -1,193 +0,0 @@ -# -*- coding: utf-8 -*- -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Özgür Baskın - Turkish Language Model -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin5_TurkishCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, - 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, -255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, - 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, -180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, -164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, -150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, - 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, -124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, - 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, - 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, - 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, -) - -TurkishLangModel = ( -3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, -3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, -3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, -3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, -3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, -3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, -3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, -2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, -3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, -2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, -1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, -2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, -3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, -3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, -2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, -3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, -2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, -3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, -3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, -3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, -0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, -3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, -0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, -3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, -3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, -2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, -2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, -3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, -0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, -1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, -3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, -1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, -3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, -2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, -0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, -3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, -0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, -1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, -1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, -2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, -2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, -0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, -2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, -3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, -0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, -3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, -1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, -0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, -3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, -0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, -3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, -3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, -1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, -2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, -0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, -3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, -0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, -0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, -3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, -0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, -0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, -3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, -0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, -3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, -0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, -0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, -3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, -0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, -0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, -3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, -0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, -0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, -0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, -0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, -0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, -0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, -0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, -1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, -0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, -0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, -3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, -0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, -2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, -2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, -0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, -0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -Latin5TurkishModel = { - 'char_to_order_map': Latin5_TurkishCharToOrderMap, - 'precedence_matrix': TurkishLangModel, - 'typical_positive_ratio': 0.970290, - 'keep_english_letter': True, - 'charset_name': "ISO-8859-9", - 'language': 'Turkish', -} diff --git a/chardet/latin1prober.py b/chardet/latin1prober.py deleted file mode 100644 index 7d1e8c20..00000000 --- a/chardet/latin1prober.py +++ /dev/null @@ -1,145 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import ProbingState - -FREQ_CAT_NUM = 4 - -UDF = 0 # undefined -OTH = 1 # other -ASC = 2 # ascii capital letter -ASS = 3 # ascii small letter -ACV = 4 # accent capital vowel -ACO = 5 # accent capital other -ASV = 6 # accent small vowel -ASO = 7 # accent small other -CLASS_NUM = 8 # total classes - -Latin1_CharToClass = ( - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F - OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 - ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F - OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 - ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F - OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 - OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F - UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 - OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF - ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 - ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF - ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 - ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF - ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 - ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF - ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 - ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF -) - -# 0 : illegal -# 1 : very unlikely -# 2 : normal -# 3 : very likely -Latin1ClassModel = ( -# UDF OTH ASC ASS ACV ACO ASV ASO - 0, 0, 0, 0, 0, 0, 0, 0, # UDF - 0, 3, 3, 3, 3, 3, 3, 3, # OTH - 0, 3, 3, 3, 3, 3, 3, 3, # ASC - 0, 3, 3, 3, 1, 1, 3, 3, # ASS - 0, 3, 3, 3, 1, 2, 1, 2, # ACV - 0, 3, 3, 3, 3, 3, 3, 3, # ACO - 0, 3, 1, 3, 1, 1, 1, 3, # ASV - 0, 3, 1, 3, 1, 1, 3, 3, # ASO -) - - -class Latin1Prober(CharSetProber): - def __init__(self): - super(Latin1Prober, self).__init__() - self._last_char_class = None - self._freq_counter = None - self.reset() - - def reset(self): - self._last_char_class = OTH - self._freq_counter = [0] * FREQ_CAT_NUM - CharSetProber.reset(self) - - @property - def charset_name(self): - return "ISO-8859-1" - - @property - def language(self): - return "" - - def feed(self, byte_str): - byte_str = self.filter_with_english_letters(byte_str) - for c in byte_str: - char_class = Latin1_CharToClass[c] - freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) - + char_class] - if freq == 0: - self._state = ProbingState.NOT_ME - break - self._freq_counter[freq] += 1 - self._last_char_class = char_class - - return self.state - - def get_confidence(self): - if self.state == ProbingState.NOT_ME: - return 0.01 - - total = sum(self._freq_counter) - if total < 0.01: - confidence = 0.0 - else: - confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) - / total) - if confidence < 0.0: - confidence = 0.0 - # lower the confidence of latin1 so that other more accurate - # detector can take priority. - confidence = confidence * 0.73 - return confidence diff --git a/chardet/mbcharsetprober.py b/chardet/mbcharsetprober.py deleted file mode 100644 index 6256ecfd..00000000 --- a/chardet/mbcharsetprober.py +++ /dev/null @@ -1,91 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import ProbingState, MachineState - - -class MultiByteCharSetProber(CharSetProber): - """ - MultiByteCharSetProber - """ - - def __init__(self, lang_filter=None): - super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) - self.distribution_analyzer = None - self.coding_sm = None - self._last_char = [0, 0] - - def reset(self): - super(MultiByteCharSetProber, self).reset() - if self.coding_sm: - self.coding_sm.reset() - if self.distribution_analyzer: - self.distribution_analyzer.reset() - self._last_char = [0, 0] - - @property - def charset_name(self): - raise NotImplementedError - - @property - def language(self): - raise NotImplementedError - - def feed(self, byte_str): - for i in range(len(byte_str)): - coding_state = self.coding_sm.next_state(byte_str[i]) - if coding_state == MachineState.ERROR: - self.logger.debug('%s %s prober hit error at byte %s', - self.charset_name, self.language, i) - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.distribution_analyzer.feed(byte_str[i - 1:i + 1], - char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if (self.distribution_analyzer.got_enough_data() and - (self.get_confidence() > self.SHORTCUT_THRESHOLD)): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - return self.distribution_analyzer.get_confidence() diff --git a/chardet/mbcsgroupprober.py b/chardet/mbcsgroupprober.py deleted file mode 100644 index 530abe75..00000000 --- a/chardet/mbcsgroupprober.py +++ /dev/null @@ -1,54 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .utf8prober import UTF8Prober -from .sjisprober import SJISProber -from .eucjpprober import EUCJPProber -from .gb2312prober import GB2312Prober -from .euckrprober import EUCKRProber -from .cp949prober import CP949Prober -from .big5prober import Big5Prober -from .euctwprober import EUCTWProber - - -class MBCSGroupProber(CharSetGroupProber): - def __init__(self, lang_filter=None): - super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) - self.probers = [ - UTF8Prober(), - SJISProber(), - EUCJPProber(), - GB2312Prober(), - EUCKRProber(), - CP949Prober(), - Big5Prober(), - EUCTWProber() - ] - self.reset() diff --git a/chardet/mbcssm.py b/chardet/mbcssm.py deleted file mode 100644 index 8360d0f2..00000000 --- a/chardet/mbcssm.py +++ /dev/null @@ -1,572 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .enums import MachineState - -# BIG5 - -BIG5_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 4,4,4,4,4,4,4,4, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 4,3,3,3,3,3,3,3, # a0 - a7 - 3,3,3,3,3,3,3,3, # a8 - af - 3,3,3,3,3,3,3,3, # b0 - b7 - 3,3,3,3,3,3,3,3, # b8 - bf - 3,3,3,3,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -BIG5_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 -) - -BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) - -BIG5_SM_MODEL = {'class_table': BIG5_CLS, - 'class_factor': 5, - 'state_table': BIG5_ST, - 'char_len_table': BIG5_CHAR_LEN_TABLE, - 'name': 'Big5'} - -# CP949 - -CP949_CLS = ( - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f - 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f - 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f - 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f - 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f - 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f - 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f - 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f - 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af - 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf - 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff -) - -CP949_ST = ( -#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = - MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 -) - -CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) - -CP949_SM_MODEL = {'class_table': CP949_CLS, - 'class_factor': 10, - 'state_table': CP949_ST, - 'char_len_table': CP949_CHAR_LEN_TABLE, - 'name': 'CP949'} - -# EUC-JP - -EUCJP_CLS = ( - 4,4,4,4,4,4,4,4, # 00 - 07 - 4,4,4,4,4,4,5,5, # 08 - 0f - 4,4,4,4,4,4,4,4, # 10 - 17 - 4,4,4,5,4,4,4,4, # 18 - 1f - 4,4,4,4,4,4,4,4, # 20 - 27 - 4,4,4,4,4,4,4,4, # 28 - 2f - 4,4,4,4,4,4,4,4, # 30 - 37 - 4,4,4,4,4,4,4,4, # 38 - 3f - 4,4,4,4,4,4,4,4, # 40 - 47 - 4,4,4,4,4,4,4,4, # 48 - 4f - 4,4,4,4,4,4,4,4, # 50 - 57 - 4,4,4,4,4,4,4,4, # 58 - 5f - 4,4,4,4,4,4,4,4, # 60 - 67 - 4,4,4,4,4,4,4,4, # 68 - 6f - 4,4,4,4,4,4,4,4, # 70 - 77 - 4,4,4,4,4,4,4,4, # 78 - 7f - 5,5,5,5,5,5,5,5, # 80 - 87 - 5,5,5,5,5,5,1,3, # 88 - 8f - 5,5,5,5,5,5,5,5, # 90 - 97 - 5,5,5,5,5,5,5,5, # 98 - 9f - 5,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,0,5 # f8 - ff -) - -EUCJP_ST = ( - 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f - 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 -) - -EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) - -EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, - 'class_factor': 6, - 'state_table': EUCJP_ST, - 'char_len_table': EUCJP_CHAR_LEN_TABLE, - 'name': 'EUC-JP'} - -# EUC-KR - -EUCKR_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,3,3,3, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,3,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 2,2,2,2,2,2,2,2, # e0 - e7 - 2,2,2,2,2,2,2,2, # e8 - ef - 2,2,2,2,2,2,2,2, # f0 - f7 - 2,2,2,2,2,2,2,0 # f8 - ff -) - -EUCKR_ST = ( - MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f -) - -EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) - -EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, - 'class_factor': 4, - 'state_table': EUCKR_ST, - 'char_len_table': EUCKR_CHAR_LEN_TABLE, - 'name': 'EUC-KR'} - -# EUC-TW - -EUCTW_CLS = ( - 2,2,2,2,2,2,2,2, # 00 - 07 - 2,2,2,2,2,2,0,0, # 08 - 0f - 2,2,2,2,2,2,2,2, # 10 - 17 - 2,2,2,0,2,2,2,2, # 18 - 1f - 2,2,2,2,2,2,2,2, # 20 - 27 - 2,2,2,2,2,2,2,2, # 28 - 2f - 2,2,2,2,2,2,2,2, # 30 - 37 - 2,2,2,2,2,2,2,2, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,2, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,6,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,3,4,4,4,4,4,4, # a0 - a7 - 5,5,1,1,1,1,1,1, # a8 - af - 1,1,1,1,1,1,1,1, # b0 - b7 - 1,1,1,1,1,1,1,1, # b8 - bf - 1,1,3,1,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -EUCTW_ST = ( - MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 - MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 - MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f -) - -EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) - -EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, - 'class_factor': 7, - 'state_table': EUCTW_ST, - 'char_len_table': EUCTW_CHAR_LEN_TABLE, - 'name': 'x-euc-tw'} - -# GB2312 - -GB2312_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 3,3,3,3,3,3,3,3, # 30 - 37 - 3,3,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,4, # 78 - 7f - 5,6,6,6,6,6,6,6, # 80 - 87 - 6,6,6,6,6,6,6,6, # 88 - 8f - 6,6,6,6,6,6,6,6, # 90 - 97 - 6,6,6,6,6,6,6,6, # 98 - 9f - 6,6,6,6,6,6,6,6, # a0 - a7 - 6,6,6,6,6,6,6,6, # a8 - af - 6,6,6,6,6,6,6,6, # b0 - b7 - 6,6,6,6,6,6,6,6, # b8 - bf - 6,6,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 6,6,6,6,6,6,6,6, # e0 - e7 - 6,6,6,6,6,6,6,6, # e8 - ef - 6,6,6,6,6,6,6,6, # f0 - f7 - 6,6,6,6,6,6,6,0 # f8 - ff -) - -GB2312_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 - 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f -) - -# To be accurate, the length of class 6 can be either 2 or 4. -# But it is not necessary to discriminate between the two since -# it is used for frequency analysis only, and we are validating -# each code range there as well. So it is safe to set it to be -# 2 here. -GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) - -GB2312_SM_MODEL = {'class_table': GB2312_CLS, - 'class_factor': 7, - 'state_table': GB2312_ST, - 'char_len_table': GB2312_CHAR_LEN_TABLE, - 'name': 'GB2312'} - -# Shift_JIS - -SJIS_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 3,3,3,3,3,2,2,3, # 80 - 87 - 3,3,3,3,3,3,3,3, # 88 - 8f - 3,3,3,3,3,3,3,3, # 90 - 97 - 3,3,3,3,3,3,3,3, # 98 - 9f - #0xa0 is illegal in sjis encoding, but some pages does - #contain such byte. We need to be more error forgiven. - 2,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,4,4,4, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,0,0,0) # f8 - ff - - -SJIS_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 -) - -SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) - -SJIS_SM_MODEL = {'class_table': SJIS_CLS, - 'class_factor': 6, - 'state_table': SJIS_ST, - 'char_len_table': SJIS_CHAR_LEN_TABLE, - 'name': 'Shift_JIS'} - -# UCS2-BE - -UCS2BE_CLS = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2BE_ST = ( - 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 - 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f - 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 - 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f - 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 -) - -UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) - -UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, - 'class_factor': 6, - 'state_table': UCS2BE_ST, - 'char_len_table': UCS2BE_CHAR_LEN_TABLE, - 'name': 'UTF-16BE'} - -# UCS2-LE - -UCS2LE_CLS = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2LE_ST = ( - 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 - 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f - 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 - 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f - 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 -) - -UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) - -UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, - 'class_factor': 6, - 'state_table': UCS2LE_ST, - 'char_len_table': UCS2LE_CHAR_LEN_TABLE, - 'name': 'UTF-16LE'} - -# UTF-8 - -UTF8_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 2,2,2,2,3,3,3,3, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 5,5,5,5,5,5,5,5, # a0 - a7 - 5,5,5,5,5,5,5,5, # a8 - af - 5,5,5,5,5,5,5,5, # b0 - b7 - 5,5,5,5,5,5,5,5, # b8 - bf - 0,0,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 7,8,8,8,8,8,8,8, # e0 - e7 - 8,8,8,8,8,9,8,8, # e8 - ef - 10,11,11,11,11,11,11,11, # f0 - f7 - 12,13,13,13,14,15,0,0 # f8 - ff -) - -UTF8_ST = ( - MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 - 9, 11, 8, 7, 6, 5, 4, 3,#08-0f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f - MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f - MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f - MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f - MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af - MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf -) - -UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) - -UTF8_SM_MODEL = {'class_table': UTF8_CLS, - 'class_factor': 16, - 'state_table': UTF8_ST, - 'char_len_table': UTF8_CHAR_LEN_TABLE, - 'name': 'UTF-8'} diff --git a/chardet/sbcharsetprober.py b/chardet/sbcharsetprober.py deleted file mode 100644 index 0adb51de..00000000 --- a/chardet/sbcharsetprober.py +++ /dev/null @@ -1,132 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import CharacterCategory, ProbingState, SequenceLikelihood - - -class SingleByteCharSetProber(CharSetProber): - SAMPLE_SIZE = 64 - SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 - POSITIVE_SHORTCUT_THRESHOLD = 0.95 - NEGATIVE_SHORTCUT_THRESHOLD = 0.05 - - def __init__(self, model, reversed=False, name_prober=None): - super(SingleByteCharSetProber, self).__init__() - self._model = model - # TRUE if we need to reverse every pair in the model lookup - self._reversed = reversed - # Optional auxiliary prober for name decision - self._name_prober = name_prober - self._last_order = None - self._seq_counters = None - self._total_seqs = None - self._total_char = None - self._freq_char = None - self.reset() - - def reset(self): - super(SingleByteCharSetProber, self).reset() - # char order of last character - self._last_order = 255 - self._seq_counters = [0] * SequenceLikelihood.get_num_categories() - self._total_seqs = 0 - self._total_char = 0 - # characters that fall in our sampling range - self._freq_char = 0 - - @property - def charset_name(self): - if self._name_prober: - return self._name_prober.charset_name - else: - return self._model['charset_name'] - - @property - def language(self): - if self._name_prober: - return self._name_prober.language - else: - return self._model.get('language') - - def feed(self, byte_str): - if not self._model['keep_english_letter']: - byte_str = self.filter_international_words(byte_str) - if not byte_str: - return self.state - char_to_order_map = self._model['char_to_order_map'] - for i, c in enumerate(byte_str): - # XXX: Order is in range 1-64, so one would think we want 0-63 here, - # but that leads to 27 more test failures than before. - order = char_to_order_map[c] - # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but - # CharacterCategory.SYMBOL is actually 253, so we use CONTROL - # to make it closer to the original intent. The only difference - # is whether or not we count digits and control characters for - # _total_char purposes. - if order < CharacterCategory.CONTROL: - self._total_char += 1 - if order < self.SAMPLE_SIZE: - self._freq_char += 1 - if self._last_order < self.SAMPLE_SIZE: - self._total_seqs += 1 - if not self._reversed: - i = (self._last_order * self.SAMPLE_SIZE) + order - model = self._model['precedence_matrix'][i] - else: # reverse the order of the letters in the lookup - i = (order * self.SAMPLE_SIZE) + self._last_order - model = self._model['precedence_matrix'][i] - self._seq_counters[model] += 1 - self._last_order = order - - charset_name = self._model['charset_name'] - if self.state == ProbingState.DETECTING: - if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: - confidence = self.get_confidence() - if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: - self.logger.debug('%s confidence = %s, we have a winner', - charset_name, confidence) - self._state = ProbingState.FOUND_IT - elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: - self.logger.debug('%s confidence = %s, below negative ' - 'shortcut threshhold %s', charset_name, - confidence, - self.NEGATIVE_SHORTCUT_THRESHOLD) - self._state = ProbingState.NOT_ME - - return self.state - - def get_confidence(self): - r = 0.01 - if self._total_seqs > 0: - r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / - self._total_seqs / self._model['typical_positive_ratio']) - r = r * self._freq_char / self._total_char - if r >= 1.0: - r = 0.99 - return r diff --git a/chardet/sbcsgroupprober.py b/chardet/sbcsgroupprober.py deleted file mode 100644 index 98e95dc1..00000000 --- a/chardet/sbcsgroupprober.py +++ /dev/null @@ -1,73 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .sbcharsetprober import SingleByteCharSetProber -from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, - Latin5CyrillicModel, MacCyrillicModel, - Ibm866Model, Ibm855Model) -from .langgreekmodel import Latin7GreekModel, Win1253GreekModel -from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel -# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel -from .langthaimodel import TIS620ThaiModel -from .langhebrewmodel import Win1255HebrewModel -from .hebrewprober import HebrewProber -from .langturkishmodel import Latin5TurkishModel - - -class SBCSGroupProber(CharSetGroupProber): - def __init__(self): - super(SBCSGroupProber, self).__init__() - self.probers = [ - SingleByteCharSetProber(Win1251CyrillicModel), - SingleByteCharSetProber(Koi8rModel), - SingleByteCharSetProber(Latin5CyrillicModel), - SingleByteCharSetProber(MacCyrillicModel), - SingleByteCharSetProber(Ibm866Model), - SingleByteCharSetProber(Ibm855Model), - SingleByteCharSetProber(Latin7GreekModel), - SingleByteCharSetProber(Win1253GreekModel), - SingleByteCharSetProber(Latin5BulgarianModel), - SingleByteCharSetProber(Win1251BulgarianModel), - # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) - # after we retrain model. - # SingleByteCharSetProber(Latin2HungarianModel), - # SingleByteCharSetProber(Win1250HungarianModel), - SingleByteCharSetProber(TIS620ThaiModel), - SingleByteCharSetProber(Latin5TurkishModel), - ] - hebrew_prober = HebrewProber() - logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, - False, hebrew_prober) - visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, - hebrew_prober) - hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) - self.probers.extend([hebrew_prober, logical_hebrew_prober, - visual_hebrew_prober]) - - self.reset() diff --git a/chardet/sjisprober.py b/chardet/sjisprober.py deleted file mode 100644 index 9e29623b..00000000 --- a/chardet/sjisprober.py +++ /dev/null @@ -1,92 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import SJISDistributionAnalysis -from .jpcntx import SJISContextAnalysis -from .mbcssm import SJIS_SM_MODEL -from .enums import ProbingState, MachineState - - -class SJISProber(MultiByteCharSetProber): - def __init__(self): - super(SJISProber, self).__init__() - self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) - self.distribution_analyzer = SJISDistributionAnalysis() - self.context_analyzer = SJISContextAnalysis() - self.reset() - - def reset(self): - super(SJISProber, self).reset() - self.context_analyzer.reset() - - @property - def charset_name(self): - return self.context_analyzer.charset_name - - @property - def language(self): - return "Japanese" - - def feed(self, byte_str): - for i in range(len(byte_str)): - coding_state = self.coding_sm.next_state(byte_str[i]) - if coding_state == MachineState.ERROR: - self.logger.debug('%s %s prober hit error at byte %s', - self.charset_name, self.language, i) - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - self.context_analyzer.feed(self._last_char[2 - char_len:], - char_len) - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 - - char_len], char_len) - self.distribution_analyzer.feed(byte_str[i - 1:i + 1], - char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if (self.context_analyzer.got_enough_data() and - (self.get_confidence() > self.SHORTCUT_THRESHOLD)): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/chardet/universaldetector.py b/chardet/universaldetector.py deleted file mode 100644 index 7b4e92d6..00000000 --- a/chardet/universaldetector.py +++ /dev/null @@ -1,286 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### -""" -Module containing the UniversalDetector detector class, which is the primary -class a user of ``chardet`` should use. - -:author: Mark Pilgrim (initial port to Python) -:author: Shy Shalom (original C code) -:author: Dan Blanchard (major refactoring for 3.0) -:author: Ian Cordasco -""" - - -import codecs -import logging -import re - -from .charsetgroupprober import CharSetGroupProber -from .enums import InputState, LanguageFilter, ProbingState -from .escprober import EscCharSetProber -from .latin1prober import Latin1Prober -from .mbcsgroupprober import MBCSGroupProber -from .sbcsgroupprober import SBCSGroupProber - - -class UniversalDetector(object): - """ - The ``UniversalDetector`` class underlies the ``chardet.detect`` function - and coordinates all of the different charset probers. - - To get a ``dict`` containing an encoding and its confidence, you can simply - run: - - .. code:: - - u = UniversalDetector() - u.feed(some_bytes) - u.close() - detected = u.result - - """ - - MINIMUM_THRESHOLD = 0.20 - HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') - ESC_DETECTOR = re.compile(b'(\033|~{)') - WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') - ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', - 'iso-8859-2': 'Windows-1250', - 'iso-8859-5': 'Windows-1251', - 'iso-8859-6': 'Windows-1256', - 'iso-8859-7': 'Windows-1253', - 'iso-8859-8': 'Windows-1255', - 'iso-8859-9': 'Windows-1254', - 'iso-8859-13': 'Windows-1257'} - - def __init__(self, lang_filter=LanguageFilter.ALL): - self._esc_charset_prober = None - self._charset_probers = [] - self.result = None - self.done = None - self._got_data = None - self._input_state = None - self._last_char = None - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - self._has_win_bytes = None - self.reset() - - def reset(self): - """ - Reset the UniversalDetector and all of its probers back to their - initial states. This is called by ``__init__``, so you only need to - call this directly in between analyses of different documents. - """ - self.result = {'encoding': None, 'confidence': 0.0, 'language': None} - self.done = False - self._got_data = False - self._has_win_bytes = False - self._input_state = InputState.PURE_ASCII - self._last_char = b'' - if self._esc_charset_prober: - self._esc_charset_prober.reset() - for prober in self._charset_probers: - prober.reset() - - def feed(self, byte_str): - """ - Takes a chunk of a document and feeds it through all of the relevant - charset probers. - - After calling ``feed``, you can check the value of the ``done`` - attribute to see if you need to continue feeding the - ``UniversalDetector`` more data, or if it has made a prediction - (in the ``result`` attribute). - - .. note:: - You should always call ``close`` when you're done feeding in your - document if ``done`` is not already ``True``. - """ - if self.done: - return - - if not len(byte_str): - return - - if not isinstance(byte_str, bytearray): - byte_str = bytearray(byte_str) - - # First check for known BOMs, since these are guaranteed to be correct - if not self._got_data: - # If the data starts with BOM, we know it is UTF - if byte_str.startswith(codecs.BOM_UTF8): - # EF BB BF UTF-8 with BOM - self.result = {'encoding': "UTF-8-SIG", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith((codecs.BOM_UTF32_LE, - codecs.BOM_UTF32_BE)): - # FF FE 00 00 UTF-32, little-endian BOM - # 00 00 FE FF UTF-32, big-endian BOM - self.result = {'encoding': "UTF-32", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith(b'\xFE\xFF\x00\x00'): - # FE FF 00 00 UCS-4, unusual octet order BOM (3412) - self.result = {'encoding': "X-ISO-10646-UCS-4-3412", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith(b'\x00\x00\xFF\xFE'): - # 00 00 FF FE UCS-4, unusual octet order BOM (2143) - self.result = {'encoding': "X-ISO-10646-UCS-4-2143", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): - # FF FE UTF-16, little endian BOM - # FE FF UTF-16, big endian BOM - self.result = {'encoding': "UTF-16", - 'confidence': 1.0, - 'language': ''} - - self._got_data = True - if self.result['encoding'] is not None: - self.done = True - return - - # If none of those matched and we've only see ASCII so far, check - # for high bytes and escape sequences - if self._input_state == InputState.PURE_ASCII: - if self.HIGH_BYTE_DETECTOR.search(byte_str): - self._input_state = InputState.HIGH_BYTE - elif self._input_state == InputState.PURE_ASCII and \ - self.ESC_DETECTOR.search(self._last_char + byte_str): - self._input_state = InputState.ESC_ASCII - - self._last_char = byte_str[-1:] - - # If we've seen escape sequences, use the EscCharSetProber, which - # uses a simple state machine to check for known escape sequences in - # HZ and ISO-2022 encodings, since those are the only encodings that - # use such sequences. - if self._input_state == InputState.ESC_ASCII: - if not self._esc_charset_prober: - self._esc_charset_prober = EscCharSetProber(self.lang_filter) - if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: - self.result = {'encoding': - self._esc_charset_prober.charset_name, - 'confidence': - self._esc_charset_prober.get_confidence(), - 'language': - self._esc_charset_prober.language} - self.done = True - # If we've seen high bytes (i.e., those with values greater than 127), - # we need to do more complicated checks using all our multi-byte and - # single-byte probers that are left. The single-byte probers - # use character bigram distributions to determine the encoding, whereas - # the multi-byte probers use a combination of character unigram and - # bigram distributions. - elif self._input_state == InputState.HIGH_BYTE: - if not self._charset_probers: - self._charset_probers = [MBCSGroupProber(self.lang_filter)] - # If we're checking non-CJK encodings, use single-byte prober - if self.lang_filter & LanguageFilter.NON_CJK: - self._charset_probers.append(SBCSGroupProber()) - self._charset_probers.append(Latin1Prober()) - for prober in self._charset_probers: - if prober.feed(byte_str) == ProbingState.FOUND_IT: - self.result = {'encoding': prober.charset_name, - 'confidence': prober.get_confidence(), - 'language': prober.language} - self.done = True - break - if self.WIN_BYTE_DETECTOR.search(byte_str): - self._has_win_bytes = True - - def close(self): - """ - Stop analyzing the current document and come up with a final - prediction. - - :returns: The ``result`` attribute, a ``dict`` with the keys - `encoding`, `confidence`, and `language`. - """ - # Don't bother with checks if we're already done - if self.done: - return self.result - self.done = True - - if not self._got_data: - self.logger.debug('no data received!') - - # Default to ASCII if it is all we've seen so far - elif self._input_state == InputState.PURE_ASCII: - self.result = {'encoding': 'ascii', - 'confidence': 1.0, - 'language': ''} - - # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD - elif self._input_state == InputState.HIGH_BYTE: - prober_confidence = None - max_prober_confidence = 0.0 - max_prober = None - for prober in self._charset_probers: - if not prober: - continue - prober_confidence = prober.get_confidence() - if prober_confidence > max_prober_confidence: - max_prober_confidence = prober_confidence - max_prober = prober - if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): - charset_name = max_prober.charset_name - lower_charset_name = max_prober.charset_name.lower() - confidence = max_prober.get_confidence() - # Use Windows encoding name instead of ISO-8859 if we saw any - # extra Windows-specific bytes - if lower_charset_name.startswith('iso-8859'): - if self._has_win_bytes: - charset_name = self.ISO_WIN_MAP.get(lower_charset_name, - charset_name) - self.result = {'encoding': charset_name, - 'confidence': confidence, - 'language': max_prober.language} - - # Log all prober confidences if none met MINIMUM_THRESHOLD - if self.logger.getEffectiveLevel() == logging.DEBUG: - if self.result['encoding'] is None: - self.logger.debug('no probers hit minimum threshold') - for group_prober in self._charset_probers: - if not group_prober: - continue - if isinstance(group_prober, CharSetGroupProber): - for prober in group_prober.probers: - self.logger.debug('%s %s confidence = %s', - prober.charset_name, - prober.language, - prober.get_confidence()) - else: - self.logger.debug('%s %s confidence = %s', - prober.charset_name, - prober.language, - prober.get_confidence()) - return self.result diff --git a/chardet/utf8prober.py b/chardet/utf8prober.py deleted file mode 100644 index 6c3196cc..00000000 --- a/chardet/utf8prober.py +++ /dev/null @@ -1,82 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import ProbingState, MachineState -from .codingstatemachine import CodingStateMachine -from .mbcssm import UTF8_SM_MODEL - - - -class UTF8Prober(CharSetProber): - ONE_CHAR_PROB = 0.5 - - def __init__(self): - super(UTF8Prober, self).__init__() - self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) - self._num_mb_chars = None - self.reset() - - def reset(self): - super(UTF8Prober, self).reset() - self.coding_sm.reset() - self._num_mb_chars = 0 - - @property - def charset_name(self): - return "utf-8" - - @property - def language(self): - return "" - - def feed(self, byte_str): - for c in byte_str: - coding_state = self.coding_sm.next_state(c) - if coding_state == MachineState.ERROR: - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - if self.coding_sm.get_current_charlen() >= 2: - self._num_mb_chars += 1 - - if self.state == ProbingState.DETECTING: - if self.get_confidence() > self.SHORTCUT_THRESHOLD: - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - unlike = 0.99 - if self._num_mb_chars < 6: - unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars - return 1.0 - unlike - else: - return unlike diff --git a/chardet/version.py b/chardet/version.py deleted file mode 100644 index bb2a34a7..00000000 --- a/chardet/version.py +++ /dev/null @@ -1,9 +0,0 @@ -""" -This module exists only to simplify retrieving the version number of chardet -from within setup.py and from chardet subpackages. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - -__version__ = "3.0.4" -VERSION = __version__.split('.') diff --git a/idna/__init__.py b/idna/__init__.py deleted file mode 100644 index 847bf935..00000000 --- a/idna/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .package_data import __version__ -from .core import * diff --git a/idna/codec.py b/idna/codec.py deleted file mode 100644 index 98c65ead..00000000 --- a/idna/codec.py +++ /dev/null @@ -1,118 +0,0 @@ -from .core import encode, decode, alabel, ulabel, IDNAError -import codecs -import re - -_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') - -class Codec(codecs.Codec): - - def encode(self, data, errors='strict'): - - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return "", 0 - - return encode(data), len(data) - - def decode(self, data, errors='strict'): - - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return u"", 0 - - return decode(data), len(data) - -class IncrementalEncoder(codecs.BufferedIncrementalEncoder): - def _buffer_encode(self, data, errors, final): - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return ("", 0) - - labels = _unicode_dots_re.split(data) - trailing_dot = u'' - if labels: - if not labels[-1]: - trailing_dot = '.' - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = '.' - - result = [] - size = 0 - for label in labels: - result.append(alabel(label)) - if size: - size += 1 - size += len(label) - - # Join with U+002E - result = ".".join(result) + trailing_dot - size += len(trailing_dot) - return (result, size) - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def _buffer_decode(self, data, errors, final): - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return (u"", 0) - - # IDNA allows decoding to operate on Unicode strings, too. - if isinstance(data, unicode): - labels = _unicode_dots_re.split(data) - else: - # Must be ASCII string - data = str(data) - unicode(data, "ascii") - labels = data.split(".") - - trailing_dot = u'' - if labels: - if not labels[-1]: - trailing_dot = u'.' - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = u'.' - - result = [] - size = 0 - for label in labels: - result.append(ulabel(label)) - if size: - size += 1 - size += len(label) - - result = u".".join(result) + trailing_dot - size += len(trailing_dot) - return (result, size) - - -class StreamWriter(Codec, codecs.StreamWriter): - pass - -class StreamReader(Codec, codecs.StreamReader): - pass - -def getregentry(): - return codecs.CodecInfo( - name='idna', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) diff --git a/idna/compat.py b/idna/compat.py deleted file mode 100644 index 4d47f336..00000000 --- a/idna/compat.py +++ /dev/null @@ -1,12 +0,0 @@ -from .core import * -from .codec import * - -def ToASCII(label): - return encode(label) - -def ToUnicode(label): - return decode(label) - -def nameprep(s): - raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") - diff --git a/idna/core.py b/idna/core.py deleted file mode 100644 index b55b6645..00000000 --- a/idna/core.py +++ /dev/null @@ -1,387 +0,0 @@ -from . import idnadata -import bisect -import unicodedata -import re -import sys -from .intranges import intranges_contain - -_virama_combining_class = 9 -_alabel_prefix = b'xn--' -_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') - -if sys.version_info[0] == 3: - unicode = str - unichr = chr - -class IDNAError(UnicodeError): - """ Base exception for all IDNA-encoding related problems """ - pass - - -class IDNABidiError(IDNAError): - """ Exception when bidirectional requirements are not satisfied """ - pass - - -class InvalidCodepoint(IDNAError): - """ Exception when a disallowed or unallocated codepoint is used """ - pass - - -class InvalidCodepointContext(IDNAError): - """ Exception when the codepoint is not valid in the context it is used """ - pass - - -def _combining_class(cp): - return unicodedata.combining(unichr(cp)) - -def _is_script(cp, script): - return intranges_contain(ord(cp), idnadata.scripts[script]) - -def _punycode(s): - return s.encode('punycode') - -def _unot(s): - return 'U+{0:04X}'.format(s) - - -def valid_label_length(label): - - if len(label) > 63: - return False - return True - - -def valid_string_length(label, trailing_dot): - - if len(label) > (254 if trailing_dot else 253): - return False - return True - - -def check_bidi(label, check_ltr=False): - - # Bidi rules should only be applied if string contains RTL characters - bidi_label = False - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - if direction == '': - # String likely comes from a newer version of Unicode - raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) - if direction in ['R', 'AL', 'AN']: - bidi_label = True - break - if not bidi_label and not check_ltr: - return True - - # Bidi rule 1 - direction = unicodedata.bidirectional(label[0]) - if direction in ['R', 'AL']: - rtl = True - elif direction == 'L': - rtl = False - else: - raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) - - valid_ending = False - number_type = False - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - - if rtl: - # Bidi rule 2 - if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) - # Bidi rule 3 - if direction in ['R', 'AL', 'EN', 'AN']: - valid_ending = True - elif direction != 'NSM': - valid_ending = False - # Bidi rule 4 - if direction in ['AN', 'EN']: - if not number_type: - number_type = direction - else: - if number_type != direction: - raise IDNABidiError('Can not mix numeral types in a right-to-left label') - else: - # Bidi rule 5 - if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) - # Bidi rule 6 - if direction in ['L', 'EN']: - valid_ending = True - elif direction != 'NSM': - valid_ending = False - - if not valid_ending: - raise IDNABidiError('Label ends with illegal codepoint directionality') - - return True - - -def check_initial_combiner(label): - - if unicodedata.category(label[0])[0] == 'M': - raise IDNAError('Label begins with an illegal combining character') - return True - - -def check_hyphen_ok(label): - - if label[2:4] == '--': - raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') - if label[0] == '-' or label[-1] == '-': - raise IDNAError('Label must not start or end with a hyphen') - return True - - -def check_nfc(label): - - if unicodedata.normalize('NFC', label) != label: - raise IDNAError('Label must be in Normalization Form C') - - -def valid_contextj(label, pos): - - cp_value = ord(label[pos]) - - if cp_value == 0x200c: - - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - - ok = False - for i in range(pos-1, -1, -1): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord('T'): - continue - if joining_type in [ord('L'), ord('D')]: - ok = True - break - - if not ok: - return False - - ok = False - for i in range(pos+1, len(label)): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord('T'): - continue - if joining_type in [ord('R'), ord('D')]: - ok = True - break - return ok - - if cp_value == 0x200d: - - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - return False - - else: - - return False - - -def valid_contexto(label, pos, exception=False): - - cp_value = ord(label[pos]) - - if cp_value == 0x00b7: - if 0 < pos < len(label)-1: - if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: - return True - return False - - elif cp_value == 0x0375: - if pos < len(label)-1 and len(label) > 1: - return _is_script(label[pos + 1], 'Greek') - return False - - elif cp_value == 0x05f3 or cp_value == 0x05f4: - if pos > 0: - return _is_script(label[pos - 1], 'Hebrew') - return False - - elif cp_value == 0x30fb: - for cp in label: - if cp == u'\u30fb': - continue - if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): - return True - return False - - elif 0x660 <= cp_value <= 0x669: - for cp in label: - if 0x6f0 <= ord(cp) <= 0x06f9: - return False - return True - - elif 0x6f0 <= cp_value <= 0x6f9: - for cp in label: - if 0x660 <= ord(cp) <= 0x0669: - return False - return True - - -def check_label(label): - - if isinstance(label, (bytes, bytearray)): - label = label.decode('utf-8') - if len(label) == 0: - raise IDNAError('Empty Label') - - check_nfc(label) - check_hyphen_ok(label) - check_initial_combiner(label) - - for (pos, cp) in enumerate(label): - cp_value = ord(cp) - if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): - continue - elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): - if not valid_contextj(label, pos): - raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) - elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): - if not valid_contexto(label, pos): - raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) - else: - raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) - - check_bidi(label) - - -def alabel(label): - - try: - label = label.encode('ascii') - try: - ulabel(label) - except IDNAError: - raise IDNAError('The label {0} is not a valid A-label'.format(label)) - if not valid_label_length(label): - raise IDNAError('Label too long') - return label - except UnicodeEncodeError: - pass - - if not label: - raise IDNAError('No Input') - - label = unicode(label) - check_label(label) - label = _punycode(label) - label = _alabel_prefix + label - - if not valid_label_length(label): - raise IDNAError('Label too long') - - return label - - -def ulabel(label): - - if not isinstance(label, (bytes, bytearray)): - try: - label = label.encode('ascii') - except UnicodeEncodeError: - check_label(label) - return label - - label = label.lower() - if label.startswith(_alabel_prefix): - label = label[len(_alabel_prefix):] - else: - check_label(label) - return label.decode('ascii') - - label = label.decode('punycode') - check_label(label) - return label - - -def uts46_remap(domain, std3_rules=True, transitional=False): - """Re-map the characters in the string according to UTS46 processing.""" - from .uts46data import uts46data - output = u"" - try: - for pos, char in enumerate(domain): - code_point = ord(char) - uts46row = uts46data[code_point if code_point < 256 else - bisect.bisect_left(uts46data, (code_point, "Z")) - 1] - status = uts46row[1] - replacement = uts46row[2] if len(uts46row) == 3 else None - if (status == "V" or - (status == "D" and not transitional) or - (status == "3" and std3_rules and replacement is None)): - output += char - elif replacement is not None and (status == "M" or - (status == "3" and std3_rules) or - (status == "D" and transitional)): - output += replacement - elif status != "I": - raise IndexError() - return unicodedata.normalize("NFC", output) - except IndexError: - raise InvalidCodepoint( - "Codepoint {0} not allowed at position {1} in {2}".format( - _unot(code_point), pos + 1, repr(domain))) - - -def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): - - if isinstance(s, (bytes, bytearray)): - s = s.decode("ascii") - if uts46: - s = uts46_remap(s, std3_rules, transitional) - trailing_dot = False - result = [] - if strict: - labels = s.split('.') - else: - labels = _unicode_dots_re.split(s) - while labels and not labels[0]: - del labels[0] - if not labels: - raise IDNAError('Empty domain') - if labels[-1] == '': - del labels[-1] - trailing_dot = True - for label in labels: - result.append(alabel(label)) - if trailing_dot: - result.append(b'') - s = b'.'.join(result) - if not valid_string_length(s, trailing_dot): - raise IDNAError('Domain too long') - return s - - -def decode(s, strict=False, uts46=False, std3_rules=False): - - if isinstance(s, (bytes, bytearray)): - s = s.decode("ascii") - if uts46: - s = uts46_remap(s, std3_rules, False) - trailing_dot = False - result = [] - if not strict: - labels = _unicode_dots_re.split(s) - else: - labels = s.split(u'.') - while labels and not labels[0]: - del labels[0] - if not labels: - raise IDNAError('Empty domain') - if not labels[-1]: - del labels[-1] - trailing_dot = True - for label in labels: - result.append(ulabel(label)) - if trailing_dot: - result.append(u'') - return u'.'.join(result) diff --git a/idna/idnadata.py b/idna/idnadata.py deleted file mode 100644 index c48f1b50..00000000 --- a/idna/idnadata.py +++ /dev/null @@ -1,1585 +0,0 @@ -# This file is automatically generated by tools/idna-data - -__version__ = "6.3.0" -scripts = { - 'Greek': ( - 0x37000000374, - 0x37500000378, - 0x37a0000037e, - 0x38400000385, - 0x38600000387, - 0x3880000038b, - 0x38c0000038d, - 0x38e000003a2, - 0x3a3000003e2, - 0x3f000000400, - 0x1d2600001d2b, - 0x1d5d00001d62, - 0x1d6600001d6b, - 0x1dbf00001dc0, - 0x1f0000001f16, - 0x1f1800001f1e, - 0x1f2000001f46, - 0x1f4800001f4e, - 0x1f5000001f58, - 0x1f5900001f5a, - 0x1f5b00001f5c, - 0x1f5d00001f5e, - 0x1f5f00001f7e, - 0x1f8000001fb5, - 0x1fb600001fc5, - 0x1fc600001fd4, - 0x1fd600001fdc, - 0x1fdd00001ff0, - 0x1ff200001ff5, - 0x1ff600001fff, - 0x212600002127, - 0x101400001018b, - 0x1d2000001d246, - ), - 'Han': ( - 0x2e8000002e9a, - 0x2e9b00002ef4, - 0x2f0000002fd6, - 0x300500003006, - 0x300700003008, - 0x30210000302a, - 0x30380000303c, - 0x340000004db6, - 0x4e0000009fcd, - 0xf9000000fa6e, - 0xfa700000fada, - 0x200000002a6d7, - 0x2a7000002b735, - 0x2b7400002b81e, - 0x2f8000002fa1e, - ), - 'Hebrew': ( - 0x591000005c8, - 0x5d0000005eb, - 0x5f0000005f5, - 0xfb1d0000fb37, - 0xfb380000fb3d, - 0xfb3e0000fb3f, - 0xfb400000fb42, - 0xfb430000fb45, - 0xfb460000fb50, - ), - 'Hiragana': ( - 0x304100003097, - 0x309d000030a0, - 0x1b0010001b002, - 0x1f2000001f201, - ), - 'Katakana': ( - 0x30a1000030fb, - 0x30fd00003100, - 0x31f000003200, - 0x32d0000032ff, - 0x330000003358, - 0xff660000ff70, - 0xff710000ff9e, - 0x1b0000001b001, - ), -} -joining_types = { - 0x600: 85, - 0x601: 85, - 0x602: 85, - 0x603: 85, - 0x604: 85, - 0x608: 85, - 0x60b: 85, - 0x620: 68, - 0x621: 85, - 0x622: 82, - 0x623: 82, - 0x624: 82, - 0x625: 82, - 0x626: 68, - 0x627: 82, - 0x628: 68, - 0x629: 82, - 0x62a: 68, - 0x62b: 68, - 0x62c: 68, - 0x62d: 68, - 0x62e: 68, - 0x62f: 82, - 0x630: 82, - 0x631: 82, - 0x632: 82, - 0x633: 68, - 0x634: 68, - 0x635: 68, - 0x636: 68, - 0x637: 68, - 0x638: 68, - 0x639: 68, - 0x63a: 68, - 0x63b: 68, - 0x63c: 68, - 0x63d: 68, - 0x63e: 68, - 0x63f: 68, - 0x640: 67, - 0x641: 68, - 0x642: 68, - 0x643: 68, - 0x644: 68, - 0x645: 68, - 0x646: 68, - 0x647: 68, - 0x648: 82, - 0x649: 68, - 0x64a: 68, - 0x66e: 68, - 0x66f: 68, - 0x671: 82, - 0x672: 82, - 0x673: 82, - 0x674: 85, - 0x675: 82, - 0x676: 82, - 0x677: 82, - 0x678: 68, - 0x679: 68, - 0x67a: 68, - 0x67b: 68, - 0x67c: 68, - 0x67d: 68, - 0x67e: 68, - 0x67f: 68, - 0x680: 68, - 0x681: 68, - 0x682: 68, - 0x683: 68, - 0x684: 68, - 0x685: 68, - 0x686: 68, - 0x687: 68, - 0x688: 82, - 0x689: 82, - 0x68a: 82, - 0x68b: 82, - 0x68c: 82, - 0x68d: 82, - 0x68e: 82, - 0x68f: 82, - 0x690: 82, - 0x691: 82, - 0x692: 82, - 0x693: 82, - 0x694: 82, - 0x695: 82, - 0x696: 82, - 0x697: 82, - 0x698: 82, - 0x699: 82, - 0x69a: 68, - 0x69b: 68, - 0x69c: 68, - 0x69d: 68, - 0x69e: 68, - 0x69f: 68, - 0x6a0: 68, - 0x6a1: 68, - 0x6a2: 68, - 0x6a3: 68, - 0x6a4: 68, - 0x6a5: 68, - 0x6a6: 68, - 0x6a7: 68, - 0x6a8: 68, - 0x6a9: 68, - 0x6aa: 68, - 0x6ab: 68, - 0x6ac: 68, - 0x6ad: 68, - 0x6ae: 68, - 0x6af: 68, - 0x6b0: 68, - 0x6b1: 68, - 0x6b2: 68, - 0x6b3: 68, - 0x6b4: 68, - 0x6b5: 68, - 0x6b6: 68, - 0x6b7: 68, - 0x6b8: 68, - 0x6b9: 68, - 0x6ba: 68, - 0x6bb: 68, - 0x6bc: 68, - 0x6bd: 68, - 0x6be: 68, - 0x6bf: 68, - 0x6c0: 82, - 0x6c1: 68, - 0x6c2: 68, - 0x6c3: 82, - 0x6c4: 82, - 0x6c5: 82, - 0x6c6: 82, - 0x6c7: 82, - 0x6c8: 82, - 0x6c9: 82, - 0x6ca: 82, - 0x6cb: 82, - 0x6cc: 68, - 0x6cd: 82, - 0x6ce: 68, - 0x6cf: 82, - 0x6d0: 68, - 0x6d1: 68, - 0x6d2: 82, - 0x6d3: 82, - 0x6d5: 82, - 0x6dd: 85, - 0x6ee: 82, - 0x6ef: 82, - 0x6fa: 68, - 0x6fb: 68, - 0x6fc: 68, - 0x6ff: 68, - 0x710: 82, - 0x712: 68, - 0x713: 68, - 0x714: 68, - 0x715: 82, - 0x716: 82, - 0x717: 82, - 0x718: 82, - 0x719: 82, - 0x71a: 68, - 0x71b: 68, - 0x71c: 68, - 0x71d: 68, - 0x71e: 82, - 0x71f: 68, - 0x720: 68, - 0x721: 68, - 0x722: 68, - 0x723: 68, - 0x724: 68, - 0x725: 68, - 0x726: 68, - 0x727: 68, - 0x728: 82, - 0x729: 68, - 0x72a: 82, - 0x72b: 68, - 0x72c: 82, - 0x72d: 68, - 0x72e: 68, - 0x72f: 82, - 0x74d: 82, - 0x74e: 68, - 0x74f: 68, - 0x750: 68, - 0x751: 68, - 0x752: 68, - 0x753: 68, - 0x754: 68, - 0x755: 68, - 0x756: 68, - 0x757: 68, - 0x758: 68, - 0x759: 82, - 0x75a: 82, - 0x75b: 82, - 0x75c: 68, - 0x75d: 68, - 0x75e: 68, - 0x75f: 68, - 0x760: 68, - 0x761: 68, - 0x762: 68, - 0x763: 68, - 0x764: 68, - 0x765: 68, - 0x766: 68, - 0x767: 68, - 0x768: 68, - 0x769: 68, - 0x76a: 68, - 0x76b: 82, - 0x76c: 82, - 0x76d: 68, - 0x76e: 68, - 0x76f: 68, - 0x770: 68, - 0x771: 82, - 0x772: 68, - 0x773: 82, - 0x774: 82, - 0x775: 68, - 0x776: 68, - 0x777: 68, - 0x778: 82, - 0x779: 82, - 0x77a: 68, - 0x77b: 68, - 0x77c: 68, - 0x77d: 68, - 0x77e: 68, - 0x77f: 68, - 0x7ca: 68, - 0x7cb: 68, - 0x7cc: 68, - 0x7cd: 68, - 0x7ce: 68, - 0x7cf: 68, - 0x7d0: 68, - 0x7d1: 68, - 0x7d2: 68, - 0x7d3: 68, - 0x7d4: 68, - 0x7d5: 68, - 0x7d6: 68, - 0x7d7: 68, - 0x7d8: 68, - 0x7d9: 68, - 0x7da: 68, - 0x7db: 68, - 0x7dc: 68, - 0x7dd: 68, - 0x7de: 68, - 0x7df: 68, - 0x7e0: 68, - 0x7e1: 68, - 0x7e2: 68, - 0x7e3: 68, - 0x7e4: 68, - 0x7e5: 68, - 0x7e6: 68, - 0x7e7: 68, - 0x7e8: 68, - 0x7e9: 68, - 0x7ea: 68, - 0x7fa: 67, - 0x840: 82, - 0x841: 68, - 0x842: 68, - 0x843: 68, - 0x844: 68, - 0x845: 68, - 0x846: 82, - 0x847: 68, - 0x848: 68, - 0x849: 82, - 0x84a: 68, - 0x84b: 68, - 0x84c: 68, - 0x84d: 68, - 0x84e: 68, - 0x84f: 82, - 0x850: 68, - 0x851: 68, - 0x852: 68, - 0x853: 68, - 0x854: 82, - 0x855: 68, - 0x856: 85, - 0x857: 85, - 0x858: 85, - 0x8a0: 68, - 0x8a2: 68, - 0x8a3: 68, - 0x8a4: 68, - 0x8a5: 68, - 0x8a6: 68, - 0x8a7: 68, - 0x8a8: 68, - 0x8a9: 68, - 0x8aa: 82, - 0x8ab: 82, - 0x8ac: 82, - 0x1806: 85, - 0x1807: 68, - 0x180a: 67, - 0x180e: 85, - 0x1820: 68, - 0x1821: 68, - 0x1822: 68, - 0x1823: 68, - 0x1824: 68, - 0x1825: 68, - 0x1826: 68, - 0x1827: 68, - 0x1828: 68, - 0x1829: 68, - 0x182a: 68, - 0x182b: 68, - 0x182c: 68, - 0x182d: 68, - 0x182e: 68, - 0x182f: 68, - 0x1830: 68, - 0x1831: 68, - 0x1832: 68, - 0x1833: 68, - 0x1834: 68, - 0x1835: 68, - 0x1836: 68, - 0x1837: 68, - 0x1838: 68, - 0x1839: 68, - 0x183a: 68, - 0x183b: 68, - 0x183c: 68, - 0x183d: 68, - 0x183e: 68, - 0x183f: 68, - 0x1840: 68, - 0x1841: 68, - 0x1842: 68, - 0x1843: 68, - 0x1844: 68, - 0x1845: 68, - 0x1846: 68, - 0x1847: 68, - 0x1848: 68, - 0x1849: 68, - 0x184a: 68, - 0x184b: 68, - 0x184c: 68, - 0x184d: 68, - 0x184e: 68, - 0x184f: 68, - 0x1850: 68, - 0x1851: 68, - 0x1852: 68, - 0x1853: 68, - 0x1854: 68, - 0x1855: 68, - 0x1856: 68, - 0x1857: 68, - 0x1858: 68, - 0x1859: 68, - 0x185a: 68, - 0x185b: 68, - 0x185c: 68, - 0x185d: 68, - 0x185e: 68, - 0x185f: 68, - 0x1860: 68, - 0x1861: 68, - 0x1862: 68, - 0x1863: 68, - 0x1864: 68, - 0x1865: 68, - 0x1866: 68, - 0x1867: 68, - 0x1868: 68, - 0x1869: 68, - 0x186a: 68, - 0x186b: 68, - 0x186c: 68, - 0x186d: 68, - 0x186e: 68, - 0x186f: 68, - 0x1870: 68, - 0x1871: 68, - 0x1872: 68, - 0x1873: 68, - 0x1874: 68, - 0x1875: 68, - 0x1876: 68, - 0x1877: 68, - 0x1880: 85, - 0x1881: 85, - 0x1882: 85, - 0x1883: 85, - 0x1884: 85, - 0x1885: 85, - 0x1886: 85, - 0x1887: 68, - 0x1888: 68, - 0x1889: 68, - 0x188a: 68, - 0x188b: 68, - 0x188c: 68, - 0x188d: 68, - 0x188e: 68, - 0x188f: 68, - 0x1890: 68, - 0x1891: 68, - 0x1892: 68, - 0x1893: 68, - 0x1894: 68, - 0x1895: 68, - 0x1896: 68, - 0x1897: 68, - 0x1898: 68, - 0x1899: 68, - 0x189a: 68, - 0x189b: 68, - 0x189c: 68, - 0x189d: 68, - 0x189e: 68, - 0x189f: 68, - 0x18a0: 68, - 0x18a1: 68, - 0x18a2: 68, - 0x18a3: 68, - 0x18a4: 68, - 0x18a5: 68, - 0x18a6: 68, - 0x18a7: 68, - 0x18a8: 68, - 0x18aa: 68, - 0x200c: 85, - 0x200d: 67, - 0x2066: 85, - 0x2067: 85, - 0x2068: 85, - 0x2069: 85, - 0xa840: 68, - 0xa841: 68, - 0xa842: 68, - 0xa843: 68, - 0xa844: 68, - 0xa845: 68, - 0xa846: 68, - 0xa847: 68, - 0xa848: 68, - 0xa849: 68, - 0xa84a: 68, - 0xa84b: 68, - 0xa84c: 68, - 0xa84d: 68, - 0xa84e: 68, - 0xa84f: 68, - 0xa850: 68, - 0xa851: 68, - 0xa852: 68, - 0xa853: 68, - 0xa854: 68, - 0xa855: 68, - 0xa856: 68, - 0xa857: 68, - 0xa858: 68, - 0xa859: 68, - 0xa85a: 68, - 0xa85b: 68, - 0xa85c: 68, - 0xa85d: 68, - 0xa85e: 68, - 0xa85f: 68, - 0xa860: 68, - 0xa861: 68, - 0xa862: 68, - 0xa863: 68, - 0xa864: 68, - 0xa865: 68, - 0xa866: 68, - 0xa867: 68, - 0xa868: 68, - 0xa869: 68, - 0xa86a: 68, - 0xa86b: 68, - 0xa86c: 68, - 0xa86d: 68, - 0xa86e: 68, - 0xa86f: 68, - 0xa870: 68, - 0xa871: 68, - 0xa872: 76, - 0xa873: 85, -} -codepoint_classes = { - 'PVALID': ( - 0x2d0000002e, - 0x300000003a, - 0x610000007b, - 0xdf000000f7, - 0xf800000100, - 0x10100000102, - 0x10300000104, - 0x10500000106, - 0x10700000108, - 0x1090000010a, - 0x10b0000010c, - 0x10d0000010e, - 0x10f00000110, - 0x11100000112, - 0x11300000114, - 0x11500000116, - 0x11700000118, - 0x1190000011a, - 0x11b0000011c, - 0x11d0000011e, - 0x11f00000120, - 0x12100000122, - 0x12300000124, - 0x12500000126, - 0x12700000128, - 0x1290000012a, - 0x12b0000012c, - 0x12d0000012e, - 0x12f00000130, - 0x13100000132, - 0x13500000136, - 0x13700000139, - 0x13a0000013b, - 0x13c0000013d, - 0x13e0000013f, - 0x14200000143, - 0x14400000145, - 0x14600000147, - 0x14800000149, - 0x14b0000014c, - 0x14d0000014e, - 0x14f00000150, - 0x15100000152, - 0x15300000154, - 0x15500000156, - 0x15700000158, - 0x1590000015a, - 0x15b0000015c, - 0x15d0000015e, - 0x15f00000160, - 0x16100000162, - 0x16300000164, - 0x16500000166, - 0x16700000168, - 0x1690000016a, - 0x16b0000016c, - 0x16d0000016e, - 0x16f00000170, - 0x17100000172, - 0x17300000174, - 0x17500000176, - 0x17700000178, - 0x17a0000017b, - 0x17c0000017d, - 0x17e0000017f, - 0x18000000181, - 0x18300000184, - 0x18500000186, - 0x18800000189, - 0x18c0000018e, - 0x19200000193, - 0x19500000196, - 0x1990000019c, - 0x19e0000019f, - 0x1a1000001a2, - 0x1a3000001a4, - 0x1a5000001a6, - 0x1a8000001a9, - 0x1aa000001ac, - 0x1ad000001ae, - 0x1b0000001b1, - 0x1b4000001b5, - 0x1b6000001b7, - 0x1b9000001bc, - 0x1bd000001c4, - 0x1ce000001cf, - 0x1d0000001d1, - 0x1d2000001d3, - 0x1d4000001d5, - 0x1d6000001d7, - 0x1d8000001d9, - 0x1da000001db, - 0x1dc000001de, - 0x1df000001e0, - 0x1e1000001e2, - 0x1e3000001e4, - 0x1e5000001e6, - 0x1e7000001e8, - 0x1e9000001ea, - 0x1eb000001ec, - 0x1ed000001ee, - 0x1ef000001f1, - 0x1f5000001f6, - 0x1f9000001fa, - 0x1fb000001fc, - 0x1fd000001fe, - 0x1ff00000200, - 0x20100000202, - 0x20300000204, - 0x20500000206, - 0x20700000208, - 0x2090000020a, - 0x20b0000020c, - 0x20d0000020e, - 0x20f00000210, - 0x21100000212, - 0x21300000214, - 0x21500000216, - 0x21700000218, - 0x2190000021a, - 0x21b0000021c, - 0x21d0000021e, - 0x21f00000220, - 0x22100000222, - 0x22300000224, - 0x22500000226, - 0x22700000228, - 0x2290000022a, - 0x22b0000022c, - 0x22d0000022e, - 0x22f00000230, - 0x23100000232, - 0x2330000023a, - 0x23c0000023d, - 0x23f00000241, - 0x24200000243, - 0x24700000248, - 0x2490000024a, - 0x24b0000024c, - 0x24d0000024e, - 0x24f000002b0, - 0x2b9000002c2, - 0x2c6000002d2, - 0x2ec000002ed, - 0x2ee000002ef, - 0x30000000340, - 0x34200000343, - 0x3460000034f, - 0x35000000370, - 0x37100000372, - 0x37300000374, - 0x37700000378, - 0x37b0000037e, - 0x39000000391, - 0x3ac000003cf, - 0x3d7000003d8, - 0x3d9000003da, - 0x3db000003dc, - 0x3dd000003de, - 0x3df000003e0, - 0x3e1000003e2, - 0x3e3000003e4, - 0x3e5000003e6, - 0x3e7000003e8, - 0x3e9000003ea, - 0x3eb000003ec, - 0x3ed000003ee, - 0x3ef000003f0, - 0x3f3000003f4, - 0x3f8000003f9, - 0x3fb000003fd, - 0x43000000460, - 0x46100000462, - 0x46300000464, - 0x46500000466, - 0x46700000468, - 0x4690000046a, - 0x46b0000046c, - 0x46d0000046e, - 0x46f00000470, - 0x47100000472, - 0x47300000474, - 0x47500000476, - 0x47700000478, - 0x4790000047a, - 0x47b0000047c, - 0x47d0000047e, - 0x47f00000480, - 0x48100000482, - 0x48300000488, - 0x48b0000048c, - 0x48d0000048e, - 0x48f00000490, - 0x49100000492, - 0x49300000494, - 0x49500000496, - 0x49700000498, - 0x4990000049a, - 0x49b0000049c, - 0x49d0000049e, - 0x49f000004a0, - 0x4a1000004a2, - 0x4a3000004a4, - 0x4a5000004a6, - 0x4a7000004a8, - 0x4a9000004aa, - 0x4ab000004ac, - 0x4ad000004ae, - 0x4af000004b0, - 0x4b1000004b2, - 0x4b3000004b4, - 0x4b5000004b6, - 0x4b7000004b8, - 0x4b9000004ba, - 0x4bb000004bc, - 0x4bd000004be, - 0x4bf000004c0, - 0x4c2000004c3, - 0x4c4000004c5, - 0x4c6000004c7, - 0x4c8000004c9, - 0x4ca000004cb, - 0x4cc000004cd, - 0x4ce000004d0, - 0x4d1000004d2, - 0x4d3000004d4, - 0x4d5000004d6, - 0x4d7000004d8, - 0x4d9000004da, - 0x4db000004dc, - 0x4dd000004de, - 0x4df000004e0, - 0x4e1000004e2, - 0x4e3000004e4, - 0x4e5000004e6, - 0x4e7000004e8, - 0x4e9000004ea, - 0x4eb000004ec, - 0x4ed000004ee, - 0x4ef000004f0, - 0x4f1000004f2, - 0x4f3000004f4, - 0x4f5000004f6, - 0x4f7000004f8, - 0x4f9000004fa, - 0x4fb000004fc, - 0x4fd000004fe, - 0x4ff00000500, - 0x50100000502, - 0x50300000504, - 0x50500000506, - 0x50700000508, - 0x5090000050a, - 0x50b0000050c, - 0x50d0000050e, - 0x50f00000510, - 0x51100000512, - 0x51300000514, - 0x51500000516, - 0x51700000518, - 0x5190000051a, - 0x51b0000051c, - 0x51d0000051e, - 0x51f00000520, - 0x52100000522, - 0x52300000524, - 0x52500000526, - 0x52700000528, - 0x5590000055a, - 0x56100000587, - 0x591000005be, - 0x5bf000005c0, - 0x5c1000005c3, - 0x5c4000005c6, - 0x5c7000005c8, - 0x5d0000005eb, - 0x5f0000005f3, - 0x6100000061b, - 0x62000000640, - 0x64100000660, - 0x66e00000675, - 0x679000006d4, - 0x6d5000006dd, - 0x6df000006e9, - 0x6ea000006f0, - 0x6fa00000700, - 0x7100000074b, - 0x74d000007b2, - 0x7c0000007f6, - 0x8000000082e, - 0x8400000085c, - 0x8a0000008a1, - 0x8a2000008ad, - 0x8e4000008ff, - 0x90000000958, - 0x96000000964, - 0x96600000970, - 0x97100000978, - 0x97900000980, - 0x98100000984, - 0x9850000098d, - 0x98f00000991, - 0x993000009a9, - 0x9aa000009b1, - 0x9b2000009b3, - 0x9b6000009ba, - 0x9bc000009c5, - 0x9c7000009c9, - 0x9cb000009cf, - 0x9d7000009d8, - 0x9e0000009e4, - 0x9e6000009f2, - 0xa0100000a04, - 0xa0500000a0b, - 0xa0f00000a11, - 0xa1300000a29, - 0xa2a00000a31, - 0xa3200000a33, - 0xa3500000a36, - 0xa3800000a3a, - 0xa3c00000a3d, - 0xa3e00000a43, - 0xa4700000a49, - 0xa4b00000a4e, - 0xa5100000a52, - 0xa5c00000a5d, - 0xa6600000a76, - 0xa8100000a84, - 0xa8500000a8e, - 0xa8f00000a92, - 0xa9300000aa9, - 0xaaa00000ab1, - 0xab200000ab4, - 0xab500000aba, - 0xabc00000ac6, - 0xac700000aca, - 0xacb00000ace, - 0xad000000ad1, - 0xae000000ae4, - 0xae600000af0, - 0xb0100000b04, - 0xb0500000b0d, - 0xb0f00000b11, - 0xb1300000b29, - 0xb2a00000b31, - 0xb3200000b34, - 0xb3500000b3a, - 0xb3c00000b45, - 0xb4700000b49, - 0xb4b00000b4e, - 0xb5600000b58, - 0xb5f00000b64, - 0xb6600000b70, - 0xb7100000b72, - 0xb8200000b84, - 0xb8500000b8b, - 0xb8e00000b91, - 0xb9200000b96, - 0xb9900000b9b, - 0xb9c00000b9d, - 0xb9e00000ba0, - 0xba300000ba5, - 0xba800000bab, - 0xbae00000bba, - 0xbbe00000bc3, - 0xbc600000bc9, - 0xbca00000bce, - 0xbd000000bd1, - 0xbd700000bd8, - 0xbe600000bf0, - 0xc0100000c04, - 0xc0500000c0d, - 0xc0e00000c11, - 0xc1200000c29, - 0xc2a00000c34, - 0xc3500000c3a, - 0xc3d00000c45, - 0xc4600000c49, - 0xc4a00000c4e, - 0xc5500000c57, - 0xc5800000c5a, - 0xc6000000c64, - 0xc6600000c70, - 0xc8200000c84, - 0xc8500000c8d, - 0xc8e00000c91, - 0xc9200000ca9, - 0xcaa00000cb4, - 0xcb500000cba, - 0xcbc00000cc5, - 0xcc600000cc9, - 0xcca00000cce, - 0xcd500000cd7, - 0xcde00000cdf, - 0xce000000ce4, - 0xce600000cf0, - 0xcf100000cf3, - 0xd0200000d04, - 0xd0500000d0d, - 0xd0e00000d11, - 0xd1200000d3b, - 0xd3d00000d45, - 0xd4600000d49, - 0xd4a00000d4f, - 0xd5700000d58, - 0xd6000000d64, - 0xd6600000d70, - 0xd7a00000d80, - 0xd8200000d84, - 0xd8500000d97, - 0xd9a00000db2, - 0xdb300000dbc, - 0xdbd00000dbe, - 0xdc000000dc7, - 0xdca00000dcb, - 0xdcf00000dd5, - 0xdd600000dd7, - 0xdd800000de0, - 0xdf200000df4, - 0xe0100000e33, - 0xe3400000e3b, - 0xe4000000e4f, - 0xe5000000e5a, - 0xe8100000e83, - 0xe8400000e85, - 0xe8700000e89, - 0xe8a00000e8b, - 0xe8d00000e8e, - 0xe9400000e98, - 0xe9900000ea0, - 0xea100000ea4, - 0xea500000ea6, - 0xea700000ea8, - 0xeaa00000eac, - 0xead00000eb3, - 0xeb400000eba, - 0xebb00000ebe, - 0xec000000ec5, - 0xec600000ec7, - 0xec800000ece, - 0xed000000eda, - 0xede00000ee0, - 0xf0000000f01, - 0xf0b00000f0c, - 0xf1800000f1a, - 0xf2000000f2a, - 0xf3500000f36, - 0xf3700000f38, - 0xf3900000f3a, - 0xf3e00000f43, - 0xf4400000f48, - 0xf4900000f4d, - 0xf4e00000f52, - 0xf5300000f57, - 0xf5800000f5c, - 0xf5d00000f69, - 0xf6a00000f6d, - 0xf7100000f73, - 0xf7400000f75, - 0xf7a00000f81, - 0xf8200000f85, - 0xf8600000f93, - 0xf9400000f98, - 0xf9900000f9d, - 0xf9e00000fa2, - 0xfa300000fa7, - 0xfa800000fac, - 0xfad00000fb9, - 0xfba00000fbd, - 0xfc600000fc7, - 0x10000000104a, - 0x10500000109e, - 0x10d0000010fb, - 0x10fd00001100, - 0x120000001249, - 0x124a0000124e, - 0x125000001257, - 0x125800001259, - 0x125a0000125e, - 0x126000001289, - 0x128a0000128e, - 0x1290000012b1, - 0x12b2000012b6, - 0x12b8000012bf, - 0x12c0000012c1, - 0x12c2000012c6, - 0x12c8000012d7, - 0x12d800001311, - 0x131200001316, - 0x13180000135b, - 0x135d00001360, - 0x138000001390, - 0x13a0000013f5, - 0x14010000166d, - 0x166f00001680, - 0x16810000169b, - 0x16a0000016eb, - 0x17000000170d, - 0x170e00001715, - 0x172000001735, - 0x174000001754, - 0x17600000176d, - 0x176e00001771, - 0x177200001774, - 0x1780000017b4, - 0x17b6000017d4, - 0x17d7000017d8, - 0x17dc000017de, - 0x17e0000017ea, - 0x18100000181a, - 0x182000001878, - 0x1880000018ab, - 0x18b0000018f6, - 0x19000000191d, - 0x19200000192c, - 0x19300000193c, - 0x19460000196e, - 0x197000001975, - 0x1980000019ac, - 0x19b0000019ca, - 0x19d0000019da, - 0x1a0000001a1c, - 0x1a2000001a5f, - 0x1a6000001a7d, - 0x1a7f00001a8a, - 0x1a9000001a9a, - 0x1aa700001aa8, - 0x1b0000001b4c, - 0x1b5000001b5a, - 0x1b6b00001b74, - 0x1b8000001bf4, - 0x1c0000001c38, - 0x1c4000001c4a, - 0x1c4d00001c7e, - 0x1cd000001cd3, - 0x1cd400001cf7, - 0x1d0000001d2c, - 0x1d2f00001d30, - 0x1d3b00001d3c, - 0x1d4e00001d4f, - 0x1d6b00001d78, - 0x1d7900001d9b, - 0x1dc000001de7, - 0x1dfc00001e00, - 0x1e0100001e02, - 0x1e0300001e04, - 0x1e0500001e06, - 0x1e0700001e08, - 0x1e0900001e0a, - 0x1e0b00001e0c, - 0x1e0d00001e0e, - 0x1e0f00001e10, - 0x1e1100001e12, - 0x1e1300001e14, - 0x1e1500001e16, - 0x1e1700001e18, - 0x1e1900001e1a, - 0x1e1b00001e1c, - 0x1e1d00001e1e, - 0x1e1f00001e20, - 0x1e2100001e22, - 0x1e2300001e24, - 0x1e2500001e26, - 0x1e2700001e28, - 0x1e2900001e2a, - 0x1e2b00001e2c, - 0x1e2d00001e2e, - 0x1e2f00001e30, - 0x1e3100001e32, - 0x1e3300001e34, - 0x1e3500001e36, - 0x1e3700001e38, - 0x1e3900001e3a, - 0x1e3b00001e3c, - 0x1e3d00001e3e, - 0x1e3f00001e40, - 0x1e4100001e42, - 0x1e4300001e44, - 0x1e4500001e46, - 0x1e4700001e48, - 0x1e4900001e4a, - 0x1e4b00001e4c, - 0x1e4d00001e4e, - 0x1e4f00001e50, - 0x1e5100001e52, - 0x1e5300001e54, - 0x1e5500001e56, - 0x1e5700001e58, - 0x1e5900001e5a, - 0x1e5b00001e5c, - 0x1e5d00001e5e, - 0x1e5f00001e60, - 0x1e6100001e62, - 0x1e6300001e64, - 0x1e6500001e66, - 0x1e6700001e68, - 0x1e6900001e6a, - 0x1e6b00001e6c, - 0x1e6d00001e6e, - 0x1e6f00001e70, - 0x1e7100001e72, - 0x1e7300001e74, - 0x1e7500001e76, - 0x1e7700001e78, - 0x1e7900001e7a, - 0x1e7b00001e7c, - 0x1e7d00001e7e, - 0x1e7f00001e80, - 0x1e8100001e82, - 0x1e8300001e84, - 0x1e8500001e86, - 0x1e8700001e88, - 0x1e8900001e8a, - 0x1e8b00001e8c, - 0x1e8d00001e8e, - 0x1e8f00001e90, - 0x1e9100001e92, - 0x1e9300001e94, - 0x1e9500001e9a, - 0x1e9c00001e9e, - 0x1e9f00001ea0, - 0x1ea100001ea2, - 0x1ea300001ea4, - 0x1ea500001ea6, - 0x1ea700001ea8, - 0x1ea900001eaa, - 0x1eab00001eac, - 0x1ead00001eae, - 0x1eaf00001eb0, - 0x1eb100001eb2, - 0x1eb300001eb4, - 0x1eb500001eb6, - 0x1eb700001eb8, - 0x1eb900001eba, - 0x1ebb00001ebc, - 0x1ebd00001ebe, - 0x1ebf00001ec0, - 0x1ec100001ec2, - 0x1ec300001ec4, - 0x1ec500001ec6, - 0x1ec700001ec8, - 0x1ec900001eca, - 0x1ecb00001ecc, - 0x1ecd00001ece, - 0x1ecf00001ed0, - 0x1ed100001ed2, - 0x1ed300001ed4, - 0x1ed500001ed6, - 0x1ed700001ed8, - 0x1ed900001eda, - 0x1edb00001edc, - 0x1edd00001ede, - 0x1edf00001ee0, - 0x1ee100001ee2, - 0x1ee300001ee4, - 0x1ee500001ee6, - 0x1ee700001ee8, - 0x1ee900001eea, - 0x1eeb00001eec, - 0x1eed00001eee, - 0x1eef00001ef0, - 0x1ef100001ef2, - 0x1ef300001ef4, - 0x1ef500001ef6, - 0x1ef700001ef8, - 0x1ef900001efa, - 0x1efb00001efc, - 0x1efd00001efe, - 0x1eff00001f08, - 0x1f1000001f16, - 0x1f2000001f28, - 0x1f3000001f38, - 0x1f4000001f46, - 0x1f5000001f58, - 0x1f6000001f68, - 0x1f7000001f71, - 0x1f7200001f73, - 0x1f7400001f75, - 0x1f7600001f77, - 0x1f7800001f79, - 0x1f7a00001f7b, - 0x1f7c00001f7d, - 0x1fb000001fb2, - 0x1fb600001fb7, - 0x1fc600001fc7, - 0x1fd000001fd3, - 0x1fd600001fd8, - 0x1fe000001fe3, - 0x1fe400001fe8, - 0x1ff600001ff7, - 0x214e0000214f, - 0x218400002185, - 0x2c3000002c5f, - 0x2c6100002c62, - 0x2c6500002c67, - 0x2c6800002c69, - 0x2c6a00002c6b, - 0x2c6c00002c6d, - 0x2c7100002c72, - 0x2c7300002c75, - 0x2c7600002c7c, - 0x2c8100002c82, - 0x2c8300002c84, - 0x2c8500002c86, - 0x2c8700002c88, - 0x2c8900002c8a, - 0x2c8b00002c8c, - 0x2c8d00002c8e, - 0x2c8f00002c90, - 0x2c9100002c92, - 0x2c9300002c94, - 0x2c9500002c96, - 0x2c9700002c98, - 0x2c9900002c9a, - 0x2c9b00002c9c, - 0x2c9d00002c9e, - 0x2c9f00002ca0, - 0x2ca100002ca2, - 0x2ca300002ca4, - 0x2ca500002ca6, - 0x2ca700002ca8, - 0x2ca900002caa, - 0x2cab00002cac, - 0x2cad00002cae, - 0x2caf00002cb0, - 0x2cb100002cb2, - 0x2cb300002cb4, - 0x2cb500002cb6, - 0x2cb700002cb8, - 0x2cb900002cba, - 0x2cbb00002cbc, - 0x2cbd00002cbe, - 0x2cbf00002cc0, - 0x2cc100002cc2, - 0x2cc300002cc4, - 0x2cc500002cc6, - 0x2cc700002cc8, - 0x2cc900002cca, - 0x2ccb00002ccc, - 0x2ccd00002cce, - 0x2ccf00002cd0, - 0x2cd100002cd2, - 0x2cd300002cd4, - 0x2cd500002cd6, - 0x2cd700002cd8, - 0x2cd900002cda, - 0x2cdb00002cdc, - 0x2cdd00002cde, - 0x2cdf00002ce0, - 0x2ce100002ce2, - 0x2ce300002ce5, - 0x2cec00002ced, - 0x2cee00002cf2, - 0x2cf300002cf4, - 0x2d0000002d26, - 0x2d2700002d28, - 0x2d2d00002d2e, - 0x2d3000002d68, - 0x2d7f00002d97, - 0x2da000002da7, - 0x2da800002daf, - 0x2db000002db7, - 0x2db800002dbf, - 0x2dc000002dc7, - 0x2dc800002dcf, - 0x2dd000002dd7, - 0x2dd800002ddf, - 0x2de000002e00, - 0x2e2f00002e30, - 0x300500003008, - 0x302a0000302e, - 0x303c0000303d, - 0x304100003097, - 0x30990000309b, - 0x309d0000309f, - 0x30a1000030fb, - 0x30fc000030ff, - 0x31050000312e, - 0x31a0000031bb, - 0x31f000003200, - 0x340000004db6, - 0x4e0000009fcd, - 0xa0000000a48d, - 0xa4d00000a4fe, - 0xa5000000a60d, - 0xa6100000a62c, - 0xa6410000a642, - 0xa6430000a644, - 0xa6450000a646, - 0xa6470000a648, - 0xa6490000a64a, - 0xa64b0000a64c, - 0xa64d0000a64e, - 0xa64f0000a650, - 0xa6510000a652, - 0xa6530000a654, - 0xa6550000a656, - 0xa6570000a658, - 0xa6590000a65a, - 0xa65b0000a65c, - 0xa65d0000a65e, - 0xa65f0000a660, - 0xa6610000a662, - 0xa6630000a664, - 0xa6650000a666, - 0xa6670000a668, - 0xa6690000a66a, - 0xa66b0000a66c, - 0xa66d0000a670, - 0xa6740000a67e, - 0xa67f0000a680, - 0xa6810000a682, - 0xa6830000a684, - 0xa6850000a686, - 0xa6870000a688, - 0xa6890000a68a, - 0xa68b0000a68c, - 0xa68d0000a68e, - 0xa68f0000a690, - 0xa6910000a692, - 0xa6930000a694, - 0xa6950000a696, - 0xa6970000a698, - 0xa69f0000a6e6, - 0xa6f00000a6f2, - 0xa7170000a720, - 0xa7230000a724, - 0xa7250000a726, - 0xa7270000a728, - 0xa7290000a72a, - 0xa72b0000a72c, - 0xa72d0000a72e, - 0xa72f0000a732, - 0xa7330000a734, - 0xa7350000a736, - 0xa7370000a738, - 0xa7390000a73a, - 0xa73b0000a73c, - 0xa73d0000a73e, - 0xa73f0000a740, - 0xa7410000a742, - 0xa7430000a744, - 0xa7450000a746, - 0xa7470000a748, - 0xa7490000a74a, - 0xa74b0000a74c, - 0xa74d0000a74e, - 0xa74f0000a750, - 0xa7510000a752, - 0xa7530000a754, - 0xa7550000a756, - 0xa7570000a758, - 0xa7590000a75a, - 0xa75b0000a75c, - 0xa75d0000a75e, - 0xa75f0000a760, - 0xa7610000a762, - 0xa7630000a764, - 0xa7650000a766, - 0xa7670000a768, - 0xa7690000a76a, - 0xa76b0000a76c, - 0xa76d0000a76e, - 0xa76f0000a770, - 0xa7710000a779, - 0xa77a0000a77b, - 0xa77c0000a77d, - 0xa77f0000a780, - 0xa7810000a782, - 0xa7830000a784, - 0xa7850000a786, - 0xa7870000a789, - 0xa78c0000a78d, - 0xa78e0000a78f, - 0xa7910000a792, - 0xa7930000a794, - 0xa7a10000a7a2, - 0xa7a30000a7a4, - 0xa7a50000a7a6, - 0xa7a70000a7a8, - 0xa7a90000a7aa, - 0xa7fa0000a828, - 0xa8400000a874, - 0xa8800000a8c5, - 0xa8d00000a8da, - 0xa8e00000a8f8, - 0xa8fb0000a8fc, - 0xa9000000a92e, - 0xa9300000a954, - 0xa9800000a9c1, - 0xa9cf0000a9da, - 0xaa000000aa37, - 0xaa400000aa4e, - 0xaa500000aa5a, - 0xaa600000aa77, - 0xaa7a0000aa7c, - 0xaa800000aac3, - 0xaadb0000aade, - 0xaae00000aaf0, - 0xaaf20000aaf7, - 0xab010000ab07, - 0xab090000ab0f, - 0xab110000ab17, - 0xab200000ab27, - 0xab280000ab2f, - 0xabc00000abeb, - 0xabec0000abee, - 0xabf00000abfa, - 0xac000000d7a4, - 0xfa0e0000fa10, - 0xfa110000fa12, - 0xfa130000fa15, - 0xfa1f0000fa20, - 0xfa210000fa22, - 0xfa230000fa25, - 0xfa270000fa2a, - 0xfb1e0000fb1f, - 0xfe200000fe27, - 0xfe730000fe74, - 0x100000001000c, - 0x1000d00010027, - 0x100280001003b, - 0x1003c0001003e, - 0x1003f0001004e, - 0x100500001005e, - 0x10080000100fb, - 0x101fd000101fe, - 0x102800001029d, - 0x102a0000102d1, - 0x103000001031f, - 0x1033000010341, - 0x103420001034a, - 0x103800001039e, - 0x103a0000103c4, - 0x103c8000103d0, - 0x104280001049e, - 0x104a0000104aa, - 0x1080000010806, - 0x1080800010809, - 0x1080a00010836, - 0x1083700010839, - 0x1083c0001083d, - 0x1083f00010856, - 0x1090000010916, - 0x109200001093a, - 0x10980000109b8, - 0x109be000109c0, - 0x10a0000010a04, - 0x10a0500010a07, - 0x10a0c00010a14, - 0x10a1500010a18, - 0x10a1900010a34, - 0x10a3800010a3b, - 0x10a3f00010a40, - 0x10a6000010a7d, - 0x10b0000010b36, - 0x10b4000010b56, - 0x10b6000010b73, - 0x10c0000010c49, - 0x1100000011047, - 0x1106600011070, - 0x11080000110bb, - 0x110d0000110e9, - 0x110f0000110fa, - 0x1110000011135, - 0x1113600011140, - 0x11180000111c5, - 0x111d0000111da, - 0x11680000116b8, - 0x116c0000116ca, - 0x120000001236f, - 0x130000001342f, - 0x1680000016a39, - 0x16f0000016f45, - 0x16f5000016f7f, - 0x16f8f00016fa0, - 0x1b0000001b002, - 0x200000002a6d7, - 0x2a7000002b735, - 0x2b7400002b81e, - ), - 'CONTEXTJ': ( - 0x200c0000200e, - ), - 'CONTEXTO': ( - 0xb7000000b8, - 0x37500000376, - 0x5f3000005f5, - 0x6600000066a, - 0x6f0000006fa, - 0x30fb000030fc, - ), -} diff --git a/idna/intranges.py b/idna/intranges.py deleted file mode 100644 index fa8a7356..00000000 --- a/idna/intranges.py +++ /dev/null @@ -1,53 +0,0 @@ -""" -Given a list of integers, made up of (hopefully) a small number of long runs -of consecutive integers, compute a representation of the form -((start1, end1), (start2, end2) ...). Then answer the question "was x present -in the original list?" in time O(log(# runs)). -""" - -import bisect - -def intranges_from_list(list_): - """Represent a list of integers as a sequence of ranges: - ((start_0, end_0), (start_1, end_1), ...), such that the original - integers are exactly those x such that start_i <= x < end_i for some i. - - Ranges are encoded as single integers (start << 32 | end), not as tuples. - """ - - sorted_list = sorted(list_) - ranges = [] - last_write = -1 - for i in range(len(sorted_list)): - if i+1 < len(sorted_list): - if sorted_list[i] == sorted_list[i+1]-1: - continue - current_range = sorted_list[last_write+1:i+1] - ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) - last_write = i - - return tuple(ranges) - -def _encode_range(start, end): - return (start << 32) | end - -def _decode_range(r): - return (r >> 32), (r & ((1 << 32) - 1)) - - -def intranges_contain(int_, ranges): - """Determine if `int_` falls into one of the ranges in `ranges`.""" - tuple_ = _encode_range(int_, 0) - pos = bisect.bisect_left(ranges, tuple_) - # we could be immediately ahead of a tuple (start, end) - # with start < int_ <= end - if pos > 0: - left, right = _decode_range(ranges[pos-1]) - if left <= int_ < right: - return True - # or we could be immediately behind a tuple (int_, end) - if pos < len(ranges): - left, _ = _decode_range(ranges[pos]) - if left == int_: - return True - return False diff --git a/idna/package_data.py b/idna/package_data.py deleted file mode 100644 index fc331392..00000000 --- a/idna/package_data.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = '2.6' - diff --git a/idna/uts46data.py b/idna/uts46data.py deleted file mode 100644 index f9b3236f..00000000 --- a/idna/uts46data.py +++ /dev/null @@ -1,7634 +0,0 @@ -# This file is automatically generated by tools/idna-data -# vim: set fileencoding=utf-8 : - -"""IDNA Mapping Table from UTS46.""" - - -__version__ = "6.3.0" -def _seg_0(): - return [ - (0x0, '3'), - (0x1, '3'), - (0x2, '3'), - (0x3, '3'), - (0x4, '3'), - (0x5, '3'), - (0x6, '3'), - (0x7, '3'), - (0x8, '3'), - (0x9, '3'), - (0xA, '3'), - (0xB, '3'), - (0xC, '3'), - (0xD, '3'), - (0xE, '3'), - (0xF, '3'), - (0x10, '3'), - (0x11, '3'), - (0x12, '3'), - (0x13, '3'), - (0x14, '3'), - (0x15, '3'), - (0x16, '3'), - (0x17, '3'), - (0x18, '3'), - (0x19, '3'), - (0x1A, '3'), - (0x1B, '3'), - (0x1C, '3'), - (0x1D, '3'), - (0x1E, '3'), - (0x1F, '3'), - (0x20, '3'), - (0x21, '3'), - (0x22, '3'), - (0x23, '3'), - (0x24, '3'), - (0x25, '3'), - (0x26, '3'), - (0x27, '3'), - (0x28, '3'), - (0x29, '3'), - (0x2A, '3'), - (0x2B, '3'), - (0x2C, '3'), - (0x2D, 'V'), - (0x2E, 'V'), - (0x2F, '3'), - (0x30, 'V'), - (0x31, 'V'), - (0x32, 'V'), - (0x33, 'V'), - (0x34, 'V'), - (0x35, 'V'), - (0x36, 'V'), - (0x37, 'V'), - (0x38, 'V'), - (0x39, 'V'), - (0x3A, '3'), - (0x3B, '3'), - (0x3C, '3'), - (0x3D, '3'), - (0x3E, '3'), - (0x3F, '3'), - (0x40, '3'), - (0x41, 'M', u'a'), - (0x42, 'M', u'b'), - (0x43, 'M', u'c'), - (0x44, 'M', u'd'), - (0x45, 'M', u'e'), - (0x46, 'M', u'f'), - (0x47, 'M', u'g'), - (0x48, 'M', u'h'), - (0x49, 'M', u'i'), - (0x4A, 'M', u'j'), - (0x4B, 'M', u'k'), - (0x4C, 'M', u'l'), - (0x4D, 'M', u'm'), - (0x4E, 'M', u'n'), - (0x4F, 'M', u'o'), - (0x50, 'M', u'p'), - (0x51, 'M', u'q'), - (0x52, 'M', u'r'), - (0x53, 'M', u's'), - (0x54, 'M', u't'), - (0x55, 'M', u'u'), - (0x56, 'M', u'v'), - (0x57, 'M', u'w'), - (0x58, 'M', u'x'), - (0x59, 'M', u'y'), - (0x5A, 'M', u'z'), - (0x5B, '3'), - (0x5C, '3'), - (0x5D, '3'), - (0x5E, '3'), - (0x5F, '3'), - (0x60, '3'), - (0x61, 'V'), - (0x62, 'V'), - (0x63, 'V'), - ] - -def _seg_1(): - return [ - (0x64, 'V'), - (0x65, 'V'), - (0x66, 'V'), - (0x67, 'V'), - (0x68, 'V'), - (0x69, 'V'), - (0x6A, 'V'), - (0x6B, 'V'), - (0x6C, 'V'), - (0x6D, 'V'), - (0x6E, 'V'), - (0x6F, 'V'), - (0x70, 'V'), - (0x71, 'V'), - (0x72, 'V'), - (0x73, 'V'), - (0x74, 'V'), - (0x75, 'V'), - (0x76, 'V'), - (0x77, 'V'), - (0x78, 'V'), - (0x79, 'V'), - (0x7A, 'V'), - (0x7B, '3'), - (0x7C, '3'), - (0x7D, '3'), - (0x7E, '3'), - (0x7F, '3'), - (0x80, 'X'), - (0x81, 'X'), - (0x82, 'X'), - (0x83, 'X'), - (0x84, 'X'), - (0x85, 'X'), - (0x86, 'X'), - (0x87, 'X'), - (0x88, 'X'), - (0x89, 'X'), - (0x8A, 'X'), - (0x8B, 'X'), - (0x8C, 'X'), - (0x8D, 'X'), - (0x8E, 'X'), - (0x8F, 'X'), - (0x90, 'X'), - (0x91, 'X'), - (0x92, 'X'), - (0x93, 'X'), - (0x94, 'X'), - (0x95, 'X'), - (0x96, 'X'), - (0x97, 'X'), - (0x98, 'X'), - (0x99, 'X'), - (0x9A, 'X'), - (0x9B, 'X'), - (0x9C, 'X'), - (0x9D, 'X'), - (0x9E, 'X'), - (0x9F, 'X'), - (0xA0, '3', u' '), - (0xA1, 'V'), - (0xA2, 'V'), - (0xA3, 'V'), - (0xA4, 'V'), - (0xA5, 'V'), - (0xA6, 'V'), - (0xA7, 'V'), - (0xA8, '3', u' ̈'), - (0xA9, 'V'), - (0xAA, 'M', u'a'), - (0xAB, 'V'), - (0xAC, 'V'), - (0xAD, 'I'), - (0xAE, 'V'), - (0xAF, '3', u' ̄'), - (0xB0, 'V'), - (0xB1, 'V'), - (0xB2, 'M', u'2'), - (0xB3, 'M', u'3'), - (0xB4, '3', u' ́'), - (0xB5, 'M', u'μ'), - (0xB6, 'V'), - (0xB7, 'V'), - (0xB8, '3', u' ̧'), - (0xB9, 'M', u'1'), - (0xBA, 'M', u'o'), - (0xBB, 'V'), - (0xBC, 'M', u'1⁄4'), - (0xBD, 'M', u'1⁄2'), - (0xBE, 'M', u'3⁄4'), - (0xBF, 'V'), - (0xC0, 'M', u'à'), - (0xC1, 'M', u'á'), - (0xC2, 'M', u'â'), - (0xC3, 'M', u'ã'), - (0xC4, 'M', u'ä'), - (0xC5, 'M', u'å'), - (0xC6, 'M', u'æ'), - (0xC7, 'M', u'ç'), - ] - -def _seg_2(): - return [ - (0xC8, 'M', u'è'), - (0xC9, 'M', u'é'), - (0xCA, 'M', u'ê'), - (0xCB, 'M', u'ë'), - (0xCC, 'M', u'ì'), - (0xCD, 'M', u'í'), - (0xCE, 'M', u'î'), - (0xCF, 'M', u'ï'), - (0xD0, 'M', u'ð'), - (0xD1, 'M', u'ñ'), - (0xD2, 'M', u'ò'), - (0xD3, 'M', u'ó'), - (0xD4, 'M', u'ô'), - (0xD5, 'M', u'õ'), - (0xD6, 'M', u'ö'), - (0xD7, 'V'), - (0xD8, 'M', u'ø'), - (0xD9, 'M', u'ù'), - (0xDA, 'M', u'ú'), - (0xDB, 'M', u'û'), - (0xDC, 'M', u'ü'), - (0xDD, 'M', u'ý'), - (0xDE, 'M', u'þ'), - (0xDF, 'D', u'ss'), - (0xE0, 'V'), - (0xE1, 'V'), - (0xE2, 'V'), - (0xE3, 'V'), - (0xE4, 'V'), - (0xE5, 'V'), - (0xE6, 'V'), - (0xE7, 'V'), - (0xE8, 'V'), - (0xE9, 'V'), - (0xEA, 'V'), - (0xEB, 'V'), - (0xEC, 'V'), - (0xED, 'V'), - (0xEE, 'V'), - (0xEF, 'V'), - (0xF0, 'V'), - (0xF1, 'V'), - (0xF2, 'V'), - (0xF3, 'V'), - (0xF4, 'V'), - (0xF5, 'V'), - (0xF6, 'V'), - (0xF7, 'V'), - (0xF8, 'V'), - (0xF9, 'V'), - (0xFA, 'V'), - (0xFB, 'V'), - (0xFC, 'V'), - (0xFD, 'V'), - (0xFE, 'V'), - (0xFF, 'V'), - (0x100, 'M', u'ā'), - (0x101, 'V'), - (0x102, 'M', u'ă'), - (0x103, 'V'), - (0x104, 'M', u'ą'), - (0x105, 'V'), - (0x106, 'M', u'ć'), - (0x107, 'V'), - (0x108, 'M', u'ĉ'), - (0x109, 'V'), - (0x10A, 'M', u'ċ'), - (0x10B, 'V'), - (0x10C, 'M', u'č'), - (0x10D, 'V'), - (0x10E, 'M', u'ď'), - (0x10F, 'V'), - (0x110, 'M', u'đ'), - (0x111, 'V'), - (0x112, 'M', u'ē'), - (0x113, 'V'), - (0x114, 'M', u'ĕ'), - (0x115, 'V'), - (0x116, 'M', u'ė'), - (0x117, 'V'), - (0x118, 'M', u'ę'), - (0x119, 'V'), - (0x11A, 'M', u'ě'), - (0x11B, 'V'), - (0x11C, 'M', u'ĝ'), - (0x11D, 'V'), - (0x11E, 'M', u'ğ'), - (0x11F, 'V'), - (0x120, 'M', u'ġ'), - (0x121, 'V'), - (0x122, 'M', u'ģ'), - (0x123, 'V'), - (0x124, 'M', u'ĥ'), - (0x125, 'V'), - (0x126, 'M', u'ħ'), - (0x127, 'V'), - (0x128, 'M', u'ĩ'), - (0x129, 'V'), - (0x12A, 'M', u'ī'), - (0x12B, 'V'), - ] - -def _seg_3(): - return [ - (0x12C, 'M', u'ĭ'), - (0x12D, 'V'), - (0x12E, 'M', u'į'), - (0x12F, 'V'), - (0x130, 'M', u'i̇'), - (0x131, 'V'), - (0x132, 'M', u'ij'), - (0x134, 'M', u'ĵ'), - (0x135, 'V'), - (0x136, 'M', u'ķ'), - (0x137, 'V'), - (0x139, 'M', u'ĺ'), - (0x13A, 'V'), - (0x13B, 'M', u'ļ'), - (0x13C, 'V'), - (0x13D, 'M', u'ľ'), - (0x13E, 'V'), - (0x13F, 'M', u'l·'), - (0x141, 'M', u'ł'), - (0x142, 'V'), - (0x143, 'M', u'ń'), - (0x144, 'V'), - (0x145, 'M', u'ņ'), - (0x146, 'V'), - (0x147, 'M', u'ň'), - (0x148, 'V'), - (0x149, 'M', u'ʼn'), - (0x14A, 'M', u'ŋ'), - (0x14B, 'V'), - (0x14C, 'M', u'ō'), - (0x14D, 'V'), - (0x14E, 'M', u'ŏ'), - (0x14F, 'V'), - (0x150, 'M', u'ő'), - (0x151, 'V'), - (0x152, 'M', u'œ'), - (0x153, 'V'), - (0x154, 'M', u'ŕ'), - (0x155, 'V'), - (0x156, 'M', u'ŗ'), - (0x157, 'V'), - (0x158, 'M', u'ř'), - (0x159, 'V'), - (0x15A, 'M', u'ś'), - (0x15B, 'V'), - (0x15C, 'M', u'ŝ'), - (0x15D, 'V'), - (0x15E, 'M', u'ş'), - (0x15F, 'V'), - (0x160, 'M', u'š'), - (0x161, 'V'), - (0x162, 'M', u'ţ'), - (0x163, 'V'), - (0x164, 'M', u'ť'), - (0x165, 'V'), - (0x166, 'M', u'ŧ'), - (0x167, 'V'), - (0x168, 'M', u'ũ'), - (0x169, 'V'), - (0x16A, 'M', u'ū'), - (0x16B, 'V'), - (0x16C, 'M', u'ŭ'), - (0x16D, 'V'), - (0x16E, 'M', u'ů'), - (0x16F, 'V'), - (0x170, 'M', u'ű'), - (0x171, 'V'), - (0x172, 'M', u'ų'), - (0x173, 'V'), - (0x174, 'M', u'ŵ'), - (0x175, 'V'), - (0x176, 'M', u'ŷ'), - (0x177, 'V'), - (0x178, 'M', u'ÿ'), - (0x179, 'M', u'ź'), - (0x17A, 'V'), - (0x17B, 'M', u'ż'), - (0x17C, 'V'), - (0x17D, 'M', u'ž'), - (0x17E, 'V'), - (0x17F, 'M', u's'), - (0x180, 'V'), - (0x181, 'M', u'ɓ'), - (0x182, 'M', u'ƃ'), - (0x183, 'V'), - (0x184, 'M', u'ƅ'), - (0x185, 'V'), - (0x186, 'M', u'ɔ'), - (0x187, 'M', u'ƈ'), - (0x188, 'V'), - (0x189, 'M', u'ɖ'), - (0x18A, 'M', u'ɗ'), - (0x18B, 'M', u'ƌ'), - (0x18C, 'V'), - (0x18E, 'M', u'ǝ'), - (0x18F, 'M', u'ə'), - (0x190, 'M', u'ɛ'), - (0x191, 'M', u'ƒ'), - (0x192, 'V'), - (0x193, 'M', u'ɠ'), - ] - -def _seg_4(): - return [ - (0x194, 'M', u'ɣ'), - (0x195, 'V'), - (0x196, 'M', u'ɩ'), - (0x197, 'M', u'ɨ'), - (0x198, 'M', u'ƙ'), - (0x199, 'V'), - (0x19C, 'M', u'ɯ'), - (0x19D, 'M', u'ɲ'), - (0x19E, 'V'), - (0x19F, 'M', u'ɵ'), - (0x1A0, 'M', u'ơ'), - (0x1A1, 'V'), - (0x1A2, 'M', u'ƣ'), - (0x1A3, 'V'), - (0x1A4, 'M', u'ƥ'), - (0x1A5, 'V'), - (0x1A6, 'M', u'ʀ'), - (0x1A7, 'M', u'ƨ'), - (0x1A8, 'V'), - (0x1A9, 'M', u'ʃ'), - (0x1AA, 'V'), - (0x1AC, 'M', u'ƭ'), - (0x1AD, 'V'), - (0x1AE, 'M', u'ʈ'), - (0x1AF, 'M', u'ư'), - (0x1B0, 'V'), - (0x1B1, 'M', u'ʊ'), - (0x1B2, 'M', u'ʋ'), - (0x1B3, 'M', u'ƴ'), - (0x1B4, 'V'), - (0x1B5, 'M', u'ƶ'), - (0x1B6, 'V'), - (0x1B7, 'M', u'ʒ'), - (0x1B8, 'M', u'ƹ'), - (0x1B9, 'V'), - (0x1BC, 'M', u'ƽ'), - (0x1BD, 'V'), - (0x1C4, 'M', u'dž'), - (0x1C7, 'M', u'lj'), - (0x1CA, 'M', u'nj'), - (0x1CD, 'M', u'ǎ'), - (0x1CE, 'V'), - (0x1CF, 'M', u'ǐ'), - (0x1D0, 'V'), - (0x1D1, 'M', u'ǒ'), - (0x1D2, 'V'), - (0x1D3, 'M', u'ǔ'), - (0x1D4, 'V'), - (0x1D5, 'M', u'ǖ'), - (0x1D6, 'V'), - (0x1D7, 'M', u'ǘ'), - (0x1D8, 'V'), - (0x1D9, 'M', u'ǚ'), - (0x1DA, 'V'), - (0x1DB, 'M', u'ǜ'), - (0x1DC, 'V'), - (0x1DE, 'M', u'ǟ'), - (0x1DF, 'V'), - (0x1E0, 'M', u'ǡ'), - (0x1E1, 'V'), - (0x1E2, 'M', u'ǣ'), - (0x1E3, 'V'), - (0x1E4, 'M', u'ǥ'), - (0x1E5, 'V'), - (0x1E6, 'M', u'ǧ'), - (0x1E7, 'V'), - (0x1E8, 'M', u'ǩ'), - (0x1E9, 'V'), - (0x1EA, 'M', u'ǫ'), - (0x1EB, 'V'), - (0x1EC, 'M', u'ǭ'), - (0x1ED, 'V'), - (0x1EE, 'M', u'ǯ'), - (0x1EF, 'V'), - (0x1F1, 'M', u'dz'), - (0x1F4, 'M', u'ǵ'), - (0x1F5, 'V'), - (0x1F6, 'M', u'ƕ'), - (0x1F7, 'M', u'ƿ'), - (0x1F8, 'M', u'ǹ'), - (0x1F9, 'V'), - (0x1FA, 'M', u'ǻ'), - (0x1FB, 'V'), - (0x1FC, 'M', u'ǽ'), - (0x1FD, 'V'), - (0x1FE, 'M', u'ǿ'), - (0x1FF, 'V'), - (0x200, 'M', u'ȁ'), - (0x201, 'V'), - (0x202, 'M', u'ȃ'), - (0x203, 'V'), - (0x204, 'M', u'ȅ'), - (0x205, 'V'), - (0x206, 'M', u'ȇ'), - (0x207, 'V'), - (0x208, 'M', u'ȉ'), - (0x209, 'V'), - (0x20A, 'M', u'ȋ'), - (0x20B, 'V'), - (0x20C, 'M', u'ȍ'), - ] - -def _seg_5(): - return [ - (0x20D, 'V'), - (0x20E, 'M', u'ȏ'), - (0x20F, 'V'), - (0x210, 'M', u'ȑ'), - (0x211, 'V'), - (0x212, 'M', u'ȓ'), - (0x213, 'V'), - (0x214, 'M', u'ȕ'), - (0x215, 'V'), - (0x216, 'M', u'ȗ'), - (0x217, 'V'), - (0x218, 'M', u'ș'), - (0x219, 'V'), - (0x21A, 'M', u'ț'), - (0x21B, 'V'), - (0x21C, 'M', u'ȝ'), - (0x21D, 'V'), - (0x21E, 'M', u'ȟ'), - (0x21F, 'V'), - (0x220, 'M', u'ƞ'), - (0x221, 'V'), - (0x222, 'M', u'ȣ'), - (0x223, 'V'), - (0x224, 'M', u'ȥ'), - (0x225, 'V'), - (0x226, 'M', u'ȧ'), - (0x227, 'V'), - (0x228, 'M', u'ȩ'), - (0x229, 'V'), - (0x22A, 'M', u'ȫ'), - (0x22B, 'V'), - (0x22C, 'M', u'ȭ'), - (0x22D, 'V'), - (0x22E, 'M', u'ȯ'), - (0x22F, 'V'), - (0x230, 'M', u'ȱ'), - (0x231, 'V'), - (0x232, 'M', u'ȳ'), - (0x233, 'V'), - (0x23A, 'M', u'ⱥ'), - (0x23B, 'M', u'ȼ'), - (0x23C, 'V'), - (0x23D, 'M', u'ƚ'), - (0x23E, 'M', u'ⱦ'), - (0x23F, 'V'), - (0x241, 'M', u'ɂ'), - (0x242, 'V'), - (0x243, 'M', u'ƀ'), - (0x244, 'M', u'ʉ'), - (0x245, 'M', u'ʌ'), - (0x246, 'M', u'ɇ'), - (0x247, 'V'), - (0x248, 'M', u'ɉ'), - (0x249, 'V'), - (0x24A, 'M', u'ɋ'), - (0x24B, 'V'), - (0x24C, 'M', u'ɍ'), - (0x24D, 'V'), - (0x24E, 'M', u'ɏ'), - (0x24F, 'V'), - (0x2B0, 'M', u'h'), - (0x2B1, 'M', u'ɦ'), - (0x2B2, 'M', u'j'), - (0x2B3, 'M', u'r'), - (0x2B4, 'M', u'ɹ'), - (0x2B5, 'M', u'ɻ'), - (0x2B6, 'M', u'ʁ'), - (0x2B7, 'M', u'w'), - (0x2B8, 'M', u'y'), - (0x2B9, 'V'), - (0x2D8, '3', u' ̆'), - (0x2D9, '3', u' ̇'), - (0x2DA, '3', u' ̊'), - (0x2DB, '3', u' ̨'), - (0x2DC, '3', u' ̃'), - (0x2DD, '3', u' ̋'), - (0x2DE, 'V'), - (0x2E0, 'M', u'ɣ'), - (0x2E1, 'M', u'l'), - (0x2E2, 'M', u's'), - (0x2E3, 'M', u'x'), - (0x2E4, 'M', u'ʕ'), - (0x2E5, 'V'), - (0x340, 'M', u'̀'), - (0x341, 'M', u'́'), - (0x342, 'V'), - (0x343, 'M', u'̓'), - (0x344, 'M', u'̈́'), - (0x345, 'M', u'ι'), - (0x346, 'V'), - (0x34F, 'I'), - (0x350, 'V'), - (0x370, 'M', u'ͱ'), - (0x371, 'V'), - (0x372, 'M', u'ͳ'), - (0x373, 'V'), - (0x374, 'M', u'ʹ'), - (0x375, 'V'), - (0x376, 'M', u'ͷ'), - (0x377, 'V'), - ] - -def _seg_6(): - return [ - (0x378, 'X'), - (0x37A, '3', u' ι'), - (0x37B, 'V'), - (0x37E, '3', u';'), - (0x37F, 'X'), - (0x384, '3', u' ́'), - (0x385, '3', u' ̈́'), - (0x386, 'M', u'ά'), - (0x387, 'M', u'·'), - (0x388, 'M', u'έ'), - (0x389, 'M', u'ή'), - (0x38A, 'M', u'ί'), - (0x38B, 'X'), - (0x38C, 'M', u'ό'), - (0x38D, 'X'), - (0x38E, 'M', u'ύ'), - (0x38F, 'M', u'ώ'), - (0x390, 'V'), - (0x391, 'M', u'α'), - (0x392, 'M', u'β'), - (0x393, 'M', u'γ'), - (0x394, 'M', u'δ'), - (0x395, 'M', u'ε'), - (0x396, 'M', u'ζ'), - (0x397, 'M', u'η'), - (0x398, 'M', u'θ'), - (0x399, 'M', u'ι'), - (0x39A, 'M', u'κ'), - (0x39B, 'M', u'λ'), - (0x39C, 'M', u'μ'), - (0x39D, 'M', u'ν'), - (0x39E, 'M', u'ξ'), - (0x39F, 'M', u'ο'), - (0x3A0, 'M', u'π'), - (0x3A1, 'M', u'ρ'), - (0x3A2, 'X'), - (0x3A3, 'M', u'σ'), - (0x3A4, 'M', u'τ'), - (0x3A5, 'M', u'υ'), - (0x3A6, 'M', u'φ'), - (0x3A7, 'M', u'χ'), - (0x3A8, 'M', u'ψ'), - (0x3A9, 'M', u'ω'), - (0x3AA, 'M', u'ϊ'), - (0x3AB, 'M', u'ϋ'), - (0x3AC, 'V'), - (0x3C2, 'D', u'σ'), - (0x3C3, 'V'), - (0x3CF, 'M', u'ϗ'), - (0x3D0, 'M', u'β'), - (0x3D1, 'M', u'θ'), - (0x3D2, 'M', u'υ'), - (0x3D3, 'M', u'ύ'), - (0x3D4, 'M', u'ϋ'), - (0x3D5, 'M', u'φ'), - (0x3D6, 'M', u'π'), - (0x3D7, 'V'), - (0x3D8, 'M', u'ϙ'), - (0x3D9, 'V'), - (0x3DA, 'M', u'ϛ'), - (0x3DB, 'V'), - (0x3DC, 'M', u'ϝ'), - (0x3DD, 'V'), - (0x3DE, 'M', u'ϟ'), - (0x3DF, 'V'), - (0x3E0, 'M', u'ϡ'), - (0x3E1, 'V'), - (0x3E2, 'M', u'ϣ'), - (0x3E3, 'V'), - (0x3E4, 'M', u'ϥ'), - (0x3E5, 'V'), - (0x3E6, 'M', u'ϧ'), - (0x3E7, 'V'), - (0x3E8, 'M', u'ϩ'), - (0x3E9, 'V'), - (0x3EA, 'M', u'ϫ'), - (0x3EB, 'V'), - (0x3EC, 'M', u'ϭ'), - (0x3ED, 'V'), - (0x3EE, 'M', u'ϯ'), - (0x3EF, 'V'), - (0x3F0, 'M', u'κ'), - (0x3F1, 'M', u'ρ'), - (0x3F2, 'M', u'σ'), - (0x3F3, 'V'), - (0x3F4, 'M', u'θ'), - (0x3F5, 'M', u'ε'), - (0x3F6, 'V'), - (0x3F7, 'M', u'ϸ'), - (0x3F8, 'V'), - (0x3F9, 'M', u'σ'), - (0x3FA, 'M', u'ϻ'), - (0x3FB, 'V'), - (0x3FD, 'M', u'ͻ'), - (0x3FE, 'M', u'ͼ'), - (0x3FF, 'M', u'ͽ'), - (0x400, 'M', u'ѐ'), - (0x401, 'M', u'ё'), - (0x402, 'M', u'ђ'), - (0x403, 'M', u'ѓ'), - ] - -def _seg_7(): - return [ - (0x404, 'M', u'є'), - (0x405, 'M', u'ѕ'), - (0x406, 'M', u'і'), - (0x407, 'M', u'ї'), - (0x408, 'M', u'ј'), - (0x409, 'M', u'љ'), - (0x40A, 'M', u'њ'), - (0x40B, 'M', u'ћ'), - (0x40C, 'M', u'ќ'), - (0x40D, 'M', u'ѝ'), - (0x40E, 'M', u'ў'), - (0x40F, 'M', u'џ'), - (0x410, 'M', u'а'), - (0x411, 'M', u'б'), - (0x412, 'M', u'в'), - (0x413, 'M', u'г'), - (0x414, 'M', u'д'), - (0x415, 'M', u'е'), - (0x416, 'M', u'ж'), - (0x417, 'M', u'з'), - (0x418, 'M', u'и'), - (0x419, 'M', u'й'), - (0x41A, 'M', u'к'), - (0x41B, 'M', u'л'), - (0x41C, 'M', u'м'), - (0x41D, 'M', u'н'), - (0x41E, 'M', u'о'), - (0x41F, 'M', u'п'), - (0x420, 'M', u'р'), - (0x421, 'M', u'с'), - (0x422, 'M', u'т'), - (0x423, 'M', u'у'), - (0x424, 'M', u'ф'), - (0x425, 'M', u'х'), - (0x426, 'M', u'ц'), - (0x427, 'M', u'ч'), - (0x428, 'M', u'ш'), - (0x429, 'M', u'щ'), - (0x42A, 'M', u'ъ'), - (0x42B, 'M', u'ы'), - (0x42C, 'M', u'ь'), - (0x42D, 'M', u'э'), - (0x42E, 'M', u'ю'), - (0x42F, 'M', u'я'), - (0x430, 'V'), - (0x460, 'M', u'ѡ'), - (0x461, 'V'), - (0x462, 'M', u'ѣ'), - (0x463, 'V'), - (0x464, 'M', u'ѥ'), - (0x465, 'V'), - (0x466, 'M', u'ѧ'), - (0x467, 'V'), - (0x468, 'M', u'ѩ'), - (0x469, 'V'), - (0x46A, 'M', u'ѫ'), - (0x46B, 'V'), - (0x46C, 'M', u'ѭ'), - (0x46D, 'V'), - (0x46E, 'M', u'ѯ'), - (0x46F, 'V'), - (0x470, 'M', u'ѱ'), - (0x471, 'V'), - (0x472, 'M', u'ѳ'), - (0x473, 'V'), - (0x474, 'M', u'ѵ'), - (0x475, 'V'), - (0x476, 'M', u'ѷ'), - (0x477, 'V'), - (0x478, 'M', u'ѹ'), - (0x479, 'V'), - (0x47A, 'M', u'ѻ'), - (0x47B, 'V'), - (0x47C, 'M', u'ѽ'), - (0x47D, 'V'), - (0x47E, 'M', u'ѿ'), - (0x47F, 'V'), - (0x480, 'M', u'ҁ'), - (0x481, 'V'), - (0x48A, 'M', u'ҋ'), - (0x48B, 'V'), - (0x48C, 'M', u'ҍ'), - (0x48D, 'V'), - (0x48E, 'M', u'ҏ'), - (0x48F, 'V'), - (0x490, 'M', u'ґ'), - (0x491, 'V'), - (0x492, 'M', u'ғ'), - (0x493, 'V'), - (0x494, 'M', u'ҕ'), - (0x495, 'V'), - (0x496, 'M', u'җ'), - (0x497, 'V'), - (0x498, 'M', u'ҙ'), - (0x499, 'V'), - (0x49A, 'M', u'қ'), - (0x49B, 'V'), - (0x49C, 'M', u'ҝ'), - (0x49D, 'V'), - (0x49E, 'M', u'ҟ'), - ] - -def _seg_8(): - return [ - (0x49F, 'V'), - (0x4A0, 'M', u'ҡ'), - (0x4A1, 'V'), - (0x4A2, 'M', u'ң'), - (0x4A3, 'V'), - (0x4A4, 'M', u'ҥ'), - (0x4A5, 'V'), - (0x4A6, 'M', u'ҧ'), - (0x4A7, 'V'), - (0x4A8, 'M', u'ҩ'), - (0x4A9, 'V'), - (0x4AA, 'M', u'ҫ'), - (0x4AB, 'V'), - (0x4AC, 'M', u'ҭ'), - (0x4AD, 'V'), - (0x4AE, 'M', u'ү'), - (0x4AF, 'V'), - (0x4B0, 'M', u'ұ'), - (0x4B1, 'V'), - (0x4B2, 'M', u'ҳ'), - (0x4B3, 'V'), - (0x4B4, 'M', u'ҵ'), - (0x4B5, 'V'), - (0x4B6, 'M', u'ҷ'), - (0x4B7, 'V'), - (0x4B8, 'M', u'ҹ'), - (0x4B9, 'V'), - (0x4BA, 'M', u'һ'), - (0x4BB, 'V'), - (0x4BC, 'M', u'ҽ'), - (0x4BD, 'V'), - (0x4BE, 'M', u'ҿ'), - (0x4BF, 'V'), - (0x4C0, 'X'), - (0x4C1, 'M', u'ӂ'), - (0x4C2, 'V'), - (0x4C3, 'M', u'ӄ'), - (0x4C4, 'V'), - (0x4C5, 'M', u'ӆ'), - (0x4C6, 'V'), - (0x4C7, 'M', u'ӈ'), - (0x4C8, 'V'), - (0x4C9, 'M', u'ӊ'), - (0x4CA, 'V'), - (0x4CB, 'M', u'ӌ'), - (0x4CC, 'V'), - (0x4CD, 'M', u'ӎ'), - (0x4CE, 'V'), - (0x4D0, 'M', u'ӑ'), - (0x4D1, 'V'), - (0x4D2, 'M', u'ӓ'), - (0x4D3, 'V'), - (0x4D4, 'M', u'ӕ'), - (0x4D5, 'V'), - (0x4D6, 'M', u'ӗ'), - (0x4D7, 'V'), - (0x4D8, 'M', u'ә'), - (0x4D9, 'V'), - (0x4DA, 'M', u'ӛ'), - (0x4DB, 'V'), - (0x4DC, 'M', u'ӝ'), - (0x4DD, 'V'), - (0x4DE, 'M', u'ӟ'), - (0x4DF, 'V'), - (0x4E0, 'M', u'ӡ'), - (0x4E1, 'V'), - (0x4E2, 'M', u'ӣ'), - (0x4E3, 'V'), - (0x4E4, 'M', u'ӥ'), - (0x4E5, 'V'), - (0x4E6, 'M', u'ӧ'), - (0x4E7, 'V'), - (0x4E8, 'M', u'ө'), - (0x4E9, 'V'), - (0x4EA, 'M', u'ӫ'), - (0x4EB, 'V'), - (0x4EC, 'M', u'ӭ'), - (0x4ED, 'V'), - (0x4EE, 'M', u'ӯ'), - (0x4EF, 'V'), - (0x4F0, 'M', u'ӱ'), - (0x4F1, 'V'), - (0x4F2, 'M', u'ӳ'), - (0x4F3, 'V'), - (0x4F4, 'M', u'ӵ'), - (0x4F5, 'V'), - (0x4F6, 'M', u'ӷ'), - (0x4F7, 'V'), - (0x4F8, 'M', u'ӹ'), - (0x4F9, 'V'), - (0x4FA, 'M', u'ӻ'), - (0x4FB, 'V'), - (0x4FC, 'M', u'ӽ'), - (0x4FD, 'V'), - (0x4FE, 'M', u'ӿ'), - (0x4FF, 'V'), - (0x500, 'M', u'ԁ'), - (0x501, 'V'), - (0x502, 'M', u'ԃ'), - (0x503, 'V'), - ] - -def _seg_9(): - return [ - (0x504, 'M', u'ԅ'), - (0x505, 'V'), - (0x506, 'M', u'ԇ'), - (0x507, 'V'), - (0x508, 'M', u'ԉ'), - (0x509, 'V'), - (0x50A, 'M', u'ԋ'), - (0x50B, 'V'), - (0x50C, 'M', u'ԍ'), - (0x50D, 'V'), - (0x50E, 'M', u'ԏ'), - (0x50F, 'V'), - (0x510, 'M', u'ԑ'), - (0x511, 'V'), - (0x512, 'M', u'ԓ'), - (0x513, 'V'), - (0x514, 'M', u'ԕ'), - (0x515, 'V'), - (0x516, 'M', u'ԗ'), - (0x517, 'V'), - (0x518, 'M', u'ԙ'), - (0x519, 'V'), - (0x51A, 'M', u'ԛ'), - (0x51B, 'V'), - (0x51C, 'M', u'ԝ'), - (0x51D, 'V'), - (0x51E, 'M', u'ԟ'), - (0x51F, 'V'), - (0x520, 'M', u'ԡ'), - (0x521, 'V'), - (0x522, 'M', u'ԣ'), - (0x523, 'V'), - (0x524, 'M', u'ԥ'), - (0x525, 'V'), - (0x526, 'M', u'ԧ'), - (0x527, 'V'), - (0x528, 'X'), - (0x531, 'M', u'ա'), - (0x532, 'M', u'բ'), - (0x533, 'M', u'գ'), - (0x534, 'M', u'դ'), - (0x535, 'M', u'ե'), - (0x536, 'M', u'զ'), - (0x537, 'M', u'է'), - (0x538, 'M', u'ը'), - (0x539, 'M', u'թ'), - (0x53A, 'M', u'ժ'), - (0x53B, 'M', u'ի'), - (0x53C, 'M', u'լ'), - (0x53D, 'M', u'խ'), - (0x53E, 'M', u'ծ'), - (0x53F, 'M', u'կ'), - (0x540, 'M', u'հ'), - (0x541, 'M', u'ձ'), - (0x542, 'M', u'ղ'), - (0x543, 'M', u'ճ'), - (0x544, 'M', u'մ'), - (0x545, 'M', u'յ'), - (0x546, 'M', u'ն'), - (0x547, 'M', u'շ'), - (0x548, 'M', u'ո'), - (0x549, 'M', u'չ'), - (0x54A, 'M', u'պ'), - (0x54B, 'M', u'ջ'), - (0x54C, 'M', u'ռ'), - (0x54D, 'M', u'ս'), - (0x54E, 'M', u'վ'), - (0x54F, 'M', u'տ'), - (0x550, 'M', u'ր'), - (0x551, 'M', u'ց'), - (0x552, 'M', u'ւ'), - (0x553, 'M', u'փ'), - (0x554, 'M', u'ք'), - (0x555, 'M', u'օ'), - (0x556, 'M', u'ֆ'), - (0x557, 'X'), - (0x559, 'V'), - (0x560, 'X'), - (0x561, 'V'), - (0x587, 'M', u'եւ'), - (0x588, 'X'), - (0x589, 'V'), - (0x58B, 'X'), - (0x58F, 'V'), - (0x590, 'X'), - (0x591, 'V'), - (0x5C8, 'X'), - (0x5D0, 'V'), - (0x5EB, 'X'), - (0x5F0, 'V'), - (0x5F5, 'X'), - (0x606, 'V'), - (0x61C, 'X'), - (0x61E, 'V'), - (0x675, 'M', u'اٴ'), - (0x676, 'M', u'وٴ'), - (0x677, 'M', u'ۇٴ'), - (0x678, 'M', u'يٴ'), - (0x679, 'V'), - (0x6DD, 'X'), - ] - -def _seg_10(): - return [ - (0x6DE, 'V'), - (0x70E, 'X'), - (0x710, 'V'), - (0x74B, 'X'), - (0x74D, 'V'), - (0x7B2, 'X'), - (0x7C0, 'V'), - (0x7FB, 'X'), - (0x800, 'V'), - (0x82E, 'X'), - (0x830, 'V'), - (0x83F, 'X'), - (0x840, 'V'), - (0x85C, 'X'), - (0x85E, 'V'), - (0x85F, 'X'), - (0x8A0, 'V'), - (0x8A1, 'X'), - (0x8A2, 'V'), - (0x8AD, 'X'), - (0x8E4, 'V'), - (0x8FF, 'X'), - (0x900, 'V'), - (0x958, 'M', u'क़'), - (0x959, 'M', u'ख़'), - (0x95A, 'M', u'ग़'), - (0x95B, 'M', u'ज़'), - (0x95C, 'M', u'ड़'), - (0x95D, 'M', u'ढ़'), - (0x95E, 'M', u'फ़'), - (0x95F, 'M', u'य़'), - (0x960, 'V'), - (0x978, 'X'), - (0x979, 'V'), - (0x980, 'X'), - (0x981, 'V'), - (0x984, 'X'), - (0x985, 'V'), - (0x98D, 'X'), - (0x98F, 'V'), - (0x991, 'X'), - (0x993, 'V'), - (0x9A9, 'X'), - (0x9AA, 'V'), - (0x9B1, 'X'), - (0x9B2, 'V'), - (0x9B3, 'X'), - (0x9B6, 'V'), - (0x9BA, 'X'), - (0x9BC, 'V'), - (0x9C5, 'X'), - (0x9C7, 'V'), - (0x9C9, 'X'), - (0x9CB, 'V'), - (0x9CF, 'X'), - (0x9D7, 'V'), - (0x9D8, 'X'), - (0x9DC, 'M', u'ড়'), - (0x9DD, 'M', u'ঢ়'), - (0x9DE, 'X'), - (0x9DF, 'M', u'য়'), - (0x9E0, 'V'), - (0x9E4, 'X'), - (0x9E6, 'V'), - (0x9FC, 'X'), - (0xA01, 'V'), - (0xA04, 'X'), - (0xA05, 'V'), - (0xA0B, 'X'), - (0xA0F, 'V'), - (0xA11, 'X'), - (0xA13, 'V'), - (0xA29, 'X'), - (0xA2A, 'V'), - (0xA31, 'X'), - (0xA32, 'V'), - (0xA33, 'M', u'ਲ਼'), - (0xA34, 'X'), - (0xA35, 'V'), - (0xA36, 'M', u'ਸ਼'), - (0xA37, 'X'), - (0xA38, 'V'), - (0xA3A, 'X'), - (0xA3C, 'V'), - (0xA3D, 'X'), - (0xA3E, 'V'), - (0xA43, 'X'), - (0xA47, 'V'), - (0xA49, 'X'), - (0xA4B, 'V'), - (0xA4E, 'X'), - (0xA51, 'V'), - (0xA52, 'X'), - (0xA59, 'M', u'ਖ਼'), - (0xA5A, 'M', u'ਗ਼'), - (0xA5B, 'M', u'ਜ਼'), - (0xA5C, 'V'), - (0xA5D, 'X'), - (0xA5E, 'M', u'ਫ਼'), - (0xA5F, 'X'), - ] - -def _seg_11(): - return [ - (0xA66, 'V'), - (0xA76, 'X'), - (0xA81, 'V'), - (0xA84, 'X'), - (0xA85, 'V'), - (0xA8E, 'X'), - (0xA8F, 'V'), - (0xA92, 'X'), - (0xA93, 'V'), - (0xAA9, 'X'), - (0xAAA, 'V'), - (0xAB1, 'X'), - (0xAB2, 'V'), - (0xAB4, 'X'), - (0xAB5, 'V'), - (0xABA, 'X'), - (0xABC, 'V'), - (0xAC6, 'X'), - (0xAC7, 'V'), - (0xACA, 'X'), - (0xACB, 'V'), - (0xACE, 'X'), - (0xAD0, 'V'), - (0xAD1, 'X'), - (0xAE0, 'V'), - (0xAE4, 'X'), - (0xAE6, 'V'), - (0xAF2, 'X'), - (0xB01, 'V'), - (0xB04, 'X'), - (0xB05, 'V'), - (0xB0D, 'X'), - (0xB0F, 'V'), - (0xB11, 'X'), - (0xB13, 'V'), - (0xB29, 'X'), - (0xB2A, 'V'), - (0xB31, 'X'), - (0xB32, 'V'), - (0xB34, 'X'), - (0xB35, 'V'), - (0xB3A, 'X'), - (0xB3C, 'V'), - (0xB45, 'X'), - (0xB47, 'V'), - (0xB49, 'X'), - (0xB4B, 'V'), - (0xB4E, 'X'), - (0xB56, 'V'), - (0xB58, 'X'), - (0xB5C, 'M', u'ଡ଼'), - (0xB5D, 'M', u'ଢ଼'), - (0xB5E, 'X'), - (0xB5F, 'V'), - (0xB64, 'X'), - (0xB66, 'V'), - (0xB78, 'X'), - (0xB82, 'V'), - (0xB84, 'X'), - (0xB85, 'V'), - (0xB8B, 'X'), - (0xB8E, 'V'), - (0xB91, 'X'), - (0xB92, 'V'), - (0xB96, 'X'), - (0xB99, 'V'), - (0xB9B, 'X'), - (0xB9C, 'V'), - (0xB9D, 'X'), - (0xB9E, 'V'), - (0xBA0, 'X'), - (0xBA3, 'V'), - (0xBA5, 'X'), - (0xBA8, 'V'), - (0xBAB, 'X'), - (0xBAE, 'V'), - (0xBBA, 'X'), - (0xBBE, 'V'), - (0xBC3, 'X'), - (0xBC6, 'V'), - (0xBC9, 'X'), - (0xBCA, 'V'), - (0xBCE, 'X'), - (0xBD0, 'V'), - (0xBD1, 'X'), - (0xBD7, 'V'), - (0xBD8, 'X'), - (0xBE6, 'V'), - (0xBFB, 'X'), - (0xC01, 'V'), - (0xC04, 'X'), - (0xC05, 'V'), - (0xC0D, 'X'), - (0xC0E, 'V'), - (0xC11, 'X'), - (0xC12, 'V'), - (0xC29, 'X'), - (0xC2A, 'V'), - (0xC34, 'X'), - (0xC35, 'V'), - ] - -def _seg_12(): - return [ - (0xC3A, 'X'), - (0xC3D, 'V'), - (0xC45, 'X'), - (0xC46, 'V'), - (0xC49, 'X'), - (0xC4A, 'V'), - (0xC4E, 'X'), - (0xC55, 'V'), - (0xC57, 'X'), - (0xC58, 'V'), - (0xC5A, 'X'), - (0xC60, 'V'), - (0xC64, 'X'), - (0xC66, 'V'), - (0xC70, 'X'), - (0xC78, 'V'), - (0xC80, 'X'), - (0xC82, 'V'), - (0xC84, 'X'), - (0xC85, 'V'), - (0xC8D, 'X'), - (0xC8E, 'V'), - (0xC91, 'X'), - (0xC92, 'V'), - (0xCA9, 'X'), - (0xCAA, 'V'), - (0xCB4, 'X'), - (0xCB5, 'V'), - (0xCBA, 'X'), - (0xCBC, 'V'), - (0xCC5, 'X'), - (0xCC6, 'V'), - (0xCC9, 'X'), - (0xCCA, 'V'), - (0xCCE, 'X'), - (0xCD5, 'V'), - (0xCD7, 'X'), - (0xCDE, 'V'), - (0xCDF, 'X'), - (0xCE0, 'V'), - (0xCE4, 'X'), - (0xCE6, 'V'), - (0xCF0, 'X'), - (0xCF1, 'V'), - (0xCF3, 'X'), - (0xD02, 'V'), - (0xD04, 'X'), - (0xD05, 'V'), - (0xD0D, 'X'), - (0xD0E, 'V'), - (0xD11, 'X'), - (0xD12, 'V'), - (0xD3B, 'X'), - (0xD3D, 'V'), - (0xD45, 'X'), - (0xD46, 'V'), - (0xD49, 'X'), - (0xD4A, 'V'), - (0xD4F, 'X'), - (0xD57, 'V'), - (0xD58, 'X'), - (0xD60, 'V'), - (0xD64, 'X'), - (0xD66, 'V'), - (0xD76, 'X'), - (0xD79, 'V'), - (0xD80, 'X'), - (0xD82, 'V'), - (0xD84, 'X'), - (0xD85, 'V'), - (0xD97, 'X'), - (0xD9A, 'V'), - (0xDB2, 'X'), - (0xDB3, 'V'), - (0xDBC, 'X'), - (0xDBD, 'V'), - (0xDBE, 'X'), - (0xDC0, 'V'), - (0xDC7, 'X'), - (0xDCA, 'V'), - (0xDCB, 'X'), - (0xDCF, 'V'), - (0xDD5, 'X'), - (0xDD6, 'V'), - (0xDD7, 'X'), - (0xDD8, 'V'), - (0xDE0, 'X'), - (0xDF2, 'V'), - (0xDF5, 'X'), - (0xE01, 'V'), - (0xE33, 'M', u'ํา'), - (0xE34, 'V'), - (0xE3B, 'X'), - (0xE3F, 'V'), - (0xE5C, 'X'), - (0xE81, 'V'), - (0xE83, 'X'), - (0xE84, 'V'), - (0xE85, 'X'), - (0xE87, 'V'), - ] - -def _seg_13(): - return [ - (0xE89, 'X'), - (0xE8A, 'V'), - (0xE8B, 'X'), - (0xE8D, 'V'), - (0xE8E, 'X'), - (0xE94, 'V'), - (0xE98, 'X'), - (0xE99, 'V'), - (0xEA0, 'X'), - (0xEA1, 'V'), - (0xEA4, 'X'), - (0xEA5, 'V'), - (0xEA6, 'X'), - (0xEA7, 'V'), - (0xEA8, 'X'), - (0xEAA, 'V'), - (0xEAC, 'X'), - (0xEAD, 'V'), - (0xEB3, 'M', u'ໍາ'), - (0xEB4, 'V'), - (0xEBA, 'X'), - (0xEBB, 'V'), - (0xEBE, 'X'), - (0xEC0, 'V'), - (0xEC5, 'X'), - (0xEC6, 'V'), - (0xEC7, 'X'), - (0xEC8, 'V'), - (0xECE, 'X'), - (0xED0, 'V'), - (0xEDA, 'X'), - (0xEDC, 'M', u'ຫນ'), - (0xEDD, 'M', u'ຫມ'), - (0xEDE, 'V'), - (0xEE0, 'X'), - (0xF00, 'V'), - (0xF0C, 'M', u'་'), - (0xF0D, 'V'), - (0xF43, 'M', u'གྷ'), - (0xF44, 'V'), - (0xF48, 'X'), - (0xF49, 'V'), - (0xF4D, 'M', u'ཌྷ'), - (0xF4E, 'V'), - (0xF52, 'M', u'དྷ'), - (0xF53, 'V'), - (0xF57, 'M', u'བྷ'), - (0xF58, 'V'), - (0xF5C, 'M', u'ཛྷ'), - (0xF5D, 'V'), - (0xF69, 'M', u'ཀྵ'), - (0xF6A, 'V'), - (0xF6D, 'X'), - (0xF71, 'V'), - (0xF73, 'M', u'ཱི'), - (0xF74, 'V'), - (0xF75, 'M', u'ཱུ'), - (0xF76, 'M', u'ྲྀ'), - (0xF77, 'M', u'ྲཱྀ'), - (0xF78, 'M', u'ླྀ'), - (0xF79, 'M', u'ླཱྀ'), - (0xF7A, 'V'), - (0xF81, 'M', u'ཱྀ'), - (0xF82, 'V'), - (0xF93, 'M', u'ྒྷ'), - (0xF94, 'V'), - (0xF98, 'X'), - (0xF99, 'V'), - (0xF9D, 'M', u'ྜྷ'), - (0xF9E, 'V'), - (0xFA2, 'M', u'ྡྷ'), - (0xFA3, 'V'), - (0xFA7, 'M', u'ྦྷ'), - (0xFA8, 'V'), - (0xFAC, 'M', u'ྫྷ'), - (0xFAD, 'V'), - (0xFB9, 'M', u'ྐྵ'), - (0xFBA, 'V'), - (0xFBD, 'X'), - (0xFBE, 'V'), - (0xFCD, 'X'), - (0xFCE, 'V'), - (0xFDB, 'X'), - (0x1000, 'V'), - (0x10A0, 'X'), - (0x10C7, 'M', u'ⴧ'), - (0x10C8, 'X'), - (0x10CD, 'M', u'ⴭ'), - (0x10CE, 'X'), - (0x10D0, 'V'), - (0x10FC, 'M', u'ნ'), - (0x10FD, 'V'), - (0x115F, 'X'), - (0x1161, 'V'), - (0x1249, 'X'), - (0x124A, 'V'), - (0x124E, 'X'), - (0x1250, 'V'), - (0x1257, 'X'), - (0x1258, 'V'), - ] - -def _seg_14(): - return [ - (0x1259, 'X'), - (0x125A, 'V'), - (0x125E, 'X'), - (0x1260, 'V'), - (0x1289, 'X'), - (0x128A, 'V'), - (0x128E, 'X'), - (0x1290, 'V'), - (0x12B1, 'X'), - (0x12B2, 'V'), - (0x12B6, 'X'), - (0x12B8, 'V'), - (0x12BF, 'X'), - (0x12C0, 'V'), - (0x12C1, 'X'), - (0x12C2, 'V'), - (0x12C6, 'X'), - (0x12C8, 'V'), - (0x12D7, 'X'), - (0x12D8, 'V'), - (0x1311, 'X'), - (0x1312, 'V'), - (0x1316, 'X'), - (0x1318, 'V'), - (0x135B, 'X'), - (0x135D, 'V'), - (0x137D, 'X'), - (0x1380, 'V'), - (0x139A, 'X'), - (0x13A0, 'V'), - (0x13F5, 'X'), - (0x1400, 'V'), - (0x1680, 'X'), - (0x1681, 'V'), - (0x169D, 'X'), - (0x16A0, 'V'), - (0x16F1, 'X'), - (0x1700, 'V'), - (0x170D, 'X'), - (0x170E, 'V'), - (0x1715, 'X'), - (0x1720, 'V'), - (0x1737, 'X'), - (0x1740, 'V'), - (0x1754, 'X'), - (0x1760, 'V'), - (0x176D, 'X'), - (0x176E, 'V'), - (0x1771, 'X'), - (0x1772, 'V'), - (0x1774, 'X'), - (0x1780, 'V'), - (0x17B4, 'X'), - (0x17B6, 'V'), - (0x17DE, 'X'), - (0x17E0, 'V'), - (0x17EA, 'X'), - (0x17F0, 'V'), - (0x17FA, 'X'), - (0x1800, 'V'), - (0x1806, 'X'), - (0x1807, 'V'), - (0x180B, 'I'), - (0x180E, 'X'), - (0x1810, 'V'), - (0x181A, 'X'), - (0x1820, 'V'), - (0x1878, 'X'), - (0x1880, 'V'), - (0x18AB, 'X'), - (0x18B0, 'V'), - (0x18F6, 'X'), - (0x1900, 'V'), - (0x191D, 'X'), - (0x1920, 'V'), - (0x192C, 'X'), - (0x1930, 'V'), - (0x193C, 'X'), - (0x1940, 'V'), - (0x1941, 'X'), - (0x1944, 'V'), - (0x196E, 'X'), - (0x1970, 'V'), - (0x1975, 'X'), - (0x1980, 'V'), - (0x19AC, 'X'), - (0x19B0, 'V'), - (0x19CA, 'X'), - (0x19D0, 'V'), - (0x19DB, 'X'), - (0x19DE, 'V'), - (0x1A1C, 'X'), - (0x1A1E, 'V'), - (0x1A5F, 'X'), - (0x1A60, 'V'), - (0x1A7D, 'X'), - (0x1A7F, 'V'), - (0x1A8A, 'X'), - (0x1A90, 'V'), - (0x1A9A, 'X'), - ] - -def _seg_15(): - return [ - (0x1AA0, 'V'), - (0x1AAE, 'X'), - (0x1B00, 'V'), - (0x1B4C, 'X'), - (0x1B50, 'V'), - (0x1B7D, 'X'), - (0x1B80, 'V'), - (0x1BF4, 'X'), - (0x1BFC, 'V'), - (0x1C38, 'X'), - (0x1C3B, 'V'), - (0x1C4A, 'X'), - (0x1C4D, 'V'), - (0x1C80, 'X'), - (0x1CC0, 'V'), - (0x1CC8, 'X'), - (0x1CD0, 'V'), - (0x1CF7, 'X'), - (0x1D00, 'V'), - (0x1D2C, 'M', u'a'), - (0x1D2D, 'M', u'æ'), - (0x1D2E, 'M', u'b'), - (0x1D2F, 'V'), - (0x1D30, 'M', u'd'), - (0x1D31, 'M', u'e'), - (0x1D32, 'M', u'ǝ'), - (0x1D33, 'M', u'g'), - (0x1D34, 'M', u'h'), - (0x1D35, 'M', u'i'), - (0x1D36, 'M', u'j'), - (0x1D37, 'M', u'k'), - (0x1D38, 'M', u'l'), - (0x1D39, 'M', u'm'), - (0x1D3A, 'M', u'n'), - (0x1D3B, 'V'), - (0x1D3C, 'M', u'o'), - (0x1D3D, 'M', u'ȣ'), - (0x1D3E, 'M', u'p'), - (0x1D3F, 'M', u'r'), - (0x1D40, 'M', u't'), - (0x1D41, 'M', u'u'), - (0x1D42, 'M', u'w'), - (0x1D43, 'M', u'a'), - (0x1D44, 'M', u'ɐ'), - (0x1D45, 'M', u'ɑ'), - (0x1D46, 'M', u'ᴂ'), - (0x1D47, 'M', u'b'), - (0x1D48, 'M', u'd'), - (0x1D49, 'M', u'e'), - (0x1D4A, 'M', u'ə'), - (0x1D4B, 'M', u'ɛ'), - (0x1D4C, 'M', u'ɜ'), - (0x1D4D, 'M', u'g'), - (0x1D4E, 'V'), - (0x1D4F, 'M', u'k'), - (0x1D50, 'M', u'm'), - (0x1D51, 'M', u'ŋ'), - (0x1D52, 'M', u'o'), - (0x1D53, 'M', u'ɔ'), - (0x1D54, 'M', u'ᴖ'), - (0x1D55, 'M', u'ᴗ'), - (0x1D56, 'M', u'p'), - (0x1D57, 'M', u't'), - (0x1D58, 'M', u'u'), - (0x1D59, 'M', u'ᴝ'), - (0x1D5A, 'M', u'ɯ'), - (0x1D5B, 'M', u'v'), - (0x1D5C, 'M', u'ᴥ'), - (0x1D5D, 'M', u'β'), - (0x1D5E, 'M', u'γ'), - (0x1D5F, 'M', u'δ'), - (0x1D60, 'M', u'φ'), - (0x1D61, 'M', u'χ'), - (0x1D62, 'M', u'i'), - (0x1D63, 'M', u'r'), - (0x1D64, 'M', u'u'), - (0x1D65, 'M', u'v'), - (0x1D66, 'M', u'β'), - (0x1D67, 'M', u'γ'), - (0x1D68, 'M', u'ρ'), - (0x1D69, 'M', u'φ'), - (0x1D6A, 'M', u'χ'), - (0x1D6B, 'V'), - (0x1D78, 'M', u'н'), - (0x1D79, 'V'), - (0x1D9B, 'M', u'ɒ'), - (0x1D9C, 'M', u'c'), - (0x1D9D, 'M', u'ɕ'), - (0x1D9E, 'M', u'ð'), - (0x1D9F, 'M', u'ɜ'), - (0x1DA0, 'M', u'f'), - (0x1DA1, 'M', u'ɟ'), - (0x1DA2, 'M', u'ɡ'), - (0x1DA3, 'M', u'ɥ'), - (0x1DA4, 'M', u'ɨ'), - (0x1DA5, 'M', u'ɩ'), - (0x1DA6, 'M', u'ɪ'), - (0x1DA7, 'M', u'ᵻ'), - (0x1DA8, 'M', u'ʝ'), - (0x1DA9, 'M', u'ɭ'), - ] - -def _seg_16(): - return [ - (0x1DAA, 'M', u'ᶅ'), - (0x1DAB, 'M', u'ʟ'), - (0x1DAC, 'M', u'ɱ'), - (0x1DAD, 'M', u'ɰ'), - (0x1DAE, 'M', u'ɲ'), - (0x1DAF, 'M', u'ɳ'), - (0x1DB0, 'M', u'ɴ'), - (0x1DB1, 'M', u'ɵ'), - (0x1DB2, 'M', u'ɸ'), - (0x1DB3, 'M', u'ʂ'), - (0x1DB4, 'M', u'ʃ'), - (0x1DB5, 'M', u'ƫ'), - (0x1DB6, 'M', u'ʉ'), - (0x1DB7, 'M', u'ʊ'), - (0x1DB8, 'M', u'ᴜ'), - (0x1DB9, 'M', u'ʋ'), - (0x1DBA, 'M', u'ʌ'), - (0x1DBB, 'M', u'z'), - (0x1DBC, 'M', u'ʐ'), - (0x1DBD, 'M', u'ʑ'), - (0x1DBE, 'M', u'ʒ'), - (0x1DBF, 'M', u'θ'), - (0x1DC0, 'V'), - (0x1DE7, 'X'), - (0x1DFC, 'V'), - (0x1E00, 'M', u'ḁ'), - (0x1E01, 'V'), - (0x1E02, 'M', u'ḃ'), - (0x1E03, 'V'), - (0x1E04, 'M', u'ḅ'), - (0x1E05, 'V'), - (0x1E06, 'M', u'ḇ'), - (0x1E07, 'V'), - (0x1E08, 'M', u'ḉ'), - (0x1E09, 'V'), - (0x1E0A, 'M', u'ḋ'), - (0x1E0B, 'V'), - (0x1E0C, 'M', u'ḍ'), - (0x1E0D, 'V'), - (0x1E0E, 'M', u'ḏ'), - (0x1E0F, 'V'), - (0x1E10, 'M', u'ḑ'), - (0x1E11, 'V'), - (0x1E12, 'M', u'ḓ'), - (0x1E13, 'V'), - (0x1E14, 'M', u'ḕ'), - (0x1E15, 'V'), - (0x1E16, 'M', u'ḗ'), - (0x1E17, 'V'), - (0x1E18, 'M', u'ḙ'), - (0x1E19, 'V'), - (0x1E1A, 'M', u'ḛ'), - (0x1E1B, 'V'), - (0x1E1C, 'M', u'ḝ'), - (0x1E1D, 'V'), - (0x1E1E, 'M', u'ḟ'), - (0x1E1F, 'V'), - (0x1E20, 'M', u'ḡ'), - (0x1E21, 'V'), - (0x1E22, 'M', u'ḣ'), - (0x1E23, 'V'), - (0x1E24, 'M', u'ḥ'), - (0x1E25, 'V'), - (0x1E26, 'M', u'ḧ'), - (0x1E27, 'V'), - (0x1E28, 'M', u'ḩ'), - (0x1E29, 'V'), - (0x1E2A, 'M', u'ḫ'), - (0x1E2B, 'V'), - (0x1E2C, 'M', u'ḭ'), - (0x1E2D, 'V'), - (0x1E2E, 'M', u'ḯ'), - (0x1E2F, 'V'), - (0x1E30, 'M', u'ḱ'), - (0x1E31, 'V'), - (0x1E32, 'M', u'ḳ'), - (0x1E33, 'V'), - (0x1E34, 'M', u'ḵ'), - (0x1E35, 'V'), - (0x1E36, 'M', u'ḷ'), - (0x1E37, 'V'), - (0x1E38, 'M', u'ḹ'), - (0x1E39, 'V'), - (0x1E3A, 'M', u'ḻ'), - (0x1E3B, 'V'), - (0x1E3C, 'M', u'ḽ'), - (0x1E3D, 'V'), - (0x1E3E, 'M', u'ḿ'), - (0x1E3F, 'V'), - (0x1E40, 'M', u'ṁ'), - (0x1E41, 'V'), - (0x1E42, 'M', u'ṃ'), - (0x1E43, 'V'), - (0x1E44, 'M', u'ṅ'), - (0x1E45, 'V'), - (0x1E46, 'M', u'ṇ'), - (0x1E47, 'V'), - (0x1E48, 'M', u'ṉ'), - (0x1E49, 'V'), - (0x1E4A, 'M', u'ṋ'), - ] - -def _seg_17(): - return [ - (0x1E4B, 'V'), - (0x1E4C, 'M', u'ṍ'), - (0x1E4D, 'V'), - (0x1E4E, 'M', u'ṏ'), - (0x1E4F, 'V'), - (0x1E50, 'M', u'ṑ'), - (0x1E51, 'V'), - (0x1E52, 'M', u'ṓ'), - (0x1E53, 'V'), - (0x1E54, 'M', u'ṕ'), - (0x1E55, 'V'), - (0x1E56, 'M', u'ṗ'), - (0x1E57, 'V'), - (0x1E58, 'M', u'ṙ'), - (0x1E59, 'V'), - (0x1E5A, 'M', u'ṛ'), - (0x1E5B, 'V'), - (0x1E5C, 'M', u'ṝ'), - (0x1E5D, 'V'), - (0x1E5E, 'M', u'ṟ'), - (0x1E5F, 'V'), - (0x1E60, 'M', u'ṡ'), - (0x1E61, 'V'), - (0x1E62, 'M', u'ṣ'), - (0x1E63, 'V'), - (0x1E64, 'M', u'ṥ'), - (0x1E65, 'V'), - (0x1E66, 'M', u'ṧ'), - (0x1E67, 'V'), - (0x1E68, 'M', u'ṩ'), - (0x1E69, 'V'), - (0x1E6A, 'M', u'ṫ'), - (0x1E6B, 'V'), - (0x1E6C, 'M', u'ṭ'), - (0x1E6D, 'V'), - (0x1E6E, 'M', u'ṯ'), - (0x1E6F, 'V'), - (0x1E70, 'M', u'ṱ'), - (0x1E71, 'V'), - (0x1E72, 'M', u'ṳ'), - (0x1E73, 'V'), - (0x1E74, 'M', u'ṵ'), - (0x1E75, 'V'), - (0x1E76, 'M', u'ṷ'), - (0x1E77, 'V'), - (0x1E78, 'M', u'ṹ'), - (0x1E79, 'V'), - (0x1E7A, 'M', u'ṻ'), - (0x1E7B, 'V'), - (0x1E7C, 'M', u'ṽ'), - (0x1E7D, 'V'), - (0x1E7E, 'M', u'ṿ'), - (0x1E7F, 'V'), - (0x1E80, 'M', u'ẁ'), - (0x1E81, 'V'), - (0x1E82, 'M', u'ẃ'), - (0x1E83, 'V'), - (0x1E84, 'M', u'ẅ'), - (0x1E85, 'V'), - (0x1E86, 'M', u'ẇ'), - (0x1E87, 'V'), - (0x1E88, 'M', u'ẉ'), - (0x1E89, 'V'), - (0x1E8A, 'M', u'ẋ'), - (0x1E8B, 'V'), - (0x1E8C, 'M', u'ẍ'), - (0x1E8D, 'V'), - (0x1E8E, 'M', u'ẏ'), - (0x1E8F, 'V'), - (0x1E90, 'M', u'ẑ'), - (0x1E91, 'V'), - (0x1E92, 'M', u'ẓ'), - (0x1E93, 'V'), - (0x1E94, 'M', u'ẕ'), - (0x1E95, 'V'), - (0x1E9A, 'M', u'aʾ'), - (0x1E9B, 'M', u'ṡ'), - (0x1E9C, 'V'), - (0x1E9E, 'M', u'ss'), - (0x1E9F, 'V'), - (0x1EA0, 'M', u'ạ'), - (0x1EA1, 'V'), - (0x1EA2, 'M', u'ả'), - (0x1EA3, 'V'), - (0x1EA4, 'M', u'ấ'), - (0x1EA5, 'V'), - (0x1EA6, 'M', u'ầ'), - (0x1EA7, 'V'), - (0x1EA8, 'M', u'ẩ'), - (0x1EA9, 'V'), - (0x1EAA, 'M', u'ẫ'), - (0x1EAB, 'V'), - (0x1EAC, 'M', u'ậ'), - (0x1EAD, 'V'), - (0x1EAE, 'M', u'ắ'), - (0x1EAF, 'V'), - (0x1EB0, 'M', u'ằ'), - (0x1EB1, 'V'), - (0x1EB2, 'M', u'ẳ'), - (0x1EB3, 'V'), - ] - -def _seg_18(): - return [ - (0x1EB4, 'M', u'ẵ'), - (0x1EB5, 'V'), - (0x1EB6, 'M', u'ặ'), - (0x1EB7, 'V'), - (0x1EB8, 'M', u'ẹ'), - (0x1EB9, 'V'), - (0x1EBA, 'M', u'ẻ'), - (0x1EBB, 'V'), - (0x1EBC, 'M', u'ẽ'), - (0x1EBD, 'V'), - (0x1EBE, 'M', u'ế'), - (0x1EBF, 'V'), - (0x1EC0, 'M', u'ề'), - (0x1EC1, 'V'), - (0x1EC2, 'M', u'ể'), - (0x1EC3, 'V'), - (0x1EC4, 'M', u'ễ'), - (0x1EC5, 'V'), - (0x1EC6, 'M', u'ệ'), - (0x1EC7, 'V'), - (0x1EC8, 'M', u'ỉ'), - (0x1EC9, 'V'), - (0x1ECA, 'M', u'ị'), - (0x1ECB, 'V'), - (0x1ECC, 'M', u'ọ'), - (0x1ECD, 'V'), - (0x1ECE, 'M', u'ỏ'), - (0x1ECF, 'V'), - (0x1ED0, 'M', u'ố'), - (0x1ED1, 'V'), - (0x1ED2, 'M', u'ồ'), - (0x1ED3, 'V'), - (0x1ED4, 'M', u'ổ'), - (0x1ED5, 'V'), - (0x1ED6, 'M', u'ỗ'), - (0x1ED7, 'V'), - (0x1ED8, 'M', u'ộ'), - (0x1ED9, 'V'), - (0x1EDA, 'M', u'ớ'), - (0x1EDB, 'V'), - (0x1EDC, 'M', u'ờ'), - (0x1EDD, 'V'), - (0x1EDE, 'M', u'ở'), - (0x1EDF, 'V'), - (0x1EE0, 'M', u'ỡ'), - (0x1EE1, 'V'), - (0x1EE2, 'M', u'ợ'), - (0x1EE3, 'V'), - (0x1EE4, 'M', u'ụ'), - (0x1EE5, 'V'), - (0x1EE6, 'M', u'ủ'), - (0x1EE7, 'V'), - (0x1EE8, 'M', u'ứ'), - (0x1EE9, 'V'), - (0x1EEA, 'M', u'ừ'), - (0x1EEB, 'V'), - (0x1EEC, 'M', u'ử'), - (0x1EED, 'V'), - (0x1EEE, 'M', u'ữ'), - (0x1EEF, 'V'), - (0x1EF0, 'M', u'ự'), - (0x1EF1, 'V'), - (0x1EF2, 'M', u'ỳ'), - (0x1EF3, 'V'), - (0x1EF4, 'M', u'ỵ'), - (0x1EF5, 'V'), - (0x1EF6, 'M', u'ỷ'), - (0x1EF7, 'V'), - (0x1EF8, 'M', u'ỹ'), - (0x1EF9, 'V'), - (0x1EFA, 'M', u'ỻ'), - (0x1EFB, 'V'), - (0x1EFC, 'M', u'ỽ'), - (0x1EFD, 'V'), - (0x1EFE, 'M', u'ỿ'), - (0x1EFF, 'V'), - (0x1F08, 'M', u'ἀ'), - (0x1F09, 'M', u'ἁ'), - (0x1F0A, 'M', u'ἂ'), - (0x1F0B, 'M', u'ἃ'), - (0x1F0C, 'M', u'ἄ'), - (0x1F0D, 'M', u'ἅ'), - (0x1F0E, 'M', u'ἆ'), - (0x1F0F, 'M', u'ἇ'), - (0x1F10, 'V'), - (0x1F16, 'X'), - (0x1F18, 'M', u'ἐ'), - (0x1F19, 'M', u'ἑ'), - (0x1F1A, 'M', u'ἒ'), - (0x1F1B, 'M', u'ἓ'), - (0x1F1C, 'M', u'ἔ'), - (0x1F1D, 'M', u'ἕ'), - (0x1F1E, 'X'), - (0x1F20, 'V'), - (0x1F28, 'M', u'ἠ'), - (0x1F29, 'M', u'ἡ'), - (0x1F2A, 'M', u'ἢ'), - (0x1F2B, 'M', u'ἣ'), - (0x1F2C, 'M', u'ἤ'), - (0x1F2D, 'M', u'ἥ'), - ] - -def _seg_19(): - return [ - (0x1F2E, 'M', u'ἦ'), - (0x1F2F, 'M', u'ἧ'), - (0x1F30, 'V'), - (0x1F38, 'M', u'ἰ'), - (0x1F39, 'M', u'ἱ'), - (0x1F3A, 'M', u'ἲ'), - (0x1F3B, 'M', u'ἳ'), - (0x1F3C, 'M', u'ἴ'), - (0x1F3D, 'M', u'ἵ'), - (0x1F3E, 'M', u'ἶ'), - (0x1F3F, 'M', u'ἷ'), - (0x1F40, 'V'), - (0x1F46, 'X'), - (0x1F48, 'M', u'ὀ'), - (0x1F49, 'M', u'ὁ'), - (0x1F4A, 'M', u'ὂ'), - (0x1F4B, 'M', u'ὃ'), - (0x1F4C, 'M', u'ὄ'), - (0x1F4D, 'M', u'ὅ'), - (0x1F4E, 'X'), - (0x1F50, 'V'), - (0x1F58, 'X'), - (0x1F59, 'M', u'ὑ'), - (0x1F5A, 'X'), - (0x1F5B, 'M', u'ὓ'), - (0x1F5C, 'X'), - (0x1F5D, 'M', u'ὕ'), - (0x1F5E, 'X'), - (0x1F5F, 'M', u'ὗ'), - (0x1F60, 'V'), - (0x1F68, 'M', u'ὠ'), - (0x1F69, 'M', u'ὡ'), - (0x1F6A, 'M', u'ὢ'), - (0x1F6B, 'M', u'ὣ'), - (0x1F6C, 'M', u'ὤ'), - (0x1F6D, 'M', u'ὥ'), - (0x1F6E, 'M', u'ὦ'), - (0x1F6F, 'M', u'ὧ'), - (0x1F70, 'V'), - (0x1F71, 'M', u'ά'), - (0x1F72, 'V'), - (0x1F73, 'M', u'έ'), - (0x1F74, 'V'), - (0x1F75, 'M', u'ή'), - (0x1F76, 'V'), - (0x1F77, 'M', u'ί'), - (0x1F78, 'V'), - (0x1F79, 'M', u'ό'), - (0x1F7A, 'V'), - (0x1F7B, 'M', u'ύ'), - (0x1F7C, 'V'), - (0x1F7D, 'M', u'ώ'), - (0x1F7E, 'X'), - (0x1F80, 'M', u'ἀι'), - (0x1F81, 'M', u'ἁι'), - (0x1F82, 'M', u'ἂι'), - (0x1F83, 'M', u'ἃι'), - (0x1F84, 'M', u'ἄι'), - (0x1F85, 'M', u'ἅι'), - (0x1F86, 'M', u'ἆι'), - (0x1F87, 'M', u'ἇι'), - (0x1F88, 'M', u'ἀι'), - (0x1F89, 'M', u'ἁι'), - (0x1F8A, 'M', u'ἂι'), - (0x1F8B, 'M', u'ἃι'), - (0x1F8C, 'M', u'ἄι'), - (0x1F8D, 'M', u'ἅι'), - (0x1F8E, 'M', u'ἆι'), - (0x1F8F, 'M', u'ἇι'), - (0x1F90, 'M', u'ἠι'), - (0x1F91, 'M', u'ἡι'), - (0x1F92, 'M', u'ἢι'), - (0x1F93, 'M', u'ἣι'), - (0x1F94, 'M', u'ἤι'), - (0x1F95, 'M', u'ἥι'), - (0x1F96, 'M', u'ἦι'), - (0x1F97, 'M', u'ἧι'), - (0x1F98, 'M', u'ἠι'), - (0x1F99, 'M', u'ἡι'), - (0x1F9A, 'M', u'ἢι'), - (0x1F9B, 'M', u'ἣι'), - (0x1F9C, 'M', u'ἤι'), - (0x1F9D, 'M', u'ἥι'), - (0x1F9E, 'M', u'ἦι'), - (0x1F9F, 'M', u'ἧι'), - (0x1FA0, 'M', u'ὠι'), - (0x1FA1, 'M', u'ὡι'), - (0x1FA2, 'M', u'ὢι'), - (0x1FA3, 'M', u'ὣι'), - (0x1FA4, 'M', u'ὤι'), - (0x1FA5, 'M', u'ὥι'), - (0x1FA6, 'M', u'ὦι'), - (0x1FA7, 'M', u'ὧι'), - (0x1FA8, 'M', u'ὠι'), - (0x1FA9, 'M', u'ὡι'), - (0x1FAA, 'M', u'ὢι'), - (0x1FAB, 'M', u'ὣι'), - (0x1FAC, 'M', u'ὤι'), - (0x1FAD, 'M', u'ὥι'), - (0x1FAE, 'M', u'ὦι'), - ] - -def _seg_20(): - return [ - (0x1FAF, 'M', u'ὧι'), - (0x1FB0, 'V'), - (0x1FB2, 'M', u'ὰι'), - (0x1FB3, 'M', u'αι'), - (0x1FB4, 'M', u'άι'), - (0x1FB5, 'X'), - (0x1FB6, 'V'), - (0x1FB7, 'M', u'ᾶι'), - (0x1FB8, 'M', u'ᾰ'), - (0x1FB9, 'M', u'ᾱ'), - (0x1FBA, 'M', u'ὰ'), - (0x1FBB, 'M', u'ά'), - (0x1FBC, 'M', u'αι'), - (0x1FBD, '3', u' ̓'), - (0x1FBE, 'M', u'ι'), - (0x1FBF, '3', u' ̓'), - (0x1FC0, '3', u' ͂'), - (0x1FC1, '3', u' ̈͂'), - (0x1FC2, 'M', u'ὴι'), - (0x1FC3, 'M', u'ηι'), - (0x1FC4, 'M', u'ήι'), - (0x1FC5, 'X'), - (0x1FC6, 'V'), - (0x1FC7, 'M', u'ῆι'), - (0x1FC8, 'M', u'ὲ'), - (0x1FC9, 'M', u'έ'), - (0x1FCA, 'M', u'ὴ'), - (0x1FCB, 'M', u'ή'), - (0x1FCC, 'M', u'ηι'), - (0x1FCD, '3', u' ̓̀'), - (0x1FCE, '3', u' ̓́'), - (0x1FCF, '3', u' ̓͂'), - (0x1FD0, 'V'), - (0x1FD3, 'M', u'ΐ'), - (0x1FD4, 'X'), - (0x1FD6, 'V'), - (0x1FD8, 'M', u'ῐ'), - (0x1FD9, 'M', u'ῑ'), - (0x1FDA, 'M', u'ὶ'), - (0x1FDB, 'M', u'ί'), - (0x1FDC, 'X'), - (0x1FDD, '3', u' ̔̀'), - (0x1FDE, '3', u' ̔́'), - (0x1FDF, '3', u' ̔͂'), - (0x1FE0, 'V'), - (0x1FE3, 'M', u'ΰ'), - (0x1FE4, 'V'), - (0x1FE8, 'M', u'ῠ'), - (0x1FE9, 'M', u'ῡ'), - (0x1FEA, 'M', u'ὺ'), - (0x1FEB, 'M', u'ύ'), - (0x1FEC, 'M', u'ῥ'), - (0x1FED, '3', u' ̈̀'), - (0x1FEE, '3', u' ̈́'), - (0x1FEF, '3', u'`'), - (0x1FF0, 'X'), - (0x1FF2, 'M', u'ὼι'), - (0x1FF3, 'M', u'ωι'), - (0x1FF4, 'M', u'ώι'), - (0x1FF5, 'X'), - (0x1FF6, 'V'), - (0x1FF7, 'M', u'ῶι'), - (0x1FF8, 'M', u'ὸ'), - (0x1FF9, 'M', u'ό'), - (0x1FFA, 'M', u'ὼ'), - (0x1FFB, 'M', u'ώ'), - (0x1FFC, 'M', u'ωι'), - (0x1FFD, '3', u' ́'), - (0x1FFE, '3', u' ̔'), - (0x1FFF, 'X'), - (0x2000, '3', u' '), - (0x200B, 'I'), - (0x200C, 'D', u''), - (0x200E, 'X'), - (0x2010, 'V'), - (0x2011, 'M', u'‐'), - (0x2012, 'V'), - (0x2017, '3', u' ̳'), - (0x2018, 'V'), - (0x2024, 'X'), - (0x2027, 'V'), - (0x2028, 'X'), - (0x202F, '3', u' '), - (0x2030, 'V'), - (0x2033, 'M', u'′′'), - (0x2034, 'M', u'′′′'), - (0x2035, 'V'), - (0x2036, 'M', u'‵‵'), - (0x2037, 'M', u'‵‵‵'), - (0x2038, 'V'), - (0x203C, '3', u'!!'), - (0x203D, 'V'), - (0x203E, '3', u' ̅'), - (0x203F, 'V'), - (0x2047, '3', u'??'), - (0x2048, '3', u'?!'), - (0x2049, '3', u'!?'), - (0x204A, 'V'), - (0x2057, 'M', u'′′′′'), - (0x2058, 'V'), - ] - -def _seg_21(): - return [ - (0x205F, '3', u' '), - (0x2060, 'I'), - (0x2061, 'X'), - (0x2064, 'I'), - (0x2065, 'X'), - (0x2070, 'M', u'0'), - (0x2071, 'M', u'i'), - (0x2072, 'X'), - (0x2074, 'M', u'4'), - (0x2075, 'M', u'5'), - (0x2076, 'M', u'6'), - (0x2077, 'M', u'7'), - (0x2078, 'M', u'8'), - (0x2079, 'M', u'9'), - (0x207A, '3', u'+'), - (0x207B, 'M', u'−'), - (0x207C, '3', u'='), - (0x207D, '3', u'('), - (0x207E, '3', u')'), - (0x207F, 'M', u'n'), - (0x2080, 'M', u'0'), - (0x2081, 'M', u'1'), - (0x2082, 'M', u'2'), - (0x2083, 'M', u'3'), - (0x2084, 'M', u'4'), - (0x2085, 'M', u'5'), - (0x2086, 'M', u'6'), - (0x2087, 'M', u'7'), - (0x2088, 'M', u'8'), - (0x2089, 'M', u'9'), - (0x208A, '3', u'+'), - (0x208B, 'M', u'−'), - (0x208C, '3', u'='), - (0x208D, '3', u'('), - (0x208E, '3', u')'), - (0x208F, 'X'), - (0x2090, 'M', u'a'), - (0x2091, 'M', u'e'), - (0x2092, 'M', u'o'), - (0x2093, 'M', u'x'), - (0x2094, 'M', u'ə'), - (0x2095, 'M', u'h'), - (0x2096, 'M', u'k'), - (0x2097, 'M', u'l'), - (0x2098, 'M', u'm'), - (0x2099, 'M', u'n'), - (0x209A, 'M', u'p'), - (0x209B, 'M', u's'), - (0x209C, 'M', u't'), - (0x209D, 'X'), - (0x20A0, 'V'), - (0x20A8, 'M', u'rs'), - (0x20A9, 'V'), - (0x20BB, 'X'), - (0x20D0, 'V'), - (0x20F1, 'X'), - (0x2100, '3', u'a/c'), - (0x2101, '3', u'a/s'), - (0x2102, 'M', u'c'), - (0x2103, 'M', u'°c'), - (0x2104, 'V'), - (0x2105, '3', u'c/o'), - (0x2106, '3', u'c/u'), - (0x2107, 'M', u'ɛ'), - (0x2108, 'V'), - (0x2109, 'M', u'°f'), - (0x210A, 'M', u'g'), - (0x210B, 'M', u'h'), - (0x210F, 'M', u'ħ'), - (0x2110, 'M', u'i'), - (0x2112, 'M', u'l'), - (0x2114, 'V'), - (0x2115, 'M', u'n'), - (0x2116, 'M', u'no'), - (0x2117, 'V'), - (0x2119, 'M', u'p'), - (0x211A, 'M', u'q'), - (0x211B, 'M', u'r'), - (0x211E, 'V'), - (0x2120, 'M', u'sm'), - (0x2121, 'M', u'tel'), - (0x2122, 'M', u'tm'), - (0x2123, 'V'), - (0x2124, 'M', u'z'), - (0x2125, 'V'), - (0x2126, 'M', u'ω'), - (0x2127, 'V'), - (0x2128, 'M', u'z'), - (0x2129, 'V'), - (0x212A, 'M', u'k'), - (0x212B, 'M', u'å'), - (0x212C, 'M', u'b'), - (0x212D, 'M', u'c'), - (0x212E, 'V'), - (0x212F, 'M', u'e'), - (0x2131, 'M', u'f'), - (0x2132, 'X'), - (0x2133, 'M', u'm'), - (0x2134, 'M', u'o'), - (0x2135, 'M', u'א'), - ] - -def _seg_22(): - return [ - (0x2136, 'M', u'ב'), - (0x2137, 'M', u'ג'), - (0x2138, 'M', u'ד'), - (0x2139, 'M', u'i'), - (0x213A, 'V'), - (0x213B, 'M', u'fax'), - (0x213C, 'M', u'π'), - (0x213D, 'M', u'γ'), - (0x213F, 'M', u'π'), - (0x2140, 'M', u'∑'), - (0x2141, 'V'), - (0x2145, 'M', u'd'), - (0x2147, 'M', u'e'), - (0x2148, 'M', u'i'), - (0x2149, 'M', u'j'), - (0x214A, 'V'), - (0x2150, 'M', u'1⁄7'), - (0x2151, 'M', u'1⁄9'), - (0x2152, 'M', u'1⁄10'), - (0x2153, 'M', u'1⁄3'), - (0x2154, 'M', u'2⁄3'), - (0x2155, 'M', u'1⁄5'), - (0x2156, 'M', u'2⁄5'), - (0x2157, 'M', u'3⁄5'), - (0x2158, 'M', u'4⁄5'), - (0x2159, 'M', u'1⁄6'), - (0x215A, 'M', u'5⁄6'), - (0x215B, 'M', u'1⁄8'), - (0x215C, 'M', u'3⁄8'), - (0x215D, 'M', u'5⁄8'), - (0x215E, 'M', u'7⁄8'), - (0x215F, 'M', u'1⁄'), - (0x2160, 'M', u'i'), - (0x2161, 'M', u'ii'), - (0x2162, 'M', u'iii'), - (0x2163, 'M', u'iv'), - (0x2164, 'M', u'v'), - (0x2165, 'M', u'vi'), - (0x2166, 'M', u'vii'), - (0x2167, 'M', u'viii'), - (0x2168, 'M', u'ix'), - (0x2169, 'M', u'x'), - (0x216A, 'M', u'xi'), - (0x216B, 'M', u'xii'), - (0x216C, 'M', u'l'), - (0x216D, 'M', u'c'), - (0x216E, 'M', u'd'), - (0x216F, 'M', u'm'), - (0x2170, 'M', u'i'), - (0x2171, 'M', u'ii'), - (0x2172, 'M', u'iii'), - (0x2173, 'M', u'iv'), - (0x2174, 'M', u'v'), - (0x2175, 'M', u'vi'), - (0x2176, 'M', u'vii'), - (0x2177, 'M', u'viii'), - (0x2178, 'M', u'ix'), - (0x2179, 'M', u'x'), - (0x217A, 'M', u'xi'), - (0x217B, 'M', u'xii'), - (0x217C, 'M', u'l'), - (0x217D, 'M', u'c'), - (0x217E, 'M', u'd'), - (0x217F, 'M', u'm'), - (0x2180, 'V'), - (0x2183, 'X'), - (0x2184, 'V'), - (0x2189, 'M', u'0⁄3'), - (0x218A, 'X'), - (0x2190, 'V'), - (0x222C, 'M', u'∫∫'), - (0x222D, 'M', u'∫∫∫'), - (0x222E, 'V'), - (0x222F, 'M', u'∮∮'), - (0x2230, 'M', u'∮∮∮'), - (0x2231, 'V'), - (0x2260, '3'), - (0x2261, 'V'), - (0x226E, '3'), - (0x2270, 'V'), - (0x2329, 'M', u'〈'), - (0x232A, 'M', u'〉'), - (0x232B, 'V'), - (0x23F4, 'X'), - (0x2400, 'V'), - (0x2427, 'X'), - (0x2440, 'V'), - (0x244B, 'X'), - (0x2460, 'M', u'1'), - (0x2461, 'M', u'2'), - (0x2462, 'M', u'3'), - (0x2463, 'M', u'4'), - (0x2464, 'M', u'5'), - (0x2465, 'M', u'6'), - (0x2466, 'M', u'7'), - (0x2467, 'M', u'8'), - (0x2468, 'M', u'9'), - (0x2469, 'M', u'10'), - (0x246A, 'M', u'11'), - (0x246B, 'M', u'12'), - ] - -def _seg_23(): - return [ - (0x246C, 'M', u'13'), - (0x246D, 'M', u'14'), - (0x246E, 'M', u'15'), - (0x246F, 'M', u'16'), - (0x2470, 'M', u'17'), - (0x2471, 'M', u'18'), - (0x2472, 'M', u'19'), - (0x2473, 'M', u'20'), - (0x2474, '3', u'(1)'), - (0x2475, '3', u'(2)'), - (0x2476, '3', u'(3)'), - (0x2477, '3', u'(4)'), - (0x2478, '3', u'(5)'), - (0x2479, '3', u'(6)'), - (0x247A, '3', u'(7)'), - (0x247B, '3', u'(8)'), - (0x247C, '3', u'(9)'), - (0x247D, '3', u'(10)'), - (0x247E, '3', u'(11)'), - (0x247F, '3', u'(12)'), - (0x2480, '3', u'(13)'), - (0x2481, '3', u'(14)'), - (0x2482, '3', u'(15)'), - (0x2483, '3', u'(16)'), - (0x2484, '3', u'(17)'), - (0x2485, '3', u'(18)'), - (0x2486, '3', u'(19)'), - (0x2487, '3', u'(20)'), - (0x2488, 'X'), - (0x249C, '3', u'(a)'), - (0x249D, '3', u'(b)'), - (0x249E, '3', u'(c)'), - (0x249F, '3', u'(d)'), - (0x24A0, '3', u'(e)'), - (0x24A1, '3', u'(f)'), - (0x24A2, '3', u'(g)'), - (0x24A3, '3', u'(h)'), - (0x24A4, '3', u'(i)'), - (0x24A5, '3', u'(j)'), - (0x24A6, '3', u'(k)'), - (0x24A7, '3', u'(l)'), - (0x24A8, '3', u'(m)'), - (0x24A9, '3', u'(n)'), - (0x24AA, '3', u'(o)'), - (0x24AB, '3', u'(p)'), - (0x24AC, '3', u'(q)'), - (0x24AD, '3', u'(r)'), - (0x24AE, '3', u'(s)'), - (0x24AF, '3', u'(t)'), - (0x24B0, '3', u'(u)'), - (0x24B1, '3', u'(v)'), - (0x24B2, '3', u'(w)'), - (0x24B3, '3', u'(x)'), - (0x24B4, '3', u'(y)'), - (0x24B5, '3', u'(z)'), - (0x24B6, 'M', u'a'), - (0x24B7, 'M', u'b'), - (0x24B8, 'M', u'c'), - (0x24B9, 'M', u'd'), - (0x24BA, 'M', u'e'), - (0x24BB, 'M', u'f'), - (0x24BC, 'M', u'g'), - (0x24BD, 'M', u'h'), - (0x24BE, 'M', u'i'), - (0x24BF, 'M', u'j'), - (0x24C0, 'M', u'k'), - (0x24C1, 'M', u'l'), - (0x24C2, 'M', u'm'), - (0x24C3, 'M', u'n'), - (0x24C4, 'M', u'o'), - (0x24C5, 'M', u'p'), - (0x24C6, 'M', u'q'), - (0x24C7, 'M', u'r'), - (0x24C8, 'M', u's'), - (0x24C9, 'M', u't'), - (0x24CA, 'M', u'u'), - (0x24CB, 'M', u'v'), - (0x24CC, 'M', u'w'), - (0x24CD, 'M', u'x'), - (0x24CE, 'M', u'y'), - (0x24CF, 'M', u'z'), - (0x24D0, 'M', u'a'), - (0x24D1, 'M', u'b'), - (0x24D2, 'M', u'c'), - (0x24D3, 'M', u'd'), - (0x24D4, 'M', u'e'), - (0x24D5, 'M', u'f'), - (0x24D6, 'M', u'g'), - (0x24D7, 'M', u'h'), - (0x24D8, 'M', u'i'), - (0x24D9, 'M', u'j'), - (0x24DA, 'M', u'k'), - (0x24DB, 'M', u'l'), - (0x24DC, 'M', u'm'), - (0x24DD, 'M', u'n'), - (0x24DE, 'M', u'o'), - (0x24DF, 'M', u'p'), - (0x24E0, 'M', u'q'), - (0x24E1, 'M', u'r'), - (0x24E2, 'M', u's'), - ] - -def _seg_24(): - return [ - (0x24E3, 'M', u't'), - (0x24E4, 'M', u'u'), - (0x24E5, 'M', u'v'), - (0x24E6, 'M', u'w'), - (0x24E7, 'M', u'x'), - (0x24E8, 'M', u'y'), - (0x24E9, 'M', u'z'), - (0x24EA, 'M', u'0'), - (0x24EB, 'V'), - (0x2700, 'X'), - (0x2701, 'V'), - (0x2A0C, 'M', u'∫∫∫∫'), - (0x2A0D, 'V'), - (0x2A74, '3', u'::='), - (0x2A75, '3', u'=='), - (0x2A76, '3', u'==='), - (0x2A77, 'V'), - (0x2ADC, 'M', u'⫝̸'), - (0x2ADD, 'V'), - (0x2B4D, 'X'), - (0x2B50, 'V'), - (0x2B5A, 'X'), - (0x2C00, 'M', u'ⰰ'), - (0x2C01, 'M', u'ⰱ'), - (0x2C02, 'M', u'ⰲ'), - (0x2C03, 'M', u'ⰳ'), - (0x2C04, 'M', u'ⰴ'), - (0x2C05, 'M', u'ⰵ'), - (0x2C06, 'M', u'ⰶ'), - (0x2C07, 'M', u'ⰷ'), - (0x2C08, 'M', u'ⰸ'), - (0x2C09, 'M', u'ⰹ'), - (0x2C0A, 'M', u'ⰺ'), - (0x2C0B, 'M', u'ⰻ'), - (0x2C0C, 'M', u'ⰼ'), - (0x2C0D, 'M', u'ⰽ'), - (0x2C0E, 'M', u'ⰾ'), - (0x2C0F, 'M', u'ⰿ'), - (0x2C10, 'M', u'ⱀ'), - (0x2C11, 'M', u'ⱁ'), - (0x2C12, 'M', u'ⱂ'), - (0x2C13, 'M', u'ⱃ'), - (0x2C14, 'M', u'ⱄ'), - (0x2C15, 'M', u'ⱅ'), - (0x2C16, 'M', u'ⱆ'), - (0x2C17, 'M', u'ⱇ'), - (0x2C18, 'M', u'ⱈ'), - (0x2C19, 'M', u'ⱉ'), - (0x2C1A, 'M', u'ⱊ'), - (0x2C1B, 'M', u'ⱋ'), - (0x2C1C, 'M', u'ⱌ'), - (0x2C1D, 'M', u'ⱍ'), - (0x2C1E, 'M', u'ⱎ'), - (0x2C1F, 'M', u'ⱏ'), - (0x2C20, 'M', u'ⱐ'), - (0x2C21, 'M', u'ⱑ'), - (0x2C22, 'M', u'ⱒ'), - (0x2C23, 'M', u'ⱓ'), - (0x2C24, 'M', u'ⱔ'), - (0x2C25, 'M', u'ⱕ'), - (0x2C26, 'M', u'ⱖ'), - (0x2C27, 'M', u'ⱗ'), - (0x2C28, 'M', u'ⱘ'), - (0x2C29, 'M', u'ⱙ'), - (0x2C2A, 'M', u'ⱚ'), - (0x2C2B, 'M', u'ⱛ'), - (0x2C2C, 'M', u'ⱜ'), - (0x2C2D, 'M', u'ⱝ'), - (0x2C2E, 'M', u'ⱞ'), - (0x2C2F, 'X'), - (0x2C30, 'V'), - (0x2C5F, 'X'), - (0x2C60, 'M', u'ⱡ'), - (0x2C61, 'V'), - (0x2C62, 'M', u'ɫ'), - (0x2C63, 'M', u'ᵽ'), - (0x2C64, 'M', u'ɽ'), - (0x2C65, 'V'), - (0x2C67, 'M', u'ⱨ'), - (0x2C68, 'V'), - (0x2C69, 'M', u'ⱪ'), - (0x2C6A, 'V'), - (0x2C6B, 'M', u'ⱬ'), - (0x2C6C, 'V'), - (0x2C6D, 'M', u'ɑ'), - (0x2C6E, 'M', u'ɱ'), - (0x2C6F, 'M', u'ɐ'), - (0x2C70, 'M', u'ɒ'), - (0x2C71, 'V'), - (0x2C72, 'M', u'ⱳ'), - (0x2C73, 'V'), - (0x2C75, 'M', u'ⱶ'), - (0x2C76, 'V'), - (0x2C7C, 'M', u'j'), - (0x2C7D, 'M', u'v'), - (0x2C7E, 'M', u'ȿ'), - (0x2C7F, 'M', u'ɀ'), - (0x2C80, 'M', u'ⲁ'), - (0x2C81, 'V'), - (0x2C82, 'M', u'ⲃ'), - ] - -def _seg_25(): - return [ - (0x2C83, 'V'), - (0x2C84, 'M', u'ⲅ'), - (0x2C85, 'V'), - (0x2C86, 'M', u'ⲇ'), - (0x2C87, 'V'), - (0x2C88, 'M', u'ⲉ'), - (0x2C89, 'V'), - (0x2C8A, 'M', u'ⲋ'), - (0x2C8B, 'V'), - (0x2C8C, 'M', u'ⲍ'), - (0x2C8D, 'V'), - (0x2C8E, 'M', u'ⲏ'), - (0x2C8F, 'V'), - (0x2C90, 'M', u'ⲑ'), - (0x2C91, 'V'), - (0x2C92, 'M', u'ⲓ'), - (0x2C93, 'V'), - (0x2C94, 'M', u'ⲕ'), - (0x2C95, 'V'), - (0x2C96, 'M', u'ⲗ'), - (0x2C97, 'V'), - (0x2C98, 'M', u'ⲙ'), - (0x2C99, 'V'), - (0x2C9A, 'M', u'ⲛ'), - (0x2C9B, 'V'), - (0x2C9C, 'M', u'ⲝ'), - (0x2C9D, 'V'), - (0x2C9E, 'M', u'ⲟ'), - (0x2C9F, 'V'), - (0x2CA0, 'M', u'ⲡ'), - (0x2CA1, 'V'), - (0x2CA2, 'M', u'ⲣ'), - (0x2CA3, 'V'), - (0x2CA4, 'M', u'ⲥ'), - (0x2CA5, 'V'), - (0x2CA6, 'M', u'ⲧ'), - (0x2CA7, 'V'), - (0x2CA8, 'M', u'ⲩ'), - (0x2CA9, 'V'), - (0x2CAA, 'M', u'ⲫ'), - (0x2CAB, 'V'), - (0x2CAC, 'M', u'ⲭ'), - (0x2CAD, 'V'), - (0x2CAE, 'M', u'ⲯ'), - (0x2CAF, 'V'), - (0x2CB0, 'M', u'ⲱ'), - (0x2CB1, 'V'), - (0x2CB2, 'M', u'ⲳ'), - (0x2CB3, 'V'), - (0x2CB4, 'M', u'ⲵ'), - (0x2CB5, 'V'), - (0x2CB6, 'M', u'ⲷ'), - (0x2CB7, 'V'), - (0x2CB8, 'M', u'ⲹ'), - (0x2CB9, 'V'), - (0x2CBA, 'M', u'ⲻ'), - (0x2CBB, 'V'), - (0x2CBC, 'M', u'ⲽ'), - (0x2CBD, 'V'), - (0x2CBE, 'M', u'ⲿ'), - (0x2CBF, 'V'), - (0x2CC0, 'M', u'ⳁ'), - (0x2CC1, 'V'), - (0x2CC2, 'M', u'ⳃ'), - (0x2CC3, 'V'), - (0x2CC4, 'M', u'ⳅ'), - (0x2CC5, 'V'), - (0x2CC6, 'M', u'ⳇ'), - (0x2CC7, 'V'), - (0x2CC8, 'M', u'ⳉ'), - (0x2CC9, 'V'), - (0x2CCA, 'M', u'ⳋ'), - (0x2CCB, 'V'), - (0x2CCC, 'M', u'ⳍ'), - (0x2CCD, 'V'), - (0x2CCE, 'M', u'ⳏ'), - (0x2CCF, 'V'), - (0x2CD0, 'M', u'ⳑ'), - (0x2CD1, 'V'), - (0x2CD2, 'M', u'ⳓ'), - (0x2CD3, 'V'), - (0x2CD4, 'M', u'ⳕ'), - (0x2CD5, 'V'), - (0x2CD6, 'M', u'ⳗ'), - (0x2CD7, 'V'), - (0x2CD8, 'M', u'ⳙ'), - (0x2CD9, 'V'), - (0x2CDA, 'M', u'ⳛ'), - (0x2CDB, 'V'), - (0x2CDC, 'M', u'ⳝ'), - (0x2CDD, 'V'), - (0x2CDE, 'M', u'ⳟ'), - (0x2CDF, 'V'), - (0x2CE0, 'M', u'ⳡ'), - (0x2CE1, 'V'), - (0x2CE2, 'M', u'ⳣ'), - (0x2CE3, 'V'), - (0x2CEB, 'M', u'ⳬ'), - (0x2CEC, 'V'), - (0x2CED, 'M', u'ⳮ'), - ] - -def _seg_26(): - return [ - (0x2CEE, 'V'), - (0x2CF2, 'M', u'ⳳ'), - (0x2CF3, 'V'), - (0x2CF4, 'X'), - (0x2CF9, 'V'), - (0x2D26, 'X'), - (0x2D27, 'V'), - (0x2D28, 'X'), - (0x2D2D, 'V'), - (0x2D2E, 'X'), - (0x2D30, 'V'), - (0x2D68, 'X'), - (0x2D6F, 'M', u'ⵡ'), - (0x2D70, 'V'), - (0x2D71, 'X'), - (0x2D7F, 'V'), - (0x2D97, 'X'), - (0x2DA0, 'V'), - (0x2DA7, 'X'), - (0x2DA8, 'V'), - (0x2DAF, 'X'), - (0x2DB0, 'V'), - (0x2DB7, 'X'), - (0x2DB8, 'V'), - (0x2DBF, 'X'), - (0x2DC0, 'V'), - (0x2DC7, 'X'), - (0x2DC8, 'V'), - (0x2DCF, 'X'), - (0x2DD0, 'V'), - (0x2DD7, 'X'), - (0x2DD8, 'V'), - (0x2DDF, 'X'), - (0x2DE0, 'V'), - (0x2E3C, 'X'), - (0x2E80, 'V'), - (0x2E9A, 'X'), - (0x2E9B, 'V'), - (0x2E9F, 'M', u'母'), - (0x2EA0, 'V'), - (0x2EF3, 'M', u'龟'), - (0x2EF4, 'X'), - (0x2F00, 'M', u'一'), - (0x2F01, 'M', u'丨'), - (0x2F02, 'M', u'丶'), - (0x2F03, 'M', u'丿'), - (0x2F04, 'M', u'乙'), - (0x2F05, 'M', u'亅'), - (0x2F06, 'M', u'二'), - (0x2F07, 'M', u'亠'), - (0x2F08, 'M', u'人'), - (0x2F09, 'M', u'儿'), - (0x2F0A, 'M', u'入'), - (0x2F0B, 'M', u'八'), - (0x2F0C, 'M', u'冂'), - (0x2F0D, 'M', u'冖'), - (0x2F0E, 'M', u'冫'), - (0x2F0F, 'M', u'几'), - (0x2F10, 'M', u'凵'), - (0x2F11, 'M', u'刀'), - (0x2F12, 'M', u'力'), - (0x2F13, 'M', u'勹'), - (0x2F14, 'M', u'匕'), - (0x2F15, 'M', u'匚'), - (0x2F16, 'M', u'匸'), - (0x2F17, 'M', u'十'), - (0x2F18, 'M', u'卜'), - (0x2F19, 'M', u'卩'), - (0x2F1A, 'M', u'厂'), - (0x2F1B, 'M', u'厶'), - (0x2F1C, 'M', u'又'), - (0x2F1D, 'M', u'口'), - (0x2F1E, 'M', u'囗'), - (0x2F1F, 'M', u'土'), - (0x2F20, 'M', u'士'), - (0x2F21, 'M', u'夂'), - (0x2F22, 'M', u'夊'), - (0x2F23, 'M', u'夕'), - (0x2F24, 'M', u'大'), - (0x2F25, 'M', u'女'), - (0x2F26, 'M', u'子'), - (0x2F27, 'M', u'宀'), - (0x2F28, 'M', u'寸'), - (0x2F29, 'M', u'小'), - (0x2F2A, 'M', u'尢'), - (0x2F2B, 'M', u'尸'), - (0x2F2C, 'M', u'屮'), - (0x2F2D, 'M', u'山'), - (0x2F2E, 'M', u'巛'), - (0x2F2F, 'M', u'工'), - (0x2F30, 'M', u'己'), - (0x2F31, 'M', u'巾'), - (0x2F32, 'M', u'干'), - (0x2F33, 'M', u'幺'), - (0x2F34, 'M', u'广'), - (0x2F35, 'M', u'廴'), - (0x2F36, 'M', u'廾'), - (0x2F37, 'M', u'弋'), - (0x2F38, 'M', u'弓'), - (0x2F39, 'M', u'彐'), - ] - -def _seg_27(): - return [ - (0x2F3A, 'M', u'彡'), - (0x2F3B, 'M', u'彳'), - (0x2F3C, 'M', u'心'), - (0x2F3D, 'M', u'戈'), - (0x2F3E, 'M', u'戶'), - (0x2F3F, 'M', u'手'), - (0x2F40, 'M', u'支'), - (0x2F41, 'M', u'攴'), - (0x2F42, 'M', u'文'), - (0x2F43, 'M', u'斗'), - (0x2F44, 'M', u'斤'), - (0x2F45, 'M', u'方'), - (0x2F46, 'M', u'无'), - (0x2F47, 'M', u'日'), - (0x2F48, 'M', u'曰'), - (0x2F49, 'M', u'月'), - (0x2F4A, 'M', u'木'), - (0x2F4B, 'M', u'欠'), - (0x2F4C, 'M', u'止'), - (0x2F4D, 'M', u'歹'), - (0x2F4E, 'M', u'殳'), - (0x2F4F, 'M', u'毋'), - (0x2F50, 'M', u'比'), - (0x2F51, 'M', u'毛'), - (0x2F52, 'M', u'氏'), - (0x2F53, 'M', u'气'), - (0x2F54, 'M', u'水'), - (0x2F55, 'M', u'火'), - (0x2F56, 'M', u'爪'), - (0x2F57, 'M', u'父'), - (0x2F58, 'M', u'爻'), - (0x2F59, 'M', u'爿'), - (0x2F5A, 'M', u'片'), - (0x2F5B, 'M', u'牙'), - (0x2F5C, 'M', u'牛'), - (0x2F5D, 'M', u'犬'), - (0x2F5E, 'M', u'玄'), - (0x2F5F, 'M', u'玉'), - (0x2F60, 'M', u'瓜'), - (0x2F61, 'M', u'瓦'), - (0x2F62, 'M', u'甘'), - (0x2F63, 'M', u'生'), - (0x2F64, 'M', u'用'), - (0x2F65, 'M', u'田'), - (0x2F66, 'M', u'疋'), - (0x2F67, 'M', u'疒'), - (0x2F68, 'M', u'癶'), - (0x2F69, 'M', u'白'), - (0x2F6A, 'M', u'皮'), - (0x2F6B, 'M', u'皿'), - (0x2F6C, 'M', u'目'), - (0x2F6D, 'M', u'矛'), - (0x2F6E, 'M', u'矢'), - (0x2F6F, 'M', u'石'), - (0x2F70, 'M', u'示'), - (0x2F71, 'M', u'禸'), - (0x2F72, 'M', u'禾'), - (0x2F73, 'M', u'穴'), - (0x2F74, 'M', u'立'), - (0x2F75, 'M', u'竹'), - (0x2F76, 'M', u'米'), - (0x2F77, 'M', u'糸'), - (0x2F78, 'M', u'缶'), - (0x2F79, 'M', u'网'), - (0x2F7A, 'M', u'羊'), - (0x2F7B, 'M', u'羽'), - (0x2F7C, 'M', u'老'), - (0x2F7D, 'M', u'而'), - (0x2F7E, 'M', u'耒'), - (0x2F7F, 'M', u'耳'), - (0x2F80, 'M', u'聿'), - (0x2F81, 'M', u'肉'), - (0x2F82, 'M', u'臣'), - (0x2F83, 'M', u'自'), - (0x2F84, 'M', u'至'), - (0x2F85, 'M', u'臼'), - (0x2F86, 'M', u'舌'), - (0x2F87, 'M', u'舛'), - (0x2F88, 'M', u'舟'), - (0x2F89, 'M', u'艮'), - (0x2F8A, 'M', u'色'), - (0x2F8B, 'M', u'艸'), - (0x2F8C, 'M', u'虍'), - (0x2F8D, 'M', u'虫'), - (0x2F8E, 'M', u'血'), - (0x2F8F, 'M', u'行'), - (0x2F90, 'M', u'衣'), - (0x2F91, 'M', u'襾'), - (0x2F92, 'M', u'見'), - (0x2F93, 'M', u'角'), - (0x2F94, 'M', u'言'), - (0x2F95, 'M', u'谷'), - (0x2F96, 'M', u'豆'), - (0x2F97, 'M', u'豕'), - (0x2F98, 'M', u'豸'), - (0x2F99, 'M', u'貝'), - (0x2F9A, 'M', u'赤'), - (0x2F9B, 'M', u'走'), - (0x2F9C, 'M', u'足'), - (0x2F9D, 'M', u'身'), - ] - -def _seg_28(): - return [ - (0x2F9E, 'M', u'車'), - (0x2F9F, 'M', u'辛'), - (0x2FA0, 'M', u'辰'), - (0x2FA1, 'M', u'辵'), - (0x2FA2, 'M', u'邑'), - (0x2FA3, 'M', u'酉'), - (0x2FA4, 'M', u'釆'), - (0x2FA5, 'M', u'里'), - (0x2FA6, 'M', u'金'), - (0x2FA7, 'M', u'長'), - (0x2FA8, 'M', u'門'), - (0x2FA9, 'M', u'阜'), - (0x2FAA, 'M', u'隶'), - (0x2FAB, 'M', u'隹'), - (0x2FAC, 'M', u'雨'), - (0x2FAD, 'M', u'靑'), - (0x2FAE, 'M', u'非'), - (0x2FAF, 'M', u'面'), - (0x2FB0, 'M', u'革'), - (0x2FB1, 'M', u'韋'), - (0x2FB2, 'M', u'韭'), - (0x2FB3, 'M', u'音'), - (0x2FB4, 'M', u'頁'), - (0x2FB5, 'M', u'風'), - (0x2FB6, 'M', u'飛'), - (0x2FB7, 'M', u'食'), - (0x2FB8, 'M', u'首'), - (0x2FB9, 'M', u'香'), - (0x2FBA, 'M', u'馬'), - (0x2FBB, 'M', u'骨'), - (0x2FBC, 'M', u'高'), - (0x2FBD, 'M', u'髟'), - (0x2FBE, 'M', u'鬥'), - (0x2FBF, 'M', u'鬯'), - (0x2FC0, 'M', u'鬲'), - (0x2FC1, 'M', u'鬼'), - (0x2FC2, 'M', u'魚'), - (0x2FC3, 'M', u'鳥'), - (0x2FC4, 'M', u'鹵'), - (0x2FC5, 'M', u'鹿'), - (0x2FC6, 'M', u'麥'), - (0x2FC7, 'M', u'麻'), - (0x2FC8, 'M', u'黃'), - (0x2FC9, 'M', u'黍'), - (0x2FCA, 'M', u'黑'), - (0x2FCB, 'M', u'黹'), - (0x2FCC, 'M', u'黽'), - (0x2FCD, 'M', u'鼎'), - (0x2FCE, 'M', u'鼓'), - (0x2FCF, 'M', u'鼠'), - (0x2FD0, 'M', u'鼻'), - (0x2FD1, 'M', u'齊'), - (0x2FD2, 'M', u'齒'), - (0x2FD3, 'M', u'龍'), - (0x2FD4, 'M', u'龜'), - (0x2FD5, 'M', u'龠'), - (0x2FD6, 'X'), - (0x3000, '3', u' '), - (0x3001, 'V'), - (0x3002, 'M', u'.'), - (0x3003, 'V'), - (0x3036, 'M', u'〒'), - (0x3037, 'V'), - (0x3038, 'M', u'十'), - (0x3039, 'M', u'卄'), - (0x303A, 'M', u'卅'), - (0x303B, 'V'), - (0x3040, 'X'), - (0x3041, 'V'), - (0x3097, 'X'), - (0x3099, 'V'), - (0x309B, '3', u' ゙'), - (0x309C, '3', u' ゚'), - (0x309D, 'V'), - (0x309F, 'M', u'より'), - (0x30A0, 'V'), - (0x30FF, 'M', u'コト'), - (0x3100, 'X'), - (0x3105, 'V'), - (0x312E, 'X'), - (0x3131, 'M', u'ᄀ'), - (0x3132, 'M', u'ᄁ'), - (0x3133, 'M', u'ᆪ'), - (0x3134, 'M', u'ᄂ'), - (0x3135, 'M', u'ᆬ'), - (0x3136, 'M', u'ᆭ'), - (0x3137, 'M', u'ᄃ'), - (0x3138, 'M', u'ᄄ'), - (0x3139, 'M', u'ᄅ'), - (0x313A, 'M', u'ᆰ'), - (0x313B, 'M', u'ᆱ'), - (0x313C, 'M', u'ᆲ'), - (0x313D, 'M', u'ᆳ'), - (0x313E, 'M', u'ᆴ'), - (0x313F, 'M', u'ᆵ'), - (0x3140, 'M', u'ᄚ'), - (0x3141, 'M', u'ᄆ'), - (0x3142, 'M', u'ᄇ'), - (0x3143, 'M', u'ᄈ'), - (0x3144, 'M', u'ᄡ'), - ] - -def _seg_29(): - return [ - (0x3145, 'M', u'ᄉ'), - (0x3146, 'M', u'ᄊ'), - (0x3147, 'M', u'ᄋ'), - (0x3148, 'M', u'ᄌ'), - (0x3149, 'M', u'ᄍ'), - (0x314A, 'M', u'ᄎ'), - (0x314B, 'M', u'ᄏ'), - (0x314C, 'M', u'ᄐ'), - (0x314D, 'M', u'ᄑ'), - (0x314E, 'M', u'ᄒ'), - (0x314F, 'M', u'ᅡ'), - (0x3150, 'M', u'ᅢ'), - (0x3151, 'M', u'ᅣ'), - (0x3152, 'M', u'ᅤ'), - (0x3153, 'M', u'ᅥ'), - (0x3154, 'M', u'ᅦ'), - (0x3155, 'M', u'ᅧ'), - (0x3156, 'M', u'ᅨ'), - (0x3157, 'M', u'ᅩ'), - (0x3158, 'M', u'ᅪ'), - (0x3159, 'M', u'ᅫ'), - (0x315A, 'M', u'ᅬ'), - (0x315B, 'M', u'ᅭ'), - (0x315C, 'M', u'ᅮ'), - (0x315D, 'M', u'ᅯ'), - (0x315E, 'M', u'ᅰ'), - (0x315F, 'M', u'ᅱ'), - (0x3160, 'M', u'ᅲ'), - (0x3161, 'M', u'ᅳ'), - (0x3162, 'M', u'ᅴ'), - (0x3163, 'M', u'ᅵ'), - (0x3164, 'X'), - (0x3165, 'M', u'ᄔ'), - (0x3166, 'M', u'ᄕ'), - (0x3167, 'M', u'ᇇ'), - (0x3168, 'M', u'ᇈ'), - (0x3169, 'M', u'ᇌ'), - (0x316A, 'M', u'ᇎ'), - (0x316B, 'M', u'ᇓ'), - (0x316C, 'M', u'ᇗ'), - (0x316D, 'M', u'ᇙ'), - (0x316E, 'M', u'ᄜ'), - (0x316F, 'M', u'ᇝ'), - (0x3170, 'M', u'ᇟ'), - (0x3171, 'M', u'ᄝ'), - (0x3172, 'M', u'ᄞ'), - (0x3173, 'M', u'ᄠ'), - (0x3174, 'M', u'ᄢ'), - (0x3175, 'M', u'ᄣ'), - (0x3176, 'M', u'ᄧ'), - (0x3177, 'M', u'ᄩ'), - (0x3178, 'M', u'ᄫ'), - (0x3179, 'M', u'ᄬ'), - (0x317A, 'M', u'ᄭ'), - (0x317B, 'M', u'ᄮ'), - (0x317C, 'M', u'ᄯ'), - (0x317D, 'M', u'ᄲ'), - (0x317E, 'M', u'ᄶ'), - (0x317F, 'M', u'ᅀ'), - (0x3180, 'M', u'ᅇ'), - (0x3181, 'M', u'ᅌ'), - (0x3182, 'M', u'ᇱ'), - (0x3183, 'M', u'ᇲ'), - (0x3184, 'M', u'ᅗ'), - (0x3185, 'M', u'ᅘ'), - (0x3186, 'M', u'ᅙ'), - (0x3187, 'M', u'ᆄ'), - (0x3188, 'M', u'ᆅ'), - (0x3189, 'M', u'ᆈ'), - (0x318A, 'M', u'ᆑ'), - (0x318B, 'M', u'ᆒ'), - (0x318C, 'M', u'ᆔ'), - (0x318D, 'M', u'ᆞ'), - (0x318E, 'M', u'ᆡ'), - (0x318F, 'X'), - (0x3190, 'V'), - (0x3192, 'M', u'一'), - (0x3193, 'M', u'二'), - (0x3194, 'M', u'三'), - (0x3195, 'M', u'四'), - (0x3196, 'M', u'上'), - (0x3197, 'M', u'中'), - (0x3198, 'M', u'下'), - (0x3199, 'M', u'甲'), - (0x319A, 'M', u'乙'), - (0x319B, 'M', u'丙'), - (0x319C, 'M', u'丁'), - (0x319D, 'M', u'天'), - (0x319E, 'M', u'地'), - (0x319F, 'M', u'人'), - (0x31A0, 'V'), - (0x31BB, 'X'), - (0x31C0, 'V'), - (0x31E4, 'X'), - (0x31F0, 'V'), - (0x3200, '3', u'(ᄀ)'), - (0x3201, '3', u'(ᄂ)'), - (0x3202, '3', u'(ᄃ)'), - (0x3203, '3', u'(ᄅ)'), - (0x3204, '3', u'(ᄆ)'), - ] - -def _seg_30(): - return [ - (0x3205, '3', u'(ᄇ)'), - (0x3206, '3', u'(ᄉ)'), - (0x3207, '3', u'(ᄋ)'), - (0x3208, '3', u'(ᄌ)'), - (0x3209, '3', u'(ᄎ)'), - (0x320A, '3', u'(ᄏ)'), - (0x320B, '3', u'(ᄐ)'), - (0x320C, '3', u'(ᄑ)'), - (0x320D, '3', u'(ᄒ)'), - (0x320E, '3', u'(가)'), - (0x320F, '3', u'(나)'), - (0x3210, '3', u'(다)'), - (0x3211, '3', u'(라)'), - (0x3212, '3', u'(마)'), - (0x3213, '3', u'(바)'), - (0x3214, '3', u'(사)'), - (0x3215, '3', u'(아)'), - (0x3216, '3', u'(자)'), - (0x3217, '3', u'(차)'), - (0x3218, '3', u'(카)'), - (0x3219, '3', u'(타)'), - (0x321A, '3', u'(파)'), - (0x321B, '3', u'(하)'), - (0x321C, '3', u'(주)'), - (0x321D, '3', u'(오전)'), - (0x321E, '3', u'(오후)'), - (0x321F, 'X'), - (0x3220, '3', u'(一)'), - (0x3221, '3', u'(二)'), - (0x3222, '3', u'(三)'), - (0x3223, '3', u'(四)'), - (0x3224, '3', u'(五)'), - (0x3225, '3', u'(六)'), - (0x3226, '3', u'(七)'), - (0x3227, '3', u'(八)'), - (0x3228, '3', u'(九)'), - (0x3229, '3', u'(十)'), - (0x322A, '3', u'(月)'), - (0x322B, '3', u'(火)'), - (0x322C, '3', u'(水)'), - (0x322D, '3', u'(木)'), - (0x322E, '3', u'(金)'), - (0x322F, '3', u'(土)'), - (0x3230, '3', u'(日)'), - (0x3231, '3', u'(株)'), - (0x3232, '3', u'(有)'), - (0x3233, '3', u'(社)'), - (0x3234, '3', u'(名)'), - (0x3235, '3', u'(特)'), - (0x3236, '3', u'(財)'), - (0x3237, '3', u'(祝)'), - (0x3238, '3', u'(労)'), - (0x3239, '3', u'(代)'), - (0x323A, '3', u'(呼)'), - (0x323B, '3', u'(学)'), - (0x323C, '3', u'(監)'), - (0x323D, '3', u'(企)'), - (0x323E, '3', u'(資)'), - (0x323F, '3', u'(協)'), - (0x3240, '3', u'(祭)'), - (0x3241, '3', u'(休)'), - (0x3242, '3', u'(自)'), - (0x3243, '3', u'(至)'), - (0x3244, 'M', u'問'), - (0x3245, 'M', u'幼'), - (0x3246, 'M', u'文'), - (0x3247, 'M', u'箏'), - (0x3248, 'V'), - (0x3250, 'M', u'pte'), - (0x3251, 'M', u'21'), - (0x3252, 'M', u'22'), - (0x3253, 'M', u'23'), - (0x3254, 'M', u'24'), - (0x3255, 'M', u'25'), - (0x3256, 'M', u'26'), - (0x3257, 'M', u'27'), - (0x3258, 'M', u'28'), - (0x3259, 'M', u'29'), - (0x325A, 'M', u'30'), - (0x325B, 'M', u'31'), - (0x325C, 'M', u'32'), - (0x325D, 'M', u'33'), - (0x325E, 'M', u'34'), - (0x325F, 'M', u'35'), - (0x3260, 'M', u'ᄀ'), - (0x3261, 'M', u'ᄂ'), - (0x3262, 'M', u'ᄃ'), - (0x3263, 'M', u'ᄅ'), - (0x3264, 'M', u'ᄆ'), - (0x3265, 'M', u'ᄇ'), - (0x3266, 'M', u'ᄉ'), - (0x3267, 'M', u'ᄋ'), - (0x3268, 'M', u'ᄌ'), - (0x3269, 'M', u'ᄎ'), - (0x326A, 'M', u'ᄏ'), - (0x326B, 'M', u'ᄐ'), - (0x326C, 'M', u'ᄑ'), - (0x326D, 'M', u'ᄒ'), - (0x326E, 'M', u'가'), - (0x326F, 'M', u'나'), - ] - -def _seg_31(): - return [ - (0x3270, 'M', u'다'), - (0x3271, 'M', u'라'), - (0x3272, 'M', u'마'), - (0x3273, 'M', u'바'), - (0x3274, 'M', u'사'), - (0x3275, 'M', u'아'), - (0x3276, 'M', u'자'), - (0x3277, 'M', u'차'), - (0x3278, 'M', u'카'), - (0x3279, 'M', u'타'), - (0x327A, 'M', u'파'), - (0x327B, 'M', u'하'), - (0x327C, 'M', u'참고'), - (0x327D, 'M', u'주의'), - (0x327E, 'M', u'우'), - (0x327F, 'V'), - (0x3280, 'M', u'一'), - (0x3281, 'M', u'二'), - (0x3282, 'M', u'三'), - (0x3283, 'M', u'四'), - (0x3284, 'M', u'五'), - (0x3285, 'M', u'六'), - (0x3286, 'M', u'七'), - (0x3287, 'M', u'八'), - (0x3288, 'M', u'九'), - (0x3289, 'M', u'十'), - (0x328A, 'M', u'月'), - (0x328B, 'M', u'火'), - (0x328C, 'M', u'水'), - (0x328D, 'M', u'木'), - (0x328E, 'M', u'金'), - (0x328F, 'M', u'土'), - (0x3290, 'M', u'日'), - (0x3291, 'M', u'株'), - (0x3292, 'M', u'有'), - (0x3293, 'M', u'社'), - (0x3294, 'M', u'名'), - (0x3295, 'M', u'特'), - (0x3296, 'M', u'財'), - (0x3297, 'M', u'祝'), - (0x3298, 'M', u'労'), - (0x3299, 'M', u'秘'), - (0x329A, 'M', u'男'), - (0x329B, 'M', u'女'), - (0x329C, 'M', u'適'), - (0x329D, 'M', u'優'), - (0x329E, 'M', u'印'), - (0x329F, 'M', u'注'), - (0x32A0, 'M', u'項'), - (0x32A1, 'M', u'休'), - (0x32A2, 'M', u'写'), - (0x32A3, 'M', u'正'), - (0x32A4, 'M', u'上'), - (0x32A5, 'M', u'中'), - (0x32A6, 'M', u'下'), - (0x32A7, 'M', u'左'), - (0x32A8, 'M', u'右'), - (0x32A9, 'M', u'医'), - (0x32AA, 'M', u'宗'), - (0x32AB, 'M', u'学'), - (0x32AC, 'M', u'監'), - (0x32AD, 'M', u'企'), - (0x32AE, 'M', u'資'), - (0x32AF, 'M', u'協'), - (0x32B0, 'M', u'夜'), - (0x32B1, 'M', u'36'), - (0x32B2, 'M', u'37'), - (0x32B3, 'M', u'38'), - (0x32B4, 'M', u'39'), - (0x32B5, 'M', u'40'), - (0x32B6, 'M', u'41'), - (0x32B7, 'M', u'42'), - (0x32B8, 'M', u'43'), - (0x32B9, 'M', u'44'), - (0x32BA, 'M', u'45'), - (0x32BB, 'M', u'46'), - (0x32BC, 'M', u'47'), - (0x32BD, 'M', u'48'), - (0x32BE, 'M', u'49'), - (0x32BF, 'M', u'50'), - (0x32C0, 'M', u'1月'), - (0x32C1, 'M', u'2月'), - (0x32C2, 'M', u'3月'), - (0x32C3, 'M', u'4月'), - (0x32C4, 'M', u'5月'), - (0x32C5, 'M', u'6月'), - (0x32C6, 'M', u'7月'), - (0x32C7, 'M', u'8月'), - (0x32C8, 'M', u'9月'), - (0x32C9, 'M', u'10月'), - (0x32CA, 'M', u'11月'), - (0x32CB, 'M', u'12月'), - (0x32CC, 'M', u'hg'), - (0x32CD, 'M', u'erg'), - (0x32CE, 'M', u'ev'), - (0x32CF, 'M', u'ltd'), - (0x32D0, 'M', u'ア'), - (0x32D1, 'M', u'イ'), - (0x32D2, 'M', u'ウ'), - (0x32D3, 'M', u'エ'), - ] - -def _seg_32(): - return [ - (0x32D4, 'M', u'オ'), - (0x32D5, 'M', u'カ'), - (0x32D6, 'M', u'キ'), - (0x32D7, 'M', u'ク'), - (0x32D8, 'M', u'ケ'), - (0x32D9, 'M', u'コ'), - (0x32DA, 'M', u'サ'), - (0x32DB, 'M', u'シ'), - (0x32DC, 'M', u'ス'), - (0x32DD, 'M', u'セ'), - (0x32DE, 'M', u'ソ'), - (0x32DF, 'M', u'タ'), - (0x32E0, 'M', u'チ'), - (0x32E1, 'M', u'ツ'), - (0x32E2, 'M', u'テ'), - (0x32E3, 'M', u'ト'), - (0x32E4, 'M', u'ナ'), - (0x32E5, 'M', u'ニ'), - (0x32E6, 'M', u'ヌ'), - (0x32E7, 'M', u'ネ'), - (0x32E8, 'M', u'ノ'), - (0x32E9, 'M', u'ハ'), - (0x32EA, 'M', u'ヒ'), - (0x32EB, 'M', u'フ'), - (0x32EC, 'M', u'ヘ'), - (0x32ED, 'M', u'ホ'), - (0x32EE, 'M', u'マ'), - (0x32EF, 'M', u'ミ'), - (0x32F0, 'M', u'ム'), - (0x32F1, 'M', u'メ'), - (0x32F2, 'M', u'モ'), - (0x32F3, 'M', u'ヤ'), - (0x32F4, 'M', u'ユ'), - (0x32F5, 'M', u'ヨ'), - (0x32F6, 'M', u'ラ'), - (0x32F7, 'M', u'リ'), - (0x32F8, 'M', u'ル'), - (0x32F9, 'M', u'レ'), - (0x32FA, 'M', u'ロ'), - (0x32FB, 'M', u'ワ'), - (0x32FC, 'M', u'ヰ'), - (0x32FD, 'M', u'ヱ'), - (0x32FE, 'M', u'ヲ'), - (0x32FF, 'X'), - (0x3300, 'M', u'アパート'), - (0x3301, 'M', u'アルファ'), - (0x3302, 'M', u'アンペア'), - (0x3303, 'M', u'アール'), - (0x3304, 'M', u'イニング'), - (0x3305, 'M', u'インチ'), - (0x3306, 'M', u'ウォン'), - (0x3307, 'M', u'エスクード'), - (0x3308, 'M', u'エーカー'), - (0x3309, 'M', u'オンス'), - (0x330A, 'M', u'オーム'), - (0x330B, 'M', u'カイリ'), - (0x330C, 'M', u'カラット'), - (0x330D, 'M', u'カロリー'), - (0x330E, 'M', u'ガロン'), - (0x330F, 'M', u'ガンマ'), - (0x3310, 'M', u'ギガ'), - (0x3311, 'M', u'ギニー'), - (0x3312, 'M', u'キュリー'), - (0x3313, 'M', u'ギルダー'), - (0x3314, 'M', u'キロ'), - (0x3315, 'M', u'キログラム'), - (0x3316, 'M', u'キロメートル'), - (0x3317, 'M', u'キロワット'), - (0x3318, 'M', u'グラム'), - (0x3319, 'M', u'グラムトン'), - (0x331A, 'M', u'クルゼイロ'), - (0x331B, 'M', u'クローネ'), - (0x331C, 'M', u'ケース'), - (0x331D, 'M', u'コルナ'), - (0x331E, 'M', u'コーポ'), - (0x331F, 'M', u'サイクル'), - (0x3320, 'M', u'サンチーム'), - (0x3321, 'M', u'シリング'), - (0x3322, 'M', u'センチ'), - (0x3323, 'M', u'セント'), - (0x3324, 'M', u'ダース'), - (0x3325, 'M', u'デシ'), - (0x3326, 'M', u'ドル'), - (0x3327, 'M', u'トン'), - (0x3328, 'M', u'ナノ'), - (0x3329, 'M', u'ノット'), - (0x332A, 'M', u'ハイツ'), - (0x332B, 'M', u'パーセント'), - (0x332C, 'M', u'パーツ'), - (0x332D, 'M', u'バーレル'), - (0x332E, 'M', u'ピアストル'), - (0x332F, 'M', u'ピクル'), - (0x3330, 'M', u'ピコ'), - (0x3331, 'M', u'ビル'), - (0x3332, 'M', u'ファラッド'), - (0x3333, 'M', u'フィート'), - (0x3334, 'M', u'ブッシェル'), - (0x3335, 'M', u'フラン'), - (0x3336, 'M', u'ヘクタール'), - (0x3337, 'M', u'ペソ'), - ] - -def _seg_33(): - return [ - (0x3338, 'M', u'ペニヒ'), - (0x3339, 'M', u'ヘルツ'), - (0x333A, 'M', u'ペンス'), - (0x333B, 'M', u'ページ'), - (0x333C, 'M', u'ベータ'), - (0x333D, 'M', u'ポイント'), - (0x333E, 'M', u'ボルト'), - (0x333F, 'M', u'ホン'), - (0x3340, 'M', u'ポンド'), - (0x3341, 'M', u'ホール'), - (0x3342, 'M', u'ホーン'), - (0x3343, 'M', u'マイクロ'), - (0x3344, 'M', u'マイル'), - (0x3345, 'M', u'マッハ'), - (0x3346, 'M', u'マルク'), - (0x3347, 'M', u'マンション'), - (0x3348, 'M', u'ミクロン'), - (0x3349, 'M', u'ミリ'), - (0x334A, 'M', u'ミリバール'), - (0x334B, 'M', u'メガ'), - (0x334C, 'M', u'メガトン'), - (0x334D, 'M', u'メートル'), - (0x334E, 'M', u'ヤード'), - (0x334F, 'M', u'ヤール'), - (0x3350, 'M', u'ユアン'), - (0x3351, 'M', u'リットル'), - (0x3352, 'M', u'リラ'), - (0x3353, 'M', u'ルピー'), - (0x3354, 'M', u'ルーブル'), - (0x3355, 'M', u'レム'), - (0x3356, 'M', u'レントゲン'), - (0x3357, 'M', u'ワット'), - (0x3358, 'M', u'0点'), - (0x3359, 'M', u'1点'), - (0x335A, 'M', u'2点'), - (0x335B, 'M', u'3点'), - (0x335C, 'M', u'4点'), - (0x335D, 'M', u'5点'), - (0x335E, 'M', u'6点'), - (0x335F, 'M', u'7点'), - (0x3360, 'M', u'8点'), - (0x3361, 'M', u'9点'), - (0x3362, 'M', u'10点'), - (0x3363, 'M', u'11点'), - (0x3364, 'M', u'12点'), - (0x3365, 'M', u'13点'), - (0x3366, 'M', u'14点'), - (0x3367, 'M', u'15点'), - (0x3368, 'M', u'16点'), - (0x3369, 'M', u'17点'), - (0x336A, 'M', u'18点'), - (0x336B, 'M', u'19点'), - (0x336C, 'M', u'20点'), - (0x336D, 'M', u'21点'), - (0x336E, 'M', u'22点'), - (0x336F, 'M', u'23点'), - (0x3370, 'M', u'24点'), - (0x3371, 'M', u'hpa'), - (0x3372, 'M', u'da'), - (0x3373, 'M', u'au'), - (0x3374, 'M', u'bar'), - (0x3375, 'M', u'ov'), - (0x3376, 'M', u'pc'), - (0x3377, 'M', u'dm'), - (0x3378, 'M', u'dm2'), - (0x3379, 'M', u'dm3'), - (0x337A, 'M', u'iu'), - (0x337B, 'M', u'平成'), - (0x337C, 'M', u'昭和'), - (0x337D, 'M', u'大正'), - (0x337E, 'M', u'明治'), - (0x337F, 'M', u'株式会社'), - (0x3380, 'M', u'pa'), - (0x3381, 'M', u'na'), - (0x3382, 'M', u'μa'), - (0x3383, 'M', u'ma'), - (0x3384, 'M', u'ka'), - (0x3385, 'M', u'kb'), - (0x3386, 'M', u'mb'), - (0x3387, 'M', u'gb'), - (0x3388, 'M', u'cal'), - (0x3389, 'M', u'kcal'), - (0x338A, 'M', u'pf'), - (0x338B, 'M', u'nf'), - (0x338C, 'M', u'μf'), - (0x338D, 'M', u'μg'), - (0x338E, 'M', u'mg'), - (0x338F, 'M', u'kg'), - (0x3390, 'M', u'hz'), - (0x3391, 'M', u'khz'), - (0x3392, 'M', u'mhz'), - (0x3393, 'M', u'ghz'), - (0x3394, 'M', u'thz'), - (0x3395, 'M', u'μl'), - (0x3396, 'M', u'ml'), - (0x3397, 'M', u'dl'), - (0x3398, 'M', u'kl'), - (0x3399, 'M', u'fm'), - (0x339A, 'M', u'nm'), - (0x339B, 'M', u'μm'), - ] - -def _seg_34(): - return [ - (0x339C, 'M', u'mm'), - (0x339D, 'M', u'cm'), - (0x339E, 'M', u'km'), - (0x339F, 'M', u'mm2'), - (0x33A0, 'M', u'cm2'), - (0x33A1, 'M', u'm2'), - (0x33A2, 'M', u'km2'), - (0x33A3, 'M', u'mm3'), - (0x33A4, 'M', u'cm3'), - (0x33A5, 'M', u'm3'), - (0x33A6, 'M', u'km3'), - (0x33A7, 'M', u'm∕s'), - (0x33A8, 'M', u'm∕s2'), - (0x33A9, 'M', u'pa'), - (0x33AA, 'M', u'kpa'), - (0x33AB, 'M', u'mpa'), - (0x33AC, 'M', u'gpa'), - (0x33AD, 'M', u'rad'), - (0x33AE, 'M', u'rad∕s'), - (0x33AF, 'M', u'rad∕s2'), - (0x33B0, 'M', u'ps'), - (0x33B1, 'M', u'ns'), - (0x33B2, 'M', u'μs'), - (0x33B3, 'M', u'ms'), - (0x33B4, 'M', u'pv'), - (0x33B5, 'M', u'nv'), - (0x33B6, 'M', u'μv'), - (0x33B7, 'M', u'mv'), - (0x33B8, 'M', u'kv'), - (0x33B9, 'M', u'mv'), - (0x33BA, 'M', u'pw'), - (0x33BB, 'M', u'nw'), - (0x33BC, 'M', u'μw'), - (0x33BD, 'M', u'mw'), - (0x33BE, 'M', u'kw'), - (0x33BF, 'M', u'mw'), - (0x33C0, 'M', u'kω'), - (0x33C1, 'M', u'mω'), - (0x33C2, 'X'), - (0x33C3, 'M', u'bq'), - (0x33C4, 'M', u'cc'), - (0x33C5, 'M', u'cd'), - (0x33C6, 'M', u'c∕kg'), - (0x33C7, 'X'), - (0x33C8, 'M', u'db'), - (0x33C9, 'M', u'gy'), - (0x33CA, 'M', u'ha'), - (0x33CB, 'M', u'hp'), - (0x33CC, 'M', u'in'), - (0x33CD, 'M', u'kk'), - (0x33CE, 'M', u'km'), - (0x33CF, 'M', u'kt'), - (0x33D0, 'M', u'lm'), - (0x33D1, 'M', u'ln'), - (0x33D2, 'M', u'log'), - (0x33D3, 'M', u'lx'), - (0x33D4, 'M', u'mb'), - (0x33D5, 'M', u'mil'), - (0x33D6, 'M', u'mol'), - (0x33D7, 'M', u'ph'), - (0x33D8, 'X'), - (0x33D9, 'M', u'ppm'), - (0x33DA, 'M', u'pr'), - (0x33DB, 'M', u'sr'), - (0x33DC, 'M', u'sv'), - (0x33DD, 'M', u'wb'), - (0x33DE, 'M', u'v∕m'), - (0x33DF, 'M', u'a∕m'), - (0x33E0, 'M', u'1日'), - (0x33E1, 'M', u'2日'), - (0x33E2, 'M', u'3日'), - (0x33E3, 'M', u'4日'), - (0x33E4, 'M', u'5日'), - (0x33E5, 'M', u'6日'), - (0x33E6, 'M', u'7日'), - (0x33E7, 'M', u'8日'), - (0x33E8, 'M', u'9日'), - (0x33E9, 'M', u'10日'), - (0x33EA, 'M', u'11日'), - (0x33EB, 'M', u'12日'), - (0x33EC, 'M', u'13日'), - (0x33ED, 'M', u'14日'), - (0x33EE, 'M', u'15日'), - (0x33EF, 'M', u'16日'), - (0x33F0, 'M', u'17日'), - (0x33F1, 'M', u'18日'), - (0x33F2, 'M', u'19日'), - (0x33F3, 'M', u'20日'), - (0x33F4, 'M', u'21日'), - (0x33F5, 'M', u'22日'), - (0x33F6, 'M', u'23日'), - (0x33F7, 'M', u'24日'), - (0x33F8, 'M', u'25日'), - (0x33F9, 'M', u'26日'), - (0x33FA, 'M', u'27日'), - (0x33FB, 'M', u'28日'), - (0x33FC, 'M', u'29日'), - (0x33FD, 'M', u'30日'), - (0x33FE, 'M', u'31日'), - (0x33FF, 'M', u'gal'), - ] - -def _seg_35(): - return [ - (0x3400, 'V'), - (0x4DB6, 'X'), - (0x4DC0, 'V'), - (0x9FCD, 'X'), - (0xA000, 'V'), - (0xA48D, 'X'), - (0xA490, 'V'), - (0xA4C7, 'X'), - (0xA4D0, 'V'), - (0xA62C, 'X'), - (0xA640, 'M', u'ꙁ'), - (0xA641, 'V'), - (0xA642, 'M', u'ꙃ'), - (0xA643, 'V'), - (0xA644, 'M', u'ꙅ'), - (0xA645, 'V'), - (0xA646, 'M', u'ꙇ'), - (0xA647, 'V'), - (0xA648, 'M', u'ꙉ'), - (0xA649, 'V'), - (0xA64A, 'M', u'ꙋ'), - (0xA64B, 'V'), - (0xA64C, 'M', u'ꙍ'), - (0xA64D, 'V'), - (0xA64E, 'M', u'ꙏ'), - (0xA64F, 'V'), - (0xA650, 'M', u'ꙑ'), - (0xA651, 'V'), - (0xA652, 'M', u'ꙓ'), - (0xA653, 'V'), - (0xA654, 'M', u'ꙕ'), - (0xA655, 'V'), - (0xA656, 'M', u'ꙗ'), - (0xA657, 'V'), - (0xA658, 'M', u'ꙙ'), - (0xA659, 'V'), - (0xA65A, 'M', u'ꙛ'), - (0xA65B, 'V'), - (0xA65C, 'M', u'ꙝ'), - (0xA65D, 'V'), - (0xA65E, 'M', u'ꙟ'), - (0xA65F, 'V'), - (0xA660, 'M', u'ꙡ'), - (0xA661, 'V'), - (0xA662, 'M', u'ꙣ'), - (0xA663, 'V'), - (0xA664, 'M', u'ꙥ'), - (0xA665, 'V'), - (0xA666, 'M', u'ꙧ'), - (0xA667, 'V'), - (0xA668, 'M', u'ꙩ'), - (0xA669, 'V'), - (0xA66A, 'M', u'ꙫ'), - (0xA66B, 'V'), - (0xA66C, 'M', u'ꙭ'), - (0xA66D, 'V'), - (0xA680, 'M', u'ꚁ'), - (0xA681, 'V'), - (0xA682, 'M', u'ꚃ'), - (0xA683, 'V'), - (0xA684, 'M', u'ꚅ'), - (0xA685, 'V'), - (0xA686, 'M', u'ꚇ'), - (0xA687, 'V'), - (0xA688, 'M', u'ꚉ'), - (0xA689, 'V'), - (0xA68A, 'M', u'ꚋ'), - (0xA68B, 'V'), - (0xA68C, 'M', u'ꚍ'), - (0xA68D, 'V'), - (0xA68E, 'M', u'ꚏ'), - (0xA68F, 'V'), - (0xA690, 'M', u'ꚑ'), - (0xA691, 'V'), - (0xA692, 'M', u'ꚓ'), - (0xA693, 'V'), - (0xA694, 'M', u'ꚕ'), - (0xA695, 'V'), - (0xA696, 'M', u'ꚗ'), - (0xA697, 'V'), - (0xA698, 'X'), - (0xA69F, 'V'), - (0xA6F8, 'X'), - (0xA700, 'V'), - (0xA722, 'M', u'ꜣ'), - (0xA723, 'V'), - (0xA724, 'M', u'ꜥ'), - (0xA725, 'V'), - (0xA726, 'M', u'ꜧ'), - (0xA727, 'V'), - (0xA728, 'M', u'ꜩ'), - (0xA729, 'V'), - (0xA72A, 'M', u'ꜫ'), - (0xA72B, 'V'), - (0xA72C, 'M', u'ꜭ'), - (0xA72D, 'V'), - (0xA72E, 'M', u'ꜯ'), - (0xA72F, 'V'), - (0xA732, 'M', u'ꜳ'), - (0xA733, 'V'), - ] - -def _seg_36(): - return [ - (0xA734, 'M', u'ꜵ'), - (0xA735, 'V'), - (0xA736, 'M', u'ꜷ'), - (0xA737, 'V'), - (0xA738, 'M', u'ꜹ'), - (0xA739, 'V'), - (0xA73A, 'M', u'ꜻ'), - (0xA73B, 'V'), - (0xA73C, 'M', u'ꜽ'), - (0xA73D, 'V'), - (0xA73E, 'M', u'ꜿ'), - (0xA73F, 'V'), - (0xA740, 'M', u'ꝁ'), - (0xA741, 'V'), - (0xA742, 'M', u'ꝃ'), - (0xA743, 'V'), - (0xA744, 'M', u'ꝅ'), - (0xA745, 'V'), - (0xA746, 'M', u'ꝇ'), - (0xA747, 'V'), - (0xA748, 'M', u'ꝉ'), - (0xA749, 'V'), - (0xA74A, 'M', u'ꝋ'), - (0xA74B, 'V'), - (0xA74C, 'M', u'ꝍ'), - (0xA74D, 'V'), - (0xA74E, 'M', u'ꝏ'), - (0xA74F, 'V'), - (0xA750, 'M', u'ꝑ'), - (0xA751, 'V'), - (0xA752, 'M', u'ꝓ'), - (0xA753, 'V'), - (0xA754, 'M', u'ꝕ'), - (0xA755, 'V'), - (0xA756, 'M', u'ꝗ'), - (0xA757, 'V'), - (0xA758, 'M', u'ꝙ'), - (0xA759, 'V'), - (0xA75A, 'M', u'ꝛ'), - (0xA75B, 'V'), - (0xA75C, 'M', u'ꝝ'), - (0xA75D, 'V'), - (0xA75E, 'M', u'ꝟ'), - (0xA75F, 'V'), - (0xA760, 'M', u'ꝡ'), - (0xA761, 'V'), - (0xA762, 'M', u'ꝣ'), - (0xA763, 'V'), - (0xA764, 'M', u'ꝥ'), - (0xA765, 'V'), - (0xA766, 'M', u'ꝧ'), - (0xA767, 'V'), - (0xA768, 'M', u'ꝩ'), - (0xA769, 'V'), - (0xA76A, 'M', u'ꝫ'), - (0xA76B, 'V'), - (0xA76C, 'M', u'ꝭ'), - (0xA76D, 'V'), - (0xA76E, 'M', u'ꝯ'), - (0xA76F, 'V'), - (0xA770, 'M', u'ꝯ'), - (0xA771, 'V'), - (0xA779, 'M', u'ꝺ'), - (0xA77A, 'V'), - (0xA77B, 'M', u'ꝼ'), - (0xA77C, 'V'), - (0xA77D, 'M', u'ᵹ'), - (0xA77E, 'M', u'ꝿ'), - (0xA77F, 'V'), - (0xA780, 'M', u'ꞁ'), - (0xA781, 'V'), - (0xA782, 'M', u'ꞃ'), - (0xA783, 'V'), - (0xA784, 'M', u'ꞅ'), - (0xA785, 'V'), - (0xA786, 'M', u'ꞇ'), - (0xA787, 'V'), - (0xA78B, 'M', u'ꞌ'), - (0xA78C, 'V'), - (0xA78D, 'M', u'ɥ'), - (0xA78E, 'V'), - (0xA78F, 'X'), - (0xA790, 'M', u'ꞑ'), - (0xA791, 'V'), - (0xA792, 'M', u'ꞓ'), - (0xA793, 'V'), - (0xA794, 'X'), - (0xA7A0, 'M', u'ꞡ'), - (0xA7A1, 'V'), - (0xA7A2, 'M', u'ꞣ'), - (0xA7A3, 'V'), - (0xA7A4, 'M', u'ꞥ'), - (0xA7A5, 'V'), - (0xA7A6, 'M', u'ꞧ'), - (0xA7A7, 'V'), - (0xA7A8, 'M', u'ꞩ'), - (0xA7A9, 'V'), - (0xA7AA, 'M', u'ɦ'), - (0xA7AB, 'X'), - (0xA7F8, 'M', u'ħ'), - ] - -def _seg_37(): - return [ - (0xA7F9, 'M', u'œ'), - (0xA7FA, 'V'), - (0xA82C, 'X'), - (0xA830, 'V'), - (0xA83A, 'X'), - (0xA840, 'V'), - (0xA878, 'X'), - (0xA880, 'V'), - (0xA8C5, 'X'), - (0xA8CE, 'V'), - (0xA8DA, 'X'), - (0xA8E0, 'V'), - (0xA8FC, 'X'), - (0xA900, 'V'), - (0xA954, 'X'), - (0xA95F, 'V'), - (0xA97D, 'X'), - (0xA980, 'V'), - (0xA9CE, 'X'), - (0xA9CF, 'V'), - (0xA9DA, 'X'), - (0xA9DE, 'V'), - (0xA9E0, 'X'), - (0xAA00, 'V'), - (0xAA37, 'X'), - (0xAA40, 'V'), - (0xAA4E, 'X'), - (0xAA50, 'V'), - (0xAA5A, 'X'), - (0xAA5C, 'V'), - (0xAA7C, 'X'), - (0xAA80, 'V'), - (0xAAC3, 'X'), - (0xAADB, 'V'), - (0xAAF7, 'X'), - (0xAB01, 'V'), - (0xAB07, 'X'), - (0xAB09, 'V'), - (0xAB0F, 'X'), - (0xAB11, 'V'), - (0xAB17, 'X'), - (0xAB20, 'V'), - (0xAB27, 'X'), - (0xAB28, 'V'), - (0xAB2F, 'X'), - (0xABC0, 'V'), - (0xABEE, 'X'), - (0xABF0, 'V'), - (0xABFA, 'X'), - (0xAC00, 'V'), - (0xD7A4, 'X'), - (0xD7B0, 'V'), - (0xD7C7, 'X'), - (0xD7CB, 'V'), - (0xD7FC, 'X'), - (0xF900, 'M', u'豈'), - (0xF901, 'M', u'更'), - (0xF902, 'M', u'車'), - (0xF903, 'M', u'賈'), - (0xF904, 'M', u'滑'), - (0xF905, 'M', u'串'), - (0xF906, 'M', u'句'), - (0xF907, 'M', u'龜'), - (0xF909, 'M', u'契'), - (0xF90A, 'M', u'金'), - (0xF90B, 'M', u'喇'), - (0xF90C, 'M', u'奈'), - (0xF90D, 'M', u'懶'), - (0xF90E, 'M', u'癩'), - (0xF90F, 'M', u'羅'), - (0xF910, 'M', u'蘿'), - (0xF911, 'M', u'螺'), - (0xF912, 'M', u'裸'), - (0xF913, 'M', u'邏'), - (0xF914, 'M', u'樂'), - (0xF915, 'M', u'洛'), - (0xF916, 'M', u'烙'), - (0xF917, 'M', u'珞'), - (0xF918, 'M', u'落'), - (0xF919, 'M', u'酪'), - (0xF91A, 'M', u'駱'), - (0xF91B, 'M', u'亂'), - (0xF91C, 'M', u'卵'), - (0xF91D, 'M', u'欄'), - (0xF91E, 'M', u'爛'), - (0xF91F, 'M', u'蘭'), - (0xF920, 'M', u'鸞'), - (0xF921, 'M', u'嵐'), - (0xF922, 'M', u'濫'), - (0xF923, 'M', u'藍'), - (0xF924, 'M', u'襤'), - (0xF925, 'M', u'拉'), - (0xF926, 'M', u'臘'), - (0xF927, 'M', u'蠟'), - (0xF928, 'M', u'廊'), - (0xF929, 'M', u'朗'), - (0xF92A, 'M', u'浪'), - (0xF92B, 'M', u'狼'), - (0xF92C, 'M', u'郎'), - (0xF92D, 'M', u'來'), - ] - -def _seg_38(): - return [ - (0xF92E, 'M', u'冷'), - (0xF92F, 'M', u'勞'), - (0xF930, 'M', u'擄'), - (0xF931, 'M', u'櫓'), - (0xF932, 'M', u'爐'), - (0xF933, 'M', u'盧'), - (0xF934, 'M', u'老'), - (0xF935, 'M', u'蘆'), - (0xF936, 'M', u'虜'), - (0xF937, 'M', u'路'), - (0xF938, 'M', u'露'), - (0xF939, 'M', u'魯'), - (0xF93A, 'M', u'鷺'), - (0xF93B, 'M', u'碌'), - (0xF93C, 'M', u'祿'), - (0xF93D, 'M', u'綠'), - (0xF93E, 'M', u'菉'), - (0xF93F, 'M', u'錄'), - (0xF940, 'M', u'鹿'), - (0xF941, 'M', u'論'), - (0xF942, 'M', u'壟'), - (0xF943, 'M', u'弄'), - (0xF944, 'M', u'籠'), - (0xF945, 'M', u'聾'), - (0xF946, 'M', u'牢'), - (0xF947, 'M', u'磊'), - (0xF948, 'M', u'賂'), - (0xF949, 'M', u'雷'), - (0xF94A, 'M', u'壘'), - (0xF94B, 'M', u'屢'), - (0xF94C, 'M', u'樓'), - (0xF94D, 'M', u'淚'), - (0xF94E, 'M', u'漏'), - (0xF94F, 'M', u'累'), - (0xF950, 'M', u'縷'), - (0xF951, 'M', u'陋'), - (0xF952, 'M', u'勒'), - (0xF953, 'M', u'肋'), - (0xF954, 'M', u'凜'), - (0xF955, 'M', u'凌'), - (0xF956, 'M', u'稜'), - (0xF957, 'M', u'綾'), - (0xF958, 'M', u'菱'), - (0xF959, 'M', u'陵'), - (0xF95A, 'M', u'讀'), - (0xF95B, 'M', u'拏'), - (0xF95C, 'M', u'樂'), - (0xF95D, 'M', u'諾'), - (0xF95E, 'M', u'丹'), - (0xF95F, 'M', u'寧'), - (0xF960, 'M', u'怒'), - (0xF961, 'M', u'率'), - (0xF962, 'M', u'異'), - (0xF963, 'M', u'北'), - (0xF964, 'M', u'磻'), - (0xF965, 'M', u'便'), - (0xF966, 'M', u'復'), - (0xF967, 'M', u'不'), - (0xF968, 'M', u'泌'), - (0xF969, 'M', u'數'), - (0xF96A, 'M', u'索'), - (0xF96B, 'M', u'參'), - (0xF96C, 'M', u'塞'), - (0xF96D, 'M', u'省'), - (0xF96E, 'M', u'葉'), - (0xF96F, 'M', u'說'), - (0xF970, 'M', u'殺'), - (0xF971, 'M', u'辰'), - (0xF972, 'M', u'沈'), - (0xF973, 'M', u'拾'), - (0xF974, 'M', u'若'), - (0xF975, 'M', u'掠'), - (0xF976, 'M', u'略'), - (0xF977, 'M', u'亮'), - (0xF978, 'M', u'兩'), - (0xF979, 'M', u'凉'), - (0xF97A, 'M', u'梁'), - (0xF97B, 'M', u'糧'), - (0xF97C, 'M', u'良'), - (0xF97D, 'M', u'諒'), - (0xF97E, 'M', u'量'), - (0xF97F, 'M', u'勵'), - (0xF980, 'M', u'呂'), - (0xF981, 'M', u'女'), - (0xF982, 'M', u'廬'), - (0xF983, 'M', u'旅'), - (0xF984, 'M', u'濾'), - (0xF985, 'M', u'礪'), - (0xF986, 'M', u'閭'), - (0xF987, 'M', u'驪'), - (0xF988, 'M', u'麗'), - (0xF989, 'M', u'黎'), - (0xF98A, 'M', u'力'), - (0xF98B, 'M', u'曆'), - (0xF98C, 'M', u'歷'), - (0xF98D, 'M', u'轢'), - (0xF98E, 'M', u'年'), - (0xF98F, 'M', u'憐'), - (0xF990, 'M', u'戀'), - (0xF991, 'M', u'撚'), - ] - -def _seg_39(): - return [ - (0xF992, 'M', u'漣'), - (0xF993, 'M', u'煉'), - (0xF994, 'M', u'璉'), - (0xF995, 'M', u'秊'), - (0xF996, 'M', u'練'), - (0xF997, 'M', u'聯'), - (0xF998, 'M', u'輦'), - (0xF999, 'M', u'蓮'), - (0xF99A, 'M', u'連'), - (0xF99B, 'M', u'鍊'), - (0xF99C, 'M', u'列'), - (0xF99D, 'M', u'劣'), - (0xF99E, 'M', u'咽'), - (0xF99F, 'M', u'烈'), - (0xF9A0, 'M', u'裂'), - (0xF9A1, 'M', u'說'), - (0xF9A2, 'M', u'廉'), - (0xF9A3, 'M', u'念'), - (0xF9A4, 'M', u'捻'), - (0xF9A5, 'M', u'殮'), - (0xF9A6, 'M', u'簾'), - (0xF9A7, 'M', u'獵'), - (0xF9A8, 'M', u'令'), - (0xF9A9, 'M', u'囹'), - (0xF9AA, 'M', u'寧'), - (0xF9AB, 'M', u'嶺'), - (0xF9AC, 'M', u'怜'), - (0xF9AD, 'M', u'玲'), - (0xF9AE, 'M', u'瑩'), - (0xF9AF, 'M', u'羚'), - (0xF9B0, 'M', u'聆'), - (0xF9B1, 'M', u'鈴'), - (0xF9B2, 'M', u'零'), - (0xF9B3, 'M', u'靈'), - (0xF9B4, 'M', u'領'), - (0xF9B5, 'M', u'例'), - (0xF9B6, 'M', u'禮'), - (0xF9B7, 'M', u'醴'), - (0xF9B8, 'M', u'隸'), - (0xF9B9, 'M', u'惡'), - (0xF9BA, 'M', u'了'), - (0xF9BB, 'M', u'僚'), - (0xF9BC, 'M', u'寮'), - (0xF9BD, 'M', u'尿'), - (0xF9BE, 'M', u'料'), - (0xF9BF, 'M', u'樂'), - (0xF9C0, 'M', u'燎'), - (0xF9C1, 'M', u'療'), - (0xF9C2, 'M', u'蓼'), - (0xF9C3, 'M', u'遼'), - (0xF9C4, 'M', u'龍'), - (0xF9C5, 'M', u'暈'), - (0xF9C6, 'M', u'阮'), - (0xF9C7, 'M', u'劉'), - (0xF9C8, 'M', u'杻'), - (0xF9C9, 'M', u'柳'), - (0xF9CA, 'M', u'流'), - (0xF9CB, 'M', u'溜'), - (0xF9CC, 'M', u'琉'), - (0xF9CD, 'M', u'留'), - (0xF9CE, 'M', u'硫'), - (0xF9CF, 'M', u'紐'), - (0xF9D0, 'M', u'類'), - (0xF9D1, 'M', u'六'), - (0xF9D2, 'M', u'戮'), - (0xF9D3, 'M', u'陸'), - (0xF9D4, 'M', u'倫'), - (0xF9D5, 'M', u'崙'), - (0xF9D6, 'M', u'淪'), - (0xF9D7, 'M', u'輪'), - (0xF9D8, 'M', u'律'), - (0xF9D9, 'M', u'慄'), - (0xF9DA, 'M', u'栗'), - (0xF9DB, 'M', u'率'), - (0xF9DC, 'M', u'隆'), - (0xF9DD, 'M', u'利'), - (0xF9DE, 'M', u'吏'), - (0xF9DF, 'M', u'履'), - (0xF9E0, 'M', u'易'), - (0xF9E1, 'M', u'李'), - (0xF9E2, 'M', u'梨'), - (0xF9E3, 'M', u'泥'), - (0xF9E4, 'M', u'理'), - (0xF9E5, 'M', u'痢'), - (0xF9E6, 'M', u'罹'), - (0xF9E7, 'M', u'裏'), - (0xF9E8, 'M', u'裡'), - (0xF9E9, 'M', u'里'), - (0xF9EA, 'M', u'離'), - (0xF9EB, 'M', u'匿'), - (0xF9EC, 'M', u'溺'), - (0xF9ED, 'M', u'吝'), - (0xF9EE, 'M', u'燐'), - (0xF9EF, 'M', u'璘'), - (0xF9F0, 'M', u'藺'), - (0xF9F1, 'M', u'隣'), - (0xF9F2, 'M', u'鱗'), - (0xF9F3, 'M', u'麟'), - (0xF9F4, 'M', u'林'), - (0xF9F5, 'M', u'淋'), - ] - -def _seg_40(): - return [ - (0xF9F6, 'M', u'臨'), - (0xF9F7, 'M', u'立'), - (0xF9F8, 'M', u'笠'), - (0xF9F9, 'M', u'粒'), - (0xF9FA, 'M', u'狀'), - (0xF9FB, 'M', u'炙'), - (0xF9FC, 'M', u'識'), - (0xF9FD, 'M', u'什'), - (0xF9FE, 'M', u'茶'), - (0xF9FF, 'M', u'刺'), - (0xFA00, 'M', u'切'), - (0xFA01, 'M', u'度'), - (0xFA02, 'M', u'拓'), - (0xFA03, 'M', u'糖'), - (0xFA04, 'M', u'宅'), - (0xFA05, 'M', u'洞'), - (0xFA06, 'M', u'暴'), - (0xFA07, 'M', u'輻'), - (0xFA08, 'M', u'行'), - (0xFA09, 'M', u'降'), - (0xFA0A, 'M', u'見'), - (0xFA0B, 'M', u'廓'), - (0xFA0C, 'M', u'兀'), - (0xFA0D, 'M', u'嗀'), - (0xFA0E, 'V'), - (0xFA10, 'M', u'塚'), - (0xFA11, 'V'), - (0xFA12, 'M', u'晴'), - (0xFA13, 'V'), - (0xFA15, 'M', u'凞'), - (0xFA16, 'M', u'猪'), - (0xFA17, 'M', u'益'), - (0xFA18, 'M', u'礼'), - (0xFA19, 'M', u'神'), - (0xFA1A, 'M', u'祥'), - (0xFA1B, 'M', u'福'), - (0xFA1C, 'M', u'靖'), - (0xFA1D, 'M', u'精'), - (0xFA1E, 'M', u'羽'), - (0xFA1F, 'V'), - (0xFA20, 'M', u'蘒'), - (0xFA21, 'V'), - (0xFA22, 'M', u'諸'), - (0xFA23, 'V'), - (0xFA25, 'M', u'逸'), - (0xFA26, 'M', u'都'), - (0xFA27, 'V'), - (0xFA2A, 'M', u'飯'), - (0xFA2B, 'M', u'飼'), - (0xFA2C, 'M', u'館'), - (0xFA2D, 'M', u'鶴'), - (0xFA2E, 'M', u'郞'), - (0xFA2F, 'M', u'隷'), - (0xFA30, 'M', u'侮'), - (0xFA31, 'M', u'僧'), - (0xFA32, 'M', u'免'), - (0xFA33, 'M', u'勉'), - (0xFA34, 'M', u'勤'), - (0xFA35, 'M', u'卑'), - (0xFA36, 'M', u'喝'), - (0xFA37, 'M', u'嘆'), - (0xFA38, 'M', u'器'), - (0xFA39, 'M', u'塀'), - (0xFA3A, 'M', u'墨'), - (0xFA3B, 'M', u'層'), - (0xFA3C, 'M', u'屮'), - (0xFA3D, 'M', u'悔'), - (0xFA3E, 'M', u'慨'), - (0xFA3F, 'M', u'憎'), - (0xFA40, 'M', u'懲'), - (0xFA41, 'M', u'敏'), - (0xFA42, 'M', u'既'), - (0xFA43, 'M', u'暑'), - (0xFA44, 'M', u'梅'), - (0xFA45, 'M', u'海'), - (0xFA46, 'M', u'渚'), - (0xFA47, 'M', u'漢'), - (0xFA48, 'M', u'煮'), - (0xFA49, 'M', u'爫'), - (0xFA4A, 'M', u'琢'), - (0xFA4B, 'M', u'碑'), - (0xFA4C, 'M', u'社'), - (0xFA4D, 'M', u'祉'), - (0xFA4E, 'M', u'祈'), - (0xFA4F, 'M', u'祐'), - (0xFA50, 'M', u'祖'), - (0xFA51, 'M', u'祝'), - (0xFA52, 'M', u'禍'), - (0xFA53, 'M', u'禎'), - (0xFA54, 'M', u'穀'), - (0xFA55, 'M', u'突'), - (0xFA56, 'M', u'節'), - (0xFA57, 'M', u'練'), - (0xFA58, 'M', u'縉'), - (0xFA59, 'M', u'繁'), - (0xFA5A, 'M', u'署'), - (0xFA5B, 'M', u'者'), - (0xFA5C, 'M', u'臭'), - (0xFA5D, 'M', u'艹'), - (0xFA5F, 'M', u'著'), - ] - -def _seg_41(): - return [ - (0xFA60, 'M', u'褐'), - (0xFA61, 'M', u'視'), - (0xFA62, 'M', u'謁'), - (0xFA63, 'M', u'謹'), - (0xFA64, 'M', u'賓'), - (0xFA65, 'M', u'贈'), - (0xFA66, 'M', u'辶'), - (0xFA67, 'M', u'逸'), - (0xFA68, 'M', u'難'), - (0xFA69, 'M', u'響'), - (0xFA6A, 'M', u'頻'), - (0xFA6B, 'M', u'恵'), - (0xFA6C, 'M', u'𤋮'), - (0xFA6D, 'M', u'舘'), - (0xFA6E, 'X'), - (0xFA70, 'M', u'並'), - (0xFA71, 'M', u'况'), - (0xFA72, 'M', u'全'), - (0xFA73, 'M', u'侀'), - (0xFA74, 'M', u'充'), - (0xFA75, 'M', u'冀'), - (0xFA76, 'M', u'勇'), - (0xFA77, 'M', u'勺'), - (0xFA78, 'M', u'喝'), - (0xFA79, 'M', u'啕'), - (0xFA7A, 'M', u'喙'), - (0xFA7B, 'M', u'嗢'), - (0xFA7C, 'M', u'塚'), - (0xFA7D, 'M', u'墳'), - (0xFA7E, 'M', u'奄'), - (0xFA7F, 'M', u'奔'), - (0xFA80, 'M', u'婢'), - (0xFA81, 'M', u'嬨'), - (0xFA82, 'M', u'廒'), - (0xFA83, 'M', u'廙'), - (0xFA84, 'M', u'彩'), - (0xFA85, 'M', u'徭'), - (0xFA86, 'M', u'惘'), - (0xFA87, 'M', u'慎'), - (0xFA88, 'M', u'愈'), - (0xFA89, 'M', u'憎'), - (0xFA8A, 'M', u'慠'), - (0xFA8B, 'M', u'懲'), - (0xFA8C, 'M', u'戴'), - (0xFA8D, 'M', u'揄'), - (0xFA8E, 'M', u'搜'), - (0xFA8F, 'M', u'摒'), - (0xFA90, 'M', u'敖'), - (0xFA91, 'M', u'晴'), - (0xFA92, 'M', u'朗'), - (0xFA93, 'M', u'望'), - (0xFA94, 'M', u'杖'), - (0xFA95, 'M', u'歹'), - (0xFA96, 'M', u'殺'), - (0xFA97, 'M', u'流'), - (0xFA98, 'M', u'滛'), - (0xFA99, 'M', u'滋'), - (0xFA9A, 'M', u'漢'), - (0xFA9B, 'M', u'瀞'), - (0xFA9C, 'M', u'煮'), - (0xFA9D, 'M', u'瞧'), - (0xFA9E, 'M', u'爵'), - (0xFA9F, 'M', u'犯'), - (0xFAA0, 'M', u'猪'), - (0xFAA1, 'M', u'瑱'), - (0xFAA2, 'M', u'甆'), - (0xFAA3, 'M', u'画'), - (0xFAA4, 'M', u'瘝'), - (0xFAA5, 'M', u'瘟'), - (0xFAA6, 'M', u'益'), - (0xFAA7, 'M', u'盛'), - (0xFAA8, 'M', u'直'), - (0xFAA9, 'M', u'睊'), - (0xFAAA, 'M', u'着'), - (0xFAAB, 'M', u'磌'), - (0xFAAC, 'M', u'窱'), - (0xFAAD, 'M', u'節'), - (0xFAAE, 'M', u'类'), - (0xFAAF, 'M', u'絛'), - (0xFAB0, 'M', u'練'), - (0xFAB1, 'M', u'缾'), - (0xFAB2, 'M', u'者'), - (0xFAB3, 'M', u'荒'), - (0xFAB4, 'M', u'華'), - (0xFAB5, 'M', u'蝹'), - (0xFAB6, 'M', u'襁'), - (0xFAB7, 'M', u'覆'), - (0xFAB8, 'M', u'視'), - (0xFAB9, 'M', u'調'), - (0xFABA, 'M', u'諸'), - (0xFABB, 'M', u'請'), - (0xFABC, 'M', u'謁'), - (0xFABD, 'M', u'諾'), - (0xFABE, 'M', u'諭'), - (0xFABF, 'M', u'謹'), - (0xFAC0, 'M', u'變'), - (0xFAC1, 'M', u'贈'), - (0xFAC2, 'M', u'輸'), - (0xFAC3, 'M', u'遲'), - (0xFAC4, 'M', u'醙'), - ] - -def _seg_42(): - return [ - (0xFAC5, 'M', u'鉶'), - (0xFAC6, 'M', u'陼'), - (0xFAC7, 'M', u'難'), - (0xFAC8, 'M', u'靖'), - (0xFAC9, 'M', u'韛'), - (0xFACA, 'M', u'響'), - (0xFACB, 'M', u'頋'), - (0xFACC, 'M', u'頻'), - (0xFACD, 'M', u'鬒'), - (0xFACE, 'M', u'龜'), - (0xFACF, 'M', u'𢡊'), - (0xFAD0, 'M', u'𢡄'), - (0xFAD1, 'M', u'𣏕'), - (0xFAD2, 'M', u'㮝'), - (0xFAD3, 'M', u'䀘'), - (0xFAD4, 'M', u'䀹'), - (0xFAD5, 'M', u'𥉉'), - (0xFAD6, 'M', u'𥳐'), - (0xFAD7, 'M', u'𧻓'), - (0xFAD8, 'M', u'齃'), - (0xFAD9, 'M', u'龎'), - (0xFADA, 'X'), - (0xFB00, 'M', u'ff'), - (0xFB01, 'M', u'fi'), - (0xFB02, 'M', u'fl'), - (0xFB03, 'M', u'ffi'), - (0xFB04, 'M', u'ffl'), - (0xFB05, 'M', u'st'), - (0xFB07, 'X'), - (0xFB13, 'M', u'մն'), - (0xFB14, 'M', u'մե'), - (0xFB15, 'M', u'մի'), - (0xFB16, 'M', u'վն'), - (0xFB17, 'M', u'մխ'), - (0xFB18, 'X'), - (0xFB1D, 'M', u'יִ'), - (0xFB1E, 'V'), - (0xFB1F, 'M', u'ײַ'), - (0xFB20, 'M', u'ע'), - (0xFB21, 'M', u'א'), - (0xFB22, 'M', u'ד'), - (0xFB23, 'M', u'ה'), - (0xFB24, 'M', u'כ'), - (0xFB25, 'M', u'ל'), - (0xFB26, 'M', u'ם'), - (0xFB27, 'M', u'ר'), - (0xFB28, 'M', u'ת'), - (0xFB29, '3', u'+'), - (0xFB2A, 'M', u'שׁ'), - (0xFB2B, 'M', u'שׂ'), - (0xFB2C, 'M', u'שּׁ'), - (0xFB2D, 'M', u'שּׂ'), - (0xFB2E, 'M', u'אַ'), - (0xFB2F, 'M', u'אָ'), - (0xFB30, 'M', u'אּ'), - (0xFB31, 'M', u'בּ'), - (0xFB32, 'M', u'גּ'), - (0xFB33, 'M', u'דּ'), - (0xFB34, 'M', u'הּ'), - (0xFB35, 'M', u'וּ'), - (0xFB36, 'M', u'זּ'), - (0xFB37, 'X'), - (0xFB38, 'M', u'טּ'), - (0xFB39, 'M', u'יּ'), - (0xFB3A, 'M', u'ךּ'), - (0xFB3B, 'M', u'כּ'), - (0xFB3C, 'M', u'לּ'), - (0xFB3D, 'X'), - (0xFB3E, 'M', u'מּ'), - (0xFB3F, 'X'), - (0xFB40, 'M', u'נּ'), - (0xFB41, 'M', u'סּ'), - (0xFB42, 'X'), - (0xFB43, 'M', u'ףּ'), - (0xFB44, 'M', u'פּ'), - (0xFB45, 'X'), - (0xFB46, 'M', u'צּ'), - (0xFB47, 'M', u'קּ'), - (0xFB48, 'M', u'רּ'), - (0xFB49, 'M', u'שּ'), - (0xFB4A, 'M', u'תּ'), - (0xFB4B, 'M', u'וֹ'), - (0xFB4C, 'M', u'בֿ'), - (0xFB4D, 'M', u'כֿ'), - (0xFB4E, 'M', u'פֿ'), - (0xFB4F, 'M', u'אל'), - (0xFB50, 'M', u'ٱ'), - (0xFB52, 'M', u'ٻ'), - (0xFB56, 'M', u'پ'), - (0xFB5A, 'M', u'ڀ'), - (0xFB5E, 'M', u'ٺ'), - (0xFB62, 'M', u'ٿ'), - (0xFB66, 'M', u'ٹ'), - (0xFB6A, 'M', u'ڤ'), - (0xFB6E, 'M', u'ڦ'), - (0xFB72, 'M', u'ڄ'), - (0xFB76, 'M', u'ڃ'), - (0xFB7A, 'M', u'چ'), - (0xFB7E, 'M', u'ڇ'), - (0xFB82, 'M', u'ڍ'), - ] - -def _seg_43(): - return [ - (0xFB84, 'M', u'ڌ'), - (0xFB86, 'M', u'ڎ'), - (0xFB88, 'M', u'ڈ'), - (0xFB8A, 'M', u'ژ'), - (0xFB8C, 'M', u'ڑ'), - (0xFB8E, 'M', u'ک'), - (0xFB92, 'M', u'گ'), - (0xFB96, 'M', u'ڳ'), - (0xFB9A, 'M', u'ڱ'), - (0xFB9E, 'M', u'ں'), - (0xFBA0, 'M', u'ڻ'), - (0xFBA4, 'M', u'ۀ'), - (0xFBA6, 'M', u'ہ'), - (0xFBAA, 'M', u'ھ'), - (0xFBAE, 'M', u'ے'), - (0xFBB0, 'M', u'ۓ'), - (0xFBB2, 'V'), - (0xFBC2, 'X'), - (0xFBD3, 'M', u'ڭ'), - (0xFBD7, 'M', u'ۇ'), - (0xFBD9, 'M', u'ۆ'), - (0xFBDB, 'M', u'ۈ'), - (0xFBDD, 'M', u'ۇٴ'), - (0xFBDE, 'M', u'ۋ'), - (0xFBE0, 'M', u'ۅ'), - (0xFBE2, 'M', u'ۉ'), - (0xFBE4, 'M', u'ې'), - (0xFBE8, 'M', u'ى'), - (0xFBEA, 'M', u'ئا'), - (0xFBEC, 'M', u'ئە'), - (0xFBEE, 'M', u'ئو'), - (0xFBF0, 'M', u'ئۇ'), - (0xFBF2, 'M', u'ئۆ'), - (0xFBF4, 'M', u'ئۈ'), - (0xFBF6, 'M', u'ئې'), - (0xFBF9, 'M', u'ئى'), - (0xFBFC, 'M', u'ی'), - (0xFC00, 'M', u'ئج'), - (0xFC01, 'M', u'ئح'), - (0xFC02, 'M', u'ئم'), - (0xFC03, 'M', u'ئى'), - (0xFC04, 'M', u'ئي'), - (0xFC05, 'M', u'بج'), - (0xFC06, 'M', u'بح'), - (0xFC07, 'M', u'بخ'), - (0xFC08, 'M', u'بم'), - (0xFC09, 'M', u'بى'), - (0xFC0A, 'M', u'بي'), - (0xFC0B, 'M', u'تج'), - (0xFC0C, 'M', u'تح'), - (0xFC0D, 'M', u'تخ'), - (0xFC0E, 'M', u'تم'), - (0xFC0F, 'M', u'تى'), - (0xFC10, 'M', u'تي'), - (0xFC11, 'M', u'ثج'), - (0xFC12, 'M', u'ثم'), - (0xFC13, 'M', u'ثى'), - (0xFC14, 'M', u'ثي'), - (0xFC15, 'M', u'جح'), - (0xFC16, 'M', u'جم'), - (0xFC17, 'M', u'حج'), - (0xFC18, 'M', u'حم'), - (0xFC19, 'M', u'خج'), - (0xFC1A, 'M', u'خح'), - (0xFC1B, 'M', u'خم'), - (0xFC1C, 'M', u'سج'), - (0xFC1D, 'M', u'سح'), - (0xFC1E, 'M', u'سخ'), - (0xFC1F, 'M', u'سم'), - (0xFC20, 'M', u'صح'), - (0xFC21, 'M', u'صم'), - (0xFC22, 'M', u'ضج'), - (0xFC23, 'M', u'ضح'), - (0xFC24, 'M', u'ضخ'), - (0xFC25, 'M', u'ضم'), - (0xFC26, 'M', u'طح'), - (0xFC27, 'M', u'طم'), - (0xFC28, 'M', u'ظم'), - (0xFC29, 'M', u'عج'), - (0xFC2A, 'M', u'عم'), - (0xFC2B, 'M', u'غج'), - (0xFC2C, 'M', u'غم'), - (0xFC2D, 'M', u'فج'), - (0xFC2E, 'M', u'فح'), - (0xFC2F, 'M', u'فخ'), - (0xFC30, 'M', u'فم'), - (0xFC31, 'M', u'فى'), - (0xFC32, 'M', u'في'), - (0xFC33, 'M', u'قح'), - (0xFC34, 'M', u'قم'), - (0xFC35, 'M', u'قى'), - (0xFC36, 'M', u'قي'), - (0xFC37, 'M', u'كا'), - (0xFC38, 'M', u'كج'), - (0xFC39, 'M', u'كح'), - (0xFC3A, 'M', u'كخ'), - (0xFC3B, 'M', u'كل'), - (0xFC3C, 'M', u'كم'), - (0xFC3D, 'M', u'كى'), - (0xFC3E, 'M', u'كي'), - ] - -def _seg_44(): - return [ - (0xFC3F, 'M', u'لج'), - (0xFC40, 'M', u'لح'), - (0xFC41, 'M', u'لخ'), - (0xFC42, 'M', u'لم'), - (0xFC43, 'M', u'لى'), - (0xFC44, 'M', u'لي'), - (0xFC45, 'M', u'مج'), - (0xFC46, 'M', u'مح'), - (0xFC47, 'M', u'مخ'), - (0xFC48, 'M', u'مم'), - (0xFC49, 'M', u'مى'), - (0xFC4A, 'M', u'مي'), - (0xFC4B, 'M', u'نج'), - (0xFC4C, 'M', u'نح'), - (0xFC4D, 'M', u'نخ'), - (0xFC4E, 'M', u'نم'), - (0xFC4F, 'M', u'نى'), - (0xFC50, 'M', u'ني'), - (0xFC51, 'M', u'هج'), - (0xFC52, 'M', u'هم'), - (0xFC53, 'M', u'هى'), - (0xFC54, 'M', u'هي'), - (0xFC55, 'M', u'يج'), - (0xFC56, 'M', u'يح'), - (0xFC57, 'M', u'يخ'), - (0xFC58, 'M', u'يم'), - (0xFC59, 'M', u'يى'), - (0xFC5A, 'M', u'يي'), - (0xFC5B, 'M', u'ذٰ'), - (0xFC5C, 'M', u'رٰ'), - (0xFC5D, 'M', u'ىٰ'), - (0xFC5E, '3', u' ٌّ'), - (0xFC5F, '3', u' ٍّ'), - (0xFC60, '3', u' َّ'), - (0xFC61, '3', u' ُّ'), - (0xFC62, '3', u' ِّ'), - (0xFC63, '3', u' ّٰ'), - (0xFC64, 'M', u'ئر'), - (0xFC65, 'M', u'ئز'), - (0xFC66, 'M', u'ئم'), - (0xFC67, 'M', u'ئن'), - (0xFC68, 'M', u'ئى'), - (0xFC69, 'M', u'ئي'), - (0xFC6A, 'M', u'بر'), - (0xFC6B, 'M', u'بز'), - (0xFC6C, 'M', u'بم'), - (0xFC6D, 'M', u'بن'), - (0xFC6E, 'M', u'بى'), - (0xFC6F, 'M', u'بي'), - (0xFC70, 'M', u'تر'), - (0xFC71, 'M', u'تز'), - (0xFC72, 'M', u'تم'), - (0xFC73, 'M', u'تن'), - (0xFC74, 'M', u'تى'), - (0xFC75, 'M', u'تي'), - (0xFC76, 'M', u'ثر'), - (0xFC77, 'M', u'ثز'), - (0xFC78, 'M', u'ثم'), - (0xFC79, 'M', u'ثن'), - (0xFC7A, 'M', u'ثى'), - (0xFC7B, 'M', u'ثي'), - (0xFC7C, 'M', u'فى'), - (0xFC7D, 'M', u'في'), - (0xFC7E, 'M', u'قى'), - (0xFC7F, 'M', u'قي'), - (0xFC80, 'M', u'كا'), - (0xFC81, 'M', u'كل'), - (0xFC82, 'M', u'كم'), - (0xFC83, 'M', u'كى'), - (0xFC84, 'M', u'كي'), - (0xFC85, 'M', u'لم'), - (0xFC86, 'M', u'لى'), - (0xFC87, 'M', u'لي'), - (0xFC88, 'M', u'ما'), - (0xFC89, 'M', u'مم'), - (0xFC8A, 'M', u'نر'), - (0xFC8B, 'M', u'نز'), - (0xFC8C, 'M', u'نم'), - (0xFC8D, 'M', u'نن'), - (0xFC8E, 'M', u'نى'), - (0xFC8F, 'M', u'ني'), - (0xFC90, 'M', u'ىٰ'), - (0xFC91, 'M', u'ير'), - (0xFC92, 'M', u'يز'), - (0xFC93, 'M', u'يم'), - (0xFC94, 'M', u'ين'), - (0xFC95, 'M', u'يى'), - (0xFC96, 'M', u'يي'), - (0xFC97, 'M', u'ئج'), - (0xFC98, 'M', u'ئح'), - (0xFC99, 'M', u'ئخ'), - (0xFC9A, 'M', u'ئم'), - (0xFC9B, 'M', u'ئه'), - (0xFC9C, 'M', u'بج'), - (0xFC9D, 'M', u'بح'), - (0xFC9E, 'M', u'بخ'), - (0xFC9F, 'M', u'بم'), - (0xFCA0, 'M', u'به'), - (0xFCA1, 'M', u'تج'), - (0xFCA2, 'M', u'تح'), - ] - -def _seg_45(): - return [ - (0xFCA3, 'M', u'تخ'), - (0xFCA4, 'M', u'تم'), - (0xFCA5, 'M', u'ته'), - (0xFCA6, 'M', u'ثم'), - (0xFCA7, 'M', u'جح'), - (0xFCA8, 'M', u'جم'), - (0xFCA9, 'M', u'حج'), - (0xFCAA, 'M', u'حم'), - (0xFCAB, 'M', u'خج'), - (0xFCAC, 'M', u'خم'), - (0xFCAD, 'M', u'سج'), - (0xFCAE, 'M', u'سح'), - (0xFCAF, 'M', u'سخ'), - (0xFCB0, 'M', u'سم'), - (0xFCB1, 'M', u'صح'), - (0xFCB2, 'M', u'صخ'), - (0xFCB3, 'M', u'صم'), - (0xFCB4, 'M', u'ضج'), - (0xFCB5, 'M', u'ضح'), - (0xFCB6, 'M', u'ضخ'), - (0xFCB7, 'M', u'ضم'), - (0xFCB8, 'M', u'طح'), - (0xFCB9, 'M', u'ظم'), - (0xFCBA, 'M', u'عج'), - (0xFCBB, 'M', u'عم'), - (0xFCBC, 'M', u'غج'), - (0xFCBD, 'M', u'غم'), - (0xFCBE, 'M', u'فج'), - (0xFCBF, 'M', u'فح'), - (0xFCC0, 'M', u'فخ'), - (0xFCC1, 'M', u'فم'), - (0xFCC2, 'M', u'قح'), - (0xFCC3, 'M', u'قم'), - (0xFCC4, 'M', u'كج'), - (0xFCC5, 'M', u'كح'), - (0xFCC6, 'M', u'كخ'), - (0xFCC7, 'M', u'كل'), - (0xFCC8, 'M', u'كم'), - (0xFCC9, 'M', u'لج'), - (0xFCCA, 'M', u'لح'), - (0xFCCB, 'M', u'لخ'), - (0xFCCC, 'M', u'لم'), - (0xFCCD, 'M', u'له'), - (0xFCCE, 'M', u'مج'), - (0xFCCF, 'M', u'مح'), - (0xFCD0, 'M', u'مخ'), - (0xFCD1, 'M', u'مم'), - (0xFCD2, 'M', u'نج'), - (0xFCD3, 'M', u'نح'), - (0xFCD4, 'M', u'نخ'), - (0xFCD5, 'M', u'نم'), - (0xFCD6, 'M', u'نه'), - (0xFCD7, 'M', u'هج'), - (0xFCD8, 'M', u'هم'), - (0xFCD9, 'M', u'هٰ'), - (0xFCDA, 'M', u'يج'), - (0xFCDB, 'M', u'يح'), - (0xFCDC, 'M', u'يخ'), - (0xFCDD, 'M', u'يم'), - (0xFCDE, 'M', u'يه'), - (0xFCDF, 'M', u'ئم'), - (0xFCE0, 'M', u'ئه'), - (0xFCE1, 'M', u'بم'), - (0xFCE2, 'M', u'به'), - (0xFCE3, 'M', u'تم'), - (0xFCE4, 'M', u'ته'), - (0xFCE5, 'M', u'ثم'), - (0xFCE6, 'M', u'ثه'), - (0xFCE7, 'M', u'سم'), - (0xFCE8, 'M', u'سه'), - (0xFCE9, 'M', u'شم'), - (0xFCEA, 'M', u'شه'), - (0xFCEB, 'M', u'كل'), - (0xFCEC, 'M', u'كم'), - (0xFCED, 'M', u'لم'), - (0xFCEE, 'M', u'نم'), - (0xFCEF, 'M', u'نه'), - (0xFCF0, 'M', u'يم'), - (0xFCF1, 'M', u'يه'), - (0xFCF2, 'M', u'ـَّ'), - (0xFCF3, 'M', u'ـُّ'), - (0xFCF4, 'M', u'ـِّ'), - (0xFCF5, 'M', u'طى'), - (0xFCF6, 'M', u'طي'), - (0xFCF7, 'M', u'عى'), - (0xFCF8, 'M', u'عي'), - (0xFCF9, 'M', u'غى'), - (0xFCFA, 'M', u'غي'), - (0xFCFB, 'M', u'سى'), - (0xFCFC, 'M', u'سي'), - (0xFCFD, 'M', u'شى'), - (0xFCFE, 'M', u'شي'), - (0xFCFF, 'M', u'حى'), - (0xFD00, 'M', u'حي'), - (0xFD01, 'M', u'جى'), - (0xFD02, 'M', u'جي'), - (0xFD03, 'M', u'خى'), - (0xFD04, 'M', u'خي'), - (0xFD05, 'M', u'صى'), - (0xFD06, 'M', u'صي'), - ] - -def _seg_46(): - return [ - (0xFD07, 'M', u'ضى'), - (0xFD08, 'M', u'ضي'), - (0xFD09, 'M', u'شج'), - (0xFD0A, 'M', u'شح'), - (0xFD0B, 'M', u'شخ'), - (0xFD0C, 'M', u'شم'), - (0xFD0D, 'M', u'شر'), - (0xFD0E, 'M', u'سر'), - (0xFD0F, 'M', u'صر'), - (0xFD10, 'M', u'ضر'), - (0xFD11, 'M', u'طى'), - (0xFD12, 'M', u'طي'), - (0xFD13, 'M', u'عى'), - (0xFD14, 'M', u'عي'), - (0xFD15, 'M', u'غى'), - (0xFD16, 'M', u'غي'), - (0xFD17, 'M', u'سى'), - (0xFD18, 'M', u'سي'), - (0xFD19, 'M', u'شى'), - (0xFD1A, 'M', u'شي'), - (0xFD1B, 'M', u'حى'), - (0xFD1C, 'M', u'حي'), - (0xFD1D, 'M', u'جى'), - (0xFD1E, 'M', u'جي'), - (0xFD1F, 'M', u'خى'), - (0xFD20, 'M', u'خي'), - (0xFD21, 'M', u'صى'), - (0xFD22, 'M', u'صي'), - (0xFD23, 'M', u'ضى'), - (0xFD24, 'M', u'ضي'), - (0xFD25, 'M', u'شج'), - (0xFD26, 'M', u'شح'), - (0xFD27, 'M', u'شخ'), - (0xFD28, 'M', u'شم'), - (0xFD29, 'M', u'شر'), - (0xFD2A, 'M', u'سر'), - (0xFD2B, 'M', u'صر'), - (0xFD2C, 'M', u'ضر'), - (0xFD2D, 'M', u'شج'), - (0xFD2E, 'M', u'شح'), - (0xFD2F, 'M', u'شخ'), - (0xFD30, 'M', u'شم'), - (0xFD31, 'M', u'سه'), - (0xFD32, 'M', u'شه'), - (0xFD33, 'M', u'طم'), - (0xFD34, 'M', u'سج'), - (0xFD35, 'M', u'سح'), - (0xFD36, 'M', u'سخ'), - (0xFD37, 'M', u'شج'), - (0xFD38, 'M', u'شح'), - (0xFD39, 'M', u'شخ'), - (0xFD3A, 'M', u'طم'), - (0xFD3B, 'M', u'ظم'), - (0xFD3C, 'M', u'اً'), - (0xFD3E, 'V'), - (0xFD40, 'X'), - (0xFD50, 'M', u'تجم'), - (0xFD51, 'M', u'تحج'), - (0xFD53, 'M', u'تحم'), - (0xFD54, 'M', u'تخم'), - (0xFD55, 'M', u'تمج'), - (0xFD56, 'M', u'تمح'), - (0xFD57, 'M', u'تمخ'), - (0xFD58, 'M', u'جمح'), - (0xFD5A, 'M', u'حمي'), - (0xFD5B, 'M', u'حمى'), - (0xFD5C, 'M', u'سحج'), - (0xFD5D, 'M', u'سجح'), - (0xFD5E, 'M', u'سجى'), - (0xFD5F, 'M', u'سمح'), - (0xFD61, 'M', u'سمج'), - (0xFD62, 'M', u'سمم'), - (0xFD64, 'M', u'صحح'), - (0xFD66, 'M', u'صمم'), - (0xFD67, 'M', u'شحم'), - (0xFD69, 'M', u'شجي'), - (0xFD6A, 'M', u'شمخ'), - (0xFD6C, 'M', u'شمم'), - (0xFD6E, 'M', u'ضحى'), - (0xFD6F, 'M', u'ضخم'), - (0xFD71, 'M', u'طمح'), - (0xFD73, 'M', u'طمم'), - (0xFD74, 'M', u'طمي'), - (0xFD75, 'M', u'عجم'), - (0xFD76, 'M', u'عمم'), - (0xFD78, 'M', u'عمى'), - (0xFD79, 'M', u'غمم'), - (0xFD7A, 'M', u'غمي'), - (0xFD7B, 'M', u'غمى'), - (0xFD7C, 'M', u'فخم'), - (0xFD7E, 'M', u'قمح'), - (0xFD7F, 'M', u'قمم'), - (0xFD80, 'M', u'لحم'), - (0xFD81, 'M', u'لحي'), - (0xFD82, 'M', u'لحى'), - (0xFD83, 'M', u'لجج'), - (0xFD85, 'M', u'لخم'), - (0xFD87, 'M', u'لمح'), - (0xFD89, 'M', u'محج'), - (0xFD8A, 'M', u'محم'), - ] - -def _seg_47(): - return [ - (0xFD8B, 'M', u'محي'), - (0xFD8C, 'M', u'مجح'), - (0xFD8D, 'M', u'مجم'), - (0xFD8E, 'M', u'مخج'), - (0xFD8F, 'M', u'مخم'), - (0xFD90, 'X'), - (0xFD92, 'M', u'مجخ'), - (0xFD93, 'M', u'همج'), - (0xFD94, 'M', u'همم'), - (0xFD95, 'M', u'نحم'), - (0xFD96, 'M', u'نحى'), - (0xFD97, 'M', u'نجم'), - (0xFD99, 'M', u'نجى'), - (0xFD9A, 'M', u'نمي'), - (0xFD9B, 'M', u'نمى'), - (0xFD9C, 'M', u'يمم'), - (0xFD9E, 'M', u'بخي'), - (0xFD9F, 'M', u'تجي'), - (0xFDA0, 'M', u'تجى'), - (0xFDA1, 'M', u'تخي'), - (0xFDA2, 'M', u'تخى'), - (0xFDA3, 'M', u'تمي'), - (0xFDA4, 'M', u'تمى'), - (0xFDA5, 'M', u'جمي'), - (0xFDA6, 'M', u'جحى'), - (0xFDA7, 'M', u'جمى'), - (0xFDA8, 'M', u'سخى'), - (0xFDA9, 'M', u'صحي'), - (0xFDAA, 'M', u'شحي'), - (0xFDAB, 'M', u'ضحي'), - (0xFDAC, 'M', u'لجي'), - (0xFDAD, 'M', u'لمي'), - (0xFDAE, 'M', u'يحي'), - (0xFDAF, 'M', u'يجي'), - (0xFDB0, 'M', u'يمي'), - (0xFDB1, 'M', u'ممي'), - (0xFDB2, 'M', u'قمي'), - (0xFDB3, 'M', u'نحي'), - (0xFDB4, 'M', u'قمح'), - (0xFDB5, 'M', u'لحم'), - (0xFDB6, 'M', u'عمي'), - (0xFDB7, 'M', u'كمي'), - (0xFDB8, 'M', u'نجح'), - (0xFDB9, 'M', u'مخي'), - (0xFDBA, 'M', u'لجم'), - (0xFDBB, 'M', u'كمم'), - (0xFDBC, 'M', u'لجم'), - (0xFDBD, 'M', u'نجح'), - (0xFDBE, 'M', u'جحي'), - (0xFDBF, 'M', u'حجي'), - (0xFDC0, 'M', u'مجي'), - (0xFDC1, 'M', u'فمي'), - (0xFDC2, 'M', u'بحي'), - (0xFDC3, 'M', u'كمم'), - (0xFDC4, 'M', u'عجم'), - (0xFDC5, 'M', u'صمم'), - (0xFDC6, 'M', u'سخي'), - (0xFDC7, 'M', u'نجي'), - (0xFDC8, 'X'), - (0xFDF0, 'M', u'صلے'), - (0xFDF1, 'M', u'قلے'), - (0xFDF2, 'M', u'الله'), - (0xFDF3, 'M', u'اكبر'), - (0xFDF4, 'M', u'محمد'), - (0xFDF5, 'M', u'صلعم'), - (0xFDF6, 'M', u'رسول'), - (0xFDF7, 'M', u'عليه'), - (0xFDF8, 'M', u'وسلم'), - (0xFDF9, 'M', u'صلى'), - (0xFDFA, '3', u'صلى الله عليه وسلم'), - (0xFDFB, '3', u'جل جلاله'), - (0xFDFC, 'M', u'ریال'), - (0xFDFD, 'V'), - (0xFDFE, 'X'), - (0xFE00, 'I'), - (0xFE10, '3', u','), - (0xFE11, 'M', u'、'), - (0xFE12, 'X'), - (0xFE13, '3', u':'), - (0xFE14, '3', u';'), - (0xFE15, '3', u'!'), - (0xFE16, '3', u'?'), - (0xFE17, 'M', u'〖'), - (0xFE18, 'M', u'〗'), - (0xFE19, 'X'), - (0xFE20, 'V'), - (0xFE27, 'X'), - (0xFE31, 'M', u'—'), - (0xFE32, 'M', u'–'), - (0xFE33, '3', u'_'), - (0xFE35, '3', u'('), - (0xFE36, '3', u')'), - (0xFE37, '3', u'{'), - (0xFE38, '3', u'}'), - (0xFE39, 'M', u'〔'), - (0xFE3A, 'M', u'〕'), - (0xFE3B, 'M', u'【'), - (0xFE3C, 'M', u'】'), - (0xFE3D, 'M', u'《'), - (0xFE3E, 'M', u'》'), - ] - -def _seg_48(): - return [ - (0xFE3F, 'M', u'〈'), - (0xFE40, 'M', u'〉'), - (0xFE41, 'M', u'「'), - (0xFE42, 'M', u'」'), - (0xFE43, 'M', u'『'), - (0xFE44, 'M', u'』'), - (0xFE45, 'V'), - (0xFE47, '3', u'['), - (0xFE48, '3', u']'), - (0xFE49, '3', u' ̅'), - (0xFE4D, '3', u'_'), - (0xFE50, '3', u','), - (0xFE51, 'M', u'、'), - (0xFE52, 'X'), - (0xFE54, '3', u';'), - (0xFE55, '3', u':'), - (0xFE56, '3', u'?'), - (0xFE57, '3', u'!'), - (0xFE58, 'M', u'—'), - (0xFE59, '3', u'('), - (0xFE5A, '3', u')'), - (0xFE5B, '3', u'{'), - (0xFE5C, '3', u'}'), - (0xFE5D, 'M', u'〔'), - (0xFE5E, 'M', u'〕'), - (0xFE5F, '3', u'#'), - (0xFE60, '3', u'&'), - (0xFE61, '3', u'*'), - (0xFE62, '3', u'+'), - (0xFE63, 'M', u'-'), - (0xFE64, '3', u'<'), - (0xFE65, '3', u'>'), - (0xFE66, '3', u'='), - (0xFE67, 'X'), - (0xFE68, '3', u'\\'), - (0xFE69, '3', u'$'), - (0xFE6A, '3', u'%'), - (0xFE6B, '3', u'@'), - (0xFE6C, 'X'), - (0xFE70, '3', u' ً'), - (0xFE71, 'M', u'ـً'), - (0xFE72, '3', u' ٌ'), - (0xFE73, 'V'), - (0xFE74, '3', u' ٍ'), - (0xFE75, 'X'), - (0xFE76, '3', u' َ'), - (0xFE77, 'M', u'ـَ'), - (0xFE78, '3', u' ُ'), - (0xFE79, 'M', u'ـُ'), - (0xFE7A, '3', u' ِ'), - (0xFE7B, 'M', u'ـِ'), - (0xFE7C, '3', u' ّ'), - (0xFE7D, 'M', u'ـّ'), - (0xFE7E, '3', u' ْ'), - (0xFE7F, 'M', u'ـْ'), - (0xFE80, 'M', u'ء'), - (0xFE81, 'M', u'آ'), - (0xFE83, 'M', u'أ'), - (0xFE85, 'M', u'ؤ'), - (0xFE87, 'M', u'إ'), - (0xFE89, 'M', u'ئ'), - (0xFE8D, 'M', u'ا'), - (0xFE8F, 'M', u'ب'), - (0xFE93, 'M', u'ة'), - (0xFE95, 'M', u'ت'), - (0xFE99, 'M', u'ث'), - (0xFE9D, 'M', u'ج'), - (0xFEA1, 'M', u'ح'), - (0xFEA5, 'M', u'خ'), - (0xFEA9, 'M', u'د'), - (0xFEAB, 'M', u'ذ'), - (0xFEAD, 'M', u'ر'), - (0xFEAF, 'M', u'ز'), - (0xFEB1, 'M', u'س'), - (0xFEB5, 'M', u'ش'), - (0xFEB9, 'M', u'ص'), - (0xFEBD, 'M', u'ض'), - (0xFEC1, 'M', u'ط'), - (0xFEC5, 'M', u'ظ'), - (0xFEC9, 'M', u'ع'), - (0xFECD, 'M', u'غ'), - (0xFED1, 'M', u'ف'), - (0xFED5, 'M', u'ق'), - (0xFED9, 'M', u'ك'), - (0xFEDD, 'M', u'ل'), - (0xFEE1, 'M', u'م'), - (0xFEE5, 'M', u'ن'), - (0xFEE9, 'M', u'ه'), - (0xFEED, 'M', u'و'), - (0xFEEF, 'M', u'ى'), - (0xFEF1, 'M', u'ي'), - (0xFEF5, 'M', u'لآ'), - (0xFEF7, 'M', u'لأ'), - (0xFEF9, 'M', u'لإ'), - (0xFEFB, 'M', u'لا'), - (0xFEFD, 'X'), - (0xFEFF, 'I'), - (0xFF00, 'X'), - (0xFF01, '3', u'!'), - (0xFF02, '3', u'"'), - ] - -def _seg_49(): - return [ - (0xFF03, '3', u'#'), - (0xFF04, '3', u'$'), - (0xFF05, '3', u'%'), - (0xFF06, '3', u'&'), - (0xFF07, '3', u'\''), - (0xFF08, '3', u'('), - (0xFF09, '3', u')'), - (0xFF0A, '3', u'*'), - (0xFF0B, '3', u'+'), - (0xFF0C, '3', u','), - (0xFF0D, 'M', u'-'), - (0xFF0E, 'M', u'.'), - (0xFF0F, '3', u'/'), - (0xFF10, 'M', u'0'), - (0xFF11, 'M', u'1'), - (0xFF12, 'M', u'2'), - (0xFF13, 'M', u'3'), - (0xFF14, 'M', u'4'), - (0xFF15, 'M', u'5'), - (0xFF16, 'M', u'6'), - (0xFF17, 'M', u'7'), - (0xFF18, 'M', u'8'), - (0xFF19, 'M', u'9'), - (0xFF1A, '3', u':'), - (0xFF1B, '3', u';'), - (0xFF1C, '3', u'<'), - (0xFF1D, '3', u'='), - (0xFF1E, '3', u'>'), - (0xFF1F, '3', u'?'), - (0xFF20, '3', u'@'), - (0xFF21, 'M', u'a'), - (0xFF22, 'M', u'b'), - (0xFF23, 'M', u'c'), - (0xFF24, 'M', u'd'), - (0xFF25, 'M', u'e'), - (0xFF26, 'M', u'f'), - (0xFF27, 'M', u'g'), - (0xFF28, 'M', u'h'), - (0xFF29, 'M', u'i'), - (0xFF2A, 'M', u'j'), - (0xFF2B, 'M', u'k'), - (0xFF2C, 'M', u'l'), - (0xFF2D, 'M', u'm'), - (0xFF2E, 'M', u'n'), - (0xFF2F, 'M', u'o'), - (0xFF30, 'M', u'p'), - (0xFF31, 'M', u'q'), - (0xFF32, 'M', u'r'), - (0xFF33, 'M', u's'), - (0xFF34, 'M', u't'), - (0xFF35, 'M', u'u'), - (0xFF36, 'M', u'v'), - (0xFF37, 'M', u'w'), - (0xFF38, 'M', u'x'), - (0xFF39, 'M', u'y'), - (0xFF3A, 'M', u'z'), - (0xFF3B, '3', u'['), - (0xFF3C, '3', u'\\'), - (0xFF3D, '3', u']'), - (0xFF3E, '3', u'^'), - (0xFF3F, '3', u'_'), - (0xFF40, '3', u'`'), - (0xFF41, 'M', u'a'), - (0xFF42, 'M', u'b'), - (0xFF43, 'M', u'c'), - (0xFF44, 'M', u'd'), - (0xFF45, 'M', u'e'), - (0xFF46, 'M', u'f'), - (0xFF47, 'M', u'g'), - (0xFF48, 'M', u'h'), - (0xFF49, 'M', u'i'), - (0xFF4A, 'M', u'j'), - (0xFF4B, 'M', u'k'), - (0xFF4C, 'M', u'l'), - (0xFF4D, 'M', u'm'), - (0xFF4E, 'M', u'n'), - (0xFF4F, 'M', u'o'), - (0xFF50, 'M', u'p'), - (0xFF51, 'M', u'q'), - (0xFF52, 'M', u'r'), - (0xFF53, 'M', u's'), - (0xFF54, 'M', u't'), - (0xFF55, 'M', u'u'), - (0xFF56, 'M', u'v'), - (0xFF57, 'M', u'w'), - (0xFF58, 'M', u'x'), - (0xFF59, 'M', u'y'), - (0xFF5A, 'M', u'z'), - (0xFF5B, '3', u'{'), - (0xFF5C, '3', u'|'), - (0xFF5D, '3', u'}'), - (0xFF5E, '3', u'~'), - (0xFF5F, 'M', u'⦅'), - (0xFF60, 'M', u'⦆'), - (0xFF61, 'M', u'.'), - (0xFF62, 'M', u'「'), - (0xFF63, 'M', u'」'), - (0xFF64, 'M', u'、'), - (0xFF65, 'M', u'・'), - (0xFF66, 'M', u'ヲ'), - ] - -def _seg_50(): - return [ - (0xFF67, 'M', u'ァ'), - (0xFF68, 'M', u'ィ'), - (0xFF69, 'M', u'ゥ'), - (0xFF6A, 'M', u'ェ'), - (0xFF6B, 'M', u'ォ'), - (0xFF6C, 'M', u'ャ'), - (0xFF6D, 'M', u'ュ'), - (0xFF6E, 'M', u'ョ'), - (0xFF6F, 'M', u'ッ'), - (0xFF70, 'M', u'ー'), - (0xFF71, 'M', u'ア'), - (0xFF72, 'M', u'イ'), - (0xFF73, 'M', u'ウ'), - (0xFF74, 'M', u'エ'), - (0xFF75, 'M', u'オ'), - (0xFF76, 'M', u'カ'), - (0xFF77, 'M', u'キ'), - (0xFF78, 'M', u'ク'), - (0xFF79, 'M', u'ケ'), - (0xFF7A, 'M', u'コ'), - (0xFF7B, 'M', u'サ'), - (0xFF7C, 'M', u'シ'), - (0xFF7D, 'M', u'ス'), - (0xFF7E, 'M', u'セ'), - (0xFF7F, 'M', u'ソ'), - (0xFF80, 'M', u'タ'), - (0xFF81, 'M', u'チ'), - (0xFF82, 'M', u'ツ'), - (0xFF83, 'M', u'テ'), - (0xFF84, 'M', u'ト'), - (0xFF85, 'M', u'ナ'), - (0xFF86, 'M', u'ニ'), - (0xFF87, 'M', u'ヌ'), - (0xFF88, 'M', u'ネ'), - (0xFF89, 'M', u'ノ'), - (0xFF8A, 'M', u'ハ'), - (0xFF8B, 'M', u'ヒ'), - (0xFF8C, 'M', u'フ'), - (0xFF8D, 'M', u'ヘ'), - (0xFF8E, 'M', u'ホ'), - (0xFF8F, 'M', u'マ'), - (0xFF90, 'M', u'ミ'), - (0xFF91, 'M', u'ム'), - (0xFF92, 'M', u'メ'), - (0xFF93, 'M', u'モ'), - (0xFF94, 'M', u'ヤ'), - (0xFF95, 'M', u'ユ'), - (0xFF96, 'M', u'ヨ'), - (0xFF97, 'M', u'ラ'), - (0xFF98, 'M', u'リ'), - (0xFF99, 'M', u'ル'), - (0xFF9A, 'M', u'レ'), - (0xFF9B, 'M', u'ロ'), - (0xFF9C, 'M', u'ワ'), - (0xFF9D, 'M', u'ン'), - (0xFF9E, 'M', u'゙'), - (0xFF9F, 'M', u'゚'), - (0xFFA0, 'X'), - (0xFFA1, 'M', u'ᄀ'), - (0xFFA2, 'M', u'ᄁ'), - (0xFFA3, 'M', u'ᆪ'), - (0xFFA4, 'M', u'ᄂ'), - (0xFFA5, 'M', u'ᆬ'), - (0xFFA6, 'M', u'ᆭ'), - (0xFFA7, 'M', u'ᄃ'), - (0xFFA8, 'M', u'ᄄ'), - (0xFFA9, 'M', u'ᄅ'), - (0xFFAA, 'M', u'ᆰ'), - (0xFFAB, 'M', u'ᆱ'), - (0xFFAC, 'M', u'ᆲ'), - (0xFFAD, 'M', u'ᆳ'), - (0xFFAE, 'M', u'ᆴ'), - (0xFFAF, 'M', u'ᆵ'), - (0xFFB0, 'M', u'ᄚ'), - (0xFFB1, 'M', u'ᄆ'), - (0xFFB2, 'M', u'ᄇ'), - (0xFFB3, 'M', u'ᄈ'), - (0xFFB4, 'M', u'ᄡ'), - (0xFFB5, 'M', u'ᄉ'), - (0xFFB6, 'M', u'ᄊ'), - (0xFFB7, 'M', u'ᄋ'), - (0xFFB8, 'M', u'ᄌ'), - (0xFFB9, 'M', u'ᄍ'), - (0xFFBA, 'M', u'ᄎ'), - (0xFFBB, 'M', u'ᄏ'), - (0xFFBC, 'M', u'ᄐ'), - (0xFFBD, 'M', u'ᄑ'), - (0xFFBE, 'M', u'ᄒ'), - (0xFFBF, 'X'), - (0xFFC2, 'M', u'ᅡ'), - (0xFFC3, 'M', u'ᅢ'), - (0xFFC4, 'M', u'ᅣ'), - (0xFFC5, 'M', u'ᅤ'), - (0xFFC6, 'M', u'ᅥ'), - (0xFFC7, 'M', u'ᅦ'), - (0xFFC8, 'X'), - (0xFFCA, 'M', u'ᅧ'), - (0xFFCB, 'M', u'ᅨ'), - (0xFFCC, 'M', u'ᅩ'), - (0xFFCD, 'M', u'ᅪ'), - ] - -def _seg_51(): - return [ - (0xFFCE, 'M', u'ᅫ'), - (0xFFCF, 'M', u'ᅬ'), - (0xFFD0, 'X'), - (0xFFD2, 'M', u'ᅭ'), - (0xFFD3, 'M', u'ᅮ'), - (0xFFD4, 'M', u'ᅯ'), - (0xFFD5, 'M', u'ᅰ'), - (0xFFD6, 'M', u'ᅱ'), - (0xFFD7, 'M', u'ᅲ'), - (0xFFD8, 'X'), - (0xFFDA, 'M', u'ᅳ'), - (0xFFDB, 'M', u'ᅴ'), - (0xFFDC, 'M', u'ᅵ'), - (0xFFDD, 'X'), - (0xFFE0, 'M', u'¢'), - (0xFFE1, 'M', u'£'), - (0xFFE2, 'M', u'¬'), - (0xFFE3, '3', u' ̄'), - (0xFFE4, 'M', u'¦'), - (0xFFE5, 'M', u'¥'), - (0xFFE6, 'M', u'₩'), - (0xFFE7, 'X'), - (0xFFE8, 'M', u'│'), - (0xFFE9, 'M', u'←'), - (0xFFEA, 'M', u'↑'), - (0xFFEB, 'M', u'→'), - (0xFFEC, 'M', u'↓'), - (0xFFED, 'M', u'■'), - (0xFFEE, 'M', u'○'), - (0xFFEF, 'X'), - (0x10000, 'V'), - (0x1000C, 'X'), - (0x1000D, 'V'), - (0x10027, 'X'), - (0x10028, 'V'), - (0x1003B, 'X'), - (0x1003C, 'V'), - (0x1003E, 'X'), - (0x1003F, 'V'), - (0x1004E, 'X'), - (0x10050, 'V'), - (0x1005E, 'X'), - (0x10080, 'V'), - (0x100FB, 'X'), - (0x10100, 'V'), - (0x10103, 'X'), - (0x10107, 'V'), - (0x10134, 'X'), - (0x10137, 'V'), - (0x1018B, 'X'), - (0x10190, 'V'), - (0x1019C, 'X'), - (0x101D0, 'V'), - (0x101FE, 'X'), - (0x10280, 'V'), - (0x1029D, 'X'), - (0x102A0, 'V'), - (0x102D1, 'X'), - (0x10300, 'V'), - (0x1031F, 'X'), - (0x10320, 'V'), - (0x10324, 'X'), - (0x10330, 'V'), - (0x1034B, 'X'), - (0x10380, 'V'), - (0x1039E, 'X'), - (0x1039F, 'V'), - (0x103C4, 'X'), - (0x103C8, 'V'), - (0x103D6, 'X'), - (0x10400, 'M', u'𐐨'), - (0x10401, 'M', u'𐐩'), - (0x10402, 'M', u'𐐪'), - (0x10403, 'M', u'𐐫'), - (0x10404, 'M', u'𐐬'), - (0x10405, 'M', u'𐐭'), - (0x10406, 'M', u'𐐮'), - (0x10407, 'M', u'𐐯'), - (0x10408, 'M', u'𐐰'), - (0x10409, 'M', u'𐐱'), - (0x1040A, 'M', u'𐐲'), - (0x1040B, 'M', u'𐐳'), - (0x1040C, 'M', u'𐐴'), - (0x1040D, 'M', u'𐐵'), - (0x1040E, 'M', u'𐐶'), - (0x1040F, 'M', u'𐐷'), - (0x10410, 'M', u'𐐸'), - (0x10411, 'M', u'𐐹'), - (0x10412, 'M', u'𐐺'), - (0x10413, 'M', u'𐐻'), - (0x10414, 'M', u'𐐼'), - (0x10415, 'M', u'𐐽'), - (0x10416, 'M', u'𐐾'), - (0x10417, 'M', u'𐐿'), - (0x10418, 'M', u'𐑀'), - (0x10419, 'M', u'𐑁'), - (0x1041A, 'M', u'𐑂'), - (0x1041B, 'M', u'𐑃'), - (0x1041C, 'M', u'𐑄'), - (0x1041D, 'M', u'𐑅'), - ] - -def _seg_52(): - return [ - (0x1041E, 'M', u'𐑆'), - (0x1041F, 'M', u'𐑇'), - (0x10420, 'M', u'𐑈'), - (0x10421, 'M', u'𐑉'), - (0x10422, 'M', u'𐑊'), - (0x10423, 'M', u'𐑋'), - (0x10424, 'M', u'𐑌'), - (0x10425, 'M', u'𐑍'), - (0x10426, 'M', u'𐑎'), - (0x10427, 'M', u'𐑏'), - (0x10428, 'V'), - (0x1049E, 'X'), - (0x104A0, 'V'), - (0x104AA, 'X'), - (0x10800, 'V'), - (0x10806, 'X'), - (0x10808, 'V'), - (0x10809, 'X'), - (0x1080A, 'V'), - (0x10836, 'X'), - (0x10837, 'V'), - (0x10839, 'X'), - (0x1083C, 'V'), - (0x1083D, 'X'), - (0x1083F, 'V'), - (0x10856, 'X'), - (0x10857, 'V'), - (0x10860, 'X'), - (0x10900, 'V'), - (0x1091C, 'X'), - (0x1091F, 'V'), - (0x1093A, 'X'), - (0x1093F, 'V'), - (0x10940, 'X'), - (0x10980, 'V'), - (0x109B8, 'X'), - (0x109BE, 'V'), - (0x109C0, 'X'), - (0x10A00, 'V'), - (0x10A04, 'X'), - (0x10A05, 'V'), - (0x10A07, 'X'), - (0x10A0C, 'V'), - (0x10A14, 'X'), - (0x10A15, 'V'), - (0x10A18, 'X'), - (0x10A19, 'V'), - (0x10A34, 'X'), - (0x10A38, 'V'), - (0x10A3B, 'X'), - (0x10A3F, 'V'), - (0x10A48, 'X'), - (0x10A50, 'V'), - (0x10A59, 'X'), - (0x10A60, 'V'), - (0x10A80, 'X'), - (0x10B00, 'V'), - (0x10B36, 'X'), - (0x10B39, 'V'), - (0x10B56, 'X'), - (0x10B58, 'V'), - (0x10B73, 'X'), - (0x10B78, 'V'), - (0x10B80, 'X'), - (0x10C00, 'V'), - (0x10C49, 'X'), - (0x10E60, 'V'), - (0x10E7F, 'X'), - (0x11000, 'V'), - (0x1104E, 'X'), - (0x11052, 'V'), - (0x11070, 'X'), - (0x11080, 'V'), - (0x110BD, 'X'), - (0x110BE, 'V'), - (0x110C2, 'X'), - (0x110D0, 'V'), - (0x110E9, 'X'), - (0x110F0, 'V'), - (0x110FA, 'X'), - (0x11100, 'V'), - (0x11135, 'X'), - (0x11136, 'V'), - (0x11144, 'X'), - (0x11180, 'V'), - (0x111C9, 'X'), - (0x111D0, 'V'), - (0x111DA, 'X'), - (0x11680, 'V'), - (0x116B8, 'X'), - (0x116C0, 'V'), - (0x116CA, 'X'), - (0x12000, 'V'), - (0x1236F, 'X'), - (0x12400, 'V'), - (0x12463, 'X'), - (0x12470, 'V'), - (0x12474, 'X'), - (0x13000, 'V'), - (0x1342F, 'X'), - ] - -def _seg_53(): - return [ - (0x16800, 'V'), - (0x16A39, 'X'), - (0x16F00, 'V'), - (0x16F45, 'X'), - (0x16F50, 'V'), - (0x16F7F, 'X'), - (0x16F8F, 'V'), - (0x16FA0, 'X'), - (0x1B000, 'V'), - (0x1B002, 'X'), - (0x1D000, 'V'), - (0x1D0F6, 'X'), - (0x1D100, 'V'), - (0x1D127, 'X'), - (0x1D129, 'V'), - (0x1D15E, 'M', u'𝅗𝅥'), - (0x1D15F, 'M', u'𝅘𝅥'), - (0x1D160, 'M', u'𝅘𝅥𝅮'), - (0x1D161, 'M', u'𝅘𝅥𝅯'), - (0x1D162, 'M', u'𝅘𝅥𝅰'), - (0x1D163, 'M', u'𝅘𝅥𝅱'), - (0x1D164, 'M', u'𝅘𝅥𝅲'), - (0x1D165, 'V'), - (0x1D173, 'X'), - (0x1D17B, 'V'), - (0x1D1BB, 'M', u'𝆹𝅥'), - (0x1D1BC, 'M', u'𝆺𝅥'), - (0x1D1BD, 'M', u'𝆹𝅥𝅮'), - (0x1D1BE, 'M', u'𝆺𝅥𝅮'), - (0x1D1BF, 'M', u'𝆹𝅥𝅯'), - (0x1D1C0, 'M', u'𝆺𝅥𝅯'), - (0x1D1C1, 'V'), - (0x1D1DE, 'X'), - (0x1D200, 'V'), - (0x1D246, 'X'), - (0x1D300, 'V'), - (0x1D357, 'X'), - (0x1D360, 'V'), - (0x1D372, 'X'), - (0x1D400, 'M', u'a'), - (0x1D401, 'M', u'b'), - (0x1D402, 'M', u'c'), - (0x1D403, 'M', u'd'), - (0x1D404, 'M', u'e'), - (0x1D405, 'M', u'f'), - (0x1D406, 'M', u'g'), - (0x1D407, 'M', u'h'), - (0x1D408, 'M', u'i'), - (0x1D409, 'M', u'j'), - (0x1D40A, 'M', u'k'), - (0x1D40B, 'M', u'l'), - (0x1D40C, 'M', u'm'), - (0x1D40D, 'M', u'n'), - (0x1D40E, 'M', u'o'), - (0x1D40F, 'M', u'p'), - (0x1D410, 'M', u'q'), - (0x1D411, 'M', u'r'), - (0x1D412, 'M', u's'), - (0x1D413, 'M', u't'), - (0x1D414, 'M', u'u'), - (0x1D415, 'M', u'v'), - (0x1D416, 'M', u'w'), - (0x1D417, 'M', u'x'), - (0x1D418, 'M', u'y'), - (0x1D419, 'M', u'z'), - (0x1D41A, 'M', u'a'), - (0x1D41B, 'M', u'b'), - (0x1D41C, 'M', u'c'), - (0x1D41D, 'M', u'd'), - (0x1D41E, 'M', u'e'), - (0x1D41F, 'M', u'f'), - (0x1D420, 'M', u'g'), - (0x1D421, 'M', u'h'), - (0x1D422, 'M', u'i'), - (0x1D423, 'M', u'j'), - (0x1D424, 'M', u'k'), - (0x1D425, 'M', u'l'), - (0x1D426, 'M', u'm'), - (0x1D427, 'M', u'n'), - (0x1D428, 'M', u'o'), - (0x1D429, 'M', u'p'), - (0x1D42A, 'M', u'q'), - (0x1D42B, 'M', u'r'), - (0x1D42C, 'M', u's'), - (0x1D42D, 'M', u't'), - (0x1D42E, 'M', u'u'), - (0x1D42F, 'M', u'v'), - (0x1D430, 'M', u'w'), - (0x1D431, 'M', u'x'), - (0x1D432, 'M', u'y'), - (0x1D433, 'M', u'z'), - (0x1D434, 'M', u'a'), - (0x1D435, 'M', u'b'), - (0x1D436, 'M', u'c'), - (0x1D437, 'M', u'd'), - (0x1D438, 'M', u'e'), - (0x1D439, 'M', u'f'), - (0x1D43A, 'M', u'g'), - (0x1D43B, 'M', u'h'), - (0x1D43C, 'M', u'i'), - ] - -def _seg_54(): - return [ - (0x1D43D, 'M', u'j'), - (0x1D43E, 'M', u'k'), - (0x1D43F, 'M', u'l'), - (0x1D440, 'M', u'm'), - (0x1D441, 'M', u'n'), - (0x1D442, 'M', u'o'), - (0x1D443, 'M', u'p'), - (0x1D444, 'M', u'q'), - (0x1D445, 'M', u'r'), - (0x1D446, 'M', u's'), - (0x1D447, 'M', u't'), - (0x1D448, 'M', u'u'), - (0x1D449, 'M', u'v'), - (0x1D44A, 'M', u'w'), - (0x1D44B, 'M', u'x'), - (0x1D44C, 'M', u'y'), - (0x1D44D, 'M', u'z'), - (0x1D44E, 'M', u'a'), - (0x1D44F, 'M', u'b'), - (0x1D450, 'M', u'c'), - (0x1D451, 'M', u'd'), - (0x1D452, 'M', u'e'), - (0x1D453, 'M', u'f'), - (0x1D454, 'M', u'g'), - (0x1D455, 'X'), - (0x1D456, 'M', u'i'), - (0x1D457, 'M', u'j'), - (0x1D458, 'M', u'k'), - (0x1D459, 'M', u'l'), - (0x1D45A, 'M', u'm'), - (0x1D45B, 'M', u'n'), - (0x1D45C, 'M', u'o'), - (0x1D45D, 'M', u'p'), - (0x1D45E, 'M', u'q'), - (0x1D45F, 'M', u'r'), - (0x1D460, 'M', u's'), - (0x1D461, 'M', u't'), - (0x1D462, 'M', u'u'), - (0x1D463, 'M', u'v'), - (0x1D464, 'M', u'w'), - (0x1D465, 'M', u'x'), - (0x1D466, 'M', u'y'), - (0x1D467, 'M', u'z'), - (0x1D468, 'M', u'a'), - (0x1D469, 'M', u'b'), - (0x1D46A, 'M', u'c'), - (0x1D46B, 'M', u'd'), - (0x1D46C, 'M', u'e'), - (0x1D46D, 'M', u'f'), - (0x1D46E, 'M', u'g'), - (0x1D46F, 'M', u'h'), - (0x1D470, 'M', u'i'), - (0x1D471, 'M', u'j'), - (0x1D472, 'M', u'k'), - (0x1D473, 'M', u'l'), - (0x1D474, 'M', u'm'), - (0x1D475, 'M', u'n'), - (0x1D476, 'M', u'o'), - (0x1D477, 'M', u'p'), - (0x1D478, 'M', u'q'), - (0x1D479, 'M', u'r'), - (0x1D47A, 'M', u's'), - (0x1D47B, 'M', u't'), - (0x1D47C, 'M', u'u'), - (0x1D47D, 'M', u'v'), - (0x1D47E, 'M', u'w'), - (0x1D47F, 'M', u'x'), - (0x1D480, 'M', u'y'), - (0x1D481, 'M', u'z'), - (0x1D482, 'M', u'a'), - (0x1D483, 'M', u'b'), - (0x1D484, 'M', u'c'), - (0x1D485, 'M', u'd'), - (0x1D486, 'M', u'e'), - (0x1D487, 'M', u'f'), - (0x1D488, 'M', u'g'), - (0x1D489, 'M', u'h'), - (0x1D48A, 'M', u'i'), - (0x1D48B, 'M', u'j'), - (0x1D48C, 'M', u'k'), - (0x1D48D, 'M', u'l'), - (0x1D48E, 'M', u'm'), - (0x1D48F, 'M', u'n'), - (0x1D490, 'M', u'o'), - (0x1D491, 'M', u'p'), - (0x1D492, 'M', u'q'), - (0x1D493, 'M', u'r'), - (0x1D494, 'M', u's'), - (0x1D495, 'M', u't'), - (0x1D496, 'M', u'u'), - (0x1D497, 'M', u'v'), - (0x1D498, 'M', u'w'), - (0x1D499, 'M', u'x'), - (0x1D49A, 'M', u'y'), - (0x1D49B, 'M', u'z'), - (0x1D49C, 'M', u'a'), - (0x1D49D, 'X'), - (0x1D49E, 'M', u'c'), - (0x1D49F, 'M', u'd'), - (0x1D4A0, 'X'), - ] - -def _seg_55(): - return [ - (0x1D4A2, 'M', u'g'), - (0x1D4A3, 'X'), - (0x1D4A5, 'M', u'j'), - (0x1D4A6, 'M', u'k'), - (0x1D4A7, 'X'), - (0x1D4A9, 'M', u'n'), - (0x1D4AA, 'M', u'o'), - (0x1D4AB, 'M', u'p'), - (0x1D4AC, 'M', u'q'), - (0x1D4AD, 'X'), - (0x1D4AE, 'M', u's'), - (0x1D4AF, 'M', u't'), - (0x1D4B0, 'M', u'u'), - (0x1D4B1, 'M', u'v'), - (0x1D4B2, 'M', u'w'), - (0x1D4B3, 'M', u'x'), - (0x1D4B4, 'M', u'y'), - (0x1D4B5, 'M', u'z'), - (0x1D4B6, 'M', u'a'), - (0x1D4B7, 'M', u'b'), - (0x1D4B8, 'M', u'c'), - (0x1D4B9, 'M', u'd'), - (0x1D4BA, 'X'), - (0x1D4BB, 'M', u'f'), - (0x1D4BC, 'X'), - (0x1D4BD, 'M', u'h'), - (0x1D4BE, 'M', u'i'), - (0x1D4BF, 'M', u'j'), - (0x1D4C0, 'M', u'k'), - (0x1D4C1, 'M', u'l'), - (0x1D4C2, 'M', u'm'), - (0x1D4C3, 'M', u'n'), - (0x1D4C4, 'X'), - (0x1D4C5, 'M', u'p'), - (0x1D4C6, 'M', u'q'), - (0x1D4C7, 'M', u'r'), - (0x1D4C8, 'M', u's'), - (0x1D4C9, 'M', u't'), - (0x1D4CA, 'M', u'u'), - (0x1D4CB, 'M', u'v'), - (0x1D4CC, 'M', u'w'), - (0x1D4CD, 'M', u'x'), - (0x1D4CE, 'M', u'y'), - (0x1D4CF, 'M', u'z'), - (0x1D4D0, 'M', u'a'), - (0x1D4D1, 'M', u'b'), - (0x1D4D2, 'M', u'c'), - (0x1D4D3, 'M', u'd'), - (0x1D4D4, 'M', u'e'), - (0x1D4D5, 'M', u'f'), - (0x1D4D6, 'M', u'g'), - (0x1D4D7, 'M', u'h'), - (0x1D4D8, 'M', u'i'), - (0x1D4D9, 'M', u'j'), - (0x1D4DA, 'M', u'k'), - (0x1D4DB, 'M', u'l'), - (0x1D4DC, 'M', u'm'), - (0x1D4DD, 'M', u'n'), - (0x1D4DE, 'M', u'o'), - (0x1D4DF, 'M', u'p'), - (0x1D4E0, 'M', u'q'), - (0x1D4E1, 'M', u'r'), - (0x1D4E2, 'M', u's'), - (0x1D4E3, 'M', u't'), - (0x1D4E4, 'M', u'u'), - (0x1D4E5, 'M', u'v'), - (0x1D4E6, 'M', u'w'), - (0x1D4E7, 'M', u'x'), - (0x1D4E8, 'M', u'y'), - (0x1D4E9, 'M', u'z'), - (0x1D4EA, 'M', u'a'), - (0x1D4EB, 'M', u'b'), - (0x1D4EC, 'M', u'c'), - (0x1D4ED, 'M', u'd'), - (0x1D4EE, 'M', u'e'), - (0x1D4EF, 'M', u'f'), - (0x1D4F0, 'M', u'g'), - (0x1D4F1, 'M', u'h'), - (0x1D4F2, 'M', u'i'), - (0x1D4F3, 'M', u'j'), - (0x1D4F4, 'M', u'k'), - (0x1D4F5, 'M', u'l'), - (0x1D4F6, 'M', u'm'), - (0x1D4F7, 'M', u'n'), - (0x1D4F8, 'M', u'o'), - (0x1D4F9, 'M', u'p'), - (0x1D4FA, 'M', u'q'), - (0x1D4FB, 'M', u'r'), - (0x1D4FC, 'M', u's'), - (0x1D4FD, 'M', u't'), - (0x1D4FE, 'M', u'u'), - (0x1D4FF, 'M', u'v'), - (0x1D500, 'M', u'w'), - (0x1D501, 'M', u'x'), - (0x1D502, 'M', u'y'), - (0x1D503, 'M', u'z'), - (0x1D504, 'M', u'a'), - (0x1D505, 'M', u'b'), - (0x1D506, 'X'), - (0x1D507, 'M', u'd'), - ] - -def _seg_56(): - return [ - (0x1D508, 'M', u'e'), - (0x1D509, 'M', u'f'), - (0x1D50A, 'M', u'g'), - (0x1D50B, 'X'), - (0x1D50D, 'M', u'j'), - (0x1D50E, 'M', u'k'), - (0x1D50F, 'M', u'l'), - (0x1D510, 'M', u'm'), - (0x1D511, 'M', u'n'), - (0x1D512, 'M', u'o'), - (0x1D513, 'M', u'p'), - (0x1D514, 'M', u'q'), - (0x1D515, 'X'), - (0x1D516, 'M', u's'), - (0x1D517, 'M', u't'), - (0x1D518, 'M', u'u'), - (0x1D519, 'M', u'v'), - (0x1D51A, 'M', u'w'), - (0x1D51B, 'M', u'x'), - (0x1D51C, 'M', u'y'), - (0x1D51D, 'X'), - (0x1D51E, 'M', u'a'), - (0x1D51F, 'M', u'b'), - (0x1D520, 'M', u'c'), - (0x1D521, 'M', u'd'), - (0x1D522, 'M', u'e'), - (0x1D523, 'M', u'f'), - (0x1D524, 'M', u'g'), - (0x1D525, 'M', u'h'), - (0x1D526, 'M', u'i'), - (0x1D527, 'M', u'j'), - (0x1D528, 'M', u'k'), - (0x1D529, 'M', u'l'), - (0x1D52A, 'M', u'm'), - (0x1D52B, 'M', u'n'), - (0x1D52C, 'M', u'o'), - (0x1D52D, 'M', u'p'), - (0x1D52E, 'M', u'q'), - (0x1D52F, 'M', u'r'), - (0x1D530, 'M', u's'), - (0x1D531, 'M', u't'), - (0x1D532, 'M', u'u'), - (0x1D533, 'M', u'v'), - (0x1D534, 'M', u'w'), - (0x1D535, 'M', u'x'), - (0x1D536, 'M', u'y'), - (0x1D537, 'M', u'z'), - (0x1D538, 'M', u'a'), - (0x1D539, 'M', u'b'), - (0x1D53A, 'X'), - (0x1D53B, 'M', u'd'), - (0x1D53C, 'M', u'e'), - (0x1D53D, 'M', u'f'), - (0x1D53E, 'M', u'g'), - (0x1D53F, 'X'), - (0x1D540, 'M', u'i'), - (0x1D541, 'M', u'j'), - (0x1D542, 'M', u'k'), - (0x1D543, 'M', u'l'), - (0x1D544, 'M', u'm'), - (0x1D545, 'X'), - (0x1D546, 'M', u'o'), - (0x1D547, 'X'), - (0x1D54A, 'M', u's'), - (0x1D54B, 'M', u't'), - (0x1D54C, 'M', u'u'), - (0x1D54D, 'M', u'v'), - (0x1D54E, 'M', u'w'), - (0x1D54F, 'M', u'x'), - (0x1D550, 'M', u'y'), - (0x1D551, 'X'), - (0x1D552, 'M', u'a'), - (0x1D553, 'M', u'b'), - (0x1D554, 'M', u'c'), - (0x1D555, 'M', u'd'), - (0x1D556, 'M', u'e'), - (0x1D557, 'M', u'f'), - (0x1D558, 'M', u'g'), - (0x1D559, 'M', u'h'), - (0x1D55A, 'M', u'i'), - (0x1D55B, 'M', u'j'), - (0x1D55C, 'M', u'k'), - (0x1D55D, 'M', u'l'), - (0x1D55E, 'M', u'm'), - (0x1D55F, 'M', u'n'), - (0x1D560, 'M', u'o'), - (0x1D561, 'M', u'p'), - (0x1D562, 'M', u'q'), - (0x1D563, 'M', u'r'), - (0x1D564, 'M', u's'), - (0x1D565, 'M', u't'), - (0x1D566, 'M', u'u'), - (0x1D567, 'M', u'v'), - (0x1D568, 'M', u'w'), - (0x1D569, 'M', u'x'), - (0x1D56A, 'M', u'y'), - (0x1D56B, 'M', u'z'), - (0x1D56C, 'M', u'a'), - (0x1D56D, 'M', u'b'), - (0x1D56E, 'M', u'c'), - ] - -def _seg_57(): - return [ - (0x1D56F, 'M', u'd'), - (0x1D570, 'M', u'e'), - (0x1D571, 'M', u'f'), - (0x1D572, 'M', u'g'), - (0x1D573, 'M', u'h'), - (0x1D574, 'M', u'i'), - (0x1D575, 'M', u'j'), - (0x1D576, 'M', u'k'), - (0x1D577, 'M', u'l'), - (0x1D578, 'M', u'm'), - (0x1D579, 'M', u'n'), - (0x1D57A, 'M', u'o'), - (0x1D57B, 'M', u'p'), - (0x1D57C, 'M', u'q'), - (0x1D57D, 'M', u'r'), - (0x1D57E, 'M', u's'), - (0x1D57F, 'M', u't'), - (0x1D580, 'M', u'u'), - (0x1D581, 'M', u'v'), - (0x1D582, 'M', u'w'), - (0x1D583, 'M', u'x'), - (0x1D584, 'M', u'y'), - (0x1D585, 'M', u'z'), - (0x1D586, 'M', u'a'), - (0x1D587, 'M', u'b'), - (0x1D588, 'M', u'c'), - (0x1D589, 'M', u'd'), - (0x1D58A, 'M', u'e'), - (0x1D58B, 'M', u'f'), - (0x1D58C, 'M', u'g'), - (0x1D58D, 'M', u'h'), - (0x1D58E, 'M', u'i'), - (0x1D58F, 'M', u'j'), - (0x1D590, 'M', u'k'), - (0x1D591, 'M', u'l'), - (0x1D592, 'M', u'm'), - (0x1D593, 'M', u'n'), - (0x1D594, 'M', u'o'), - (0x1D595, 'M', u'p'), - (0x1D596, 'M', u'q'), - (0x1D597, 'M', u'r'), - (0x1D598, 'M', u's'), - (0x1D599, 'M', u't'), - (0x1D59A, 'M', u'u'), - (0x1D59B, 'M', u'v'), - (0x1D59C, 'M', u'w'), - (0x1D59D, 'M', u'x'), - (0x1D59E, 'M', u'y'), - (0x1D59F, 'M', u'z'), - (0x1D5A0, 'M', u'a'), - (0x1D5A1, 'M', u'b'), - (0x1D5A2, 'M', u'c'), - (0x1D5A3, 'M', u'd'), - (0x1D5A4, 'M', u'e'), - (0x1D5A5, 'M', u'f'), - (0x1D5A6, 'M', u'g'), - (0x1D5A7, 'M', u'h'), - (0x1D5A8, 'M', u'i'), - (0x1D5A9, 'M', u'j'), - (0x1D5AA, 'M', u'k'), - (0x1D5AB, 'M', u'l'), - (0x1D5AC, 'M', u'm'), - (0x1D5AD, 'M', u'n'), - (0x1D5AE, 'M', u'o'), - (0x1D5AF, 'M', u'p'), - (0x1D5B0, 'M', u'q'), - (0x1D5B1, 'M', u'r'), - (0x1D5B2, 'M', u's'), - (0x1D5B3, 'M', u't'), - (0x1D5B4, 'M', u'u'), - (0x1D5B5, 'M', u'v'), - (0x1D5B6, 'M', u'w'), - (0x1D5B7, 'M', u'x'), - (0x1D5B8, 'M', u'y'), - (0x1D5B9, 'M', u'z'), - (0x1D5BA, 'M', u'a'), - (0x1D5BB, 'M', u'b'), - (0x1D5BC, 'M', u'c'), - (0x1D5BD, 'M', u'd'), - (0x1D5BE, 'M', u'e'), - (0x1D5BF, 'M', u'f'), - (0x1D5C0, 'M', u'g'), - (0x1D5C1, 'M', u'h'), - (0x1D5C2, 'M', u'i'), - (0x1D5C3, 'M', u'j'), - (0x1D5C4, 'M', u'k'), - (0x1D5C5, 'M', u'l'), - (0x1D5C6, 'M', u'm'), - (0x1D5C7, 'M', u'n'), - (0x1D5C8, 'M', u'o'), - (0x1D5C9, 'M', u'p'), - (0x1D5CA, 'M', u'q'), - (0x1D5CB, 'M', u'r'), - (0x1D5CC, 'M', u's'), - (0x1D5CD, 'M', u't'), - (0x1D5CE, 'M', u'u'), - (0x1D5CF, 'M', u'v'), - (0x1D5D0, 'M', u'w'), - (0x1D5D1, 'M', u'x'), - (0x1D5D2, 'M', u'y'), - ] - -def _seg_58(): - return [ - (0x1D5D3, 'M', u'z'), - (0x1D5D4, 'M', u'a'), - (0x1D5D5, 'M', u'b'), - (0x1D5D6, 'M', u'c'), - (0x1D5D7, 'M', u'd'), - (0x1D5D8, 'M', u'e'), - (0x1D5D9, 'M', u'f'), - (0x1D5DA, 'M', u'g'), - (0x1D5DB, 'M', u'h'), - (0x1D5DC, 'M', u'i'), - (0x1D5DD, 'M', u'j'), - (0x1D5DE, 'M', u'k'), - (0x1D5DF, 'M', u'l'), - (0x1D5E0, 'M', u'm'), - (0x1D5E1, 'M', u'n'), - (0x1D5E2, 'M', u'o'), - (0x1D5E3, 'M', u'p'), - (0x1D5E4, 'M', u'q'), - (0x1D5E5, 'M', u'r'), - (0x1D5E6, 'M', u's'), - (0x1D5E7, 'M', u't'), - (0x1D5E8, 'M', u'u'), - (0x1D5E9, 'M', u'v'), - (0x1D5EA, 'M', u'w'), - (0x1D5EB, 'M', u'x'), - (0x1D5EC, 'M', u'y'), - (0x1D5ED, 'M', u'z'), - (0x1D5EE, 'M', u'a'), - (0x1D5EF, 'M', u'b'), - (0x1D5F0, 'M', u'c'), - (0x1D5F1, 'M', u'd'), - (0x1D5F2, 'M', u'e'), - (0x1D5F3, 'M', u'f'), - (0x1D5F4, 'M', u'g'), - (0x1D5F5, 'M', u'h'), - (0x1D5F6, 'M', u'i'), - (0x1D5F7, 'M', u'j'), - (0x1D5F8, 'M', u'k'), - (0x1D5F9, 'M', u'l'), - (0x1D5FA, 'M', u'm'), - (0x1D5FB, 'M', u'n'), - (0x1D5FC, 'M', u'o'), - (0x1D5FD, 'M', u'p'), - (0x1D5FE, 'M', u'q'), - (0x1D5FF, 'M', u'r'), - (0x1D600, 'M', u's'), - (0x1D601, 'M', u't'), - (0x1D602, 'M', u'u'), - (0x1D603, 'M', u'v'), - (0x1D604, 'M', u'w'), - (0x1D605, 'M', u'x'), - (0x1D606, 'M', u'y'), - (0x1D607, 'M', u'z'), - (0x1D608, 'M', u'a'), - (0x1D609, 'M', u'b'), - (0x1D60A, 'M', u'c'), - (0x1D60B, 'M', u'd'), - (0x1D60C, 'M', u'e'), - (0x1D60D, 'M', u'f'), - (0x1D60E, 'M', u'g'), - (0x1D60F, 'M', u'h'), - (0x1D610, 'M', u'i'), - (0x1D611, 'M', u'j'), - (0x1D612, 'M', u'k'), - (0x1D613, 'M', u'l'), - (0x1D614, 'M', u'm'), - (0x1D615, 'M', u'n'), - (0x1D616, 'M', u'o'), - (0x1D617, 'M', u'p'), - (0x1D618, 'M', u'q'), - (0x1D619, 'M', u'r'), - (0x1D61A, 'M', u's'), - (0x1D61B, 'M', u't'), - (0x1D61C, 'M', u'u'), - (0x1D61D, 'M', u'v'), - (0x1D61E, 'M', u'w'), - (0x1D61F, 'M', u'x'), - (0x1D620, 'M', u'y'), - (0x1D621, 'M', u'z'), - (0x1D622, 'M', u'a'), - (0x1D623, 'M', u'b'), - (0x1D624, 'M', u'c'), - (0x1D625, 'M', u'd'), - (0x1D626, 'M', u'e'), - (0x1D627, 'M', u'f'), - (0x1D628, 'M', u'g'), - (0x1D629, 'M', u'h'), - (0x1D62A, 'M', u'i'), - (0x1D62B, 'M', u'j'), - (0x1D62C, 'M', u'k'), - (0x1D62D, 'M', u'l'), - (0x1D62E, 'M', u'm'), - (0x1D62F, 'M', u'n'), - (0x1D630, 'M', u'o'), - (0x1D631, 'M', u'p'), - (0x1D632, 'M', u'q'), - (0x1D633, 'M', u'r'), - (0x1D634, 'M', u's'), - (0x1D635, 'M', u't'), - (0x1D636, 'M', u'u'), - ] - -def _seg_59(): - return [ - (0x1D637, 'M', u'v'), - (0x1D638, 'M', u'w'), - (0x1D639, 'M', u'x'), - (0x1D63A, 'M', u'y'), - (0x1D63B, 'M', u'z'), - (0x1D63C, 'M', u'a'), - (0x1D63D, 'M', u'b'), - (0x1D63E, 'M', u'c'), - (0x1D63F, 'M', u'd'), - (0x1D640, 'M', u'e'), - (0x1D641, 'M', u'f'), - (0x1D642, 'M', u'g'), - (0x1D643, 'M', u'h'), - (0x1D644, 'M', u'i'), - (0x1D645, 'M', u'j'), - (0x1D646, 'M', u'k'), - (0x1D647, 'M', u'l'), - (0x1D648, 'M', u'm'), - (0x1D649, 'M', u'n'), - (0x1D64A, 'M', u'o'), - (0x1D64B, 'M', u'p'), - (0x1D64C, 'M', u'q'), - (0x1D64D, 'M', u'r'), - (0x1D64E, 'M', u's'), - (0x1D64F, 'M', u't'), - (0x1D650, 'M', u'u'), - (0x1D651, 'M', u'v'), - (0x1D652, 'M', u'w'), - (0x1D653, 'M', u'x'), - (0x1D654, 'M', u'y'), - (0x1D655, 'M', u'z'), - (0x1D656, 'M', u'a'), - (0x1D657, 'M', u'b'), - (0x1D658, 'M', u'c'), - (0x1D659, 'M', u'd'), - (0x1D65A, 'M', u'e'), - (0x1D65B, 'M', u'f'), - (0x1D65C, 'M', u'g'), - (0x1D65D, 'M', u'h'), - (0x1D65E, 'M', u'i'), - (0x1D65F, 'M', u'j'), - (0x1D660, 'M', u'k'), - (0x1D661, 'M', u'l'), - (0x1D662, 'M', u'm'), - (0x1D663, 'M', u'n'), - (0x1D664, 'M', u'o'), - (0x1D665, 'M', u'p'), - (0x1D666, 'M', u'q'), - (0x1D667, 'M', u'r'), - (0x1D668, 'M', u's'), - (0x1D669, 'M', u't'), - (0x1D66A, 'M', u'u'), - (0x1D66B, 'M', u'v'), - (0x1D66C, 'M', u'w'), - (0x1D66D, 'M', u'x'), - (0x1D66E, 'M', u'y'), - (0x1D66F, 'M', u'z'), - (0x1D670, 'M', u'a'), - (0x1D671, 'M', u'b'), - (0x1D672, 'M', u'c'), - (0x1D673, 'M', u'd'), - (0x1D674, 'M', u'e'), - (0x1D675, 'M', u'f'), - (0x1D676, 'M', u'g'), - (0x1D677, 'M', u'h'), - (0x1D678, 'M', u'i'), - (0x1D679, 'M', u'j'), - (0x1D67A, 'M', u'k'), - (0x1D67B, 'M', u'l'), - (0x1D67C, 'M', u'm'), - (0x1D67D, 'M', u'n'), - (0x1D67E, 'M', u'o'), - (0x1D67F, 'M', u'p'), - (0x1D680, 'M', u'q'), - (0x1D681, 'M', u'r'), - (0x1D682, 'M', u's'), - (0x1D683, 'M', u't'), - (0x1D684, 'M', u'u'), - (0x1D685, 'M', u'v'), - (0x1D686, 'M', u'w'), - (0x1D687, 'M', u'x'), - (0x1D688, 'M', u'y'), - (0x1D689, 'M', u'z'), - (0x1D68A, 'M', u'a'), - (0x1D68B, 'M', u'b'), - (0x1D68C, 'M', u'c'), - (0x1D68D, 'M', u'd'), - (0x1D68E, 'M', u'e'), - (0x1D68F, 'M', u'f'), - (0x1D690, 'M', u'g'), - (0x1D691, 'M', u'h'), - (0x1D692, 'M', u'i'), - (0x1D693, 'M', u'j'), - (0x1D694, 'M', u'k'), - (0x1D695, 'M', u'l'), - (0x1D696, 'M', u'm'), - (0x1D697, 'M', u'n'), - (0x1D698, 'M', u'o'), - (0x1D699, 'M', u'p'), - (0x1D69A, 'M', u'q'), - ] - -def _seg_60(): - return [ - (0x1D69B, 'M', u'r'), - (0x1D69C, 'M', u's'), - (0x1D69D, 'M', u't'), - (0x1D69E, 'M', u'u'), - (0x1D69F, 'M', u'v'), - (0x1D6A0, 'M', u'w'), - (0x1D6A1, 'M', u'x'), - (0x1D6A2, 'M', u'y'), - (0x1D6A3, 'M', u'z'), - (0x1D6A4, 'M', u'ı'), - (0x1D6A5, 'M', u'ȷ'), - (0x1D6A6, 'X'), - (0x1D6A8, 'M', u'α'), - (0x1D6A9, 'M', u'β'), - (0x1D6AA, 'M', u'γ'), - (0x1D6AB, 'M', u'δ'), - (0x1D6AC, 'M', u'ε'), - (0x1D6AD, 'M', u'ζ'), - (0x1D6AE, 'M', u'η'), - (0x1D6AF, 'M', u'θ'), - (0x1D6B0, 'M', u'ι'), - (0x1D6B1, 'M', u'κ'), - (0x1D6B2, 'M', u'λ'), - (0x1D6B3, 'M', u'μ'), - (0x1D6B4, 'M', u'ν'), - (0x1D6B5, 'M', u'ξ'), - (0x1D6B6, 'M', u'ο'), - (0x1D6B7, 'M', u'π'), - (0x1D6B8, 'M', u'ρ'), - (0x1D6B9, 'M', u'θ'), - (0x1D6BA, 'M', u'σ'), - (0x1D6BB, 'M', u'τ'), - (0x1D6BC, 'M', u'υ'), - (0x1D6BD, 'M', u'φ'), - (0x1D6BE, 'M', u'χ'), - (0x1D6BF, 'M', u'ψ'), - (0x1D6C0, 'M', u'ω'), - (0x1D6C1, 'M', u'∇'), - (0x1D6C2, 'M', u'α'), - (0x1D6C3, 'M', u'β'), - (0x1D6C4, 'M', u'γ'), - (0x1D6C5, 'M', u'δ'), - (0x1D6C6, 'M', u'ε'), - (0x1D6C7, 'M', u'ζ'), - (0x1D6C8, 'M', u'η'), - (0x1D6C9, 'M', u'θ'), - (0x1D6CA, 'M', u'ι'), - (0x1D6CB, 'M', u'κ'), - (0x1D6CC, 'M', u'λ'), - (0x1D6CD, 'M', u'μ'), - (0x1D6CE, 'M', u'ν'), - (0x1D6CF, 'M', u'ξ'), - (0x1D6D0, 'M', u'ο'), - (0x1D6D1, 'M', u'π'), - (0x1D6D2, 'M', u'ρ'), - (0x1D6D3, 'M', u'σ'), - (0x1D6D5, 'M', u'τ'), - (0x1D6D6, 'M', u'υ'), - (0x1D6D7, 'M', u'φ'), - (0x1D6D8, 'M', u'χ'), - (0x1D6D9, 'M', u'ψ'), - (0x1D6DA, 'M', u'ω'), - (0x1D6DB, 'M', u'∂'), - (0x1D6DC, 'M', u'ε'), - (0x1D6DD, 'M', u'θ'), - (0x1D6DE, 'M', u'κ'), - (0x1D6DF, 'M', u'φ'), - (0x1D6E0, 'M', u'ρ'), - (0x1D6E1, 'M', u'π'), - (0x1D6E2, 'M', u'α'), - (0x1D6E3, 'M', u'β'), - (0x1D6E4, 'M', u'γ'), - (0x1D6E5, 'M', u'δ'), - (0x1D6E6, 'M', u'ε'), - (0x1D6E7, 'M', u'ζ'), - (0x1D6E8, 'M', u'η'), - (0x1D6E9, 'M', u'θ'), - (0x1D6EA, 'M', u'ι'), - (0x1D6EB, 'M', u'κ'), - (0x1D6EC, 'M', u'λ'), - (0x1D6ED, 'M', u'μ'), - (0x1D6EE, 'M', u'ν'), - (0x1D6EF, 'M', u'ξ'), - (0x1D6F0, 'M', u'ο'), - (0x1D6F1, 'M', u'π'), - (0x1D6F2, 'M', u'ρ'), - (0x1D6F3, 'M', u'θ'), - (0x1D6F4, 'M', u'σ'), - (0x1D6F5, 'M', u'τ'), - (0x1D6F6, 'M', u'υ'), - (0x1D6F7, 'M', u'φ'), - (0x1D6F8, 'M', u'χ'), - (0x1D6F9, 'M', u'ψ'), - (0x1D6FA, 'M', u'ω'), - (0x1D6FB, 'M', u'∇'), - (0x1D6FC, 'M', u'α'), - (0x1D6FD, 'M', u'β'), - (0x1D6FE, 'M', u'γ'), - (0x1D6FF, 'M', u'δ'), - (0x1D700, 'M', u'ε'), - ] - -def _seg_61(): - return [ - (0x1D701, 'M', u'ζ'), - (0x1D702, 'M', u'η'), - (0x1D703, 'M', u'θ'), - (0x1D704, 'M', u'ι'), - (0x1D705, 'M', u'κ'), - (0x1D706, 'M', u'λ'), - (0x1D707, 'M', u'μ'), - (0x1D708, 'M', u'ν'), - (0x1D709, 'M', u'ξ'), - (0x1D70A, 'M', u'ο'), - (0x1D70B, 'M', u'π'), - (0x1D70C, 'M', u'ρ'), - (0x1D70D, 'M', u'σ'), - (0x1D70F, 'M', u'τ'), - (0x1D710, 'M', u'υ'), - (0x1D711, 'M', u'φ'), - (0x1D712, 'M', u'χ'), - (0x1D713, 'M', u'ψ'), - (0x1D714, 'M', u'ω'), - (0x1D715, 'M', u'∂'), - (0x1D716, 'M', u'ε'), - (0x1D717, 'M', u'θ'), - (0x1D718, 'M', u'κ'), - (0x1D719, 'M', u'φ'), - (0x1D71A, 'M', u'ρ'), - (0x1D71B, 'M', u'π'), - (0x1D71C, 'M', u'α'), - (0x1D71D, 'M', u'β'), - (0x1D71E, 'M', u'γ'), - (0x1D71F, 'M', u'δ'), - (0x1D720, 'M', u'ε'), - (0x1D721, 'M', u'ζ'), - (0x1D722, 'M', u'η'), - (0x1D723, 'M', u'θ'), - (0x1D724, 'M', u'ι'), - (0x1D725, 'M', u'κ'), - (0x1D726, 'M', u'λ'), - (0x1D727, 'M', u'μ'), - (0x1D728, 'M', u'ν'), - (0x1D729, 'M', u'ξ'), - (0x1D72A, 'M', u'ο'), - (0x1D72B, 'M', u'π'), - (0x1D72C, 'M', u'ρ'), - (0x1D72D, 'M', u'θ'), - (0x1D72E, 'M', u'σ'), - (0x1D72F, 'M', u'τ'), - (0x1D730, 'M', u'υ'), - (0x1D731, 'M', u'φ'), - (0x1D732, 'M', u'χ'), - (0x1D733, 'M', u'ψ'), - (0x1D734, 'M', u'ω'), - (0x1D735, 'M', u'∇'), - (0x1D736, 'M', u'α'), - (0x1D737, 'M', u'β'), - (0x1D738, 'M', u'γ'), - (0x1D739, 'M', u'δ'), - (0x1D73A, 'M', u'ε'), - (0x1D73B, 'M', u'ζ'), - (0x1D73C, 'M', u'η'), - (0x1D73D, 'M', u'θ'), - (0x1D73E, 'M', u'ι'), - (0x1D73F, 'M', u'κ'), - (0x1D740, 'M', u'λ'), - (0x1D741, 'M', u'μ'), - (0x1D742, 'M', u'ν'), - (0x1D743, 'M', u'ξ'), - (0x1D744, 'M', u'ο'), - (0x1D745, 'M', u'π'), - (0x1D746, 'M', u'ρ'), - (0x1D747, 'M', u'σ'), - (0x1D749, 'M', u'τ'), - (0x1D74A, 'M', u'υ'), - (0x1D74B, 'M', u'φ'), - (0x1D74C, 'M', u'χ'), - (0x1D74D, 'M', u'ψ'), - (0x1D74E, 'M', u'ω'), - (0x1D74F, 'M', u'∂'), - (0x1D750, 'M', u'ε'), - (0x1D751, 'M', u'θ'), - (0x1D752, 'M', u'κ'), - (0x1D753, 'M', u'φ'), - (0x1D754, 'M', u'ρ'), - (0x1D755, 'M', u'π'), - (0x1D756, 'M', u'α'), - (0x1D757, 'M', u'β'), - (0x1D758, 'M', u'γ'), - (0x1D759, 'M', u'δ'), - (0x1D75A, 'M', u'ε'), - (0x1D75B, 'M', u'ζ'), - (0x1D75C, 'M', u'η'), - (0x1D75D, 'M', u'θ'), - (0x1D75E, 'M', u'ι'), - (0x1D75F, 'M', u'κ'), - (0x1D760, 'M', u'λ'), - (0x1D761, 'M', u'μ'), - (0x1D762, 'M', u'ν'), - (0x1D763, 'M', u'ξ'), - (0x1D764, 'M', u'ο'), - (0x1D765, 'M', u'π'), - (0x1D766, 'M', u'ρ'), - ] - -def _seg_62(): - return [ - (0x1D767, 'M', u'θ'), - (0x1D768, 'M', u'σ'), - (0x1D769, 'M', u'τ'), - (0x1D76A, 'M', u'υ'), - (0x1D76B, 'M', u'φ'), - (0x1D76C, 'M', u'χ'), - (0x1D76D, 'M', u'ψ'), - (0x1D76E, 'M', u'ω'), - (0x1D76F, 'M', u'∇'), - (0x1D770, 'M', u'α'), - (0x1D771, 'M', u'β'), - (0x1D772, 'M', u'γ'), - (0x1D773, 'M', u'δ'), - (0x1D774, 'M', u'ε'), - (0x1D775, 'M', u'ζ'), - (0x1D776, 'M', u'η'), - (0x1D777, 'M', u'θ'), - (0x1D778, 'M', u'ι'), - (0x1D779, 'M', u'κ'), - (0x1D77A, 'M', u'λ'), - (0x1D77B, 'M', u'μ'), - (0x1D77C, 'M', u'ν'), - (0x1D77D, 'M', u'ξ'), - (0x1D77E, 'M', u'ο'), - (0x1D77F, 'M', u'π'), - (0x1D780, 'M', u'ρ'), - (0x1D781, 'M', u'σ'), - (0x1D783, 'M', u'τ'), - (0x1D784, 'M', u'υ'), - (0x1D785, 'M', u'φ'), - (0x1D786, 'M', u'χ'), - (0x1D787, 'M', u'ψ'), - (0x1D788, 'M', u'ω'), - (0x1D789, 'M', u'∂'), - (0x1D78A, 'M', u'ε'), - (0x1D78B, 'M', u'θ'), - (0x1D78C, 'M', u'κ'), - (0x1D78D, 'M', u'φ'), - (0x1D78E, 'M', u'ρ'), - (0x1D78F, 'M', u'π'), - (0x1D790, 'M', u'α'), - (0x1D791, 'M', u'β'), - (0x1D792, 'M', u'γ'), - (0x1D793, 'M', u'δ'), - (0x1D794, 'M', u'ε'), - (0x1D795, 'M', u'ζ'), - (0x1D796, 'M', u'η'), - (0x1D797, 'M', u'θ'), - (0x1D798, 'M', u'ι'), - (0x1D799, 'M', u'κ'), - (0x1D79A, 'M', u'λ'), - (0x1D79B, 'M', u'μ'), - (0x1D79C, 'M', u'ν'), - (0x1D79D, 'M', u'ξ'), - (0x1D79E, 'M', u'ο'), - (0x1D79F, 'M', u'π'), - (0x1D7A0, 'M', u'ρ'), - (0x1D7A1, 'M', u'θ'), - (0x1D7A2, 'M', u'σ'), - (0x1D7A3, 'M', u'τ'), - (0x1D7A4, 'M', u'υ'), - (0x1D7A5, 'M', u'φ'), - (0x1D7A6, 'M', u'χ'), - (0x1D7A7, 'M', u'ψ'), - (0x1D7A8, 'M', u'ω'), - (0x1D7A9, 'M', u'∇'), - (0x1D7AA, 'M', u'α'), - (0x1D7AB, 'M', u'β'), - (0x1D7AC, 'M', u'γ'), - (0x1D7AD, 'M', u'δ'), - (0x1D7AE, 'M', u'ε'), - (0x1D7AF, 'M', u'ζ'), - (0x1D7B0, 'M', u'η'), - (0x1D7B1, 'M', u'θ'), - (0x1D7B2, 'M', u'ι'), - (0x1D7B3, 'M', u'κ'), - (0x1D7B4, 'M', u'λ'), - (0x1D7B5, 'M', u'μ'), - (0x1D7B6, 'M', u'ν'), - (0x1D7B7, 'M', u'ξ'), - (0x1D7B8, 'M', u'ο'), - (0x1D7B9, 'M', u'π'), - (0x1D7BA, 'M', u'ρ'), - (0x1D7BB, 'M', u'σ'), - (0x1D7BD, 'M', u'τ'), - (0x1D7BE, 'M', u'υ'), - (0x1D7BF, 'M', u'φ'), - (0x1D7C0, 'M', u'χ'), - (0x1D7C1, 'M', u'ψ'), - (0x1D7C2, 'M', u'ω'), - (0x1D7C3, 'M', u'∂'), - (0x1D7C4, 'M', u'ε'), - (0x1D7C5, 'M', u'θ'), - (0x1D7C6, 'M', u'κ'), - (0x1D7C7, 'M', u'φ'), - (0x1D7C8, 'M', u'ρ'), - (0x1D7C9, 'M', u'π'), - (0x1D7CA, 'M', u'ϝ'), - (0x1D7CC, 'X'), - (0x1D7CE, 'M', u'0'), - ] - -def _seg_63(): - return [ - (0x1D7CF, 'M', u'1'), - (0x1D7D0, 'M', u'2'), - (0x1D7D1, 'M', u'3'), - (0x1D7D2, 'M', u'4'), - (0x1D7D3, 'M', u'5'), - (0x1D7D4, 'M', u'6'), - (0x1D7D5, 'M', u'7'), - (0x1D7D6, 'M', u'8'), - (0x1D7D7, 'M', u'9'), - (0x1D7D8, 'M', u'0'), - (0x1D7D9, 'M', u'1'), - (0x1D7DA, 'M', u'2'), - (0x1D7DB, 'M', u'3'), - (0x1D7DC, 'M', u'4'), - (0x1D7DD, 'M', u'5'), - (0x1D7DE, 'M', u'6'), - (0x1D7DF, 'M', u'7'), - (0x1D7E0, 'M', u'8'), - (0x1D7E1, 'M', u'9'), - (0x1D7E2, 'M', u'0'), - (0x1D7E3, 'M', u'1'), - (0x1D7E4, 'M', u'2'), - (0x1D7E5, 'M', u'3'), - (0x1D7E6, 'M', u'4'), - (0x1D7E7, 'M', u'5'), - (0x1D7E8, 'M', u'6'), - (0x1D7E9, 'M', u'7'), - (0x1D7EA, 'M', u'8'), - (0x1D7EB, 'M', u'9'), - (0x1D7EC, 'M', u'0'), - (0x1D7ED, 'M', u'1'), - (0x1D7EE, 'M', u'2'), - (0x1D7EF, 'M', u'3'), - (0x1D7F0, 'M', u'4'), - (0x1D7F1, 'M', u'5'), - (0x1D7F2, 'M', u'6'), - (0x1D7F3, 'M', u'7'), - (0x1D7F4, 'M', u'8'), - (0x1D7F5, 'M', u'9'), - (0x1D7F6, 'M', u'0'), - (0x1D7F7, 'M', u'1'), - (0x1D7F8, 'M', u'2'), - (0x1D7F9, 'M', u'3'), - (0x1D7FA, 'M', u'4'), - (0x1D7FB, 'M', u'5'), - (0x1D7FC, 'M', u'6'), - (0x1D7FD, 'M', u'7'), - (0x1D7FE, 'M', u'8'), - (0x1D7FF, 'M', u'9'), - (0x1D800, 'X'), - (0x1EE00, 'M', u'ا'), - (0x1EE01, 'M', u'ب'), - (0x1EE02, 'M', u'ج'), - (0x1EE03, 'M', u'د'), - (0x1EE04, 'X'), - (0x1EE05, 'M', u'و'), - (0x1EE06, 'M', u'ز'), - (0x1EE07, 'M', u'ح'), - (0x1EE08, 'M', u'ط'), - (0x1EE09, 'M', u'ي'), - (0x1EE0A, 'M', u'ك'), - (0x1EE0B, 'M', u'ل'), - (0x1EE0C, 'M', u'م'), - (0x1EE0D, 'M', u'ن'), - (0x1EE0E, 'M', u'س'), - (0x1EE0F, 'M', u'ع'), - (0x1EE10, 'M', u'ف'), - (0x1EE11, 'M', u'ص'), - (0x1EE12, 'M', u'ق'), - (0x1EE13, 'M', u'ر'), - (0x1EE14, 'M', u'ش'), - (0x1EE15, 'M', u'ت'), - (0x1EE16, 'M', u'ث'), - (0x1EE17, 'M', u'خ'), - (0x1EE18, 'M', u'ذ'), - (0x1EE19, 'M', u'ض'), - (0x1EE1A, 'M', u'ظ'), - (0x1EE1B, 'M', u'غ'), - (0x1EE1C, 'M', u'ٮ'), - (0x1EE1D, 'M', u'ں'), - (0x1EE1E, 'M', u'ڡ'), - (0x1EE1F, 'M', u'ٯ'), - (0x1EE20, 'X'), - (0x1EE21, 'M', u'ب'), - (0x1EE22, 'M', u'ج'), - (0x1EE23, 'X'), - (0x1EE24, 'M', u'ه'), - (0x1EE25, 'X'), - (0x1EE27, 'M', u'ح'), - (0x1EE28, 'X'), - (0x1EE29, 'M', u'ي'), - (0x1EE2A, 'M', u'ك'), - (0x1EE2B, 'M', u'ل'), - (0x1EE2C, 'M', u'م'), - (0x1EE2D, 'M', u'ن'), - (0x1EE2E, 'M', u'س'), - (0x1EE2F, 'M', u'ع'), - (0x1EE30, 'M', u'ف'), - (0x1EE31, 'M', u'ص'), - (0x1EE32, 'M', u'ق'), - ] - -def _seg_64(): - return [ - (0x1EE33, 'X'), - (0x1EE34, 'M', u'ش'), - (0x1EE35, 'M', u'ت'), - (0x1EE36, 'M', u'ث'), - (0x1EE37, 'M', u'خ'), - (0x1EE38, 'X'), - (0x1EE39, 'M', u'ض'), - (0x1EE3A, 'X'), - (0x1EE3B, 'M', u'غ'), - (0x1EE3C, 'X'), - (0x1EE42, 'M', u'ج'), - (0x1EE43, 'X'), - (0x1EE47, 'M', u'ح'), - (0x1EE48, 'X'), - (0x1EE49, 'M', u'ي'), - (0x1EE4A, 'X'), - (0x1EE4B, 'M', u'ل'), - (0x1EE4C, 'X'), - (0x1EE4D, 'M', u'ن'), - (0x1EE4E, 'M', u'س'), - (0x1EE4F, 'M', u'ع'), - (0x1EE50, 'X'), - (0x1EE51, 'M', u'ص'), - (0x1EE52, 'M', u'ق'), - (0x1EE53, 'X'), - (0x1EE54, 'M', u'ش'), - (0x1EE55, 'X'), - (0x1EE57, 'M', u'خ'), - (0x1EE58, 'X'), - (0x1EE59, 'M', u'ض'), - (0x1EE5A, 'X'), - (0x1EE5B, 'M', u'غ'), - (0x1EE5C, 'X'), - (0x1EE5D, 'M', u'ں'), - (0x1EE5E, 'X'), - (0x1EE5F, 'M', u'ٯ'), - (0x1EE60, 'X'), - (0x1EE61, 'M', u'ب'), - (0x1EE62, 'M', u'ج'), - (0x1EE63, 'X'), - (0x1EE64, 'M', u'ه'), - (0x1EE65, 'X'), - (0x1EE67, 'M', u'ح'), - (0x1EE68, 'M', u'ط'), - (0x1EE69, 'M', u'ي'), - (0x1EE6A, 'M', u'ك'), - (0x1EE6B, 'X'), - (0x1EE6C, 'M', u'م'), - (0x1EE6D, 'M', u'ن'), - (0x1EE6E, 'M', u'س'), - (0x1EE6F, 'M', u'ع'), - (0x1EE70, 'M', u'ف'), - (0x1EE71, 'M', u'ص'), - (0x1EE72, 'M', u'ق'), - (0x1EE73, 'X'), - (0x1EE74, 'M', u'ش'), - (0x1EE75, 'M', u'ت'), - (0x1EE76, 'M', u'ث'), - (0x1EE77, 'M', u'خ'), - (0x1EE78, 'X'), - (0x1EE79, 'M', u'ض'), - (0x1EE7A, 'M', u'ظ'), - (0x1EE7B, 'M', u'غ'), - (0x1EE7C, 'M', u'ٮ'), - (0x1EE7D, 'X'), - (0x1EE7E, 'M', u'ڡ'), - (0x1EE7F, 'X'), - (0x1EE80, 'M', u'ا'), - (0x1EE81, 'M', u'ب'), - (0x1EE82, 'M', u'ج'), - (0x1EE83, 'M', u'د'), - (0x1EE84, 'M', u'ه'), - (0x1EE85, 'M', u'و'), - (0x1EE86, 'M', u'ز'), - (0x1EE87, 'M', u'ح'), - (0x1EE88, 'M', u'ط'), - (0x1EE89, 'M', u'ي'), - (0x1EE8A, 'X'), - (0x1EE8B, 'M', u'ل'), - (0x1EE8C, 'M', u'م'), - (0x1EE8D, 'M', u'ن'), - (0x1EE8E, 'M', u'س'), - (0x1EE8F, 'M', u'ع'), - (0x1EE90, 'M', u'ف'), - (0x1EE91, 'M', u'ص'), - (0x1EE92, 'M', u'ق'), - (0x1EE93, 'M', u'ر'), - (0x1EE94, 'M', u'ش'), - (0x1EE95, 'M', u'ت'), - (0x1EE96, 'M', u'ث'), - (0x1EE97, 'M', u'خ'), - (0x1EE98, 'M', u'ذ'), - (0x1EE99, 'M', u'ض'), - (0x1EE9A, 'M', u'ظ'), - (0x1EE9B, 'M', u'غ'), - (0x1EE9C, 'X'), - (0x1EEA1, 'M', u'ب'), - (0x1EEA2, 'M', u'ج'), - (0x1EEA3, 'M', u'د'), - (0x1EEA4, 'X'), - ] - -def _seg_65(): - return [ - (0x1EEA5, 'M', u'و'), - (0x1EEA6, 'M', u'ز'), - (0x1EEA7, 'M', u'ح'), - (0x1EEA8, 'M', u'ط'), - (0x1EEA9, 'M', u'ي'), - (0x1EEAA, 'X'), - (0x1EEAB, 'M', u'ل'), - (0x1EEAC, 'M', u'م'), - (0x1EEAD, 'M', u'ن'), - (0x1EEAE, 'M', u'س'), - (0x1EEAF, 'M', u'ع'), - (0x1EEB0, 'M', u'ف'), - (0x1EEB1, 'M', u'ص'), - (0x1EEB2, 'M', u'ق'), - (0x1EEB3, 'M', u'ر'), - (0x1EEB4, 'M', u'ش'), - (0x1EEB5, 'M', u'ت'), - (0x1EEB6, 'M', u'ث'), - (0x1EEB7, 'M', u'خ'), - (0x1EEB8, 'M', u'ذ'), - (0x1EEB9, 'M', u'ض'), - (0x1EEBA, 'M', u'ظ'), - (0x1EEBB, 'M', u'غ'), - (0x1EEBC, 'X'), - (0x1EEF0, 'V'), - (0x1EEF2, 'X'), - (0x1F000, 'V'), - (0x1F02C, 'X'), - (0x1F030, 'V'), - (0x1F094, 'X'), - (0x1F0A0, 'V'), - (0x1F0AF, 'X'), - (0x1F0B1, 'V'), - (0x1F0BF, 'X'), - (0x1F0C1, 'V'), - (0x1F0D0, 'X'), - (0x1F0D1, 'V'), - (0x1F0E0, 'X'), - (0x1F101, '3', u'0,'), - (0x1F102, '3', u'1,'), - (0x1F103, '3', u'2,'), - (0x1F104, '3', u'3,'), - (0x1F105, '3', u'4,'), - (0x1F106, '3', u'5,'), - (0x1F107, '3', u'6,'), - (0x1F108, '3', u'7,'), - (0x1F109, '3', u'8,'), - (0x1F10A, '3', u'9,'), - (0x1F10B, 'X'), - (0x1F110, '3', u'(a)'), - (0x1F111, '3', u'(b)'), - (0x1F112, '3', u'(c)'), - (0x1F113, '3', u'(d)'), - (0x1F114, '3', u'(e)'), - (0x1F115, '3', u'(f)'), - (0x1F116, '3', u'(g)'), - (0x1F117, '3', u'(h)'), - (0x1F118, '3', u'(i)'), - (0x1F119, '3', u'(j)'), - (0x1F11A, '3', u'(k)'), - (0x1F11B, '3', u'(l)'), - (0x1F11C, '3', u'(m)'), - (0x1F11D, '3', u'(n)'), - (0x1F11E, '3', u'(o)'), - (0x1F11F, '3', u'(p)'), - (0x1F120, '3', u'(q)'), - (0x1F121, '3', u'(r)'), - (0x1F122, '3', u'(s)'), - (0x1F123, '3', u'(t)'), - (0x1F124, '3', u'(u)'), - (0x1F125, '3', u'(v)'), - (0x1F126, '3', u'(w)'), - (0x1F127, '3', u'(x)'), - (0x1F128, '3', u'(y)'), - (0x1F129, '3', u'(z)'), - (0x1F12A, 'M', u'〔s〕'), - (0x1F12B, 'M', u'c'), - (0x1F12C, 'M', u'r'), - (0x1F12D, 'M', u'cd'), - (0x1F12E, 'M', u'wz'), - (0x1F12F, 'X'), - (0x1F130, 'M', u'a'), - (0x1F131, 'M', u'b'), - (0x1F132, 'M', u'c'), - (0x1F133, 'M', u'd'), - (0x1F134, 'M', u'e'), - (0x1F135, 'M', u'f'), - (0x1F136, 'M', u'g'), - (0x1F137, 'M', u'h'), - (0x1F138, 'M', u'i'), - (0x1F139, 'M', u'j'), - (0x1F13A, 'M', u'k'), - (0x1F13B, 'M', u'l'), - (0x1F13C, 'M', u'm'), - (0x1F13D, 'M', u'n'), - (0x1F13E, 'M', u'o'), - (0x1F13F, 'M', u'p'), - (0x1F140, 'M', u'q'), - (0x1F141, 'M', u'r'), - (0x1F142, 'M', u's'), - ] - -def _seg_66(): - return [ - (0x1F143, 'M', u't'), - (0x1F144, 'M', u'u'), - (0x1F145, 'M', u'v'), - (0x1F146, 'M', u'w'), - (0x1F147, 'M', u'x'), - (0x1F148, 'M', u'y'), - (0x1F149, 'M', u'z'), - (0x1F14A, 'M', u'hv'), - (0x1F14B, 'M', u'mv'), - (0x1F14C, 'M', u'sd'), - (0x1F14D, 'M', u'ss'), - (0x1F14E, 'M', u'ppv'), - (0x1F14F, 'M', u'wc'), - (0x1F150, 'V'), - (0x1F16A, 'M', u'mc'), - (0x1F16B, 'M', u'md'), - (0x1F16C, 'X'), - (0x1F170, 'V'), - (0x1F190, 'M', u'dj'), - (0x1F191, 'V'), - (0x1F19B, 'X'), - (0x1F1E6, 'V'), - (0x1F200, 'M', u'ほか'), - (0x1F201, 'M', u'ココ'), - (0x1F202, 'M', u'サ'), - (0x1F203, 'X'), - (0x1F210, 'M', u'手'), - (0x1F211, 'M', u'字'), - (0x1F212, 'M', u'双'), - (0x1F213, 'M', u'デ'), - (0x1F214, 'M', u'二'), - (0x1F215, 'M', u'多'), - (0x1F216, 'M', u'解'), - (0x1F217, 'M', u'天'), - (0x1F218, 'M', u'交'), - (0x1F219, 'M', u'映'), - (0x1F21A, 'M', u'無'), - (0x1F21B, 'M', u'料'), - (0x1F21C, 'M', u'前'), - (0x1F21D, 'M', u'後'), - (0x1F21E, 'M', u'再'), - (0x1F21F, 'M', u'新'), - (0x1F220, 'M', u'初'), - (0x1F221, 'M', u'終'), - (0x1F222, 'M', u'生'), - (0x1F223, 'M', u'販'), - (0x1F224, 'M', u'声'), - (0x1F225, 'M', u'吹'), - (0x1F226, 'M', u'演'), - (0x1F227, 'M', u'投'), - (0x1F228, 'M', u'捕'), - (0x1F229, 'M', u'一'), - (0x1F22A, 'M', u'三'), - (0x1F22B, 'M', u'遊'), - (0x1F22C, 'M', u'左'), - (0x1F22D, 'M', u'中'), - (0x1F22E, 'M', u'右'), - (0x1F22F, 'M', u'指'), - (0x1F230, 'M', u'走'), - (0x1F231, 'M', u'打'), - (0x1F232, 'M', u'禁'), - (0x1F233, 'M', u'空'), - (0x1F234, 'M', u'合'), - (0x1F235, 'M', u'満'), - (0x1F236, 'M', u'有'), - (0x1F237, 'M', u'月'), - (0x1F238, 'M', u'申'), - (0x1F239, 'M', u'割'), - (0x1F23A, 'M', u'営'), - (0x1F23B, 'X'), - (0x1F240, 'M', u'〔本〕'), - (0x1F241, 'M', u'〔三〕'), - (0x1F242, 'M', u'〔二〕'), - (0x1F243, 'M', u'〔安〕'), - (0x1F244, 'M', u'〔点〕'), - (0x1F245, 'M', u'〔打〕'), - (0x1F246, 'M', u'〔盗〕'), - (0x1F247, 'M', u'〔勝〕'), - (0x1F248, 'M', u'〔敗〕'), - (0x1F249, 'X'), - (0x1F250, 'M', u'得'), - (0x1F251, 'M', u'可'), - (0x1F252, 'X'), - (0x1F300, 'V'), - (0x1F321, 'X'), - (0x1F330, 'V'), - (0x1F336, 'X'), - (0x1F337, 'V'), - (0x1F37D, 'X'), - (0x1F380, 'V'), - (0x1F394, 'X'), - (0x1F3A0, 'V'), - (0x1F3C5, 'X'), - (0x1F3C6, 'V'), - (0x1F3CB, 'X'), - (0x1F3E0, 'V'), - (0x1F3F1, 'X'), - (0x1F400, 'V'), - (0x1F43F, 'X'), - (0x1F440, 'V'), - ] - -def _seg_67(): - return [ - (0x1F441, 'X'), - (0x1F442, 'V'), - (0x1F4F8, 'X'), - (0x1F4F9, 'V'), - (0x1F4FD, 'X'), - (0x1F500, 'V'), - (0x1F53E, 'X'), - (0x1F540, 'V'), - (0x1F544, 'X'), - (0x1F550, 'V'), - (0x1F568, 'X'), - (0x1F5FB, 'V'), - (0x1F641, 'X'), - (0x1F645, 'V'), - (0x1F650, 'X'), - (0x1F680, 'V'), - (0x1F6C6, 'X'), - (0x1F700, 'V'), - (0x1F774, 'X'), - (0x20000, 'V'), - (0x2A6D7, 'X'), - (0x2A700, 'V'), - (0x2B735, 'X'), - (0x2B740, 'V'), - (0x2B81E, 'X'), - (0x2F800, 'M', u'丽'), - (0x2F801, 'M', u'丸'), - (0x2F802, 'M', u'乁'), - (0x2F803, 'M', u'𠄢'), - (0x2F804, 'M', u'你'), - (0x2F805, 'M', u'侮'), - (0x2F806, 'M', u'侻'), - (0x2F807, 'M', u'倂'), - (0x2F808, 'M', u'偺'), - (0x2F809, 'M', u'備'), - (0x2F80A, 'M', u'僧'), - (0x2F80B, 'M', u'像'), - (0x2F80C, 'M', u'㒞'), - (0x2F80D, 'M', u'𠘺'), - (0x2F80E, 'M', u'免'), - (0x2F80F, 'M', u'兔'), - (0x2F810, 'M', u'兤'), - (0x2F811, 'M', u'具'), - (0x2F812, 'M', u'𠔜'), - (0x2F813, 'M', u'㒹'), - (0x2F814, 'M', u'內'), - (0x2F815, 'M', u'再'), - (0x2F816, 'M', u'𠕋'), - (0x2F817, 'M', u'冗'), - (0x2F818, 'M', u'冤'), - (0x2F819, 'M', u'仌'), - (0x2F81A, 'M', u'冬'), - (0x2F81B, 'M', u'况'), - (0x2F81C, 'M', u'𩇟'), - (0x2F81D, 'M', u'凵'), - (0x2F81E, 'M', u'刃'), - (0x2F81F, 'M', u'㓟'), - (0x2F820, 'M', u'刻'), - (0x2F821, 'M', u'剆'), - (0x2F822, 'M', u'割'), - (0x2F823, 'M', u'剷'), - (0x2F824, 'M', u'㔕'), - (0x2F825, 'M', u'勇'), - (0x2F826, 'M', u'勉'), - (0x2F827, 'M', u'勤'), - (0x2F828, 'M', u'勺'), - (0x2F829, 'M', u'包'), - (0x2F82A, 'M', u'匆'), - (0x2F82B, 'M', u'北'), - (0x2F82C, 'M', u'卉'), - (0x2F82D, 'M', u'卑'), - (0x2F82E, 'M', u'博'), - (0x2F82F, 'M', u'即'), - (0x2F830, 'M', u'卽'), - (0x2F831, 'M', u'卿'), - (0x2F834, 'M', u'𠨬'), - (0x2F835, 'M', u'灰'), - (0x2F836, 'M', u'及'), - (0x2F837, 'M', u'叟'), - (0x2F838, 'M', u'𠭣'), - (0x2F839, 'M', u'叫'), - (0x2F83A, 'M', u'叱'), - (0x2F83B, 'M', u'吆'), - (0x2F83C, 'M', u'咞'), - (0x2F83D, 'M', u'吸'), - (0x2F83E, 'M', u'呈'), - (0x2F83F, 'M', u'周'), - (0x2F840, 'M', u'咢'), - (0x2F841, 'M', u'哶'), - (0x2F842, 'M', u'唐'), - (0x2F843, 'M', u'啓'), - (0x2F844, 'M', u'啣'), - (0x2F845, 'M', u'善'), - (0x2F847, 'M', u'喙'), - (0x2F848, 'M', u'喫'), - (0x2F849, 'M', u'喳'), - (0x2F84A, 'M', u'嗂'), - (0x2F84B, 'M', u'圖'), - (0x2F84C, 'M', u'嘆'), - (0x2F84D, 'M', u'圗'), - ] - -def _seg_68(): - return [ - (0x2F84E, 'M', u'噑'), - (0x2F84F, 'M', u'噴'), - (0x2F850, 'M', u'切'), - (0x2F851, 'M', u'壮'), - (0x2F852, 'M', u'城'), - (0x2F853, 'M', u'埴'), - (0x2F854, 'M', u'堍'), - (0x2F855, 'M', u'型'), - (0x2F856, 'M', u'堲'), - (0x2F857, 'M', u'報'), - (0x2F858, 'M', u'墬'), - (0x2F859, 'M', u'𡓤'), - (0x2F85A, 'M', u'売'), - (0x2F85B, 'M', u'壷'), - (0x2F85C, 'M', u'夆'), - (0x2F85D, 'M', u'多'), - (0x2F85E, 'M', u'夢'), - (0x2F85F, 'M', u'奢'), - (0x2F860, 'M', u'𡚨'), - (0x2F861, 'M', u'𡛪'), - (0x2F862, 'M', u'姬'), - (0x2F863, 'M', u'娛'), - (0x2F864, 'M', u'娧'), - (0x2F865, 'M', u'姘'), - (0x2F866, 'M', u'婦'), - (0x2F867, 'M', u'㛮'), - (0x2F868, 'X'), - (0x2F869, 'M', u'嬈'), - (0x2F86A, 'M', u'嬾'), - (0x2F86C, 'M', u'𡧈'), - (0x2F86D, 'M', u'寃'), - (0x2F86E, 'M', u'寘'), - (0x2F86F, 'M', u'寧'), - (0x2F870, 'M', u'寳'), - (0x2F871, 'M', u'𡬘'), - (0x2F872, 'M', u'寿'), - (0x2F873, 'M', u'将'), - (0x2F874, 'X'), - (0x2F875, 'M', u'尢'), - (0x2F876, 'M', u'㞁'), - (0x2F877, 'M', u'屠'), - (0x2F878, 'M', u'屮'), - (0x2F879, 'M', u'峀'), - (0x2F87A, 'M', u'岍'), - (0x2F87B, 'M', u'𡷤'), - (0x2F87C, 'M', u'嵃'), - (0x2F87D, 'M', u'𡷦'), - (0x2F87E, 'M', u'嵮'), - (0x2F87F, 'M', u'嵫'), - (0x2F880, 'M', u'嵼'), - (0x2F881, 'M', u'巡'), - (0x2F882, 'M', u'巢'), - (0x2F883, 'M', u'㠯'), - (0x2F884, 'M', u'巽'), - (0x2F885, 'M', u'帨'), - (0x2F886, 'M', u'帽'), - (0x2F887, 'M', u'幩'), - (0x2F888, 'M', u'㡢'), - (0x2F889, 'M', u'𢆃'), - (0x2F88A, 'M', u'㡼'), - (0x2F88B, 'M', u'庰'), - (0x2F88C, 'M', u'庳'), - (0x2F88D, 'M', u'庶'), - (0x2F88E, 'M', u'廊'), - (0x2F88F, 'M', u'𪎒'), - (0x2F890, 'M', u'廾'), - (0x2F891, 'M', u'𢌱'), - (0x2F893, 'M', u'舁'), - (0x2F894, 'M', u'弢'), - (0x2F896, 'M', u'㣇'), - (0x2F897, 'M', u'𣊸'), - (0x2F898, 'M', u'𦇚'), - (0x2F899, 'M', u'形'), - (0x2F89A, 'M', u'彫'), - (0x2F89B, 'M', u'㣣'), - (0x2F89C, 'M', u'徚'), - (0x2F89D, 'M', u'忍'), - (0x2F89E, 'M', u'志'), - (0x2F89F, 'M', u'忹'), - (0x2F8A0, 'M', u'悁'), - (0x2F8A1, 'M', u'㤺'), - (0x2F8A2, 'M', u'㤜'), - (0x2F8A3, 'M', u'悔'), - (0x2F8A4, 'M', u'𢛔'), - (0x2F8A5, 'M', u'惇'), - (0x2F8A6, 'M', u'慈'), - (0x2F8A7, 'M', u'慌'), - (0x2F8A8, 'M', u'慎'), - (0x2F8A9, 'M', u'慌'), - (0x2F8AA, 'M', u'慺'), - (0x2F8AB, 'M', u'憎'), - (0x2F8AC, 'M', u'憲'), - (0x2F8AD, 'M', u'憤'), - (0x2F8AE, 'M', u'憯'), - (0x2F8AF, 'M', u'懞'), - (0x2F8B0, 'M', u'懲'), - (0x2F8B1, 'M', u'懶'), - (0x2F8B2, 'M', u'成'), - (0x2F8B3, 'M', u'戛'), - (0x2F8B4, 'M', u'扝'), - ] - -def _seg_69(): - return [ - (0x2F8B5, 'M', u'抱'), - (0x2F8B6, 'M', u'拔'), - (0x2F8B7, 'M', u'捐'), - (0x2F8B8, 'M', u'𢬌'), - (0x2F8B9, 'M', u'挽'), - (0x2F8BA, 'M', u'拼'), - (0x2F8BB, 'M', u'捨'), - (0x2F8BC, 'M', u'掃'), - (0x2F8BD, 'M', u'揤'), - (0x2F8BE, 'M', u'𢯱'), - (0x2F8BF, 'M', u'搢'), - (0x2F8C0, 'M', u'揅'), - (0x2F8C1, 'M', u'掩'), - (0x2F8C2, 'M', u'㨮'), - (0x2F8C3, 'M', u'摩'), - (0x2F8C4, 'M', u'摾'), - (0x2F8C5, 'M', u'撝'), - (0x2F8C6, 'M', u'摷'), - (0x2F8C7, 'M', u'㩬'), - (0x2F8C8, 'M', u'敏'), - (0x2F8C9, 'M', u'敬'), - (0x2F8CA, 'M', u'𣀊'), - (0x2F8CB, 'M', u'旣'), - (0x2F8CC, 'M', u'書'), - (0x2F8CD, 'M', u'晉'), - (0x2F8CE, 'M', u'㬙'), - (0x2F8CF, 'M', u'暑'), - (0x2F8D0, 'M', u'㬈'), - (0x2F8D1, 'M', u'㫤'), - (0x2F8D2, 'M', u'冒'), - (0x2F8D3, 'M', u'冕'), - (0x2F8D4, 'M', u'最'), - (0x2F8D5, 'M', u'暜'), - (0x2F8D6, 'M', u'肭'), - (0x2F8D7, 'M', u'䏙'), - (0x2F8D8, 'M', u'朗'), - (0x2F8D9, 'M', u'望'), - (0x2F8DA, 'M', u'朡'), - (0x2F8DB, 'M', u'杞'), - (0x2F8DC, 'M', u'杓'), - (0x2F8DD, 'M', u'𣏃'), - (0x2F8DE, 'M', u'㭉'), - (0x2F8DF, 'M', u'柺'), - (0x2F8E0, 'M', u'枅'), - (0x2F8E1, 'M', u'桒'), - (0x2F8E2, 'M', u'梅'), - (0x2F8E3, 'M', u'𣑭'), - (0x2F8E4, 'M', u'梎'), - (0x2F8E5, 'M', u'栟'), - (0x2F8E6, 'M', u'椔'), - (0x2F8E7, 'M', u'㮝'), - (0x2F8E8, 'M', u'楂'), - (0x2F8E9, 'M', u'榣'), - (0x2F8EA, 'M', u'槪'), - (0x2F8EB, 'M', u'檨'), - (0x2F8EC, 'M', u'𣚣'), - (0x2F8ED, 'M', u'櫛'), - (0x2F8EE, 'M', u'㰘'), - (0x2F8EF, 'M', u'次'), - (0x2F8F0, 'M', u'𣢧'), - (0x2F8F1, 'M', u'歔'), - (0x2F8F2, 'M', u'㱎'), - (0x2F8F3, 'M', u'歲'), - (0x2F8F4, 'M', u'殟'), - (0x2F8F5, 'M', u'殺'), - (0x2F8F6, 'M', u'殻'), - (0x2F8F7, 'M', u'𣪍'), - (0x2F8F8, 'M', u'𡴋'), - (0x2F8F9, 'M', u'𣫺'), - (0x2F8FA, 'M', u'汎'), - (0x2F8FB, 'M', u'𣲼'), - (0x2F8FC, 'M', u'沿'), - (0x2F8FD, 'M', u'泍'), - (0x2F8FE, 'M', u'汧'), - (0x2F8FF, 'M', u'洖'), - (0x2F900, 'M', u'派'), - (0x2F901, 'M', u'海'), - (0x2F902, 'M', u'流'), - (0x2F903, 'M', u'浩'), - (0x2F904, 'M', u'浸'), - (0x2F905, 'M', u'涅'), - (0x2F906, 'M', u'𣴞'), - (0x2F907, 'M', u'洴'), - (0x2F908, 'M', u'港'), - (0x2F909, 'M', u'湮'), - (0x2F90A, 'M', u'㴳'), - (0x2F90B, 'M', u'滋'), - (0x2F90C, 'M', u'滇'), - (0x2F90D, 'M', u'𣻑'), - (0x2F90E, 'M', u'淹'), - (0x2F90F, 'M', u'潮'), - (0x2F910, 'M', u'𣽞'), - (0x2F911, 'M', u'𣾎'), - (0x2F912, 'M', u'濆'), - (0x2F913, 'M', u'瀹'), - (0x2F914, 'M', u'瀞'), - (0x2F915, 'M', u'瀛'), - (0x2F916, 'M', u'㶖'), - (0x2F917, 'M', u'灊'), - (0x2F918, 'M', u'災'), - ] - -def _seg_70(): - return [ - (0x2F919, 'M', u'灷'), - (0x2F91A, 'M', u'炭'), - (0x2F91B, 'M', u'𠔥'), - (0x2F91C, 'M', u'煅'), - (0x2F91D, 'M', u'𤉣'), - (0x2F91E, 'M', u'熜'), - (0x2F91F, 'X'), - (0x2F920, 'M', u'爨'), - (0x2F921, 'M', u'爵'), - (0x2F922, 'M', u'牐'), - (0x2F923, 'M', u'𤘈'), - (0x2F924, 'M', u'犀'), - (0x2F925, 'M', u'犕'), - (0x2F926, 'M', u'𤜵'), - (0x2F927, 'M', u'𤠔'), - (0x2F928, 'M', u'獺'), - (0x2F929, 'M', u'王'), - (0x2F92A, 'M', u'㺬'), - (0x2F92B, 'M', u'玥'), - (0x2F92C, 'M', u'㺸'), - (0x2F92E, 'M', u'瑇'), - (0x2F92F, 'M', u'瑜'), - (0x2F930, 'M', u'瑱'), - (0x2F931, 'M', u'璅'), - (0x2F932, 'M', u'瓊'), - (0x2F933, 'M', u'㼛'), - (0x2F934, 'M', u'甤'), - (0x2F935, 'M', u'𤰶'), - (0x2F936, 'M', u'甾'), - (0x2F937, 'M', u'𤲒'), - (0x2F938, 'M', u'異'), - (0x2F939, 'M', u'𢆟'), - (0x2F93A, 'M', u'瘐'), - (0x2F93B, 'M', u'𤾡'), - (0x2F93C, 'M', u'𤾸'), - (0x2F93D, 'M', u'𥁄'), - (0x2F93E, 'M', u'㿼'), - (0x2F93F, 'M', u'䀈'), - (0x2F940, 'M', u'直'), - (0x2F941, 'M', u'𥃳'), - (0x2F942, 'M', u'𥃲'), - (0x2F943, 'M', u'𥄙'), - (0x2F944, 'M', u'𥄳'), - (0x2F945, 'M', u'眞'), - (0x2F946, 'M', u'真'), - (0x2F948, 'M', u'睊'), - (0x2F949, 'M', u'䀹'), - (0x2F94A, 'M', u'瞋'), - (0x2F94B, 'M', u'䁆'), - (0x2F94C, 'M', u'䂖'), - (0x2F94D, 'M', u'𥐝'), - (0x2F94E, 'M', u'硎'), - (0x2F94F, 'M', u'碌'), - (0x2F950, 'M', u'磌'), - (0x2F951, 'M', u'䃣'), - (0x2F952, 'M', u'𥘦'), - (0x2F953, 'M', u'祖'), - (0x2F954, 'M', u'𥚚'), - (0x2F955, 'M', u'𥛅'), - (0x2F956, 'M', u'福'), - (0x2F957, 'M', u'秫'), - (0x2F958, 'M', u'䄯'), - (0x2F959, 'M', u'穀'), - (0x2F95A, 'M', u'穊'), - (0x2F95B, 'M', u'穏'), - (0x2F95C, 'M', u'𥥼'), - (0x2F95D, 'M', u'𥪧'), - (0x2F95F, 'X'), - (0x2F960, 'M', u'䈂'), - (0x2F961, 'M', u'𥮫'), - (0x2F962, 'M', u'篆'), - (0x2F963, 'M', u'築'), - (0x2F964, 'M', u'䈧'), - (0x2F965, 'M', u'𥲀'), - (0x2F966, 'M', u'糒'), - (0x2F967, 'M', u'䊠'), - (0x2F968, 'M', u'糨'), - (0x2F969, 'M', u'糣'), - (0x2F96A, 'M', u'紀'), - (0x2F96B, 'M', u'𥾆'), - (0x2F96C, 'M', u'絣'), - (0x2F96D, 'M', u'䌁'), - (0x2F96E, 'M', u'緇'), - (0x2F96F, 'M', u'縂'), - (0x2F970, 'M', u'繅'), - (0x2F971, 'M', u'䌴'), - (0x2F972, 'M', u'𦈨'), - (0x2F973, 'M', u'𦉇'), - (0x2F974, 'M', u'䍙'), - (0x2F975, 'M', u'𦋙'), - (0x2F976, 'M', u'罺'), - (0x2F977, 'M', u'𦌾'), - (0x2F978, 'M', u'羕'), - (0x2F979, 'M', u'翺'), - (0x2F97A, 'M', u'者'), - (0x2F97B, 'M', u'𦓚'), - (0x2F97C, 'M', u'𦔣'), - (0x2F97D, 'M', u'聠'), - (0x2F97E, 'M', u'𦖨'), - (0x2F97F, 'M', u'聰'), - ] - -def _seg_71(): - return [ - (0x2F980, 'M', u'𣍟'), - (0x2F981, 'M', u'䏕'), - (0x2F982, 'M', u'育'), - (0x2F983, 'M', u'脃'), - (0x2F984, 'M', u'䐋'), - (0x2F985, 'M', u'脾'), - (0x2F986, 'M', u'媵'), - (0x2F987, 'M', u'𦞧'), - (0x2F988, 'M', u'𦞵'), - (0x2F989, 'M', u'𣎓'), - (0x2F98A, 'M', u'𣎜'), - (0x2F98B, 'M', u'舁'), - (0x2F98C, 'M', u'舄'), - (0x2F98D, 'M', u'辞'), - (0x2F98E, 'M', u'䑫'), - (0x2F98F, 'M', u'芑'), - (0x2F990, 'M', u'芋'), - (0x2F991, 'M', u'芝'), - (0x2F992, 'M', u'劳'), - (0x2F993, 'M', u'花'), - (0x2F994, 'M', u'芳'), - (0x2F995, 'M', u'芽'), - (0x2F996, 'M', u'苦'), - (0x2F997, 'M', u'𦬼'), - (0x2F998, 'M', u'若'), - (0x2F999, 'M', u'茝'), - (0x2F99A, 'M', u'荣'), - (0x2F99B, 'M', u'莭'), - (0x2F99C, 'M', u'茣'), - (0x2F99D, 'M', u'莽'), - (0x2F99E, 'M', u'菧'), - (0x2F99F, 'M', u'著'), - (0x2F9A0, 'M', u'荓'), - (0x2F9A1, 'M', u'菊'), - (0x2F9A2, 'M', u'菌'), - (0x2F9A3, 'M', u'菜'), - (0x2F9A4, 'M', u'𦰶'), - (0x2F9A5, 'M', u'𦵫'), - (0x2F9A6, 'M', u'𦳕'), - (0x2F9A7, 'M', u'䔫'), - (0x2F9A8, 'M', u'蓱'), - (0x2F9A9, 'M', u'蓳'), - (0x2F9AA, 'M', u'蔖'), - (0x2F9AB, 'M', u'𧏊'), - (0x2F9AC, 'M', u'蕤'), - (0x2F9AD, 'M', u'𦼬'), - (0x2F9AE, 'M', u'䕝'), - (0x2F9AF, 'M', u'䕡'), - (0x2F9B0, 'M', u'𦾱'), - (0x2F9B1, 'M', u'𧃒'), - (0x2F9B2, 'M', u'䕫'), - (0x2F9B3, 'M', u'虐'), - (0x2F9B4, 'M', u'虜'), - (0x2F9B5, 'M', u'虧'), - (0x2F9B6, 'M', u'虩'), - (0x2F9B7, 'M', u'蚩'), - (0x2F9B8, 'M', u'蚈'), - (0x2F9B9, 'M', u'蜎'), - (0x2F9BA, 'M', u'蛢'), - (0x2F9BB, 'M', u'蝹'), - (0x2F9BC, 'M', u'蜨'), - (0x2F9BD, 'M', u'蝫'), - (0x2F9BE, 'M', u'螆'), - (0x2F9BF, 'X'), - (0x2F9C0, 'M', u'蟡'), - (0x2F9C1, 'M', u'蠁'), - (0x2F9C2, 'M', u'䗹'), - (0x2F9C3, 'M', u'衠'), - (0x2F9C4, 'M', u'衣'), - (0x2F9C5, 'M', u'𧙧'), - (0x2F9C6, 'M', u'裗'), - (0x2F9C7, 'M', u'裞'), - (0x2F9C8, 'M', u'䘵'), - (0x2F9C9, 'M', u'裺'), - (0x2F9CA, 'M', u'㒻'), - (0x2F9CB, 'M', u'𧢮'), - (0x2F9CC, 'M', u'𧥦'), - (0x2F9CD, 'M', u'䚾'), - (0x2F9CE, 'M', u'䛇'), - (0x2F9CF, 'M', u'誠'), - (0x2F9D0, 'M', u'諭'), - (0x2F9D1, 'M', u'變'), - (0x2F9D2, 'M', u'豕'), - (0x2F9D3, 'M', u'𧲨'), - (0x2F9D4, 'M', u'貫'), - (0x2F9D5, 'M', u'賁'), - (0x2F9D6, 'M', u'贛'), - (0x2F9D7, 'M', u'起'), - (0x2F9D8, 'M', u'𧼯'), - (0x2F9D9, 'M', u'𠠄'), - (0x2F9DA, 'M', u'跋'), - (0x2F9DB, 'M', u'趼'), - (0x2F9DC, 'M', u'跰'), - (0x2F9DD, 'M', u'𠣞'), - (0x2F9DE, 'M', u'軔'), - (0x2F9DF, 'M', u'輸'), - (0x2F9E0, 'M', u'𨗒'), - (0x2F9E1, 'M', u'𨗭'), - (0x2F9E2, 'M', u'邔'), - (0x2F9E3, 'M', u'郱'), - ] - -def _seg_72(): - return [ - (0x2F9E4, 'M', u'鄑'), - (0x2F9E5, 'M', u'𨜮'), - (0x2F9E6, 'M', u'鄛'), - (0x2F9E7, 'M', u'鈸'), - (0x2F9E8, 'M', u'鋗'), - (0x2F9E9, 'M', u'鋘'), - (0x2F9EA, 'M', u'鉼'), - (0x2F9EB, 'M', u'鏹'), - (0x2F9EC, 'M', u'鐕'), - (0x2F9ED, 'M', u'𨯺'), - (0x2F9EE, 'M', u'開'), - (0x2F9EF, 'M', u'䦕'), - (0x2F9F0, 'M', u'閷'), - (0x2F9F1, 'M', u'𨵷'), - (0x2F9F2, 'M', u'䧦'), - (0x2F9F3, 'M', u'雃'), - (0x2F9F4, 'M', u'嶲'), - (0x2F9F5, 'M', u'霣'), - (0x2F9F6, 'M', u'𩅅'), - (0x2F9F7, 'M', u'𩈚'), - (0x2F9F8, 'M', u'䩮'), - (0x2F9F9, 'M', u'䩶'), - (0x2F9FA, 'M', u'韠'), - (0x2F9FB, 'M', u'𩐊'), - (0x2F9FC, 'M', u'䪲'), - (0x2F9FD, 'M', u'𩒖'), - (0x2F9FE, 'M', u'頋'), - (0x2FA00, 'M', u'頩'), - (0x2FA01, 'M', u'𩖶'), - (0x2FA02, 'M', u'飢'), - (0x2FA03, 'M', u'䬳'), - (0x2FA04, 'M', u'餩'), - (0x2FA05, 'M', u'馧'), - (0x2FA06, 'M', u'駂'), - (0x2FA07, 'M', u'駾'), - (0x2FA08, 'M', u'䯎'), - (0x2FA09, 'M', u'𩬰'), - (0x2FA0A, 'M', u'鬒'), - (0x2FA0B, 'M', u'鱀'), - (0x2FA0C, 'M', u'鳽'), - (0x2FA0D, 'M', u'䳎'), - (0x2FA0E, 'M', u'䳭'), - (0x2FA0F, 'M', u'鵧'), - (0x2FA10, 'M', u'𪃎'), - (0x2FA11, 'M', u'䳸'), - (0x2FA12, 'M', u'𪄅'), - (0x2FA13, 'M', u'𪈎'), - (0x2FA14, 'M', u'𪊑'), - (0x2FA15, 'M', u'麻'), - (0x2FA16, 'M', u'䵖'), - (0x2FA17, 'M', u'黹'), - (0x2FA18, 'M', u'黾'), - (0x2FA19, 'M', u'鼅'), - (0x2FA1A, 'M', u'鼏'), - (0x2FA1B, 'M', u'鼖'), - (0x2FA1C, 'M', u'鼻'), - (0x2FA1D, 'M', u'𪘀'), - (0x2FA1E, 'X'), - (0xE0100, 'I'), - (0xE01F0, 'X'), - ] - -uts46data = tuple( - _seg_0() - + _seg_1() - + _seg_2() - + _seg_3() - + _seg_4() - + _seg_5() - + _seg_6() - + _seg_7() - + _seg_8() - + _seg_9() - + _seg_10() - + _seg_11() - + _seg_12() - + _seg_13() - + _seg_14() - + _seg_15() - + _seg_16() - + _seg_17() - + _seg_18() - + _seg_19() - + _seg_20() - + _seg_21() - + _seg_22() - + _seg_23() - + _seg_24() - + _seg_25() - + _seg_26() - + _seg_27() - + _seg_28() - + _seg_29() - + _seg_30() - + _seg_31() - + _seg_32() - + _seg_33() - + _seg_34() - + _seg_35() - + _seg_36() - + _seg_37() - + _seg_38() - + _seg_39() - + _seg_40() - + _seg_41() - + _seg_42() - + _seg_43() - + _seg_44() - + _seg_45() - + _seg_46() - + _seg_47() - + _seg_48() - + _seg_49() - + _seg_50() - + _seg_51() - + _seg_52() - + _seg_53() - + _seg_54() - + _seg_55() - + _seg_56() - + _seg_57() - + _seg_58() - + _seg_59() - + _seg_60() - + _seg_61() - + _seg_62() - + _seg_63() - + _seg_64() - + _seg_65() - + _seg_66() - + _seg_67() - + _seg_68() - + _seg_69() - + _seg_70() - + _seg_71() - + _seg_72() -) diff --git a/requests/__init__.py b/requests/__init__.py deleted file mode 100644 index 268e7dcc..00000000 --- a/requests/__init__.py +++ /dev/null @@ -1,121 +0,0 @@ -# -*- coding: utf-8 -*- - -# __ -# /__) _ _ _ _ _/ _ -# / ( (- (/ (/ (- _) / _) -# / - -""" -Requests HTTP Library -~~~~~~~~~~~~~~~~~~~~~ - -Requests is an HTTP library, written in Python, for human beings. Basic GET -usage: - - >>> import requests - >>> r = requests.get('https://www.python.org') - >>> r.status_code - 200 - >>> 'Python is a programming language' in r.content - True - -... or POST: - - >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post('http://httpbin.org/post', data=payload) - >>> print(r.text) - { - ... - "form": { - "key2": "value2", - "key1": "value1" - }, - ... - } - -The other HTTP methods are supported - see `requests.api`. Full documentation -is at . - -:copyright: (c) 2017 by Kenneth Reitz. -:license: Apache 2.0, see LICENSE for more details. -""" - -import urllib3 -import chardet -import warnings -from .exceptions import RequestsDependencyWarning - - -def check_compatibility(urllib3_version, chardet_version): - urllib3_version = urllib3_version.split('.') - assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. - - # Sometimes, urllib3 only reports its version as 16.1. - if len(urllib3_version) == 2: - urllib3_version.append('0') - - # Check urllib3 for compatibility. - major, minor, patch = urllib3_version # noqa: F811 - major, minor, patch = int(major), int(minor), int(patch) - # urllib3 >= 1.21.1, <= 1.22 - assert major == 1 - assert minor >= 21 - assert minor <= 22 - - # Check chardet for compatibility. - major, minor, patch = chardet_version.split('.')[:3] - major, minor, patch = int(major), int(minor), int(patch) - # chardet >= 3.0.2, < 3.1.0 - assert major == 3 - assert minor < 1 - assert patch >= 2 - - -# Check imported dependencies for compatibility. -try: - check_compatibility(urllib3.__version__, chardet.__version__) -except (AssertionError, ValueError): - warnings.warn("urllib3 ({0}) or chardet ({1}) doesn't match a supported " - "version!".format(urllib3.__version__, chardet.__version__), - RequestsDependencyWarning) - -# Attempt to enable urllib3's SNI support, if possible -try: - from urllib3.contrib import pyopenssl - pyopenssl.inject_into_urllib3() -except ImportError: - pass - -# urllib3's DependencyWarnings should be silenced. -from urllib3.exceptions import DependencyWarning -warnings.simplefilter('ignore', DependencyWarning) - -from .__version__ import __title__, __description__, __url__, __version__ -from .__version__ import __build__, __author__, __author_email__, __license__ -from .__version__ import __copyright__, __cake__ - -from . import utils -from . import packages -from .models import Request, Response, PreparedRequest -from .api import request, get, head, post, patch, put, delete, options -from .sessions import session, Session -from .status_codes import codes -from .exceptions import ( - RequestException, Timeout, URLRequired, - TooManyRedirects, HTTPError, ConnectionError, - FileModeWarning, ConnectTimeout, ReadTimeout -) - -# Set default logging handler to avoid "No handler found" warnings. -import logging -try: # Python 2.7+ - from logging import NullHandler -except ImportError: - class NullHandler(logging.Handler): - def emit(self, record): - pass - -logging.getLogger(__name__).addHandler(NullHandler()) - -# FileModeWarnings go off per the default. -warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/requests/__version__.py b/requests/__version__.py deleted file mode 100644 index dc33eef6..00000000 --- a/requests/__version__.py +++ /dev/null @@ -1,14 +0,0 @@ -# .-. .-. .-. . . .-. .-. .-. .-. -# |( |- |.| | | |- `-. | `-. -# ' ' `-' `-`.`-' `-' `-' ' `-' - -__title__ = 'requests' -__description__ = 'Python HTTP for Humans.' -__url__ = 'http://python-requests.org' -__version__ = '2.18.4' -__build__ = 0x021804 -__author__ = 'Kenneth Reitz' -__author_email__ = 'me@kennethreitz.org' -__license__ = 'Apache 2.0' -__copyright__ = 'Copyright 2017 Kenneth Reitz' -__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/requests/_internal_utils.py b/requests/_internal_utils.py deleted file mode 100644 index 759d9a56..00000000 --- a/requests/_internal_utils.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests._internal_utils -~~~~~~~~~~~~~~ - -Provides utility functions that are consumed internally by Requests -which depend on extremely few external helpers (such as compat) -""" - -from .compat import is_py2, builtin_str, str - - -def to_native_string(string, encoding='ascii'): - """Given a string object, regardless of type, returns a representation of - that string in the native string type, encoding and decoding where - necessary. This assumes ASCII unless told otherwise. - """ - if isinstance(string, builtin_str): - out = string - else: - if is_py2: - out = string.encode(encoding) - else: - out = string.decode(encoding) - - return out - - -def unicode_is_ascii(u_string): - """Determine if unicode string only contains ASCII characters. - - :param str u_string: unicode string to check. Must be unicode - and not Python 2 `str`. - :rtype: bool - """ - assert isinstance(u_string, str) - try: - u_string.encode('ascii') - return True - except UnicodeEncodeError: - return False diff --git a/requests/adapters.py b/requests/adapters.py deleted file mode 100644 index 00f8792b..00000000 --- a/requests/adapters.py +++ /dev/null @@ -1,525 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.adapters -~~~~~~~~~~~~~~~~~ - -This module contains the transport adapters that Requests uses to define -and maintain connections. -""" - -import os.path -import socket - -from urllib3.poolmanager import PoolManager, proxy_from_url -from urllib3.response import HTTPResponse -from urllib3.util import Timeout as TimeoutSauce -from urllib3.util.retry import Retry -from urllib3.exceptions import ClosedPoolError -from urllib3.exceptions import ConnectTimeoutError -from urllib3.exceptions import HTTPError as _HTTPError -from urllib3.exceptions import MaxRetryError -from urllib3.exceptions import NewConnectionError -from urllib3.exceptions import ProxyError as _ProxyError -from urllib3.exceptions import ProtocolError -from urllib3.exceptions import ReadTimeoutError -from urllib3.exceptions import SSLError as _SSLError -from urllib3.exceptions import ResponseError - -from .models import Response -from .compat import urlparse, basestring -from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers, - prepend_scheme_if_needed, get_auth_from_url, urldefragauth, - select_proxy) -from .structures import CaseInsensitiveDict -from .cookies import extract_cookies_to_jar -from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, - ProxyError, RetryError, InvalidSchema) -from .auth import _basic_auth_str - -try: - from urllib3.contrib.socks import SOCKSProxyManager -except ImportError: - def SOCKSProxyManager(*args, **kwargs): - raise InvalidSchema("Missing dependencies for SOCKS support.") - -DEFAULT_POOLBLOCK = False -DEFAULT_POOLSIZE = 10 -DEFAULT_RETRIES = 0 -DEFAULT_POOL_TIMEOUT = None - - -class BaseAdapter(object): - """The Base Transport Adapter""" - - def __init__(self): - super(BaseAdapter, self).__init__() - - def send(self, request, stream=False, timeout=None, verify=True, - cert=None, proxies=None): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest ` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) ` tuple. - :type timeout: float or tuple - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - """ - raise NotImplementedError - - def close(self): - """Cleans up adapter specific items.""" - raise NotImplementedError - - -class HTTPAdapter(BaseAdapter): - """The built-in HTTP Adapter for urllib3. - - Provides a general-case interface for Requests sessions to contact HTTP and - HTTPS urls by implementing the Transport Adapter interface. This class will - usually be created by the :class:`Session ` class under the - covers. - - :param pool_connections: The number of urllib3 connection pools to cache. - :param pool_maxsize: The maximum number of connections to save in the pool. - :param max_retries: The maximum number of retries each connection - should attempt. Note, this applies only to failed DNS lookups, socket - connections and connection timeouts, never to requests where data has - made it to the server. By default, Requests does not retry failed - connections. If you need granular control over the conditions under - which we retry a request, import urllib3's ``Retry`` class and pass - that instead. - :param pool_block: Whether the connection pool should block for connections. - - Usage:: - - >>> import requests - >>> s = requests.Session() - >>> a = requests.adapters.HTTPAdapter(max_retries=3) - >>> s.mount('http://', a) - """ - __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', - '_pool_block'] - - def __init__(self, pool_connections=DEFAULT_POOLSIZE, - pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, - pool_block=DEFAULT_POOLBLOCK): - if max_retries == DEFAULT_RETRIES: - self.max_retries = Retry(0, read=False) - else: - self.max_retries = Retry.from_int(max_retries) - self.config = {} - self.proxy_manager = {} - - super(HTTPAdapter, self).__init__() - - self._pool_connections = pool_connections - self._pool_maxsize = pool_maxsize - self._pool_block = pool_block - - self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) - - def __getstate__(self): - return dict((attr, getattr(self, attr, None)) for attr in - self.__attrs__) - - def __setstate__(self, state): - # Can't handle by adding 'proxy_manager' to self.__attrs__ because - # self.poolmanager uses a lambda function, which isn't pickleable. - self.proxy_manager = {} - self.config = {} - - for attr, value in state.items(): - setattr(self, attr, value) - - self.init_poolmanager(self._pool_connections, self._pool_maxsize, - block=self._pool_block) - - def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): - """Initializes a urllib3 PoolManager. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param connections: The number of urllib3 connection pools to cache. - :param maxsize: The maximum number of connections to save in the pool. - :param block: Block when no free connections are available. - :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. - """ - # save these values for pickling - self._pool_connections = connections - self._pool_maxsize = maxsize - self._pool_block = block - - self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, - block=block, strict=True, **pool_kwargs) - - def proxy_manager_for(self, proxy, **proxy_kwargs): - """Return urllib3 ProxyManager for the given proxy. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param proxy: The proxy to return a urllib3 ProxyManager for. - :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. - :returns: ProxyManager - :rtype: urllib3.ProxyManager - """ - if proxy in self.proxy_manager: - manager = self.proxy_manager[proxy] - elif proxy.lower().startswith('socks'): - username, password = get_auth_from_url(proxy) - manager = self.proxy_manager[proxy] = SOCKSProxyManager( - proxy, - username=username, - password=password, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs - ) - else: - proxy_headers = self.proxy_headers(proxy) - manager = self.proxy_manager[proxy] = proxy_from_url( - proxy, - proxy_headers=proxy_headers, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs) - - return manager - - def cert_verify(self, conn, url, verify, cert): - """Verify a SSL certificate. This method should not be called from user - code, and is only exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param conn: The urllib3 connection object associated with the cert. - :param url: The requested URL. - :param verify: Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: The SSL certificate to verify. - """ - if url.lower().startswith('https') and verify: - - cert_loc = None - - # Allow self-specified cert location. - if verify is not True: - cert_loc = verify - - if not cert_loc: - cert_loc = DEFAULT_CA_BUNDLE_PATH - - if not cert_loc or not os.path.exists(cert_loc): - raise IOError("Could not find a suitable TLS CA certificate bundle, " - "invalid path: {0}".format(cert_loc)) - - conn.cert_reqs = 'CERT_REQUIRED' - - if not os.path.isdir(cert_loc): - conn.ca_certs = cert_loc - else: - conn.ca_cert_dir = cert_loc - else: - conn.cert_reqs = 'CERT_NONE' - conn.ca_certs = None - conn.ca_cert_dir = None - - if cert: - if not isinstance(cert, basestring): - conn.cert_file = cert[0] - conn.key_file = cert[1] - else: - conn.cert_file = cert - conn.key_file = None - if conn.cert_file and not os.path.exists(conn.cert_file): - raise IOError("Could not find the TLS certificate file, " - "invalid path: {0}".format(conn.cert_file)) - if conn.key_file and not os.path.exists(conn.key_file): - raise IOError("Could not find the TLS key file, " - "invalid path: {0}".format(conn.key_file)) - - def build_response(self, req, resp): - """Builds a :class:`Response ` object from a urllib3 - response. This should not be called from user code, and is only exposed - for use when subclassing the - :class:`HTTPAdapter ` - - :param req: The :class:`PreparedRequest ` used to generate the response. - :param resp: The urllib3 response object. - :rtype: requests.Response - """ - response = Response() - - # Fallback to None if there's no status_code, for whatever reason. - response.status_code = getattr(resp, 'status', None) - - # Make headers case-insensitive. - response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) - - # Set encoding. - response.encoding = get_encoding_from_headers(response.headers) - response.raw = resp - response.reason = response.raw.reason - - if isinstance(req.url, bytes): - response.url = req.url.decode('utf-8') - else: - response.url = req.url - - # Add new cookies from the server. - extract_cookies_to_jar(response.cookies, req, resp) - - # Give the Response some context. - response.request = req - response.connection = self - - return response - - def get_connection(self, url, proxies=None): - """Returns a urllib3 connection for the given URL. This should not be - called from user code, and is only exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param url: The URL to connect to. - :param proxies: (optional) A Requests-style dictionary of proxies used on this request. - :rtype: urllib3.ConnectionPool - """ - proxy = select_proxy(url, proxies) - - if proxy: - proxy = prepend_scheme_if_needed(proxy, 'http') - proxy_manager = self.proxy_manager_for(proxy) - conn = proxy_manager.connection_from_url(url) - else: - # Only scheme should be lower case - parsed = urlparse(url) - url = parsed.geturl() - conn = self.poolmanager.connection_from_url(url) - - return conn - - def close(self): - """Disposes of any internal state. - - Currently, this closes the PoolManager and any active ProxyManager, - which closes any pooled connections. - """ - self.poolmanager.clear() - for proxy in self.proxy_manager.values(): - proxy.clear() - - def request_url(self, request, proxies): - """Obtain the url to use when making the final request. - - If the message is being sent through a HTTP proxy, the full URL has to - be used. Otherwise, we should only use the path portion of the URL. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter `. - - :param request: The :class:`PreparedRequest ` being sent. - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. - :rtype: str - """ - proxy = select_proxy(request.url, proxies) - scheme = urlparse(request.url).scheme - - is_proxied_http_request = (proxy and scheme != 'https') - using_socks_proxy = False - if proxy: - proxy_scheme = urlparse(proxy).scheme.lower() - using_socks_proxy = proxy_scheme.startswith('socks') - - url = request.path_url - if is_proxied_http_request and not using_socks_proxy: - url = urldefragauth(request.url) - - return url - - def add_headers(self, request, **kwargs): - """Add any headers needed by the connection. As of v2.0 this does - nothing by default, but is left for overriding by users that subclass - the :class:`HTTPAdapter `. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter `. - - :param request: The :class:`PreparedRequest ` to add headers to. - :param kwargs: The keyword arguments from the call to send(). - """ - pass - - def proxy_headers(self, proxy): - """Returns a dictionary of the headers to add to any request sent - through a proxy. This works with urllib3 magic to ensure that they are - correctly sent to the proxy, rather than in a tunnelled request if - CONNECT is being used. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter `. - - :param proxies: The url of the proxy being used for this request. - :rtype: dict - """ - headers = {} - username, password = get_auth_from_url(proxy) - - if username: - headers['Proxy-Authorization'] = _basic_auth_str(username, - password) - - return headers - - def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest ` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) ` tuple. - :type timeout: float or tuple or urllib3 Timeout object - :param verify: (optional) Either a boolean, in which case it controls whether - we verify the server's TLS certificate, or a string, in which case it - must be a path to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - :rtype: requests.Response - """ - - conn = self.get_connection(request.url, proxies) - - self.cert_verify(conn, request.url, verify, cert) - url = self.request_url(request, proxies) - self.add_headers(request) - - chunked = not (request.body is None or 'Content-Length' in request.headers) - - if isinstance(timeout, tuple): - try: - connect, read = timeout - timeout = TimeoutSauce(connect=connect, read=read) - except ValueError as e: - # this may raise a string formatting error. - err = ("Invalid timeout {0}. Pass a (connect, read) " - "timeout tuple, or a single float to set " - "both timeouts to the same value".format(timeout)) - raise ValueError(err) - elif isinstance(timeout, TimeoutSauce): - pass - else: - timeout = TimeoutSauce(connect=timeout, read=timeout) - - try: - if not chunked: - resp = conn.urlopen( - method=request.method, - url=url, - body=request.body, - headers=request.headers, - redirect=False, - assert_same_host=False, - preload_content=False, - decode_content=False, - retries=self.max_retries, - timeout=timeout - ) - - # Send the request. - else: - if hasattr(conn, 'proxy_pool'): - conn = conn.proxy_pool - - low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) - - try: - low_conn.putrequest(request.method, - url, - skip_accept_encoding=True) - - for header, value in request.headers.items(): - low_conn.putheader(header, value) - - low_conn.endheaders() - - for i in request.body: - low_conn.send(hex(len(i))[2:].encode('utf-8')) - low_conn.send(b'\r\n') - low_conn.send(i) - low_conn.send(b'\r\n') - low_conn.send(b'0\r\n\r\n') - - # Receive the response from the server - try: - # For Python 2.7+ versions, use buffering of HTTP - # responses - r = low_conn.getresponse(buffering=True) - except TypeError: - # For compatibility with Python 2.6 versions and back - r = low_conn.getresponse() - - resp = HTTPResponse.from_httplib( - r, - pool=conn, - connection=low_conn, - preload_content=False, - decode_content=False - ) - except: - # If we hit any problems here, clean up the connection. - # Then, reraise so that we can handle the actual exception. - low_conn.close() - raise - - except (ProtocolError, socket.error) as err: - raise ConnectionError(err, request=request) - - except MaxRetryError as e: - if isinstance(e.reason, ConnectTimeoutError): - # TODO: Remove this in 3.0.0: see #2811 - if not isinstance(e.reason, NewConnectionError): - raise ConnectTimeout(e, request=request) - - if isinstance(e.reason, ResponseError): - raise RetryError(e, request=request) - - if isinstance(e.reason, _ProxyError): - raise ProxyError(e, request=request) - - if isinstance(e.reason, _SSLError): - # This branch is for urllib3 v1.22 and later. - raise SSLError(e, request=request) - - raise ConnectionError(e, request=request) - - except ClosedPoolError as e: - raise ConnectionError(e, request=request) - - except _ProxyError as e: - raise ProxyError(e) - - except (_SSLError, _HTTPError) as e: - if isinstance(e, _SSLError): - # This branch is for urllib3 versions earlier than v1.22 - raise SSLError(e, request=request) - elif isinstance(e, ReadTimeoutError): - raise ReadTimeout(e, request=request) - else: - raise - - return self.build_response(request, resp) diff --git a/requests/api.py b/requests/api.py deleted file mode 100644 index bc2115c1..00000000 --- a/requests/api.py +++ /dev/null @@ -1,152 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.api -~~~~~~~~~~~~ - -This module implements the Requests API. - -:copyright: (c) 2012 by Kenneth Reitz. -:license: Apache2, see LICENSE for more details. -""" - -from . import sessions - - -def request(method, url, **kwargs): - """Constructs and sends a :class:`Request `. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. - :param data: (optional) Dictionary or list of tuples ``[(key, value)]`` (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. - :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. - ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` - or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string - defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers - to add for the file. - :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How many seconds to wait for the server to send data - before giving up, as a float, or a :ref:`(connect timeout, read - timeout) ` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. - :param stream: (optional) if ``False``, the response content will be immediately downloaded. - :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. - :return: :class:`Response ` object - :rtype: requests.Response - - Usage:: - - >>> import requests - >>> req = requests.request('GET', 'http://httpbin.org/get') - - """ - - # By using the 'with' statement we are sure the session is closed, thus we - # avoid leaving sockets open which can trigger a ResourceWarning in some - # cases, and look like a memory leak in others. - with sessions.Session() as session: - return session.request(method=method, url=url, **kwargs) - - -def get(url, params=None, **kwargs): - r"""Sends a GET request. - - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return request('get', url, params=params, **kwargs) - - -def options(url, **kwargs): - r"""Sends an OPTIONS request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return request('options', url, **kwargs) - - -def head(url, **kwargs): - r"""Sends a HEAD request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', False) - return request('head', url, **kwargs) - - -def post(url, data=None, json=None, **kwargs): - r"""Sends a POST request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request('post', url, data=data, json=json, **kwargs) - - -def put(url, data=None, **kwargs): - r"""Sends a PUT request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request('put', url, data=data, **kwargs) - - -def patch(url, data=None, **kwargs): - r"""Sends a PATCH request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request('patch', url, data=data, **kwargs) - - -def delete(url, **kwargs): - r"""Sends a DELETE request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request('delete', url, **kwargs) diff --git a/requests/auth.py b/requests/auth.py deleted file mode 100644 index 1a182dff..00000000 --- a/requests/auth.py +++ /dev/null @@ -1,293 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.auth -~~~~~~~~~~~~~ - -This module contains the authentication handlers for Requests. -""" - -import os -import re -import time -import hashlib -import threading -import warnings - -from base64 import b64encode - -from .compat import urlparse, str, basestring -from .cookies import extract_cookies_to_jar -from ._internal_utils import to_native_string -from .utils import parse_dict_header - -CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' -CONTENT_TYPE_MULTI_PART = 'multipart/form-data' - - -def _basic_auth_str(username, password): - """Returns a Basic Auth string.""" - - # "I want us to put a big-ol' comment on top of it that - # says that this behaviour is dumb but we need to preserve - # it because people are relying on it." - # - Lukasa - # - # These are here solely to maintain backwards compatibility - # for things like ints. This will be removed in 3.0.0. - if not isinstance(username, basestring): - warnings.warn( - "Non-string usernames will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({0!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(username), - category=DeprecationWarning, - ) - username = str(username) - - if not isinstance(password, basestring): - warnings.warn( - "Non-string passwords will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({0!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(password), - category=DeprecationWarning, - ) - password = str(password) - # -- End Removal -- - - if isinstance(username, str): - username = username.encode('latin1') - - if isinstance(password, str): - password = password.encode('latin1') - - authstr = 'Basic ' + to_native_string( - b64encode(b':'.join((username, password))).strip() - ) - - return authstr - - -class AuthBase(object): - """Base class that all auth implementations derive from""" - - def __call__(self, r): - raise NotImplementedError('Auth hooks must be callable.') - - -class HTTPBasicAuth(AuthBase): - """Attaches HTTP Basic Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - - def __eq__(self, other): - return all([ - self.username == getattr(other, 'username', None), - self.password == getattr(other, 'password', None) - ]) - - def __ne__(self, other): - return not self == other - - def __call__(self, r): - r.headers['Authorization'] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPProxyAuth(HTTPBasicAuth): - """Attaches HTTP Proxy Authentication to a given Request object.""" - - def __call__(self, r): - r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPDigestAuth(AuthBase): - """Attaches HTTP Digest Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - # Keep state in per-thread local storage - self._thread_local = threading.local() - - def init_per_thread_state(self): - # Ensure state is initialized just once per-thread - if not hasattr(self._thread_local, 'init'): - self._thread_local.init = True - self._thread_local.last_nonce = '' - self._thread_local.nonce_count = 0 - self._thread_local.chal = {} - self._thread_local.pos = None - self._thread_local.num_401_calls = None - - def build_digest_header(self, method, url): - """ - :rtype: str - """ - - realm = self._thread_local.chal['realm'] - nonce = self._thread_local.chal['nonce'] - qop = self._thread_local.chal.get('qop') - algorithm = self._thread_local.chal.get('algorithm') - opaque = self._thread_local.chal.get('opaque') - hash_utf8 = None - - if algorithm is None: - _algorithm = 'MD5' - else: - _algorithm = algorithm.upper() - # lambdas assume digest modules are imported at the top level - if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': - def md5_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.md5(x).hexdigest() - hash_utf8 = md5_utf8 - elif _algorithm == 'SHA': - def sha_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha1(x).hexdigest() - hash_utf8 = sha_utf8 - - KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) - - if hash_utf8 is None: - return None - - # XXX not implemented yet - entdig = None - p_parsed = urlparse(url) - #: path is request-uri defined in RFC 2616 which should not be empty - path = p_parsed.path or "/" - if p_parsed.query: - path += '?' + p_parsed.query - - A1 = '%s:%s:%s' % (self.username, realm, self.password) - A2 = '%s:%s' % (method, path) - - HA1 = hash_utf8(A1) - HA2 = hash_utf8(A2) - - if nonce == self._thread_local.last_nonce: - self._thread_local.nonce_count += 1 - else: - self._thread_local.nonce_count = 1 - ncvalue = '%08x' % self._thread_local.nonce_count - s = str(self._thread_local.nonce_count).encode('utf-8') - s += nonce.encode('utf-8') - s += time.ctime().encode('utf-8') - s += os.urandom(8) - - cnonce = (hashlib.sha1(s).hexdigest()[:16]) - if _algorithm == 'MD5-SESS': - HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) - - if not qop: - respdig = KD(HA1, "%s:%s" % (nonce, HA2)) - elif qop == 'auth' or 'auth' in qop.split(','): - noncebit = "%s:%s:%s:%s:%s" % ( - nonce, ncvalue, cnonce, 'auth', HA2 - ) - respdig = KD(HA1, noncebit) - else: - # XXX handle auth-int. - return None - - self._thread_local.last_nonce = nonce - - # XXX should the partial digests be encoded too? - base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ - 'response="%s"' % (self.username, realm, nonce, path, respdig) - if opaque: - base += ', opaque="%s"' % opaque - if algorithm: - base += ', algorithm="%s"' % algorithm - if entdig: - base += ', digest="%s"' % entdig - if qop: - base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) - - return 'Digest %s' % (base) - - def handle_redirect(self, r, **kwargs): - """Reset num_401_calls counter on redirects.""" - if r.is_redirect: - self._thread_local.num_401_calls = 1 - - def handle_401(self, r, **kwargs): - """ - Takes the given response and tries digest-auth, if needed. - - :rtype: requests.Response - """ - - # If response is not 4xx, do not auth - # See https://github.com/requests/requests/issues/3772 - if not 400 <= r.status_code < 500: - self._thread_local.num_401_calls = 1 - return r - - if self._thread_local.pos is not None: - # Rewind the file position indicator of the body to where - # it was to resend the request. - r.request.body.seek(self._thread_local.pos) - s_auth = r.headers.get('www-authenticate', '') - - if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: - - self._thread_local.num_401_calls += 1 - pat = re.compile(r'digest ', flags=re.IGNORECASE) - self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) - - # Consume content and release the original connection - # to allow our new request to reuse the same one. - r.content - r.close() - prep = r.request.copy() - extract_cookies_to_jar(prep._cookies, r.request, r.raw) - prep.prepare_cookies(prep._cookies) - - prep.headers['Authorization'] = self.build_digest_header( - prep.method, prep.url) - _r = r.connection.send(prep, **kwargs) - _r.history.append(r) - _r.request = prep - - return _r - - self._thread_local.num_401_calls = 1 - return r - - def __call__(self, r): - # Initialize per-thread state, if needed - self.init_per_thread_state() - # If we have a saved nonce, skip the 401 - if self._thread_local.last_nonce: - r.headers['Authorization'] = self.build_digest_header(r.method, r.url) - try: - self._thread_local.pos = r.body.tell() - except AttributeError: - # In the case of HTTPDigestAuth being reused and the body of - # the previous request was a file-like object, pos has the - # file position of the previous body. Ensure it's set to - # None. - self._thread_local.pos = None - r.register_hook('response', self.handle_401) - r.register_hook('response', self.handle_redirect) - self._thread_local.num_401_calls = 1 - - return r - - def __eq__(self, other): - return all([ - self.username == getattr(other, 'username', None), - self.password == getattr(other, 'password', None) - ]) - - def __ne__(self, other): - return not self == other diff --git a/requests/certs.py b/requests/certs.py deleted file mode 100644 index d1a378d7..00000000 --- a/requests/certs.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -requests.certs -~~~~~~~~~~~~~~ - -This module returns the preferred default CA certificate bundle. There is -only one — the one from the certifi package. - -If you are packaging Requests, e.g., for a Linux distribution or a managed -environment, you can change the definition of where() to return a separately -packaged CA bundle. -""" -from certifi import where - -if __name__ == '__main__': - print(where()) diff --git a/requests/compat.py b/requests/compat.py deleted file mode 100644 index f417cfd8..00000000 --- a/requests/compat.py +++ /dev/null @@ -1,69 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.compat -~~~~~~~~~~~~~~~ - -This module handles import compatibility issues between Python 2 and -Python 3. -""" - -import chardet - -import sys - -# ------- -# Pythons -# ------- - -# Syntax sugar. -_ver = sys.version_info - -#: Python 2.x? -is_py2 = (_ver[0] == 2) - -#: Python 3.x? -is_py3 = (_ver[0] == 3) - -try: - import simplejson as json -except ImportError: - import json - -# --------- -# Specifics -# --------- - -if is_py2: - from urllib import ( - quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, - proxy_bypass, proxy_bypass_environment, getproxies_environment) - from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag - from urllib2 import parse_http_list - import cookielib - from Cookie import Morsel - from StringIO import StringIO - - from urllib3.packages.ordered_dict import OrderedDict - - builtin_str = str - bytes = str - str = unicode - basestring = basestring - numeric_types = (int, long, float) - integer_types = (int, long) - -elif is_py3: - from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag - from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment - from http import cookiejar as cookielib - from http.cookies import Morsel - from io import StringIO - from collections import OrderedDict - - builtin_str = str - str = str - bytes = bytes - basestring = (str, bytes) - numeric_types = (int, float) - integer_types = (int,) diff --git a/requests/cookies.py b/requests/cookies.py deleted file mode 100644 index ab3c88b9..00000000 --- a/requests/cookies.py +++ /dev/null @@ -1,542 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.cookies -~~~~~~~~~~~~~~~~ - -Compatibility code to be able to use `cookielib.CookieJar` with requests. - -requests.utils imports from here, so be careful with imports. -""" - -import copy -import time -import calendar -import collections - -from ._internal_utils import to_native_string -from .compat import cookielib, urlparse, urlunparse, Morsel - -try: - import threading -except ImportError: - import dummy_threading as threading - - -class MockRequest(object): - """Wraps a `requests.Request` to mimic a `urllib2.Request`. - - The code in `cookielib.CookieJar` expects this interface in order to correctly - manage cookie policies, i.e., determine whether a cookie can be set, given the - domains of the request and the cookie. - - The original request object is read-only. The client is responsible for collecting - the new headers via `get_new_headers()` and interpreting them appropriately. You - probably want `get_cookie_header`, defined below. - """ - - def __init__(self, request): - self._r = request - self._new_headers = {} - self.type = urlparse(self._r.url).scheme - - def get_type(self): - return self.type - - def get_host(self): - return urlparse(self._r.url).netloc - - def get_origin_req_host(self): - return self.get_host() - - def get_full_url(self): - # Only return the response's URL if the user hadn't set the Host - # header - if not self._r.headers.get('Host'): - return self._r.url - # If they did set it, retrieve it and reconstruct the expected domain - host = to_native_string(self._r.headers['Host'], encoding='utf-8') - parsed = urlparse(self._r.url) - # Reconstruct the URL as we expect it - return urlunparse([ - parsed.scheme, host, parsed.path, parsed.params, parsed.query, - parsed.fragment - ]) - - def is_unverifiable(self): - return True - - def has_header(self, name): - return name in self._r.headers or name in self._new_headers - - def get_header(self, name, default=None): - return self._r.headers.get(name, self._new_headers.get(name, default)) - - def add_header(self, key, val): - """cookielib has no legitimate use for this method; add it back if you find one.""" - raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") - - def add_unredirected_header(self, name, value): - self._new_headers[name] = value - - def get_new_headers(self): - return self._new_headers - - @property - def unverifiable(self): - return self.is_unverifiable() - - @property - def origin_req_host(self): - return self.get_origin_req_host() - - @property - def host(self): - return self.get_host() - - -class MockResponse(object): - """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. - - ...what? Basically, expose the parsed HTTP headers from the server response - the way `cookielib` expects to see them. - """ - - def __init__(self, headers): - """Make a MockResponse for `cookielib` to read. - - :param headers: a httplib.HTTPMessage or analogous carrying the headers - """ - self._headers = headers - - def info(self): - return self._headers - - def getheaders(self, name): - self._headers.getheaders(name) - - -def extract_cookies_to_jar(jar, request, response): - """Extract the cookies from the response into a CookieJar. - - :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) - :param request: our own requests.Request object - :param response: urllib3.HTTPResponse object - """ - if not (hasattr(response, '_original_response') and - response._original_response): - return - # the _original_response field is the wrapped httplib.HTTPResponse object, - req = MockRequest(request) - # pull out the HTTPMessage with the headers and put it in the mock: - res = MockResponse(response._original_response.msg) - jar.extract_cookies(res, req) - - -def get_cookie_header(jar, request): - """ - Produce an appropriate Cookie header string to be sent with `request`, or None. - - :rtype: str - """ - r = MockRequest(request) - jar.add_cookie_header(r) - return r.get_new_headers().get('Cookie') - - -def remove_cookie_by_name(cookiejar, name, domain=None, path=None): - """Unsets a cookie by name, by default over all domains and paths. - - Wraps CookieJar.clear(), is O(n). - """ - clearables = [] - for cookie in cookiejar: - if cookie.name != name: - continue - if domain is not None and domain != cookie.domain: - continue - if path is not None and path != cookie.path: - continue - clearables.append((cookie.domain, cookie.path, cookie.name)) - - for domain, path, name in clearables: - cookiejar.clear(domain, path, name) - - -class CookieConflictError(RuntimeError): - """There are two cookies that meet the criteria specified in the cookie jar. - Use .get and .set and include domain and path args in order to be more specific. - """ - - -class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): - """Compatibility class; is a cookielib.CookieJar, but exposes a dict - interface. - - This is the CookieJar we create by default for requests and sessions that - don't specify one, since some clients may expect response.cookies and - session.cookies to support dict operations. - - Requests does not use the dict interface internally; it's just for - compatibility with external client code. All requests code should work - out of the box with externally provided instances of ``CookieJar``, e.g. - ``LWPCookieJar`` and ``FileCookieJar``. - - Unlike a regular CookieJar, this class is pickleable. - - .. warning:: dictionary operations that are normally O(1) may be O(n). - """ - - def get(self, name, default=None, domain=None, path=None): - """Dict-like get() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - - .. warning:: operation is O(n), not O(1). - """ - try: - return self._find_no_duplicates(name, domain, path) - except KeyError: - return default - - def set(self, name, value, **kwargs): - """Dict-like set() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - """ - # support client code that unsets cookies by assignment of a None value: - if value is None: - remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) - return - - if isinstance(value, Morsel): - c = morsel_to_cookie(value) - else: - c = create_cookie(name, value, **kwargs) - self.set_cookie(c) - return c - - def iterkeys(self): - """Dict-like iterkeys() that returns an iterator of names of cookies - from the jar. - - .. seealso:: itervalues() and iteritems(). - """ - for cookie in iter(self): - yield cookie.name - - def keys(self): - """Dict-like keys() that returns a list of names of cookies from the - jar. - - .. seealso:: values() and items(). - """ - return list(self.iterkeys()) - - def itervalues(self): - """Dict-like itervalues() that returns an iterator of values of cookies - from the jar. - - .. seealso:: iterkeys() and iteritems(). - """ - for cookie in iter(self): - yield cookie.value - - def values(self): - """Dict-like values() that returns a list of values of cookies from the - jar. - - .. seealso:: keys() and items(). - """ - return list(self.itervalues()) - - def iteritems(self): - """Dict-like iteritems() that returns an iterator of name-value tuples - from the jar. - - .. seealso:: iterkeys() and itervalues(). - """ - for cookie in iter(self): - yield cookie.name, cookie.value - - def items(self): - """Dict-like items() that returns a list of name-value tuples from the - jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a - vanilla python dict of key value pairs. - - .. seealso:: keys() and values(). - """ - return list(self.iteritems()) - - def list_domains(self): - """Utility method to list all the domains in the jar.""" - domains = [] - for cookie in iter(self): - if cookie.domain not in domains: - domains.append(cookie.domain) - return domains - - def list_paths(self): - """Utility method to list all the paths in the jar.""" - paths = [] - for cookie in iter(self): - if cookie.path not in paths: - paths.append(cookie.path) - return paths - - def multiple_domains(self): - """Returns True if there are multiple domains in the jar. - Returns False otherwise. - - :rtype: bool - """ - domains = [] - for cookie in iter(self): - if cookie.domain is not None and cookie.domain in domains: - return True - domains.append(cookie.domain) - return False # there is only one domain in jar - - def get_dict(self, domain=None, path=None): - """Takes as an argument an optional domain and path and returns a plain - old Python dict of name-value pairs of cookies that meet the - requirements. - - :rtype: dict - """ - dictionary = {} - for cookie in iter(self): - if ( - (domain is None or cookie.domain == domain) and - (path is None or cookie.path == path) - ): - dictionary[cookie.name] = cookie.value - return dictionary - - def __contains__(self, name): - try: - return super(RequestsCookieJar, self).__contains__(name) - except CookieConflictError: - return True - - def __getitem__(self, name): - """Dict-like __getitem__() for compatibility with client code. Throws - exception if there are more than one cookie with name. In that case, - use the more explicit get() method instead. - - .. warning:: operation is O(n), not O(1). - """ - return self._find_no_duplicates(name) - - def __setitem__(self, name, value): - """Dict-like __setitem__ for compatibility with client code. Throws - exception if there is already a cookie of that name in the jar. In that - case, use the more explicit set() method instead. - """ - self.set(name, value) - - def __delitem__(self, name): - """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s - ``remove_cookie_by_name()``. - """ - remove_cookie_by_name(self, name) - - def set_cookie(self, cookie, *args, **kwargs): - if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): - cookie.value = cookie.value.replace('\\"', '') - return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) - - def update(self, other): - """Updates this jar with cookies from another CookieJar or dict-like""" - if isinstance(other, cookielib.CookieJar): - for cookie in other: - self.set_cookie(copy.copy(cookie)) - else: - super(RequestsCookieJar, self).update(other) - - def _find(self, name, domain=None, path=None): - """Requests uses this method internally to get cookie values. - - If there are conflicting cookies, _find arbitrarily chooses one. - See _find_no_duplicates if you want an exception thrown if there are - conflicting cookies. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :return: cookie.value - """ - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - return cookie.value - - raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) - - def _find_no_duplicates(self, name, domain=None, path=None): - """Both ``__get_item__`` and ``get`` call this function: it's never - used elsewhere in Requests. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :raises KeyError: if cookie is not found - :raises CookieConflictError: if there are multiple cookies - that match name and optionally domain and path - :return: cookie.value - """ - toReturn = None - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - if toReturn is not None: # if there are multiple cookies that meet passed in criteria - raise CookieConflictError('There are multiple cookies with name, %r' % (name)) - toReturn = cookie.value # we will eventually return this as long as no cookie conflict - - if toReturn: - return toReturn - raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) - - def __getstate__(self): - """Unlike a normal CookieJar, this class is pickleable.""" - state = self.__dict__.copy() - # remove the unpickleable RLock object - state.pop('_cookies_lock') - return state - - def __setstate__(self, state): - """Unlike a normal CookieJar, this class is pickleable.""" - self.__dict__.update(state) - if '_cookies_lock' not in self.__dict__: - self._cookies_lock = threading.RLock() - - def copy(self): - """Return a copy of this RequestsCookieJar.""" - new_cj = RequestsCookieJar() - new_cj.update(self) - return new_cj - - -def _copy_cookie_jar(jar): - if jar is None: - return None - - if hasattr(jar, 'copy'): - # We're dealing with an instance of RequestsCookieJar - return jar.copy() - # We're dealing with a generic CookieJar instance - new_jar = copy.copy(jar) - new_jar.clear() - for cookie in jar: - new_jar.set_cookie(copy.copy(cookie)) - return new_jar - - -def create_cookie(name, value, **kwargs): - """Make a cookie from underspecified parameters. - - By default, the pair of `name` and `value` will be set for the domain '' - and sent on every request (this is sometimes called a "supercookie"). - """ - result = dict( - version=0, - name=name, - value=value, - port=None, - domain='', - path='/', - secure=False, - expires=None, - discard=True, - comment=None, - comment_url=None, - rest={'HttpOnly': None}, - rfc2109=False,) - - badargs = set(kwargs) - set(result) - if badargs: - err = 'create_cookie() got unexpected keyword arguments: %s' - raise TypeError(err % list(badargs)) - - result.update(kwargs) - result['port_specified'] = bool(result['port']) - result['domain_specified'] = bool(result['domain']) - result['domain_initial_dot'] = result['domain'].startswith('.') - result['path_specified'] = bool(result['path']) - - return cookielib.Cookie(**result) - - -def morsel_to_cookie(morsel): - """Convert a Morsel object into a Cookie containing the one k/v pair.""" - - expires = None - if morsel['max-age']: - try: - expires = int(time.time() + int(morsel['max-age'])) - except ValueError: - raise TypeError('max-age: %s must be integer' % morsel['max-age']) - elif morsel['expires']: - time_template = '%a, %d-%b-%Y %H:%M:%S GMT' - expires = calendar.timegm( - time.strptime(morsel['expires'], time_template) - ) - return create_cookie( - comment=morsel['comment'], - comment_url=bool(morsel['comment']), - discard=False, - domain=morsel['domain'], - expires=expires, - name=morsel.key, - path=morsel['path'], - port=None, - rest={'HttpOnly': morsel['httponly']}, - rfc2109=False, - secure=bool(morsel['secure']), - value=morsel.value, - version=morsel['version'] or 0, - ) - - -def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): - """Returns a CookieJar from a key/value dictionary. - - :param cookie_dict: Dict of key/values to insert into CookieJar. - :param cookiejar: (optional) A cookiejar to add the cookies to. - :param overwrite: (optional) If False, will not replace cookies - already in the jar with new ones. - """ - if cookiejar is None: - cookiejar = RequestsCookieJar() - - if cookie_dict is not None: - names_from_jar = [cookie.name for cookie in cookiejar] - for name in cookie_dict: - if overwrite or (name not in names_from_jar): - cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) - - return cookiejar - - -def merge_cookies(cookiejar, cookies): - """Add cookies to cookiejar and returns a merged CookieJar. - - :param cookiejar: CookieJar object to add the cookies to. - :param cookies: Dictionary or CookieJar object to be added. - """ - if not isinstance(cookiejar, cookielib.CookieJar): - raise ValueError('You can only merge into CookieJar') - - if isinstance(cookies, dict): - cookiejar = cookiejar_from_dict( - cookies, cookiejar=cookiejar, overwrite=False) - elif isinstance(cookies, cookielib.CookieJar): - try: - cookiejar.update(cookies) - except AttributeError: - for cookie_in_jar in cookies: - cookiejar.set_cookie(cookie_in_jar) - - return cookiejar diff --git a/requests/exceptions.py b/requests/exceptions.py deleted file mode 100644 index be7eaed6..00000000 --- a/requests/exceptions.py +++ /dev/null @@ -1,122 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.exceptions -~~~~~~~~~~~~~~~~~~~ - -This module contains the set of Requests' exceptions. -""" -from urllib3.exceptions import HTTPError as BaseHTTPError - - -class RequestException(IOError): - """There was an ambiguous exception that occurred while handling your - request. - """ - - def __init__(self, *args, **kwargs): - """Initialize RequestException with `request` and `response` objects.""" - response = kwargs.pop('response', None) - self.response = response - self.request = kwargs.pop('request', None) - if (response is not None and not self.request and - hasattr(response, 'request')): - self.request = self.response.request - super(RequestException, self).__init__(*args, **kwargs) - - -class HTTPError(RequestException): - """An HTTP error occurred.""" - - -class ConnectionError(RequestException): - """A Connection error occurred.""" - - -class ProxyError(ConnectionError): - """A proxy error occurred.""" - - -class SSLError(ConnectionError): - """An SSL error occurred.""" - - -class Timeout(RequestException): - """The request timed out. - - Catching this error will catch both - :exc:`~requests.exceptions.ConnectTimeout` and - :exc:`~requests.exceptions.ReadTimeout` errors. - """ - - -class ConnectTimeout(ConnectionError, Timeout): - """The request timed out while trying to connect to the remote server. - - Requests that produced this error are safe to retry. - """ - - -class ReadTimeout(Timeout): - """The server did not send any data in the allotted amount of time.""" - - -class URLRequired(RequestException): - """A valid URL is required to make a request.""" - - -class TooManyRedirects(RequestException): - """Too many redirects.""" - - -class MissingSchema(RequestException, ValueError): - """The URL schema (e.g. http or https) is missing.""" - - -class InvalidSchema(RequestException, ValueError): - """See defaults.py for valid schemas.""" - - -class InvalidURL(RequestException, ValueError): - """The URL provided was somehow invalid.""" - - -class InvalidHeader(RequestException, ValueError): - """The header value provided was somehow invalid.""" - - -class ChunkedEncodingError(RequestException): - """The server declared chunked encoding but sent an invalid chunk.""" - - -class ContentDecodingError(RequestException, BaseHTTPError): - """Failed to decode response content""" - - -class StreamConsumedError(RequestException, TypeError): - """The content for this response was already consumed""" - - -class RetryError(RequestException): - """Custom retries logic failed""" - - -class UnrewindableBodyError(RequestException): - """Requests encountered an error when trying to rewind a body""" - -# Warnings - - -class RequestsWarning(Warning): - """Base warning for Requests.""" - pass - - -class FileModeWarning(RequestsWarning, DeprecationWarning): - """A file was opened in text mode, but Requests determined its binary length.""" - pass - - -class RequestsDependencyWarning(RequestsWarning): - """An imported dependency doesn't match the expected version range.""" - pass diff --git a/requests/help.py b/requests/help.py deleted file mode 100644 index 5440ee61..00000000 --- a/requests/help.py +++ /dev/null @@ -1,120 +0,0 @@ -"""Module containing bug report helper(s).""" -from __future__ import print_function - -import json -import platform -import sys -import ssl - -import idna -import urllib3 -import chardet - -from . import __version__ as requests_version - -try: - from .packages.urllib3.contrib import pyopenssl -except ImportError: - pyopenssl = None - OpenSSL = None - cryptography = None -else: - import OpenSSL - import cryptography - - -def _implementation(): - """Return a dict with the Python implementation and version. - - Provide both the name and the version of the Python implementation - currently running. For example, on CPython 2.7.5 it will return - {'name': 'CPython', 'version': '2.7.5'}. - - This function works best on CPython and PyPy: in particular, it probably - doesn't work for Jython or IronPython. Future investigation should be done - to work out the correct shape of the code for those platforms. - """ - implementation = platform.python_implementation() - - if implementation == 'CPython': - implementation_version = platform.python_version() - elif implementation == 'PyPy': - implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, - sys.pypy_version_info.minor, - sys.pypy_version_info.micro) - if sys.pypy_version_info.releaselevel != 'final': - implementation_version = ''.join([ - implementation_version, sys.pypy_version_info.releaselevel - ]) - elif implementation == 'Jython': - implementation_version = platform.python_version() # Complete Guess - elif implementation == 'IronPython': - implementation_version = platform.python_version() # Complete Guess - else: - implementation_version = 'Unknown' - - return {'name': implementation, 'version': implementation_version} - - -def info(): - """Generate information for a bug report.""" - try: - platform_info = { - 'system': platform.system(), - 'release': platform.release(), - } - except IOError: - platform_info = { - 'system': 'Unknown', - 'release': 'Unknown', - } - - implementation_info = _implementation() - urllib3_info = {'version': urllib3.__version__} - chardet_info = {'version': chardet.__version__} - - pyopenssl_info = { - 'version': None, - 'openssl_version': '', - } - if OpenSSL: - pyopenssl_info = { - 'version': OpenSSL.__version__, - 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, - } - cryptography_info = { - 'version': getattr(cryptography, '__version__', ''), - } - idna_info = { - 'version': getattr(idna, '__version__', ''), - } - - # OPENSSL_VERSION_NUMBER doesn't exist in the Python 2.6 ssl module. - system_ssl = getattr(ssl, 'OPENSSL_VERSION_NUMBER', None) - system_ssl_info = { - 'version': '%x' % system_ssl if system_ssl is not None else '' - } - - return { - 'platform': platform_info, - 'implementation': implementation_info, - 'system_ssl': system_ssl_info, - 'using_pyopenssl': pyopenssl is not None, - 'pyOpenSSL': pyopenssl_info, - 'urllib3': urllib3_info, - 'chardet': chardet_info, - 'cryptography': cryptography_info, - 'idna': idna_info, - 'requests': { - 'version': requests_version, - }, - } - - -def main(): - """Pretty-print the bug information as JSON.""" - print(json.dumps(info(), sort_keys=True, indent=2)) - - -if __name__ == '__main__': - main() diff --git a/requests/hooks.py b/requests/hooks.py deleted file mode 100644 index 32b32de7..00000000 --- a/requests/hooks.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.hooks -~~~~~~~~~~~~~~ - -This module provides the capabilities for the Requests hooks system. - -Available hooks: - -``response``: - The response generated from a Request. -""" -HOOKS = ['response'] - - -def default_hooks(): - return dict((event, []) for event in HOOKS) - -# TODO: response is the only one - - -def dispatch_hook(key, hooks, hook_data, **kwargs): - """Dispatches a hook dictionary on a given piece of data.""" - hooks = hooks or dict() - hooks = hooks.get(key) - if hooks: - if hasattr(hooks, '__call__'): - hooks = [hooks] - for hook in hooks: - _hook_data = hook(hook_data, **kwargs) - if _hook_data is not None: - hook_data = _hook_data - return hook_data diff --git a/requests/models.py b/requests/models.py deleted file mode 100644 index 4041cac3..00000000 --- a/requests/models.py +++ /dev/null @@ -1,948 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.models -~~~~~~~~~~~~~~~ - -This module contains the primary objects that power Requests. -""" - -import collections -import datetime -import sys - -# Import encoding now, to avoid implicit import later. -# Implicit import within threads may cause LookupError when standard library is in a ZIP, -# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. -import encodings.idna - -from urllib3.fields import RequestField -from urllib3.filepost import encode_multipart_formdata -from urllib3.util import parse_url -from urllib3.exceptions import ( - DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) - -from io import UnsupportedOperation -from .hooks import default_hooks -from .structures import CaseInsensitiveDict - -from .auth import HTTPBasicAuth -from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar -from .exceptions import ( - HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, - ContentDecodingError, ConnectionError, StreamConsumedError) -from ._internal_utils import to_native_string, unicode_is_ascii -from .utils import ( - guess_filename, get_auth_from_url, requote_uri, - stream_decode_response_unicode, to_key_val_list, parse_header_links, - iter_slices, guess_json_utf, super_len, check_header_validity) -from .compat import ( - cookielib, urlunparse, urlsplit, urlencode, str, bytes, - is_py2, chardet, builtin_str, basestring) -from .compat import json as complexjson -from .status_codes import codes - -#: The set of HTTP status codes that indicate an automatically -#: processable redirect. -REDIRECT_STATI = ( - codes.moved, # 301 - codes.found, # 302 - codes.other, # 303 - codes.temporary_redirect, # 307 - codes.permanent_redirect, # 308 -) - -DEFAULT_REDIRECT_LIMIT = 30 -CONTENT_CHUNK_SIZE = 10 * 1024 -ITER_CHUNK_SIZE = 512 - - -class RequestEncodingMixin(object): - @property - def path_url(self): - """Build the path URL to use.""" - - url = [] - - p = urlsplit(self.url) - - path = p.path - if not path: - path = '/' - - url.append(path) - - query = p.query - if query: - url.append('?') - url.append(query) - - return ''.join(url) - - @staticmethod - def _encode_params(data): - """Encode parameters in a piece of data. - - Will successfully encode parameters when passed as a dict or a list of - 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary - if parameters are supplied as a dict. - """ - - if isinstance(data, (str, bytes)): - return data - elif hasattr(data, 'read'): - return data - elif hasattr(data, '__iter__'): - result = [] - for k, vs in to_key_val_list(data): - if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): - vs = [vs] - for v in vs: - if v is not None: - result.append( - (k.encode('utf-8') if isinstance(k, str) else k, - v.encode('utf-8') if isinstance(v, str) else v)) - return urlencode(result, doseq=True) - else: - return data - - @staticmethod - def _encode_files(files, data): - """Build the body for a multipart/form-data request. - - Will successfully encode files when passed as a dict or a list of - tuples. Order is retained if data is a list of tuples but arbitrary - if parameters are supplied as a dict. - The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) - or 4-tuples (filename, fileobj, contentype, custom_headers). - """ - if (not files): - raise ValueError("Files must be provided.") - elif isinstance(data, basestring): - raise ValueError("Data must not be a string.") - - new_fields = [] - fields = to_key_val_list(data or {}) - files = to_key_val_list(files or {}) - - for field, val in fields: - if isinstance(val, basestring) or not hasattr(val, '__iter__'): - val = [val] - for v in val: - if v is not None: - # Don't call str() on bytestrings: in Py3 it all goes wrong. - if not isinstance(v, bytes): - v = str(v) - - new_fields.append( - (field.decode('utf-8') if isinstance(field, bytes) else field, - v.encode('utf-8') if isinstance(v, str) else v)) - - for (k, v) in files: - # support for explicit filename - ft = None - fh = None - if isinstance(v, (tuple, list)): - if len(v) == 2: - fn, fp = v - elif len(v) == 3: - fn, fp, ft = v - else: - fn, fp, ft, fh = v - else: - fn = guess_filename(v) or k - fp = v - - if isinstance(fp, (str, bytes, bytearray)): - fdata = fp - else: - fdata = fp.read() - - rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) - rf.make_multipart(content_type=ft) - new_fields.append(rf) - - body, content_type = encode_multipart_formdata(new_fields) - - return body, content_type - - -class RequestHooksMixin(object): - def register_hook(self, event, hook): - """Properly register a hook.""" - - if event not in self.hooks: - raise ValueError('Unsupported event specified, with event name "%s"' % (event)) - - if isinstance(hook, collections.Callable): - self.hooks[event].append(hook) - elif hasattr(hook, '__iter__'): - self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable)) - - def deregister_hook(self, event, hook): - """Deregister a previously registered hook. - Returns True if the hook existed, False if not. - """ - - try: - self.hooks[event].remove(hook) - return True - except ValueError: - return False - - -class Request(RequestHooksMixin): - """A user-created :class:`Request ` object. - - Used to prepare a :class:`PreparedRequest `, which is sent to the server. - - :param method: HTTP method to use. - :param url: URL to send. - :param headers: dictionary of headers to send. - :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place. - :param json: json for the body to attach to the request (if files or data is not specified). - :param params: dictionary of URL parameters to append to the URL. - :param auth: Auth handler or (user, pass) tuple. - :param cookies: dictionary or CookieJar of cookies to attach to this request. - :param hooks: dictionary of callback hooks, for internal usage. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'http://httpbin.org/get') - >>> req.prepare() - - """ - - def __init__(self, - method=None, url=None, headers=None, files=None, data=None, - params=None, auth=None, cookies=None, hooks=None, json=None): - - # Default empty dicts for dict params. - data = [] if data is None else data - files = [] if files is None else files - headers = {} if headers is None else headers - params = {} if params is None else params - hooks = {} if hooks is None else hooks - - self.hooks = default_hooks() - for (k, v) in list(hooks.items()): - self.register_hook(event=k, hook=v) - - self.method = method - self.url = url - self.headers = headers - self.files = files - self.data = data - self.json = json - self.params = params - self.auth = auth - self.cookies = cookies - - def __repr__(self): - return '' % (self.method) - - def prepare(self): - """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" - p = PreparedRequest() - p.prepare( - method=self.method, - url=self.url, - headers=self.headers, - files=self.files, - data=self.data, - json=self.json, - params=self.params, - auth=self.auth, - cookies=self.cookies, - hooks=self.hooks, - ) - return p - - -class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): - """The fully mutable :class:`PreparedRequest ` object, - containing the exact bytes that will be sent to the server. - - Generated from either a :class:`Request ` object or manually. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'http://httpbin.org/get') - >>> r = req.prepare() - - - >>> s = requests.Session() - >>> s.send(r) - - """ - - def __init__(self): - #: HTTP verb to send to the server. - self.method = None - #: HTTP URL to send the request to. - self.url = None - #: dictionary of HTTP headers. - self.headers = None - # The `CookieJar` used to create the Cookie header will be stored here - # after prepare_cookies is called - self._cookies = None - #: request body to send to the server. - self.body = None - #: dictionary of callback hooks, for internal usage. - self.hooks = default_hooks() - #: integer denoting starting position of a readable file-like body. - self._body_position = None - - def prepare(self, - method=None, url=None, headers=None, files=None, data=None, - params=None, auth=None, cookies=None, hooks=None, json=None): - """Prepares the entire request with the given parameters.""" - - self.prepare_method(method) - self.prepare_url(url, params) - self.prepare_headers(headers) - self.prepare_cookies(cookies) - self.prepare_body(data, files, json) - self.prepare_auth(auth, url) - - # Note that prepare_auth must be last to enable authentication schemes - # such as OAuth to work on a fully prepared request. - - # This MUST go after prepare_auth. Authenticators could add a hook - self.prepare_hooks(hooks) - - def __repr__(self): - return '' % (self.method) - - def copy(self): - p = PreparedRequest() - p.method = self.method - p.url = self.url - p.headers = self.headers.copy() if self.headers is not None else None - p._cookies = _copy_cookie_jar(self._cookies) - p.body = self.body - p.hooks = self.hooks - p._body_position = self._body_position - return p - - def prepare_method(self, method): - """Prepares the given HTTP method.""" - self.method = method - if self.method is not None: - self.method = to_native_string(self.method.upper()) - - @staticmethod - def _get_idna_encoded_host(host): - import idna - - try: - host = idna.encode(host, uts46=True).decode('utf-8') - except idna.IDNAError: - raise UnicodeError - return host - - def prepare_url(self, url, params): - """Prepares the given HTTP URL.""" - #: Accept objects that have string representations. - #: We're unable to blindly call unicode/str functions - #: as this will include the bytestring indicator (b'') - #: on python 3.x. - #: https://github.com/requests/requests/pull/2238 - if isinstance(url, bytes): - url = url.decode('utf8') - else: - url = unicode(url) if is_py2 else str(url) - - # Remove leading whitespaces from url - url = url.lstrip() - - # Don't do any URL preparation for non-HTTP schemes like `mailto`, - # `data` etc to work around exceptions from `url_parse`, which - # handles RFC 3986 only. - if ':' in url and not url.lower().startswith('http'): - self.url = url - return - - # Support for unicode domain names and paths. - try: - scheme, auth, host, port, path, query, fragment = parse_url(url) - except LocationParseError as e: - raise InvalidURL(*e.args) - - if not scheme: - error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?") - error = error.format(to_native_string(url, 'utf8')) - - raise MissingSchema(error) - - if not host: - raise InvalidURL("Invalid URL %r: No host supplied" % url) - - # In general, we want to try IDNA encoding the hostname if the string contains - # non-ASCII characters. This allows users to automatically get the correct IDNA - # behaviour. For strings containing only ASCII characters, we need to also verify - # it doesn't start with a wildcard (*), before allowing the unencoded hostname. - if not unicode_is_ascii(host): - try: - host = self._get_idna_encoded_host(host) - except UnicodeError: - raise InvalidURL('URL has an invalid label.') - elif host.startswith(u'*'): - raise InvalidURL('URL has an invalid label.') - - # Carefully reconstruct the network location - netloc = auth or '' - if netloc: - netloc += '@' - netloc += host - if port: - netloc += ':' + str(port) - - # Bare domains aren't valid URLs. - if not path: - path = '/' - - if is_py2: - if isinstance(scheme, str): - scheme = scheme.encode('utf-8') - if isinstance(netloc, str): - netloc = netloc.encode('utf-8') - if isinstance(path, str): - path = path.encode('utf-8') - if isinstance(query, str): - query = query.encode('utf-8') - if isinstance(fragment, str): - fragment = fragment.encode('utf-8') - - if isinstance(params, (str, bytes)): - params = to_native_string(params) - - enc_params = self._encode_params(params) - if enc_params: - if query: - query = '%s&%s' % (query, enc_params) - else: - query = enc_params - - url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) - self.url = url - - def prepare_headers(self, headers): - """Prepares the given HTTP headers.""" - - self.headers = CaseInsensitiveDict() - if headers: - for header in headers.items(): - # Raise exception on invalid header value. - check_header_validity(header) - name, value = header - self.headers[to_native_string(name)] = value - - def prepare_body(self, data, files, json=None): - """Prepares the given HTTP body data.""" - - # Check if file, fo, generator, iterator. - # If not, run through normal process. - - # Nottin' on you. - body = None - content_type = None - - if not data and json is not None: - # urllib3 requires a bytes-like body. Python 2's json.dumps - # provides this natively, but Python 3 gives a Unicode string. - content_type = 'application/json' - body = complexjson.dumps(json) - if not isinstance(body, bytes): - body = body.encode('utf-8') - - is_stream = all([ - hasattr(data, '__iter__'), - not isinstance(data, (basestring, list, tuple, collections.Mapping)) - ]) - - try: - length = super_len(data) - except (TypeError, AttributeError, UnsupportedOperation): - length = None - - if is_stream: - body = data - - if getattr(body, 'tell', None) is not None: - # Record the current file position before reading. - # This will allow us to rewind a file in the event - # of a redirect. - try: - self._body_position = body.tell() - except (IOError, OSError): - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body - self._body_position = object() - - if files: - raise NotImplementedError('Streamed bodies and files are mutually exclusive.') - - if length: - self.headers['Content-Length'] = builtin_str(length) - else: - self.headers['Transfer-Encoding'] = 'chunked' - else: - # Multi-part file uploads. - if files: - (body, content_type) = self._encode_files(files, data) - else: - if data: - body = self._encode_params(data) - if isinstance(data, basestring) or hasattr(data, 'read'): - content_type = None - else: - content_type = 'application/x-www-form-urlencoded' - - self.prepare_content_length(body) - - # Add content-type if it wasn't explicitly provided. - if content_type and ('content-type' not in self.headers): - self.headers['Content-Type'] = content_type - - self.body = body - - def prepare_content_length(self, body): - """Prepare Content-Length header based on request method and body""" - if body is not None: - length = super_len(body) - if length: - # If length exists, set it. Otherwise, we fallback - # to Transfer-Encoding: chunked. - self.headers['Content-Length'] = builtin_str(length) - elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: - # Set Content-Length to 0 for methods that can have a body - # but don't provide one. (i.e. not GET or HEAD) - self.headers['Content-Length'] = '0' - - def prepare_auth(self, auth, url=''): - """Prepares the given HTTP auth data.""" - - # If no Auth is explicitly provided, extract it from the URL first. - if auth is None: - url_auth = get_auth_from_url(self.url) - auth = url_auth if any(url_auth) else None - - if auth: - if isinstance(auth, tuple) and len(auth) == 2: - # special-case basic HTTP auth - auth = HTTPBasicAuth(*auth) - - # Allow auth to make its changes. - r = auth(self) - - # Update self to reflect the auth changes. - self.__dict__.update(r.__dict__) - - # Recompute Content-Length - self.prepare_content_length(self.body) - - def prepare_cookies(self, cookies): - """Prepares the given HTTP cookie data. - - This function eventually generates a ``Cookie`` header from the - given cookies using cookielib. Due to cookielib's design, the header - will not be regenerated if it already exists, meaning this function - can only be called once for the life of the - :class:`PreparedRequest ` object. Any subsequent calls - to ``prepare_cookies`` will have no actual effect, unless the "Cookie" - header is removed beforehand. - """ - if isinstance(cookies, cookielib.CookieJar): - self._cookies = cookies - else: - self._cookies = cookiejar_from_dict(cookies) - - cookie_header = get_cookie_header(self._cookies, self) - if cookie_header is not None: - self.headers['Cookie'] = cookie_header - - def prepare_hooks(self, hooks): - """Prepares the given hooks.""" - # hooks can be passed as None to the prepare method and to this - # method. To prevent iterating over None, simply use an empty list - # if hooks is False-y - hooks = hooks or [] - for event in hooks: - self.register_hook(event, hooks[event]) - - -class Response(object): - """The :class:`Response ` object, which contains a - server's response to an HTTP request. - """ - - __attrs__ = [ - '_content', 'status_code', 'headers', 'url', 'history', - 'encoding', 'reason', 'cookies', 'elapsed', 'request' - ] - - def __init__(self): - self._content = False - self._content_consumed = False - self._next = None - - #: Integer Code of responded HTTP Status, e.g. 404 or 200. - self.status_code = None - - #: Case-insensitive Dictionary of Response Headers. - #: For example, ``headers['content-encoding']`` will return the - #: value of a ``'Content-Encoding'`` response header. - self.headers = CaseInsensitiveDict() - - #: File-like object representation of response (for advanced usage). - #: Use of ``raw`` requires that ``stream=True`` be set on the request. - # This requirement does not apply for use internally to Requests. - self.raw = None - - #: Final URL location of Response. - self.url = None - - #: Encoding to decode with when accessing r.text. - self.encoding = None - - #: A list of :class:`Response ` objects from - #: the history of the Request. Any redirect responses will end - #: up here. The list is sorted from the oldest to the most recent request. - self.history = [] - - #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". - self.reason = None - - #: A CookieJar of Cookies the server sent back. - self.cookies = cookiejar_from_dict({}) - - #: The amount of time elapsed between sending the request - #: and the arrival of the response (as a timedelta). - #: This property specifically measures the time taken between sending - #: the first byte of the request and finishing parsing the headers. It - #: is therefore unaffected by consuming the response content or the - #: value of the ``stream`` keyword argument. - self.elapsed = datetime.timedelta(0) - - #: The :class:`PreparedRequest ` object to which this - #: is a response. - self.request = None - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def __getstate__(self): - # Consume everything; accessing the content attribute makes - # sure the content has been fully read. - if not self._content_consumed: - self.content - - return dict( - (attr, getattr(self, attr, None)) - for attr in self.__attrs__ - ) - - def __setstate__(self, state): - for name, value in state.items(): - setattr(self, name, value) - - # pickled objects do not have .raw - setattr(self, '_content_consumed', True) - setattr(self, 'raw', None) - - def __repr__(self): - return '' % (self.status_code) - - def __bool__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __nonzero__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __iter__(self): - """Allows you to use a response as an iterator.""" - return self.iter_content(128) - - @property - def ok(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - try: - self.raise_for_status() - except HTTPError: - return False - return True - - @property - def is_redirect(self): - """True if this Response is a well-formed HTTP redirect that could have - been processed automatically (by :meth:`Session.resolve_redirects`). - """ - return ('location' in self.headers and self.status_code in REDIRECT_STATI) - - @property - def is_permanent_redirect(self): - """True if this Response one of the permanent versions of redirect.""" - return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) - - @property - def next(self): - """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" - return self._next - - @property - def apparent_encoding(self): - """The apparent encoding, provided by the chardet library.""" - return chardet.detect(self.content)['encoding'] - - def iter_content(self, chunk_size=1, decode_unicode=False): - """Iterates over the response data. When stream=True is set on the - request, this avoids reading the content at once into memory for - large responses. The chunk size is the number of bytes it should - read into memory. This is not necessarily the length of each item - returned as decoding can take place. - - chunk_size must be of type int or None. A value of None will - function differently depending on the value of `stream`. - stream=True will read data as it arrives in whatever size the - chunks are received. If stream=False, data is returned as - a single chunk. - - If decode_unicode is True, content will be decoded using the best - available encoding based on the response. - """ - - def generate(): - # Special case for urllib3. - if hasattr(self.raw, 'stream'): - try: - for chunk in self.raw.stream(chunk_size, decode_content=True): - yield chunk - except ProtocolError as e: - raise ChunkedEncodingError(e) - except DecodeError as e: - raise ContentDecodingError(e) - except ReadTimeoutError as e: - raise ConnectionError(e) - else: - # Standard file-like object. - while True: - chunk = self.raw.read(chunk_size) - if not chunk: - break - yield chunk - - self._content_consumed = True - - if self._content_consumed and isinstance(self._content, bool): - raise StreamConsumedError() - elif chunk_size is not None and not isinstance(chunk_size, int): - raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) - # simulate reading small chunks of the content - reused_chunks = iter_slices(self._content, chunk_size) - - stream_chunks = generate() - - chunks = reused_chunks if self._content_consumed else stream_chunks - - if decode_unicode: - chunks = stream_decode_response_unicode(chunks, self) - - return chunks - - def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None): - """Iterates over the response data, one line at a time. When - stream=True is set on the request, this avoids reading the - content at once into memory for large responses. - - .. note:: This method is not reentrant safe. - """ - - pending = None - - for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): - - if pending is not None: - chunk = pending + chunk - - if delimiter: - lines = chunk.split(delimiter) - else: - lines = chunk.splitlines() - - if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: - pending = lines.pop() - else: - pending = None - - for line in lines: - yield line - - if pending is not None: - yield pending - - @property - def content(self): - """Content of the response, in bytes.""" - - if self._content is False: - # Read the contents. - if self._content_consumed: - raise RuntimeError( - 'The content for this response was already consumed') - - if self.status_code == 0 or self.raw is None: - self._content = None - else: - self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes() - - self._content_consumed = True - # don't need to release the connection; that's been handled by urllib3 - # since we exhausted the data. - return self._content - - @property - def text(self): - """Content of the response, in unicode. - - If Response.encoding is None, encoding will be guessed using - ``chardet``. - - The encoding of the response content is determined based solely on HTTP - headers, following RFC 2616 to the letter. If you can take advantage of - non-HTTP knowledge to make a better guess at the encoding, you should - set ``r.encoding`` appropriately before accessing this property. - """ - - # Try charset from content-type - content = None - encoding = self.encoding - - if not self.content: - return str('') - - # Fallback to auto-detected encoding. - if self.encoding is None: - encoding = self.apparent_encoding - - # Decode unicode from given encoding. - try: - content = str(self.content, encoding, errors='replace') - except (LookupError, TypeError): - # A LookupError is raised if the encoding was not found which could - # indicate a misspelling or similar mistake. - # - # A TypeError can be raised if encoding is None - # - # So we try blindly encoding. - content = str(self.content, errors='replace') - - return content - - def json(self, **kwargs): - r"""Returns the json-encoded content of a response, if any. - - :param \*\*kwargs: Optional arguments that ``json.loads`` takes. - :raises ValueError: If the response body does not contain valid json. - """ - - if not self.encoding and self.content and len(self.content) > 3: - # No encoding set. JSON RFC 4627 section 3 states we should expect - # UTF-8, -16 or -32. Detect which one to use; If the detection or - # decoding fails, fall back to `self.text` (using chardet to make - # a best guess). - encoding = guess_json_utf(self.content) - if encoding is not None: - try: - return complexjson.loads( - self.content.decode(encoding), **kwargs - ) - except UnicodeDecodeError: - # Wrong UTF codec detected; usually because it's not UTF-8 - # but some other 8-bit codec. This is an RFC violation, - # and the server didn't bother to tell us what codec *was* - # used. - pass - return complexjson.loads(self.text, **kwargs) - - @property - def links(self): - """Returns the parsed header links of the response, if any.""" - - header = self.headers.get('link') - - # l = MultiDict() - l = {} - - if header: - links = parse_header_links(header) - - for link in links: - key = link.get('rel') or link.get('url') - l[key] = link - - return l - - def raise_for_status(self): - """Raises stored :class:`HTTPError`, if one occurred.""" - - http_error_msg = '' - if isinstance(self.reason, bytes): - # We attempt to decode utf-8 first because some servers - # choose to localize their reason strings. If the string - # isn't utf-8, we fall back to iso-8859-1 for all other - # encodings. (See PR #3538) - try: - reason = self.reason.decode('utf-8') - except UnicodeDecodeError: - reason = self.reason.decode('iso-8859-1') - else: - reason = self.reason - - if 400 <= self.status_code < 500: - http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) - - elif 500 <= self.status_code < 600: - http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) - - if http_error_msg: - raise HTTPError(http_error_msg, response=self) - - def close(self): - """Releases the connection back to the pool. Once this method has been - called the underlying ``raw`` object must not be accessed again. - - *Note: Should not normally need to be called explicitly.* - """ - if not self._content_consumed: - self.raw.close() - - release_conn = getattr(self.raw, 'release_conn', None) - if release_conn is not None: - release_conn() diff --git a/requests/packages.py b/requests/packages.py deleted file mode 100644 index 7232fe0f..00000000 --- a/requests/packages.py +++ /dev/null @@ -1,14 +0,0 @@ -import sys - -# This code exists for backwards compatibility reasons. -# I don't like it either. Just look the other way. :) - -for package in ('urllib3', 'idna', 'chardet'): - locals()[package] = __import__(package) - # This traversal is apparently necessary such that the identities are - # preserved (requests.packages.urllib3.* is urllib3.*) - for mod in list(sys.modules): - if mod == package or mod.startswith(package + '.'): - sys.modules['requests.packages.' + mod] = sys.modules[mod] - -# Kinda cool, though, right? diff --git a/requests/sessions.py b/requests/sessions.py deleted file mode 100644 index 6570e733..00000000 --- a/requests/sessions.py +++ /dev/null @@ -1,737 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.session -~~~~~~~~~~~~~~~~ - -This module provides a Session object to manage and persist settings across -requests (cookies, auth, proxies). -""" -import os -import platform -import time -from collections import Mapping -from datetime import timedelta - -from .auth import _basic_auth_str -from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse -from .cookies import ( - cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) -from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT -from .hooks import default_hooks, dispatch_hook -from ._internal_utils import to_native_string -from .utils import to_key_val_list, default_headers -from .exceptions import ( - TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) - -from .structures import CaseInsensitiveDict -from .adapters import HTTPAdapter - -from .utils import ( - requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, - get_auth_from_url, rewind_body -) - -from .status_codes import codes - -# formerly defined here, reexposed here for backward compatibility -from .models import REDIRECT_STATI - -# Preferred clock, based on which one is more accurate on a given system. -if platform.system() == 'Windows': - try: # Python 3.3+ - preferred_clock = time.perf_counter - except AttributeError: # Earlier than Python 3. - preferred_clock = time.clock -else: - preferred_clock = time.time - - -def merge_setting(request_setting, session_setting, dict_class=OrderedDict): - """Determines appropriate setting for a given request, taking into account - the explicit setting on that request, and the setting in the session. If a - setting is a dictionary, they will be merged together using `dict_class` - """ - - if session_setting is None: - return request_setting - - if request_setting is None: - return session_setting - - # Bypass if not a dictionary (e.g. verify) - if not ( - isinstance(session_setting, Mapping) and - isinstance(request_setting, Mapping) - ): - return request_setting - - merged_setting = dict_class(to_key_val_list(session_setting)) - merged_setting.update(to_key_val_list(request_setting)) - - # Remove keys that are set to None. Extract keys first to avoid altering - # the dictionary during iteration. - none_keys = [k for (k, v) in merged_setting.items() if v is None] - for key in none_keys: - del merged_setting[key] - - return merged_setting - - -def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): - """Properly merges both requests and session hooks. - - This is necessary because when request_hooks == {'response': []}, the - merge breaks Session hooks entirely. - """ - if session_hooks is None or session_hooks.get('response') == []: - return request_hooks - - if request_hooks is None or request_hooks.get('response') == []: - return session_hooks - - return merge_setting(request_hooks, session_hooks, dict_class) - - -class SessionRedirectMixin(object): - - def get_redirect_target(self, resp): - """Receives a Response. Returns a redirect URI or ``None``""" - # Due to the nature of how requests processes redirects this method will - # be called at least once upon the original response and at least twice - # on each subsequent redirect response (if any). - # If a custom mixin is used to handle this logic, it may be advantageous - # to cache the redirect location onto the response object as a private - # attribute. - if resp.is_redirect: - location = resp.headers['location'] - # Currently the underlying http module on py3 decode headers - # in latin1, but empirical evidence suggests that latin1 is very - # rarely used with non-ASCII characters in HTTP headers. - # It is more likely to get UTF8 header rather than latin1. - # This causes incorrect handling of UTF8 encoded location headers. - # To solve this, we re-encode the location in latin1. - if is_py3: - location = location.encode('latin1') - return to_native_string(location, 'utf8') - return None - - def resolve_redirects(self, resp, req, stream=False, timeout=None, - verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): - """Receives a Response. Returns a generator of Responses or Requests.""" - - hist = [] # keep track of history - - url = self.get_redirect_target(resp) - while url: - prepared_request = req.copy() - - # Update history and keep track of redirects. - # resp.history must ignore the original request in this loop - hist.append(resp) - resp.history = hist[1:] - - try: - resp.content # Consume socket so it can be released - except (ChunkedEncodingError, ContentDecodingError, RuntimeError): - resp.raw.read(decode_content=False) - - if len(resp.history) >= self.max_redirects: - raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) - - # Release the connection back into the pool. - resp.close() - - # Handle redirection without scheme (see: RFC 1808 Section 4) - if url.startswith('//'): - parsed_rurl = urlparse(resp.url) - url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) - - # The scheme should be lower case... - parsed = urlparse(url) - url = parsed.geturl() - - # Facilitate relative 'location' headers, as allowed by RFC 7231. - # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') - # Compliant with RFC3986, we percent encode the url. - if not parsed.netloc: - url = urljoin(resp.url, requote_uri(url)) - else: - url = requote_uri(url) - - prepared_request.url = to_native_string(url) - - self.rebuild_method(prepared_request, resp) - - # https://github.com/requests/requests/issues/1084 - if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): - # https://github.com/requests/requests/issues/3490 - purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') - for header in purged_headers: - prepared_request.headers.pop(header, None) - prepared_request.body = None - - headers = prepared_request.headers - try: - del headers['Cookie'] - except KeyError: - pass - - # Extract any cookies sent on the response to the cookiejar - # in the new request. Because we've mutated our copied prepared - # request, use the old one that we haven't yet touched. - extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) - merge_cookies(prepared_request._cookies, self.cookies) - prepared_request.prepare_cookies(prepared_request._cookies) - - # Rebuild auth and proxy information. - proxies = self.rebuild_proxies(prepared_request, proxies) - self.rebuild_auth(prepared_request, resp) - - # A failed tell() sets `_body_position` to `object()`. This non-None - # value ensures `rewindable` will be True, allowing us to raise an - # UnrewindableBodyError, instead of hanging the connection. - rewindable = ( - prepared_request._body_position is not None and - ('Content-Length' in headers or 'Transfer-Encoding' in headers) - ) - - # Attempt to rewind consumed file-like object. - if rewindable: - rewind_body(prepared_request) - - # Override the original request. - req = prepared_request - - if yield_requests: - yield req - else: - - resp = self.send( - req, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - allow_redirects=False, - **adapter_kwargs - ) - - extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) - - # extract redirect url, if any, for the next loop - url = self.get_redirect_target(resp) - yield resp - - def rebuild_auth(self, prepared_request, response): - """When being redirected we may want to strip authentication from the - request to avoid leaking credentials. This method intelligently removes - and reapplies authentication where possible to avoid credential loss. - """ - headers = prepared_request.headers - url = prepared_request.url - - if 'Authorization' in headers: - # If we get redirected to a new host, we should strip out any - # authentication headers. - original_parsed = urlparse(response.request.url) - redirect_parsed = urlparse(url) - - if (original_parsed.hostname != redirect_parsed.hostname): - del headers['Authorization'] - - # .netrc might have more auth for us on our new host. - new_auth = get_netrc_auth(url) if self.trust_env else None - if new_auth is not None: - prepared_request.prepare_auth(new_auth) - - return - - def rebuild_proxies(self, prepared_request, proxies): - """This method re-evaluates the proxy configuration by considering the - environment variables. If we are redirected to a URL covered by - NO_PROXY, we strip the proxy configuration. Otherwise, we set missing - proxy keys for this URL (in case they were stripped by a previous - redirect). - - This method also replaces the Proxy-Authorization header where - necessary. - - :rtype: dict - """ - proxies = proxies if proxies is not None else {} - headers = prepared_request.headers - url = prepared_request.url - scheme = urlparse(url).scheme - new_proxies = proxies.copy() - no_proxy = proxies.get('no_proxy') - - bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) - if self.trust_env and not bypass_proxy: - environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) - - proxy = environ_proxies.get(scheme, environ_proxies.get('all')) - - if proxy: - new_proxies.setdefault(scheme, proxy) - - if 'Proxy-Authorization' in headers: - del headers['Proxy-Authorization'] - - try: - username, password = get_auth_from_url(new_proxies[scheme]) - except KeyError: - username, password = None, None - - if username and password: - headers['Proxy-Authorization'] = _basic_auth_str(username, password) - - return new_proxies - - def rebuild_method(self, prepared_request, response): - """When being redirected we may want to change the method of the request - based on certain specs or browser behavior. - """ - method = prepared_request.method - - # http://tools.ietf.org/html/rfc7231#section-6.4.4 - if response.status_code == codes.see_other and method != 'HEAD': - method = 'GET' - - # Do what the browsers do, despite standards... - # First, turn 302s into GETs. - if response.status_code == codes.found and method != 'HEAD': - method = 'GET' - - # Second, if a POST is responded to with a 301, turn it into a GET. - # This bizarre behaviour is explained in Issue 1704. - if response.status_code == codes.moved and method == 'POST': - method = 'GET' - - prepared_request.method = method - - -class Session(SessionRedirectMixin): - """A Requests session. - - Provides cookie persistence, connection-pooling, and configuration. - - Basic Usage:: - - >>> import requests - >>> s = requests.Session() - >>> s.get('http://httpbin.org/get') - - - Or as a context manager:: - - >>> with requests.Session() as s: - >>> s.get('http://httpbin.org/get') - - """ - - __attrs__ = [ - 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', - 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', - 'max_redirects', - ] - - def __init__(self): - - #: A case-insensitive dictionary of headers to be sent on each - #: :class:`Request ` sent from this - #: :class:`Session `. - self.headers = default_headers() - - #: Default Authentication tuple or object to attach to - #: :class:`Request `. - self.auth = None - - #: Dictionary mapping protocol or protocol and host to the URL of the proxy - #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to - #: be used on each :class:`Request `. - self.proxies = {} - - #: Event-handling hooks. - self.hooks = default_hooks() - - #: Dictionary of querystring data to attach to each - #: :class:`Request `. The dictionary values may be lists for - #: representing multivalued query parameters. - self.params = {} - - #: Stream response content default. - self.stream = False - - #: SSL Verification default. - self.verify = True - - #: SSL client certificate default, if String, path to ssl client - #: cert file (.pem). If Tuple, ('cert', 'key') pair. - self.cert = None - - #: Maximum number of redirects allowed. If the request exceeds this - #: limit, a :class:`TooManyRedirects` exception is raised. - #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is - #: 30. - self.max_redirects = DEFAULT_REDIRECT_LIMIT - - #: Trust environment settings for proxy configuration, default - #: authentication and similar. - self.trust_env = True - - #: A CookieJar containing all currently outstanding cookies set on this - #: session. By default it is a - #: :class:`RequestsCookieJar `, but - #: may be any other ``cookielib.CookieJar`` compatible object. - self.cookies = cookiejar_from_dict({}) - - # Default connection adapters. - self.adapters = OrderedDict() - self.mount('https://', HTTPAdapter()) - self.mount('http://', HTTPAdapter()) - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def prepare_request(self, request): - """Constructs a :class:`PreparedRequest ` for - transmission and returns it. The :class:`PreparedRequest` has settings - merged from the :class:`Request ` instance and those of the - :class:`Session`. - - :param request: :class:`Request` instance to prepare with this - session's settings. - :rtype: requests.PreparedRequest - """ - cookies = request.cookies or {} - - # Bootstrap CookieJar. - if not isinstance(cookies, cookielib.CookieJar): - cookies = cookiejar_from_dict(cookies) - - # Merge with session cookies - merged_cookies = merge_cookies( - merge_cookies(RequestsCookieJar(), self.cookies), cookies) - - # Set environment's basic authentication if not explicitly set. - auth = request.auth - if self.trust_env and not auth and not self.auth: - auth = get_netrc_auth(request.url) - - p = PreparedRequest() - p.prepare( - method=request.method.upper(), - url=request.url, - files=request.files, - data=request.data, - json=request.json, - headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), - params=merge_setting(request.params, self.params), - auth=merge_setting(auth, self.auth), - cookies=merged_cookies, - hooks=merge_hooks(request.hooks, self.hooks), - ) - return p - - def request(self, method, url, - params=None, data=None, headers=None, cookies=None, files=None, - auth=None, timeout=None, allow_redirects=True, proxies=None, - hooks=None, stream=None, verify=None, cert=None, json=None): - """Constructs a :class:`Request `, prepares it and sends it. - Returns :class:`Response ` object. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query - string for the :class:`Request`. - :param data: (optional) Dictionary, bytes, or file-like object to send - in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the - :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the - :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the - :class:`Request`. - :param files: (optional) Dictionary of ``'filename': file-like-objects`` - for multipart encoding upload. - :param auth: (optional) Auth tuple or callable to enable - Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) ` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Set to True by default. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol or protocol and - hostname to the URL of the proxy. - :param stream: (optional) whether to immediately download the response - content. Defaults to ``False``. - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. - :param cert: (optional) if String, path to ssl client cert file (.pem). - If Tuple, ('cert', 'key') pair. - :rtype: requests.Response - """ - # Create the Request. - req = Request( - method=method.upper(), - url=url, - headers=headers, - files=files, - data=data or {}, - json=json, - params=params or {}, - auth=auth, - cookies=cookies, - hooks=hooks, - ) - prep = self.prepare_request(req) - - proxies = proxies or {} - - settings = self.merge_environment_settings( - prep.url, proxies, stream, verify, cert - ) - - # Send the request. - send_kwargs = { - 'timeout': timeout, - 'allow_redirects': allow_redirects, - } - send_kwargs.update(settings) - resp = self.send(prep, **send_kwargs) - - return resp - - def get(self, url, **kwargs): - r"""Sends a GET request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('GET', url, **kwargs) - - def options(self, url, **kwargs): - r"""Sends a OPTIONS request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('OPTIONS', url, **kwargs) - - def head(self, url, **kwargs): - r"""Sends a HEAD request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', False) - return self.request('HEAD', url, **kwargs) - - def post(self, url, data=None, json=None, **kwargs): - r"""Sends a POST request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('POST', url, data=data, json=json, **kwargs) - - def put(self, url, data=None, **kwargs): - r"""Sends a PUT request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('PUT', url, data=data, **kwargs) - - def patch(self, url, data=None, **kwargs): - r"""Sends a PATCH request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('PATCH', url, data=data, **kwargs) - - def delete(self, url, **kwargs): - r"""Sends a DELETE request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('DELETE', url, **kwargs) - - def send(self, request, **kwargs): - """Send a given PreparedRequest. - - :rtype: requests.Response - """ - # Set defaults that the hooks can utilize to ensure they always have - # the correct parameters to reproduce the previous request. - kwargs.setdefault('stream', self.stream) - kwargs.setdefault('verify', self.verify) - kwargs.setdefault('cert', self.cert) - kwargs.setdefault('proxies', self.proxies) - - # It's possible that users might accidentally send a Request object. - # Guard against that specific failure case. - if isinstance(request, Request): - raise ValueError('You can only send PreparedRequests.') - - # Set up variables needed for resolve_redirects and dispatching of hooks - allow_redirects = kwargs.pop('allow_redirects', True) - stream = kwargs.get('stream') - hooks = request.hooks - - # Get the appropriate adapter to use - adapter = self.get_adapter(url=request.url) - - # Start time (approximately) of the request - start = preferred_clock() - - # Send the request - r = adapter.send(request, **kwargs) - - # Total elapsed time of the request (approximately) - elapsed = preferred_clock() - start - r.elapsed = timedelta(seconds=elapsed) - - # Response manipulation hooks - r = dispatch_hook('response', hooks, r, **kwargs) - - # Persist cookies - if r.history: - - # If the hooks create history then we want those cookies too - for resp in r.history: - extract_cookies_to_jar(self.cookies, resp.request, resp.raw) - - extract_cookies_to_jar(self.cookies, request, r.raw) - - # Redirect resolving generator. - gen = self.resolve_redirects(r, request, **kwargs) - - # Resolve redirects if allowed. - history = [resp for resp in gen] if allow_redirects else [] - - # Shuffle things around if there's history. - if history: - # Insert the first (original) request at the start - history.insert(0, r) - # Get the last request made - r = history.pop() - r.history = history - - # If redirects aren't being followed, store the response on the Request for Response.next(). - if not allow_redirects: - try: - r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) - except StopIteration: - pass - - if not stream: - r.content - - return r - - def merge_environment_settings(self, url, proxies, stream, verify, cert): - """ - Check the environment and merge it with some settings. - - :rtype: dict - """ - # Gather clues from the surrounding environment. - if self.trust_env: - # Set environment's proxies. - no_proxy = proxies.get('no_proxy') if proxies is not None else None - env_proxies = get_environ_proxies(url, no_proxy=no_proxy) - for (k, v) in env_proxies.items(): - proxies.setdefault(k, v) - - # Look for requests environment configuration and be compatible - # with cURL. - if verify is True or verify is None: - verify = (os.environ.get('REQUESTS_CA_BUNDLE') or - os.environ.get('CURL_CA_BUNDLE')) - - # Merge all the kwargs. - proxies = merge_setting(proxies, self.proxies) - stream = merge_setting(stream, self.stream) - verify = merge_setting(verify, self.verify) - cert = merge_setting(cert, self.cert) - - return {'verify': verify, 'proxies': proxies, 'stream': stream, - 'cert': cert} - - def get_adapter(self, url): - """ - Returns the appropriate connection adapter for the given URL. - - :rtype: requests.adapters.BaseAdapter - """ - for (prefix, adapter) in self.adapters.items(): - - if url.lower().startswith(prefix): - return adapter - - # Nothing matches :-/ - raise InvalidSchema("No connection adapters were found for '%s'" % url) - - def close(self): - """Closes all adapters and as such the session""" - for v in self.adapters.values(): - v.close() - - def mount(self, prefix, adapter): - """Registers a connection adapter to a prefix. - - Adapters are sorted in descending order by prefix length. - """ - self.adapters[prefix] = adapter - keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] - - for key in keys_to_move: - self.adapters[key] = self.adapters.pop(key) - - def __getstate__(self): - state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) - return state - - def __setstate__(self, state): - for attr, value in state.items(): - setattr(self, attr, value) - - -def session(): - """ - Returns a :class:`Session` for context-management. - - :rtype: Session - """ - - return Session() diff --git a/requests/status_codes.py b/requests/status_codes.py deleted file mode 100644 index dee89190..00000000 --- a/requests/status_codes.py +++ /dev/null @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- - -from .structures import LookupDict - -_codes = { - - # Informational. - 100: ('continue',), - 101: ('switching_protocols',), - 102: ('processing',), - 103: ('checkpoint',), - 122: ('uri_too_long', 'request_uri_too_long'), - 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), - 201: ('created',), - 202: ('accepted',), - 203: ('non_authoritative_info', 'non_authoritative_information'), - 204: ('no_content',), - 205: ('reset_content', 'reset'), - 206: ('partial_content', 'partial'), - 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), - 208: ('already_reported',), - 226: ('im_used',), - - # Redirection. - 300: ('multiple_choices',), - 301: ('moved_permanently', 'moved', '\\o-'), - 302: ('found',), - 303: ('see_other', 'other'), - 304: ('not_modified',), - 305: ('use_proxy',), - 306: ('switch_proxy',), - 307: ('temporary_redirect', 'temporary_moved', 'temporary'), - 308: ('permanent_redirect', - 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 - - # Client Error. - 400: ('bad_request', 'bad'), - 401: ('unauthorized',), - 402: ('payment_required', 'payment'), - 403: ('forbidden',), - 404: ('not_found', '-o-'), - 405: ('method_not_allowed', 'not_allowed'), - 406: ('not_acceptable',), - 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), - 408: ('request_timeout', 'timeout'), - 409: ('conflict',), - 410: ('gone',), - 411: ('length_required',), - 412: ('precondition_failed', 'precondition'), - 413: ('request_entity_too_large',), - 414: ('request_uri_too_large',), - 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), - 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), - 417: ('expectation_failed',), - 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), - 421: ('misdirected_request',), - 422: ('unprocessable_entity', 'unprocessable'), - 423: ('locked',), - 424: ('failed_dependency', 'dependency'), - 425: ('unordered_collection', 'unordered'), - 426: ('upgrade_required', 'upgrade'), - 428: ('precondition_required', 'precondition'), - 429: ('too_many_requests', 'too_many'), - 431: ('header_fields_too_large', 'fields_too_large'), - 444: ('no_response', 'none'), - 449: ('retry_with', 'retry'), - 450: ('blocked_by_windows_parental_controls', 'parental_controls'), - 451: ('unavailable_for_legal_reasons', 'legal_reasons'), - 499: ('client_closed_request',), - - # Server Error. - 500: ('internal_server_error', 'server_error', '/o\\', '✗'), - 501: ('not_implemented',), - 502: ('bad_gateway',), - 503: ('service_unavailable', 'unavailable'), - 504: ('gateway_timeout',), - 505: ('http_version_not_supported', 'http_version'), - 506: ('variant_also_negotiates',), - 507: ('insufficient_storage',), - 509: ('bandwidth_limit_exceeded', 'bandwidth'), - 510: ('not_extended',), - 511: ('network_authentication_required', 'network_auth', 'network_authentication'), -} - -codes = LookupDict(name='status_codes') - -for code, titles in _codes.items(): - for title in titles: - setattr(codes, title, code) - if not title.startswith(('\\', '/')): - setattr(codes, title.upper(), code) diff --git a/requests/structures.py b/requests/structures.py deleted file mode 100644 index 05d2b3f5..00000000 --- a/requests/structures.py +++ /dev/null @@ -1,105 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.structures -~~~~~~~~~~~~~~~~~~~ - -Data structures that power Requests. -""" - -import collections - -from .compat import OrderedDict - - -class CaseInsensitiveDict(collections.MutableMapping): - """A case-insensitive ``dict``-like object. - - Implements all methods and operations of - ``collections.MutableMapping`` as well as dict's ``copy``. Also - provides ``lower_items``. - - All keys are expected to be strings. The structure remembers the - case of the last key to be set, and ``iter(instance)``, - ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` - will contain case-sensitive keys. However, querying and contains - testing is case insensitive:: - - cid = CaseInsensitiveDict() - cid['Accept'] = 'application/json' - cid['aCCEPT'] == 'application/json' # True - list(cid) == ['Accept'] # True - - For example, ``headers['content-encoding']`` will return the - value of a ``'Content-Encoding'`` response header, regardless - of how the header name was originally stored. - - If the constructor, ``.update``, or equality comparison - operations are given keys that have equal ``.lower()``s, the - behavior is undefined. - """ - - def __init__(self, data=None, **kwargs): - self._store = OrderedDict() - if data is None: - data = {} - self.update(data, **kwargs) - - def __setitem__(self, key, value): - # Use the lowercased key for lookups, but store the actual - # key alongside the value. - self._store[key.lower()] = (key, value) - - def __getitem__(self, key): - return self._store[key.lower()][1] - - def __delitem__(self, key): - del self._store[key.lower()] - - def __iter__(self): - return (casedkey for casedkey, mappedvalue in self._store.values()) - - def __len__(self): - return len(self._store) - - def lower_items(self): - """Like iteritems(), but with all lowercase keys.""" - return ( - (lowerkey, keyval[1]) - for (lowerkey, keyval) - in self._store.items() - ) - - def __eq__(self, other): - if isinstance(other, collections.Mapping): - other = CaseInsensitiveDict(other) - else: - return NotImplemented - # Compare insensitively - return dict(self.lower_items()) == dict(other.lower_items()) - - # Copy is required - def copy(self): - return CaseInsensitiveDict(self._store.values()) - - def __repr__(self): - return str(dict(self.items())) - - -class LookupDict(dict): - """Dictionary lookup object.""" - - def __init__(self, name=None): - self.name = name - super(LookupDict, self).__init__() - - def __repr__(self): - return '' % (self.name) - - def __getitem__(self, key): - # We allow fall-through here, so values default to None - - return self.__dict__.get(key, None) - - def get(self, key, default=None): - return self.__dict__.get(key, default) diff --git a/requests/utils.py b/requests/utils.py deleted file mode 100644 index 5c47de98..00000000 --- a/requests/utils.py +++ /dev/null @@ -1,904 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.utils -~~~~~~~~~~~~~~ - -This module provides utility functions that are used within Requests -that are also useful for external consumption. -""" - -import cgi -import codecs -import collections -import contextlib -import io -import os -import platform -import re -import socket -import struct -import warnings - -from .__version__ import __version__ -from . import certs -# to_native_string is unused here, but imported here for backwards compatibility -from ._internal_utils import to_native_string -from .compat import parse_http_list as _parse_list_header -from .compat import ( - quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, - proxy_bypass, urlunparse, basestring, integer_types, is_py3, - proxy_bypass_environment, getproxies_environment) -from .cookies import cookiejar_from_dict -from .structures import CaseInsensitiveDict -from .exceptions import ( - InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) - -NETRC_FILES = ('.netrc', '_netrc') - -DEFAULT_CA_BUNDLE_PATH = certs.where() - - -if platform.system() == 'Windows': - # provide a proxy_bypass version on Windows without DNS lookups - - def proxy_bypass_registry(host): - if is_py3: - import winreg - else: - import _winreg as winreg - try: - internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, - r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') - proxyEnable = winreg.QueryValueEx(internetSettings, - 'ProxyEnable')[0] - proxyOverride = winreg.QueryValueEx(internetSettings, - 'ProxyOverride')[0] - except OSError: - return False - if not proxyEnable or not proxyOverride: - return False - - # make a check value list from the registry entry: replace the - # '' string by the localhost entry and the corresponding - # canonical entry. - proxyOverride = proxyOverride.split(';') - # now check if we match one of the registry values. - for test in proxyOverride: - if test == '': - if '.' not in host: - return True - test = test.replace(".", r"\.") # mask dots - test = test.replace("*", r".*") # change glob sequence - test = test.replace("?", r".") # change glob char - if re.match(test, host, re.I): - return True - return False - - def proxy_bypass(host): # noqa - """Return True, if the host should be bypassed. - - Checks proxy settings gathered from the environment, if specified, - or the registry. - """ - if getproxies_environment(): - return proxy_bypass_environment(host) - else: - return proxy_bypass_registry(host) - - -def dict_to_sequence(d): - """Returns an internal sequence dictionary update.""" - - if hasattr(d, 'items'): - d = d.items() - - return d - - -def super_len(o): - total_length = None - current_position = 0 - - if hasattr(o, '__len__'): - total_length = len(o) - - elif hasattr(o, 'len'): - total_length = o.len - - elif hasattr(o, 'fileno'): - try: - fileno = o.fileno() - except io.UnsupportedOperation: - pass - else: - total_length = os.fstat(fileno).st_size - - # Having used fstat to determine the file length, we need to - # confirm that this file was opened up in binary mode. - if 'b' not in o.mode: - warnings.warn(( - "Requests has determined the content-length for this " - "request using the binary size of the file: however, the " - "file has been opened in text mode (i.e. without the 'b' " - "flag in the mode). This may lead to an incorrect " - "content-length. In Requests 3.0, support will be removed " - "for files in text mode."), - FileModeWarning - ) - - if hasattr(o, 'tell'): - try: - current_position = o.tell() - except (OSError, IOError): - # This can happen in some weird situations, such as when the file - # is actually a special file descriptor like stdin. In this - # instance, we don't know what the length is, so set it to zero and - # let requests chunk it instead. - if total_length is not None: - current_position = total_length - else: - if hasattr(o, 'seek') and total_length is None: - # StringIO and BytesIO have seek but no useable fileno - try: - # seek to end of file - o.seek(0, 2) - total_length = o.tell() - - # seek back to current position to support - # partially read file-like objects - o.seek(current_position or 0) - except (OSError, IOError): - total_length = 0 - - if total_length is None: - total_length = 0 - - return max(0, total_length - current_position) - - -def get_netrc_auth(url, raise_errors=False): - """Returns the Requests tuple auth for a given url from netrc.""" - - try: - from netrc import netrc, NetrcParseError - - netrc_path = None - - for f in NETRC_FILES: - try: - loc = os.path.expanduser('~/{0}'.format(f)) - except KeyError: - # os.path.expanduser can fail when $HOME is undefined and - # getpwuid fails. See http://bugs.python.org/issue20164 & - # https://github.com/requests/requests/issues/1846 - return - - if os.path.exists(loc): - netrc_path = loc - break - - # Abort early if there isn't one. - if netrc_path is None: - return - - ri = urlparse(url) - - # Strip port numbers from netloc. This weird `if...encode`` dance is - # used for Python 3.2, which doesn't support unicode literals. - splitstr = b':' - if isinstance(url, str): - splitstr = splitstr.decode('ascii') - host = ri.netloc.split(splitstr)[0] - - try: - _netrc = netrc(netrc_path).authenticators(host) - if _netrc: - # Return with login / password - login_i = (0 if _netrc[0] else 1) - return (_netrc[login_i], _netrc[2]) - except (NetrcParseError, IOError): - # If there was a parsing error or a permissions issue reading the file, - # we'll just skip netrc auth unless explicitly asked to raise errors. - if raise_errors: - raise - - # AppEngine hackiness. - except (ImportError, AttributeError): - pass - - -def guess_filename(obj): - """Tries to guess the filename of the given object.""" - name = getattr(obj, 'name', None) - if (name and isinstance(name, basestring) and name[0] != '<' and - name[-1] != '>'): - return os.path.basename(name) - - -def from_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. Unless it can not be represented as such, return an - OrderedDict, e.g., - - :: - - >>> from_key_val_list([('key', 'val')]) - OrderedDict([('key', 'val')]) - >>> from_key_val_list('string') - ValueError: need more than 1 value to unpack - >>> from_key_val_list({'key': 'val'}) - OrderedDict([('key', 'val')]) - - :rtype: OrderedDict - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError('cannot encode objects that are not 2-tuples') - - return OrderedDict(value) - - -def to_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. If it can be, return a list of tuples, e.g., - - :: - - >>> to_key_val_list([('key', 'val')]) - [('key', 'val')] - >>> to_key_val_list({'key': 'val'}) - [('key', 'val')] - >>> to_key_val_list('string') - ValueError: cannot encode objects that are not 2-tuples. - - :rtype: list - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError('cannot encode objects that are not 2-tuples') - - if isinstance(value, collections.Mapping): - value = value.items() - - return list(value) - - -# From mitsuhiko/werkzeug (used with permission). -def parse_list_header(value): - """Parse lists as described by RFC 2068 Section 2. - - In particular, parse comma-separated lists where the elements of - the list may include quoted-strings. A quoted-string could - contain a comma. A non-quoted string could have quotes in the - middle. Quotes are removed automatically after parsing. - - It basically works like :func:`parse_set_header` just that items - may appear multiple times and case sensitivity is preserved. - - The return value is a standard :class:`list`: - - >>> parse_list_header('token, "quoted value"') - ['token', 'quoted value'] - - To create a header from the :class:`list` again, use the - :func:`dump_header` function. - - :param value: a string with a list header. - :return: :class:`list` - :rtype: list - """ - result = [] - for item in _parse_list_header(value): - if item[:1] == item[-1:] == '"': - item = unquote_header_value(item[1:-1]) - result.append(item) - return result - - -# From mitsuhiko/werkzeug (used with permission). -def parse_dict_header(value): - """Parse lists of key, value pairs as described by RFC 2068 Section 2 and - convert them into a python dict: - - >>> d = parse_dict_header('foo="is a fish", bar="as well"') - >>> type(d) is dict - True - >>> sorted(d.items()) - [('bar', 'as well'), ('foo', 'is a fish')] - - If there is no value for a key it will be `None`: - - >>> parse_dict_header('key_without_value') - {'key_without_value': None} - - To create a header from the :class:`dict` again, use the - :func:`dump_header` function. - - :param value: a string with a dict header. - :return: :class:`dict` - :rtype: dict - """ - result = {} - for item in _parse_list_header(value): - if '=' not in item: - result[item] = None - continue - name, value = item.split('=', 1) - if value[:1] == value[-1:] == '"': - value = unquote_header_value(value[1:-1]) - result[name] = value - return result - - -# From mitsuhiko/werkzeug (used with permission). -def unquote_header_value(value, is_filename=False): - r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). - This does not use the real unquoting but what browsers are actually - using for quoting. - - :param value: the header value to unquote. - :rtype: str - """ - if value and value[0] == value[-1] == '"': - # this is not the real unquoting, but fixing this so that the - # RFC is met will result in bugs with internet explorer and - # probably some other browsers as well. IE for example is - # uploading files with "C:\foo\bar.txt" as filename - value = value[1:-1] - - # if this is a filename and the starting characters look like - # a UNC path, then just return the value without quotes. Using the - # replace sequence below on a UNC path has the effect of turning - # the leading double slash into a single slash and then - # _fix_ie_filename() doesn't work correctly. See #458. - if not is_filename or value[:2] != '\\\\': - return value.replace('\\\\', '\\').replace('\\"', '"') - return value - - -def dict_from_cookiejar(cj): - """Returns a key/value dictionary from a CookieJar. - - :param cj: CookieJar object to extract cookies from. - :rtype: dict - """ - - cookie_dict = {} - - for cookie in cj: - cookie_dict[cookie.name] = cookie.value - - return cookie_dict - - -def add_dict_to_cookiejar(cj, cookie_dict): - """Returns a CookieJar from a key/value dictionary. - - :param cj: CookieJar to insert cookies into. - :param cookie_dict: Dict of key/values to insert into CookieJar. - :rtype: CookieJar - """ - - return cookiejar_from_dict(cookie_dict, cj) - - -def get_encodings_from_content(content): - """Returns encodings from given content string. - - :param content: bytestring to extract encodings from. - """ - warnings.warn(( - 'In requests 3.0, get_encodings_from_content will be removed. For ' - 'more information, please see the discussion on issue #2266. (This' - ' warning should only appear once.)'), - DeprecationWarning) - - charset_re = re.compile(r']', flags=re.I) - pragma_re = re.compile(r']', flags=re.I) - xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') - - return (charset_re.findall(content) + - pragma_re.findall(content) + - xml_re.findall(content)) - - -def get_encoding_from_headers(headers): - """Returns encodings from given HTTP Header Dict. - - :param headers: dictionary to extract encoding from. - :rtype: str - """ - - content_type = headers.get('content-type') - - if not content_type: - return None - - content_type, params = cgi.parse_header(content_type) - - if 'charset' in params: - return params['charset'].strip("'\"") - - if 'text' in content_type: - return 'ISO-8859-1' - - -def stream_decode_response_unicode(iterator, r): - """Stream decodes a iterator.""" - - if r.encoding is None: - for item in iterator: - yield item - return - - decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') - for chunk in iterator: - rv = decoder.decode(chunk) - if rv: - yield rv - rv = decoder.decode(b'', final=True) - if rv: - yield rv - - -def iter_slices(string, slice_length): - """Iterate over slices of a string.""" - pos = 0 - if slice_length is None or slice_length <= 0: - slice_length = len(string) - while pos < len(string): - yield string[pos:pos + slice_length] - pos += slice_length - - -def get_unicode_from_response(r): - """Returns the requested content back in unicode. - - :param r: Response object to get unicode content from. - - Tried: - - 1. charset from content-type - 2. fall back and replace all unicode characters - - :rtype: str - """ - warnings.warn(( - 'In requests 3.0, get_unicode_from_response will be removed. For ' - 'more information, please see the discussion on issue #2266. (This' - ' warning should only appear once.)'), - DeprecationWarning) - - tried_encodings = [] - - # Try charset from content-type - encoding = get_encoding_from_headers(r.headers) - - if encoding: - try: - return str(r.content, encoding) - except UnicodeError: - tried_encodings.append(encoding) - - # Fall back: - try: - return str(r.content, encoding, errors='replace') - except TypeError: - return r.content - - -# The unreserved URI characters (RFC 3986) -UNRESERVED_SET = frozenset( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") - - -def unquote_unreserved(uri): - """Un-escape any percent-escape sequences in a URI that are unreserved - characters. This leaves all reserved, illegal and non-ASCII bytes encoded. - - :rtype: str - """ - parts = uri.split('%') - for i in range(1, len(parts)): - h = parts[i][0:2] - if len(h) == 2 and h.isalnum(): - try: - c = chr(int(h, 16)) - except ValueError: - raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) - - if c in UNRESERVED_SET: - parts[i] = c + parts[i][2:] - else: - parts[i] = '%' + parts[i] - else: - parts[i] = '%' + parts[i] - return ''.join(parts) - - -def requote_uri(uri): - """Re-quote the given URI. - - This function passes the given URI through an unquote/quote cycle to - ensure that it is fully and consistently quoted. - - :rtype: str - """ - safe_with_percent = "!#$%&'()*+,/:;=?@[]~" - safe_without_percent = "!#$&'()*+,/:;=?@[]~" - try: - # Unquote only the unreserved characters - # Then quote only illegal characters (do not quote reserved, - # unreserved, or '%') - return quote(unquote_unreserved(uri), safe=safe_with_percent) - except InvalidURL: - # We couldn't unquote the given URI, so let's try quoting it, but - # there may be unquoted '%'s in the URI. We need to make sure they're - # properly quoted so they do not cause issues elsewhere. - return quote(uri, safe=safe_without_percent) - - -def address_in_network(ip, net): - """This function allows you to check if an IP belongs to a network subnet - - Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 - returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 - - :rtype: bool - """ - ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] - netaddr, bits = net.split('/') - netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] - network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask - return (ipaddr & netmask) == (network & netmask) - - -def dotted_netmask(mask): - """Converts mask from /xx format to xxx.xxx.xxx.xxx - - Example: if mask is 24 function returns 255.255.255.0 - - :rtype: str - """ - bits = 0xffffffff ^ (1 << 32 - mask) - 1 - return socket.inet_ntoa(struct.pack('>I', bits)) - - -def is_ipv4_address(string_ip): - """ - :rtype: bool - """ - try: - socket.inet_aton(string_ip) - except socket.error: - return False - return True - - -def is_valid_cidr(string_network): - """ - Very simple check of the cidr format in no_proxy variable. - - :rtype: bool - """ - if string_network.count('/') == 1: - try: - mask = int(string_network.split('/')[1]) - except ValueError: - return False - - if mask < 1 or mask > 32: - return False - - try: - socket.inet_aton(string_network.split('/')[0]) - except socket.error: - return False - else: - return False - return True - - -@contextlib.contextmanager -def set_environ(env_name, value): - """Set the environment variable 'env_name' to 'value' - - Save previous value, yield, and then restore the previous value stored in - the environment variable 'env_name'. - - If 'value' is None, do nothing""" - value_changed = value is not None - if value_changed: - old_value = os.environ.get(env_name) - os.environ[env_name] = value - try: - yield - finally: - if value_changed: - if old_value is None: - del os.environ[env_name] - else: - os.environ[env_name] = old_value - - -def should_bypass_proxies(url, no_proxy): - """ - Returns whether we should bypass proxies or not. - - :rtype: bool - """ - get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) - - # First check whether no_proxy is defined. If it is, check that the URL - # we're getting isn't in the no_proxy list. - no_proxy_arg = no_proxy - if no_proxy is None: - no_proxy = get_proxy('no_proxy') - netloc = urlparse(url).netloc - - if no_proxy: - # We need to check whether we match here. We need to see if we match - # the end of the netloc, both with and without the port. - no_proxy = ( - host for host in no_proxy.replace(' ', '').split(',') if host - ) - - ip = netloc.split(':')[0] - if is_ipv4_address(ip): - for proxy_ip in no_proxy: - if is_valid_cidr(proxy_ip): - if address_in_network(ip, proxy_ip): - return True - elif ip == proxy_ip: - # If no_proxy ip was defined in plain IP notation instead of cidr notation & - # matches the IP of the index - return True - else: - for host in no_proxy: - if netloc.endswith(host) or netloc.split(':')[0].endswith(host): - # The URL does match something in no_proxy, so we don't want - # to apply the proxies on this URL. - return True - - # If the system proxy settings indicate that this URL should be bypassed, - # don't proxy. - # The proxy_bypass function is incredibly buggy on OS X in early versions - # of Python 2.6, so allow this call to fail. Only catch the specific - # exceptions we've seen, though: this call failing in other ways can reveal - # legitimate problems. - with set_environ('no_proxy', no_proxy_arg): - try: - bypass = proxy_bypass(netloc) - except (TypeError, socket.gaierror): - bypass = False - - if bypass: - return True - - return False - - -def get_environ_proxies(url, no_proxy=None): - """ - Return a dict of environment proxies. - - :rtype: dict - """ - if should_bypass_proxies(url, no_proxy=no_proxy): - return {} - else: - return getproxies() - - -def select_proxy(url, proxies): - """Select a proxy for the url, if applicable. - - :param url: The url being for the request - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs - """ - proxies = proxies or {} - urlparts = urlparse(url) - if urlparts.hostname is None: - return proxies.get(urlparts.scheme, proxies.get('all')) - - proxy_keys = [ - urlparts.scheme + '://' + urlparts.hostname, - urlparts.scheme, - 'all://' + urlparts.hostname, - 'all', - ] - proxy = None - for proxy_key in proxy_keys: - if proxy_key in proxies: - proxy = proxies[proxy_key] - break - - return proxy - - -def default_user_agent(name="python-requests"): - """ - Return a string representing the default user agent. - - :rtype: str - """ - return '%s/%s' % (name, __version__) - - -def default_headers(): - """ - :rtype: requests.structures.CaseInsensitiveDict - """ - return CaseInsensitiveDict({ - 'User-Agent': default_user_agent(), - 'Accept-Encoding': ', '.join(('gzip', 'deflate')), - 'Accept': '*/*', - 'Connection': 'keep-alive', - }) - - -def parse_header_links(value): - """Return a dict of parsed link headers proxies. - - i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" - - :rtype: list - """ - - links = [] - - replace_chars = ' \'"' - - for val in re.split(', *<', value): - try: - url, params = val.split(';', 1) - except ValueError: - url, params = val, '' - - link = {'url': url.strip('<> \'"')} - - for param in params.split(';'): - try: - key, value = param.split('=') - except ValueError: - break - - link[key.strip(replace_chars)] = value.strip(replace_chars) - - links.append(link) - - return links - - -# Null bytes; no need to recreate these on each call to guess_json_utf -_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 -_null2 = _null * 2 -_null3 = _null * 3 - - -def guess_json_utf(data): - """ - :rtype: str - """ - # JSON always starts with two ASCII characters, so detection is as - # easy as counting the nulls and from their location and count - # determine the encoding. Also detect a BOM, if present. - sample = data[:4] - if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): - return 'utf-32' # BOM included - if sample[:3] == codecs.BOM_UTF8: - return 'utf-8-sig' # BOM included, MS style (discouraged) - if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): - return 'utf-16' # BOM included - nullcount = sample.count(_null) - if nullcount == 0: - return 'utf-8' - if nullcount == 2: - if sample[::2] == _null2: # 1st and 3rd are null - return 'utf-16-be' - if sample[1::2] == _null2: # 2nd and 4th are null - return 'utf-16-le' - # Did not detect 2 valid UTF-16 ascii-range characters - if nullcount == 3: - if sample[:3] == _null3: - return 'utf-32-be' - if sample[1:] == _null3: - return 'utf-32-le' - # Did not detect a valid UTF-32 ascii-range character - return None - - -def prepend_scheme_if_needed(url, new_scheme): - """Given a URL that may or may not have a scheme, prepend the given scheme. - Does not replace a present scheme with the one provided as an argument. - - :rtype: str - """ - scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) - - # urlparse is a finicky beast, and sometimes decides that there isn't a - # netloc present. Assume that it's being over-cautious, and switch netloc - # and path if urlparse decided there was no netloc. - if not netloc: - netloc, path = path, netloc - - return urlunparse((scheme, netloc, path, params, query, fragment)) - - -def get_auth_from_url(url): - """Given a url with authentication components, extract them into a tuple of - username,password. - - :rtype: (str,str) - """ - parsed = urlparse(url) - - try: - auth = (unquote(parsed.username), unquote(parsed.password)) - except (AttributeError, TypeError): - auth = ('', '') - - return auth - - -# Moved outside of function to avoid recompile every call -_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') -_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') - - -def check_header_validity(header): - """Verifies that header value is a string which doesn't contain - leading whitespace or return characters. This prevents unintended - header injection. - - :param header: tuple, in the format (name, value). - """ - name, value = header - - if isinstance(value, bytes): - pat = _CLEAN_HEADER_REGEX_BYTE - else: - pat = _CLEAN_HEADER_REGEX_STR - try: - if not pat.match(value): - raise InvalidHeader("Invalid return character or leading space in header: %s" % name) - except TypeError: - raise InvalidHeader("Value for header {%s: %s} must be of type str or " - "bytes, not %s" % (name, value, type(value))) - - -def urldefragauth(url): - """ - Given a url remove the fragment and the authentication part. - - :rtype: str - """ - scheme, netloc, path, params, query, fragment = urlparse(url) - - # see func:`prepend_scheme_if_needed` - if not netloc: - netloc, path = path, netloc - - netloc = netloc.rsplit('@', 1)[-1] - - return urlunparse((scheme, netloc, path, params, query, '')) - - -def rewind_body(prepared_request): - """Move file pointer back to its recorded starting position - so it can be read again on redirect. - """ - body_seek = getattr(prepared_request.body, 'seek', None) - if body_seek is not None and isinstance(prepared_request._body_position, integer_types): - try: - body_seek(prepared_request._body_position) - except (IOError, OSError): - raise UnrewindableBodyError("An error occurred when rewinding request " - "body for redirect.") - else: - raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/urllib3/__init__.py b/urllib3/__init__.py deleted file mode 100644 index aaa6b1c6..00000000 --- a/urllib3/__init__.py +++ /dev/null @@ -1,97 +0,0 @@ -""" -urllib3 - Thread-safe connection pooling and re-using. -""" - -from __future__ import absolute_import -import warnings - -from .connectionpool import ( - HTTPConnectionPool, - HTTPSConnectionPool, - connection_from_url -) - -from . import exceptions -from .filepost import encode_multipart_formdata -from .poolmanager import PoolManager, ProxyManager, proxy_from_url -from .response import HTTPResponse -from .util.request import make_headers -from .util.url import get_host -from .util.timeout import Timeout -from .util.retry import Retry - - -# Set default logging handler to avoid "No handler found" warnings. -import logging -try: # Python 2.7+ - from logging import NullHandler -except ImportError: - class NullHandler(logging.Handler): - def emit(self, record): - pass - -__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' -__license__ = 'MIT' -__version__ = '1.22' - -__all__ = ( - 'HTTPConnectionPool', - 'HTTPSConnectionPool', - 'PoolManager', - 'ProxyManager', - 'HTTPResponse', - 'Retry', - 'Timeout', - 'add_stderr_logger', - 'connection_from_url', - 'disable_warnings', - 'encode_multipart_formdata', - 'get_host', - 'make_headers', - 'proxy_from_url', -) - -logging.getLogger(__name__).addHandler(NullHandler()) - - -def add_stderr_logger(level=logging.DEBUG): - """ - Helper for quickly adding a StreamHandler to the logger. Useful for - debugging. - - Returns the handler after adding it. - """ - # This method needs to be in this __init__.py to get the __name__ correct - # even if urllib3 is vendored within another package. - logger = logging.getLogger(__name__) - handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) - logger.addHandler(handler) - logger.setLevel(level) - logger.debug('Added a stderr logging handler to logger: %s', __name__) - return handler - - -# ... Clean up. -del NullHandler - - -# All warning filters *must* be appended unless you're really certain that they -# shouldn't be: otherwise, it's very hard for users to use most Python -# mechanisms to silence them. -# SecurityWarning's always go off by default. -warnings.simplefilter('always', exceptions.SecurityWarning, append=True) -# SubjectAltNameWarning's should go off once per host -warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) -# InsecurePlatformWarning's don't vary between requests, so we keep it default. -warnings.simplefilter('default', exceptions.InsecurePlatformWarning, - append=True) -# SNIMissingWarnings should go off only once. -warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) - - -def disable_warnings(category=exceptions.HTTPWarning): - """ - Helper for quickly disabling all urllib3 warnings. - """ - warnings.simplefilter('ignore', category) diff --git a/urllib3/_collections.py b/urllib3/_collections.py deleted file mode 100644 index 5df2372c..00000000 --- a/urllib3/_collections.py +++ /dev/null @@ -1,319 +0,0 @@ -from __future__ import absolute_import -from collections import Mapping, MutableMapping -try: - from threading import RLock -except ImportError: # Platform-specific: No threads available - class RLock: - def __enter__(self): - pass - - def __exit__(self, exc_type, exc_value, traceback): - pass - - -try: # Python 2.7+ - from collections import OrderedDict -except ImportError: - from .packages.ordered_dict import OrderedDict -from .packages.six import iterkeys, itervalues, PY3 - - -__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] - - -_Null = object() - - -class RecentlyUsedContainer(MutableMapping): - """ - Provides a thread-safe dict-like container which maintains up to - ``maxsize`` keys while throwing away the least-recently-used keys beyond - ``maxsize``. - - :param maxsize: - Maximum number of recent elements to retain. - - :param dispose_func: - Every time an item is evicted from the container, - ``dispose_func(value)`` is called. Callback which will get called - """ - - ContainerCls = OrderedDict - - def __init__(self, maxsize=10, dispose_func=None): - self._maxsize = maxsize - self.dispose_func = dispose_func - - self._container = self.ContainerCls() - self.lock = RLock() - - def __getitem__(self, key): - # Re-insert the item, moving it to the end of the eviction line. - with self.lock: - item = self._container.pop(key) - self._container[key] = item - return item - - def __setitem__(self, key, value): - evicted_value = _Null - with self.lock: - # Possibly evict the existing value of 'key' - evicted_value = self._container.get(key, _Null) - self._container[key] = value - - # If we didn't evict an existing value, we might have to evict the - # least recently used item from the beginning of the container. - if len(self._container) > self._maxsize: - _key, evicted_value = self._container.popitem(last=False) - - if self.dispose_func and evicted_value is not _Null: - self.dispose_func(evicted_value) - - def __delitem__(self, key): - with self.lock: - value = self._container.pop(key) - - if self.dispose_func: - self.dispose_func(value) - - def __len__(self): - with self.lock: - return len(self._container) - - def __iter__(self): - raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') - - def clear(self): - with self.lock: - # Copy pointers to all values, then wipe the mapping - values = list(itervalues(self._container)) - self._container.clear() - - if self.dispose_func: - for value in values: - self.dispose_func(value) - - def keys(self): - with self.lock: - return list(iterkeys(self._container)) - - -class HTTPHeaderDict(MutableMapping): - """ - :param headers: - An iterable of field-value pairs. Must not contain multiple field names - when compared case-insensitively. - - :param kwargs: - Additional field-value pairs to pass in to ``dict.update``. - - A ``dict`` like container for storing HTTP Headers. - - Field names are stored and compared case-insensitively in compliance with - RFC 7230. Iteration provides the first case-sensitive key seen for each - case-insensitive pair. - - Using ``__setitem__`` syntax overwrites fields that compare equal - case-insensitively in order to maintain ``dict``'s api. For fields that - compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` - in a loop. - - If multiple fields that are equal case-insensitively are passed to the - constructor or ``.update``, the behavior is undefined and some will be - lost. - - >>> headers = HTTPHeaderDict() - >>> headers.add('Set-Cookie', 'foo=bar') - >>> headers.add('set-cookie', 'baz=quxx') - >>> headers['content-length'] = '7' - >>> headers['SET-cookie'] - 'foo=bar, baz=quxx' - >>> headers['Content-Length'] - '7' - """ - - def __init__(self, headers=None, **kwargs): - super(HTTPHeaderDict, self).__init__() - self._container = OrderedDict() - if headers is not None: - if isinstance(headers, HTTPHeaderDict): - self._copy_from(headers) - else: - self.extend(headers) - if kwargs: - self.extend(kwargs) - - def __setitem__(self, key, val): - self._container[key.lower()] = [key, val] - return self._container[key.lower()] - - def __getitem__(self, key): - val = self._container[key.lower()] - return ', '.join(val[1:]) - - def __delitem__(self, key): - del self._container[key.lower()] - - def __contains__(self, key): - return key.lower() in self._container - - def __eq__(self, other): - if not isinstance(other, Mapping) and not hasattr(other, 'keys'): - return False - if not isinstance(other, type(self)): - other = type(self)(other) - return (dict((k.lower(), v) for k, v in self.itermerged()) == - dict((k.lower(), v) for k, v in other.itermerged())) - - def __ne__(self, other): - return not self.__eq__(other) - - if not PY3: # Python 2 - iterkeys = MutableMapping.iterkeys - itervalues = MutableMapping.itervalues - - __marker = object() - - def __len__(self): - return len(self._container) - - def __iter__(self): - # Only provide the originally cased names - for vals in self._container.values(): - yield vals[0] - - def pop(self, key, default=__marker): - '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - ''' - # Using the MutableMapping function directly fails due to the private marker. - # Using ordinary dict.pop would expose the internal structures. - # So let's reinvent the wheel. - try: - value = self[key] - except KeyError: - if default is self.__marker: - raise - return default - else: - del self[key] - return value - - def discard(self, key): - try: - del self[key] - except KeyError: - pass - - def add(self, key, val): - """Adds a (name, value) pair, doesn't overwrite the value if it already - exists. - - >>> headers = HTTPHeaderDict(foo='bar') - >>> headers.add('Foo', 'baz') - >>> headers['foo'] - 'bar, baz' - """ - key_lower = key.lower() - new_vals = [key, val] - # Keep the common case aka no item present as fast as possible - vals = self._container.setdefault(key_lower, new_vals) - if new_vals is not vals: - vals.append(val) - - def extend(self, *args, **kwargs): - """Generic import function for any type of header-like object. - Adapted version of MutableMapping.update in order to insert items - with self.add instead of self.__setitem__ - """ - if len(args) > 1: - raise TypeError("extend() takes at most 1 positional " - "arguments ({0} given)".format(len(args))) - other = args[0] if len(args) >= 1 else () - - if isinstance(other, HTTPHeaderDict): - for key, val in other.iteritems(): - self.add(key, val) - elif isinstance(other, Mapping): - for key in other: - self.add(key, other[key]) - elif hasattr(other, "keys"): - for key in other.keys(): - self.add(key, other[key]) - else: - for key, value in other: - self.add(key, value) - - for key, value in kwargs.items(): - self.add(key, value) - - def getlist(self, key, default=__marker): - """Returns a list of all the values for the named field. Returns an - empty list if the key doesn't exist.""" - try: - vals = self._container[key.lower()] - except KeyError: - if default is self.__marker: - return [] - return default - else: - return vals[1:] - - # Backwards compatibility for httplib - getheaders = getlist - getallmatchingheaders = getlist - iget = getlist - - # Backwards compatibility for http.cookiejar - get_all = getlist - - def __repr__(self): - return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) - - def _copy_from(self, other): - for key in other: - val = other.getlist(key) - if isinstance(val, list): - # Don't need to convert tuples - val = list(val) - self._container[key.lower()] = [key] + val - - def copy(self): - clone = type(self)() - clone._copy_from(self) - return clone - - def iteritems(self): - """Iterate over all header lines, including duplicate ones.""" - for key in self: - vals = self._container[key.lower()] - for val in vals[1:]: - yield vals[0], val - - def itermerged(self): - """Iterate over all headers, merging duplicate ones together.""" - for key in self: - val = self._container[key.lower()] - yield val[0], ', '.join(val[1:]) - - def items(self): - return list(self.iteritems()) - - @classmethod - def from_httplib(cls, message): # Python 2 - """Read headers from a Python 2 httplib message object.""" - # python2.7 does not expose a proper API for exporting multiheaders - # efficiently. This function re-reads raw lines from the message - # object and extracts the multiheaders properly. - headers = [] - - for line in message.headers: - if line.startswith((' ', '\t')): - key, value = headers[-1] - headers[-1] = (key, value + '\r\n' + line.rstrip()) - continue - - key, value = line.split(':', 1) - headers.append((key, value.strip())) - - return cls(headers) diff --git a/urllib3/connection.py b/urllib3/connection.py deleted file mode 100644 index c0d83299..00000000 --- a/urllib3/connection.py +++ /dev/null @@ -1,373 +0,0 @@ -from __future__ import absolute_import -import datetime -import logging -import os -import sys -import socket -from socket import error as SocketError, timeout as SocketTimeout -import warnings -from .packages import six -from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection -from .packages.six.moves.http_client import HTTPException # noqa: F401 - -try: # Compiled with SSL? - import ssl - BaseSSLError = ssl.SSLError -except (ImportError, AttributeError): # Platform-specific: No SSL. - ssl = None - - class BaseSSLError(BaseException): - pass - - -try: # Python 3: - # Not a no-op, we're adding this to the namespace so it can be imported. - ConnectionError = ConnectionError -except NameError: # Python 2: - class ConnectionError(Exception): - pass - - -from .exceptions import ( - NewConnectionError, - ConnectTimeoutError, - SubjectAltNameWarning, - SystemTimeWarning, -) -from .packages.ssl_match_hostname import match_hostname, CertificateError - -from .util.ssl_ import ( - resolve_cert_reqs, - resolve_ssl_version, - assert_fingerprint, - create_urllib3_context, - ssl_wrap_socket -) - - -from .util import connection - -from ._collections import HTTPHeaderDict - -log = logging.getLogger(__name__) - -port_by_scheme = { - 'http': 80, - 'https': 443, -} - -# When updating RECENT_DATE, move it to -# within two years of the current date, and no -# earlier than 6 months ago. -RECENT_DATE = datetime.date(2016, 1, 1) - - -class DummyConnection(object): - """Used to detect a failed ConnectionCls import.""" - pass - - -class HTTPConnection(_HTTPConnection, object): - """ - Based on httplib.HTTPConnection but provides an extra constructor - backwards-compatibility layer between older and newer Pythons. - - Additional keyword parameters are used to configure attributes of the connection. - Accepted parameters include: - - - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` - - ``source_address``: Set the source address for the current connection. - - .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x - - - ``socket_options``: Set specific options on the underlying socket. If not specified, then - defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling - Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. - - For example, if you wish to enable TCP Keep Alive in addition to the defaults, - you might pass:: - - HTTPConnection.default_socket_options + [ - (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), - ] - - Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). - """ - - default_port = port_by_scheme['http'] - - #: Disable Nagle's algorithm by default. - #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` - default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] - - #: Whether this connection verifies the host's certificate. - is_verified = False - - def __init__(self, *args, **kw): - if six.PY3: # Python 3 - kw.pop('strict', None) - - # Pre-set source_address in case we have an older Python like 2.6. - self.source_address = kw.get('source_address') - - if sys.version_info < (2, 7): # Python 2.6 - # _HTTPConnection on Python 2.6 will balk at this keyword arg, but - # not newer versions. We can still use it when creating a - # connection though, so we pop it *after* we have saved it as - # self.source_address. - kw.pop('source_address', None) - - #: The socket options provided by the user. If no options are - #: provided, we use the default options. - self.socket_options = kw.pop('socket_options', self.default_socket_options) - - # Superclass also sets self.source_address in Python 2.7+. - _HTTPConnection.__init__(self, *args, **kw) - - def _new_conn(self): - """ Establish a socket connection and set nodelay settings on it. - - :return: New socket connection. - """ - extra_kw = {} - if self.source_address: - extra_kw['source_address'] = self.source_address - - if self.socket_options: - extra_kw['socket_options'] = self.socket_options - - try: - conn = connection.create_connection( - (self.host, self.port), self.timeout, **extra_kw) - - except SocketTimeout as e: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout)) - - except SocketError as e: - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e) - - return conn - - def _prepare_conn(self, conn): - self.sock = conn - # the _tunnel_host attribute was added in python 2.6.3 (via - # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do - # not have them. - if getattr(self, '_tunnel_host', None): - # TODO: Fix tunnel so it doesn't depend on self.sock state. - self._tunnel() - # Mark this connection as not reusable - self.auto_open = 0 - - def connect(self): - conn = self._new_conn() - self._prepare_conn(conn) - - def request_chunked(self, method, url, body=None, headers=None): - """ - Alternative to the common request method, which sends the - body with chunked encoding and not as one block - """ - headers = HTTPHeaderDict(headers if headers is not None else {}) - skip_accept_encoding = 'accept-encoding' in headers - skip_host = 'host' in headers - self.putrequest( - method, - url, - skip_accept_encoding=skip_accept_encoding, - skip_host=skip_host - ) - for header, value in headers.items(): - self.putheader(header, value) - if 'transfer-encoding' not in headers: - self.putheader('Transfer-Encoding', 'chunked') - self.endheaders() - - if body is not None: - stringish_types = six.string_types + (six.binary_type,) - if isinstance(body, stringish_types): - body = (body,) - for chunk in body: - if not chunk: - continue - if not isinstance(chunk, six.binary_type): - chunk = chunk.encode('utf8') - len_str = hex(len(chunk))[2:] - self.send(len_str.encode('utf-8')) - self.send(b'\r\n') - self.send(chunk) - self.send(b'\r\n') - - # After the if clause, to always have a closed body - self.send(b'0\r\n\r\n') - - -class HTTPSConnection(HTTPConnection): - default_port = port_by_scheme['https'] - - ssl_version = None - - def __init__(self, host, port=None, key_file=None, cert_file=None, - strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - ssl_context=None, **kw): - - HTTPConnection.__init__(self, host, port, strict=strict, - timeout=timeout, **kw) - - self.key_file = key_file - self.cert_file = cert_file - self.ssl_context = ssl_context - - # Required property for Google AppEngine 1.9.0 which otherwise causes - # HTTPS requests to go out as HTTP. (See Issue #356) - self._protocol = 'https' - - def connect(self): - conn = self._new_conn() - self._prepare_conn(conn) - - if self.ssl_context is None: - self.ssl_context = create_urllib3_context( - ssl_version=resolve_ssl_version(None), - cert_reqs=resolve_cert_reqs(None), - ) - - self.sock = ssl_wrap_socket( - sock=conn, - keyfile=self.key_file, - certfile=self.cert_file, - ssl_context=self.ssl_context, - ) - - -class VerifiedHTTPSConnection(HTTPSConnection): - """ - Based on httplib.HTTPSConnection but wraps the socket with - SSL certification. - """ - cert_reqs = None - ca_certs = None - ca_cert_dir = None - ssl_version = None - assert_fingerprint = None - - def set_cert(self, key_file=None, cert_file=None, - cert_reqs=None, ca_certs=None, - assert_hostname=None, assert_fingerprint=None, - ca_cert_dir=None): - """ - This method should only be called once, before the connection is used. - """ - # If cert_reqs is not provided, we can try to guess. If the user gave - # us a cert database, we assume they want to use it: otherwise, if - # they gave us an SSL Context object we should use whatever is set for - # it. - if cert_reqs is None: - if ca_certs or ca_cert_dir: - cert_reqs = 'CERT_REQUIRED' - elif self.ssl_context is not None: - cert_reqs = self.ssl_context.verify_mode - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - self.ca_certs = ca_certs and os.path.expanduser(ca_certs) - self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) - - def connect(self): - # Add certificate verification - conn = self._new_conn() - - hostname = self.host - if getattr(self, '_tunnel_host', None): - # _tunnel_host was added in Python 2.6.3 - # (See: http://hg.python.org/cpython/rev/0f57b30a152f) - - self.sock = conn - # Calls self._set_hostport(), so self.host is - # self._tunnel_host below. - self._tunnel() - # Mark this connection as not reusable - self.auto_open = 0 - - # Override the host with the one we're requesting data from. - hostname = self._tunnel_host - - is_time_off = datetime.date.today() < RECENT_DATE - if is_time_off: - warnings.warn(( - 'System time is way off (before {0}). This will probably ' - 'lead to SSL verification errors').format(RECENT_DATE), - SystemTimeWarning - ) - - # Wrap socket using verification with the root certs in - # trusted_root_certs - if self.ssl_context is None: - self.ssl_context = create_urllib3_context( - ssl_version=resolve_ssl_version(self.ssl_version), - cert_reqs=resolve_cert_reqs(self.cert_reqs), - ) - - context = self.ssl_context - context.verify_mode = resolve_cert_reqs(self.cert_reqs) - self.sock = ssl_wrap_socket( - sock=conn, - keyfile=self.key_file, - certfile=self.cert_file, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - server_hostname=hostname, - ssl_context=context) - - if self.assert_fingerprint: - assert_fingerprint(self.sock.getpeercert(binary_form=True), - self.assert_fingerprint) - elif context.verify_mode != ssl.CERT_NONE \ - and not getattr(context, 'check_hostname', False) \ - and self.assert_hostname is not False: - # While urllib3 attempts to always turn off hostname matching from - # the TLS library, this cannot always be done. So we check whether - # the TLS Library still thinks it's matching hostnames. - cert = self.sock.getpeercert() - if not cert.get('subjectAltName', ()): - warnings.warn(( - 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' - '`commonName` for now. This feature is being removed by major browsers and ' - 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' - 'for details.)'.format(hostname)), - SubjectAltNameWarning - ) - _match_hostname(cert, self.assert_hostname or hostname) - - self.is_verified = ( - context.verify_mode == ssl.CERT_REQUIRED or - self.assert_fingerprint is not None - ) - - -def _match_hostname(cert, asserted_hostname): - try: - match_hostname(cert, asserted_hostname) - except CertificateError as e: - log.error( - 'Certificate did not match expected hostname: %s. ' - 'Certificate: %s', asserted_hostname, cert - ) - # Add cert to exception and reraise so client code can inspect - # the cert when catching the exception, if they want to - e._peer_cert = cert - raise - - -if ssl: - # Make a copy for testing. - UnverifiedHTTPSConnection = HTTPSConnection - HTTPSConnection = VerifiedHTTPSConnection -else: - HTTPSConnection = DummyConnection diff --git a/urllib3/connectionpool.py b/urllib3/connectionpool.py deleted file mode 100644 index ec9600f8..00000000 --- a/urllib3/connectionpool.py +++ /dev/null @@ -1,905 +0,0 @@ -from __future__ import absolute_import -import errno -import logging -import sys -import warnings - -from socket import error as SocketError, timeout as SocketTimeout -import socket - - -from .exceptions import ( - ClosedPoolError, - ProtocolError, - EmptyPoolError, - HeaderParsingError, - HostChangedError, - LocationValueError, - MaxRetryError, - ProxyError, - ReadTimeoutError, - SSLError, - TimeoutError, - InsecureRequestWarning, - NewConnectionError, -) -from .packages.ssl_match_hostname import CertificateError -from .packages import six -from .packages.six.moves import queue -from .connection import ( - port_by_scheme, - DummyConnection, - HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, - HTTPException, BaseSSLError, -) -from .request import RequestMethods -from .response import HTTPResponse - -from .util.connection import is_connection_dropped -from .util.request import set_file_position -from .util.response import assert_header_parsing -from .util.retry import Retry -from .util.timeout import Timeout -from .util.url import get_host, Url - - -if six.PY2: - # Queue is imported for side effects on MS Windows - import Queue as _unused_module_Queue # noqa: F401 - -xrange = six.moves.xrange - -log = logging.getLogger(__name__) - -_Default = object() - - -# Pool objects -class ConnectionPool(object): - """ - Base class for all connection pools, such as - :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. - """ - - scheme = None - QueueCls = queue.LifoQueue - - def __init__(self, host, port=None): - if not host: - raise LocationValueError("No host specified.") - - self.host = _ipv6_host(host).lower() - self._proxy_host = host.lower() - self.port = port - - def __str__(self): - return '%s(host=%r, port=%r)' % (type(self).__name__, - self.host, self.port) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() - # Return False to re-raise any potential exceptions - return False - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - pass - - -# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 -_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK]) - - -class HTTPConnectionPool(ConnectionPool, RequestMethods): - """ - Thread-safe connection pool for one host. - - :param host: - Host used for this HTTP Connection (e.g. "localhost"), passed into - :class:`httplib.HTTPConnection`. - - :param port: - Port used for this HTTP Connection (None is equivalent to 80), passed - into :class:`httplib.HTTPConnection`. - - :param strict: - Causes BadStatusLine to be raised if the status line can't be parsed - as a valid HTTP/1.0 or 1.1 status line, passed into - :class:`httplib.HTTPConnection`. - - .. note:: - Only works in Python 2. This parameter is ignored in Python 3. - - :param timeout: - Socket timeout in seconds for each individual connection. This can - be a float or integer, which sets the timeout for the HTTP request, - or an instance of :class:`urllib3.util.Timeout` which gives you more - fine-grained control over request timeouts. After the constructor has - been parsed, this is always a `urllib3.util.Timeout` object. - - :param maxsize: - Number of connections to save that can be reused. More than 1 is useful - in multithreaded situations. If ``block`` is set to False, more - connections will be created but they will not be saved once they've - been used. - - :param block: - If set to True, no more than ``maxsize`` connections will be used at - a time. When no free connections are available, the call will block - until a connection has been released. This is a useful side effect for - particular multithreaded situations where one does not want to use more - than maxsize connections per host to prevent flooding. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param retries: - Retry configuration to use by default with requests in this pool. - - :param _proxy: - Parsed proxy URL, should not be used directly, instead, see - :class:`urllib3.connectionpool.ProxyManager`" - - :param _proxy_headers: - A dictionary with proxy headers, should not be used directly, - instead, see :class:`urllib3.connectionpool.ProxyManager`" - - :param \\**conn_kw: - Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, - :class:`urllib3.connection.HTTPSConnection` instances. - """ - - scheme = 'http' - ConnectionCls = HTTPConnection - ResponseCls = HTTPResponse - - def __init__(self, host, port=None, strict=False, - timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, - headers=None, retries=None, - _proxy=None, _proxy_headers=None, - **conn_kw): - ConnectionPool.__init__(self, host, port) - RequestMethods.__init__(self, headers) - - self.strict = strict - - if not isinstance(timeout, Timeout): - timeout = Timeout.from_float(timeout) - - if retries is None: - retries = Retry.DEFAULT - - self.timeout = timeout - self.retries = retries - - self.pool = self.QueueCls(maxsize) - self.block = block - - self.proxy = _proxy - self.proxy_headers = _proxy_headers or {} - - # Fill the queue up so that doing get() on it will block properly - for _ in xrange(maxsize): - self.pool.put(None) - - # These are mostly for testing and debugging purposes. - self.num_connections = 0 - self.num_requests = 0 - self.conn_kw = conn_kw - - if self.proxy: - # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. - # We cannot know if the user has added default socket options, so we cannot replace the - # list. - self.conn_kw.setdefault('socket_options', []) - - def _new_conn(self): - """ - Return a fresh :class:`HTTPConnection`. - """ - self.num_connections += 1 - log.debug("Starting new HTTP connection (%d): %s", - self.num_connections, self.host) - - conn = self.ConnectionCls(host=self.host, port=self.port, - timeout=self.timeout.connect_timeout, - strict=self.strict, **self.conn_kw) - return conn - - def _get_conn(self, timeout=None): - """ - Get a connection. Will return a pooled connection if one is available. - - If no connections are available and :prop:`.block` is ``False``, then a - fresh connection is returned. - - :param timeout: - Seconds to wait before giving up and raising - :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and - :prop:`.block` is ``True``. - """ - conn = None - try: - conn = self.pool.get(block=self.block, timeout=timeout) - - except AttributeError: # self.pool is None - raise ClosedPoolError(self, "Pool is closed.") - - except queue.Empty: - if self.block: - raise EmptyPoolError(self, - "Pool reached maximum size and no more " - "connections are allowed.") - pass # Oh well, we'll create a new connection then - - # If this is a persistent connection, check if it got disconnected - if conn and is_connection_dropped(conn): - log.debug("Resetting dropped connection: %s", self.host) - conn.close() - if getattr(conn, 'auto_open', 1) == 0: - # This is a proxied connection that has been mutated by - # httplib._tunnel() and cannot be reused (since it would - # attempt to bypass the proxy) - conn = None - - return conn or self._new_conn() - - def _put_conn(self, conn): - """ - Put a connection back into the pool. - - :param conn: - Connection object for the current host and port as returned by - :meth:`._new_conn` or :meth:`._get_conn`. - - If the pool is already full, the connection is closed and discarded - because we exceeded maxsize. If connections are discarded frequently, - then maxsize should be increased. - - If the pool is closed, then the connection will be closed and discarded. - """ - try: - self.pool.put(conn, block=False) - return # Everything is dandy, done. - except AttributeError: - # self.pool is None. - pass - except queue.Full: - # This should never happen if self.block == True - log.warning( - "Connection pool is full, discarding connection: %s", - self.host) - - # Connection never got put back into the pool, close it. - if conn: - conn.close() - - def _validate_conn(self, conn): - """ - Called right before a request is made, after the socket is created. - """ - pass - - def _prepare_proxy(self, conn): - # Nothing to do for HTTP connections. - pass - - def _get_timeout(self, timeout): - """ Helper that always returns a :class:`urllib3.util.Timeout` """ - if timeout is _Default: - return self.timeout.clone() - - if isinstance(timeout, Timeout): - return timeout.clone() - else: - # User passed us an int/float. This is for backwards compatibility, - # can be removed later - return Timeout.from_float(timeout) - - def _raise_timeout(self, err, url, timeout_value): - """Is the error actually a timeout? Will raise a ReadTimeout or pass""" - - if isinstance(err, SocketTimeout): - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - # See the above comment about EAGAIN in Python 3. In Python 2 we have - # to specifically catch it and throw the timeout error - if hasattr(err, 'errno') and err.errno in _blocking_errnos: - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - # Catch possible read timeouts thrown as SSL errors. If not the - # case, rethrow the original. We need to do this because of: - # http://bugs.python.org/issue10272 - if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python 2.6 - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - def _make_request(self, conn, method, url, timeout=_Default, chunked=False, - **httplib_request_kw): - """ - Perform a request on a given urllib connection object taken from our - pool. - - :param conn: - a connection from one of our connection pools - - :param timeout: - Socket timeout in seconds for the request. This can be a - float or integer, which will set the same timeout value for - the socket connect and the socket read, or an instance of - :class:`urllib3.util.Timeout`, which gives you more fine-grained - control over your timeouts. - """ - self.num_requests += 1 - - timeout_obj = self._get_timeout(timeout) - timeout_obj.start_connect() - conn.timeout = timeout_obj.connect_timeout - - # Trigger any extra validation we need to do. - try: - self._validate_conn(conn) - except (SocketTimeout, BaseSSLError) as e: - # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. - self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) - raise - - # conn.request() calls httplib.*.request, not the method in - # urllib3.request. It also calls makefile (recv) on the socket. - if chunked: - conn.request_chunked(method, url, **httplib_request_kw) - else: - conn.request(method, url, **httplib_request_kw) - - # Reset the timeout for the recv() on the socket - read_timeout = timeout_obj.read_timeout - - # App Engine doesn't have a sock attr - if getattr(conn, 'sock', None): - # In Python 3 socket.py will catch EAGAIN and return None when you - # try and read into the file pointer created by http.client, which - # instead raises a BadStatusLine exception. Instead of catching - # the exception and assuming all BadStatusLine exceptions are read - # timeouts, check for a zero timeout before making the request. - if read_timeout == 0: - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % read_timeout) - if read_timeout is Timeout.DEFAULT_TIMEOUT: - conn.sock.settimeout(socket.getdefaulttimeout()) - else: # None or a value - conn.sock.settimeout(read_timeout) - - # Receive the response from the server - try: - try: # Python 2.7, use buffering of HTTP responses - httplib_response = conn.getresponse(buffering=True) - except TypeError: # Python 2.6 and older, Python 3 - try: - httplib_response = conn.getresponse() - except Exception as e: - # Remove the TypeError from the exception chain in Python 3; - # otherwise it looks like a programming error was the cause. - six.raise_from(e, None) - except (SocketTimeout, BaseSSLError, SocketError) as e: - self._raise_timeout(err=e, url=url, timeout_value=read_timeout) - raise - - # AppEngine doesn't have a version attr. - http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') - log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port, - method, url, http_version, httplib_response.status, - httplib_response.length) - - try: - assert_header_parsing(httplib_response.msg) - except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 - log.warning( - 'Failed to parse headers (url=%s): %s', - self._absolute_url(url), hpe, exc_info=True) - - return httplib_response - - def _absolute_url(self, path): - return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - # Disable access to the pool - old_pool, self.pool = self.pool, None - - try: - while True: - conn = old_pool.get(block=False) - if conn: - conn.close() - - except queue.Empty: - pass # Done. - - def is_same_host(self, url): - """ - Check if the given ``url`` is a member of the same host as this - connection pool. - """ - if url.startswith('/'): - return True - - # TODO: Add optional support for socket.gethostbyname checking. - scheme, host, port = get_host(url) - - host = _ipv6_host(host).lower() - - # Use explicit default port for comparison when none is given - if self.port and not port: - port = port_by_scheme.get(scheme) - elif not self.port and port == port_by_scheme.get(scheme): - port = None - - return (scheme, host, port) == (self.scheme, self.host, self.port) - - def urlopen(self, method, url, body=None, headers=None, retries=None, - redirect=True, assert_same_host=True, timeout=_Default, - pool_timeout=None, release_conn=None, chunked=False, - body_pos=None, **response_kw): - """ - Get a connection from the pool and perform an HTTP request. This is the - lowest level call for making a request, so you'll need to specify all - the raw details. - - .. note:: - - More commonly, it's appropriate to use a convenience method provided - by :class:`.RequestMethods`, such as :meth:`request`. - - .. note:: - - `release_conn` will only behave as expected if - `preload_content=False` because we want to make - `preload_content=False` the default behaviour someday soon without - breaking backwards compatibility. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param body: - Data to send in the request body (useful for creating - POST requests, see HTTPConnectionPool.post_url for - more convenience). - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - - :param retries: - Configure the number of retries to allow before raising a - :class:`~urllib3.exceptions.MaxRetryError` exception. - - Pass ``None`` to retry until you receive a response. Pass a - :class:`~urllib3.util.retry.Retry` object for fine-grained control - over different types of retries. - Pass an integer number to retry connection errors that many times, - but no other types of errors. Pass zero to never retry. - - If ``False``, then retries are disabled and any exception is raised - immediately. Also, instead of raising a MaxRetryError on redirects, - the redirect response will be returned. - - :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. - - :param redirect: - If True, automatically handle redirects (status codes 301, 302, - 303, 307, 308). Each redirect counts as a retry. Disabling retries - will disable redirect, too. - - :param assert_same_host: - If ``True``, will make sure that the host of the pool requests is - consistent else will raise HostChangedError. When False, you can - use the pool on an HTTP proxy and request foreign hosts. - - :param timeout: - If specified, overrides the default timeout for this one - request. It may be a float (in seconds) or an instance of - :class:`urllib3.util.Timeout`. - - :param pool_timeout: - If set and the pool is set to block=True, then this method will - block for ``pool_timeout`` seconds and raise EmptyPoolError if no - connection is available within the time period. - - :param release_conn: - If False, then the urlopen call will not release the connection - back into the pool once a response is received (but will release if - you read the entire contents of the response such as when - `preload_content=True`). This is useful if you're not preloading - the response's content immediately. You will need to call - ``r.release_conn()`` on the response ``r`` to return the connection - back into the pool. If None, it takes the value of - ``response_kw.get('preload_content', True)``. - - :param chunked: - If True, urllib3 will send the body using chunked transfer - encoding. Otherwise, urllib3 will send the body using the standard - content-length form. Defaults to False. - - :param int body_pos: - Position to seek to in file-like body in the event of a retry or - redirect. Typically this won't need to be set because urllib3 will - auto-populate the value when needed. - - :param \\**response_kw: - Additional parameters are passed to - :meth:`urllib3.response.HTTPResponse.from_httplib` - """ - if headers is None: - headers = self.headers - - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect, default=self.retries) - - if release_conn is None: - release_conn = response_kw.get('preload_content', True) - - # Check host - if assert_same_host and not self.is_same_host(url): - raise HostChangedError(self, url, retries) - - conn = None - - # Track whether `conn` needs to be released before - # returning/raising/recursing. Update this variable if necessary, and - # leave `release_conn` constant throughout the function. That way, if - # the function recurses, the original value of `release_conn` will be - # passed down into the recursive call, and its value will be respected. - # - # See issue #651 [1] for details. - # - # [1] - release_this_conn = release_conn - - # Merge the proxy headers. Only do this in HTTP. We have to copy the - # headers dict so we can safely change it without those changes being - # reflected in anyone else's copy. - if self.scheme == 'http': - headers = headers.copy() - headers.update(self.proxy_headers) - - # Must keep the exception bound to a separate variable or else Python 3 - # complains about UnboundLocalError. - err = None - - # Keep track of whether we cleanly exited the except block. This - # ensures we do proper cleanup in finally. - clean_exit = False - - # Rewind body position, if needed. Record current position - # for future rewinds in the event of a redirect/retry. - body_pos = set_file_position(body, body_pos) - - try: - # Request a connection from the queue. - timeout_obj = self._get_timeout(timeout) - conn = self._get_conn(timeout=pool_timeout) - - conn.timeout = timeout_obj.connect_timeout - - is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) - if is_new_proxy_conn: - self._prepare_proxy(conn) - - # Make the request on the httplib connection object. - httplib_response = self._make_request(conn, method, url, - timeout=timeout_obj, - body=body, headers=headers, - chunked=chunked) - - # If we're going to release the connection in ``finally:``, then - # the response doesn't need to know about the connection. Otherwise - # it will also try to release it and we'll have a double-release - # mess. - response_conn = conn if not release_conn else None - - # Pass method to Response for length checking - response_kw['request_method'] = method - - # Import httplib's response into our own wrapper object - response = self.ResponseCls.from_httplib(httplib_response, - pool=self, - connection=response_conn, - retries=retries, - **response_kw) - - # Everything went great! - clean_exit = True - - except queue.Empty: - # Timed out by queue. - raise EmptyPoolError(self, "No pool connections are available.") - - except (TimeoutError, HTTPException, SocketError, ProtocolError, - BaseSSLError, SSLError, CertificateError) as e: - # Discard the connection for these exceptions. It will be - # replaced during the next _get_conn() call. - clean_exit = False - if isinstance(e, (BaseSSLError, CertificateError)): - e = SSLError(e) - elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: - e = ProxyError('Cannot connect to proxy.', e) - elif isinstance(e, (SocketError, HTTPException)): - e = ProtocolError('Connection aborted.', e) - - retries = retries.increment(method, url, error=e, _pool=self, - _stacktrace=sys.exc_info()[2]) - retries.sleep() - - # Keep track of the error for the retry warning. - err = e - - finally: - if not clean_exit: - # We hit some kind of exception, handled or otherwise. We need - # to throw the connection away unless explicitly told not to. - # Close the connection, set the variable to None, and make sure - # we put the None back in the pool to avoid leaking it. - conn = conn and conn.close() - release_this_conn = True - - if release_this_conn: - # Put the connection back to be reused. If the connection is - # expired then it will be None, which will get replaced with a - # fresh connection during _get_conn. - self._put_conn(conn) - - if not conn: - # Try again - log.warning("Retrying (%r) after connection " - "broken by '%r': %s", retries, err, url) - return self.urlopen(method, url, body, headers, retries, - redirect, assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, body_pos=body_pos, - **response_kw) - - def drain_and_release_conn(response): - try: - # discard any remaining response body, the connection will be - # released back to the pool once the entire response is read - response.read() - except (TimeoutError, HTTPException, SocketError, ProtocolError, - BaseSSLError, SSLError) as e: - pass - - # Handle redirect? - redirect_location = redirect and response.get_redirect_location() - if redirect_location: - if response.status == 303: - method = 'GET' - - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_redirect: - # Drain and release the connection for this response, since - # we're not returning it to be released manually. - drain_and_release_conn(response) - raise - return response - - # drain and return the connection to the pool before recursing - drain_and_release_conn(response) - - retries.sleep_for_retry(response) - log.debug("Redirecting %s -> %s", url, redirect_location) - return self.urlopen( - method, redirect_location, body, headers, - retries=retries, redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, body_pos=body_pos, - **response_kw) - - # Check if we should retry the HTTP response. - has_retry_after = bool(response.getheader('Retry-After')) - if retries.is_retry(method, response.status, has_retry_after): - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_status: - # Drain and release the connection for this response, since - # we're not returning it to be released manually. - drain_and_release_conn(response) - raise - return response - - # drain and return the connection to the pool before recursing - drain_and_release_conn(response) - - retries.sleep(response) - log.debug("Retry: %s", url) - return self.urlopen( - method, url, body, headers, - retries=retries, redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, - body_pos=body_pos, **response_kw) - - return response - - -class HTTPSConnectionPool(HTTPConnectionPool): - """ - Same as :class:`.HTTPConnectionPool`, but HTTPS. - - When Python is compiled with the :mod:`ssl` module, then - :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, - instead of :class:`.HTTPSConnection`. - - :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, - ``assert_hostname`` and ``host`` in this order to verify connections. - If ``assert_hostname`` is False, no verification is done. - - The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, - ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is - available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade - the connection socket into an SSL socket. - """ - - scheme = 'https' - ConnectionCls = HTTPSConnection - - def __init__(self, host, port=None, - strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, - block=False, headers=None, retries=None, - _proxy=None, _proxy_headers=None, - key_file=None, cert_file=None, cert_reqs=None, - ca_certs=None, ssl_version=None, - assert_hostname=None, assert_fingerprint=None, - ca_cert_dir=None, **conn_kw): - - HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, - block, headers, retries, _proxy, _proxy_headers, - **conn_kw) - - if ca_certs and cert_reqs is None: - cert_reqs = 'CERT_REQUIRED' - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.ca_certs = ca_certs - self.ca_cert_dir = ca_cert_dir - self.ssl_version = ssl_version - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - - def _prepare_conn(self, conn): - """ - Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` - and establish the tunnel if proxy is used. - """ - - if isinstance(conn, VerifiedHTTPSConnection): - conn.set_cert(key_file=self.key_file, - cert_file=self.cert_file, - cert_reqs=self.cert_reqs, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - assert_hostname=self.assert_hostname, - assert_fingerprint=self.assert_fingerprint) - conn.ssl_version = self.ssl_version - return conn - - def _prepare_proxy(self, conn): - """ - Establish tunnel connection early, because otherwise httplib - would improperly set Host: header to proxy's IP:port. - """ - # Python 2.7+ - try: - set_tunnel = conn.set_tunnel - except AttributeError: # Platform-specific: Python 2.6 - set_tunnel = conn._set_tunnel - - if sys.version_info <= (2, 6, 4) and not self.proxy_headers: # Python 2.6.4 and older - set_tunnel(self._proxy_host, self.port) - else: - set_tunnel(self._proxy_host, self.port, self.proxy_headers) - - conn.connect() - - def _new_conn(self): - """ - Return a fresh :class:`httplib.HTTPSConnection`. - """ - self.num_connections += 1 - log.debug("Starting new HTTPS connection (%d): %s", - self.num_connections, self.host) - - if not self.ConnectionCls or self.ConnectionCls is DummyConnection: - raise SSLError("Can't connect to HTTPS URL because the SSL " - "module is not available.") - - actual_host = self.host - actual_port = self.port - if self.proxy is not None: - actual_host = self.proxy.host - actual_port = self.proxy.port - - conn = self.ConnectionCls(host=actual_host, port=actual_port, - timeout=self.timeout.connect_timeout, - strict=self.strict, **self.conn_kw) - - return self._prepare_conn(conn) - - def _validate_conn(self, conn): - """ - Called right before a request is made, after the socket is created. - """ - super(HTTPSConnectionPool, self)._validate_conn(conn) - - # Force connect early to allow us to validate the connection. - if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` - conn.connect() - - if not conn.is_verified: - warnings.warn(( - 'Unverified HTTPS request is being made. ' - 'Adding certificate verification is strongly advised. See: ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings'), - InsecureRequestWarning) - - -def connection_from_url(url, **kw): - """ - Given a url, return an :class:`.ConnectionPool` instance of its host. - - This is a shortcut for not having to parse out the scheme, host, and port - of the url before creating an :class:`.ConnectionPool` instance. - - :param url: - Absolute URL string that must include the scheme. Port is optional. - - :param \\**kw: - Passes additional parameters to the constructor of the appropriate - :class:`.ConnectionPool`. Useful for specifying things like - timeout, maxsize, headers, etc. - - Example:: - - >>> conn = connection_from_url('http://google.com/') - >>> r = conn.request('GET', '/') - """ - scheme, host, port = get_host(url) - port = port or port_by_scheme.get(scheme, 80) - if scheme == 'https': - return HTTPSConnectionPool(host, port=port, **kw) - else: - return HTTPConnectionPool(host, port=port, **kw) - - -def _ipv6_host(host): - """ - Process IPv6 address literals - """ - - # httplib doesn't like it when we include brackets in IPv6 addresses - # Specifically, if we include brackets but also pass the port then - # httplib crazily doubles up the square brackets on the Host header. - # Instead, we need to make sure we never pass ``None`` as the port. - # However, for backward compatibility reasons we can't actually - # *assert* that. See http://bugs.python.org/issue28539 - # - # Also if an IPv6 address literal has a zone identifier, the - # percent sign might be URIencoded, convert it back into ASCII - if host.startswith('[') and host.endswith(']'): - host = host.replace('%25', '%').strip('[]') - return host diff --git a/urllib3/contrib/__init__.py b/urllib3/contrib/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/urllib3/contrib/_securetransport/__init__.py b/urllib3/contrib/_securetransport/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/urllib3/contrib/_securetransport/bindings.py b/urllib3/contrib/_securetransport/bindings.py deleted file mode 100644 index bcf41c02..00000000 --- a/urllib3/contrib/_securetransport/bindings.py +++ /dev/null @@ -1,593 +0,0 @@ -""" -This module uses ctypes to bind a whole bunch of functions and constants from -SecureTransport. The goal here is to provide the low-level API to -SecureTransport. These are essentially the C-level functions and constants, and -they're pretty gross to work with. - -This code is a bastardised version of the code found in Will Bond's oscrypto -library. An enormous debt is owed to him for blazing this trail for us. For -that reason, this code should be considered to be covered both by urllib3's -license and by oscrypto's: - - Copyright (c) 2015-2016 Will Bond - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -""" -from __future__ import absolute_import - -import platform -from ctypes.util import find_library -from ctypes import ( - c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, - c_bool -) -from ctypes import CDLL, POINTER, CFUNCTYPE - - -security_path = find_library('Security') -if not security_path: - raise ImportError('The library Security could not be found') - - -core_foundation_path = find_library('CoreFoundation') -if not core_foundation_path: - raise ImportError('The library CoreFoundation could not be found') - - -version = platform.mac_ver()[0] -version_info = tuple(map(int, version.split('.'))) -if version_info < (10, 8): - raise OSError( - 'Only OS X 10.8 and newer are supported, not %s.%s' % ( - version_info[0], version_info[1] - ) - ) - -Security = CDLL(security_path, use_errno=True) -CoreFoundation = CDLL(core_foundation_path, use_errno=True) - -Boolean = c_bool -CFIndex = c_long -CFStringEncoding = c_uint32 -CFData = c_void_p -CFString = c_void_p -CFArray = c_void_p -CFMutableArray = c_void_p -CFDictionary = c_void_p -CFError = c_void_p -CFType = c_void_p -CFTypeID = c_ulong - -CFTypeRef = POINTER(CFType) -CFAllocatorRef = c_void_p - -OSStatus = c_int32 - -CFDataRef = POINTER(CFData) -CFStringRef = POINTER(CFString) -CFArrayRef = POINTER(CFArray) -CFMutableArrayRef = POINTER(CFMutableArray) -CFDictionaryRef = POINTER(CFDictionary) -CFArrayCallBacks = c_void_p -CFDictionaryKeyCallBacks = c_void_p -CFDictionaryValueCallBacks = c_void_p - -SecCertificateRef = POINTER(c_void_p) -SecExternalFormat = c_uint32 -SecExternalItemType = c_uint32 -SecIdentityRef = POINTER(c_void_p) -SecItemImportExportFlags = c_uint32 -SecItemImportExportKeyParameters = c_void_p -SecKeychainRef = POINTER(c_void_p) -SSLProtocol = c_uint32 -SSLCipherSuite = c_uint32 -SSLContextRef = POINTER(c_void_p) -SecTrustRef = POINTER(c_void_p) -SSLConnectionRef = c_uint32 -SecTrustResultType = c_uint32 -SecTrustOptionFlags = c_uint32 -SSLProtocolSide = c_uint32 -SSLConnectionType = c_uint32 -SSLSessionOption = c_uint32 - - -try: - Security.SecItemImport.argtypes = [ - CFDataRef, - CFStringRef, - POINTER(SecExternalFormat), - POINTER(SecExternalItemType), - SecItemImportExportFlags, - POINTER(SecItemImportExportKeyParameters), - SecKeychainRef, - POINTER(CFArrayRef), - ] - Security.SecItemImport.restype = OSStatus - - Security.SecCertificateGetTypeID.argtypes = [] - Security.SecCertificateGetTypeID.restype = CFTypeID - - Security.SecIdentityGetTypeID.argtypes = [] - Security.SecIdentityGetTypeID.restype = CFTypeID - - Security.SecKeyGetTypeID.argtypes = [] - Security.SecKeyGetTypeID.restype = CFTypeID - - Security.SecCertificateCreateWithData.argtypes = [ - CFAllocatorRef, - CFDataRef - ] - Security.SecCertificateCreateWithData.restype = SecCertificateRef - - Security.SecCertificateCopyData.argtypes = [ - SecCertificateRef - ] - Security.SecCertificateCopyData.restype = CFDataRef - - Security.SecCopyErrorMessageString.argtypes = [ - OSStatus, - c_void_p - ] - Security.SecCopyErrorMessageString.restype = CFStringRef - - Security.SecIdentityCreateWithCertificate.argtypes = [ - CFTypeRef, - SecCertificateRef, - POINTER(SecIdentityRef) - ] - Security.SecIdentityCreateWithCertificate.restype = OSStatus - - Security.SecKeychainCreate.argtypes = [ - c_char_p, - c_uint32, - c_void_p, - Boolean, - c_void_p, - POINTER(SecKeychainRef) - ] - Security.SecKeychainCreate.restype = OSStatus - - Security.SecKeychainDelete.argtypes = [ - SecKeychainRef - ] - Security.SecKeychainDelete.restype = OSStatus - - Security.SecPKCS12Import.argtypes = [ - CFDataRef, - CFDictionaryRef, - POINTER(CFArrayRef) - ] - Security.SecPKCS12Import.restype = OSStatus - - SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) - SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) - - Security.SSLSetIOFuncs.argtypes = [ - SSLContextRef, - SSLReadFunc, - SSLWriteFunc - ] - Security.SSLSetIOFuncs.restype = OSStatus - - Security.SSLSetPeerID.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t - ] - Security.SSLSetPeerID.restype = OSStatus - - Security.SSLSetCertificate.argtypes = [ - SSLContextRef, - CFArrayRef - ] - Security.SSLSetCertificate.restype = OSStatus - - Security.SSLSetCertificateAuthorities.argtypes = [ - SSLContextRef, - CFTypeRef, - Boolean - ] - Security.SSLSetCertificateAuthorities.restype = OSStatus - - Security.SSLSetConnection.argtypes = [ - SSLContextRef, - SSLConnectionRef - ] - Security.SSLSetConnection.restype = OSStatus - - Security.SSLSetPeerDomainName.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t - ] - Security.SSLSetPeerDomainName.restype = OSStatus - - Security.SSLHandshake.argtypes = [ - SSLContextRef - ] - Security.SSLHandshake.restype = OSStatus - - Security.SSLRead.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t, - POINTER(c_size_t) - ] - Security.SSLRead.restype = OSStatus - - Security.SSLWrite.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t, - POINTER(c_size_t) - ] - Security.SSLWrite.restype = OSStatus - - Security.SSLClose.argtypes = [ - SSLContextRef - ] - Security.SSLClose.restype = OSStatus - - Security.SSLGetNumberSupportedCiphers.argtypes = [ - SSLContextRef, - POINTER(c_size_t) - ] - Security.SSLGetNumberSupportedCiphers.restype = OSStatus - - Security.SSLGetSupportedCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - POINTER(c_size_t) - ] - Security.SSLGetSupportedCiphers.restype = OSStatus - - Security.SSLSetEnabledCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - c_size_t - ] - Security.SSLSetEnabledCiphers.restype = OSStatus - - Security.SSLGetNumberEnabledCiphers.argtype = [ - SSLContextRef, - POINTER(c_size_t) - ] - Security.SSLGetNumberEnabledCiphers.restype = OSStatus - - Security.SSLGetEnabledCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - POINTER(c_size_t) - ] - Security.SSLGetEnabledCiphers.restype = OSStatus - - Security.SSLGetNegotiatedCipher.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite) - ] - Security.SSLGetNegotiatedCipher.restype = OSStatus - - Security.SSLGetNegotiatedProtocolVersion.argtypes = [ - SSLContextRef, - POINTER(SSLProtocol) - ] - Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus - - Security.SSLCopyPeerTrust.argtypes = [ - SSLContextRef, - POINTER(SecTrustRef) - ] - Security.SSLCopyPeerTrust.restype = OSStatus - - Security.SecTrustSetAnchorCertificates.argtypes = [ - SecTrustRef, - CFArrayRef - ] - Security.SecTrustSetAnchorCertificates.restype = OSStatus - - Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ - SecTrustRef, - Boolean - ] - Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus - - Security.SecTrustEvaluate.argtypes = [ - SecTrustRef, - POINTER(SecTrustResultType) - ] - Security.SecTrustEvaluate.restype = OSStatus - - Security.SecTrustGetCertificateCount.argtypes = [ - SecTrustRef - ] - Security.SecTrustGetCertificateCount.restype = CFIndex - - Security.SecTrustGetCertificateAtIndex.argtypes = [ - SecTrustRef, - CFIndex - ] - Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef - - Security.SSLCreateContext.argtypes = [ - CFAllocatorRef, - SSLProtocolSide, - SSLConnectionType - ] - Security.SSLCreateContext.restype = SSLContextRef - - Security.SSLSetSessionOption.argtypes = [ - SSLContextRef, - SSLSessionOption, - Boolean - ] - Security.SSLSetSessionOption.restype = OSStatus - - Security.SSLSetProtocolVersionMin.argtypes = [ - SSLContextRef, - SSLProtocol - ] - Security.SSLSetProtocolVersionMin.restype = OSStatus - - Security.SSLSetProtocolVersionMax.argtypes = [ - SSLContextRef, - SSLProtocol - ] - Security.SSLSetProtocolVersionMax.restype = OSStatus - - Security.SecCopyErrorMessageString.argtypes = [ - OSStatus, - c_void_p - ] - Security.SecCopyErrorMessageString.restype = CFStringRef - - Security.SSLReadFunc = SSLReadFunc - Security.SSLWriteFunc = SSLWriteFunc - Security.SSLContextRef = SSLContextRef - Security.SSLProtocol = SSLProtocol - Security.SSLCipherSuite = SSLCipherSuite - Security.SecIdentityRef = SecIdentityRef - Security.SecKeychainRef = SecKeychainRef - Security.SecTrustRef = SecTrustRef - Security.SecTrustResultType = SecTrustResultType - Security.SecExternalFormat = SecExternalFormat - Security.OSStatus = OSStatus - - Security.kSecImportExportPassphrase = CFStringRef.in_dll( - Security, 'kSecImportExportPassphrase' - ) - Security.kSecImportItemIdentity = CFStringRef.in_dll( - Security, 'kSecImportItemIdentity' - ) - - # CoreFoundation time! - CoreFoundation.CFRetain.argtypes = [ - CFTypeRef - ] - CoreFoundation.CFRetain.restype = CFTypeRef - - CoreFoundation.CFRelease.argtypes = [ - CFTypeRef - ] - CoreFoundation.CFRelease.restype = None - - CoreFoundation.CFGetTypeID.argtypes = [ - CFTypeRef - ] - CoreFoundation.CFGetTypeID.restype = CFTypeID - - CoreFoundation.CFStringCreateWithCString.argtypes = [ - CFAllocatorRef, - c_char_p, - CFStringEncoding - ] - CoreFoundation.CFStringCreateWithCString.restype = CFStringRef - - CoreFoundation.CFStringGetCStringPtr.argtypes = [ - CFStringRef, - CFStringEncoding - ] - CoreFoundation.CFStringGetCStringPtr.restype = c_char_p - - CoreFoundation.CFStringGetCString.argtypes = [ - CFStringRef, - c_char_p, - CFIndex, - CFStringEncoding - ] - CoreFoundation.CFStringGetCString.restype = c_bool - - CoreFoundation.CFDataCreate.argtypes = [ - CFAllocatorRef, - c_char_p, - CFIndex - ] - CoreFoundation.CFDataCreate.restype = CFDataRef - - CoreFoundation.CFDataGetLength.argtypes = [ - CFDataRef - ] - CoreFoundation.CFDataGetLength.restype = CFIndex - - CoreFoundation.CFDataGetBytePtr.argtypes = [ - CFDataRef - ] - CoreFoundation.CFDataGetBytePtr.restype = c_void_p - - CoreFoundation.CFDictionaryCreate.argtypes = [ - CFAllocatorRef, - POINTER(CFTypeRef), - POINTER(CFTypeRef), - CFIndex, - CFDictionaryKeyCallBacks, - CFDictionaryValueCallBacks - ] - CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef - - CoreFoundation.CFDictionaryGetValue.argtypes = [ - CFDictionaryRef, - CFTypeRef - ] - CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef - - CoreFoundation.CFArrayCreate.argtypes = [ - CFAllocatorRef, - POINTER(CFTypeRef), - CFIndex, - CFArrayCallBacks, - ] - CoreFoundation.CFArrayCreate.restype = CFArrayRef - - CoreFoundation.CFArrayCreateMutable.argtypes = [ - CFAllocatorRef, - CFIndex, - CFArrayCallBacks - ] - CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef - - CoreFoundation.CFArrayAppendValue.argtypes = [ - CFMutableArrayRef, - c_void_p - ] - CoreFoundation.CFArrayAppendValue.restype = None - - CoreFoundation.CFArrayGetCount.argtypes = [ - CFArrayRef - ] - CoreFoundation.CFArrayGetCount.restype = CFIndex - - CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ - CFArrayRef, - CFIndex - ] - CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p - - CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( - CoreFoundation, 'kCFAllocatorDefault' - ) - CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') - CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( - CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' - ) - CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( - CoreFoundation, 'kCFTypeDictionaryValueCallBacks' - ) - - CoreFoundation.CFTypeRef = CFTypeRef - CoreFoundation.CFArrayRef = CFArrayRef - CoreFoundation.CFStringRef = CFStringRef - CoreFoundation.CFDictionaryRef = CFDictionaryRef - -except (AttributeError): - raise ImportError('Error initializing ctypes') - - -class CFConst(object): - """ - A class object that acts as essentially a namespace for CoreFoundation - constants. - """ - kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) - - -class SecurityConst(object): - """ - A class object that acts as essentially a namespace for Security constants. - """ - kSSLSessionOptionBreakOnServerAuth = 0 - - kSSLProtocol2 = 1 - kSSLProtocol3 = 2 - kTLSProtocol1 = 4 - kTLSProtocol11 = 7 - kTLSProtocol12 = 8 - - kSSLClientSide = 1 - kSSLStreamType = 0 - - kSecFormatPEMSequence = 10 - - kSecTrustResultInvalid = 0 - kSecTrustResultProceed = 1 - # This gap is present on purpose: this was kSecTrustResultConfirm, which - # is deprecated. - kSecTrustResultDeny = 3 - kSecTrustResultUnspecified = 4 - kSecTrustResultRecoverableTrustFailure = 5 - kSecTrustResultFatalTrustFailure = 6 - kSecTrustResultOtherError = 7 - - errSSLProtocol = -9800 - errSSLWouldBlock = -9803 - errSSLClosedGraceful = -9805 - errSSLClosedNoNotify = -9816 - errSSLClosedAbort = -9806 - - errSSLXCertChainInvalid = -9807 - errSSLCrypto = -9809 - errSSLInternal = -9810 - errSSLCertExpired = -9814 - errSSLCertNotYetValid = -9815 - errSSLUnknownRootCert = -9812 - errSSLNoRootCert = -9813 - errSSLHostNameMismatch = -9843 - errSSLPeerHandshakeFail = -9824 - errSSLPeerUserCancelled = -9839 - errSSLWeakPeerEphemeralDHKey = -9850 - errSSLServerAuthCompleted = -9841 - errSSLRecordOverflow = -9847 - - errSecVerifyFailed = -67808 - errSecNoTrustSettings = -25263 - errSecItemNotFound = -25300 - errSecInvalidTrustSettings = -25262 - - # Cipher suites. We only pick the ones our default cipher string allows. - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F - TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 - TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F - TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 - TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 - TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B - TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A - TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 - TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 - TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 - TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 - TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 - TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 - TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D - TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C - TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D - TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C - TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 - TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F - TLS_AES_128_GCM_SHA256 = 0x1301 - TLS_AES_256_GCM_SHA384 = 0x1302 - TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/urllib3/contrib/_securetransport/low_level.py b/urllib3/contrib/_securetransport/low_level.py deleted file mode 100644 index 5e3494bc..00000000 --- a/urllib3/contrib/_securetransport/low_level.py +++ /dev/null @@ -1,343 +0,0 @@ -""" -Low-level helpers for the SecureTransport bindings. - -These are Python functions that are not directly related to the high-level APIs -but are necessary to get them to work. They include a whole bunch of low-level -CoreFoundation messing about and memory management. The concerns in this module -are almost entirely about trying to avoid memory leaks and providing -appropriate and useful assistance to the higher-level code. -""" -import base64 -import ctypes -import itertools -import re -import os -import ssl -import tempfile - -from .bindings import Security, CoreFoundation, CFConst - - -# This regular expression is used to grab PEM data out of a PEM bundle. -_PEM_CERTS_RE = re.compile( - b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL -) - - -def _cf_data_from_bytes(bytestring): - """ - Given a bytestring, create a CFData object from it. This CFData object must - be CFReleased by the caller. - """ - return CoreFoundation.CFDataCreate( - CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) - ) - - -def _cf_dictionary_from_tuples(tuples): - """ - Given a list of Python tuples, create an associated CFDictionary. - """ - dictionary_size = len(tuples) - - # We need to get the dictionary keys and values out in the same order. - keys = (t[0] for t in tuples) - values = (t[1] for t in tuples) - cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) - cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) - - return CoreFoundation.CFDictionaryCreate( - CoreFoundation.kCFAllocatorDefault, - cf_keys, - cf_values, - dictionary_size, - CoreFoundation.kCFTypeDictionaryKeyCallBacks, - CoreFoundation.kCFTypeDictionaryValueCallBacks, - ) - - -def _cf_string_to_unicode(value): - """ - Creates a Unicode string from a CFString object. Used entirely for error - reporting. - - Yes, it annoys me quite a lot that this function is this complex. - """ - value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) - - string = CoreFoundation.CFStringGetCStringPtr( - value_as_void_p, - CFConst.kCFStringEncodingUTF8 - ) - if string is None: - buffer = ctypes.create_string_buffer(1024) - result = CoreFoundation.CFStringGetCString( - value_as_void_p, - buffer, - 1024, - CFConst.kCFStringEncodingUTF8 - ) - if not result: - raise OSError('Error copying C string from CFStringRef') - string = buffer.value - if string is not None: - string = string.decode('utf-8') - return string - - -def _assert_no_error(error, exception_class=None): - """ - Checks the return code and throws an exception if there is an error to - report - """ - if error == 0: - return - - cf_error_string = Security.SecCopyErrorMessageString(error, None) - output = _cf_string_to_unicode(cf_error_string) - CoreFoundation.CFRelease(cf_error_string) - - if output is None or output == u'': - output = u'OSStatus %s' % error - - if exception_class is None: - exception_class = ssl.SSLError - - raise exception_class(output) - - -def _cert_array_from_pem(pem_bundle): - """ - Given a bundle of certs in PEM format, turns them into a CFArray of certs - that can be used to validate a cert chain. - """ - der_certs = [ - base64.b64decode(match.group(1)) - for match in _PEM_CERTS_RE.finditer(pem_bundle) - ] - if not der_certs: - raise ssl.SSLError("No root certificates specified") - - cert_array = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks) - ) - if not cert_array: - raise ssl.SSLError("Unable to allocate memory!") - - try: - for der_bytes in der_certs: - certdata = _cf_data_from_bytes(der_bytes) - if not certdata: - raise ssl.SSLError("Unable to allocate memory!") - cert = Security.SecCertificateCreateWithData( - CoreFoundation.kCFAllocatorDefault, certdata - ) - CoreFoundation.CFRelease(certdata) - if not cert: - raise ssl.SSLError("Unable to build cert object!") - - CoreFoundation.CFArrayAppendValue(cert_array, cert) - CoreFoundation.CFRelease(cert) - except Exception: - # We need to free the array before the exception bubbles further. - # We only want to do that if an error occurs: otherwise, the caller - # should free. - CoreFoundation.CFRelease(cert_array) - - return cert_array - - -def _is_cert(item): - """ - Returns True if a given CFTypeRef is a certificate. - """ - expected = Security.SecCertificateGetTypeID() - return CoreFoundation.CFGetTypeID(item) == expected - - -def _is_identity(item): - """ - Returns True if a given CFTypeRef is an identity. - """ - expected = Security.SecIdentityGetTypeID() - return CoreFoundation.CFGetTypeID(item) == expected - - -def _temporary_keychain(): - """ - This function creates a temporary Mac keychain that we can use to work with - credentials. This keychain uses a one-time password and a temporary file to - store the data. We expect to have one keychain per socket. The returned - SecKeychainRef must be freed by the caller, including calling - SecKeychainDelete. - - Returns a tuple of the SecKeychainRef and the path to the temporary - directory that contains it. - """ - # Unfortunately, SecKeychainCreate requires a path to a keychain. This - # means we cannot use mkstemp to use a generic temporary file. Instead, - # we're going to create a temporary directory and a filename to use there. - # This filename will be 8 random bytes expanded into base64. We also need - # some random bytes to password-protect the keychain we're creating, so we - # ask for 40 random bytes. - random_bytes = os.urandom(40) - filename = base64.b64encode(random_bytes[:8]).decode('utf-8') - password = base64.b64encode(random_bytes[8:]) # Must be valid UTF-8 - tempdirectory = tempfile.mkdtemp() - - keychain_path = os.path.join(tempdirectory, filename).encode('utf-8') - - # We now want to create the keychain itself. - keychain = Security.SecKeychainRef() - status = Security.SecKeychainCreate( - keychain_path, - len(password), - password, - False, - None, - ctypes.byref(keychain) - ) - _assert_no_error(status) - - # Having created the keychain, we want to pass it off to the caller. - return keychain, tempdirectory - - -def _load_items_from_file(keychain, path): - """ - Given a single file, loads all the trust objects from it into arrays and - the keychain. - Returns a tuple of lists: the first list is a list of identities, the - second a list of certs. - """ - certificates = [] - identities = [] - result_array = None - - with open(path, 'rb') as f: - raw_filedata = f.read() - - try: - filedata = CoreFoundation.CFDataCreate( - CoreFoundation.kCFAllocatorDefault, - raw_filedata, - len(raw_filedata) - ) - result_array = CoreFoundation.CFArrayRef() - result = Security.SecItemImport( - filedata, # cert data - None, # Filename, leaving it out for now - None, # What the type of the file is, we don't care - None, # what's in the file, we don't care - 0, # import flags - None, # key params, can include passphrase in the future - keychain, # The keychain to insert into - ctypes.byref(result_array) # Results - ) - _assert_no_error(result) - - # A CFArray is not very useful to us as an intermediary - # representation, so we are going to extract the objects we want - # and then free the array. We don't need to keep hold of keys: the - # keychain already has them! - result_count = CoreFoundation.CFArrayGetCount(result_array) - for index in range(result_count): - item = CoreFoundation.CFArrayGetValueAtIndex( - result_array, index - ) - item = ctypes.cast(item, CoreFoundation.CFTypeRef) - - if _is_cert(item): - CoreFoundation.CFRetain(item) - certificates.append(item) - elif _is_identity(item): - CoreFoundation.CFRetain(item) - identities.append(item) - finally: - if result_array: - CoreFoundation.CFRelease(result_array) - - CoreFoundation.CFRelease(filedata) - - return (identities, certificates) - - -def _load_client_cert_chain(keychain, *paths): - """ - Load certificates and maybe keys from a number of files. Has the end goal - of returning a CFArray containing one SecIdentityRef, and then zero or more - SecCertificateRef objects, suitable for use as a client certificate trust - chain. - """ - # Ok, the strategy. - # - # This relies on knowing that macOS will not give you a SecIdentityRef - # unless you have imported a key into a keychain. This is a somewhat - # artificial limitation of macOS (for example, it doesn't necessarily - # affect iOS), but there is nothing inside Security.framework that lets you - # get a SecIdentityRef without having a key in a keychain. - # - # So the policy here is we take all the files and iterate them in order. - # Each one will use SecItemImport to have one or more objects loaded from - # it. We will also point at a keychain that macOS can use to work with the - # private key. - # - # Once we have all the objects, we'll check what we actually have. If we - # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, - # we'll take the first certificate (which we assume to be our leaf) and - # ask the keychain to give us a SecIdentityRef with that cert's associated - # key. - # - # We'll then return a CFArray containing the trust chain: one - # SecIdentityRef and then zero-or-more SecCertificateRef objects. The - # responsibility for freeing this CFArray will be with the caller. This - # CFArray must remain alive for the entire connection, so in practice it - # will be stored with a single SSLSocket, along with the reference to the - # keychain. - certificates = [] - identities = [] - - # Filter out bad paths. - paths = (path for path in paths if path) - - try: - for file_path in paths: - new_identities, new_certs = _load_items_from_file( - keychain, file_path - ) - identities.extend(new_identities) - certificates.extend(new_certs) - - # Ok, we have everything. The question is: do we have an identity? If - # not, we want to grab one from the first cert we have. - if not identities: - new_identity = Security.SecIdentityRef() - status = Security.SecIdentityCreateWithCertificate( - keychain, - certificates[0], - ctypes.byref(new_identity) - ) - _assert_no_error(status) - identities.append(new_identity) - - # We now want to release the original certificate, as we no longer - # need it. - CoreFoundation.CFRelease(certificates.pop(0)) - - # We now need to build a new CFArray that holds the trust chain. - trust_chain = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), - ) - for item in itertools.chain(identities, certificates): - # ArrayAppendValue does a CFRetain on the item. That's fine, - # because the finally block will release our other refs to them. - CoreFoundation.CFArrayAppendValue(trust_chain, item) - - return trust_chain - finally: - for obj in itertools.chain(identities, certificates): - CoreFoundation.CFRelease(obj) diff --git a/urllib3/contrib/appengine.py b/urllib3/contrib/appengine.py deleted file mode 100644 index 814b0222..00000000 --- a/urllib3/contrib/appengine.py +++ /dev/null @@ -1,296 +0,0 @@ -""" -This module provides a pool manager that uses Google App Engine's -`URLFetch Service `_. - -Example usage:: - - from urllib3 import PoolManager - from urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox - - if is_appengine_sandbox(): - # AppEngineManager uses AppEngine's URLFetch API behind the scenes - http = AppEngineManager() - else: - # PoolManager uses a socket-level API behind the scenes - http = PoolManager() - - r = http.request('GET', 'https://google.com/') - -There are `limitations `_ to the URLFetch service and it may not be -the best choice for your application. There are three options for using -urllib3 on Google App Engine: - -1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is - cost-effective in many circumstances as long as your usage is within the - limitations. -2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. - Sockets also have `limitations and restrictions - `_ and have a lower free quota than URLFetch. - To use sockets, be sure to specify the following in your ``app.yaml``:: - - env_variables: - GAE_USE_SOCKETS_HTTPLIB : 'true' - -3. If you are using `App Engine Flexible -`_, you can use the standard -:class:`PoolManager` without any configuration or special environment variables. -""" - -from __future__ import absolute_import -import logging -import os -import warnings -from ..packages.six.moves.urllib.parse import urljoin - -from ..exceptions import ( - HTTPError, - HTTPWarning, - MaxRetryError, - ProtocolError, - TimeoutError, - SSLError -) - -from ..packages.six import BytesIO -from ..request import RequestMethods -from ..response import HTTPResponse -from ..util.timeout import Timeout -from ..util.retry import Retry - -try: - from google.appengine.api import urlfetch -except ImportError: - urlfetch = None - - -log = logging.getLogger(__name__) - - -class AppEnginePlatformWarning(HTTPWarning): - pass - - -class AppEnginePlatformError(HTTPError): - pass - - -class AppEngineManager(RequestMethods): - """ - Connection manager for Google App Engine sandbox applications. - - This manager uses the URLFetch service directly instead of using the - emulated httplib, and is subject to URLFetch limitations as described in - the App Engine documentation `here - `_. - - Notably it will raise an :class:`AppEnginePlatformError` if: - * URLFetch is not available. - * If you attempt to use this on App Engine Flexible, as full socket - support is available. - * If a request size is more than 10 megabytes. - * If a response size is more than 32 megabtyes. - * If you use an unsupported request method such as OPTIONS. - - Beyond those cases, it will raise normal urllib3 errors. - """ - - def __init__(self, headers=None, retries=None, validate_certificate=True, - urlfetch_retries=True): - if not urlfetch: - raise AppEnginePlatformError( - "URLFetch is not available in this environment.") - - if is_prod_appengine_mvms(): - raise AppEnginePlatformError( - "Use normal urllib3.PoolManager instead of AppEngineManager" - "on Managed VMs, as using URLFetch is not necessary in " - "this environment.") - - warnings.warn( - "urllib3 is using URLFetch on Google App Engine sandbox instead " - "of sockets. To use sockets directly instead of URLFetch see " - "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", - AppEnginePlatformWarning) - - RequestMethods.__init__(self, headers) - self.validate_certificate = validate_certificate - self.urlfetch_retries = urlfetch_retries - - self.retries = retries or Retry.DEFAULT - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - # Return False to re-raise any potential exceptions - return False - - def urlopen(self, method, url, body=None, headers=None, - retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, - **response_kw): - - retries = self._get_retries(retries, redirect) - - try: - follow_redirects = ( - redirect and - retries.redirect != 0 and - retries.total) - response = urlfetch.fetch( - url, - payload=body, - method=method, - headers=headers or {}, - allow_truncated=False, - follow_redirects=self.urlfetch_retries and follow_redirects, - deadline=self._get_absolute_timeout(timeout), - validate_certificate=self.validate_certificate, - ) - except urlfetch.DeadlineExceededError as e: - raise TimeoutError(self, e) - - except urlfetch.InvalidURLError as e: - if 'too large' in str(e): - raise AppEnginePlatformError( - "URLFetch request too large, URLFetch only " - "supports requests up to 10mb in size.", e) - raise ProtocolError(e) - - except urlfetch.DownloadError as e: - if 'Too many redirects' in str(e): - raise MaxRetryError(self, url, reason=e) - raise ProtocolError(e) - - except urlfetch.ResponseTooLargeError as e: - raise AppEnginePlatformError( - "URLFetch response too large, URLFetch only supports" - "responses up to 32mb in size.", e) - - except urlfetch.SSLCertificateError as e: - raise SSLError(e) - - except urlfetch.InvalidMethodError as e: - raise AppEnginePlatformError( - "URLFetch does not support method: %s" % method, e) - - http_response = self._urlfetch_response_to_http_response( - response, retries=retries, **response_kw) - - # Handle redirect? - redirect_location = redirect and http_response.get_redirect_location() - if redirect_location: - # Check for redirect response - if (self.urlfetch_retries and retries.raise_on_redirect): - raise MaxRetryError(self, url, "too many redirects") - else: - if http_response.status == 303: - method = 'GET' - - try: - retries = retries.increment(method, url, response=http_response, _pool=self) - except MaxRetryError: - if retries.raise_on_redirect: - raise MaxRetryError(self, url, "too many redirects") - return http_response - - retries.sleep_for_retry(http_response) - log.debug("Redirecting %s -> %s", url, redirect_location) - redirect_url = urljoin(url, redirect_location) - return self.urlopen( - method, redirect_url, body, headers, - retries=retries, redirect=redirect, - timeout=timeout, **response_kw) - - # Check if we should retry the HTTP response. - has_retry_after = bool(http_response.getheader('Retry-After')) - if retries.is_retry(method, http_response.status, has_retry_after): - retries = retries.increment( - method, url, response=http_response, _pool=self) - log.debug("Retry: %s", url) - retries.sleep(http_response) - return self.urlopen( - method, url, - body=body, headers=headers, - retries=retries, redirect=redirect, - timeout=timeout, **response_kw) - - return http_response - - def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): - - if is_prod_appengine(): - # Production GAE handles deflate encoding automatically, but does - # not remove the encoding header. - content_encoding = urlfetch_resp.headers.get('content-encoding') - - if content_encoding == 'deflate': - del urlfetch_resp.headers['content-encoding'] - - transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') - # We have a full response's content, - # so let's make sure we don't report ourselves as chunked data. - if transfer_encoding == 'chunked': - encodings = transfer_encoding.split(",") - encodings.remove('chunked') - urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) - - return HTTPResponse( - # In order for decoding to work, we must present the content as - # a file-like object. - body=BytesIO(urlfetch_resp.content), - headers=urlfetch_resp.headers, - status=urlfetch_resp.status_code, - **response_kw - ) - - def _get_absolute_timeout(self, timeout): - if timeout is Timeout.DEFAULT_TIMEOUT: - return None # Defer to URLFetch's default. - if isinstance(timeout, Timeout): - if timeout._read is not None or timeout._connect is not None: - warnings.warn( - "URLFetch does not support granular timeout settings, " - "reverting to total or default URLFetch timeout.", - AppEnginePlatformWarning) - return timeout.total - return timeout - - def _get_retries(self, retries, redirect): - if not isinstance(retries, Retry): - retries = Retry.from_int( - retries, redirect=redirect, default=self.retries) - - if retries.connect or retries.read or retries.redirect: - warnings.warn( - "URLFetch only supports total retries and does not " - "recognize connect, read, or redirect retry parameters.", - AppEnginePlatformWarning) - - return retries - - -def is_appengine(): - return (is_local_appengine() or - is_prod_appengine() or - is_prod_appengine_mvms()) - - -def is_appengine_sandbox(): - return is_appengine() and not is_prod_appengine_mvms() - - -def is_local_appengine(): - return ('APPENGINE_RUNTIME' in os.environ and - 'Development/' in os.environ['SERVER_SOFTWARE']) - - -def is_prod_appengine(): - return ('APPENGINE_RUNTIME' in os.environ and - 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and - not is_prod_appengine_mvms()) - - -def is_prod_appengine_mvms(): - return os.environ.get('GAE_VM', False) == 'true' diff --git a/urllib3/contrib/ntlmpool.py b/urllib3/contrib/ntlmpool.py deleted file mode 100644 index 642e99ed..00000000 --- a/urllib3/contrib/ntlmpool.py +++ /dev/null @@ -1,112 +0,0 @@ -""" -NTLM authenticating pool, contributed by erikcederstran - -Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 -""" -from __future__ import absolute_import - -from logging import getLogger -from ntlm import ntlm - -from .. import HTTPSConnectionPool -from ..packages.six.moves.http_client import HTTPSConnection - - -log = getLogger(__name__) - - -class NTLMConnectionPool(HTTPSConnectionPool): - """ - Implements an NTLM authentication version of an urllib3 connection pool - """ - - scheme = 'https' - - def __init__(self, user, pw, authurl, *args, **kwargs): - """ - authurl is a random URL on the server that is protected by NTLM. - user is the Windows user, probably in the DOMAIN\\username format. - pw is the password for the user. - """ - super(NTLMConnectionPool, self).__init__(*args, **kwargs) - self.authurl = authurl - self.rawuser = user - user_parts = user.split('\\', 1) - self.domain = user_parts[0].upper() - self.user = user_parts[1] - self.pw = pw - - def _new_conn(self): - # Performs the NTLM handshake that secures the connection. The socket - # must be kept open while requests are performed. - self.num_connections += 1 - log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', - self.num_connections, self.host, self.authurl) - - headers = {} - headers['Connection'] = 'Keep-Alive' - req_header = 'Authorization' - resp_header = 'www-authenticate' - - conn = HTTPSConnection(host=self.host, port=self.port) - - # Send negotiation message - headers[req_header] = ( - 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) - log.debug('Request headers: %s', headers) - conn.request('GET', self.authurl, None, headers) - res = conn.getresponse() - reshdr = dict(res.getheaders()) - log.debug('Response status: %s %s', res.status, res.reason) - log.debug('Response headers: %s', reshdr) - log.debug('Response data: %s [...]', res.read(100)) - - # Remove the reference to the socket, so that it can not be closed by - # the response object (we want to keep the socket open) - res.fp = None - - # Server should respond with a challenge message - auth_header_values = reshdr[resp_header].split(', ') - auth_header_value = None - for s in auth_header_values: - if s[:5] == 'NTLM ': - auth_header_value = s[5:] - if auth_header_value is None: - raise Exception('Unexpected %s response header: %s' % - (resp_header, reshdr[resp_header])) - - # Send authentication message - ServerChallenge, NegotiateFlags = \ - ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) - auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, - self.user, - self.domain, - self.pw, - NegotiateFlags) - headers[req_header] = 'NTLM %s' % auth_msg - log.debug('Request headers: %s', headers) - conn.request('GET', self.authurl, None, headers) - res = conn.getresponse() - log.debug('Response status: %s %s', res.status, res.reason) - log.debug('Response headers: %s', dict(res.getheaders())) - log.debug('Response data: %s [...]', res.read()[:100]) - if res.status != 200: - if res.status == 401: - raise Exception('Server rejected request: wrong ' - 'username or password') - raise Exception('Wrong server response: %s %s' % - (res.status, res.reason)) - - res.fp = None - log.debug('Connection established') - return conn - - def urlopen(self, method, url, body=None, headers=None, retries=3, - redirect=True, assert_same_host=True): - if headers is None: - headers = {} - headers['Connection'] = 'Keep-Alive' - return super(NTLMConnectionPool, self).urlopen(method, url, body, - headers, retries, - redirect, - assert_same_host) diff --git a/urllib3/contrib/pyopenssl.py b/urllib3/contrib/pyopenssl.py deleted file mode 100644 index f63b8401..00000000 --- a/urllib3/contrib/pyopenssl.py +++ /dev/null @@ -1,455 +0,0 @@ -""" -SSL with SNI_-support for Python 2. Follow these instructions if you would -like to verify SSL certificates in Python 2. Note, the default libraries do -*not* do certificate checking; you need to do additional work to validate -certificates yourself. - -This needs the following packages installed: - -* pyOpenSSL (tested with 16.0.0) -* cryptography (minimum 1.3.4, from pyopenssl) -* idna (minimum 2.0, from cryptography) - -However, pyopenssl depends on cryptography, which depends on idna, so while we -use all three directly here we end up having relatively few packages required. - -You can install them with the following command: - - pip install pyopenssl cryptography idna - -To activate certificate checking, call -:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code -before you begin making HTTP requests. This can be done in a ``sitecustomize`` -module, or at any other time before your application begins using ``urllib3``, -like this:: - - try: - import urllib3.contrib.pyopenssl - urllib3.contrib.pyopenssl.inject_into_urllib3() - except ImportError: - pass - -Now you can use :mod:`urllib3` as you normally would, and it will support SNI -when the required modules are installed. - -Activating this module also has the positive side effect of disabling SSL/TLS -compression in Python 2 (see `CRIME attack`_). - -If you want to configure the default list of supported cipher suites, you can -set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. - -.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication -.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) -""" -from __future__ import absolute_import - -import OpenSSL.SSL -from cryptography import x509 -from cryptography.hazmat.backends.openssl import backend as openssl_backend -from cryptography.hazmat.backends.openssl.x509 import _Certificate - -from socket import timeout, error as SocketError -from io import BytesIO - -try: # Platform-specific: Python 2 - from socket import _fileobject -except ImportError: # Platform-specific: Python 3 - _fileobject = None - from ..packages.backports.makefile import backport_makefile - -import logging -import ssl -from ..packages import six -import sys - -from .. import util - -__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] - -# SNI always works. -HAS_SNI = True - -# Map from urllib3 to PyOpenSSL compatible parameter-values. -_openssl_versions = { - ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, - ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, -} - -if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): - _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD - -if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): - _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD - -try: - _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) -except AttributeError: - pass - -_stdlib_to_openssl_verify = { - ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, - ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, - ssl.CERT_REQUIRED: - OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, -} -_openssl_to_stdlib_verify = dict( - (v, k) for k, v in _stdlib_to_openssl_verify.items() -) - -# OpenSSL will only write 16K at a time -SSL_WRITE_BLOCKSIZE = 16384 - -orig_util_HAS_SNI = util.HAS_SNI -orig_util_SSLContext = util.ssl_.SSLContext - - -log = logging.getLogger(__name__) - - -def inject_into_urllib3(): - 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' - - _validate_dependencies_met() - - util.ssl_.SSLContext = PyOpenSSLContext - util.HAS_SNI = HAS_SNI - util.ssl_.HAS_SNI = HAS_SNI - util.IS_PYOPENSSL = True - util.ssl_.IS_PYOPENSSL = True - - -def extract_from_urllib3(): - 'Undo monkey-patching by :func:`inject_into_urllib3`.' - - util.ssl_.SSLContext = orig_util_SSLContext - util.HAS_SNI = orig_util_HAS_SNI - util.ssl_.HAS_SNI = orig_util_HAS_SNI - util.IS_PYOPENSSL = False - util.ssl_.IS_PYOPENSSL = False - - -def _validate_dependencies_met(): - """ - Verifies that PyOpenSSL's package-level dependencies have been met. - Throws `ImportError` if they are not met. - """ - # Method added in `cryptography==1.1`; not available in older versions - from cryptography.x509.extensions import Extensions - if getattr(Extensions, "get_extension_for_class", None) is None: - raise ImportError("'cryptography' module missing required functionality. " - "Try upgrading to v1.3.4 or newer.") - - # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 - # attribute is only present on those versions. - from OpenSSL.crypto import X509 - x509 = X509() - if getattr(x509, "_x509", None) is None: - raise ImportError("'pyOpenSSL' module missing required functionality. " - "Try upgrading to v0.14 or newer.") - - -def _dnsname_to_stdlib(name): - """ - Converts a dNSName SubjectAlternativeName field to the form used by the - standard library on the given Python version. - - Cryptography produces a dNSName as a unicode string that was idna-decoded - from ASCII bytes. We need to idna-encode that string to get it back, and - then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib - uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). - """ - def idna_encode(name): - """ - Borrowed wholesale from the Python Cryptography Project. It turns out - that we can't just safely call `idna.encode`: it can explode for - wildcard names. This avoids that problem. - """ - import idna - - for prefix in [u'*.', u'.']: - if name.startswith(prefix): - name = name[len(prefix):] - return prefix.encode('ascii') + idna.encode(name) - return idna.encode(name) - - name = idna_encode(name) - if sys.version_info >= (3, 0): - name = name.decode('utf-8') - return name - - -def get_subj_alt_name(peer_cert): - """ - Given an PyOpenSSL certificate, provides all the subject alternative names. - """ - # Pass the cert to cryptography, which has much better APIs for this. - if hasattr(peer_cert, "to_cryptography"): - cert = peer_cert.to_cryptography() - else: - # This is technically using private APIs, but should work across all - # relevant versions before PyOpenSSL got a proper API for this. - cert = _Certificate(openssl_backend, peer_cert._x509) - - # We want to find the SAN extension. Ask Cryptography to locate it (it's - # faster than looping in Python) - try: - ext = cert.extensions.get_extension_for_class( - x509.SubjectAlternativeName - ).value - except x509.ExtensionNotFound: - # No such extension, return the empty list. - return [] - except (x509.DuplicateExtension, x509.UnsupportedExtension, - x509.UnsupportedGeneralNameType, UnicodeError) as e: - # A problem has been found with the quality of the certificate. Assume - # no SAN field is present. - log.warning( - "A problem was encountered with the certificate that prevented " - "urllib3 from finding the SubjectAlternativeName field. This can " - "affect certificate validation. The error was %s", - e, - ) - return [] - - # We want to return dNSName and iPAddress fields. We need to cast the IPs - # back to strings because the match_hostname function wants them as - # strings. - # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 - # decoded. This is pretty frustrating, but that's what the standard library - # does with certificates, and so we need to attempt to do the same. - names = [ - ('DNS', _dnsname_to_stdlib(name)) - for name in ext.get_values_for_type(x509.DNSName) - ] - names.extend( - ('IP Address', str(name)) - for name in ext.get_values_for_type(x509.IPAddress) - ) - - return names - - -class WrappedSocket(object): - '''API-compatibility wrapper for Python OpenSSL's Connection-class. - - Note: _makefile_refs, _drop() and _reuse() are needed for the garbage - collector of pypy. - ''' - - def __init__(self, connection, socket, suppress_ragged_eofs=True): - self.connection = connection - self.socket = socket - self.suppress_ragged_eofs = suppress_ragged_eofs - self._makefile_refs = 0 - self._closed = False - - def fileno(self): - return self.socket.fileno() - - # Copy-pasted from Python 3.5 source code - def _decref_socketios(self): - if self._makefile_refs > 0: - self._makefile_refs -= 1 - if self._closed: - self.close() - - def recv(self, *args, **kwargs): - try: - data = self.connection.recv(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): - return b'' - else: - raise SocketError(str(e)) - except OpenSSL.SSL.ZeroReturnError as e: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return b'' - else: - raise - except OpenSSL.SSL.WantReadError: - rd = util.wait_for_read(self.socket, self.socket.gettimeout()) - if not rd: - raise timeout('The read operation timed out') - else: - return self.recv(*args, **kwargs) - else: - return data - - def recv_into(self, *args, **kwargs): - try: - return self.connection.recv_into(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): - return 0 - else: - raise SocketError(str(e)) - except OpenSSL.SSL.ZeroReturnError as e: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return 0 - else: - raise - except OpenSSL.SSL.WantReadError: - rd = util.wait_for_read(self.socket, self.socket.gettimeout()) - if not rd: - raise timeout('The read operation timed out') - else: - return self.recv_into(*args, **kwargs) - - def settimeout(self, timeout): - return self.socket.settimeout(timeout) - - def _send_until_done(self, data): - while True: - try: - return self.connection.send(data) - except OpenSSL.SSL.WantWriteError: - wr = util.wait_for_write(self.socket, self.socket.gettimeout()) - if not wr: - raise timeout() - continue - except OpenSSL.SSL.SysCallError as e: - raise SocketError(str(e)) - - def sendall(self, data): - total_sent = 0 - while total_sent < len(data): - sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) - total_sent += sent - - def shutdown(self): - # FIXME rethrow compatible exceptions should we ever use this - self.connection.shutdown() - - def close(self): - if self._makefile_refs < 1: - try: - self._closed = True - return self.connection.close() - except OpenSSL.SSL.Error: - return - else: - self._makefile_refs -= 1 - - def getpeercert(self, binary_form=False): - x509 = self.connection.get_peer_certificate() - - if not x509: - return x509 - - if binary_form: - return OpenSSL.crypto.dump_certificate( - OpenSSL.crypto.FILETYPE_ASN1, - x509) - - return { - 'subject': ( - (('commonName', x509.get_subject().CN),), - ), - 'subjectAltName': get_subj_alt_name(x509) - } - - def _reuse(self): - self._makefile_refs += 1 - - def _drop(self): - if self._makefile_refs < 1: - self.close() - else: - self._makefile_refs -= 1 - - -if _fileobject: # Platform-specific: Python 2 - def makefile(self, mode, bufsize=-1): - self._makefile_refs += 1 - return _fileobject(self, mode, bufsize, close=True) -else: # Platform-specific: Python 3 - makefile = backport_makefile - -WrappedSocket.makefile = makefile - - -class PyOpenSSLContext(object): - """ - I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible - for translating the interface of the standard library ``SSLContext`` object - to calls into PyOpenSSL. - """ - def __init__(self, protocol): - self.protocol = _openssl_versions[protocol] - self._ctx = OpenSSL.SSL.Context(self.protocol) - self._options = 0 - self.check_hostname = False - - @property - def options(self): - return self._options - - @options.setter - def options(self, value): - self._options = value - self._ctx.set_options(value) - - @property - def verify_mode(self): - return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] - - @verify_mode.setter - def verify_mode(self, value): - self._ctx.set_verify( - _stdlib_to_openssl_verify[value], - _verify_callback - ) - - def set_default_verify_paths(self): - self._ctx.set_default_verify_paths() - - def set_ciphers(self, ciphers): - if isinstance(ciphers, six.text_type): - ciphers = ciphers.encode('utf-8') - self._ctx.set_cipher_list(ciphers) - - def load_verify_locations(self, cafile=None, capath=None, cadata=None): - if cafile is not None: - cafile = cafile.encode('utf-8') - if capath is not None: - capath = capath.encode('utf-8') - self._ctx.load_verify_locations(cafile, capath) - if cadata is not None: - self._ctx.load_verify_locations(BytesIO(cadata)) - - def load_cert_chain(self, certfile, keyfile=None, password=None): - self._ctx.use_certificate_file(certfile) - if password is not None: - self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) - self._ctx.use_privatekey_file(keyfile or certfile) - - def wrap_socket(self, sock, server_side=False, - do_handshake_on_connect=True, suppress_ragged_eofs=True, - server_hostname=None): - cnx = OpenSSL.SSL.Connection(self._ctx, sock) - - if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 - server_hostname = server_hostname.encode('utf-8') - - if server_hostname is not None: - cnx.set_tlsext_host_name(server_hostname) - - cnx.set_connect_state() - - while True: - try: - cnx.do_handshake() - except OpenSSL.SSL.WantReadError: - rd = util.wait_for_read(sock, sock.gettimeout()) - if not rd: - raise timeout('select timed out') - continue - except OpenSSL.SSL.Error as e: - raise ssl.SSLError('bad handshake: %r' % e) - break - - return WrappedSocket(cnx, sock) - - -def _verify_callback(cnx, x509, err_no, err_depth, return_code): - return err_no == 0 diff --git a/urllib3/contrib/securetransport.py b/urllib3/contrib/securetransport.py deleted file mode 100644 index 2cac70f7..00000000 --- a/urllib3/contrib/securetransport.py +++ /dev/null @@ -1,810 +0,0 @@ -""" -SecureTranport support for urllib3 via ctypes. - -This makes platform-native TLS available to urllib3 users on macOS without the -use of a compiler. This is an important feature because the Python Package -Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL -that ships with macOS is not capable of doing TLSv1.2. The only way to resolve -this is to give macOS users an alternative solution to the problem, and that -solution is to use SecureTransport. - -We use ctypes here because this solution must not require a compiler. That's -because pip is not allowed to require a compiler either. - -This is not intended to be a seriously long-term solution to this problem. -The hope is that PEP 543 will eventually solve this issue for us, at which -point we can retire this contrib module. But in the short term, we need to -solve the impending tire fire that is Python on Mac without this kind of -contrib module. So...here we are. - -To use this module, simply import and inject it:: - - import urllib3.contrib.securetransport - urllib3.contrib.securetransport.inject_into_urllib3() - -Happy TLSing! -""" -from __future__ import absolute_import - -import contextlib -import ctypes -import errno -import os.path -import shutil -import socket -import ssl -import threading -import weakref - -from .. import util -from ._securetransport.bindings import ( - Security, SecurityConst, CoreFoundation -) -from ._securetransport.low_level import ( - _assert_no_error, _cert_array_from_pem, _temporary_keychain, - _load_client_cert_chain -) - -try: # Platform-specific: Python 2 - from socket import _fileobject -except ImportError: # Platform-specific: Python 3 - _fileobject = None - from ..packages.backports.makefile import backport_makefile - -try: - memoryview(b'') -except NameError: - raise ImportError("SecureTransport only works on Pythons with memoryview") - -__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] - -# SNI always works -HAS_SNI = True - -orig_util_HAS_SNI = util.HAS_SNI -orig_util_SSLContext = util.ssl_.SSLContext - -# This dictionary is used by the read callback to obtain a handle to the -# calling wrapped socket. This is a pretty silly approach, but for now it'll -# do. I feel like I should be able to smuggle a handle to the wrapped socket -# directly in the SSLConnectionRef, but for now this approach will work I -# guess. -# -# We need to lock around this structure for inserts, but we don't do it for -# reads/writes in the callbacks. The reasoning here goes as follows: -# -# 1. It is not possible to call into the callbacks before the dictionary is -# populated, so once in the callback the id must be in the dictionary. -# 2. The callbacks don't mutate the dictionary, they only read from it, and -# so cannot conflict with any of the insertions. -# -# This is good: if we had to lock in the callbacks we'd drastically slow down -# the performance of this code. -_connection_refs = weakref.WeakValueDictionary() -_connection_ref_lock = threading.Lock() - -# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over -# for no better reason than we need *a* limit, and this one is right there. -SSL_WRITE_BLOCKSIZE = 16384 - -# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to -# individual cipher suites. We need to do this becuase this is how -# SecureTransport wants them. -CIPHER_SUITES = [ - SecurityConst.TLS_AES_256_GCM_SHA384, - SecurityConst.TLS_CHACHA20_POLY1305_SHA256, - SecurityConst.TLS_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, -] - -# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of -# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. -_protocol_to_min_max = { - ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), -} - -if hasattr(ssl, "PROTOCOL_SSLv2"): - _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( - SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2 - ) -if hasattr(ssl, "PROTOCOL_SSLv3"): - _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( - SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3 - ) -if hasattr(ssl, "PROTOCOL_TLSv1"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( - SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1 - ) -if hasattr(ssl, "PROTOCOL_TLSv1_1"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( - SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11 - ) -if hasattr(ssl, "PROTOCOL_TLSv1_2"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( - SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12 - ) -if hasattr(ssl, "PROTOCOL_TLS"): - _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23] - - -def inject_into_urllib3(): - """ - Monkey-patch urllib3 with SecureTransport-backed SSL-support. - """ - util.ssl_.SSLContext = SecureTransportContext - util.HAS_SNI = HAS_SNI - util.ssl_.HAS_SNI = HAS_SNI - util.IS_SECURETRANSPORT = True - util.ssl_.IS_SECURETRANSPORT = True - - -def extract_from_urllib3(): - """ - Undo monkey-patching by :func:`inject_into_urllib3`. - """ - util.ssl_.SSLContext = orig_util_SSLContext - util.HAS_SNI = orig_util_HAS_SNI - util.ssl_.HAS_SNI = orig_util_HAS_SNI - util.IS_SECURETRANSPORT = False - util.ssl_.IS_SECURETRANSPORT = False - - -def _read_callback(connection_id, data_buffer, data_length_pointer): - """ - SecureTransport read callback. This is called by ST to request that data - be returned from the socket. - """ - wrapped_socket = None - try: - wrapped_socket = _connection_refs.get(connection_id) - if wrapped_socket is None: - return SecurityConst.errSSLInternal - base_socket = wrapped_socket.socket - - requested_length = data_length_pointer[0] - - timeout = wrapped_socket.gettimeout() - error = None - read_count = 0 - buffer = (ctypes.c_char * requested_length).from_address(data_buffer) - buffer_view = memoryview(buffer) - - try: - while read_count < requested_length: - if timeout is None or timeout >= 0: - readables = util.wait_for_read([base_socket], timeout) - if not readables: - raise socket.error(errno.EAGAIN, 'timed out') - - # We need to tell ctypes that we have a buffer that can be - # written to. Upsettingly, we do that like this: - chunk_size = base_socket.recv_into( - buffer_view[read_count:requested_length] - ) - read_count += chunk_size - if not chunk_size: - if not read_count: - return SecurityConst.errSSLClosedGraceful - break - except (socket.error) as e: - error = e.errno - - if error is not None and error != errno.EAGAIN: - if error == errno.ECONNRESET: - return SecurityConst.errSSLClosedAbort - raise - - data_length_pointer[0] = read_count - - if read_count != requested_length: - return SecurityConst.errSSLWouldBlock - - return 0 - except Exception as e: - if wrapped_socket is not None: - wrapped_socket._exception = e - return SecurityConst.errSSLInternal - - -def _write_callback(connection_id, data_buffer, data_length_pointer): - """ - SecureTransport write callback. This is called by ST to request that data - actually be sent on the network. - """ - wrapped_socket = None - try: - wrapped_socket = _connection_refs.get(connection_id) - if wrapped_socket is None: - return SecurityConst.errSSLInternal - base_socket = wrapped_socket.socket - - bytes_to_write = data_length_pointer[0] - data = ctypes.string_at(data_buffer, bytes_to_write) - - timeout = wrapped_socket.gettimeout() - error = None - sent = 0 - - try: - while sent < bytes_to_write: - if timeout is None or timeout >= 0: - writables = util.wait_for_write([base_socket], timeout) - if not writables: - raise socket.error(errno.EAGAIN, 'timed out') - chunk_sent = base_socket.send(data) - sent += chunk_sent - - # This has some needless copying here, but I'm not sure there's - # much value in optimising this data path. - data = data[chunk_sent:] - except (socket.error) as e: - error = e.errno - - if error is not None and error != errno.EAGAIN: - if error == errno.ECONNRESET: - return SecurityConst.errSSLClosedAbort - raise - - data_length_pointer[0] = sent - if sent != bytes_to_write: - return SecurityConst.errSSLWouldBlock - - return 0 - except Exception as e: - if wrapped_socket is not None: - wrapped_socket._exception = e - return SecurityConst.errSSLInternal - - -# We need to keep these two objects references alive: if they get GC'd while -# in use then SecureTransport could attempt to call a function that is in freed -# memory. That would be...uh...bad. Yeah, that's the word. Bad. -_read_callback_pointer = Security.SSLReadFunc(_read_callback) -_write_callback_pointer = Security.SSLWriteFunc(_write_callback) - - -class WrappedSocket(object): - """ - API-compatibility wrapper for Python's OpenSSL wrapped socket object. - - Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage - collector of PyPy. - """ - def __init__(self, socket): - self.socket = socket - self.context = None - self._makefile_refs = 0 - self._closed = False - self._exception = None - self._keychain = None - self._keychain_dir = None - self._client_cert_chain = None - - # We save off the previously-configured timeout and then set it to - # zero. This is done because we use select and friends to handle the - # timeouts, but if we leave the timeout set on the lower socket then - # Python will "kindly" call select on that socket again for us. Avoid - # that by forcing the timeout to zero. - self._timeout = self.socket.gettimeout() - self.socket.settimeout(0) - - @contextlib.contextmanager - def _raise_on_error(self): - """ - A context manager that can be used to wrap calls that do I/O from - SecureTransport. If any of the I/O callbacks hit an exception, this - context manager will correctly propagate the exception after the fact. - This avoids silently swallowing those exceptions. - - It also correctly forces the socket closed. - """ - self._exception = None - - # We explicitly don't catch around this yield because in the unlikely - # event that an exception was hit in the block we don't want to swallow - # it. - yield - if self._exception is not None: - exception, self._exception = self._exception, None - self.close() - raise exception - - def _set_ciphers(self): - """ - Sets up the allowed ciphers. By default this matches the set in - util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done - custom and doesn't allow changing at this time, mostly because parsing - OpenSSL cipher strings is going to be a freaking nightmare. - """ - ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) - result = Security.SSLSetEnabledCiphers( - self.context, ciphers, len(CIPHER_SUITES) - ) - _assert_no_error(result) - - def _custom_validate(self, verify, trust_bundle): - """ - Called when we have set custom validation. We do this in two cases: - first, when cert validation is entirely disabled; and second, when - using a custom trust DB. - """ - # If we disabled cert validation, just say: cool. - if not verify: - return - - # We want data in memory, so load it up. - if os.path.isfile(trust_bundle): - with open(trust_bundle, 'rb') as f: - trust_bundle = f.read() - - cert_array = None - trust = Security.SecTrustRef() - - try: - # Get a CFArray that contains the certs we want. - cert_array = _cert_array_from_pem(trust_bundle) - - # Ok, now the hard part. We want to get the SecTrustRef that ST has - # created for this connection, shove our CAs into it, tell ST to - # ignore everything else it knows, and then ask if it can build a - # chain. This is a buuuunch of code. - result = Security.SSLCopyPeerTrust( - self.context, ctypes.byref(trust) - ) - _assert_no_error(result) - if not trust: - raise ssl.SSLError("Failed to copy trust reference") - - result = Security.SecTrustSetAnchorCertificates(trust, cert_array) - _assert_no_error(result) - - result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) - _assert_no_error(result) - - trust_result = Security.SecTrustResultType() - result = Security.SecTrustEvaluate( - trust, ctypes.byref(trust_result) - ) - _assert_no_error(result) - finally: - if trust: - CoreFoundation.CFRelease(trust) - - if cert_array is None: - CoreFoundation.CFRelease(cert_array) - - # Ok, now we can look at what the result was. - successes = ( - SecurityConst.kSecTrustResultUnspecified, - SecurityConst.kSecTrustResultProceed - ) - if trust_result.value not in successes: - raise ssl.SSLError( - "certificate verify failed, error code: %d" % - trust_result.value - ) - - def handshake(self, - server_hostname, - verify, - trust_bundle, - min_version, - max_version, - client_cert, - client_key, - client_key_passphrase): - """ - Actually performs the TLS handshake. This is run automatically by - wrapped socket, and shouldn't be needed in user code. - """ - # First, we do the initial bits of connection setup. We need to create - # a context, set its I/O funcs, and set the connection reference. - self.context = Security.SSLCreateContext( - None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType - ) - result = Security.SSLSetIOFuncs( - self.context, _read_callback_pointer, _write_callback_pointer - ) - _assert_no_error(result) - - # Here we need to compute the handle to use. We do this by taking the - # id of self modulo 2**31 - 1. If this is already in the dictionary, we - # just keep incrementing by one until we find a free space. - with _connection_ref_lock: - handle = id(self) % 2147483647 - while handle in _connection_refs: - handle = (handle + 1) % 2147483647 - _connection_refs[handle] = self - - result = Security.SSLSetConnection(self.context, handle) - _assert_no_error(result) - - # If we have a server hostname, we should set that too. - if server_hostname: - if not isinstance(server_hostname, bytes): - server_hostname = server_hostname.encode('utf-8') - - result = Security.SSLSetPeerDomainName( - self.context, server_hostname, len(server_hostname) - ) - _assert_no_error(result) - - # Setup the ciphers. - self._set_ciphers() - - # Set the minimum and maximum TLS versions. - result = Security.SSLSetProtocolVersionMin(self.context, min_version) - _assert_no_error(result) - result = Security.SSLSetProtocolVersionMax(self.context, max_version) - _assert_no_error(result) - - # If there's a trust DB, we need to use it. We do that by telling - # SecureTransport to break on server auth. We also do that if we don't - # want to validate the certs at all: we just won't actually do any - # authing in that case. - if not verify or trust_bundle is not None: - result = Security.SSLSetSessionOption( - self.context, - SecurityConst.kSSLSessionOptionBreakOnServerAuth, - True - ) - _assert_no_error(result) - - # If there's a client cert, we need to use it. - if client_cert: - self._keychain, self._keychain_dir = _temporary_keychain() - self._client_cert_chain = _load_client_cert_chain( - self._keychain, client_cert, client_key - ) - result = Security.SSLSetCertificate( - self.context, self._client_cert_chain - ) - _assert_no_error(result) - - while True: - with self._raise_on_error(): - result = Security.SSLHandshake(self.context) - - if result == SecurityConst.errSSLWouldBlock: - raise socket.timeout("handshake timed out") - elif result == SecurityConst.errSSLServerAuthCompleted: - self._custom_validate(verify, trust_bundle) - continue - else: - _assert_no_error(result) - break - - def fileno(self): - return self.socket.fileno() - - # Copy-pasted from Python 3.5 source code - def _decref_socketios(self): - if self._makefile_refs > 0: - self._makefile_refs -= 1 - if self._closed: - self.close() - - def recv(self, bufsiz): - buffer = ctypes.create_string_buffer(bufsiz) - bytes_read = self.recv_into(buffer, bufsiz) - data = buffer[:bytes_read] - return data - - def recv_into(self, buffer, nbytes=None): - # Read short on EOF. - if self._closed: - return 0 - - if nbytes is None: - nbytes = len(buffer) - - buffer = (ctypes.c_char * nbytes).from_buffer(buffer) - processed_bytes = ctypes.c_size_t(0) - - with self._raise_on_error(): - result = Security.SSLRead( - self.context, buffer, nbytes, ctypes.byref(processed_bytes) - ) - - # There are some result codes that we want to treat as "not always - # errors". Specifically, those are errSSLWouldBlock, - # errSSLClosedGraceful, and errSSLClosedNoNotify. - if (result == SecurityConst.errSSLWouldBlock): - # If we didn't process any bytes, then this was just a time out. - # However, we can get errSSLWouldBlock in situations when we *did* - # read some data, and in those cases we should just read "short" - # and return. - if processed_bytes.value == 0: - # Timed out, no data read. - raise socket.timeout("recv timed out") - elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify): - # The remote peer has closed this connection. We should do so as - # well. Note that we don't actually return here because in - # principle this could actually be fired along with return data. - # It's unlikely though. - self.close() - else: - _assert_no_error(result) - - # Ok, we read and probably succeeded. We should return whatever data - # was actually read. - return processed_bytes.value - - def settimeout(self, timeout): - self._timeout = timeout - - def gettimeout(self): - return self._timeout - - def send(self, data): - processed_bytes = ctypes.c_size_t(0) - - with self._raise_on_error(): - result = Security.SSLWrite( - self.context, data, len(data), ctypes.byref(processed_bytes) - ) - - if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: - # Timed out - raise socket.timeout("send timed out") - else: - _assert_no_error(result) - - # We sent, and probably succeeded. Tell them how much we sent. - return processed_bytes.value - - def sendall(self, data): - total_sent = 0 - while total_sent < len(data): - sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) - total_sent += sent - - def shutdown(self): - with self._raise_on_error(): - Security.SSLClose(self.context) - - def close(self): - # TODO: should I do clean shutdown here? Do I have to? - if self._makefile_refs < 1: - self._closed = True - if self.context: - CoreFoundation.CFRelease(self.context) - self.context = None - if self._client_cert_chain: - CoreFoundation.CFRelease(self._client_cert_chain) - self._client_cert_chain = None - if self._keychain: - Security.SecKeychainDelete(self._keychain) - CoreFoundation.CFRelease(self._keychain) - shutil.rmtree(self._keychain_dir) - self._keychain = self._keychain_dir = None - return self.socket.close() - else: - self._makefile_refs -= 1 - - def getpeercert(self, binary_form=False): - # Urgh, annoying. - # - # Here's how we do this: - # - # 1. Call SSLCopyPeerTrust to get hold of the trust object for this - # connection. - # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. - # 3. To get the CN, call SecCertificateCopyCommonName and process that - # string so that it's of the appropriate type. - # 4. To get the SAN, we need to do something a bit more complex: - # a. Call SecCertificateCopyValues to get the data, requesting - # kSecOIDSubjectAltName. - # b. Mess about with this dictionary to try to get the SANs out. - # - # This is gross. Really gross. It's going to be a few hundred LoC extra - # just to repeat something that SecureTransport can *already do*. So my - # operating assumption at this time is that what we want to do is - # instead to just flag to urllib3 that it shouldn't do its own hostname - # validation when using SecureTransport. - if not binary_form: - raise ValueError( - "SecureTransport only supports dumping binary certs" - ) - trust = Security.SecTrustRef() - certdata = None - der_bytes = None - - try: - # Grab the trust store. - result = Security.SSLCopyPeerTrust( - self.context, ctypes.byref(trust) - ) - _assert_no_error(result) - if not trust: - # Probably we haven't done the handshake yet. No biggie. - return None - - cert_count = Security.SecTrustGetCertificateCount(trust) - if not cert_count: - # Also a case that might happen if we haven't handshaked. - # Handshook? Handshaken? - return None - - leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) - assert leaf - - # Ok, now we want the DER bytes. - certdata = Security.SecCertificateCopyData(leaf) - assert certdata - - data_length = CoreFoundation.CFDataGetLength(certdata) - data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) - der_bytes = ctypes.string_at(data_buffer, data_length) - finally: - if certdata: - CoreFoundation.CFRelease(certdata) - if trust: - CoreFoundation.CFRelease(trust) - - return der_bytes - - def _reuse(self): - self._makefile_refs += 1 - - def _drop(self): - if self._makefile_refs < 1: - self.close() - else: - self._makefile_refs -= 1 - - -if _fileobject: # Platform-specific: Python 2 - def makefile(self, mode, bufsize=-1): - self._makefile_refs += 1 - return _fileobject(self, mode, bufsize, close=True) -else: # Platform-specific: Python 3 - def makefile(self, mode="r", buffering=None, *args, **kwargs): - # We disable buffering with SecureTransport because it conflicts with - # the buffering that ST does internally (see issue #1153 for more). - buffering = 0 - return backport_makefile(self, mode, buffering, *args, **kwargs) - -WrappedSocket.makefile = makefile - - -class SecureTransportContext(object): - """ - I am a wrapper class for the SecureTransport library, to translate the - interface of the standard library ``SSLContext`` object to calls into - SecureTransport. - """ - def __init__(self, protocol): - self._min_version, self._max_version = _protocol_to_min_max[protocol] - self._options = 0 - self._verify = False - self._trust_bundle = None - self._client_cert = None - self._client_key = None - self._client_key_passphrase = None - - @property - def check_hostname(self): - """ - SecureTransport cannot have its hostname checking disabled. For more, - see the comment on getpeercert() in this file. - """ - return True - - @check_hostname.setter - def check_hostname(self, value): - """ - SecureTransport cannot have its hostname checking disabled. For more, - see the comment on getpeercert() in this file. - """ - pass - - @property - def options(self): - # TODO: Well, crap. - # - # So this is the bit of the code that is the most likely to cause us - # trouble. Essentially we need to enumerate all of the SSL options that - # users might want to use and try to see if we can sensibly translate - # them, or whether we should just ignore them. - return self._options - - @options.setter - def options(self, value): - # TODO: Update in line with above. - self._options = value - - @property - def verify_mode(self): - return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE - - @verify_mode.setter - def verify_mode(self, value): - self._verify = True if value == ssl.CERT_REQUIRED else False - - def set_default_verify_paths(self): - # So, this has to do something a bit weird. Specifically, what it does - # is nothing. - # - # This means that, if we had previously had load_verify_locations - # called, this does not undo that. We need to do that because it turns - # out that the rest of the urllib3 code will attempt to load the - # default verify paths if it hasn't been told about any paths, even if - # the context itself was sometime earlier. We resolve that by just - # ignoring it. - pass - - def load_default_certs(self): - return self.set_default_verify_paths() - - def set_ciphers(self, ciphers): - # For now, we just require the default cipher string. - if ciphers != util.ssl_.DEFAULT_CIPHERS: - raise ValueError( - "SecureTransport doesn't support custom cipher strings" - ) - - def load_verify_locations(self, cafile=None, capath=None, cadata=None): - # OK, we only really support cadata and cafile. - if capath is not None: - raise ValueError( - "SecureTransport does not support cert directories" - ) - - self._trust_bundle = cafile or cadata - - def load_cert_chain(self, certfile, keyfile=None, password=None): - self._client_cert = certfile - self._client_key = keyfile - self._client_cert_passphrase = password - - def wrap_socket(self, sock, server_side=False, - do_handshake_on_connect=True, suppress_ragged_eofs=True, - server_hostname=None): - # So, what do we do here? Firstly, we assert some properties. This is a - # stripped down shim, so there is some functionality we don't support. - # See PEP 543 for the real deal. - assert not server_side - assert do_handshake_on_connect - assert suppress_ragged_eofs - - # Ok, we're good to go. Now we want to create the wrapped socket object - # and store it in the appropriate place. - wrapped_socket = WrappedSocket(sock) - - # Now we can handshake - wrapped_socket.handshake( - server_hostname, self._verify, self._trust_bundle, - self._min_version, self._max_version, self._client_cert, - self._client_key, self._client_key_passphrase - ) - return wrapped_socket diff --git a/urllib3/contrib/socks.py b/urllib3/contrib/socks.py deleted file mode 100644 index 39e92fde..00000000 --- a/urllib3/contrib/socks.py +++ /dev/null @@ -1,188 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module contains provisional support for SOCKS proxies from within -urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and -SOCKS5. To enable its functionality, either install PySocks or install this -module with the ``socks`` extra. - -The SOCKS implementation supports the full range of urllib3 features. It also -supports the following SOCKS features: - -- SOCKS4 -- SOCKS4a -- SOCKS5 -- Usernames and passwords for the SOCKS proxy - -Known Limitations: - -- Currently PySocks does not support contacting remote websites via literal - IPv6 addresses. Any such connection attempt will fail. You must use a domain - name. -- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any - such connection attempt will fail. -""" -from __future__ import absolute_import - -try: - import socks -except ImportError: - import warnings - from ..exceptions import DependencyWarning - - warnings.warn(( - 'SOCKS support in urllib3 requires the installation of optional ' - 'dependencies: specifically, PySocks. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies' - ), - DependencyWarning - ) - raise - -from socket import error as SocketError, timeout as SocketTimeout - -from ..connection import ( - HTTPConnection, HTTPSConnection -) -from ..connectionpool import ( - HTTPConnectionPool, HTTPSConnectionPool -) -from ..exceptions import ConnectTimeoutError, NewConnectionError -from ..poolmanager import PoolManager -from ..util.url import parse_url - -try: - import ssl -except ImportError: - ssl = None - - -class SOCKSConnection(HTTPConnection): - """ - A plain-text HTTP connection that connects via a SOCKS proxy. - """ - def __init__(self, *args, **kwargs): - self._socks_options = kwargs.pop('_socks_options') - super(SOCKSConnection, self).__init__(*args, **kwargs) - - def _new_conn(self): - """ - Establish a new connection via the SOCKS proxy. - """ - extra_kw = {} - if self.source_address: - extra_kw['source_address'] = self.source_address - - if self.socket_options: - extra_kw['socket_options'] = self.socket_options - - try: - conn = socks.create_connection( - (self.host, self.port), - proxy_type=self._socks_options['socks_version'], - proxy_addr=self._socks_options['proxy_host'], - proxy_port=self._socks_options['proxy_port'], - proxy_username=self._socks_options['username'], - proxy_password=self._socks_options['password'], - proxy_rdns=self._socks_options['rdns'], - timeout=self.timeout, - **extra_kw - ) - - except SocketTimeout as e: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout)) - - except socks.ProxyError as e: - # This is fragile as hell, but it seems to be the only way to raise - # useful errors here. - if e.socket_err: - error = e.socket_err - if isinstance(error, SocketTimeout): - raise ConnectTimeoutError( - self, - "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout) - ) - else: - raise NewConnectionError( - self, - "Failed to establish a new connection: %s" % error - ) - else: - raise NewConnectionError( - self, - "Failed to establish a new connection: %s" % e - ) - - except SocketError as e: # Defensive: PySocks should catch all these. - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e) - - return conn - - -# We don't need to duplicate the Verified/Unverified distinction from -# urllib3/connection.py here because the HTTPSConnection will already have been -# correctly set to either the Verified or Unverified form by that module. This -# means the SOCKSHTTPSConnection will automatically be the correct type. -class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): - pass - - -class SOCKSHTTPConnectionPool(HTTPConnectionPool): - ConnectionCls = SOCKSConnection - - -class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): - ConnectionCls = SOCKSHTTPSConnection - - -class SOCKSProxyManager(PoolManager): - """ - A version of the urllib3 ProxyManager that routes connections via the - defined SOCKS proxy. - """ - pool_classes_by_scheme = { - 'http': SOCKSHTTPConnectionPool, - 'https': SOCKSHTTPSConnectionPool, - } - - def __init__(self, proxy_url, username=None, password=None, - num_pools=10, headers=None, **connection_pool_kw): - parsed = parse_url(proxy_url) - - if parsed.scheme == 'socks5': - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = False - elif parsed.scheme == 'socks5h': - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = True - elif parsed.scheme == 'socks4': - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = False - elif parsed.scheme == 'socks4a': - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = True - else: - raise ValueError( - "Unable to determine SOCKS version from %s" % proxy_url - ) - - self.proxy_url = proxy_url - - socks_options = { - 'socks_version': socks_version, - 'proxy_host': parsed.host, - 'proxy_port': parsed.port, - 'username': username, - 'password': password, - 'rdns': rdns - } - connection_pool_kw['_socks_options'] = socks_options - - super(SOCKSProxyManager, self).__init__( - num_pools, headers, **connection_pool_kw - ) - - self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/urllib3/exceptions.py b/urllib3/exceptions.py deleted file mode 100644 index 6c4be581..00000000 --- a/urllib3/exceptions.py +++ /dev/null @@ -1,246 +0,0 @@ -from __future__ import absolute_import -from .packages.six.moves.http_client import ( - IncompleteRead as httplib_IncompleteRead -) -# Base Exceptions - - -class HTTPError(Exception): - "Base exception used by this module." - pass - - -class HTTPWarning(Warning): - "Base warning used by this module." - pass - - -class PoolError(HTTPError): - "Base exception for errors caused within a pool." - def __init__(self, pool, message): - self.pool = pool - HTTPError.__init__(self, "%s: %s" % (pool, message)) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, None) - - -class RequestError(PoolError): - "Base exception for PoolErrors that have associated URLs." - def __init__(self, pool, url, message): - self.url = url - PoolError.__init__(self, pool, message) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, self.url, None) - - -class SSLError(HTTPError): - "Raised when SSL certificate fails in an HTTPS connection." - pass - - -class ProxyError(HTTPError): - "Raised when the connection to a proxy fails." - pass - - -class DecodeError(HTTPError): - "Raised when automatic decoding based on Content-Type fails." - pass - - -class ProtocolError(HTTPError): - "Raised when something unexpected happens mid-request/response." - pass - - -#: Renamed to ProtocolError but aliased for backwards compatibility. -ConnectionError = ProtocolError - - -# Leaf Exceptions - -class MaxRetryError(RequestError): - """Raised when the maximum number of retries is exceeded. - - :param pool: The connection pool - :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` - :param string url: The requested Url - :param exceptions.Exception reason: The underlying error - - """ - - def __init__(self, pool, url, reason=None): - self.reason = reason - - message = "Max retries exceeded with url: %s (Caused by %r)" % ( - url, reason) - - RequestError.__init__(self, pool, url, message) - - -class HostChangedError(RequestError): - "Raised when an existing pool gets a request for a foreign host." - - def __init__(self, pool, url, retries=3): - message = "Tried to open a foreign host with url: %s" % url - RequestError.__init__(self, pool, url, message) - self.retries = retries - - -class TimeoutStateError(HTTPError): - """ Raised when passing an invalid state to a timeout """ - pass - - -class TimeoutError(HTTPError): - """ Raised when a socket timeout error occurs. - - Catching this error will catch both :exc:`ReadTimeoutErrors - ` and :exc:`ConnectTimeoutErrors `. - """ - pass - - -class ReadTimeoutError(TimeoutError, RequestError): - "Raised when a socket timeout occurs while receiving data from a server" - pass - - -# This timeout error does not have a URL attached and needs to inherit from the -# base HTTPError -class ConnectTimeoutError(TimeoutError): - "Raised when a socket timeout occurs while connecting to a server" - pass - - -class NewConnectionError(ConnectTimeoutError, PoolError): - "Raised when we fail to establish a new connection. Usually ECONNREFUSED." - pass - - -class EmptyPoolError(PoolError): - "Raised when a pool runs out of connections and no more are allowed." - pass - - -class ClosedPoolError(PoolError): - "Raised when a request enters a pool after the pool has been closed." - pass - - -class LocationValueError(ValueError, HTTPError): - "Raised when there is something wrong with a given URL input." - pass - - -class LocationParseError(LocationValueError): - "Raised when get_host or similar fails to parse the URL input." - - def __init__(self, location): - message = "Failed to parse: %s" % location - HTTPError.__init__(self, message) - - self.location = location - - -class ResponseError(HTTPError): - "Used as a container for an error reason supplied in a MaxRetryError." - GENERIC_ERROR = 'too many error responses' - SPECIFIC_ERROR = 'too many {status_code} error responses' - - -class SecurityWarning(HTTPWarning): - "Warned when perfoming security reducing actions" - pass - - -class SubjectAltNameWarning(SecurityWarning): - "Warned when connecting to a host with a certificate missing a SAN." - pass - - -class InsecureRequestWarning(SecurityWarning): - "Warned when making an unverified HTTPS request." - pass - - -class SystemTimeWarning(SecurityWarning): - "Warned when system time is suspected to be wrong" - pass - - -class InsecurePlatformWarning(SecurityWarning): - "Warned when certain SSL configuration is not available on a platform." - pass - - -class SNIMissingWarning(HTTPWarning): - "Warned when making a HTTPS request without SNI available." - pass - - -class DependencyWarning(HTTPWarning): - """ - Warned when an attempt is made to import a module with missing optional - dependencies. - """ - pass - - -class ResponseNotChunked(ProtocolError, ValueError): - "Response needs to be chunked in order to read it as chunks." - pass - - -class BodyNotHttplibCompatible(HTTPError): - """ - Body should be httplib.HTTPResponse like (have an fp attribute which - returns raw chunks) for read_chunked(). - """ - pass - - -class IncompleteRead(HTTPError, httplib_IncompleteRead): - """ - Response length doesn't match expected Content-Length - - Subclass of http_client.IncompleteRead to allow int value - for `partial` to avoid creating large objects on streamed - reads. - """ - def __init__(self, partial, expected): - super(IncompleteRead, self).__init__(partial, expected) - - def __repr__(self): - return ('IncompleteRead(%i bytes read, ' - '%i more expected)' % (self.partial, self.expected)) - - -class InvalidHeader(HTTPError): - "The header provided was somehow invalid." - pass - - -class ProxySchemeUnknown(AssertionError, ValueError): - "ProxyManager does not support the supplied scheme" - # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. - - def __init__(self, scheme): - message = "Not supported proxy scheme %s" % scheme - super(ProxySchemeUnknown, self).__init__(message) - - -class HeaderParsingError(HTTPError): - "Raised by assert_header_parsing, but we convert it to a log.warning statement." - def __init__(self, defects, unparsed_data): - message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) - super(HeaderParsingError, self).__init__(message) - - -class UnrewindableBodyError(HTTPError): - "urllib3 encountered an error when trying to rewind a body" - pass diff --git a/urllib3/fields.py b/urllib3/fields.py deleted file mode 100644 index 19b0ae0c..00000000 --- a/urllib3/fields.py +++ /dev/null @@ -1,178 +0,0 @@ -from __future__ import absolute_import -import email.utils -import mimetypes - -from .packages import six - - -def guess_content_type(filename, default='application/octet-stream'): - """ - Guess the "Content-Type" of a file. - - :param filename: - The filename to guess the "Content-Type" of using :mod:`mimetypes`. - :param default: - If no "Content-Type" can be guessed, default to `default`. - """ - if filename: - return mimetypes.guess_type(filename)[0] or default - return default - - -def format_header_param(name, value): - """ - Helper function to format and quote a single header parameter. - - Particularly useful for header parameters which might contain - non-ASCII values, like file names. This follows RFC 2231, as - suggested by RFC 2388 Section 4.4. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as a unicode string. - """ - if not any(ch in value for ch in '"\\\r\n'): - result = '%s="%s"' % (name, value) - try: - result.encode('ascii') - except (UnicodeEncodeError, UnicodeDecodeError): - pass - else: - return result - if not six.PY3 and isinstance(value, six.text_type): # Python 2: - value = value.encode('utf-8') - value = email.utils.encode_rfc2231(value, 'utf-8') - value = '%s*=%s' % (name, value) - return value - - -class RequestField(object): - """ - A data container for request body parameters. - - :param name: - The name of this request field. - :param data: - The data/value body. - :param filename: - An optional filename of the request field. - :param headers: - An optional dict-like object of headers to initially use for the field. - """ - def __init__(self, name, data, filename=None, headers=None): - self._name = name - self._filename = filename - self.data = data - self.headers = {} - if headers: - self.headers = dict(headers) - - @classmethod - def from_tuples(cls, fieldname, value): - """ - A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. - - Supports constructing :class:`~urllib3.fields.RequestField` from - parameter of key/value strings AND key/filetuple. A filetuple is a - (filename, data, MIME type) tuple where the MIME type is optional. - For example:: - - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - - Field names and filenames must be unicode. - """ - if isinstance(value, tuple): - if len(value) == 3: - filename, data, content_type = value - else: - filename, data = value - content_type = guess_content_type(filename) - else: - filename = None - content_type = None - data = value - - request_param = cls(fieldname, data, filename=filename) - request_param.make_multipart(content_type=content_type) - - return request_param - - def _render_part(self, name, value): - """ - Overridable helper function to format a single header parameter. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as a unicode string. - """ - return format_header_param(name, value) - - def _render_parts(self, header_parts): - """ - Helper function to format and quote a single header. - - Useful for single headers that are composed of multiple items. E.g., - 'Content-Disposition' fields. - - :param header_parts: - A sequence of (k, v) typles or a :class:`dict` of (k, v) to format - as `k1="v1"; k2="v2"; ...`. - """ - parts = [] - iterable = header_parts - if isinstance(header_parts, dict): - iterable = header_parts.items() - - for name, value in iterable: - if value is not None: - parts.append(self._render_part(name, value)) - - return '; '.join(parts) - - def render_headers(self): - """ - Renders the headers for this request field. - """ - lines = [] - - sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] - for sort_key in sort_keys: - if self.headers.get(sort_key, False): - lines.append('%s: %s' % (sort_key, self.headers[sort_key])) - - for header_name, header_value in self.headers.items(): - if header_name not in sort_keys: - if header_value: - lines.append('%s: %s' % (header_name, header_value)) - - lines.append('\r\n') - return '\r\n'.join(lines) - - def make_multipart(self, content_disposition=None, content_type=None, - content_location=None): - """ - Makes this request field into a multipart request field. - - This method overrides "Content-Disposition", "Content-Type" and - "Content-Location" headers to the request parameter. - - :param content_type: - The 'Content-Type' of the request body. - :param content_location: - The 'Content-Location' of the request body. - - """ - self.headers['Content-Disposition'] = content_disposition or 'form-data' - self.headers['Content-Disposition'] += '; '.join([ - '', self._render_parts( - (('name', self._name), ('filename', self._filename)) - ) - ]) - self.headers['Content-Type'] = content_type - self.headers['Content-Location'] = content_location diff --git a/urllib3/filepost.py b/urllib3/filepost.py deleted file mode 100644 index cd11cee4..00000000 --- a/urllib3/filepost.py +++ /dev/null @@ -1,94 +0,0 @@ -from __future__ import absolute_import -import codecs - -from uuid import uuid4 -from io import BytesIO - -from .packages import six -from .packages.six import b -from .fields import RequestField - -writer = codecs.lookup('utf-8')[3] - - -def choose_boundary(): - """ - Our embarrassingly-simple replacement for mimetools.choose_boundary. - """ - return uuid4().hex - - -def iter_field_objects(fields): - """ - Iterate over fields. - - Supports list of (k, v) tuples and dicts, and lists of - :class:`~urllib3.fields.RequestField`. - - """ - if isinstance(fields, dict): - i = six.iteritems(fields) - else: - i = iter(fields) - - for field in i: - if isinstance(field, RequestField): - yield field - else: - yield RequestField.from_tuples(*field) - - -def iter_fields(fields): - """ - .. deprecated:: 1.6 - - Iterate over fields. - - The addition of :class:`~urllib3.fields.RequestField` makes this function - obsolete. Instead, use :func:`iter_field_objects`, which returns - :class:`~urllib3.fields.RequestField` objects. - - Supports list of (k, v) tuples and dicts. - """ - if isinstance(fields, dict): - return ((k, v) for k, v in six.iteritems(fields)) - - return ((k, v) for k, v in fields) - - -def encode_multipart_formdata(fields, boundary=None): - """ - Encode a dictionary of ``fields`` using the multipart/form-data MIME format. - - :param fields: - Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). - - :param boundary: - If not specified, then a random boundary will be generated using - :func:`mimetools.choose_boundary`. - """ - body = BytesIO() - if boundary is None: - boundary = choose_boundary() - - for field in iter_field_objects(fields): - body.write(b('--%s\r\n' % (boundary))) - - writer(body).write(field.render_headers()) - data = field.data - - if isinstance(data, int): - data = str(data) # Backwards compatibility - - if isinstance(data, six.text_type): - writer(body).write(data) - else: - body.write(data) - - body.write(b'\r\n') - - body.write(b('--%s--\r\n' % (boundary))) - - content_type = str('multipart/form-data; boundary=%s' % boundary) - - return body.getvalue(), content_type diff --git a/urllib3/packages/__init__.py b/urllib3/packages/__init__.py deleted file mode 100644 index 170e974c..00000000 --- a/urllib3/packages/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import absolute_import - -from . import ssl_match_hostname - -__all__ = ('ssl_match_hostname', ) diff --git a/urllib3/packages/backports/__init__.py b/urllib3/packages/backports/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/urllib3/packages/backports/makefile.py b/urllib3/packages/backports/makefile.py deleted file mode 100644 index 75b80dcf..00000000 --- a/urllib3/packages/backports/makefile.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -""" -backports.makefile -~~~~~~~~~~~~~~~~~~ - -Backports the Python 3 ``socket.makefile`` method for use with anything that -wants to create a "fake" socket object. -""" -import io - -from socket import SocketIO - - -def backport_makefile(self, mode="r", buffering=None, encoding=None, - errors=None, newline=None): - """ - Backport of ``socket.makefile`` from Python 3.5. - """ - if not set(mode) <= set(["r", "w", "b"]): - raise ValueError( - "invalid mode %r (only r, w, b allowed)" % (mode,) - ) - writing = "w" in mode - reading = "r" in mode or not writing - assert reading or writing - binary = "b" in mode - rawmode = "" - if reading: - rawmode += "r" - if writing: - rawmode += "w" - raw = SocketIO(self, rawmode) - self._makefile_refs += 1 - if buffering is None: - buffering = -1 - if buffering < 0: - buffering = io.DEFAULT_BUFFER_SIZE - if buffering == 0: - if not binary: - raise ValueError("unbuffered streams must be binary") - return raw - if reading and writing: - buffer = io.BufferedRWPair(raw, raw, buffering) - elif reading: - buffer = io.BufferedReader(raw, buffering) - else: - assert writing - buffer = io.BufferedWriter(raw, buffering) - if binary: - return buffer - text = io.TextIOWrapper(buffer, encoding, errors, newline) - text.mode = mode - return text diff --git a/urllib3/packages/ordered_dict.py b/urllib3/packages/ordered_dict.py deleted file mode 100644 index 4479363c..00000000 --- a/urllib3/packages/ordered_dict.py +++ /dev/null @@ -1,259 +0,0 @@ -# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. -# Passes Python2.7's test suite and incorporates all the latest updates. -# Copyright 2009 Raymond Hettinger, released under the MIT License. -# http://code.activestate.com/recipes/576693/ -try: - from thread import get_ident as _get_ident -except ImportError: - from dummy_thread import get_ident as _get_ident - -try: - from _abcoll import KeysView, ValuesView, ItemsView -except ImportError: - pass - - -class OrderedDict(dict): - 'Dictionary that remembers insertion order' - # An inherited dict maps keys to values. - # The inherited dict provides __getitem__, __len__, __contains__, and get. - # The remaining methods are order-aware. - # Big-O running times for all methods are the same as for regular dictionaries. - - # The internal self.__map dictionary maps keys to links in a doubly linked list. - # The circular doubly linked list starts and ends with a sentinel element. - # The sentinel element never gets deleted (this simplifies the algorithm). - # Each link is stored as a list of length three: [PREV, NEXT, KEY]. - - def __init__(self, *args, **kwds): - '''Initialize an ordered dictionary. Signature is the same as for - regular dictionaries, but keyword arguments are not recommended - because their insertion order is arbitrary. - - ''' - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - try: - self.__root - except AttributeError: - self.__root = root = [] # sentinel node - root[:] = [root, root, None] - self.__map = {} - self.__update(*args, **kwds) - - def __setitem__(self, key, value, dict_setitem=dict.__setitem__): - 'od.__setitem__(i, y) <==> od[i]=y' - # Setting a new item creates a new link which goes at the end of the linked - # list, and the inherited dictionary is updated with the new key/value pair. - if key not in self: - root = self.__root - last = root[0] - last[1] = root[0] = self.__map[key] = [last, root, key] - dict_setitem(self, key, value) - - def __delitem__(self, key, dict_delitem=dict.__delitem__): - 'od.__delitem__(y) <==> del od[y]' - # Deleting an existing item uses self.__map to find the link which is - # then removed by updating the links in the predecessor and successor nodes. - dict_delitem(self, key) - link_prev, link_next, key = self.__map.pop(key) - link_prev[1] = link_next - link_next[0] = link_prev - - def __iter__(self): - 'od.__iter__() <==> iter(od)' - root = self.__root - curr = root[1] - while curr is not root: - yield curr[2] - curr = curr[1] - - def __reversed__(self): - 'od.__reversed__() <==> reversed(od)' - root = self.__root - curr = root[0] - while curr is not root: - yield curr[2] - curr = curr[0] - - def clear(self): - 'od.clear() -> None. Remove all items from od.' - try: - for node in self.__map.itervalues(): - del node[:] - root = self.__root - root[:] = [root, root, None] - self.__map.clear() - except AttributeError: - pass - dict.clear(self) - - def popitem(self, last=True): - '''od.popitem() -> (k, v), return and remove a (key, value) pair. - Pairs are returned in LIFO order if last is true or FIFO order if false. - - ''' - if not self: - raise KeyError('dictionary is empty') - root = self.__root - if last: - link = root[0] - link_prev = link[0] - link_prev[1] = root - root[0] = link_prev - else: - link = root[1] - link_next = link[1] - root[1] = link_next - link_next[0] = root - key = link[2] - del self.__map[key] - value = dict.pop(self, key) - return key, value - - # -- the following methods do not depend on the internal structure -- - - def keys(self): - 'od.keys() -> list of keys in od' - return list(self) - - def values(self): - 'od.values() -> list of values in od' - return [self[key] for key in self] - - def items(self): - 'od.items() -> list of (key, value) pairs in od' - return [(key, self[key]) for key in self] - - def iterkeys(self): - 'od.iterkeys() -> an iterator over the keys in od' - return iter(self) - - def itervalues(self): - 'od.itervalues -> an iterator over the values in od' - for k in self: - yield self[k] - - def iteritems(self): - 'od.iteritems -> an iterator over the (key, value) items in od' - for k in self: - yield (k, self[k]) - - def update(*args, **kwds): - '''od.update(E, **F) -> None. Update od from dict/iterable E and F. - - If E is a dict instance, does: for k in E: od[k] = E[k] - If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] - Or if E is an iterable of items, does: for k, v in E: od[k] = v - In either case, this is followed by: for k, v in F.items(): od[k] = v - - ''' - if len(args) > 2: - raise TypeError('update() takes at most 2 positional ' - 'arguments (%d given)' % (len(args),)) - elif not args: - raise TypeError('update() takes at least 1 argument (0 given)') - self = args[0] - # Make progressively weaker assumptions about "other" - other = () - if len(args) == 2: - other = args[1] - if isinstance(other, dict): - for key in other: - self[key] = other[key] - elif hasattr(other, 'keys'): - for key in other.keys(): - self[key] = other[key] - else: - for key, value in other: - self[key] = value - for key, value in kwds.items(): - self[key] = value - - __update = update # let subclasses override update without breaking __init__ - - __marker = object() - - def pop(self, key, default=__marker): - '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - - ''' - if key in self: - result = self[key] - del self[key] - return result - if default is self.__marker: - raise KeyError(key) - return default - - def setdefault(self, key, default=None): - 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' - if key in self: - return self[key] - self[key] = default - return default - - def __repr__(self, _repr_running={}): - 'od.__repr__() <==> repr(od)' - call_key = id(self), _get_ident() - if call_key in _repr_running: - return '...' - _repr_running[call_key] = 1 - try: - if not self: - return '%s()' % (self.__class__.__name__,) - return '%s(%r)' % (self.__class__.__name__, self.items()) - finally: - del _repr_running[call_key] - - def __reduce__(self): - 'Return state information for pickling' - items = [[k, self[k]] for k in self] - inst_dict = vars(self).copy() - for k in vars(OrderedDict()): - inst_dict.pop(k, None) - if inst_dict: - return (self.__class__, (items,), inst_dict) - return self.__class__, (items,) - - def copy(self): - 'od.copy() -> a shallow copy of od' - return self.__class__(self) - - @classmethod - def fromkeys(cls, iterable, value=None): - '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S - and values equal to v (which defaults to None). - - ''' - d = cls() - for key in iterable: - d[key] = value - return d - - def __eq__(self, other): - '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive - while comparison to a regular mapping is order-insensitive. - - ''' - if isinstance(other, OrderedDict): - return len(self)==len(other) and self.items() == other.items() - return dict.__eq__(self, other) - - def __ne__(self, other): - return not self == other - - # -- the following methods are only used in Python 2.7 -- - - def viewkeys(self): - "od.viewkeys() -> a set-like object providing a view on od's keys" - return KeysView(self) - - def viewvalues(self): - "od.viewvalues() -> an object providing a view on od's values" - return ValuesView(self) - - def viewitems(self): - "od.viewitems() -> a set-like object providing a view on od's items" - return ItemsView(self) diff --git a/urllib3/packages/six.py b/urllib3/packages/six.py deleted file mode 100644 index 190c0239..00000000 --- a/urllib3/packages/six.py +++ /dev/null @@ -1,868 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2015 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson " -__version__ = "1.10.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - unichr = chr - import struct - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" -else: - def b(s): - return s - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - - -if sys.version_info[:2] == (3, 2): - exec_("""def raise_from(value, from_value): - if from_value is None: - raise value - raise value from from_value -""") -elif sys.version_info[:2] > (3, 2): - exec_("""def raise_from(value, from_value): - raise value from from_value -""") -else: - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - def wrapper(f): - f = functools.wraps(wrapped, assigned, updated)(f) - f.__wrapped__ = wrapped - return f - return wrapper -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def python_2_unicode_compatible(klass): - """ - A decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if '__str__' not in klass.__dict__: - raise ValueError("@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % - klass.__name__) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode('utf-8') - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/urllib3/packages/ssl_match_hostname/__init__.py b/urllib3/packages/ssl_match_hostname/__init__.py deleted file mode 100644 index d6594eb2..00000000 --- a/urllib3/packages/ssl_match_hostname/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -import sys - -try: - # Our match_hostname function is the same as 3.5's, so we only want to - # import the match_hostname function if it's at least that good. - if sys.version_info < (3, 5): - raise ImportError("Fallback to vendored code") - - from ssl import CertificateError, match_hostname -except ImportError: - try: - # Backport of the function from a pypi module - from backports.ssl_match_hostname import CertificateError, match_hostname - except ImportError: - # Our vendored copy - from ._implementation import CertificateError, match_hostname - -# Not needed, but documenting what we provide. -__all__ = ('CertificateError', 'match_hostname') diff --git a/urllib3/packages/ssl_match_hostname/_implementation.py b/urllib3/packages/ssl_match_hostname/_implementation.py deleted file mode 100644 index 1fd42f38..00000000 --- a/urllib3/packages/ssl_match_hostname/_implementation.py +++ /dev/null @@ -1,157 +0,0 @@ -"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" - -# Note: This file is under the PSF license as the code comes from the python -# stdlib. http://docs.python.org/3/license.html - -import re -import sys - -# ipaddress has been backported to 2.6+ in pypi. If it is installed on the -# system, use it to handle IPAddress ServerAltnames (this was added in -# python-3.5) otherwise only do DNS matching. This allows -# backports.ssl_match_hostname to continue to be used all the way back to -# python-2.4. -try: - import ipaddress -except ImportError: - ipaddress = None - -__version__ = '3.5.0.1' - - -class CertificateError(ValueError): - pass - - -def _dnsname_match(dn, hostname, max_wildcards=1): - """Matching according to RFC 6125, section 6.4.3 - - http://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - # Ported from python3-syntax: - # leftmost, *remainder = dn.split(r'.') - parts = dn.split(r'.') - leftmost = parts[0] - remainder = parts[1:] - - wildcards = leftmost.count('*') - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - elif leftmost.startswith('xn--') or hostname.startswith('xn--'): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - return pat.match(hostname) - - -def _to_unicode(obj): - if isinstance(obj, str) and sys.version_info < (3,): - obj = unicode(obj, encoding='ascii', errors='strict') - return obj - -def _ipaddress_match(ipname, host_ip): - """Exact matching of IP addresses. - - RFC 6125 explicitly doesn't define an algorithm for this - (section 1.7.2 - "Out of Scope"). - """ - # OpenSSL may add a trailing newline to a subjectAltName's IP address - # Divergence from upstream: ipaddress can't handle byte str - ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) - return ip == host_ip - - -def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate, match_hostname needs a " - "SSL socket or SSL context with either " - "CERT_OPTIONAL or CERT_REQUIRED") - try: - # Divergence from upstream: ipaddress can't handle byte str - host_ip = ipaddress.ip_address(_to_unicode(hostname)) - except ValueError: - # Not an IP address (common case) - host_ip = None - except UnicodeError: - # Divergence from upstream: Have to deal with ipaddress not taking - # byte strings. addresses should be all ascii, so we consider it not - # an ipaddress in this case - host_ip = None - except AttributeError: - # Divergence from upstream: Make ipaddress library optional - if ipaddress is None: - host_ip = None - else: - raise - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if host_ip is None and _dnsname_match(value, hostname): - return - dnsnames.append(value) - elif key == 'IP Address': - if host_ip is not None and _ipaddress_match(value, host_ip): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") diff --git a/urllib3/poolmanager.py b/urllib3/poolmanager.py deleted file mode 100644 index 4ae91744..00000000 --- a/urllib3/poolmanager.py +++ /dev/null @@ -1,440 +0,0 @@ -from __future__ import absolute_import -import collections -import functools -import logging - -from ._collections import RecentlyUsedContainer -from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool -from .connectionpool import port_by_scheme -from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown -from .packages.six.moves.urllib.parse import urljoin -from .request import RequestMethods -from .util.url import parse_url -from .util.retry import Retry - - -__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] - - -log = logging.getLogger(__name__) - -SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', - 'ssl_version', 'ca_cert_dir', 'ssl_context') - -# All known keyword arguments that could be provided to the pool manager, its -# pools, or the underlying connections. This is used to construct a pool key. -_key_fields = ( - 'key_scheme', # str - 'key_host', # str - 'key_port', # int - 'key_timeout', # int or float or Timeout - 'key_retries', # int or Retry - 'key_strict', # bool - 'key_block', # bool - 'key_source_address', # str - 'key_key_file', # str - 'key_cert_file', # str - 'key_cert_reqs', # str - 'key_ca_certs', # str - 'key_ssl_version', # str - 'key_ca_cert_dir', # str - 'key_ssl_context', # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext - 'key_maxsize', # int - 'key_headers', # dict - 'key__proxy', # parsed proxy url - 'key__proxy_headers', # dict - 'key_socket_options', # list of (level (int), optname (int), value (int or str)) tuples - 'key__socks_options', # dict - 'key_assert_hostname', # bool or string - 'key_assert_fingerprint', # str -) - -#: The namedtuple class used to construct keys for the connection pool. -#: All custom key schemes should include the fields in this key at a minimum. -PoolKey = collections.namedtuple('PoolKey', _key_fields) - - -def _default_key_normalizer(key_class, request_context): - """ - Create a pool key out of a request context dictionary. - - According to RFC 3986, both the scheme and host are case-insensitive. - Therefore, this function normalizes both before constructing the pool - key for an HTTPS request. If you wish to change this behaviour, provide - alternate callables to ``key_fn_by_scheme``. - - :param key_class: - The class to use when constructing the key. This should be a namedtuple - with the ``scheme`` and ``host`` keys at a minimum. - :type key_class: namedtuple - :param request_context: - A dictionary-like object that contain the context for a request. - :type request_context: dict - - :return: A namedtuple that can be used as a connection pool key. - :rtype: PoolKey - """ - # Since we mutate the dictionary, make a copy first - context = request_context.copy() - context['scheme'] = context['scheme'].lower() - context['host'] = context['host'].lower() - - # These are both dictionaries and need to be transformed into frozensets - for key in ('headers', '_proxy_headers', '_socks_options'): - if key in context and context[key] is not None: - context[key] = frozenset(context[key].items()) - - # The socket_options key may be a list and needs to be transformed into a - # tuple. - socket_opts = context.get('socket_options') - if socket_opts is not None: - context['socket_options'] = tuple(socket_opts) - - # Map the kwargs to the names in the namedtuple - this is necessary since - # namedtuples can't have fields starting with '_'. - for key in list(context.keys()): - context['key_' + key] = context.pop(key) - - # Default to ``None`` for keys missing from the context - for field in key_class._fields: - if field not in context: - context[field] = None - - return key_class(**context) - - -#: A dictionary that maps a scheme to a callable that creates a pool key. -#: This can be used to alter the way pool keys are constructed, if desired. -#: Each PoolManager makes a copy of this dictionary so they can be configured -#: globally here, or individually on the instance. -key_fn_by_scheme = { - 'http': functools.partial(_default_key_normalizer, PoolKey), - 'https': functools.partial(_default_key_normalizer, PoolKey), -} - -pool_classes_by_scheme = { - 'http': HTTPConnectionPool, - 'https': HTTPSConnectionPool, -} - - -class PoolManager(RequestMethods): - """ - Allows for arbitrary requests while transparently keeping track of - necessary connection pools for you. - - :param num_pools: - Number of connection pools to cache before discarding the least - recently used pool. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param \\**connection_pool_kw: - Additional parameters are used to create fresh - :class:`urllib3.connectionpool.ConnectionPool` instances. - - Example:: - - >>> manager = PoolManager(num_pools=2) - >>> r = manager.request('GET', 'http://google.com/') - >>> r = manager.request('GET', 'http://google.com/mail') - >>> r = manager.request('GET', 'http://yahoo.com/') - >>> len(manager.pools) - 2 - - """ - - proxy = None - - def __init__(self, num_pools=10, headers=None, **connection_pool_kw): - RequestMethods.__init__(self, headers) - self.connection_pool_kw = connection_pool_kw - self.pools = RecentlyUsedContainer(num_pools, - dispose_func=lambda p: p.close()) - - # Locally set the pool classes and keys so other PoolManagers can - # override them. - self.pool_classes_by_scheme = pool_classes_by_scheme - self.key_fn_by_scheme = key_fn_by_scheme.copy() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.clear() - # Return False to re-raise any potential exceptions - return False - - def _new_pool(self, scheme, host, port, request_context=None): - """ - Create a new :class:`ConnectionPool` based on host, port, scheme, and - any additional pool keyword arguments. - - If ``request_context`` is provided, it is provided as keyword arguments - to the pool class used. This method is used to actually create the - connection pools handed out by :meth:`connection_from_url` and - companion methods. It is intended to be overridden for customization. - """ - pool_cls = self.pool_classes_by_scheme[scheme] - if request_context is None: - request_context = self.connection_pool_kw.copy() - - # Although the context has everything necessary to create the pool, - # this function has historically only used the scheme, host, and port - # in the positional args. When an API change is acceptable these can - # be removed. - for key in ('scheme', 'host', 'port'): - request_context.pop(key, None) - - if scheme == 'http': - for kw in SSL_KEYWORDS: - request_context.pop(kw, None) - - return pool_cls(host, port, **request_context) - - def clear(self): - """ - Empty our store of pools and direct them all to close. - - This will not affect in-flight connections, but they will not be - re-used after completion. - """ - self.pools.clear() - - def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): - """ - Get a :class:`ConnectionPool` based on the host, port, and scheme. - - If ``port`` isn't given, it will be derived from the ``scheme`` using - ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is - provided, it is merged with the instance's ``connection_pool_kw`` - variable and used to create the new connection pool, if one is - needed. - """ - - if not host: - raise LocationValueError("No host specified.") - - request_context = self._merge_pool_kwargs(pool_kwargs) - request_context['scheme'] = scheme or 'http' - if not port: - port = port_by_scheme.get(request_context['scheme'].lower(), 80) - request_context['port'] = port - request_context['host'] = host - - return self.connection_from_context(request_context) - - def connection_from_context(self, request_context): - """ - Get a :class:`ConnectionPool` based on the request context. - - ``request_context`` must at least contain the ``scheme`` key and its - value must be a key in ``key_fn_by_scheme`` instance variable. - """ - scheme = request_context['scheme'].lower() - pool_key_constructor = self.key_fn_by_scheme[scheme] - pool_key = pool_key_constructor(request_context) - - return self.connection_from_pool_key(pool_key, request_context=request_context) - - def connection_from_pool_key(self, pool_key, request_context=None): - """ - Get a :class:`ConnectionPool` based on the provided pool key. - - ``pool_key`` should be a namedtuple that only contains immutable - objects. At a minimum it must have the ``scheme``, ``host``, and - ``port`` fields. - """ - with self.pools.lock: - # If the scheme, host, or port doesn't match existing open - # connections, open a new ConnectionPool. - pool = self.pools.get(pool_key) - if pool: - return pool - - # Make a fresh ConnectionPool of the desired type - scheme = request_context['scheme'] - host = request_context['host'] - port = request_context['port'] - pool = self._new_pool(scheme, host, port, request_context=request_context) - self.pools[pool_key] = pool - - return pool - - def connection_from_url(self, url, pool_kwargs=None): - """ - Similar to :func:`urllib3.connectionpool.connection_from_url`. - - If ``pool_kwargs`` is not provided and a new pool needs to be - constructed, ``self.connection_pool_kw`` is used to initialize - the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` - is provided, it is used instead. Note that if a new pool does not - need to be created for the request, the provided ``pool_kwargs`` are - not used. - """ - u = parse_url(url) - return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, - pool_kwargs=pool_kwargs) - - def _merge_pool_kwargs(self, override): - """ - Merge a dictionary of override values for self.connection_pool_kw. - - This does not modify self.connection_pool_kw and returns a new dict. - Any keys in the override dictionary with a value of ``None`` are - removed from the merged dictionary. - """ - base_pool_kwargs = self.connection_pool_kw.copy() - if override: - for key, value in override.items(): - if value is None: - try: - del base_pool_kwargs[key] - except KeyError: - pass - else: - base_pool_kwargs[key] = value - return base_pool_kwargs - - def urlopen(self, method, url, redirect=True, **kw): - """ - Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` - with custom cross-host redirect logic and only sends the request-uri - portion of the ``url``. - - The given ``url`` parameter must be absolute, such that an appropriate - :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. - """ - u = parse_url(url) - conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) - - kw['assert_same_host'] = False - kw['redirect'] = False - if 'headers' not in kw: - kw['headers'] = self.headers - - if self.proxy is not None and u.scheme == "http": - response = conn.urlopen(method, url, **kw) - else: - response = conn.urlopen(method, u.request_uri, **kw) - - redirect_location = redirect and response.get_redirect_location() - if not redirect_location: - return response - - # Support relative URLs for redirecting. - redirect_location = urljoin(url, redirect_location) - - # RFC 7231, Section 6.4.4 - if response.status == 303: - method = 'GET' - - retries = kw.get('retries') - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect) - - try: - retries = retries.increment(method, url, response=response, _pool=conn) - except MaxRetryError: - if retries.raise_on_redirect: - raise - return response - - kw['retries'] = retries - kw['redirect'] = redirect - - log.info("Redirecting %s -> %s", url, redirect_location) - return self.urlopen(method, redirect_location, **kw) - - -class ProxyManager(PoolManager): - """ - Behaves just like :class:`PoolManager`, but sends all requests through - the defined proxy, using the CONNECT method for HTTPS URLs. - - :param proxy_url: - The URL of the proxy to be used. - - :param proxy_headers: - A dictionary contaning headers that will be sent to the proxy. In case - of HTTP they are being sent with each request, while in the - HTTPS/CONNECT case they are sent only once. Could be used for proxy - authentication. - - Example: - >>> proxy = urllib3.ProxyManager('http://localhost:3128/') - >>> r1 = proxy.request('GET', 'http://google.com/') - >>> r2 = proxy.request('GET', 'http://httpbin.org/') - >>> len(proxy.pools) - 1 - >>> r3 = proxy.request('GET', 'https://httpbin.org/') - >>> r4 = proxy.request('GET', 'https://twitter.com/') - >>> len(proxy.pools) - 3 - - """ - - def __init__(self, proxy_url, num_pools=10, headers=None, - proxy_headers=None, **connection_pool_kw): - - if isinstance(proxy_url, HTTPConnectionPool): - proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, - proxy_url.port) - proxy = parse_url(proxy_url) - if not proxy.port: - port = port_by_scheme.get(proxy.scheme, 80) - proxy = proxy._replace(port=port) - - if proxy.scheme not in ("http", "https"): - raise ProxySchemeUnknown(proxy.scheme) - - self.proxy = proxy - self.proxy_headers = proxy_headers or {} - - connection_pool_kw['_proxy'] = self.proxy - connection_pool_kw['_proxy_headers'] = self.proxy_headers - - super(ProxyManager, self).__init__( - num_pools, headers, **connection_pool_kw) - - def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): - if scheme == "https": - return super(ProxyManager, self).connection_from_host( - host, port, scheme, pool_kwargs=pool_kwargs) - - return super(ProxyManager, self).connection_from_host( - self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) - - def _set_proxy_headers(self, url, headers=None): - """ - Sets headers needed by proxies: specifically, the Accept and Host - headers. Only sets headers not provided by the user. - """ - headers_ = {'Accept': '*/*'} - - netloc = parse_url(url).netloc - if netloc: - headers_['Host'] = netloc - - if headers: - headers_.update(headers) - return headers_ - - def urlopen(self, method, url, redirect=True, **kw): - "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." - u = parse_url(url) - - if u.scheme == "http": - # For proxied HTTPS requests, httplib sets the necessary headers - # on the CONNECT to the proxy. For HTTP, we'll definitely - # need to set 'Host' at the very least. - headers = kw.get('headers', self.headers) - kw['headers'] = self._set_proxy_headers(url, headers) - - return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) - - -def proxy_from_url(url, **kw): - return ProxyManager(proxy_url=url, **kw) diff --git a/urllib3/request.py b/urllib3/request.py deleted file mode 100644 index c0fddff0..00000000 --- a/urllib3/request.py +++ /dev/null @@ -1,148 +0,0 @@ -from __future__ import absolute_import - -from .filepost import encode_multipart_formdata -from .packages.six.moves.urllib.parse import urlencode - - -__all__ = ['RequestMethods'] - - -class RequestMethods(object): - """ - Convenience mixin for classes who implement a :meth:`urlopen` method, such - as :class:`~urllib3.connectionpool.HTTPConnectionPool` and - :class:`~urllib3.poolmanager.PoolManager`. - - Provides behavior for making common types of HTTP request methods and - decides which type of request field encoding to use. - - Specifically, - - :meth:`.request_encode_url` is for sending requests whose fields are - encoded in the URL (such as GET, HEAD, DELETE). - - :meth:`.request_encode_body` is for sending requests whose fields are - encoded in the *body* of the request using multipart or www-form-urlencoded - (such as for POST, PUT, PATCH). - - :meth:`.request` is for making any kind of request, it will look up the - appropriate encoding format and use one of the above two methods to make - the request. - - Initializer parameters: - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - """ - - _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS']) - - def __init__(self, headers=None): - self.headers = headers or {} - - def urlopen(self, method, url, body=None, headers=None, - encode_multipart=True, multipart_boundary=None, - **kw): # Abstract - raise NotImplemented("Classes extending RequestMethods must implement " - "their own ``urlopen`` method.") - - def request(self, method, url, fields=None, headers=None, **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the appropriate encoding of - ``fields`` based on the ``method`` used. - - This is a convenience method that requires the least amount of manual - effort. It can be used in most situations, while still having the - option to drop down to more specific methods when necessary, such as - :meth:`request_encode_url`, :meth:`request_encode_body`, - or even the lowest level :meth:`urlopen`. - """ - method = method.upper() - - if method in self._encode_url_methods: - return self.request_encode_url(method, url, fields=fields, - headers=headers, - **urlopen_kw) - else: - return self.request_encode_body(method, url, fields=fields, - headers=headers, - **urlopen_kw) - - def request_encode_url(self, method, url, fields=None, headers=None, - **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the url. This is useful for request methods like GET, HEAD, DELETE, etc. - """ - if headers is None: - headers = self.headers - - extra_kw = {'headers': headers} - extra_kw.update(urlopen_kw) - - if fields: - url += '?' + urlencode(fields) - - return self.urlopen(method, url, **extra_kw) - - def request_encode_body(self, method, url, fields=None, headers=None, - encode_multipart=True, multipart_boundary=None, - **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the body. This is useful for request methods like POST, PUT, PATCH, etc. - - When ``encode_multipart=True`` (default), then - :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode - the payload with the appropriate content type. Otherwise - :meth:`urllib.urlencode` is used with the - 'application/x-www-form-urlencoded' content type. - - Multipart encoding must be used when posting files, and it's reasonably - safe to use it in other times too. However, it may break request - signing, such as with OAuth. - - Supports an optional ``fields`` parameter of key/value strings AND - key/filetuple. A filetuple is a (filename, data, MIME type) tuple where - the MIME type is optional. For example:: - - fields = { - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), - 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - } - - When uploading a file, providing a filename (the first parameter of the - tuple) is optional but recommended to best mimick behavior of browsers. - - Note that if ``headers`` are supplied, the 'Content-Type' header will - be overwritten because it depends on the dynamic random boundary string - which is used to compose the body of the request. The random boundary - string can be explicitly set with the ``multipart_boundary`` parameter. - """ - if headers is None: - headers = self.headers - - extra_kw = {'headers': {}} - - if fields: - if 'body' in urlopen_kw: - raise TypeError( - "request got values for both 'fields' and 'body', can only specify one.") - - if encode_multipart: - body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) - else: - body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' - - extra_kw['body'] = body - extra_kw['headers'] = {'Content-Type': content_type} - - extra_kw['headers'].update(headers) - extra_kw.update(urlopen_kw) - - return self.urlopen(method, url, **extra_kw) diff --git a/urllib3/response.py b/urllib3/response.py deleted file mode 100644 index d3e5a1e6..00000000 --- a/urllib3/response.py +++ /dev/null @@ -1,626 +0,0 @@ -from __future__ import absolute_import -from contextlib import contextmanager -import zlib -import io -import logging -from socket import timeout as SocketTimeout -from socket import error as SocketError - -from ._collections import HTTPHeaderDict -from .exceptions import ( - BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, - ResponseNotChunked, IncompleteRead, InvalidHeader -) -from .packages.six import string_types as basestring, binary_type, PY3 -from .packages.six.moves import http_client as httplib -from .connection import HTTPException, BaseSSLError -from .util.response import is_fp_closed, is_response_to_head - -log = logging.getLogger(__name__) - - -class DeflateDecoder(object): - - def __init__(self): - self._first_try = True - self._data = binary_type() - self._obj = zlib.decompressobj() - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - if not data: - return data - - if not self._first_try: - return self._obj.decompress(data) - - self._data += data - try: - decompressed = self._obj.decompress(data) - if decompressed: - self._first_try = False - self._data = None - return decompressed - except zlib.error: - self._first_try = False - self._obj = zlib.decompressobj(-zlib.MAX_WBITS) - try: - return self.decompress(self._data) - finally: - self._data = None - - -class GzipDecoder(object): - - def __init__(self): - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - if not data: - return data - return self._obj.decompress(data) - - -def _get_decoder(mode): - if mode == 'gzip': - return GzipDecoder() - - return DeflateDecoder() - - -class HTTPResponse(io.IOBase): - """ - HTTP Response container. - - Backwards-compatible to httplib's HTTPResponse but the response ``body`` is - loaded and decoded on-demand when the ``data`` property is accessed. This - class is also compatible with the Python standard library's :mod:`io` - module, and can hence be treated as a readable object in the context of that - framework. - - Extra parameters for behaviour not present in httplib.HTTPResponse: - - :param preload_content: - If True, the response's body will be preloaded during construction. - - :param decode_content: - If True, attempts to decode specific content-encoding's based on headers - (like 'gzip' and 'deflate') will be skipped and raw data will be used - instead. - - :param original_response: - When this HTTPResponse wrapper is generated from an httplib.HTTPResponse - object, it's convenient to include the original for debug purposes. It's - otherwise unused. - - :param retries: - The retries contains the last :class:`~urllib3.util.retry.Retry` that - was used during the request. - - :param enforce_content_length: - Enforce content length checking. Body returned by server must match - value of Content-Length header, if present. Otherwise, raise error. - """ - - CONTENT_DECODERS = ['gzip', 'deflate'] - REDIRECT_STATUSES = [301, 302, 303, 307, 308] - - def __init__(self, body='', headers=None, status=0, version=0, reason=None, - strict=0, preload_content=True, decode_content=True, - original_response=None, pool=None, connection=None, - retries=None, enforce_content_length=False, request_method=None): - - if isinstance(headers, HTTPHeaderDict): - self.headers = headers - else: - self.headers = HTTPHeaderDict(headers) - self.status = status - self.version = version - self.reason = reason - self.strict = strict - self.decode_content = decode_content - self.retries = retries - self.enforce_content_length = enforce_content_length - - self._decoder = None - self._body = None - self._fp = None - self._original_response = original_response - self._fp_bytes_read = 0 - - if body and isinstance(body, (basestring, binary_type)): - self._body = body - - self._pool = pool - self._connection = connection - - if hasattr(body, 'read'): - self._fp = body - - # Are we using the chunked-style of transfer encoding? - self.chunked = False - self.chunk_left = None - tr_enc = self.headers.get('transfer-encoding', '').lower() - # Don't incur the penalty of creating a list and then discarding it - encodings = (enc.strip() for enc in tr_enc.split(",")) - if "chunked" in encodings: - self.chunked = True - - # Determine length of response - self.length_remaining = self._init_length(request_method) - - # If requested, preload the body. - if preload_content and not self._body: - self._body = self.read(decode_content=decode_content) - - def get_redirect_location(self): - """ - Should we redirect and where to? - - :returns: Truthy redirect location string if we got a redirect status - code and valid location. ``None`` if redirect status and no - location. ``False`` if not a redirect status code. - """ - if self.status in self.REDIRECT_STATUSES: - return self.headers.get('location') - - return False - - def release_conn(self): - if not self._pool or not self._connection: - return - - self._pool._put_conn(self._connection) - self._connection = None - - @property - def data(self): - # For backwords-compat with earlier urllib3 0.4 and earlier. - if self._body: - return self._body - - if self._fp: - return self.read(cache_content=True) - - @property - def connection(self): - return self._connection - - def tell(self): - """ - Obtain the number of bytes pulled over the wire so far. May differ from - the amount of content returned by :meth:``HTTPResponse.read`` if bytes - are encoded on the wire (e.g, compressed). - """ - return self._fp_bytes_read - - def _init_length(self, request_method): - """ - Set initial length value for Response content if available. - """ - length = self.headers.get('content-length') - - if length is not None and self.chunked: - # This Response will fail with an IncompleteRead if it can't be - # received as chunked. This method falls back to attempt reading - # the response before raising an exception. - log.warning("Received response with both Content-Length and " - "Transfer-Encoding set. This is expressly forbidden " - "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " - "attempting to process response as Transfer-Encoding: " - "chunked.") - return None - - elif length is not None: - try: - # RFC 7230 section 3.3.2 specifies multiple content lengths can - # be sent in a single Content-Length header - # (e.g. Content-Length: 42, 42). This line ensures the values - # are all valid ints and that as long as the `set` length is 1, - # all values are the same. Otherwise, the header is invalid. - lengths = set([int(val) for val in length.split(',')]) - if len(lengths) > 1: - raise InvalidHeader("Content-Length contained multiple " - "unmatching values (%s)" % length) - length = lengths.pop() - except ValueError: - length = None - else: - if length < 0: - length = None - - # Convert status to int for comparison - # In some cases, httplib returns a status of "_UNKNOWN" - try: - status = int(self.status) - except ValueError: - status = 0 - - # Check for responses that shouldn't include a body - if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD': - length = 0 - - return length - - def _init_decoder(self): - """ - Set-up the _decoder attribute if necessary. - """ - # Note: content-encoding value should be case-insensitive, per RFC 7230 - # Section 3.2 - content_encoding = self.headers.get('content-encoding', '').lower() - if self._decoder is None and content_encoding in self.CONTENT_DECODERS: - self._decoder = _get_decoder(content_encoding) - - def _decode(self, data, decode_content, flush_decoder): - """ - Decode the data passed in and potentially flush the decoder. - """ - try: - if decode_content and self._decoder: - data = self._decoder.decompress(data) - except (IOError, zlib.error) as e: - content_encoding = self.headers.get('content-encoding', '').lower() - raise DecodeError( - "Received response with content-encoding: %s, but " - "failed to decode it." % content_encoding, e) - - if flush_decoder and decode_content: - data += self._flush_decoder() - - return data - - def _flush_decoder(self): - """ - Flushes the decoder. Should only be called if the decoder is actually - being used. - """ - if self._decoder: - buf = self._decoder.decompress(b'') - return buf + self._decoder.flush() - - return b'' - - @contextmanager - def _error_catcher(self): - """ - Catch low-level python exceptions, instead re-raising urllib3 - variants, so that low-level exceptions are not leaked in the - high-level api. - - On exit, release the connection back to the pool. - """ - clean_exit = False - - try: - try: - yield - - except SocketTimeout: - # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but - # there is yet no clean way to get at it from this context. - raise ReadTimeoutError(self._pool, None, 'Read timed out.') - - except BaseSSLError as e: - # FIXME: Is there a better way to differentiate between SSLErrors? - if 'read operation timed out' not in str(e): # Defensive: - # This shouldn't happen but just in case we're missing an edge - # case, let's avoid swallowing SSL errors. - raise - - raise ReadTimeoutError(self._pool, None, 'Read timed out.') - - except (HTTPException, SocketError) as e: - # This includes IncompleteRead. - raise ProtocolError('Connection broken: %r' % e, e) - - # If no exception is thrown, we should avoid cleaning up - # unnecessarily. - clean_exit = True - finally: - # If we didn't terminate cleanly, we need to throw away our - # connection. - if not clean_exit: - # The response may not be closed but we're not going to use it - # anymore so close it now to ensure that the connection is - # released back to the pool. - if self._original_response: - self._original_response.close() - - # Closing the response may not actually be sufficient to close - # everything, so if we have a hold of the connection close that - # too. - if self._connection: - self._connection.close() - - # If we hold the original response but it's closed now, we should - # return the connection back to the pool. - if self._original_response and self._original_response.isclosed(): - self.release_conn() - - def read(self, amt=None, decode_content=None, cache_content=False): - """ - Similar to :meth:`httplib.HTTPResponse.read`, but with two additional - parameters: ``decode_content`` and ``cache_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param cache_content: - If True, will save the returned data such that the same result is - returned despite of the state of the underlying file object. This - is useful if you want the ``.data`` property to continue working - after having ``.read()`` the file object. (Overridden if ``amt`` is - set.) - """ - self._init_decoder() - if decode_content is None: - decode_content = self.decode_content - - if self._fp is None: - return - - flush_decoder = False - data = None - - with self._error_catcher(): - if amt is None: - # cStringIO doesn't like amt=None - data = self._fp.read() - flush_decoder = True - else: - cache_content = False - data = self._fp.read(amt) - if amt != 0 and not data: # Platform-specific: Buggy versions of Python. - # Close the connection when no data is returned - # - # This is redundant to what httplib/http.client _should_ - # already do. However, versions of python released before - # December 15, 2012 (http://bugs.python.org/issue16298) do - # not properly close the connection in all cases. There is - # no harm in redundantly calling close. - self._fp.close() - flush_decoder = True - if self.enforce_content_length and self.length_remaining not in (0, None): - # This is an edge case that httplib failed to cover due - # to concerns of backward compatibility. We're - # addressing it here to make sure IncompleteRead is - # raised during streaming, so all calls with incorrect - # Content-Length are caught. - raise IncompleteRead(self._fp_bytes_read, self.length_remaining) - - if data: - self._fp_bytes_read += len(data) - if self.length_remaining is not None: - self.length_remaining -= len(data) - - data = self._decode(data, decode_content, flush_decoder) - - if cache_content: - self._body = data - - return data - - def stream(self, amt=2**16, decode_content=None): - """ - A generator wrapper for the read() method. A call will block until - ``amt`` bytes have been read from the connection or until the - connection is closed. - - :param amt: - How much of the content to read. The generator will return up to - much data per iteration, but may return less. This is particularly - likely when using compressed data. However, the empty string will - never be returned. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - if self.chunked and self.supports_chunked_reads(): - for line in self.read_chunked(amt, decode_content=decode_content): - yield line - else: - while not is_fp_closed(self._fp): - data = self.read(amt=amt, decode_content=decode_content) - - if data: - yield data - - @classmethod - def from_httplib(ResponseCls, r, **response_kw): - """ - Given an :class:`httplib.HTTPResponse` instance ``r``, return a - corresponding :class:`urllib3.response.HTTPResponse` object. - - Remaining parameters are passed to the HTTPResponse constructor, along - with ``original_response=r``. - """ - headers = r.msg - - if not isinstance(headers, HTTPHeaderDict): - if PY3: # Python 3 - headers = HTTPHeaderDict(headers.items()) - else: # Python 2 - headers = HTTPHeaderDict.from_httplib(headers) - - # HTTPResponse objects in Python 3 don't have a .strict attribute - strict = getattr(r, 'strict', 0) - resp = ResponseCls(body=r, - headers=headers, - status=r.status, - version=r.version, - reason=r.reason, - strict=strict, - original_response=r, - **response_kw) - return resp - - # Backwards-compatibility methods for httplib.HTTPResponse - def getheaders(self): - return self.headers - - def getheader(self, name, default=None): - return self.headers.get(name, default) - - # Backwards compatibility for http.cookiejar - def info(self): - return self.headers - - # Overrides from io.IOBase - def close(self): - if not self.closed: - self._fp.close() - - if self._connection: - self._connection.close() - - @property - def closed(self): - if self._fp is None: - return True - elif hasattr(self._fp, 'isclosed'): - return self._fp.isclosed() - elif hasattr(self._fp, 'closed'): - return self._fp.closed - else: - return True - - def fileno(self): - if self._fp is None: - raise IOError("HTTPResponse has no file to get a fileno from") - elif hasattr(self._fp, "fileno"): - return self._fp.fileno() - else: - raise IOError("The file-like object this HTTPResponse is wrapped " - "around has no file descriptor") - - def flush(self): - if self._fp is not None and hasattr(self._fp, 'flush'): - return self._fp.flush() - - def readable(self): - # This method is required for `io` module compatibility. - return True - - def readinto(self, b): - # This method is required for `io` module compatibility. - temp = self.read(len(b)) - if len(temp) == 0: - return 0 - else: - b[:len(temp)] = temp - return len(temp) - - def supports_chunked_reads(self): - """ - Checks if the underlying file-like object looks like a - httplib.HTTPResponse object. We do this by testing for the fp - attribute. If it is present we assume it returns raw chunks as - processed by read_chunked(). - """ - return hasattr(self._fp, 'fp') - - def _update_chunk_length(self): - # First, we'll figure out length of a chunk and then - # we'll try to read it from socket. - if self.chunk_left is not None: - return - line = self._fp.fp.readline() - line = line.split(b';', 1)[0] - try: - self.chunk_left = int(line, 16) - except ValueError: - # Invalid chunked protocol response, abort. - self.close() - raise httplib.IncompleteRead(line) - - def _handle_chunk(self, amt): - returned_chunk = None - if amt is None: - chunk = self._fp._safe_read(self.chunk_left) - returned_chunk = chunk - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - elif amt < self.chunk_left: - value = self._fp._safe_read(amt) - self.chunk_left = self.chunk_left - amt - returned_chunk = value - elif amt == self.chunk_left: - value = self._fp._safe_read(amt) - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - returned_chunk = value - else: # amt > self.chunk_left - returned_chunk = self._fp._safe_read(self.chunk_left) - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - return returned_chunk - - def read_chunked(self, amt=None, decode_content=None): - """ - Similar to :meth:`HTTPResponse.read`, but with an additional - parameter: ``decode_content``. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - self._init_decoder() - # FIXME: Rewrite this method and make it a class with a better structured logic. - if not self.chunked: - raise ResponseNotChunked( - "Response is not chunked. " - "Header 'transfer-encoding: chunked' is missing.") - if not self.supports_chunked_reads(): - raise BodyNotHttplibCompatible( - "Body should be httplib.HTTPResponse like. " - "It should have have an fp attribute which returns raw chunks.") - - # Don't bother reading the body of a HEAD request. - if self._original_response and is_response_to_head(self._original_response): - self._original_response.close() - return - - with self._error_catcher(): - while True: - self._update_chunk_length() - if self.chunk_left == 0: - break - chunk = self._handle_chunk(amt) - decoded = self._decode(chunk, decode_content=decode_content, - flush_decoder=False) - if decoded: - yield decoded - - if decode_content: - # On CPython and PyPy, we should never need to flush the - # decoder. However, on Jython we *might* need to, so - # lets defensively do it anyway. - decoded = self._flush_decoder() - if decoded: # Platform-specific: Jython. - yield decoded - - # Chunk content ends with \r\n: discard it. - while True: - line = self._fp.fp.readline() - if not line: - # Some sites may not end with '\r\n'. - break - if line == b'\r\n': - break - - # We read everything; close the "file". - if self._original_response: - self._original_response.close() diff --git a/urllib3/util/__init__.py b/urllib3/util/__init__.py deleted file mode 100644 index 2f2770b6..00000000 --- a/urllib3/util/__init__.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import absolute_import -# For backwards compatibility, provide imports that used to be here. -from .connection import is_connection_dropped -from .request import make_headers -from .response import is_fp_closed -from .ssl_ import ( - SSLContext, - HAS_SNI, - IS_PYOPENSSL, - IS_SECURETRANSPORT, - assert_fingerprint, - resolve_cert_reqs, - resolve_ssl_version, - ssl_wrap_socket, -) -from .timeout import ( - current_time, - Timeout, -) - -from .retry import Retry -from .url import ( - get_host, - parse_url, - split_first, - Url, -) -from .wait import ( - wait_for_read, - wait_for_write -) - -__all__ = ( - 'HAS_SNI', - 'IS_PYOPENSSL', - 'IS_SECURETRANSPORT', - 'SSLContext', - 'Retry', - 'Timeout', - 'Url', - 'assert_fingerprint', - 'current_time', - 'is_connection_dropped', - 'is_fp_closed', - 'get_host', - 'parse_url', - 'make_headers', - 'resolve_cert_reqs', - 'resolve_ssl_version', - 'split_first', - 'ssl_wrap_socket', - 'wait_for_read', - 'wait_for_write' -) diff --git a/urllib3/util/connection.py b/urllib3/util/connection.py deleted file mode 100644 index bf699cfd..00000000 --- a/urllib3/util/connection.py +++ /dev/null @@ -1,130 +0,0 @@ -from __future__ import absolute_import -import socket -from .wait import wait_for_read -from .selectors import HAS_SELECT, SelectorError - - -def is_connection_dropped(conn): # Platform-specific - """ - Returns True if the connection is dropped and should be closed. - - :param conn: - :class:`httplib.HTTPConnection` object. - - Note: For platforms like AppEngine, this will always return ``False`` to - let the platform handle connection recycling transparently for us. - """ - sock = getattr(conn, 'sock', False) - if sock is False: # Platform-specific: AppEngine - return False - if sock is None: # Connection already closed (such as by httplib). - return True - - if not HAS_SELECT: - return False - - try: - return bool(wait_for_read(sock, timeout=0.0)) - except SelectorError: - return True - - -# This function is copied from socket.py in the Python 2.7 standard -# library test suite. Added to its signature is only `socket_options`. -# One additional modification is that we avoid binding to IPv6 servers -# discovered in DNS if the system doesn't have IPv6 functionality. -def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - source_address=None, socket_options=None): - """Connect to *address* and return the socket object. - - Convenience function. Connect to *address* (a 2-tuple ``(host, - port)``) and return the socket object. Passing the optional - *timeout* parameter will set the timeout on the socket instance - before attempting to connect. If no *timeout* is supplied, the - global default timeout setting returned by :func:`getdefaulttimeout` - is used. If *source_address* is set it must be a tuple of (host, port) - for the socket to bind as a source address before making the connection. - An host of '' or port 0 tells the OS to use the default. - """ - - host, port = address - if host.startswith('['): - host = host.strip('[]') - err = None - - # Using the value from allowed_gai_family() in the context of getaddrinfo lets - # us select whether to work with IPv4 DNS records, IPv6 records, or both. - # The original create_connection function always returns all records. - family = allowed_gai_family() - - for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): - af, socktype, proto, canonname, sa = res - sock = None - try: - sock = socket.socket(af, socktype, proto) - - # If provided, set socket level options before connecting. - _set_socket_options(sock, socket_options) - - if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: - sock.settimeout(timeout) - if source_address: - sock.bind(source_address) - sock.connect(sa) - return sock - - except socket.error as e: - err = e - if sock is not None: - sock.close() - sock = None - - if err is not None: - raise err - - raise socket.error("getaddrinfo returns an empty list") - - -def _set_socket_options(sock, options): - if options is None: - return - - for opt in options: - sock.setsockopt(*opt) - - -def allowed_gai_family(): - """This function is designed to work in the context of - getaddrinfo, where family=socket.AF_UNSPEC is the default and - will perform a DNS search for both IPv6 and IPv4 records.""" - - family = socket.AF_INET - if HAS_IPV6: - family = socket.AF_UNSPEC - return family - - -def _has_ipv6(host): - """ Returns True if the system can bind an IPv6 address. """ - sock = None - has_ipv6 = False - - if socket.has_ipv6: - # has_ipv6 returns true if cPython was compiled with IPv6 support. - # It does not tell us if the system has IPv6 support enabled. To - # determine that we must bind to an IPv6 address. - # https://github.com/shazow/urllib3/pull/611 - # https://bugs.python.org/issue658327 - try: - sock = socket.socket(socket.AF_INET6) - sock.bind((host, 0)) - has_ipv6 = True - except Exception: - pass - - if sock: - sock.close() - return has_ipv6 - - -HAS_IPV6 = _has_ipv6('::1') diff --git a/urllib3/util/request.py b/urllib3/util/request.py deleted file mode 100644 index 3ddfcd55..00000000 --- a/urllib3/util/request.py +++ /dev/null @@ -1,118 +0,0 @@ -from __future__ import absolute_import -from base64 import b64encode - -from ..packages.six import b, integer_types -from ..exceptions import UnrewindableBodyError - -ACCEPT_ENCODING = 'gzip,deflate' -_FAILEDTELL = object() - - -def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, - basic_auth=None, proxy_basic_auth=None, disable_cache=None): - """ - Shortcuts for generating request headers. - - :param keep_alive: - If ``True``, adds 'connection: keep-alive' header. - - :param accept_encoding: - Can be a boolean, list, or string. - ``True`` translates to 'gzip,deflate'. - List will get joined by comma. - String will be used as provided. - - :param user_agent: - String representing the user-agent you want, such as - "python-urllib3/0.6" - - :param basic_auth: - Colon-separated username:password string for 'authorization: basic ...' - auth header. - - :param proxy_basic_auth: - Colon-separated username:password string for 'proxy-authorization: basic ...' - auth header. - - :param disable_cache: - If ``True``, adds 'cache-control: no-cache' header. - - Example:: - - >>> make_headers(keep_alive=True, user_agent="Batman/1.0") - {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} - >>> make_headers(accept_encoding=True) - {'accept-encoding': 'gzip,deflate'} - """ - headers = {} - if accept_encoding: - if isinstance(accept_encoding, str): - pass - elif isinstance(accept_encoding, list): - accept_encoding = ','.join(accept_encoding) - else: - accept_encoding = ACCEPT_ENCODING - headers['accept-encoding'] = accept_encoding - - if user_agent: - headers['user-agent'] = user_agent - - if keep_alive: - headers['connection'] = 'keep-alive' - - if basic_auth: - headers['authorization'] = 'Basic ' + \ - b64encode(b(basic_auth)).decode('utf-8') - - if proxy_basic_auth: - headers['proxy-authorization'] = 'Basic ' + \ - b64encode(b(proxy_basic_auth)).decode('utf-8') - - if disable_cache: - headers['cache-control'] = 'no-cache' - - return headers - - -def set_file_position(body, pos): - """ - If a position is provided, move file to that point. - Otherwise, we'll attempt to record a position for future use. - """ - if pos is not None: - rewind_body(body, pos) - elif getattr(body, 'tell', None) is not None: - try: - pos = body.tell() - except (IOError, OSError): - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body. - pos = _FAILEDTELL - - return pos - - -def rewind_body(body, body_pos): - """ - Attempt to rewind body to a certain position. - Primarily used for request redirects and retries. - - :param body: - File-like object that supports seek. - - :param int pos: - Position to seek to in file. - """ - body_seek = getattr(body, 'seek', None) - if body_seek is not None and isinstance(body_pos, integer_types): - try: - body_seek(body_pos) - except (IOError, OSError): - raise UnrewindableBodyError("An error occurred when rewinding request " - "body for redirect/retry.") - elif body_pos is _FAILEDTELL: - raise UnrewindableBodyError("Unable to record file position for rewinding " - "request body during a redirect/retry.") - else: - raise ValueError("body_pos must be of type integer, " - "instead it was %s." % type(body_pos)) diff --git a/urllib3/util/response.py b/urllib3/util/response.py deleted file mode 100644 index 67cf730a..00000000 --- a/urllib3/util/response.py +++ /dev/null @@ -1,81 +0,0 @@ -from __future__ import absolute_import -from ..packages.six.moves import http_client as httplib - -from ..exceptions import HeaderParsingError - - -def is_fp_closed(obj): - """ - Checks whether a given file-like object is closed. - - :param obj: - The file-like object to check. - """ - - try: - # Check `isclosed()` first, in case Python3 doesn't set `closed`. - # GH Issue #928 - return obj.isclosed() - except AttributeError: - pass - - try: - # Check via the official file-like-object way. - return obj.closed - except AttributeError: - pass - - try: - # Check if the object is a container for another file-like object that - # gets released on exhaustion (e.g. HTTPResponse). - return obj.fp is None - except AttributeError: - pass - - raise ValueError("Unable to determine whether fp is closed.") - - -def assert_header_parsing(headers): - """ - Asserts whether all headers have been successfully parsed. - Extracts encountered errors from the result of parsing headers. - - Only works on Python 3. - - :param headers: Headers to verify. - :type headers: `httplib.HTTPMessage`. - - :raises urllib3.exceptions.HeaderParsingError: - If parsing errors are found. - """ - - # This will fail silently if we pass in the wrong kind of parameter. - # To make debugging easier add an explicit check. - if not isinstance(headers, httplib.HTTPMessage): - raise TypeError('expected httplib.Message, got {0}.'.format( - type(headers))) - - defects = getattr(headers, 'defects', None) - get_payload = getattr(headers, 'get_payload', None) - - unparsed_data = None - if get_payload: # Platform-specific: Python 3. - unparsed_data = get_payload() - - if defects or unparsed_data: - raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) - - -def is_response_to_head(response): - """ - Checks whether the request of a response has been a HEAD-request. - Handles the quirks of AppEngine. - - :param conn: - :type conn: :class:`httplib.HTTPResponse` - """ - # FIXME: Can we do this somehow without accessing private httplib _method? - method = response._method - if isinstance(method, int): # Platform-specific: Appengine - return method == 3 - return method.upper() == 'HEAD' diff --git a/urllib3/util/retry.py b/urllib3/util/retry.py deleted file mode 100644 index c603cb49..00000000 --- a/urllib3/util/retry.py +++ /dev/null @@ -1,401 +0,0 @@ -from __future__ import absolute_import -import time -import logging -from collections import namedtuple -from itertools import takewhile -import email -import re - -from ..exceptions import ( - ConnectTimeoutError, - MaxRetryError, - ProtocolError, - ReadTimeoutError, - ResponseError, - InvalidHeader, -) -from ..packages import six - - -log = logging.getLogger(__name__) - -# Data structure for representing the metadata of requests that result in a retry. -RequestHistory = namedtuple('RequestHistory', ["method", "url", "error", - "status", "redirect_location"]) - - -class Retry(object): - """ Retry configuration. - - Each retry attempt will create a new Retry object with updated values, so - they can be safely reused. - - Retries can be defined as a default for a pool:: - - retries = Retry(connect=5, read=2, redirect=5) - http = PoolManager(retries=retries) - response = http.request('GET', 'http://example.com/') - - Or per-request (which overrides the default for the pool):: - - response = http.request('GET', 'http://example.com/', retries=Retry(10)) - - Retries can be disabled by passing ``False``:: - - response = http.request('GET', 'http://example.com/', retries=False) - - Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless - retries are disabled, in which case the causing exception will be raised. - - :param int total: - Total number of retries to allow. Takes precedence over other counts. - - Set to ``None`` to remove this constraint and fall back on other - counts. It's a good idea to set this to some sensibly-high value to - account for unexpected edge cases and avoid infinite retry loops. - - Set to ``0`` to fail on the first retry. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int connect: - How many connection-related errors to retry on. - - These are errors raised before the request is sent to the remote server, - which we assume has not triggered the server to process the request. - - Set to ``0`` to fail on the first retry of this type. - - :param int read: - How many times to retry on read errors. - - These errors are raised after the request was sent to the server, so the - request may have side-effects. - - Set to ``0`` to fail on the first retry of this type. - - :param int redirect: - How many redirects to perform. Limit this to avoid infinite redirect - loops. - - A redirect is a HTTP response with a status code 301, 302, 303, 307 or - 308. - - Set to ``0`` to fail on the first retry of this type. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int status: - How many times to retry on bad status codes. - - These are retries made on responses, where status code matches - ``status_forcelist``. - - Set to ``0`` to fail on the first retry of this type. - - :param iterable method_whitelist: - Set of uppercased HTTP method verbs that we should retry on. - - By default, we only retry on methods which are considered to be - idempotent (multiple requests with the same parameters end with the - same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. - - Set to a ``False`` value to retry on any verb. - - :param iterable status_forcelist: - A set of integer HTTP status codes that we should force a retry on. - A retry is initiated if the request method is in ``method_whitelist`` - and the response status code is in ``status_forcelist``. - - By default, this is disabled with ``None``. - - :param float backoff_factor: - A backoff factor to apply between attempts after the second try - (most errors are resolved immediately by a second try without a - delay). urllib3 will sleep for:: - - {backoff factor} * (2 ^ ({number of total retries} - 1)) - - seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep - for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer - than :attr:`Retry.BACKOFF_MAX`. - - By default, backoff is disabled (set to 0). - - :param bool raise_on_redirect: Whether, if the number of redirects is - exhausted, to raise a MaxRetryError, or to return a response with a - response code in the 3xx range. - - :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: - whether we should raise an exception, or return a response, - if status falls in ``status_forcelist`` range and retries have - been exhausted. - - :param tuple history: The history of the request encountered during - each call to :meth:`~Retry.increment`. The list is in the order - the requests occurred. Each list item is of class :class:`RequestHistory`. - - :param bool respect_retry_after_header: - Whether to respect Retry-After header on status codes defined as - :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. - - """ - - DEFAULT_METHOD_WHITELIST = frozenset([ - 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) - - RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) - - #: Maximum backoff time. - BACKOFF_MAX = 120 - - def __init__(self, total=10, connect=None, read=None, redirect=None, status=None, - method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, - backoff_factor=0, raise_on_redirect=True, raise_on_status=True, - history=None, respect_retry_after_header=True): - - self.total = total - self.connect = connect - self.read = read - self.status = status - - if redirect is False or total is False: - redirect = 0 - raise_on_redirect = False - - self.redirect = redirect - self.status_forcelist = status_forcelist or set() - self.method_whitelist = method_whitelist - self.backoff_factor = backoff_factor - self.raise_on_redirect = raise_on_redirect - self.raise_on_status = raise_on_status - self.history = history or tuple() - self.respect_retry_after_header = respect_retry_after_header - - def new(self, **kw): - params = dict( - total=self.total, - connect=self.connect, read=self.read, redirect=self.redirect, status=self.status, - method_whitelist=self.method_whitelist, - status_forcelist=self.status_forcelist, - backoff_factor=self.backoff_factor, - raise_on_redirect=self.raise_on_redirect, - raise_on_status=self.raise_on_status, - history=self.history, - ) - params.update(kw) - return type(self)(**params) - - @classmethod - def from_int(cls, retries, redirect=True, default=None): - """ Backwards-compatibility for the old retries format.""" - if retries is None: - retries = default if default is not None else cls.DEFAULT - - if isinstance(retries, Retry): - return retries - - redirect = bool(redirect) and None - new_retries = cls(retries, redirect=redirect) - log.debug("Converted retries value: %r -> %r", retries, new_retries) - return new_retries - - def get_backoff_time(self): - """ Formula for computing the current backoff - - :rtype: float - """ - # We want to consider only the last consecutive errors sequence (Ignore redirects). - consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, - reversed(self.history)))) - if consecutive_errors_len <= 1: - return 0 - - backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) - return min(self.BACKOFF_MAX, backoff_value) - - def parse_retry_after(self, retry_after): - # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 - if re.match(r"^\s*[0-9]+\s*$", retry_after): - seconds = int(retry_after) - else: - retry_date_tuple = email.utils.parsedate(retry_after) - if retry_date_tuple is None: - raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) - retry_date = time.mktime(retry_date_tuple) - seconds = retry_date - time.time() - - if seconds < 0: - seconds = 0 - - return seconds - - def get_retry_after(self, response): - """ Get the value of Retry-After in seconds. """ - - retry_after = response.getheader("Retry-After") - - if retry_after is None: - return None - - return self.parse_retry_after(retry_after) - - def sleep_for_retry(self, response=None): - retry_after = self.get_retry_after(response) - if retry_after: - time.sleep(retry_after) - return True - - return False - - def _sleep_backoff(self): - backoff = self.get_backoff_time() - if backoff <= 0: - return - time.sleep(backoff) - - def sleep(self, response=None): - """ Sleep between retry attempts. - - This method will respect a server's ``Retry-After`` response header - and sleep the duration of the time requested. If that is not present, it - will use an exponential backoff. By default, the backoff factor is 0 and - this method will return immediately. - """ - - if response: - slept = self.sleep_for_retry(response) - if slept: - return - - self._sleep_backoff() - - def _is_connection_error(self, err): - """ Errors when we're fairly sure that the server did not receive the - request, so it should be safe to retry. - """ - return isinstance(err, ConnectTimeoutError) - - def _is_read_error(self, err): - """ Errors that occur after the request has been started, so we should - assume that the server began processing it. - """ - return isinstance(err, (ReadTimeoutError, ProtocolError)) - - def _is_method_retryable(self, method): - """ Checks if a given HTTP method should be retried upon, depending if - it is included on the method whitelist. - """ - if self.method_whitelist and method.upper() not in self.method_whitelist: - return False - - return True - - def is_retry(self, method, status_code, has_retry_after=False): - """ Is this method/status code retryable? (Based on whitelists and control - variables such as the number of total retries to allow, whether to - respect the Retry-After header, whether this header is present, and - whether the returned status code is on the list of status codes to - be retried upon on the presence of the aforementioned header) - """ - if not self._is_method_retryable(method): - return False - - if self.status_forcelist and status_code in self.status_forcelist: - return True - - return (self.total and self.respect_retry_after_header and - has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES)) - - def is_exhausted(self): - """ Are we out of retries? """ - retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) - retry_counts = list(filter(None, retry_counts)) - if not retry_counts: - return False - - return min(retry_counts) < 0 - - def increment(self, method=None, url=None, response=None, error=None, - _pool=None, _stacktrace=None): - """ Return a new Retry object with incremented retry counters. - - :param response: A response object, or None, if the server did not - return a response. - :type response: :class:`~urllib3.response.HTTPResponse` - :param Exception error: An error encountered during the request, or - None if the response was received successfully. - - :return: A new ``Retry`` object. - """ - if self.total is False and error: - # Disabled, indicate to re-raise the error. - raise six.reraise(type(error), error, _stacktrace) - - total = self.total - if total is not None: - total -= 1 - - connect = self.connect - read = self.read - redirect = self.redirect - status_count = self.status - cause = 'unknown' - status = None - redirect_location = None - - if error and self._is_connection_error(error): - # Connect retry? - if connect is False: - raise six.reraise(type(error), error, _stacktrace) - elif connect is not None: - connect -= 1 - - elif error and self._is_read_error(error): - # Read retry? - if read is False or not self._is_method_retryable(method): - raise six.reraise(type(error), error, _stacktrace) - elif read is not None: - read -= 1 - - elif response and response.get_redirect_location(): - # Redirect retry? - if redirect is not None: - redirect -= 1 - cause = 'too many redirects' - redirect_location = response.get_redirect_location() - status = response.status - - else: - # Incrementing because of a server error like a 500 in - # status_forcelist and a the given method is in the whitelist - cause = ResponseError.GENERIC_ERROR - if response and response.status: - if status_count is not None: - status_count -= 1 - cause = ResponseError.SPECIFIC_ERROR.format( - status_code=response.status) - status = response.status - - history = self.history + (RequestHistory(method, url, error, status, redirect_location),) - - new_retry = self.new( - total=total, - connect=connect, read=read, redirect=redirect, status=status_count, - history=history) - - if new_retry.is_exhausted(): - raise MaxRetryError(_pool, url, error or ResponseError(cause)) - - log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) - - return new_retry - - def __repr__(self): - return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' - 'read={self.read}, redirect={self.redirect}, status={self.status})').format( - cls=type(self), self=self) - - -# For backwards compatibility (equivalent to pre-v1.9): -Retry.DEFAULT = Retry(3) diff --git a/urllib3/util/selectors.py b/urllib3/util/selectors.py deleted file mode 100644 index d75cb266..00000000 --- a/urllib3/util/selectors.py +++ /dev/null @@ -1,581 +0,0 @@ -# Backport of selectors.py from Python 3.5+ to support Python < 3.4 -# Also has the behavior specified in PEP 475 which is to retry syscalls -# in the case of an EINTR error. This module is required because selectors34 -# does not follow this behavior and instead returns that no dile descriptor -# events have occurred rather than retry the syscall. The decision to drop -# support for select.devpoll is made to maintain 100% test coverage. - -import errno -import math -import select -import socket -import sys -import time -from collections import namedtuple, Mapping - -try: - monotonic = time.monotonic -except (AttributeError, ImportError): # Python 3.3< - monotonic = time.time - -EVENT_READ = (1 << 0) -EVENT_WRITE = (1 << 1) - -HAS_SELECT = True # Variable that shows whether the platform has a selector. -_SYSCALL_SENTINEL = object() # Sentinel in case a system call returns None. -_DEFAULT_SELECTOR = None - - -class SelectorError(Exception): - def __init__(self, errcode): - super(SelectorError, self).__init__() - self.errno = errcode - - def __repr__(self): - return "".format(self.errno) - - def __str__(self): - return self.__repr__() - - -def _fileobj_to_fd(fileobj): - """ Return a file descriptor from a file object. If - given an integer will simply return that integer back. """ - if isinstance(fileobj, int): - fd = fileobj - else: - try: - fd = int(fileobj.fileno()) - except (AttributeError, TypeError, ValueError): - raise ValueError("Invalid file object: {0!r}".format(fileobj)) - if fd < 0: - raise ValueError("Invalid file descriptor: {0}".format(fd)) - return fd - - -# Determine which function to use to wrap system calls because Python 3.5+ -# already handles the case when system calls are interrupted. -if sys.version_info >= (3, 5): - def _syscall_wrapper(func, _, *args, **kwargs): - """ This is the short-circuit version of the below logic - because in Python 3.5+ all system calls automatically restart - and recalculate their timeouts. """ - try: - return func(*args, **kwargs) - except (OSError, IOError, select.error) as e: - errcode = None - if hasattr(e, "errno"): - errcode = e.errno - raise SelectorError(errcode) -else: - def _syscall_wrapper(func, recalc_timeout, *args, **kwargs): - """ Wrapper function for syscalls that could fail due to EINTR. - All functions should be retried if there is time left in the timeout - in accordance with PEP 475. """ - timeout = kwargs.get("timeout", None) - if timeout is None: - expires = None - recalc_timeout = False - else: - timeout = float(timeout) - if timeout < 0.0: # Timeout less than 0 treated as no timeout. - expires = None - else: - expires = monotonic() + timeout - - args = list(args) - if recalc_timeout and "timeout" not in kwargs: - raise ValueError( - "Timeout must be in args or kwargs to be recalculated") - - result = _SYSCALL_SENTINEL - while result is _SYSCALL_SENTINEL: - try: - result = func(*args, **kwargs) - # OSError is thrown by select.select - # IOError is thrown by select.epoll.poll - # select.error is thrown by select.poll.poll - # Aren't we thankful for Python 3.x rework for exceptions? - except (OSError, IOError, select.error) as e: - # select.error wasn't a subclass of OSError in the past. - errcode = None - if hasattr(e, "errno"): - errcode = e.errno - elif hasattr(e, "args"): - errcode = e.args[0] - - # Also test for the Windows equivalent of EINTR. - is_interrupt = (errcode == errno.EINTR or (hasattr(errno, "WSAEINTR") and - errcode == errno.WSAEINTR)) - - if is_interrupt: - if expires is not None: - current_time = monotonic() - if current_time > expires: - raise OSError(errno=errno.ETIMEDOUT) - if recalc_timeout: - if "timeout" in kwargs: - kwargs["timeout"] = expires - current_time - continue - if errcode: - raise SelectorError(errcode) - else: - raise - return result - - -SelectorKey = namedtuple('SelectorKey', ['fileobj', 'fd', 'events', 'data']) - - -class _SelectorMapping(Mapping): - """ Mapping of file objects to selector keys """ - - def __init__(self, selector): - self._selector = selector - - def __len__(self): - return len(self._selector._fd_to_key) - - def __getitem__(self, fileobj): - try: - fd = self._selector._fileobj_lookup(fileobj) - return self._selector._fd_to_key[fd] - except KeyError: - raise KeyError("{0!r} is not registered.".format(fileobj)) - - def __iter__(self): - return iter(self._selector._fd_to_key) - - -class BaseSelector(object): - """ Abstract Selector class - - A selector supports registering file objects to be monitored - for specific I/O events. - - A file object is a file descriptor or any object with a - `fileno()` method. An arbitrary object can be attached to the - file object which can be used for example to store context info, - a callback, etc. - - A selector can use various implementations (select(), poll(), epoll(), - and kqueue()) depending on the platform. The 'DefaultSelector' class uses - the most efficient implementation for the current platform. - """ - def __init__(self): - # Maps file descriptors to keys. - self._fd_to_key = {} - - # Read-only mapping returned by get_map() - self._map = _SelectorMapping(self) - - def _fileobj_lookup(self, fileobj): - """ Return a file descriptor from a file object. - This wraps _fileobj_to_fd() to do an exhaustive - search in case the object is invalid but we still - have it in our map. Used by unregister() so we can - unregister an object that was previously registered - even if it is closed. It is also used by _SelectorMapping - """ - try: - return _fileobj_to_fd(fileobj) - except ValueError: - - # Search through all our mapped keys. - for key in self._fd_to_key.values(): - if key.fileobj is fileobj: - return key.fd - - # Raise ValueError after all. - raise - - def register(self, fileobj, events, data=None): - """ Register a file object for a set of events to monitor. """ - if (not events) or (events & ~(EVENT_READ | EVENT_WRITE)): - raise ValueError("Invalid events: {0!r}".format(events)) - - key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data) - - if key.fd in self._fd_to_key: - raise KeyError("{0!r} (FD {1}) is already registered" - .format(fileobj, key.fd)) - - self._fd_to_key[key.fd] = key - return key - - def unregister(self, fileobj): - """ Unregister a file object from being monitored. """ - try: - key = self._fd_to_key.pop(self._fileobj_lookup(fileobj)) - except KeyError: - raise KeyError("{0!r} is not registered".format(fileobj)) - - # Getting the fileno of a closed socket on Windows errors with EBADF. - except socket.error as e: # Platform-specific: Windows. - if e.errno != errno.EBADF: - raise - else: - for key in self._fd_to_key.values(): - if key.fileobj is fileobj: - self._fd_to_key.pop(key.fd) - break - else: - raise KeyError("{0!r} is not registered".format(fileobj)) - return key - - def modify(self, fileobj, events, data=None): - """ Change a registered file object monitored events and data. """ - # NOTE: Some subclasses optimize this operation even further. - try: - key = self._fd_to_key[self._fileobj_lookup(fileobj)] - except KeyError: - raise KeyError("{0!r} is not registered".format(fileobj)) - - if events != key.events: - self.unregister(fileobj) - key = self.register(fileobj, events, data) - - elif data != key.data: - # Use a shortcut to update the data. - key = key._replace(data=data) - self._fd_to_key[key.fd] = key - - return key - - def select(self, timeout=None): - """ Perform the actual selection until some monitored file objects - are ready or the timeout expires. """ - raise NotImplementedError() - - def close(self): - """ Close the selector. This must be called to ensure that all - underlying resources are freed. """ - self._fd_to_key.clear() - self._map = None - - def get_key(self, fileobj): - """ Return the key associated with a registered file object. """ - mapping = self.get_map() - if mapping is None: - raise RuntimeError("Selector is closed") - try: - return mapping[fileobj] - except KeyError: - raise KeyError("{0!r} is not registered".format(fileobj)) - - def get_map(self): - """ Return a mapping of file objects to selector keys """ - return self._map - - def _key_from_fd(self, fd): - """ Return the key associated to a given file descriptor - Return None if it is not found. """ - try: - return self._fd_to_key[fd] - except KeyError: - return None - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - -# Almost all platforms have select.select() -if hasattr(select, "select"): - class SelectSelector(BaseSelector): - """ Select-based selector. """ - def __init__(self): - super(SelectSelector, self).__init__() - self._readers = set() - self._writers = set() - - def register(self, fileobj, events, data=None): - key = super(SelectSelector, self).register(fileobj, events, data) - if events & EVENT_READ: - self._readers.add(key.fd) - if events & EVENT_WRITE: - self._writers.add(key.fd) - return key - - def unregister(self, fileobj): - key = super(SelectSelector, self).unregister(fileobj) - self._readers.discard(key.fd) - self._writers.discard(key.fd) - return key - - def _select(self, r, w, timeout=None): - """ Wrapper for select.select because timeout is a positional arg """ - return select.select(r, w, [], timeout) - - def select(self, timeout=None): - # Selecting on empty lists on Windows errors out. - if not len(self._readers) and not len(self._writers): - return [] - - timeout = None if timeout is None else max(timeout, 0.0) - ready = [] - r, w, _ = _syscall_wrapper(self._select, True, self._readers, - self._writers, timeout) - r = set(r) - w = set(w) - for fd in r | w: - events = 0 - if fd in r: - events |= EVENT_READ - if fd in w: - events |= EVENT_WRITE - - key = self._key_from_fd(fd) - if key: - ready.append((key, events & key.events)) - return ready - - -if hasattr(select, "poll"): - class PollSelector(BaseSelector): - """ Poll-based selector """ - def __init__(self): - super(PollSelector, self).__init__() - self._poll = select.poll() - - def register(self, fileobj, events, data=None): - key = super(PollSelector, self).register(fileobj, events, data) - event_mask = 0 - if events & EVENT_READ: - event_mask |= select.POLLIN - if events & EVENT_WRITE: - event_mask |= select.POLLOUT - self._poll.register(key.fd, event_mask) - return key - - def unregister(self, fileobj): - key = super(PollSelector, self).unregister(fileobj) - self._poll.unregister(key.fd) - return key - - def _wrap_poll(self, timeout=None): - """ Wrapper function for select.poll.poll() so that - _syscall_wrapper can work with only seconds. """ - if timeout is not None: - if timeout <= 0: - timeout = 0 - else: - # select.poll.poll() has a resolution of 1 millisecond, - # round away from zero to wait *at least* timeout seconds. - timeout = math.ceil(timeout * 1e3) - - result = self._poll.poll(timeout) - return result - - def select(self, timeout=None): - ready = [] - fd_events = _syscall_wrapper(self._wrap_poll, True, timeout=timeout) - for fd, event_mask in fd_events: - events = 0 - if event_mask & ~select.POLLIN: - events |= EVENT_WRITE - if event_mask & ~select.POLLOUT: - events |= EVENT_READ - - key = self._key_from_fd(fd) - if key: - ready.append((key, events & key.events)) - - return ready - - -if hasattr(select, "epoll"): - class EpollSelector(BaseSelector): - """ Epoll-based selector """ - def __init__(self): - super(EpollSelector, self).__init__() - self._epoll = select.epoll() - - def fileno(self): - return self._epoll.fileno() - - def register(self, fileobj, events, data=None): - key = super(EpollSelector, self).register(fileobj, events, data) - events_mask = 0 - if events & EVENT_READ: - events_mask |= select.EPOLLIN - if events & EVENT_WRITE: - events_mask |= select.EPOLLOUT - _syscall_wrapper(self._epoll.register, False, key.fd, events_mask) - return key - - def unregister(self, fileobj): - key = super(EpollSelector, self).unregister(fileobj) - try: - _syscall_wrapper(self._epoll.unregister, False, key.fd) - except SelectorError: - # This can occur when the fd was closed since registry. - pass - return key - - def select(self, timeout=None): - if timeout is not None: - if timeout <= 0: - timeout = 0.0 - else: - # select.epoll.poll() has a resolution of 1 millisecond - # but luckily takes seconds so we don't need a wrapper - # like PollSelector. Just for better rounding. - timeout = math.ceil(timeout * 1e3) * 1e-3 - timeout = float(timeout) - else: - timeout = -1.0 # epoll.poll() must have a float. - - # We always want at least 1 to ensure that select can be called - # with no file descriptors registered. Otherwise will fail. - max_events = max(len(self._fd_to_key), 1) - - ready = [] - fd_events = _syscall_wrapper(self._epoll.poll, True, - timeout=timeout, - maxevents=max_events) - for fd, event_mask in fd_events: - events = 0 - if event_mask & ~select.EPOLLIN: - events |= EVENT_WRITE - if event_mask & ~select.EPOLLOUT: - events |= EVENT_READ - - key = self._key_from_fd(fd) - if key: - ready.append((key, events & key.events)) - return ready - - def close(self): - self._epoll.close() - super(EpollSelector, self).close() - - -if hasattr(select, "kqueue"): - class KqueueSelector(BaseSelector): - """ Kqueue / Kevent-based selector """ - def __init__(self): - super(KqueueSelector, self).__init__() - self._kqueue = select.kqueue() - - def fileno(self): - return self._kqueue.fileno() - - def register(self, fileobj, events, data=None): - key = super(KqueueSelector, self).register(fileobj, events, data) - if events & EVENT_READ: - kevent = select.kevent(key.fd, - select.KQ_FILTER_READ, - select.KQ_EV_ADD) - - _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) - - if events & EVENT_WRITE: - kevent = select.kevent(key.fd, - select.KQ_FILTER_WRITE, - select.KQ_EV_ADD) - - _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) - - return key - - def unregister(self, fileobj): - key = super(KqueueSelector, self).unregister(fileobj) - if key.events & EVENT_READ: - kevent = select.kevent(key.fd, - select.KQ_FILTER_READ, - select.KQ_EV_DELETE) - try: - _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) - except SelectorError: - pass - if key.events & EVENT_WRITE: - kevent = select.kevent(key.fd, - select.KQ_FILTER_WRITE, - select.KQ_EV_DELETE) - try: - _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) - except SelectorError: - pass - - return key - - def select(self, timeout=None): - if timeout is not None: - timeout = max(timeout, 0) - - max_events = len(self._fd_to_key) * 2 - ready_fds = {} - - kevent_list = _syscall_wrapper(self._kqueue.control, True, - None, max_events, timeout) - - for kevent in kevent_list: - fd = kevent.ident - event_mask = kevent.filter - events = 0 - if event_mask == select.KQ_FILTER_READ: - events |= EVENT_READ - if event_mask == select.KQ_FILTER_WRITE: - events |= EVENT_WRITE - - key = self._key_from_fd(fd) - if key: - if key.fd not in ready_fds: - ready_fds[key.fd] = (key, events & key.events) - else: - old_events = ready_fds[key.fd][1] - ready_fds[key.fd] = (key, (events | old_events) & key.events) - - return list(ready_fds.values()) - - def close(self): - self._kqueue.close() - super(KqueueSelector, self).close() - - -if not hasattr(select, 'select'): # Platform-specific: AppEngine - HAS_SELECT = False - - -def _can_allocate(struct): - """ Checks that select structs can be allocated by the underlying - operating system, not just advertised by the select module. We don't - check select() because we'll be hopeful that most platforms that - don't have it available will not advertise it. (ie: GAE) """ - try: - # select.poll() objects won't fail until used. - if struct == 'poll': - p = select.poll() - p.poll(0) - - # All others will fail on allocation. - else: - getattr(select, struct)().close() - return True - except (OSError, AttributeError) as e: - return False - - -# Choose the best implementation, roughly: -# kqueue == epoll > poll > select. Devpoll not supported. (See above) -# select() also can't accept a FD > FD_SETSIZE (usually around 1024) -def DefaultSelector(): - """ This function serves as a first call for DefaultSelector to - detect if the select module is being monkey-patched incorrectly - by eventlet, greenlet, and preserve proper behavior. """ - global _DEFAULT_SELECTOR - if _DEFAULT_SELECTOR is None: - if _can_allocate('kqueue'): - _DEFAULT_SELECTOR = KqueueSelector - elif _can_allocate('epoll'): - _DEFAULT_SELECTOR = EpollSelector - elif _can_allocate('poll'): - _DEFAULT_SELECTOR = PollSelector - elif hasattr(select, 'select'): - _DEFAULT_SELECTOR = SelectSelector - else: # Platform-specific: AppEngine - raise ValueError('Platform does not have a selector') - return _DEFAULT_SELECTOR() diff --git a/urllib3/util/ssl_.py b/urllib3/util/ssl_.py deleted file mode 100644 index 32fd9eda..00000000 --- a/urllib3/util/ssl_.py +++ /dev/null @@ -1,341 +0,0 @@ -from __future__ import absolute_import -import errno -import warnings -import hmac - -from binascii import hexlify, unhexlify -from hashlib import md5, sha1, sha256 - -from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning - - -SSLContext = None -HAS_SNI = False -IS_PYOPENSSL = False -IS_SECURETRANSPORT = False - -# Maps the length of a digest to a possible hash function producing this digest -HASHFUNC_MAP = { - 32: md5, - 40: sha1, - 64: sha256, -} - - -def _const_compare_digest_backport(a, b): - """ - Compare two digests of equal length in constant time. - - The digests must be of type str/bytes. - Returns True if the digests match, and False otherwise. - """ - result = abs(len(a) - len(b)) - for l, r in zip(bytearray(a), bytearray(b)): - result |= l ^ r - return result == 0 - - -_const_compare_digest = getattr(hmac, 'compare_digest', - _const_compare_digest_backport) - - -try: # Test for SSL features - import ssl - from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 - from ssl import HAS_SNI # Has SNI? -except ImportError: - pass - - -try: - from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION -except ImportError: - OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 - OP_NO_COMPRESSION = 0x20000 - -# A secure default. -# Sources for more information on TLS ciphers: -# -# - https://wiki.mozilla.org/Security/Server_Side_TLS -# - https://www.ssllabs.com/projects/best-practices/index.html -# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ -# -# The general intent is: -# - Prefer TLS 1.3 cipher suites -# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), -# - prefer ECDHE over DHE for better performance, -# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and -# security, -# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, -# - disable NULL authentication, MD5 MACs and DSS for security reasons. -DEFAULT_CIPHERS = ':'.join([ - 'TLS13-AES-256-GCM-SHA384', - 'TLS13-CHACHA20-POLY1305-SHA256', - 'TLS13-AES-128-GCM-SHA256', - 'ECDH+AESGCM', - 'ECDH+CHACHA20', - 'DH+AESGCM', - 'DH+CHACHA20', - 'ECDH+AES256', - 'DH+AES256', - 'ECDH+AES128', - 'DH+AES', - 'RSA+AESGCM', - 'RSA+AES', - '!aNULL', - '!eNULL', - '!MD5', -]) - -try: - from ssl import SSLContext # Modern SSL? -except ImportError: - import sys - - class SSLContext(object): # Platform-specific: Python 2 & 3.1 - supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or - (3, 2) <= sys.version_info) - - def __init__(self, protocol_version): - self.protocol = protocol_version - # Use default values from a real SSLContext - self.check_hostname = False - self.verify_mode = ssl.CERT_NONE - self.ca_certs = None - self.options = 0 - self.certfile = None - self.keyfile = None - self.ciphers = None - - def load_cert_chain(self, certfile, keyfile): - self.certfile = certfile - self.keyfile = keyfile - - def load_verify_locations(self, cafile=None, capath=None): - self.ca_certs = cafile - - if capath is not None: - raise SSLError("CA directories not supported in older Pythons") - - def set_ciphers(self, cipher_suite): - if not self.supports_set_ciphers: - raise TypeError( - 'Your version of Python does not support setting ' - 'a custom cipher suite. Please upgrade to Python ' - '2.7, 3.2, or later if you need this functionality.' - ) - self.ciphers = cipher_suite - - def wrap_socket(self, socket, server_hostname=None, server_side=False): - warnings.warn( - 'A true SSLContext object is not available. This prevents ' - 'urllib3 from configuring SSL appropriately and may cause ' - 'certain SSL connections to fail. You can upgrade to a newer ' - 'version of Python to solve this. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings', - InsecurePlatformWarning - ) - kwargs = { - 'keyfile': self.keyfile, - 'certfile': self.certfile, - 'ca_certs': self.ca_certs, - 'cert_reqs': self.verify_mode, - 'ssl_version': self.protocol, - 'server_side': server_side, - } - if self.supports_set_ciphers: # Platform-specific: Python 2.7+ - return wrap_socket(socket, ciphers=self.ciphers, **kwargs) - else: # Platform-specific: Python 2.6 - return wrap_socket(socket, **kwargs) - - -def assert_fingerprint(cert, fingerprint): - """ - Checks if given fingerprint matches the supplied certificate. - - :param cert: - Certificate as bytes object. - :param fingerprint: - Fingerprint as string of hexdigits, can be interspersed by colons. - """ - - fingerprint = fingerprint.replace(':', '').lower() - digest_length = len(fingerprint) - hashfunc = HASHFUNC_MAP.get(digest_length) - if not hashfunc: - raise SSLError( - 'Fingerprint of invalid length: {0}'.format(fingerprint)) - - # We need encode() here for py32; works on py2 and p33. - fingerprint_bytes = unhexlify(fingerprint.encode()) - - cert_digest = hashfunc(cert).digest() - - if not _const_compare_digest(cert_digest, fingerprint_bytes): - raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' - .format(fingerprint, hexlify(cert_digest))) - - -def resolve_cert_reqs(candidate): - """ - Resolves the argument to a numeric constant, which can be passed to - the wrap_socket function/method from the ssl module. - Defaults to :data:`ssl.CERT_NONE`. - If given a string it is assumed to be the name of the constant in the - :mod:`ssl` module or its abbrevation. - (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. - If it's neither `None` nor a string we assume it is already the numeric - constant which can directly be passed to wrap_socket. - """ - if candidate is None: - return CERT_NONE - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, 'CERT_' + candidate) - return res - - return candidate - - -def resolve_ssl_version(candidate): - """ - like resolve_cert_reqs - """ - if candidate is None: - return PROTOCOL_SSLv23 - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, 'PROTOCOL_' + candidate) - return res - - return candidate - - -def create_urllib3_context(ssl_version=None, cert_reqs=None, - options=None, ciphers=None): - """All arguments have the same meaning as ``ssl_wrap_socket``. - - By default, this function does a lot of the same work that - ``ssl.create_default_context`` does on Python 3.4+. It: - - - Disables SSLv2, SSLv3, and compression - - Sets a restricted set of server ciphers - - If you wish to enable SSLv3, you can do:: - - from urllib3.util import ssl_ - context = ssl_.create_urllib3_context() - context.options &= ~ssl_.OP_NO_SSLv3 - - You can do the same to enable compression (substituting ``COMPRESSION`` - for ``SSLv3`` in the last line above). - - :param ssl_version: - The desired protocol version to use. This will default to - PROTOCOL_SSLv23 which will negotiate the highest protocol that both - the server and your installation of OpenSSL support. - :param cert_reqs: - Whether to require the certificate verification. This defaults to - ``ssl.CERT_REQUIRED``. - :param options: - Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, - ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. - :param ciphers: - Which cipher suites to allow the server to select. - :returns: - Constructed SSLContext object with specified options - :rtype: SSLContext - """ - context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) - - # Setting the default here, as we may have no ssl module on import - cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs - - if options is None: - options = 0 - # SSLv2 is easily broken and is considered harmful and dangerous - options |= OP_NO_SSLv2 - # SSLv3 has several problems and is now dangerous - options |= OP_NO_SSLv3 - # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ - # (issue #309) - options |= OP_NO_COMPRESSION - - context.options |= options - - if getattr(context, 'supports_set_ciphers', True): # Platform-specific: Python 2.6 - context.set_ciphers(ciphers or DEFAULT_CIPHERS) - - context.verify_mode = cert_reqs - if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 - # We do our own verification, including fingerprints and alternative - # hostnames. So disable it here - context.check_hostname = False - return context - - -def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, - ca_certs=None, server_hostname=None, - ssl_version=None, ciphers=None, ssl_context=None, - ca_cert_dir=None): - """ - All arguments except for server_hostname, ssl_context, and ca_cert_dir have - the same meaning as they do when using :func:`ssl.wrap_socket`. - - :param server_hostname: - When SNI is supported, the expected hostname of the certificate - :param ssl_context: - A pre-made :class:`SSLContext` object. If none is provided, one will - be created using :func:`create_urllib3_context`. - :param ciphers: - A string of ciphers we wish the client to support. This is not - supported on Python 2.6 as the ssl module does not support it. - :param ca_cert_dir: - A directory containing CA certificates in multiple separate files, as - supported by OpenSSL's -CApath flag or the capath argument to - SSLContext.load_verify_locations(). - """ - context = ssl_context - if context is None: - # Note: This branch of code and all the variables in it are no longer - # used by urllib3 itself. We should consider deprecating and removing - # this code. - context = create_urllib3_context(ssl_version, cert_reqs, - ciphers=ciphers) - - if ca_certs or ca_cert_dir: - try: - context.load_verify_locations(ca_certs, ca_cert_dir) - except IOError as e: # Platform-specific: Python 2.6, 2.7, 3.2 - raise SSLError(e) - # Py33 raises FileNotFoundError which subclasses OSError - # These are not equivalent unless we check the errno attribute - except OSError as e: # Platform-specific: Python 3.3 and beyond - if e.errno == errno.ENOENT: - raise SSLError(e) - raise - elif getattr(context, 'load_default_certs', None) is not None: - # try to load OS default certs; works well on Windows (require Python3.4+) - context.load_default_certs() - - if certfile: - context.load_cert_chain(certfile, keyfile) - if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI - return context.wrap_socket(sock, server_hostname=server_hostname) - - warnings.warn( - 'An HTTPS request has been made, but the SNI (Subject Name ' - 'Indication) extension to TLS is not available on this platform. ' - 'This may cause the server to present an incorrect TLS ' - 'certificate, which can cause validation failures. You can upgrade to ' - 'a newer version of Python to solve this. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings', - SNIMissingWarning - ) - return context.wrap_socket(sock) diff --git a/urllib3/util/timeout.py b/urllib3/util/timeout.py deleted file mode 100644 index cec817e6..00000000 --- a/urllib3/util/timeout.py +++ /dev/null @@ -1,242 +0,0 @@ -from __future__ import absolute_import -# The default socket timeout, used by httplib to indicate that no timeout was -# specified by the user -from socket import _GLOBAL_DEFAULT_TIMEOUT -import time - -from ..exceptions import TimeoutStateError - -# A sentinel value to indicate that no timeout was specified by the user in -# urllib3 -_Default = object() - - -# Use time.monotonic if available. -current_time = getattr(time, "monotonic", time.time) - - -class Timeout(object): - """ Timeout configuration. - - Timeouts can be defined as a default for a pool:: - - timeout = Timeout(connect=2.0, read=7.0) - http = PoolManager(timeout=timeout) - response = http.request('GET', 'http://example.com/') - - Or per-request (which overrides the default for the pool):: - - response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) - - Timeouts can be disabled by setting all the parameters to ``None``:: - - no_timeout = Timeout(connect=None, read=None) - response = http.request('GET', 'http://example.com/, timeout=no_timeout) - - - :param total: - This combines the connect and read timeouts into one; the read timeout - will be set to the time leftover from the connect attempt. In the - event that both a connect timeout and a total are specified, or a read - timeout and a total are specified, the shorter timeout will be applied. - - Defaults to None. - - :type total: integer, float, or None - - :param connect: - The maximum amount of time to wait for a connection attempt to a server - to succeed. Omitting the parameter will default the connect timeout to - the system default, probably `the global default timeout in socket.py - `_. - None will set an infinite timeout for connection attempts. - - :type connect: integer, float, or None - - :param read: - The maximum amount of time to wait between consecutive - read operations for a response from the server. Omitting - the parameter will default the read timeout to the system - default, probably `the global default timeout in socket.py - `_. - None will set an infinite timeout. - - :type read: integer, float, or None - - .. note:: - - Many factors can affect the total amount of time for urllib3 to return - an HTTP response. - - For example, Python's DNS resolver does not obey the timeout specified - on the socket. Other factors that can affect total request time include - high CPU load, high swap, the program running at a low priority level, - or other behaviors. - - In addition, the read and total timeouts only measure the time between - read operations on the socket connecting the client and the server, - not the total amount of time for the request to return a complete - response. For most requests, the timeout is raised because the server - has not sent the first byte in the specified time. This is not always - the case; if a server streams one byte every fifteen seconds, a timeout - of 20 seconds will not trigger, even though the request will take - several minutes to complete. - - If your goal is to cut off any request after a set amount of wall clock - time, consider having a second "watcher" thread to cut off a slow - request. - """ - - #: A sentinel object representing the default timeout value - DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT - - def __init__(self, total=None, connect=_Default, read=_Default): - self._connect = self._validate_timeout(connect, 'connect') - self._read = self._validate_timeout(read, 'read') - self.total = self._validate_timeout(total, 'total') - self._start_connect = None - - def __str__(self): - return '%s(connect=%r, read=%r, total=%r)' % ( - type(self).__name__, self._connect, self._read, self.total) - - @classmethod - def _validate_timeout(cls, value, name): - """ Check that a timeout attribute is valid. - - :param value: The timeout value to validate - :param name: The name of the timeout attribute to validate. This is - used to specify in error messages. - :return: The validated and casted version of the given value. - :raises ValueError: If it is a numeric value less than or equal to - zero, or the type is not an integer, float, or None. - """ - if value is _Default: - return cls.DEFAULT_TIMEOUT - - if value is None or value is cls.DEFAULT_TIMEOUT: - return value - - if isinstance(value, bool): - raise ValueError("Timeout cannot be a boolean value. It must " - "be an int, float or None.") - try: - float(value) - except (TypeError, ValueError): - raise ValueError("Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value)) - - try: - if value <= 0: - raise ValueError("Attempted to set %s timeout to %s, but the " - "timeout cannot be set to a value less " - "than or equal to 0." % (name, value)) - except TypeError: # Python 3 - raise ValueError("Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value)) - - return value - - @classmethod - def from_float(cls, timeout): - """ Create a new Timeout from a legacy timeout value. - - The timeout value used by httplib.py sets the same timeout on the - connect(), and recv() socket requests. This creates a :class:`Timeout` - object that sets the individual timeouts to the ``timeout`` value - passed to this function. - - :param timeout: The legacy timeout value. - :type timeout: integer, float, sentinel default object, or None - :return: Timeout object - :rtype: :class:`Timeout` - """ - return Timeout(read=timeout, connect=timeout) - - def clone(self): - """ Create a copy of the timeout object - - Timeout properties are stored per-pool but each request needs a fresh - Timeout object to ensure each one has its own start/stop configured. - - :return: a copy of the timeout object - :rtype: :class:`Timeout` - """ - # We can't use copy.deepcopy because that will also create a new object - # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to - # detect the user default. - return Timeout(connect=self._connect, read=self._read, - total=self.total) - - def start_connect(self): - """ Start the timeout clock, used during a connect() attempt - - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to start a timer that has been started already. - """ - if self._start_connect is not None: - raise TimeoutStateError("Timeout timer has already been started.") - self._start_connect = current_time() - return self._start_connect - - def get_connect_duration(self): - """ Gets the time elapsed since the call to :meth:`start_connect`. - - :return: Elapsed time. - :rtype: float - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to get duration for a timer that hasn't been started. - """ - if self._start_connect is None: - raise TimeoutStateError("Can't get connect duration for timer " - "that has not started.") - return current_time() - self._start_connect - - @property - def connect_timeout(self): - """ Get the value to use when setting a connection timeout. - - This will be a positive float or integer, the value None - (never timeout), or the default system timeout. - - :return: Connect timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - """ - if self.total is None: - return self._connect - - if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: - return self.total - - return min(self._connect, self.total) - - @property - def read_timeout(self): - """ Get the value for the read timeout. - - This assumes some time has elapsed in the connection timeout and - computes the read timeout appropriately. - - If self.total is set, the read timeout is dependent on the amount of - time taken by the connect timeout. If the connection time has not been - established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be - raised. - - :return: Value to use for the read timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` - has not yet been called on this object. - """ - if (self.total is not None and - self.total is not self.DEFAULT_TIMEOUT and - self._read is not None and - self._read is not self.DEFAULT_TIMEOUT): - # In case the connect timeout has not yet been established. - if self._start_connect is None: - return self._read - return max(0, min(self.total - self.get_connect_duration(), - self._read)) - elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: - return max(0, self.total - self.get_connect_duration()) - else: - return self._read diff --git a/urllib3/util/url.py b/urllib3/util/url.py deleted file mode 100644 index 6b6f9968..00000000 --- a/urllib3/util/url.py +++ /dev/null @@ -1,230 +0,0 @@ -from __future__ import absolute_import -from collections import namedtuple - -from ..exceptions import LocationParseError - - -url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] - -# We only want to normalize urls with an HTTP(S) scheme. -# urllib3 infers URLs without a scheme (None) to be http. -NORMALIZABLE_SCHEMES = ('http', 'https', None) - - -class Url(namedtuple('Url', url_attrs)): - """ - Datastructure for representing an HTTP URL. Used as a return value for - :func:`parse_url`. Both the scheme and host are normalized as they are - both case-insensitive according to RFC 3986. - """ - __slots__ = () - - def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, - query=None, fragment=None): - if path and not path.startswith('/'): - path = '/' + path - if scheme: - scheme = scheme.lower() - if host and scheme in NORMALIZABLE_SCHEMES: - host = host.lower() - return super(Url, cls).__new__(cls, scheme, auth, host, port, path, - query, fragment) - - @property - def hostname(self): - """For backwards-compatibility with urlparse. We're nice like that.""" - return self.host - - @property - def request_uri(self): - """Absolute path including the query string.""" - uri = self.path or '/' - - if self.query is not None: - uri += '?' + self.query - - return uri - - @property - def netloc(self): - """Network location including host and port""" - if self.port: - return '%s:%d' % (self.host, self.port) - return self.host - - @property - def url(self): - """ - Convert self into a url - - This function should more or less round-trip with :func:`.parse_url`. The - returned url may not be exactly the same as the url inputted to - :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls - with a blank port will have : removed). - - Example: :: - - >>> U = parse_url('http://google.com/mail/') - >>> U.url - 'http://google.com/mail/' - >>> Url('http', 'username:password', 'host.com', 80, - ... '/path', 'query', 'fragment').url - 'http://username:password@host.com:80/path?query#fragment' - """ - scheme, auth, host, port, path, query, fragment = self - url = '' - - # We use "is not None" we want things to happen with empty strings (or 0 port) - if scheme is not None: - url += scheme + '://' - if auth is not None: - url += auth + '@' - if host is not None: - url += host - if port is not None: - url += ':' + str(port) - if path is not None: - url += path - if query is not None: - url += '?' + query - if fragment is not None: - url += '#' + fragment - - return url - - def __str__(self): - return self.url - - -def split_first(s, delims): - """ - Given a string and an iterable of delimiters, split on the first found - delimiter. Return two split parts and the matched delimiter. - - If not found, then the first part is the full input string. - - Example:: - - >>> split_first('foo/bar?baz', '?/=') - ('foo', 'bar?baz', '/') - >>> split_first('foo/bar?baz', '123') - ('foo/bar?baz', '', None) - - Scales linearly with number of delims. Not ideal for large number of delims. - """ - min_idx = None - min_delim = None - for d in delims: - idx = s.find(d) - if idx < 0: - continue - - if min_idx is None or idx < min_idx: - min_idx = idx - min_delim = d - - if min_idx is None or min_idx < 0: - return s, '', None - - return s[:min_idx], s[min_idx + 1:], min_delim - - -def parse_url(url): - """ - Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is - performed to parse incomplete urls. Fields not provided will be None. - - Partly backwards-compatible with :mod:`urlparse`. - - Example:: - - >>> parse_url('http://google.com/mail/') - Url(scheme='http', host='google.com', port=None, path='/mail/', ...) - >>> parse_url('google.com:80') - Url(scheme=None, host='google.com', port=80, path=None, ...) - >>> parse_url('/foo?bar') - Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) - """ - - # While this code has overlap with stdlib's urlparse, it is much - # simplified for our needs and less annoying. - # Additionally, this implementations does silly things to be optimal - # on CPython. - - if not url: - # Empty - return Url() - - scheme = None - auth = None - host = None - port = None - path = None - fragment = None - query = None - - # Scheme - if '://' in url: - scheme, url = url.split('://', 1) - - # Find the earliest Authority Terminator - # (http://tools.ietf.org/html/rfc3986#section-3.2) - url, path_, delim = split_first(url, ['/', '?', '#']) - - if delim: - # Reassemble the path - path = delim + path_ - - # Auth - if '@' in url: - # Last '@' denotes end of auth part - auth, url = url.rsplit('@', 1) - - # IPv6 - if url and url[0] == '[': - host, url = url.split(']', 1) - host += ']' - - # Port - if ':' in url: - _host, port = url.split(':', 1) - - if not host: - host = _host - - if port: - # If given, ports must be integers. No whitespace, no plus or - # minus prefixes, no non-integer digits such as ^2 (superscript). - if not port.isdigit(): - raise LocationParseError(url) - try: - port = int(port) - except ValueError: - raise LocationParseError(url) - else: - # Blank ports are cool, too. (rfc3986#section-3.2.3) - port = None - - elif not host and url: - host = url - - if not path: - return Url(scheme, auth, host, port, path, query, fragment) - - # Fragment - if '#' in path: - path, fragment = path.split('#', 1) - - # Query - if '?' in path: - path, query = path.split('?', 1) - - return Url(scheme, auth, host, port, path, query, fragment) - - -def get_host(url): - """ - Deprecated. Use :func:`parse_url` instead. - """ - p = parse_url(url) - return p.scheme or 'http', p.hostname, p.port diff --git a/urllib3/util/wait.py b/urllib3/util/wait.py deleted file mode 100644 index cb396e50..00000000 --- a/urllib3/util/wait.py +++ /dev/null @@ -1,40 +0,0 @@ -from .selectors import ( - HAS_SELECT, - DefaultSelector, - EVENT_READ, - EVENT_WRITE -) - - -def _wait_for_io_events(socks, events, timeout=None): - """ Waits for IO events to be available from a list of sockets - or optionally a single socket if passed in. Returns a list of - sockets that can be interacted with immediately. """ - if not HAS_SELECT: - raise ValueError('Platform does not have a selector') - if not isinstance(socks, list): - # Probably just a single socket. - if hasattr(socks, "fileno"): - socks = [socks] - # Otherwise it might be a non-list iterable. - else: - socks = list(socks) - with DefaultSelector() as selector: - for sock in socks: - selector.register(sock, events) - return [key[0].fileobj for key in - selector.select(timeout) if key[1] & events] - - -def wait_for_read(socks, timeout=None): - """ Waits for reading to be available from a list of sockets - or optionally a single socket if passed in. Returns a list of - sockets that can be read from immediately. """ - return _wait_for_io_events(socks, EVENT_READ, timeout) - - -def wait_for_write(socks, timeout=None): - """ Waits for writing to be available from a list of sockets - or optionally a single socket if passed in. Returns a list of - sockets that can be written to immediately. """ - return _wait_for_io_events(socks, EVENT_WRITE, timeout) From f4996d45760a23f7663c4092d85677aa36f6e8f3 Mon Sep 17 00:00:00 2001 From: Craig Date: Wed, 28 Mar 2018 16:34:40 +0100 Subject: [PATCH 19/85] Create Noctis.txt (cherry picked from commit ac69e8bceeedf45d24659fbf030777bf47585189) --- TekkenData/CharacterData/Noctis.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 TekkenData/CharacterData/Noctis.txt diff --git a/TekkenData/CharacterData/Noctis.txt b/TekkenData/CharacterData/Noctis.txt new file mode 100644 index 00000000..c5b586b7 --- /dev/null +++ b/TekkenData/CharacterData/Noctis.txt @@ -0,0 +1,17 @@ + +{ + "name": "Noctis", + "char_id":"", + "st_punishes": { + "10":">, +1, >, +1, >, +2, >", + "12":">, b+1, >, +2, >", + "15":">, d/f+2, >" + }, + "ws_punishes": { + "11":">, +4, >", + "13":">, +1, >, +2, >", + "14":">, +3, >, +2, >", + "15":">, +2, >, +2, >" + "16":">, u/f+3, >" + } +} From f2d37b4c55e6c2df05ae3dbbb7600fc0885e7d59 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sat, 2 Jun 2018 03:47:51 +0200 Subject: [PATCH 20/85] building instructions --- build_project.bat | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build_project.bat b/build_project.bat index 6014fb4f..17168000 100644 --- a/build_project.bat +++ b/build_project.bat @@ -1 +1,6 @@ -pyinstaller --windowed --clean --icon=TekkenData/tekken_bot_close.ico --add-data TekkenData;TekkenData --name TekkenBotPrime GUI_TekkenBotPrime.py \ No newline at end of file +::install the pyinstaller requirement first if missing: +::pip install pyinstaller +pyinstaller --windowed --clean --icon=TekkenData/tekken_bot_close.ico --add-data TekkenData;TekkenData --name TekkenBotPrime GUI_TekkenBotPrime.py +::alternative sample command for building: +::"C:%HOMEPATH%\AppData\Local\Programs\Python\Python36-32\Scripts\pyinstaller.exe" --windowed --clean --icon=TekkenData/tekken_bot_close.ico --add-data TekkenData;TekkenData --name TekkenBotPrime GUI_TekkenBotPrime.py +pause \ No newline at end of file From 51bab4ac3689646707768c89dfa3dcbd302f091c Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sat, 2 Jun 2018 03:48:47 +0200 Subject: [PATCH 21/85] repetita iuvant --- TekkenData/tekken_bot_readme.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TekkenData/tekken_bot_readme.txt b/TekkenData/tekken_bot_readme.txt index 10e26992..ce9419b6 100644 --- a/TekkenData/tekken_bot_readme.txt +++ b/TekkenData/tekken_bot_readme.txt @@ -1,5 +1,7 @@ ------TEKKEN BOT README------ *** MAKE SURE YOU ALWAYS HAVE THE LATEST VERSION OF memory_address.ini*** +*** MAKE SURE YOU ALWAYS HAVE THE LATEST VERSION OF memory_address.ini*** +*** MAKE SURE YOU ALWAYS HAVE THE LATEST VERSION OF memory_address.ini*** * Launch Tekken 7, then launch Tekken Bot by clicking on TekkenBotPrime.exe. Tekken Bot should automatically locate the running Tekken 7 instance and start reading its memory. If Tekken 7 is running with admin rights, make sure you also run Tekken Bot with them. * Frame Data Overlay requires Tekken 7 to be in windowed or windowed borderless mode (switch first to windowed, THEN to borderless). * Users with multiple monitors can get the overlay as a separate, draggable window on their second monitor (display -> overlay_as_draggable_window). From 0b694b50616f66613828169563bebccdd0754681 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sat, 2 Jun 2018 04:14:25 +0200 Subject: [PATCH 22/85] 2018-05-31 patch addresses 1.14 (by Psylence) --- CE_TekkenBot.CT | 362 +++++++++++++++++----------------- TekkenData/memory_address.ini | 12 +- 2 files changed, 186 insertions(+), 188 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index efb584a3..627ddec2 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -7,9 +7,9 @@ 1005 "player_data_second_pointer_offset" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
0 0 @@ -18,9 +18,9 @@ 1102 "player_data_second_pointer_offset" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1208 0 @@ -29,9 +29,9 @@ 1006 "p2_data_offset" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6850 0 @@ -40,9 +40,9 @@ 1007 "p2_end_block_offset" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
c8 0 @@ -51,9 +51,9 @@ 1008 "rollback_frame_offset" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1A620 0 @@ -62,9 +62,9 @@ 1009 "frame_count" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1A150 0 @@ -73,9 +73,9 @@ 1010 "facing" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
ad4 0 @@ -84,9 +84,9 @@ 1011 "timer_in_frames" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1A158 0 @@ -95,9 +95,9 @@ 1012 "p1_char_id" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
d4 0 @@ -106,9 +106,9 @@ 1013 "p2_char_id" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6924 0 @@ -117,9 +117,9 @@ 1014 "p1_move_timer" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1f0 0 @@ -128,9 +128,9 @@ 1015 "p2_move_timer" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6A40 0 @@ -139,9 +139,9 @@ 1016 "p1_attack_damage" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
2fc 0 @@ -150,9 +150,9 @@ 1017 "p2_attack_damage" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6B4C 0 @@ -161,9 +161,9 @@ 1018 "p1_move_id" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
31c 0 @@ -172,9 +172,9 @@ 1019 "p2_move_id" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6B6C 0 @@ -183,9 +183,9 @@ 1020 "p1_recovery" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
360 0 @@ -194,9 +194,9 @@ 1021 "p2_recovery" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6BB0 0 @@ -205,9 +205,9 @@ 1022 "p1_hit_outcome" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
39c 0 @@ -216,9 +216,9 @@ 1023 "p2_hit_outcome" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6BEC 0 @@ -227,9 +227,9 @@ 1024 "p1_attack_type" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
3d4 0 @@ -238,9 +238,9 @@ 1025 "p2_attack_type" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6C24 0 @@ -249,9 +249,9 @@ 1026 "p1_simple_move_state" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
3d8 0 @@ -260,9 +260,9 @@ 1027 "p2_simple_move_state" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6C28 0 @@ -271,9 +271,9 @@ 1028 "p1_stun_type" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
3dc 0 @@ -282,9 +282,9 @@ 1029 "p2_stun_type" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6C2C 0 @@ -293,9 +293,9 @@ 1030 "p1_throw_tech" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
3ec 0 @@ -304,9 +304,9 @@ 1031 "p2_throw_tech" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6C3C 0 @@ -315,9 +315,9 @@ 1032 "p1_throw_flag" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
3f8 0 @@ -326,9 +326,9 @@ 1033 "p2_throw_flag" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6C48 0 @@ -337,9 +337,9 @@ 1034 "p1_complex_move_state" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
400 0 @@ -348,9 +348,9 @@ 1133 "p2_complex_move_state" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6C50 0 @@ -359,9 +359,9 @@ 1123 "p1_power_crush" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
4FA 0 @@ -370,9 +370,9 @@ 1124 "p2_power_crush" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6D4A 0 @@ -381,9 +381,9 @@ 1038 "p1_jump_flags" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
544 0 @@ -392,9 +392,9 @@ 1039 "p2_jump_flags" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6D94 0 @@ -403,9 +403,9 @@ 1040 "p1_cancel_window" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
568 0 @@ -414,9 +414,9 @@ 1041 "p2_cancel_window" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6DB8 0 @@ -425,9 +425,9 @@ 1042 "p1_damage_taken" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6ec 0 @@ -436,9 +436,9 @@ 1043 "p2_damage_taken" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6F3C 0 @@ -447,9 +447,9 @@ 1044 "p1_x" - + Float -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
c00 0 @@ -458,9 +458,9 @@ 1045 "p2_x" - + Float -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
7450 0 @@ -469,9 +469,9 @@ 1046 "p1_y" - + Float -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
c04 0 @@ -480,9 +480,9 @@ 1047 "p2_y" - + Float -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
7454 0 @@ -491,9 +491,9 @@ 1048 "p1_z" - + Float -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
c08 0 @@ -502,9 +502,9 @@ 1049 "p2_z" - + Float -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
7458 0 @@ -513,9 +513,9 @@ 1050 "p1_hitbox1" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
c0c 0 @@ -524,9 +524,9 @@ 1051 "p2_hitbox1" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
745C 0 @@ -535,9 +535,9 @@ 1052 "p1_hitbox2" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
c10 0 @@ -546,9 +546,9 @@ 1053 "p2_hitbox2" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
7460 0 @@ -557,9 +557,9 @@ 1054 "p1_hitbox3" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
c14 0 @@ -568,9 +568,9 @@ 1055 "p2_hitbox3" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
7464 0 @@ -579,9 +579,9 @@ 1056 "p1_hitbox4" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
c18 0 @@ -590,9 +590,9 @@ 1057 "p2_hitbox4" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
7468 0 @@ -601,9 +601,9 @@ 1058 "p1_hitbox5" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
c1c 0 @@ -612,9 +612,9 @@ 1059 "p2_hitbox5" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
746C 0 @@ -623,10 +623,10 @@ 1060 "p1_activebox_x" - + 000000 Float -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1060 0 @@ -635,10 +635,10 @@ 1061 "p2_activebox_x" - + 000000 Float -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
78B0 0 @@ -647,10 +647,10 @@ 1062 "p1_activebox_y" - + 000000 Float -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1064 0 @@ -659,10 +659,10 @@ 1063 "p2_activebox_y" - + 000000 Float -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
78B4 0 @@ -671,10 +671,10 @@ 1064 "p1_activebox_z" - + 000000 Float -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1068 0 @@ -683,10 +683,10 @@ 1065 "p2_activebox_z" - + 000000 Float -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
78B8 0 @@ -695,10 +695,10 @@ 1066 "p1_health_percent" - + 000000 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
11e8 0 @@ -707,10 +707,10 @@ 1067 "p2_health_percent" - + 000000 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
7A38 0 @@ -719,9 +719,9 @@ 1068 "p1_input_counter" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
15B8 0 @@ -730,9 +730,9 @@ 1069 "p2_input_counter" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
7E08 0 @@ -741,9 +741,9 @@ 1070 "p1_input_attack" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
15BC 0 @@ -752,9 +752,9 @@ 1071 "p2_input_attack" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
7E0C 0 @@ -763,9 +763,9 @@ 1072 "p1_input_direction" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
15C0 0 @@ -774,9 +774,9 @@ 1073 "p2_input_direction" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
7E10 0 @@ -785,9 +785,9 @@ 1074 "p1_attack_startup" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6840 0 @@ -796,9 +796,9 @@ 1075 "p2_attack_startup" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
D090 0 @@ -807,9 +807,9 @@ 1076 "p1_attack_startup_end" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
6844 0 @@ -818,9 +818,9 @@ 1077 "p2_attack_startup_end" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
EE94 0 @@ -829,9 +829,9 @@ 1078 "p1_rage_flag" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
99C 0 @@ -840,9 +840,9 @@ 1079 "p2_rage_flag" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
71EC 0 @@ -851,9 +851,9 @@ 1080 "p1_mystery_state" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
990 0 @@ -862,9 +862,9 @@ 1135 "p2_mystery_state" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
71E0 0 @@ -873,9 +873,9 @@ 1125 "p1_round_wins" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1A16c 0 @@ -884,9 +884,9 @@ 1126 "p2_round_wins" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1A23c 0 @@ -895,9 +895,9 @@ 1084 "p1_display_combo_counter" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1A200 0 @@ -906,9 +906,9 @@ 1120 "p2_display_combo_counter" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1A2D0 0 @@ -917,9 +917,9 @@ 1086 "p1_display_combo_damage" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1A1D8 0 @@ -928,9 +928,9 @@ 1087 "p2_display_combo_damage" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1A2A8 0 @@ -939,9 +939,9 @@ 1121 "p1_display_juggle_damage" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1A1DC 0 @@ -950,9 +950,9 @@ 1122 "p2_display_juggle_damage" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+33FFBC8
+
"TekkenGame-Win64-Shipping.exe"+3404DA8
1A2AC 0 @@ -961,13 +961,13 @@ 1105 "p1_movelist" - + String 10 0 0 1 -
"TekkenGame-Win64-Shipping.exe"+3400DD0
+
"TekkenGame-Win64-Shipping.exe"+3405FB0
2e8 @@ -975,13 +975,13 @@ 1127 "p2_movelist" - + String 10 0 0 1 -
"TekkenGame-Win64-Shipping.exe"+340F800
+
"TekkenGame-Win64-Shipping.exe"+34149E0
2e8 @@ -989,13 +989,13 @@ 1129 "OPPONENT_NAME" - + String 13 0 0 1 -
"TekkenGame-Win64-Shipping.exe"+033EB200
+
"TekkenGame-Win64-Shipping.exe"+033F01F0
114 8 @@ -1005,9 +1005,9 @@ 1131 "OPPONENT_SIDE" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+033EB200
+
"TekkenGame-Win64-Shipping.exe"+033F01F0
70 8 @@ -1016,6 +1016,4 @@
- Info about this table: - diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index 70c0a4d3..4b0e629e 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,8 +1,8 @@ -;2018-04-13 patch addresses (1.13 matchmaking update, timestamp 1523577612, date from https://steamdb.info/app/389730/history/) +;2018-05-31 patch addresses (1.14 anniversary costumes update, timestamp 1527724902, date from https://steamdb.info/app/389730/history/) ;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. [MemoryAddressOffsets] -player_data_pointer_offset = 0x033FCBC8 +player_data_pointer_offset = 0x03404DA8 p2_data_offset = 0x6850 rollback_frame_offset = 0x1a600 ;----IGNORABLE START---- @@ -92,10 +92,10 @@ juggle_height = 0x11D8 ;Outdated ;NotUsed [NonPlayerDataAddresses] -OPPONENT_NAME = 0x033E8200 0x0 0x8 0x114 ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x033E8200 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 -P1_Movelist = 0x033FDDD0 0x2E8 ;There's a pointer to this in player data block -P2_Movelist = 0x0340C800 0x2E8 +OPPONENT_NAME = 0x033F01F0 0x0 0x8 0x114 ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x033F01F0 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 +P1_Movelist = 0x03405FB0 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A +P2_Movelist = 0x034149E0 0x2E8 ;----IGNORABLE START---- P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 From d08e5df66a02aa4f5fb854cd683a257bc12ac16f Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 7 Sep 2018 02:12:01 +0200 Subject: [PATCH 23/85] version number --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index 5328bcf5..4e3d00b3 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.10.0' +CURRENT_VERSION = 'v0.11.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.10.0' in CURRENT_VERSION: + if 'v0.11.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From a0c4d069c503042f658f434314f8cf00c195caec Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 7 Sep 2018 02:13:28 +0200 Subject: [PATCH 24/85] higher contrast text --- TekkenData/color_scheme.ini | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/TekkenData/color_scheme.ini b/TekkenData/color_scheme.ini index e2be38ec..a60fd93c 100644 --- a/TekkenData/color_scheme.ini +++ b/TekkenData/color_scheme.ini @@ -1,11 +1,11 @@ [Comments] -; colors with names -> http://www.science.smith.edu/dftwiki/images/3/3d/TkInterColorCharts.png +;colors with names -> http://www.science.smith.edu/dftwiki/images/3/3d/TkInterColorCharts.png [Current] background = gray10 transparent = white -p1_text = #93A1A1 -p2_text = #586E75 +p1_text = #ffffff +p2_text = #93A1A1 system_text = lawn green advantage_plus = DodgerBlue2 advantage_slight_minus = ivory2 @@ -17,8 +17,8 @@ advantage_text = black [Classic] background = gray10 transparent = white -p1_text = #93A1A1 -p2_text = #586E75 +p1_text = #ffffff +p2_text = #93A1A1 system_text = lawn green advantage_plus = DodgerBlue2 advantage_slight_minus = ivory2 @@ -78,3 +78,4 @@ advantage_safe_minus = black advantage_punishible = black advantage_very_punishible = red advantage_text = black + From fba61b638b99067c27c73d594a5208262fb45872 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 7 Sep 2018 02:15:05 +0200 Subject: [PATCH 25/85] CT cleaned and updated (2018-09-05) --- CE_TekkenBot.CT | 1451 ++++++++++++++++++++++++----------------------- 1 file changed, 751 insertions(+), 700 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index 627ddec2..49507fd6 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -1,973 +1,426 @@ - + b7Ej%2nldAU:MM2b.}cxWeIh0Gi32eO*Ft]WMuP5%{mcIVgA6t9Fkwal+AgInNpI$=7,zGoLEqjnV-i7R=ffx00 - - 1005 - "player_data_second_pointer_offset" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 0 - 0 - -
- - 1102 - "player_data_second_pointer_offset" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 1208 - 0 - -
1006 "p2_data_offset" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 6850 - 0 - -
- - 1007 - "p2_end_block_offset" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- c8 + 6870 0
1008 "rollback_frame_offset" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 1A620 + 1A680 0
1009 "frame_count" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 1A150 - 0 - -
- - 1010 - "facing" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- ad4 - 0 - -
- - 1011 - "timer_in_frames" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 1A158 - 0 - -
- - 1012 - "p1_char_id" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - d4 - 0 - -
- - 1013 - "p2_char_id" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 6924 + 1A1D0 0
1014 "p1_move_timer" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
1f0 0
- - 1015 - "p2_move_timer" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 6A40 - 0 - -
- - 1016 - "p1_attack_damage" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 2fc - 0 - -
- - 1017 - "p2_attack_damage" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 6B4C - 0 - -
1018 "p1_move_id" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
31c 0
- - 1019 - "p2_move_id" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 6B6C - 0 - -
1020 "p1_recovery" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 360 - 0 - -
- - 1021 - "p2_recovery" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 6BB0 + 368 0
1022 "p1_hit_outcome" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 39c - 0 - -
- - 1023 - "p2_hit_outcome" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 6BEC + 3A4 0
1024 "p1_attack_type" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 3d4 - 0 - -
- - 1025 - "p2_attack_type" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 6C24 + 3DC 0
1026 "p1_simple_move_state" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 3d8 - 0 - -
- - 1027 - "p2_simple_move_state" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 6C28 + 3E0 0
1028 "p1_stun_type" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 3dc - 0 - -
- - 1029 - "p2_stun_type" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 6C2C + 3E4 0
1030 "p1_throw_tech" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 3ec - 0 - -
- - 1031 - "p2_throw_tech" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 6C3C - 0 - -
- - 1032 - "p1_throw_flag" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 3f8 - 0 - -
- - 1033 - "p2_throw_flag" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 6C48 + 3F4 0
1034 "p1_complex_move_state" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 400 - 0 - -
- - 1133 - "p2_complex_move_state" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 6C50 + 408 0
1123 "p1_power_crush" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
4FA 0
- - 1124 - "p2_power_crush" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 6D4A - 0 - -
1038 "p1_jump_flags" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
544 0
- - 1039 - "p2_jump_flags" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 6D94 - 0 - -
1040 "p1_cancel_window" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
568 0
- - 1041 - "p2_cancel_window" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 6DB8 - 0 - -
1042 "p1_damage_taken" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
6ec 0
- 1043 - "p2_damage_taken" - + 1070 + "p1_input_attack" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 6F3C - 0 - -
- - 1044 - "p1_x" - - Float -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - c00 - 0 - -
- - 1045 - "p2_x" - - Float -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 7450 + 15CC 0
- 1046 - "p1_y" - - Float -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - c04 - 0 - -
- - 1047 - "p2_y" - - Float -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 7454 - 0 - -
- - 1048 - "p1_z" - - Float -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - c08 - 0 - -
- - 1049 - "p2_z" - - Float -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 7458 - 0 - -
- - 1050 - "p1_hitbox1" - + 1072 + "p1_input_direction" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- c0c + 15D0 0
- 1051 - "p2_hitbox1" - + 1074 + "p1_attack_startup" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 745C + 6860 0
- 1052 - "p1_hitbox2" - + 1076 + "p1_attack_startup_end" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- c10 + 6864 0
- 1053 - "p2_hitbox2" - + 1147 + "p2_move_timer" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 7460 + 1f0+6870 0
- 1054 - "p1_hitbox3" - + 1148 + "p2_move_id" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- c14 + 31c+6870 0
- 1055 - "p2_hitbox3" - + 1149 + "p2_recovery" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 7464 + 368+6870 0
- 1056 - "p1_hitbox4" - + 1150 + "p2_hit_outcome" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- c18 + 3A4+6870 0
- 1057 - "p2_hitbox4" - + 1151 + "p2_attack_type" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 7468 + 3DC+6870 0
- 1058 - "p1_hitbox5" - + 1152 + "p2_simple_move_state" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- c1c + 3E0+6870 0
- 1059 - "p2_hitbox5" - + 1153 + "p2_stun_type" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 746C - 0 - -
- - 1060 - "p1_activebox_x" - - 000000 - Float -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 1060 - 0 - -
- - 1061 - "p2_activebox_x" - - 000000 - Float -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 78B0 - 0 - -
- - 1062 - "p1_activebox_y" - - 000000 - Float -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 1064 - 0 - -
- - 1063 - "p2_activebox_y" - - 000000 - Float -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 78B4 - 0 - -
- - 1064 - "p1_activebox_z" - - 000000 - Float -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 1068 - 0 - -
- - 1065 - "p2_activebox_z" - - 000000 - Float -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 78B8 + 3E4+6870 0
- 1066 - "p1_health_percent" - - 000000 + 1154 + "p2_throw_tech" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 11e8 + 3F4+6870 0
- 1067 - "p2_health_percent" - - 000000 + 1156 + "p2_complex_move_state" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 7A38 + 408+6870 0
- 1068 - "p1_input_counter" - + 1157 + "p2_power_crush" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 15B8 + 4FA+6870 0
- 1069 - "p2_input_counter" - + 1158 + "p2_jump_flags" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 7E08 + 544+6870 0
- 1070 - "p1_input_attack" - + 1159 + "p2_cancel_window" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 15BC + 568+6870 0
- 1071 - "p2_input_attack" - + 1160 + "p2_damage_taken" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 7E0C + 6ec+6870 0
- 1072 - "p1_input_direction" - + 1161 + "p2_input_attack" + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 15C0 + 15CC+6870 0
- 1073 + 1162 "p2_input_direction" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 7E10 - 0 - -
- - 1074 - "p1_attack_startup" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 6840 + 15D0+6870 0
- 1075 + 1163 "p2_attack_startup" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- D090 + 6860+6870 0
- 1076 - "p1_attack_startup_end" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 6844 - 0 - -
- - 1077 + 1164 "p2_attack_startup_end" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - EE94 - 0 - -
- - 1078 - "p1_rage_flag" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 99C - 0 - -
- - 1079 - "p2_rage_flag" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 71EC - 0 - -
- - 1080 - "p1_mystery_state" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 990 - 0 - -
- - 1135 - "p2_mystery_state" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 71E0 - 0 - -
- - 1125 - "p1_round_wins" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 1A16c - 0 - -
- - 1126 - "p2_round_wins" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 1A23c - 0 - -
- - 1084 - "p1_display_combo_counter" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 1A200 - 0 - -
- - 1120 - "p2_display_combo_counter" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 1A2D0 - 0 - -
- - 1086 - "p1_display_combo_damage" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
+
"TekkenGame-Win64-Shipping.exe"+3447B80
- 1A1D8 - 0 - -
- - 1087 - "p2_display_combo_damage" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 1A2A8 - 0 - -
- - 1121 - "p1_display_juggle_damage" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 1A1DC - 0 - -
- - 1122 - "p2_display_juggle_damage" - - 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+3404DA8
- - 1A2AC + 6864+6870 0
1105 "p1_movelist" - + String 10 0 0 1 -
"TekkenGame-Win64-Shipping.exe"+3405FB0
+
"TekkenGame-Win64-Shipping.exe"+03413220
2e8 @@ -975,13 +428,13 @@ 1127 "p2_movelist" - + String 10 0 0 1 -
"TekkenGame-Win64-Shipping.exe"+34149E0
+
"TekkenGame-Win64-Shipping.exe"+03416100
2e8 @@ -989,13 +442,13 @@ 1129 "OPPONENT_NAME" - + String 13 0 0 1 -
"TekkenGame-Win64-Shipping.exe"+033F01F0
+
"TekkenGame-Win64-Shipping.exe"+033FDB20
114 8 @@ -1005,15 +458,613 @@ 1131 "OPPONENT_SIDE" - + 4 Bytes -
"TekkenGame-Win64-Shipping.exe"+033F01F0
+
"TekkenGame-Win64-Shipping.exe"+033FDB20
70 8 0
+ + 1136 + "----IGNORABLE----" + + + 0000FF + 1 + + + 1005 + "player_data_second_pointer_offset" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 0 + 0 + +
+ + 1102 + "player_data_second_pointer_offset" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 1208 + 0 + +
+ + 1007 + "p2_end_block_offset" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + c8 + 0 + +
+ + 1010 + "facing" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + ad4 + 0 + +
+ + 1011 + "timer_in_frames" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 1A158 + 0 + +
+ + 1012 + "p1_char_id" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + d4 + 0 + +
+ + 1013 + "p2_char_id" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 6924 + 0 + +
+ + 1016 + "p1_attack_damage" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 2fc + 0 + +
+ + 1017 + "p2_attack_damage" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 6B4C + 0 + +
+ + 1032 + "p1_throw_flag" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 400 + 0 + +
+ + 1155 + "p2_throw_flag" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 400+6870 + 0 + +
+ + 1044 + "p1_x" + + 0000FF + Float +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + c00 + 0 + +
+ + 1045 + "p2_x" + + 0000FF + Float +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 7450 + 0 + +
+ + 1046 + "p1_y" + + 0000FF + Float +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + c04 + 0 + +
+ + 1047 + "p2_y" + + 0000FF + Float +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 7454 + 0 + +
+ + 1048 + "p1_z" + + 0000FF + Float +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + c08 + 0 + +
+ + 1049 + "p2_z" + + 0000FF + Float +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 7458 + 0 + +
+ + 1050 + "p1_hitbox1" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + c0c + 0 + +
+ + 1051 + "p2_hitbox1" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 745C + 0 + +
+ + 1052 + "p1_hitbox2" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + c10 + 0 + +
+ + 1053 + "p2_hitbox2" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 7460 + 0 + +
+ + 1054 + "p1_hitbox3" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + c14 + 0 + +
+ + 1055 + "p2_hitbox3" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 7464 + 0 + +
+ + 1056 + "p1_hitbox4" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + c18 + 0 + +
+ + 1057 + "p2_hitbox4" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 7468 + 0 + +
+ + 1058 + "p1_hitbox5" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + c1c + 0 + +
+ + 1059 + "p2_hitbox5" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 746C + 0 + +
+ + 1060 + "p1_activebox_x" + + 0000FF + Float +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 1060 + 0 + +
+ + 1061 + "p2_activebox_x" + + 0000FF + Float +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 78B0 + 0 + +
+ + 1062 + "p1_activebox_y" + + 0000FF + Float +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 1064 + 0 + +
+ + 1063 + "p2_activebox_y" + + 0000FF + Float +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 78B4 + 0 + +
+ + 1064 + "p1_activebox_z" + + 0000FF + Float +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 1068 + 0 + +
+ + 1065 + "p2_activebox_z" + + 0000FF + Float +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 78B8 + 0 + +
+ + 1066 + "p1_health_percent" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 11e8 + 0 + +
+ + 1067 + "p2_health_percent" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 7A38 + 0 + +
+ + 1068 + "p1_input_counter" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 15B8 + 0 + +
+ + 1069 + "p2_input_counter" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 7E08 + 0 + +
+ + 1078 + "p1_rage_flag" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 99C + 0 + +
+ + 1079 + "p2_rage_flag" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 71EC + 0 + +
+ + 1080 + "p1_mystery_state" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 990 + 0 + +
+ + 1135 + "p2_mystery_state" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 71E0 + 0 + +
+ + 1125 + "p1_round_wins" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 1A16c + 0 + +
+ + 1126 + "p2_round_wins" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 1A23c + 0 + +
+ + 1084 + "p1_display_combo_counter" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 1A200 + 0 + +
+ + 1120 + "p2_display_combo_counter" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 1A2D0 + 0 + +
+ + 1086 + "p1_display_combo_damage" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 1A1D8 + 0 + +
+ + 1087 + "p2_display_combo_damage" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 1A2A8 + 0 + +
+ + 1121 + "p1_display_juggle_damage" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 1A1DC + 0 + +
+ + 1122 + "p2_display_juggle_damage" + + 0000FF + 4 Bytes +
"TekkenGame-Win64-Shipping.exe"+3447B80
+ + 1A2AC + 0 + +
+
+
From fefe00fb2cec2a221803762c633e267985b55249 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 7 Sep 2018 02:16:07 +0200 Subject: [PATCH 26/85] 2018-09-05 patch addresses 2.00 --- TekkenData/memory_address.ini | 40 +++++++++++++++++------------------ 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index 4b0e629e..8b3ac99c 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,10 +1,10 @@ -;2018-05-31 patch addresses (1.14 anniversary costumes update, timestamp 1527724902, date from https://steamdb.info/app/389730/history/) +;2018-09-05 patch addresses (2.00 Season 2 update, timestamp 1536191607, date from https://steamdb.info/app/389730/history/) ;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. [MemoryAddressOffsets] -player_data_pointer_offset = 0x03404DA8 -p2_data_offset = 0x6850 -rollback_frame_offset = 0x1a600 +player_data_pointer_offset = 0x03447B80 +p2_data_offset = 0x6870 +rollback_frame_offset = 0x1A680 ;----IGNORABLE START---- player_data_second_pointer_offset = 0 p2_end_block_offset = 0xD0 @@ -16,7 +16,7 @@ expected_module_address = 0x140000000 ;Might not have to be configurable [GameDataAddress] -frame_count = 0x1A150 +frame_count = 0x1A1D0 ;----IGNORABLE START---- ;frame_count = 0x6a0 ;resets sometimes on p1 backdash??? ;frame_count = 0x70C ;caps at 0xFF @@ -47,21 +47,21 @@ total_moves_blocked = 0x19B5C ;Outdated ;NotUsed [PlayerDataAddress] move_timer = 0x1f0 move_id = 0x31C -recovery = 0x360 -hit_outcome = 0x39C -attack_type = 0x3D4 -simple_move_state = 0x3D8 -stun_type = 0x3DC -throw_tech = 0x3EC -complex_move_state = 0x400 +recovery = 0x368 +hit_outcome = 0x3A4 +attack_type = 0x3DC +simple_move_state = 0x3E0 +stun_type = 0x3E4 +throw_tech = 0x3F4 +complex_move_state = 0x408 power_crush = 0x4FA jump_flags = 0x544 cancel_window = 0x568 damage_taken = 0x6EC -input_attack = 0x15BC -input_direction = 0x15C0 -attack_startup = 0x6840 -attack_startup_end = 0x6844 +input_attack = 0x15CC +input_direction = 0x15D0 +attack_startup = 0x6860 +attack_startup_end = 0x6864 ;----IGNORABLE START---- char_id = 0xd4 attack_damage = 0x2fc @@ -92,10 +92,10 @@ juggle_height = 0x11D8 ;Outdated ;NotUsed [NonPlayerDataAddresses] -OPPONENT_NAME = 0x033F01F0 0x0 0x8 0x114 ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x033F01F0 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 -P1_Movelist = 0x03405FB0 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A -P2_Movelist = 0x034149E0 0x2E8 +OPPONENT_NAME = 0x033FDB20 0x0 0x8 0x114 ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x033FDB20 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 +P1_Movelist = 0x03413220 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A +P2_Movelist = 0x03416100 0x2E8 ;----IGNORABLE START---- P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 From f2c0b55909e269d79e5189c017cbfe7f6df8132d Mon Sep 17 00:00:00 2001 From: michaelkhalil Date: Fri, 21 Sep 2018 23:57:26 -0700 Subject: [PATCH 27/85] Improved punish alarms to notify player how minus an attack is. (cherry picked from commit aedb0eefe3da4c8e3aba81697640fdb6fc406c4a) --- GUI_PunishCoachOverlay.py | 23 +++++++++++++++++++++-- SoundPlayer.py | 23 ++++++++++++++++++++++- TekkenData/Sound/minus_10.wav | Bin 0 -> 165932 bytes TekkenData/Sound/minus_11.wav | Bin 0 -> 202796 bytes TekkenData/Sound/minus_12.wav | Bin 0 -> 204844 bytes TekkenData/Sound/minus_13.wav | Bin 0 -> 227372 bytes TekkenData/Sound/minus_14.wav | Bin 0 -> 258092 bytes TekkenData/Sound/minus_15.wav | Bin 0 -> 217132 bytes TekkenData/Sound/minus_16.wav | Bin 0 -> 247852 bytes 9 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 TekkenData/Sound/minus_10.wav create mode 100644 TekkenData/Sound/minus_11.wav create mode 100644 TekkenData/Sound/minus_12.wav create mode 100644 TekkenData/Sound/minus_13.wav create mode 100644 TekkenData/Sound/minus_14.wav create mode 100644 TekkenData/Sound/minus_15.wav create mode 100644 TekkenData/Sound/minus_16.wav diff --git a/GUI_PunishCoachOverlay.py b/GUI_PunishCoachOverlay.py index fd03a7c5..9347bb7f 100644 --- a/GUI_PunishCoachOverlay.py +++ b/GUI_PunishCoachOverlay.py @@ -102,10 +102,29 @@ def get_canvas_border_color_by_punish(self): def play_sound_by_punish(self): if self.current_window.result == PunishWindow.Result.NO_PUNISH: - if self.current_window.get_frame_advantage() > -14: - SoundPlayer.SoundPlayer.play_no_jab_punish() + # if self.current_window.get_frame_advantage() > -14: + # SoundPlayer.SoundPlayer.play_no_jab_punish() + # else: + # SoundPlayer.SoundPlayer.play_no_launch_punish() + if self.current_window.get_frame_advantage() == -10: # No switch in python QQ + SoundPlayer.SoundPlayer.play_minus_10() + elif self.current_window.get_frame_advantage() == -11: + SoundPlayer.SoundPlayer.play_minus_11() + elif self.current_window.get_frame_advantage() == -12: + SoundPlayer.SoundPlayer.play_minus_12() + elif self.current_window.get_frame_advantage() == -13: + SoundPlayer.SoundPlayer.play_minus_13() + elif self.current_window.get_frame_advantage() == -14: + SoundPlayer.SoundPlayer.play_minus_14() + elif self.current_window.get_frame_advantage() == -15: + SoundPlayer.SoundPlayer.play_minus_15() + elif self.current_window.get_frame_advantage() == -16: + SoundPlayer.SoundPlayer.play_minus_16() else: SoundPlayer.SoundPlayer.play_no_launch_punish() + + + if self.current_window.result in (PunishWindow.Result.JAB_ON_NOT_LAUNCHABLE, PunishWindow.Result.LAUNCH_ON_LAUNCHABLE): pass diff --git a/SoundPlayer.py b/SoundPlayer.py index 0481d27b..6a92b41d 100644 --- a/SoundPlayer.py +++ b/SoundPlayer.py @@ -20,4 +20,25 @@ def play_no_jab_punish(): #if SoundPlayer.jab_wave_exists: winsound.PlaySound("TekkenData/Sound/JAB_PUNISH.wav", winsound.SND_ASYNC) #else: - #winsound.Beep(SoundPlayer.noteFreq('A', 3), 250) \ No newline at end of file + #winsound.Beep(SoundPlayer.noteFreq('A', 3), 250) + + def play_minus_10(): + winsound.PlaySound("TekkenData/Sound/minus_10.wav", winsound.SND_ASYNC) + + def play_minus_11(): + winsound.PlaySound("TekkenData/Sound/minus_11.wav", winsound.SND_ASYNC) + + def play_minus_12(): + winsound.PlaySound("TekkenData/Sound/minus_12.wav", winsound.SND_ASYNC) + + def play_minus_13(): + winsound.PlaySound("TekkenData/Sound/minus_13.wav", winsound.SND_ASYNC) + + def play_minus_14(): + winsound.PlaySound("TekkenData/Sound/minus_14.wav", winsound.SND_ASYNC) + + def play_minus_15(): + winsound.PlaySound("TekkenData/Sound/minus_15.wav", winsound.SND_ASYNC) + + def play_minus_16(): + winsound.PlaySound("TekkenData/Sound/minus_16.wav", winsound.SND_ASYNC) \ No newline at end of file diff --git a/TekkenData/Sound/minus_10.wav b/TekkenData/Sound/minus_10.wav new file mode 100644 index 0000000000000000000000000000000000000000..7258fa7eebd14d155d50af80cf00ac84da00bb0c GIT binary patch literal 165932 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
+Xp6)%0vTi-xe5Q^v2eg4GBN8_ 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�~u{wVpjuuaOBNFkaSb>9fqx^Q%U*t&~%Ridm6i>vRg}Vyd zqOWfbCvqG!$vNx4*1Gn(_7~1)&VgjW_ds)4lt14nx=fGMB^CBuJJE3m!})lnc&)fW zzNA*8!_Vu1rVW`P0+_!|x1AK{XQV<;B;WZT?IZT#kI36gB!N<=(yGcT%PW(~Sr%r# z8JyRn;O!nlBQE$G37LUym{%*ys>)W=1;hjwL*ccJEw?;)H63wV_(^i^h1K|wB`Urs z)Tl+O;)7HUys;$OuU5)ds8%+ReY9VJC0ghiX3|KWjVD3(gI?2DSm}2P#b)tM_Go*V z5l@roQ%Y1;BnL~B`$PO6(IYg(V?V?H-M^2-?KSwRuM)2n3(xOXO3;uUgZm(4cb$`; zqyOoQL-3WLvY?|v_KB3G(rnc8gV6H4pah@9M)*+wO-g1G8rhe*JL&-U!A+_Wo@9b&YA5cO+w_MqvKZNGdPm~hVcm_S z|LVz>th%Hlo^jENSk9v-P3w=b#)e1+1F{nx6aHtQ#3*tNb{q3a5{!&=8@GVbuHkm0W z@J+gwcQtQ0NhnqGD(98Q<7f|=f$vBq>x3SBd+s)pq#p_`bAH=`wz#H@DmY0-W^)|l zlhL8pB5|U_Gb{WBL3g;Pn!p?D;u8j3rffb9poLx z=G*B#$enKVYyI6h_hevS%h6ly;T@?2FZC8({sS<|#wb7r1ogwqWp1!P*p1_$i|xS| ze3|a@CN~f639qIrv++XNV%a-*zH;u5nvyz_9pWu?CY8mz*~LE(ya>nwa`@tlQ6H4` zpC_lgBPDprK7j-9D?7&J;Emb-O#c%&W=645T=J)$^OB@FI|U(cs5YIZa7T@2Vsivp zg3jSM(Icd5NT-nBL!PkXEkZ5hbNo*JjyvZg*z0xn1Ng*==Zi~;%80Jv^}fQl(l?j= z&Jg%pday(%9OlmO26E9UPJ-X<1UF|LiN0c=W4Ln|9ttN=Zmc3z=c4n1>yoREr;cZd zcac}a?2+M3^G@_m2B~ZZQkmfW0oL6Wo^%~wOV zb~68FzK=Hg809Fi7tF=WU5PJW1M)E&k&Y?&BSg_1DR6`Cmpdr;Y|fdSyVTpoi%LtbMC{ryH#wu0N~4sMi^khIxiXhJA+J2B{&)kgv-n|0b98shZkVnw6Tr z(G{LUGn}c+Q8rUHR<>5ORft1Hp-f_{q#3NhhU~IjbhYd0yhkxjp9<;f%=9V6S8Y+nT3Rz-Uf@ z+aJO8s+YWvygF0B0&uV#<^;i8BM$Ato4|WE;e7(_{cZfAoR8hSf3Q6r!=^Lc`wKmT zj*^gpvz%w0pIe2bY50C($&S)#Mi|)#Q&l@mISAcVrDSNlk9tyRt{JzHq8u%HOcN zXbLj713c;lPB3$V&frCQf?djS={czjT%#)UhEg2*)0gWDn96i`o^!}PzXB)V5sKnK?VSBMwlTDHDF~&A1&7 z2=2^y9mvfR^pa(mn75j*ST0){q48X4UrKI))?v5X?62*w?2R2w@Vy&~RwT*Qn4P%r zK3Bm*paru#jWAGjvzz z5ekMGZUU`HAXv)meFeqen9#i;J3{{9yp)2i3%(=qLf0)zlvCgDt+B+-qb^QtH#Ll z2`Zd{t6wc~4RJs8Bwu(}e<8cG9NBR3!a3{t?z!i=?-|RxTH9CGH=6yi(Pu*Y_uadd zBykRu9+ms8uQW6buQ<(=dWWsPM= z;6en6L&RdZWs~qKOb0=F?tAVNu*gyF5pJK;?*z7Uc1QCrct|RFFJ{|j;@Z*K_5yCq zC-}ziNTP|r$L@~fI*F~@9h02noz>md-EZLtPT|Ig<}G+cA7)~|t?NJG6Vhrxvb4fCsfGf8_Gf6#JeL;0mWvB0HP1mzov5`D`OX%#-S+Eisp&iolZ0`z5 z7PvyVANLIE$^I!1B=r<%)dCa-WB7g!`rb|QWqjOO-c4Q!thSQ8s=PcLyA7?Y-u$!Si_wu2m0zFF&T~ftBc8Y$RW-WhOaHzJ(H;s0R4dHIhso z<9eFRj9gD%AGeE#_>I&6neD{3TK`ic+(_P-$z3JS5WKo%(_})nl&~xKK(d>WT*dQf zIorYmedB-a|C17Kjxzqz{xB-q9|JO2pKaQFSUvCj0!ME=S#UGNGsUIxPiP`($aK_< zZs~|*DSPB-Sv20rg>0HD;XOYMwP<^g=UFg3rb#}K>$p?2Q`7{_T2p^>|4p8eR=zgA zmOQ_L_O&$r$6cLWoQ<7LVH`AYo^_nZU-h2722M*tR)x@G2^y$njzx}9jkZ?cw}X1F0KaT{w$($XtU z7j0+Q@RPMFtx`J}H?!yJ=Qxy|P~W12EVNZ5W!G0WRCZBxRwkR$$f0Kmr0CYDCKkyo|I_zay%bqds zd?4vY;HC&3r+R9GXp?9*ytj0`t6Op&SV?)P>aOHIiiXzU(z?pBZzkBs(bnFE1o^5c zJZ{YV#=^8?Q*&FvucZ4U>Q_)k& zQ`8fShBefah5F{E`_9j-L4k{N72fGv=L_dvG^~s53+xw2N~>Y3YC8dIPVmV$n{DP? z+$H2V9kwlKU2qG3wVou7O7g||$C=7!fzfWFV!>;_=cnW!#Sg9-j{nc_N1SAyVjf`` zYT01jWTgqT{RM^`hN|@u{O28H{f-7J26@GM`-Zp^h=oWlmVXaQ4mwK?T6Oje1MnJH zL;icR`n$TiwyL(gu7YlbZk2A2Zl~^`?y&9$Nt@;LWywitM5c;ZzlOY{ENvDppS84t zwjq&>mPYuA9fX4$3Klh!1m7=;xSw7}BSVLVo&i^_j$gu8_F%_@j|C479>UEa3Z4q* zCJ`6gzvPoqc+BQWPnUPWm!Wge??E=X1?2XHJQhCBHflGefEO_qyjajeKj%lAu;u-o zEwA9`-xOSaw`>QuMj5=p9>MINDorNmC<8zESNLm|1CLURv>-9zq9uW4fzCWv;qYwc zFncaT+qn;XaXRlwIB!J)IRtKx(=(J_iv^o+n{O*D?;pM|zBrJqH@-3G$8MtyZ^m3- zf|*#ru_DoA{t0ieDcby2>^1~GM-%uVCF!5ugR~wdC;1lmmWBP`d$ipqDxBnj;rP|H zf#Fnz?qA4!9fudg5OAqX=5D9o?Jq_)bICv{tbc5%q8|A-QU9Y7{omliOhdur1^&>` zC%y>?ykZmg&JC&ty;=i`_(49p$?dR}ZgL|o4+EerDfk>L4g~yu5Ze>{j2r!ZsViW# z0v0RqhF`f~yWiufWO18$ivM$0;eA_{5yTaE&4+=jXgKoqSFxU5*jdrt5aJ8YxuLV{<)A#yDv z;H#euIn9K;j0EgeOwtQ~X1^5S*G>ygWs3NZzo(H~*bq0uRWO;Ckiz~eo@T%N{O>k~ zZ2Wott|X7?H8bsgxT@(vX>dk`nPN`RJUT5QbK*ApuP%5mdCBxz3lGW)RvV2TxTdI@ zXqb>U<^SX#1;_A{?;TTC4c{s6aqo8TPE>F&!K8dR{bzC>pWr=N;@!`Cf>^@0gLk5r zzn{MjzKgDaFR&esXBZgKR(dm`cM;({eiK*Jc4T9$AuE0(`-Zc!6WE-Dvc>ybF8F?z zWJh_F8N&*vX#;n~5S&mO!8yIhsUAa(GQq^Qkc;D$5UdKk;TGHvO*ha#m{%*^$30zVIpneiL zp*dv2G{9?Nwf%o&G+nUYrY=&qxpC6*n6B-pK|eMQC)>7;TlO2I+nVf;Z1-*N@I(@{ z0Rl(*HhyA427F~pCCdZzL)`MGnIoyw?Cd&{x2+|YNypy@7Y-pQ?R()s^I-EC^J%6R zxA{2Q-%N56_u6;adpr9%^XT^ak_{;6a3{jmZ2_0G6CN_ZlLAm4XPHaPtaU=`gyJxu z_z$1+p*;Cx$jeI6e$zH3_dHvdse7e=rQc-OWOzf;!CJ#QLx5bMVfvB!Tz+gRH;Y=Q z&~?=QuI;F4uW3le-7wV%)mPWN@Z|KWFL-L6=a~bmI{S5l!OH9PvVNoajA%%=SPcUP`xp_n2qX!K22a z3Mk@z2g`8|_<9*nDNhRe;9D?cuDP$f6WsCc(w?%gdRKc4VDq=Vx4d(FbA83(1+Axm zX8acd=L2uiYXnQAk~@<7_->_eY#C+)krtf}k;+}iold0JYb%%rJ7I7DIKXpBHg}I_!3%MtT z;-_&P^wz}3CCI>g<$UcN0n1b$4m>+Lk#3zs2ErV6;*IR}arcR|6AWk@ z##^-2y4iY%bd}DQj%*j&T6$Qz!rRkZCYZ;Yg&YPUr>I_G!@^nkSnnv@&rWX^|E>** zN|A-_3fuEmoGz@-OmdB!q$ZZ;mQTDpLhm%!Hp@1HUvVjOkl+t=(6!H%<<50aL5-ti zpScd#%CC5`mn7eNE*WhBnOMF^z-~a_!^onnrKqjwPkxW!%Q#IvRb5ZhKyyuVg=li4 zcA&PO_N4ZVR<4ukYU}DzHK8@SNeDSg+G8JPZkcwoW}T)Gtz&0)3rE3dYoJGYgVX9d zs*Caur4JqcY&_>O@Kha3m7}zj126U`a7nf^XAHxgwj?mXK*C^wjg=!rdbaSs_-6_rXk@3CE`gC1esJ ztqll18-k82pDd3ToDnCv7y7};&+`1hL18nVpG#0efACbGhi?ZGU(H(srBykQp)qiP zf=M#J;p+{y9mmuwF!KdYw20zay?xRrR3Xo;w@r~Fo8tpZh<{GT%}VMQfCFt!1%y8SjKZf8q)(EMeW(>4-r+Qgq+MI zN`rqy6H!A{G{K@7cskstGwTDM@CRF)8UE=^Qh)kW;4%sCh@Scr*Gi2?;W_C(%Z@MF z-NV%b?#F5N9G#qX@W=~;D|Fa#*b#@eM#H_Z*R}^Q$78lUTei(YKflzr*!CVqYZDwP zBdBuL@;KyGWp2n3Tm&ptE!CK_jkr*jwA8ZHw$!I8QPGwdoUp?9r(Z}T>S*a_>Cb;# z)skXP;`Bdfj$=pH!qU>R!?GPmyG@qfmcEu2mS&b+>?zu@yUvD7_=l~F?SHm)+%)O7 zefItMnCx}jbl!4a!{ckcdy{)4eBNR7$=6{6{((1+2yNV2^dVVHWp%+#j&dT`B-7(r z=)KUg$|}kMs$RSsv($$*hcs`sZ?wuTs>IAJ(~6U8;s zOyr5v^BI%HElI5nL2(`b;ZkcK0J_r70*Ingx;oSJ05&8SlAy6 zS(Yc!Tn)lkUB+{>3odB~Sx36_mTcx0{@kT~VlQ@s6K!}Sgp9`Bp1q**XFQjvUDRKkokRIN&h^al+yO~#=&jG2^~(E~Z?X?C z?XA<%Ih}&(w4^ za4oQe4yprR-yEj#->IYM9g0$4z!dIq%k88(c{_OXJ=tuWPqTek;hD~#=Qn&vM4kXQ z<2CmI_Rt@w2HX_eJR4CeTt#iLixivRQ4Q3FZQ6u8bsj(RKa{0IJOW|vGXLjc_g?oZ z7=cyYzqlv4rnokugGq%C`#=0udVu?inIk&mu`|;4r)?#^3yGEl%Ph-GO9|eHL*`@V z3^Id?6c#O9R4}KYC)ty;sU2`*C*hKung1hy2#M!)$h(_QigQ?j9{2Ly1<{2uh1&|Z zkTul7T-*|i8?qg2cAr)7hy4XVx`o^kg0J0a_c^!N>+{HbA-<|`VOMiU)aDtujqXLr z{H(;Y(i;!!+wAU!hV~2nO4_272jZyegsKYO+E1ucWJmq2{aY*Sv)Ad?>lRXz$Rk~+ z+oXHT`;nykuG`Nv9!X~DVeNixU+o}m6S5dnHJQR&pc${8NaoCK5{-wedNOe|r_z+E z%4%e^4OI+L+~eJwPK}_tQ4yi0(0lN^XOSn|IHXxf9(%nZ_`?0mPP_t@%_N=zANCI3 zFddn-Ptb=*Ab!jvofPPYzI?*ZJ0hH?WCKn*b*Ka~OnPvd?&XR94;)tPllf+QXL9~m z_ZG6@-pW@s2wY?VzGJniuH@dHbRTEFv_k3e;uiRx4Q(1edF?%F`li?HruzE&({=sl zYvpeZW5W%P>SjRbY2wH%?f{4QJzfW6B@-n&`lik3M{~FX4Dic^?5Q%cQlw9n{>cS- zCVfV->J%JlHE?zl=((nE&Z4Pw;+r>u+5HmrmHI@zpoEW?P?f1?_;rjEj|G7W6L03{%M9c* zxl{_Q@UQhd@O|mU=4PdLm3K3rn^ho1yWw2FbiTyts=D*BPjH35nL-)S|$HU3Cu2fT!&db><;V>M_G+o?Q8+@szt%0qgt(5IM zUNy(9hfn~`!eMxvbt>M9f|pSgc_8P}h7Pg}q zggMF*g+us8OA3`lox{)g0)MY>ZDj3h>unQemS^OP&vnjm3d`fK_`D%Tc6Y*iY`t%_ z?==|ruXLqIgv8gG3)`cu+7z@g=pZbmlkA?JhCT@`r7W%7r}|qZ7!^wCi1usuX`^+~ zocf1#t@W++xAb@QPQ6v{(fj${q0iUn>hE)B4AT$P-`73X8Objca?{>u-fB8(e$|{+ zpHsh6y-_{GWA_!j)?!TG*KwmCLJ7XUovGs>QaWl0ULwVqNuBUGW$>lLKrw|g{|gyQ zg3k9myrfO+Sh|o+7bA}a*C_!ba1`6B&GJd|DXXp#tE7<}_00Dy zM)lYI=UI4%{ZvIdsZQ)M8Zv*j;x73@-oy*IbvIBW3p&R$fq&5U1~Z9o=l$r2gNIMN z7%uE%$rCo(DUu@G54)thrF~?*WoeX+xqA;xKmj`qgV9)%>H&+qCz*|vx!nrzDcgl} zcU3Uv-MlXz?gwEn`3BFyRn#=9D|5q_z-JU$>VUA{IE(k?9N%o;C^&oNe5HKp9Pzx6QK&H_UFHeDZb=k&|(V89K=whht_i^TR`TYqatS%+#sq%<8!7 zb7IVO52mu2O$A*<1y?0kb*eY1z5*5-@BG9YQ`>n0x9<*=5}(}-_I37nTcWK9@4{N^ zYHI_!r$YLrh2+U)o73q28=H5-(`yNa+LUi|$PHdzxQfK#n(XqnkqlR}pcQqPN}ygB zyeha&A+0VLTR4W4)vtv$%+<{c$j}k6Dgm=9Z7plfqi6bJ`(#VTi}b1E5qSYy(FVZuuahg#K^ zM0OHxUsY*!=}gH?$pJi-?l6tY>7ILXWBkv*!M~p!@j0FoFN}rp)MNK!cP?LRlPl77 zlzr1N=PACz0<-xu8F|;8x2a-GkI!AtTsz!5+&YLp z0UQh}CFAxRkEU%8bIEbeexjB{$JvhvJCcRm8UBEuJztx^O>_;X!BY$U7Qf*CB5+yC zpvirWzEPMFih|`{ge?-reqO?7;5z^Oci;?x232Nl7ZmRJ{Bk6TV! zlJPnkVIIZvUJoX$$$W_fHaT8oo$>ogAmKMBKRdq-&-oPi;H{}g`44cCTS#it&HRPr zzVyP&{t+eQqAh{bv>Q+QmgZ*Wy4)2~#3^0y!R}%0#;r2XTAb_}DITD&?a%EEK)-}N zL_E0fF6SQSA=iG_4N#Ihu-W&3A`bTr`N{R|$LHuHSjZ5`P|0<)xz}YkWcTR3%aVEY z0-u#$if(Yd$13Zp>Z)q0YpB<2HfVGpNDaxv{7ia#NkeJFXu~K&t|8m7(zwQ`3sZ+R z3v1515EgdCc+gnVSlW1jccvq`o5KB($u8p+bH{(0d!(lLacSR9GFT~fS5j17WaRs3RKc6@Ive0^(WvkpV_xHMZ-Ra$?<=1rG>sn z;CNI=2lL7E2{)iJo+g}uYx!DFb&Ur}c|p!bOZN)&F>Bo`aX1@JQpq?@&v>_xoA3sY z%(E~UDuGpw1;0yTQ*ai%=_I_@x#9)b%!SaMEM-C17-fR$rf!?d!d}5}BKiy+_!h_u} zTrY8vU*`&EOE=m%)_IR~ui=gnobVk{Gk0>7puXVWyq=n67gD8XlcO}1EnX|T;4^*M zb`3`OY`Ucu#41W`x5yn@Yh7jSVC`fTJQT-KXU%8PgQgW$=iGl%@Q@^y4FwYl#*%YX zvS1Z#?<;v1^6rzr9g`cL`!VNhj*uBRJa<^`wA`8GB^Ap(o^v{9YtE(|W3G{8dQa|G z@|Kpv3opsfAY_>pGZ*1*SZ)d6&ovgm&|ESp4!aJ!*3%%NDXcD)YD_WSGu}5I;5{hIn=rsI)UZ^)K>v^KUtOX$9tTLNwiA6) z8l0)y_|Yv5=pb$JDrDqvqiKkNsf%Hg^1Ok%=C z)Diib!3SMm{2!!7xN_Yh3=DqTf3lc!4Y%| ziFsf1FgebxONQ=KGUm7NOn1uZoO3Pva&~4`PF9tyidpfQiJ3*RVzMr0UCC;b-8y?E zwUPRi{V{u0&g!4Jxe26@IrDA#r3=dz9xxv;Pq$974zUlntDOqx6izVVZtsI1avk*k z?ZMW%@VTrcs~{7&1tmyVoI);oLg<&!cFJGjE}d36!9(k7>ucxg=IAczDW3hl#=geO z#*4;qdY-#sx5KW7-v~czI%BFAQ9q)1L~O(X(=k(hQw>vTQw39ZQy0?!(;yS}f2OJ7 zQv^tw|L0EF$*@yleW@eH!^WeAqlW+V|LN=M>$BbV>t5(y>pJT?>PEr~6gW_`z;Y8+ z-${5Kp-NPKSJou~WExpkx0tI{N99s1n)EkX_na!c7pCKpQvnaOkM6JT(Vo$yLcI1=25;T(-Q_LktHkMg1rPt; z{!n`JSNOfGW&_+v+!%Ju7qo6eanAfAX^Hms8A(fPIM;tgNg-%O4pYOKZHCbGy&*ec zDtF&kxG7&LL9bn(O^XgRS-{s!)OWCgiA+Jy$%yViVOAkaKK?JYWtg@D#wNi1Y~en$IP|C+n1}E0}3K zdix1*_hQJNDkRnMG>&@Jc=rFqYxER&sm>N|`(k}>Jw|5FQ0pM;3w#j;J%2N_KjTQp zT2Qc{U~&GU{6pm41u(Rkl{+i5!ZmT!!IcBHh@VY9+!hjk0<9+qJIV$3yI z4BzOY>^hIGyRNJ54V>8?+Fsgs%+KvKZ8ST{NDWd;)mv2CR9z^$(t<-_XXOgTQd|Lo z71^QLC`GeyD_EmR=o|l2 zA6Up?Fr>v)M~ z{RenK9d7CFmOhpaxRFdEJE%PcXj)j!Qq!`~I@fx|cGDKXeQF9^n~v^Z-2yM^JZdlD zxm(UuaT8|VCj7kwf3P)*)ryD8r^x!F-)_5{6 zB=h5@{Fb}{zD{OzYj@cv4+dX->VNL9hR!$_)09S@20uL@zT*k>fV=y?`>tD0e|CWq z&N9RX-s$l41V2cDi(3YsRRp;33-$;DaMbuh6=T*AW`tRIln7osf|u$t_6g5^`u^1P zxAL|1UH4q}%;G*%J3<{AIUzN z-8;Kic4Agy*66H1vwCOsqAR(Q)h@eT_TSXL?7i7bvX^Bq&R&pxE&FD6v7FePb2;a8 zI^}lC-Iu$U^zi1n%{a3wW>?Ina4BJGBYyE zWR--58Ju-J^J-=SJ zyZ{A$?qm4_c?@2%<;X9&pt-71>qGSoj17%#!rO#bh$shj&>Q(A`f>EI*rBltiYzLk zE2=J9t7x5~6^oWH`nJg1BIa0g?9!MeF~qq=J&Al0S&G^gu{Gj^>4d3Lc*XF!#<@m0 zS|1BE4;MRShsLh4scq!!j)Ji|O`V4kd_tw`_gNbA$C$#qvH_&N4L(QJ3ThN=&flCbg*lp?o0D5Hr(#actg2b#GXBa? zrw6CsNV}6Z`uoW5Ra2{^wn}N6ay9uCjISC0W#7$KkX+i1^GWab;=$zk#)c zgsZ~a(0%+9`ETT|sBKZRqUS{~jaeA;SM1bSTdXDaee8$Wvaw}iGomx1Cq_+(Du^hE zcw~BHdJ+CS{2F~qS7SG0nm$E;TX#>V1pjQRZKk~jSkrjgaL$mR|D+!TC#k3Y z54}!r)F<)mA5`yGr^0J$P0nB_9znt!*ar>q3i{?LuwdSJ-g`bdKR88pvE9r@@V5Du zxvaT@`3ac{N8z0a&-Oy|B6DZU@0RME>3`tcDshM${au4yebMahf@koUJ#9ZQ)L+Rh z6ueWX@=W(r4OG=4cYC0Am^MNCS?eS`qLi+bu9B{@Zk=|$)=ld6-^$&}B6y${M^pJ+ z{z@+Ft@oi7dVOsq<}Q_ND9G>v_t@yM^3~j^xHG;U4tHU-Tx*hXl0s z7eOKCvFTci1{)Yw`bzdnwl8R3(090oJ-Ns9WD}o4&(t5LZZJ&Ul0oHzuF5XTib;!0 z|HFT3BfG2+_7@3ge`@oq>>)2;Kb(b5_-;+IOtQ>3&ofsptWvl-e@%Y#yry}APs-H1 zsd*#vN91Qv&(P2BhQ%3KV1n1*rSJwkoY|InmJyaAmPh1tOf-)%?=v4V7h&fVO8=fx z_^t3>{=@vExrcI_i4bR zw?7mAOgx!zB4KgDvV>BJMG|{_>-+6}((9z&DScC{spizow5+ss8EZ3a*^cZ?eor>O zo*zj7no0Ivl0VsB2c6O!-scw~FGFHfQL47ucG_}=vWBB!N5WQ^R+=u*XKNzWk=6)X zM0P|*#Nfzbk)@)FM=gq49Q8FaF0xfbtBCpG^TXSPwF$dyyke|Pl>w{VuREX{tNjx- zW=(CJ_N(?U^!(*?6?L)NC~bE#)nAa`I$bwi*V)k7@Q1OBalCPYaUxYbtZ3Mn@Nwb$ zO?yqT5k(?$Ou44hrjw>Srn{zeYN%<5>3-P5u(9~=_tEv$bPRxC3DzSo7qED zd4fYXq+s&=bt-q4_aSA>`KlqcC%;n6sLI)}5pXt^7Xx`g!tF7fnkC@YG9#&eG zS(f6fIMFuV_R{v+HWwW7y!AZZTyHEzEX6Fx&4#Jvf7Sd+OEmV8_C z?F#4kzSMoGnlx?NwI5f0EY4h-IX-tx?$W}gg-PgTws2;Tbx(FzKz}rr{e3^QVs%36 zhE^ian^#QLNZUvoV~92+ge8RCFx@bXju;iu06Zm*`SJvK%0km3Q#&dp{9E|w@G;@f z!k&cPH$E_SFtj&p)os&t;QhF%xvR<1WN7MZ8){3V)gP@Ht?8%kr(VHnJ(x4@z3PMN ztopQir)H;Sopz&khij8M3`Gsc^hcR=`{}py@9G%p7>>gNT4h*nxDV#J zgI}X0Kc}Fb^kKZ)?6|D75a;1ZoL2`z&BP zW$>#Oem#MkIzur-Q3fyQ(aJH(C}pG)0g+-)$lj2i{9djF-3A4^4D)nv&{O)pTI3r{ z!iVSstOX(8Sd1g!V=#{5-coGFyCQ9OcvmnL3Yx|w^y*%I&%&%QGB7OAh(E~^T&|1B zi^?PA(Q<)nB=GYV!jYTLTv`gX!zk%!X&fFjUtxKc5El~*UT8V^t4jQGe{J;S8{i|a zpk}*fxn{t}xdH2@9=*ev-p|gv16k1FYwd_xGzS5(uJUoH#_^d`?`C3dXf0s z)w2k^akp!SO9zWHog5TlHk}L-bDfN~o9JTp*$$AIyu*6Va?x_yeB9iKKBRqq%Y09c zDED^O^{jUp?=z~W*GxZ?b|Nk0yXt$NlpZPXlRhP#{C4!)x5U)MQasHK6PhH{imw^J z@az1qr@o&4niHQLpOKi6SU$Nza--DxsddxprwvIToE{+PjDWYC@&%;|I>Y-sXy0e= zz%4h-Kg7S3ER|wGu|elUE`}_ECs|EZQ?&wp$`1Wb{Xb#n!d{x5nmR{xi#X4@X$g0Q zn@oC>&lE7FL?lNX0x!|=ags67SlLj;@VmZ~{v+NJ?RCv{E43T6Q?+BYR;^DvMmI!v zLwisARsBJ|QMpxF56)+6u<;Jym6KGHRUOqG)a5nhm}P5dYwD`PMIT*P(@0|g zTbF>R=+IHN$JgZwDonjrt-Y$guI>eIN0=>n_!RSS>iU<=zy@rYwy{Tjh@WB(8>TY2 zUDfAaN`}ea-rv@r=PU5dVb>Xi(_RqV%mw}>{z$O2eqhWy0^0+#&=NM4wve_Y|F92x z{TP@ry+A`o$;ZiUWR2?3pY1`1Y$v0~9qJ5yqI|5pq`szJO@8=nIx8#tu$Jfza_M%P z)8kDD86Tn|c??F+Vvj9z86p1JbX*0xxT@RPhto7 z!=7zl3(H;bC&#YB)s_AKZ}?#BfiJWJkK7{g@R#$fr=S5Uib_8O58ykzOMURqZWq!H zWpag(V<>|ewZ$Gw8vn}u0zV43 z^RwflBZ*AXuI4|?8M&FcmB7N^roT;({t@%zVd}lqF-a4WJn@eB|Kc9R)rzYYw=r%@ z+|#(naiii!$4PiOCs1z8LJf&wiG|+^zAaB)kvuweL~5fSO@92y{GRzI=d`v!TVOA= z7M8GNKhryrr; z%Z?{9JUqM=Gi5?p9H)44nAGGC|1aYHPw41o2R}1Pb<*K@9133j`RK9)Plb*!>v!Qj zH<$t>3|fv~b9o%f?z$x|M9rJ^p zs1?5I3*m3KLq$*k%hS(3b1)2f!CS}e@^aSw;FOz)UiR!yZFzfpCwnn)8zEceBdGgz z_A=wRSH3X!_6EaS%{eag)uYjYbrN<&a40vx#@U32Xo18c5wgyAi+74E!av>&%Pa*} zP7QfY{4jdT=|m*kd|Q0w;kLZN17S69%Llv+U8F~UAVdCr;RiPN=g5QKV97xF@xlIH zkc6>ukFm|R&$K_`S?z{LdIx;!d-5~RM$?ea_DYI_qZd7p6JL%K%&n`XYovni=OVj- z2QYGwskx593~R%A-8SpjtXn^B{%HKY(f5tXo0HXvip1V=edAtzdikjcwSsyWUhQ8}ynz@OsOYW=N-kK?O_XcsboA0@NWAM4W==wK#WYJ3Nik@sa8+?+rV?816Q8 z-Wwvn?$_me2+iP9`#5u#XZ69tNMuWStk77ih{ZBp#pi+2F{-d2WPV<0M@1 z3Q_W(g?lg@Z@M?ASE88v(n3;0rjwaCNT9wQOus?9{FeTzc4+m` z1Dum-(j@5u*-}|Yp6<>#*@=QgLF4KBBDo<1oTfY3B45ZFABH01jpMzegR`Bple>$% zB>G?lzO7Q~BAdw%cyF%cx!xJr9att_Dh`o^O0q@SqJDVApMdKUL(e`2fBpy*?cpAS zr#Cw*qT#?PJGk?`X74251mAqm0?+T{MviukaMeeDdkfynAL8EP)~J;&KAZ0)N&+k2 z3!aIz!eSwpd_G!}nea#F;1CL!?)!jVK%_S!)Oco)~ z_N1}GE*9>7P4bRZUX`~gn)kz&!xmM6s^E{jKk|y@7R_yw)h;VKEh0??;59sMNZjR5 zS3ikA20jRZx#4fa-ky1L=1u&&gm-zLazAO~b@5q=>4}GvjwWqS*_LuM?Pl7I%$u3h zbEoDGEErU<*0RPTc$EPE1ca>fjiH-DzbjG|vCKc$mA8~fR0mYERr6Hk=oh=eWyw@# zDtBpjYD*YP7^j9!3wvyQXuNCq&v4jq(4aNyjT)oMIMp!CP|8pOPD`HQ81rV7DHaS{ zY_hQbIjGyGYYOhQUvW^eFJyPfn4ob%JK?_W#!s*Wd+rfn!_PSjlJPowP?WcZik zZ_@}Kz(8_UcRF@Egk9lr@?ItQ7DRbsJ!jzEeH48beZiC3g%4{C4x#(V5Q=7xFL(qW z!)akESz0SkQl@p%~td_WA@4Y%;iME77}a*;7qIbFu-&?IYhq-%6Y@(@3lgfm3}S z{>NR^ia*fNcw8RWubvK`&FFGxis!&H9x9nl&MuN^k-#fBj+b!o-w`Dbv%Yr9DXb75t=sHT>tmhJW(_8v?srzK}3 z(}Jf3cT#jv_?046OZ46ssHduDs(Nh1cPe%$nyXr<1Wm_FIEdd(KTPW)S4WnNDif6z znGva?j+l;`qQfJ@KNvq4+ffUsG~;*UTH`w7b$0u^H2XAVl*P!s&kTNwIzz|(nT)=` z%ucMGy}kVbnPiXPGNhZ6Nov|@o@g0k84LS49(8d;o`}uf_1*#a>^%m!f)prRtNi|NyOTH3;qJi`H9%teOK0`7c_rhFB88)7)gZ>w^ z1ec!~oYBaql*Q2TUIaHQk4uB#Y0@LOS8z)*Q{UqaR2)C5ukgtpQ~#s3O1DY%=+jH% z#ZZ}VLKfH-*;d&v!IgqDaIpFSMt2vCBadIx4Ey}4_@Vfj=p{4dMEphG`p0t$pA?-J z{fQ3nt0-0U7qg~}oTlnVCXhAx zhTTsOaBm?;!61$xCnsApkGWzv8QZr=>?z|ePMXnG_ZUv|;_UfiV3ho4zGoJ^k2k~5 z8R7oZJ<&ae&HZHeT+Z)%1%U#i#b9acXzh3pms-e6w&Rf0315%hs=caTz?-#b_ZHJfdg&Q! z>8tCv7`GT-nqHYaQO+n^j5}sn?10!QF*9OrMqP_q60s~IBP>0vk)fd>6rIvPntwD7 z_ApJ=E!5%c5c??xDr$sO3)u-?u^CUlU*U{OalH89Om-HMk=_MG<49cNjusp%2*C$J zhKIYsqO}ApVrwZ|N!t&5nth#XqpPB?jPD@HP6@b$%uvlyrRkIP6WH;ek2)K5G3HXt z_1NpNS7Wclc8cj7(;>25aS~WYG>2G{KF1#Z_uuw%QyqfAZzR@U(br@ z`;lI`7C06-gc)rse8bgXBbdX91>U%DsW*Y?m8klr68shy8s-}w>YnI2s@tn;E9xqg zWQMoI$sWm{vq@EO2GhiAif`~|m#>*8DD7Vy62 z%a+O7z)RZ&6F1S5;HmGf$L(^;-4&PFq3+S{bi4}&qB-4T-TE^lr3~rwL7eCJefNE* zVRh9M)ew!8j+7pRDSAtB4TWYvkrk2_5(tu!F4iTuTWHVFA>@s8z!h*_XalpM*XMsi`TcuQFd}w#KvkW8Rm%UkWM}5SC-UZMkhZNnc+Y zMaVw;ZhN>p%Dpf!C$Jv=YLwEX9IhR%9Sw7~f7pPqMc~w>Oyx{}o3@)=AR-+jevMel zv+SmBMqZ8V6E!gEM`SYR_X(37&PW00<$UEl<#`;F1-(!x9PbFSD~`kS{(`r#nTnQ1 zNej_aGDdmhV5gSFgQ$q3s3Q-p`8M`~&#Bg&8ISGH>@%6;J3G3-7;fOG0h50vTCazE zev8nP&z8-UO$?b7a!`Fhy`LHPW8~Y&4>4b2PR1UK-4nYv_Cf5u*psoRVk2WrF$>uD zhZ}Xqnc8{ULF&Hh)5>#7D;&jtIfJF-DGtGje!F{%yE1!`a_-XDxrMlUldGPM>CijQ zP@C8xu0vM!I`n@PIG^r>-VGIaFR!QwMWo`Q{DQm*ZXYGYr9lq<5Wh!P-2vuz2yVwh zFMJx`+gji=7sMCDx8R?*M7I=5UsxG$k1;`Gg0KzG@FThdv|dChi(n8RS(MtlO=yE?fRp$-u;qQa;S z_;!8~eG;`G|K&Ovx!1^ze}fk-A}sM7$y~`Kxa-f^$cL~ax(kPP4ruf@d!oIcs~-+H zCtX#@Q~AyM+fQw2b+|ZFJyQjV4eoB`{af&GcA>rMjq7uz(8{4#)mPQcwavBFHPtk& zRIOD4{`o=iNikV5NpTi0iw0-}B!u>~z=3KE_drh+dVk?h(}!*Sv(#s)eSsOuKl|G>&~y8<2%JKh+hwFu1 z15remc9(T8z%OVKIZPj|Z><`e4rWsW+b6h9pOxu`CoKS zfl#sHHaw8iqB9}^v(2z)*yp1G_#LkEINJo<8(8_d#5bp9Pc=B%yZZ`1+)H5Rf@jGJ`ARvhQ;>l@XnUc8+Xr_>_Z20Lkor*rp7bB{ zZ${B5{GzGsRu15;f34t3fhE_Pn+QLoTw1xb;>pF6A0<9WtesdV@oQo{7R_$N{kJvWCL~Qtx|Mn(^?b&K3>HDTLRQgfc#Sns ziBDpm`>*$+w-htUDR_e;(HGnz8=^#D>6HJPIL&*w-8F9!XLJ-zMlT9?u@P%T)%d_!;6BK2bYo*k({NwZHWeVADXN% zX8ADOkY1rLYanVM+K2w@U-o7~rq5Qqgc|tk`OkUJdvnnH3RvZ7vP`=>{%~BhUa`J1 zzku~#)V$2R#5~zD)$+rdY@LE9N-~+HH^jHacY^tyqgOTS3UsGnt>?w$#xS~;{I~qS zcFUYm!5|8F{XW^mrkNBLpf~=yf2$=Fd#Q}xTk1>c5s}ZUjpy{hI zlYg-e{-PQU;A_%oUgLXF0?zel_b9iJJKPYLKA{IHi-vDH^PzwjCj=6}t7F9z;BLN$ zA^V8z#RZ{rLz^mFDF0NAX3u$7xeC9YrR0-NM!}PbZ+8*AF2dn3zOcWwH{&GmS|sQ$ zPg`nP>k(lj!I3-O7K(1I34VL?@hw!cnExB^zt8xYO~%9Lr2MFSU+}@;THrfbA$cJu zf{q3)=Y14(9X_APf7X54{lNanK8O6P$>zVz_bhiU0h0!-L*g;aksz4#+g?*I11FzgC4#%_nx%-t{&hN7a zu4KL7U6sfzk+~s#L;AL~ZE5w`&ooJHm^>Bz+$z${+`jUM` z@QM3dvRCpB{;`n7{uCcR7pl)Srqw2)$BirgrTE;^b4xcX)2s|;^Q9EULW?zvX%TY^ zoV#8`qlitYBH|56hBn$3+6T%6G-Bi=;ZiM<^=wZ!xiMaxE)&8=Xmu)Wg8 zO7$x?saU*hY}xw78x~(4wLEG*eRUsYZ>5m4+y$Ne|7ki4xVF<~3&$aWU`0v=hr0XL z-QC^Yz1_OIySw|=-G#brw*qaEpur);ll#2fd%yY7Z`)EV|M#7lGiT0OZeC>$DD*8{ z06!u;H!N3(2WI0vlZ#fnm_tuRr|uy7d1>GXk$9n`!_5-fyz6zMIH} zr;&%No9jGu7K(fLd&~j@N+liY zOjKTv-0r!{aaz#fzmt)dk@tal_##xp4ht@%?Wyf5-u6>DOX68vibif}O-ao%^-6WD z>vyuod%EQ>uDkH;s6lO33)TwAgYS;wJBoV;6$|s0nii|59Q`i8% z-EH`fy|TZuci;~AjppzwenvuT^tJP)Q~0$M+6*?q8HzI|82y>4HOy_8J3D7i&ZFE1 zxqtHG^ZzsaYj7APrc3BNBuSH`Z`E(r+r77YKL~gbu&UJRQgVzIE=FF6JXY>_xlt8H zR%lqharytE{*CGx);nxi>A|I^1WXIK=6T(-vZ{hgXg=oUXXbCt+Me|h{==B`QRy?% z=B5o!>yzfKFRuTX^(JdA80!<`GoyxDNlC4pERB~QBk$LDtL;`9O|}A$EDtA$cuRB- znzN}S{99}ai{c)B4UZj99nWl!*|SJzH=?XhmmtE`Ng+C98x(%^l~ z0jcc^2WOt=d{3Yl&nDU?+Kp)Mh&e)IW@0y~ttX>5aMOC-nr+B42;S1n+}XLUa@yp` zvK*NUVVnL=|DN7FvwfxtVI>*3YYe^KM>GRVqckSwG6&Fvt_`!et9vK+@tR4RI7F}URVBFc!*jzSvN42;MGx#Q+V!I>gDq!m zmu%b6I2#Dhwgdgc-{8+lszg;Eb$@kVlprcoqxaSJ)^1U6RfjP96<(YJ%!AAa3icM< z&wiLK2>f9wp()37Cv;O1CnsJ>xSa4V{zH6noG$JWH@QcGXTmw%Y2EphODQeVo294e z)Aa{44rX*=FUVJ4OfUH3H&d>sM5IKf#H7TgJWRWrHY8(2#^mhr*{k!`=Z%7$?us7y zQ}#ZE4@jOgSGs~d`#T`x&%B>{Pc1&RIP{(%b%blgsi@OYKcc=zO^ci!**Lsm_}?M( zLOzyyUn;P8sp2^x;ln&edi=%SjT^wqCOrHuu}2nT|8Bo%zHEL358=Bp#<+?5`6&Cs z_t+5@{_2W$N-K=wk`p-E!OkopL(o38bXGqSVzhPA?f zXY~Q&Y@2kUS3gN9d1iSd1ZM!_PWjP zR`4q5|*`C=w3wjoKS-dQ`p*!lJnePizB?;ZOahl1@IuhM(F$2j{XQ^A@ z0dN=%Orh_z7d6WAXr*jro6Vct<_SZ%Mo#UVesEe>|v_) zuKG?Xol_E%5|c0kO8S)aC26;AyUv>6OgNTsn7g~Jt}lG6D(RKeFQe0aUVmDDE&X=- zsI;MJ#ZvvTG%rYQlH54CT5|PdmPM0~r5;Zmpzo*8$;!*h%uCPPS-2NmZk;&*UVIj~G%uhIic8$a3Of|GLHnQu z9@&f8u@(N!FY&E`$$-;#N9Sk9dq)5qy#;v3$jFiFa@XYcLj4BW%N#FU@z&>U&Qs^h zk(HMk7V&e&_C!*EW?l(xfOeP99-sBa*A^cWJT|yhRI8{76(&@8Qt4@><&~CH+E`&r zg#l&zmfaA(Ib75;&DgeXP2VUu0_EWb4lf*5D0Z#ZX0FTZ%g?BsK2kp@V`PRT%aS<` z)y}r)5#GdCz}r&X(iNV!*nQgWy3O?&yL9!rV~=PKz}#7`DXR`sPexyV5b8?bz*(BG zB^`^aW)!@snwC0fX!S7PhUncvc$a>o&G94H!VMHV*2=W&rI*k zkGY?6%NxrWS1|jrQ`7CECbgllu4W6w1hJ%;yRZ8R^$GP0^nLoe3;^-#%&b+W`hsWa z1H8WkpYR2HJT=)APkO&t-x8(8b2O^mtRG1{w6iqMm)WQ4)g}@>&EW& z`993r^*lo_v@f+M+>X0NxJJ5)df^#-m1Zb_d|^YVSHXaSH(AfK7Njjni%1SnmM6)Q zw&=F$x+Qi=Y#QG@UKOXn%HA1wHt}qtcd}RVlH{eykx3CrR}-%$-lx~BnN%xjRPxB= z$MC`@Cr(S;6~86EM?${@HAY|0(xcP&W$nuPi~L^$KC_q?r!i|2eZvmE##?ZO#<6=Z zEiNs-uk`-X!pv)B#PW#BkyRsmM0AS?3@Z_aZGG_FlDA8~EB>)~SO1RwN7=UwW|p|# zZN1xKJjUFZ#(!lR{()Y-7<(l`8?7y~=uymyp%&b$aJgA;I%qyxt&BQq^8>^%?FLq)#$3m8`OzX1>WO!n@%$?o|ChrwE$2Y-8zbU^fw=gT8M?GG{ zqZW+0D355jXt(~HA)%f04CSZYmOYkRDAD_%3Y?2)?YoTk8MoL+j@KvXyXrgZf296Q zos%>tX?o)H#16WSx(O*`Q%Gexr%U9OVg zgn^|4OP>lo8QMOg6IJ=Qh-cx^;kQGthYk)N8jLu1Dc=&_B_{e$_RsOo@)rJ63tbnw z9wF~_K{qD=Zr*Ra(&wR(RK--$v>vAZNyjnANaju**qi-}m<j00JRvxcK?6=kYmst!(d$9C7YlpUiCyxnG@QZSVo zysdkCZrgh9hux02bz;ADxMsK}63&j`5nn`ar6qIr2t%;pqTwIIa>EkCw)~y>VY$J% zdD(^8$8!$nw8K9tFFz}Pr(v%l+!ShRgErGS={aerOPI@4w<&JL*h!gzr+}}QADdMQ zuX!HxJ%n$7(6t;S=_koXA8jjc=y&n`=mN+5P3}7?q29PiMdp6Z{x4gK!S0c?<7tgk z>ZdGCUXd(GaVEb?d6m*JwL|LM)W1`Q6WJ-5DY40al6AT`UB!gT348wR{j>J>s^6)9 z^nWHKj!nFfaxrC=ezyKiR&>@?5SzTWS=-oopB z=s8V0RqLzvQwtBnEPO{+g4e7hx}b2?9sjCGw1BsmHk$;G;vzl*pV6%Fw*}ZfqlMzC za8YD2pUTqewHv*+c+d2i?sLlPwAUT@!0X)Bx~*Z~Zaw#S6_;u*BhhN?&z_H$O>3)Q zu58XT>&hV3W<5{Psfwx+y%Gx6~~AL4`t?*_}0>GtS2M;5#Zz zvrrwF4ST+svk|nv1o=moH!fu~6*RTT4cCaV?ql35qA!)p2V1W?YxGK5MIfi#{kVD6M;H_tf-Med_VF zV`&YD?J3(*#wLwVib?#DC`pthmP#m*Fb=%2&+k6J#Vo1rpL&0C6LJz_lVg*&rEO1J zpr5C&npGn!H!m}<4T|*N@D`g%9Z`q9fpl~eBY4jL4xAHsx%B1I&x4-_e+~XO*grTR z_zutf-Jp9xQpB3Jl-ycUa1Wmpds1wI*95Qb+V0xn_!-Ps%v0Q9pZT@z6%*|#HUnCI zHZ-96OZ&i&)8OHHP<9k0=ktm)sOoG{EQ7NzL-}DlyEZe-Q_RgwtxQ|dtZ9zg>S??k zhNKTnf0FV%B^+&mDyh{|SEVm2nscqENf@_q%hV{hf% z%&V8z2sJ1VeB;05EjG+CG{WOu#oQ)H8LD)_<1^DO*KHUMKwmxoW1FLaXF78nabKRo zV?>K@$b7inQ%ti=1?Vs|U1$g@X#^ ze5`2v1llu~uZ5FN9=-;#XawJpUq_|IE>DH4GsR`1OFOqNZr@=;mh=ks8U<#sm~P@7 zURI5y^`-Z04{hzxj_JTmY!AEYTXMGMJjl79QxQ+(#<>l0)wyoDz0kY*4_(|VhAW1_ z=D}u#U2YfN8A8`F2W=#Yi$j&}n(2B*I(U#)s3kWbMnW@9}j-q|4}WrT5OlNE^#$=HFXz~FDAE!-|{^D zW%?*IO!sgvYTzaa%wAw5^V}A=3A|vd-&Vh|fnx*TmwZ>UYU!$_Yq4A0Hn??gUT{Hh zpWq(Brc$<2eFA#~F7aF8*UP7y&vMTdo^#Q#{sHn@8GiBrxVqOQcO;D^^|-|kOKwxY zwP4=&lUcv;q^YT@sXD1VsVvEc!DJLKFWLXGU&kS3dg1KCg(!nnMxVGR7;w3)@>!L^ zSYnfZCf`ZAlT?Lz>=}5=B)oH7Fp05P9acd|u8arCu;N3C4+t6*ln@dZawGI+XiQj4 zSg(kl5fdXON1O{i6}rCEmQuX}x&~}7wx^iQ%j|VXdr;fYb&#tDZm-a;uYzO65AzRm zd8YkBtN5nrwrQVfx9MN-xQ))W&X(v;MxbXTd_^0<-|c|n#bE6)twB?$NmRwDK1e@H zL*T;Z;KMr7G{z*QGJj33=#1`Er^3#KHJRTYLJwA9P#R_x&M4exI%t|`iHv*xeGOp z`Kkq~a?Glh*_YY{)+cJTo6O`M=ReI)L<{Z-T5g|n-s3p7KBon`hn75R-hOsB6=s?F zEkC#Zl0FipTqFO6Mng+f@szG|SFOfN^8pRb{_vZd!qfil`olE`-MmIj2cAkEN`lxa z>x+u787(@aF&}T&di*qwncfd;m4&Py?%82@$%=JpHF{1`jr`%9alB6a^fA`T^;Ko zDMR%`^dE9R=CbT%7Fh0Q^bpuO1TBORe_&mK`TETRqvyQvxdp&>>Wc(>1D?Aj8|zd)69@LFX_(f zdM5Twd_=E3GI>mL1$|k42{@a}@rM|Pi+iFnSvi&c$X~@`i`6b(ulS1+&q^F9wZBxK zpngI7f_Dek3vL+vr<SzrcXNN`4jn;=JSdF=l&g2AAI8ve8A%I0i|FN;BE{8iO8* z@GTBOV>Fl*6e&ABi84y%l`|l*Aw{D32pL7Q-n!NEi!_A2|v8WzpK8h zLTL6I@qF0a?e5#P+q8S#_qq4d^wg|HOY#e^QCnGi*=MlrOX!|mL^r-K`o1fiOPyMo zw=9ZXw!3IiEOS}vvR{3GS!!c$uLW+)G|M#S)fd#g;mWji@8F(`7Quebx=CZysL>Fq zfu>^$yM8)boNc^$f_cB;kfC*6v%FboJa5g}oO3q!Z0^Fm#d)i!dAH^5$SYnDSTMvm z$k@c%)S6^ZvEO0GW|w2XqbdBf5z>+Hjpm_EqD5}R-*r7d-!5#rgrNx@$oDu(HeR-y z=dGHpwk@6+)NS)ab0hRIMxujp#(L7)z}(2JLBC>r;e^6^#(JoKzA)ZlKhC?rtKfIe zpPY!S@T_3PW&+9)o z#%_#_j*E^9N-mw;1Agy-oB=tXz>qFjuUN}U!=!=iC~QWla|#?H19R+dc$b~w8-il_;lcxj$Ju<> zWyEKcO)H<4m>i#cEa^nj1>HH_=fr;#za)N2JdkuKsZUz3w8rd#H%Dtez*O8+o>^-y z`!MC%7rKQW#u>h5HG4_3{b%~G4pb%z zZfb96Sq$*F3tn^wj-i-kr@LgjwB>$o#mYTN9K3g6JbCC1i(QSc>``UgbL|h%4i1%sN`^^?z<#qxZ?acqmq?@y1m^=z zWD+0yAM_-%taM zJd|B^#2N|J5+27ri_8C$ z{Uk@zt*!CUJvJ2@w{r?tPl zV!dvnj}^vF#eMb_h7iMuEk0Y>9$xOF_3`wn4tKX0T3S+sq561q_o$5C!Vv1)Q-t8N zo%TBEmFH97)84P0pV;qj?BBq@lwYtP&7E&)v=e)IclEvq&nki)v+L4Z(yP|X*30;f zE=B)$Y1Y!LiRqKm-z2|Eo}>F)S4`)lE0GkKG$(mp@(wr>xv2%I(fa551?Z3UF6>n( z^vzDAAp09%uqb-b1Ken0M|FnpG+&LsJA3`-{r~m<3Iptzzsz6Zzu$L{?>?VHJ|nz_ zc+J7vT&|UB6Vai2sClH>rrxYxh;P&pmxC_xDjiQmOI0l*68%)Hmeg8s>NemTn^6F2 z&;Feo!b{WLX1aY+e^!6NGpaNSZ7-eAoI-1TF?%{o(BP>6R$T$!XqAGR1w+vQ$SWu) zC}9XR#KYrpGq~fCGN&*M9&A-KN^d*vI#xM(fDvPsocp88D032;I(CbPf&j>EsE7Xu`m}{Gd@^J-DTh3gTYHN@=4lXx~=V+SM zpzfbl*w)a=P(8m=e%G8HISVouWDd{|&?lxPrfo!f0vI`Yc+$wEVY(r@(z+mBQ=+S` z3rJ>X-3{GUojh5U+&{HXYCC;L{h+M=S>1BG<&Fiz4WL&aOXpcg5A>0}fE6yQ@fH}Q zuE73qGuY-8J*(p37lyx#6|}4)Q@u#f51#Klf&aY@c^_hLZMQe3G~Q>y8sgEFzTtfp z>|rkFWu4DE@6X=xUcbH8QK>?;@S5X2+dBuImd-=xk>Zx>7L9L!h8)m|d*=&#b3Nf2 z4k{d6=$+@4*DAYp_B}j3*P;daFZvugh<$ud`JU1+ey z)~2)fR@W9r>3bQtAPjj8hHgYH?F}y?y2m~ zbbgWYsp7ukZ?q@w%kIe9je)*&L)5$czkSDFa-P`n-{xNG@7oGg`IcfaD^UE4>y%6*x8jQY2F5ZZQY_}mUD zB6P%Fbm;zJ#w2_-w_3O0J#xu9j&snG9jXJUOA0TGLB{?tEM6H6)bB@(hv~YT8Q0+H zdfar%6voa+C;IL`gqnQ?nN4YXV|{70SR81y?lB{SVLViLs4xTGT{N0zzwv){E0h=d z7X}qt$fE0qijaL-k^^`UGxV0u-p7vA|o)P65ivU+1l(=xu&~|uFzmrMSa)lryFE^z=N(c`4&v-n+L~53jfETh`E4)-G{d>E=g1 z?u<{yM9FwbUu$1$K3d$9&}6EdQ#t2k#>tGI%qg}fZB06mco3#sy~F@rfbL1sNgm|3dE=<*= zYW%?+SHa!94Ttxm>Vs+kvy+1a0xT|OJZn6Zp2}Z}Uy6px`pTC)U;9-%RqfbA=nTef z@W}Hx4{x-DkFU=_G!3$}Y1&HeRo%Prcf!Xi4o|C5cthndPZ#q9o6TZ7N{yRgPB9Bl z#|g%<#)>@eLZ^R}brj6b80!q2Y|4N?{^q|wu|Gczed|J*NtUI^Ry0=q1w+@aQd1)} zRMl54Ay3qz_L5Tn{NuQS3cz7@l4d#QOXf>_q+ZgtbTY!Pw3ysm-hy8JGakPFnm`Q@ zjoV4>3GE1KSSLccK|Z1EP97oaKlZr*mthXOlb^i*^WNpP)$0KJWJ0^o51+*>?gKx0 zF?o(8S8~I716B4i&i5$tHYDcS=g^N_hV5F+Hp@E4y4$kL(iO!~Hi%oS+r|j=*UNzKoM-Q%VnOAC)#yIg$giD$ zH~(h7(%@?7!v6S?!V`spcPM6Yz4LqH`Aux_Mm3VXQ|H&72{dqVhZyYqB3=g-r@Z`PsedIX=QY^7ca5Wq&vGJHx46ncIy z=9j(LWXYi36uT7dHJvo|-0BwTAlAmwvbfq;-5t%ST>ieIOJ$cS%E`)0Xe19s1v%0d zX=?(Oe1h+}Ir=&NczJfo>5!A2m7NvOywoLAojE;YM#hAUF&S+#J7u=aZk$~fRh-?1 z9flORs$vI1cqct`K6kpH$q+A1kj`M2CqU?_+L<*gHbtNahus@D9pwl^6v7}_)*?KXG3^!3jK>6nw^?h zB8xs_m1ea@K$|LAs-4z~qh#m;F- zT%4!#XLZ3XH}kPd!QUE-Z(9TWl~btmve=nFg%-_oW~L%1zVLX-i7sH{?3~9Uk5wMO zJ-&G?0mpNN{3Q31c@6d)<~hYt9hr{Y%-VvQ0o;QHVg4QE{T4rH_?L{_!fRK_ChI@SqWiTj9bUn!U97s z-Zc?m$di$Ta4iTfD2=PY5*RAZf>HDrZw&7YO$r;b>2<46hOU~JHRrP@;AbpmTx;B5 zY=D>AW77*$B;F8WPi}!_o<;2TEV3`M?{(~Di^YP|>3@#nF#c~kZaFgOZM@Ky(6FQ9 zgLdTO-q_<;%T1Q?>bjV;hnjbv|1XkgW&=NyJcenWdB`*6GyKA@3RXf@&` zwhvxoMcWel5<8;ej?!R0R|%)YE@{mCatj)7DL7y>#0&4R?5HeK9?sYLMBW1(m_x)` zPEZMO+r9GLIEoMAbli{&&6&%}OUfy#DKKQ0t5TFnN}WQd_zWN1%zZwXz{D1BH|X3z8tzBE4UZj2y5o{${D6(C*mH@IhixOl_m zL*-HQz6%u#6k~}}#9{d%`4`!Lvgc?tY{G--F}qar&`P++%!Pwgq_e&OZOtHOh|>c^ zbQO5+Fv(!aU~sT*oc^ZxqIYDTJ{$hSU2-FGGcKaf>Zj?eISP-)U8~j(_89Kb-?O*p zG4wAhdY1PTfMK-zEB9?~+ucrUP88|7Y7qe}2_D$crH;#B)lik#3laBCb9i@7cB`_; zjos;L((!eg$zJz8Ts{IhGf(XA>~0Pz+uhq7u1*=wv1QqKDb82w>h$D!bK+*T(y_+z z2%jvW0lbNLW_yCJSx+>ee%qCJzCFSBsv;WRGuY3(iD!Kn<{A1Y^fai;wjTuih1GAq~bas2#r!vF*aqH`W$oD{C)LSJM^;$L{uW z_9*)=TRfhoqiz47=X%3(&2q$i)cgQ{zdpn);u}$kbKR6ICv^Bj(c2Hj_skPdh8*;C z;?aYuYp!c9&5h6xJ%%HwkBgnLMraJY#jm=(vn%eor+K>pFRht#n`5^__zYKPPwM~} zx6-DvO#?SqSY3-e(|xP~xQQ-ct0V(i)IeLRHHA&iQDPg#+S=OE>T1(4WlguOV4wa5 zT#{FKk!s)sPeyJ3fa4&p-W?r>@sn|}yV>*Dd+x+{`ifn93;RIHcAfnrpW7WS>JfMs zL-3+V=Q#~Sv({VUE-|15qG5ZfJNsV$;&C)pI!)R})><|mozpku(UNFO<*2e%#aw({ z&ZDIweC{tPFQO8*SUFZX9-oZCI6=);zED0Znu*Lrl}2dG>_sQ%9(8{_IBN|;crraj zM^Pb_NvEKB(Eu;We#A}5ZSMOT{LLHAMmO16*;UzbW{F|4aM>)}$6Tr9k30!X<&>S@!{R*rO-`JcfOugN^r@jq4qJ zsk6AZ#A}d<7mvW@gaB?5DzKjP7Wd#df%aH;5Y>q5oReXe5ugd}EDgZ)5~zVIn5&qD zX8$$#N{gr!j~h=KO>|QoaQQrd9!88Q*5reNnm9jdE~Hnes0nSM>Nuo_fu)Zn3fMzA zZN6achd17Di_Q{h4dJuZf{E{H6~2jr4>g^W-;15qR+g5qAnV|WScxvK1>NZc{&v4* zr)6uAUg9hBYjbOyF@ExSFXJ_O77lZq>5r+QxiKyoAI!5Yvn@hn{}>TYU-*yhimk1^ zojsb<;)%zr@Vm_gAxy=W0~tw&*hN|ESV!Kxj&eo0&8<7sbUK+UbEg@^ zaCXN}DbFZh!0VaFOm`*Gkuaf&vjTpk5smqF#4VgVMcp!oXYma6-Ai=Rj`Cj}&^!Bx z|G;Q6uo)-vUA*qK=*M%}>oM`xNY)J2%SoOtn=FEwu{+h^arsgFKSJ4rScW6oKKyM4 zp&;+A(7|!|%9Hw%=XJY$8y=b?dAdiFp^lObKjLw4KyHu~vN7W$>n!aeO_!ufK5};y zN(#uoO{Euc3#=$BBb(2epD&v!3uZ6n6nO6lVhNE&%)uAyJ>EG#c_vSC;=40%_2dK# z4ej+fk~c&LP{kfn4j7t>8$kGt2#huwZG~f!Q>X{UO2ip&BWok`<}SEN4i`Cfred06 zJ6a3p_?g7e2X@5G(Ms%B9iSI8s?yLZKZ@>aBUKaCPtcOy=pMb|r`QWmqguomLU^~_ zS3JU1FDViu+kp)+PYTQsBBLvg@*u(s59h(wrw9XB_D~ zKR3~uy3FqWTzuhPvhVX6oz2&lr>t#ypewl3EId8869_k39`fh=;7JI6>mlNrKAsgb!L%Sz}H^Emhd+2$`H*O5oA5PP|MH^E0- z&f8MB8H>A#mXh*(izG&Xx`Z|p56+NCQF_v zFNK!8sAU)7W#x}PiH6VBQQDd8c9yekmWIkgP!2E4#(gE;tAVVatPk!Z>!>Eb$(n$x zT!SwH1&^)fX1E~sQ%omLD2{VJV%Qk6Ddb8gDn+UM$pPx(VDvRd;t79`E&6$6%XhM6 zh*=iJKkBtS<|_Xx#kUKtuJhEY)-uO z{>ELmCJ~OSSSj#vkyqZLtGkk?coa|be9IDx@Lv@A{w=}32NM&DViIh&&QzP>RwsM4 z!lNsQk5SWF)#`5bLZjde)n92eVa9U?@1P*6GOa{&v;m3^QH1a(Y7U|}**MK8_`Dia zMmrH(3DGxhVIQq0j<60++F*EnQ_&xo2M)6f9fWsa06EN_a;@1Qj?vb`csniN`c3Mr=zt9$2Y+J}}@ysT*E4eEg(kqR&|BXMvTwEz<*r&7oHOk(NsAsQh zFGZ-R6tmG>_`+=L5;<@Keyj`8lGu`$_bc>~fH$fe~=DEak-X~QqoYvFjKZx(-#ozKja#jWS z-B0@8x4h5GqFi}j{*bTk5F0Er$gaJJ?o`o}@Dtt5*ZU4{tz5bA>Mg}7^B~V!z);?E z7uYXqmJ~H zpVwS|>VC3Y%;=_Yo>~*72|zW;BVrRVQ8EdZOK(n6f1I>uOO8uUO5!Ddcpd$?OFBuH zl9w-#x9@X*3XQPw(lNNbRH5>Ag|ljt2z}jWk{39B&Be*lS0XT*0H+_mjr-VYD#zU& z&nEpf`x*OLe!WIF_?9{>7PHA*f|D6#i7Yyw?iLN3T0Ug18mRjYVDn@wm1J*AZL(Pf6oAD4_dyY5F*m_3 zYRNm~wby9L{o-p#!<*U3L)4C&;XJi)0BEVuUt3L_AViM4O6(@4p|RS})}QaChpiQ} z?#j06wo-6jeTv>ZY!>dK1R{yclMxYxD3Ut;nI3U8T?el>widkP|B!T+JrnQ`h~Mpivo`* zgtH*dYNR|2q-2=<68d>DoSs-J#B1`q^fBu>B@6hw{&Y>jj5=8}JB^EnnW2R%TCa+J??kVf-sOv@8E4e1pKoQeDowC_6tVP zo%Q3Z9Le{v8|>;Q;R}{phG?W{3=*?|n<81!5`=gbJ2%UfOUcH|>1=26CoPm&icBix z0}4^6*QF}Vl>vEvS{wlA=Jku$?!(bo1U8bE82b0l9!U#lDG8cpSX3OaFW+c z+DSTsc$H$V>~tE4bRw17GsgK7mxJr%#wjqNf}M%@|Gh!4{wjJ<3muCbL5@<6eLQ8A zsjp(V=`W!F{x^DM)orzGG3>>!wQeTkwFP$ww7#>vq`R78@yE~TE$&kXh#`17{6z#4 z0v~BSMo9md%o6FGiMVU*&1$CN~@Ty;$Rx>f~hE}5RF>J;B zsyP~!QPimw*-_|CoFWQ|#(bR3Aeni@I8N&~G-vBs>yyW4lNk@NA-vu?f~a7v$Slr; zLc?dvWy?jX*}c@X+bpMu_m+>8S58ZH_K^lNn_7sc^cCwxtBXwyMzq}KZTEpGxR^WY zgFV<03=3?d!xxNdIeUk~Z~Z-W$Pa#+N%X}!oN5JE-~hGeY!I)ZXzdL`8*d^%<%7ge ze4u^t`K%9yI!rQ#&g2Lvq*OWp&w(REDjb0toW$j_l|0?gI1L4|AfB4KoR+5YM*LT4 zc`ncVZ!(>c(-z2|1XJ-~f?^o<)OSDq~oQ23)< zQeNSd%N3WoYx;6->*FZs&rca##{X~z2!`J6;r9jCrT$ttAi)y z;EVQ#t~3Up-4C3eonWfMw|fX)PdCspRMK4{A0$ncB%>mcA_)ZluFHKGK)m6+?dD%B z#^-nl7;6aeAFuNjs?P(w=3=(I+PQ{U<=o)hgp&6Te%-|Lv%)!@+O-vRsg;Upn`5V= z4fRtYmDEkT!5;R0NWMw!(YDvPNvwlYQO9ZQmqalQ}x3cq60lyLrXcro9reyzuW04hr!+MVeZZL>s<3;FwNIYCDQSf z4x>(OkIwCEaFi`*ft|OUvpk~L!5-oM$hpe%#<_6fz4bYBi*I_B3FVtAo zMG=eF?mZ&Ul56Qf&nK|cRC1XcXweun#(sjcwq)OFJ$kiQK`DRW>nVKRh33$1`(FDv z+|m2m2XN{Z*bmu{;>vQz{+NBYFN6$USW`z6$87w74}+_`CB%6gO9*{Xf4DPKn5#ae z0ui`Z1pSt%ah6IKNk2%xz~C}UC4>orX1o1o1-$qVXZK~7&p0qHso#;_q!3h=QurTnrZtxZwf#?O0;UK|N zAJ(NF8%symg=wviTzCSxQkB)=qg0`uRr0Unsb}9ZF}Vpou$d5fRrrC6-H5Sdi|X79 z#fa*3rZezc`hV;$4Q=20xF|1>&o9bVtI*V$56ZX_t@vg9+E?D2ucJ60KVB9`=pmY5 zxG;}jpdLM!8lo{@ZFN~)q9HwIb+TD={&bjZ6n*kWKHmX4<<0br zGl@m~eiyDk@A;hhG8I1y1vgp&_gfBko%p!1#1s01E8x8c>9t4k6LFzRS&v`dDCri!!GSK@iZtY<0h+p$mw1?0x!1i>=TW%1@v^y<=za&@t?C>_wOT6&cdW6rqmeFC5vY zg4gV%+CM^vy`8tC)D@SDGywNF_Bhs)L!UVwIy~tKhLInab3 zffddK&7Z6osTcujIHPE)z7_271iADDm|zAqpMxG!j}Jv2dO$&RmHmks%IU;R;a9{!%qWO{gUfHG@DDR+ecNd3sq0cyw&)ovOl%`aqYNblK353Xx z8aAEpFGrq7U66$P>=C-e(PYhG^6AVSTGG@0<{p~ODHd31IFpsfbnA7%qaSmhu92*w zY8g|6ul#U+qxyNsuV1Ms^=w`|V*(b^TlAt?qs5aW zn_K=PYSWj%8>UcQ`P(0}ceIlUoS5^8SYlg*uK5zq(_;Q>nXM0eMd3vweCLYOBNZY5 zeT@39I@vIvbMw*ig)DW3o^7B-ZjoAU(BW;NG8Fn4BKDg16`cjSMPYH8rIv4aaEN*G zP2NwO5pjmH$bC9a&JRvbH2$e~hm~wF*7qK)Sz`mi1J-Pw4bqt!==7#ID}~ z>p|;d>m$A@i?ttL?QKw5aVK0S2H?S3hnl$$9iQOJJte-{{>9bCZ2ODbq?f&qy(zt| z5C`ZD?(&F!*B6f`2dC*dbGa{Q;|LAynT{!-pA)!|8u8Y_vB9z0@q+o`7qHO;P)-dV z#x42Dw{x~S0Oz4RmLNCoA3l~V`+~Q@y` zEb4tmFcT;xOXpw36F>N9SJAASBb^7r`8RCrdwir!K6(ZduKS>@KbYm$BU4YKEBI}3`6!o17rZZEQ=hCrSW%cCsKyZ$b6Ls<|I4f_95S~|{H(%se ziTrtqxXkS{Q$CCSvNw~!MJU3aD9WoM&#IX#%BThe56hpgw<;Qr6XcUYe8f%l5C5X4 zJfH0Sk$X+VS$LS^@I+`xzAZ((WiBde+7a~Y!ozwLneuM}xeeJIa$q}jIJ-)F;4ILG znMniK4=qqn{~K)hB5p5x@p~D_S+B`7r8)1}3KiEV>34Kf*Go3QcCROS<&0)V-3INH zFQ_dnqFQZHG}k)AX?xdr2WU&(V@7e^c7u(Uvz+E-wl21= zoaZPyEO%RyHJgty{RCp$G}$wqvRkyQMbwR(M)Q-fYZcV z1$Oh7ttMx^0smiz(>?&S=d#UabJ%LwYcT2S0n277wf#R-x;gfaoZ(bL?5`Q{J-0Zm zr~&6XgCwQFum`e1(nDfpXZDu!8aL}pryO2~8yt~Tc6pMVf1Jg6za}8z)rcr`MwgKv zeW-GV^4ixTGg@G{l;`|zg{AY2^LU?o{0V18Xps(uSJIXFxs_`8D!Yoe*lG~E84sy@ ze@cH#yK(j;Jc+Y;POtMM8^J&)(A$ZAQTWl#C5|!y5P78<`;Vz$A-Cxv1C)Mjj67Dl zs#K~Q%3C#xeaLa?&>b)<-G2&Ci4d9$lOwfiCbAcJW{E0^(i1DVD3N3r^lGE14Kj8n#-5WfxO=FLhkJlAKa zrolugt!mCkx~%v|AvoZX%1C8-Lavm-?<)^0;XKT~Y~_0L@HaZpQRszs!W+h4QCzWB zz8a1|DrnPos?;qYPb;W6$H3|tMy0yFXjYQSUGNeVYB{r>hQxO`{FCV{%W-PNe8SF!mrYb|eW~Z}Q9stVGy>BMr}OK~ z{JWy%75Qugm}pmYNM@L)p)fI@E%lk^73|`FGJiDtP*bX@Fkiw;6LZG%=1XM56mtT3 zaTj?s6pj@~&*WwHfY}m?BaTc+6PSndF)PtmCbA{akxpn2gsE#crOpC z?1h{hC4Jvk#}0=-JhVa1Axw0pI+r*X(@pQ7lU@OW73|zkrMb|tm{X;53})sx(K*^# ziQT2P)cA4WGlDNTLo!Pe#{OSDW)pdmEXfm|do_K+cXHb`>E)svM{B{K$cyq^HF#{( z=(m>h3^ZV3mPQ^r0_r`Ks4lIB%5@KEBK_oWG)iXCvz4Z1lFRJU&P=Hf5|iPP7{DF= zB`b#TcP*JJ{^GNU+BE~77vv3ag%niCMo9EjQtssIMUsUe?x#TDdyuJ%N!sw-94AZv zB1@-$t%riwFJY2$oqKy0H@L{rg?u+IIKza23YsL2A}r%QXvQ;U;0GlKsN7bwiTY3? z=8q#_7fb}R-^A_UL&m)ZN5;;HPenQSJAr%-nWqxjNG%sUlNnTmGx*-R@jZR!J84FS z(DJ!@!=V-TMrr!4KHMp1=_94|Zyn+MEg-j@WMc9Q#74{fqA@eU;ndC(!I(P3KnTD) z)pXZsnqNEbA#G=^%_ezFwK zwcA%XR)9#S6mj00adVdAX3eF`o4|8;f^)S39&SIL$ZFtvO*xqz;WgIfzrT^~77+_M z7kYZamEb3d+~oz-U@yTK?ob)t2V0H9cRde`!3xe{1`k1ulE~!*q|0t`BD%_Y$VA;L z=IA}qCTb{c1lsP))ZQs60sgmw$fNS?#%Dgt9I__oifW>l6nJSN&*=~P zOHs!O%xEL1iQrzw!x!~o|DYzjV7tj&MtCQQ%0J3c%5lnyWT;Uv=AJ2^(j)F>IvLEK zLJTv@U}Z;UmPWiL1~8kipr}M9o;R3~4#m+moZ ze8aS2HIWE%J`VhD2#EOhWb+V}FAN+CrufALyW(kt;*& zW$gDjRadDkyW6|suvl26KmP;W%NO>S@Uq+;HQ9Mn(u!=bZy{^8D(bVM$t+^mM_@B8 z(VQHJcgs$m;vG!XSL1!UkUtl{zXJ;Lnffk{jg7bHF`cuXWumYiRA&yEZXy+HACSe*W`5x`AK}cLvYdtoV7Cln{&1C?m~AbvE+*3n-T#v8mkJEzlH&rX$Upcq z{c%)*kIE*(as-eUH#i#8 zbH8E_0D*7jfH%RL*D-;ZL9QGGgT~W&9Ry|vo7^uQ&mDf?E{&W`V4ik%c6avVtqaP; zHTbE!(nY#CyYXkwoR6F?a6WwzdbP5Xm`iSwqJbD9DG4qUD#@o--3_+gf}T@+d_Z_- zmLr?#(KW{`y46vR(TZrxGaXruXg=>5^hR&;bsQzy!9)GU>m*)d!Kb^*j!RuS z*EL{4w}}6(g@Yu4%uC{(iB7R=JBnyahg;QI*;&q6k*wYv1bsRk?NzF0i*tZv5LMPg ziIQiq7&|fwsSBCWyC~OIV0!r;-q|c_fFhD$@)H;9wArPCZF8^A5Gg0v!K0zU<3 ze}2Wj7`-CyJP*=ecD*!mQuV45SX7 zVlR-|Bzak;IA`VOG&NH;j+^Kp88(!d2$M8~P*LsdVWz957EzPe6ZpAYr+?lF z{{5Ai@n}%Cw{Q_lfvc^6zajMQoASCxfSitWj^P!UTI2yXl6va^&%_qzc4s6t?rC1} zUW9>j*_yLAk1RtI$Cg~Y^#z=iC19k3==`>E^7NpMV&*-J5dJjc{H%v}QyebYaHffG zOz%z0aN!+}Bi|tW?G7>3cZDZfmq{Y@b+gW-Lzk&36>GY=BMi^VL^cSi77m@z4M`;= zOe%ED>Ce+s_GUVgYEGuU-2=O3E2wF-Spu@!lB)SDQ^DPIdp&KPxof`I2EyD7V)pmY z@c@K)Ir|CY?d{-=7sFd*3)wD<*hpxI+F(6_@Ma9`jt4SB{Y`$;!Dtxk7|CwMFUN28 zD>i|R9swP#%$bj8cIbeqlqc*1c8$_McYnj#dN2m9tT!tpl{s7q$uB! zrAl9&>@CX^)8Vt=Xcj6;|PZ1 zbdV+K>^Fk^{J@#zJX5S4)T0U}{|~`u3c0-(NVA!ZF`@(;=ugF3UD}uKbPuoZLQvZ~ z^rk)FQw;zsKLeYCFUX$DSC`6tzMOkqoW04+R2J}&dV@L)1tYpm2oJ;aFs?;j0A80& z2D3<@ihjaALp%7`t-vMJ=mv;g3h^AbV3x9vXZ9U4!bnva)j__m`odkW#Cdzfdm|7_?N^zp{c+|%1Ldojs|+O$f}oD3sx7Om ztlUYD`bqgs*$8y@vFe#B6fdvp>}yxxMEkoGbJ4Mtv(aEud>=*;eKMwBoGngrQOEUjG5l&1j*k+RXZ|chec$n@m+kEg55IL+I^_tTr z2fdHBPXxDrhrazU@WjuKj}9DN96cO89hL2s?9<_#<)WjEqOO?&7R8@2rd8~}E@XdP z&n}u^y?OBbpCL5Lh%?3; z1;6`}>7uC^9@>A*zs(Opb=u?cCw4m)g9G1%Dg71PsfM$TGux5Q{BIs8sn)U7zTAG! zcEg*ZV7j!Qaoqa)P*PskiX zb58V>pPXOFqM6hq!=1O_bHCxIvJoFmKYFoKZ0r1j->o87F5yIF6=9iXYMZ}{p4ox) z8mUx%g4-fTYbk~rG8~Nan)Dy(5W2j6+?4adVe3ljfV}pTyoW*XoKTUg9*|?!z%Uat zHL)W%8*bQOxG8OUMn8gLmZ9&M#B}or+5nrGQH#5_wxgb7Gm}&g>gn<@&M^Qd7n;G8 z3h}SohX-G})KBgU=Gj?(Pj;7Wjh1vi3&{oPRJnJUkA0DblN*ID&QoFmmGd+{$0O$x zXHWXi`yfYWsBdq{Zj%M?%XX7rbRahiVZ4Yv$+JxI-!tuR!lXg2lqzGWfu}QjStz*M zRE7P>$#KqD5H6!L8cx_tX*9j^u%deMIrvF)&bHvmRi%O*%3k+A&R;GwluDebOlB%g zh}LLnZHC`BiC$Xx4Q*wL*p9mU1z)efG?2Mo93H|uq}{36Ycg%z&VT<$G-W%ZB|kgC znI8s5t);iF0qT7nAHe#cXHC#2QBm*wi>JwUe29;+yS5SEVR3Io(*^#3G1U<6l%A=- zoY&_$D9(BIk2k_{Ttk2I7n;ihsg+jnY`Hn)jwFZPF@+s2D?NhHt&9b8SV=d(mgns! zee-DW@@~wWZ!lrL3f6Fy+xQUNxM}S5-lu8{C2MY@PTg+XZmVnm%f6nCf)`Xynf7#M z;Y;nJu3E~yP@TM?rz+k_JYkY1p4Ev|&RHOf6NyVymXXZST1r|-Mo=?}3Qu?$rh>(v zCW62}@~GAPxi`e_*be6&XGi8USj^dPP*01w=67%z;pbU`Jw^lb#^zMYYhc9mXP)6< z^{`IlUg-=2=m1EK&>t7v*G3>uX<)WCYa#pdQ>;Vr5Q*V*Ps7ViLmqw#0_zVu9JMiX zHt#3&w-2+Elt<3cQblG`V-BWIm;yIyJg@c=dM|NKYB_5=k5Nkw!_)2&jKI_Qd5HOH zZ5Xzv@DJ61BtK*VGoDSTbSmvS_G)$&wf{?Y#BAJd51Cwwor@>LGwT!U6?l7Mhh!0* z>`}`;%LcfEvGlT=sriS1T!pds)t|bhDm)!07^#$6a65h5BG@yx!7_8{*0w4(C?0ZO z+od+C;8af_hxMRx9!sX)Omv`5?FoYOfEkRFyBlFV$sjsb1AXB`*eqfeFR+$r@~N-_ zy2|r#Rp}z>B$+|g-iLd=3m;3I=ep=F?SaLtp$^}{nO_Z$Pfs1!5Y_RUYi<%Dc;{cJX3HwdDgI@~p@es;JhgR^t*SL1`tt$a77lQm95KNANMe!nezpzk=}~c)*9K zSEj?fIK$j&I@P3@XAR``6@H)MZafQCTAH5eEd4`yY9uwU?N+!aZ$LsGfMv9W`Pl4CslIH(R>9XWk$Kb_c2^xz ziA>DL*07CI3OuPH8wCPa{|Z+?!G2J2f zLD*+X^57(>*iX2J_pson9E5)A{j)k0<$JC+%gAu*-d>GG786efA92|spvvBj?uk59~~Z@B072W)2QcBQ=%tD|DmtBKmB1X| zp!#zK<@q_jjqOeCD{L!lCSSKb!vBN+FSPw%1x5sx4lEXEN#vWzpZQ*~Nn(<$NxUKP z#lUlcebMR7h01tSbW&2GBeC7O)w+*)j=Px?yqc8)jJ7Fw&v0V-nm*NiW)sc6u|!zJ zH&05n@-lI9cQiRRQkA(1&Q=J0m129C-`V|!mot7agE}dF}qGo&VC@6KZqxn zv1U_aSVcvyy|a_^B0k&3X?hJt$y4mIy}LC^+k@Q`z)_RKlFkRt@&vTBA~g1bsBI3>TA9)-mr@@nBE^3$P zF40@j>wC}a*diz^cZg{dI^>Oa^PU@ZFaWABs za1vFNpS+VcLPo+LvaV=n!_1rm(Z39OY(#U%p6MYPT{TrqMwsB zi@4zqywX>oBxaL`Sl;4MJgywp74L~}K`r!{!Qs=?rEX%yh58$B6`x?^={)@PD0MSZmcnrwW zy2SL@#tupcR(_IR$fNFK?mI-_+nC$d5I~@N%Wi)Jt$Hd{{ zCwFpmG3s8`;Ud1IH$YsBHn4eTG9$Ss-P>)csU@dhwLaHDeXGUkkgJ2w$>>Z2zhpf9 z-|d{j+Q-F@2UG7CFMefuXC~(tdaK*wm)a8Z909p%YHC6K^}Xjhx+sHr7iY*<#W6^1 z4lobKyLTtYzh=6@Ip4-B1M`gDQHOfLDgf$P2yC?`3>)>R8L~!af?Uva`(p)4aWLwlTIo_P+LS_AmCtzDa$z`EK&v;kU;xuYWH8*M4vP z&Z2L&*?+VDW%}~tSh)gn2R!wE8)IQ#c#Vu=6saEfNYdQCOPT zmg1Q7VmV9+rtO?1D`AeU03G?rwJYK-<~~4G;yx&BerG|VzV$|JB7(ip8{eNe&Oh!} z?A_SyFlOp2?Ny;#Q8Y9={HzKp$$Y znyIm$z1WO;>tr~8dw7l4U;_j@vKU;~P^>CDGimJDl=4^#AC79&HL`%)=Azr9va^CS zHA)D9#5bx*4#1Xn60;{qQ0yK1OU#^a7^a}m5lZ$+{_$wJe8)Bcflvz=O?{}uc@s3CKkQH zT*$So05mT&_g#GImtcrX&5O;#qffA>8-WyUq>8zMT4ann#y!k6l>VNFu3&N=8_zNRW@?-x`F66g%FfOFJj#`O>SgffBNR|2C@k({#Q`%S$=JRz4pG6*#~hl2+Fp7$vVbNA9CX76%)v9&AQwM5H1H zn(Ln99!2+3VPXJbW&gq7zeb*}+-))SNcDa0U}?_kbgpkwcy%SH`E&pax(v3I*OH(5 zO(%2?u3GL{?^yHN^Rb7&a+0sI|6o92B-%6w?MLiIeGB-GvxhP3K9#MewSn~pbIy+2 z&M-ymk?n=`B@Bi%sOY@4+R)ip>9^W%oZo1_8h*9>G;^&|V1>Yvfgyp7naFU|_Y_LJ z<9)Z_A$Hk!*rlrwM$d6BDny^*X4Ir+bRKqnEwJKTo{j8_=AH?37D#7f5i2vy*5hbcq_LzXO7ymDr0y4J4X_@t zAGEJvZeCYg7u!D0;A1d#PFT;8d&OD5(kF2l+@%N+ZG9Ln;+7_&57LP@u1}>t1#{mr z`Ud-svyHU*SnQ}%^|p+*kF`(po9b5p`^;<&w$7lpU9OT0z8!(bOddFV0|K z`N{Mfy0;T69)S099E`$7Z|pGE6CQsbKOw%UADT0HJo#aa4+jVQ*HoT*a89pWh9Brf zO-1`(J)SAyE{bD57jDH^c=#Xjo$4vC4vzF29Qg+sc6xGaJ9&F~OL@yAYCsLqFHFQN z<$vi^i}NwTY5HJ^AaDOgE`Em2wvTZ2pU_8oA0|^(Y$gTq_8nsE=3tHLD>wrVu@@fy zH`vRq(O3}=>J;(#NS`4-HK-W3L+?=i*V2%Tf=!%s4z3d|PX(&v(&3mu_B4pVU6jVH>u@ zri+>ia5poWep2ykMAhOvEP#r18FwQ7Y5=b%mm@o>(p4PY;08s4$Edzi5f-f*ytpZ~ z)G$^BM>)qO_Sk>$7u@k)3477|P_O1x7SRzN12x1;Yx-)H7{kv~QLoM65|;Ge)h z`O%}3mT{{;E&fdY9rinKWd6uR(f-laXm{rkhqU$jup>cH6 zXj_~mE)$w1;j!mp)s$9?4mZtg4JF@|ewF%kw$UG5lDOy;waM%BnomlYl%UyNsbKC* zhR2f~e(z<+1;;M(%86iJ_rQhT5~-^i8whSR57ya6Y88#qy->Y81nyEb7@BRUTMmNB za>jg$dS^1K0u9X4+&TcqZi!`{!mESlb&q!Mgp`e$a=HjkpO~(hEwx6Xe?6&9i%j;K_wb{POe%5-Pi3WwN#cU;Q z%j^s7&+TvQ3v9D(cPtOF=rWd?Xo5GjHMTXfHnH}`LYt7INK?U1oY~mg(0T+9HGyi? zWVmzf=t}!SU)Vt+#l$cizkz`$7X3>1M}Pd_4bI({Tni{kJ_pH1eP9h~2A4F67Mtgr z&w?S3CM%6Y+v_v2LNd@9U87pe&Rd}l1maYkTQ`ZM_OZm(SwO|HHtR50=P`PVUW=PX z_iiKjazm*d+=XYLxh3j#5|75>^l|!;llF1Y|Uqewxwu(U$YA1HM>#SxKq;xQUaKkfFun8}8!cQ^UJ`0S0g% zgnlplfWpqg&X&a7>W8b0UpY)fr`h!xW3$ArM_)B}Oum@MQ4gbrMUIFJj?5G}34O`^ zk-H~DB-7y%(uR)A=&?%bRmDN=XRgyN;K+nV2KTNOCcy}l` zqPJjQ*BNqAX%G!c7@VLzUdmb4*~`)0;XsH?IRAXG-Fet?Ul@5~IP2e&TMvM5=YWlr zggQh)_)_Y9KjS{<9zj37kICC)f(zNn)!uc9sB|gF^nS|`OGZmt%N05`Gy7!rsYQ24 zIeSGWfY!JBp(omrT4)bjdz;g4Ap`8;o0E8S9<|6C);iWvwqdr__OjiM6b^)ydKA|1_-T#Y!X8&OSovd{M>jEkTR17%id)Rj{^CzX-)f2ALKNo|^y4lZp@AUQZ%Y|0#b>G{*Q|*)O;}oSbvtT;$Yam(a8q{@8v&!1b*ts#b zWbmP;QQJud8-Eu5YbBUOWfU63%gx5=)zi0|?|8JW*Q08`87+~|*6-F}dj@+f^Crb- zSPe(SPCX|%_0vr#zDR?9D?GKs_~7>B__@If(t;svgaKZS^)%rb9asp2#z)2vN6T$S z?CjWXv7HSqoHZzsrie}&Jt1;RWKd-C$l$1)Mqb&1tg>oMg_uV%&ttBjr5H&?bp$;i zVQ>}F!&RsP2GM{S+tHk9SJ4X&j7bzTnAzK3i6B+`utE&`6!R_SN8HyqGvX2l$sLs= zmW0XB4o=>FICyEmLP}EI7{$D9UzoX19FHBd;L`PQ^nk8rN{Ap9%|PVY2M%FjbmEq} z7P~UJGr6@Nmr^A-jPLjcuHF^ihK(G)7ghLZ;&Yuf;)ea_HF|ds(j%1-er5@4N$Y;w0U(k%YcWenOCYliv%*v9%KZrS9p}5nw#^m@ zuSI%qnhnvwR^K)S?EgDVmCdkSmfM#RPtNdb?cW?#%|QQpel`6bXudd)-DBTp51`JF z+7e`WM1DFS=B7C3O<RWUVePkD*UJLpC`Yc{AM(LWS{8X(bJ=*M+HY_jZDN0 zNL#F5Y{vL>@zYVOD8*ci2v(MgDbmduiEg|r)4)nwMr zZsMaHU=8JAQC?%Mpq_XJ%%v%_v@fG-tX}NOX!(>RR;zEVYdsC8a3?w@MbUwHOCGD* z?OJf>IdpDM0hw6_lW8Gm`B~p^5Tj|n($%gEPL<9to!>P7DgOJ>jh<`|wNJCnw5?>e zM3nCzCVqAGEom!e8v@sVy=8;NZFO3;pW}%qp4nd5RxnRgamH)^xBg87ngkSME_pZK z?!L9{HF<{B_TIidnYNaU=O}6$iL%iqFyt&CMeCYGoNBX?Ch(RY{aVyEA zM=@(l_SG2e-7NOZ_HNc5*6Q@Ht$~}}8vLy-y?(`Dgm$LGa1SiAgK%mbbla`6yld)~Q( zJvWScKptYZ^e_?M!|YWok&k?$gsV8Y!xJoRk7G3&T^Csu=xu3)2G?(q}wxf!=md@#E zXo7ZSHqC$FPYamYvY1>eJ$$7qbiKX-vz$P``VVSesmRcTg{Xf>b@vN&4ePq89+Hka z@Hql!4_EyS3a?Kpf|0z=r;I!mx6zL zpFXt{^x!Oliy%DpIC?J9-Su*t+?8Bah-BBe?$YmPAqrT)ddKPs*H*a8DAr4QcZ9L+ z#kcG4hJeqsWi27wUPiC{Flvvf$)U%=KyjndB#vfjIG3YgeW(t_(}D{JdvAv6G>lsD zA+Bp6F?)Wv8RAAtljJh0gq^66G0F;5;R3w~na%2H$OxbRKG;!dYYA&&%RiQ*=q{b) zL;89;Lq zL}BT_rr56Jbg1q;<~Rb^=!io)uwhgy55cX~oVt~)#qeggz`aUJ zH^y!HT@P}7y|6WD>RO2W#d(!Z?Pm1fE3oQ=FUE2H+Y+n^UE%KMMLkG-!GTnN$HJVO z%bG*nca(0-^q?A<(CwQ>{O}U}$vts<;~e<<>FD##Cmv}V+adNS7_^(+?oGv+S$w57PGB{Sk1q!?#wR#hr9cPgp`x%5&W?J6#S?iCgLwqCn|yS3 zS3_r48cfpa9m+F(AZAgI=mwZLA3(Mv;K|Km_PN>SwECfKk_3gRtaOY9qN%XQw8u0Y zF8EQRyWA)NL+vzmq_eF#S}LE3qNCsruCc7LAShtH4L&`Kdb&UPR}<>HUAS{WFbW2e z;~k}*=L0{y4%MMj=qBc+&M?e5$a#?azYz`Ghj=tUqDu8R=b{HeH4NztoQA`b7wwR) z*gzvVkVD|kTC4zW2IDe6BfRLj_F3pd7!QZ( zGCZRP=8xa1=}9`Uf3f; z?L9d|yTDy8#42qmMW@|F%OASM_Y-M_l7HSuWoV^&1=qmaE0v)|QQYX;&4}`BTI${# z@f+>oN2WyQXafAN2jp#S;q-3>%Y4V)-%X|OF8wYIsLFT5e#X&7`iyLFIeV-S%&bo6 z)AXiyZ#Jsi>Z_VTo+%BCZNw{KWX>mDM_mEVB+dhHVt=yt-%~4rVh=mFwQDK1`qJx_ z#sT?kz_;Gx)qY2bY(BQvgFHAr++~cPC@%+G8b8B-dXb|^r)vnjNbUY6s6IURJRyRT zZp%_nbNqW8{TnXg;obD#-sB9*OvS1oJlK4uJf_R&mVIOPco4P1J@8+rQ#YszSEQ7? zj9YW}rf|0PgA131bsDyzi+<>2=$7V0d-4i3os2N3Ytc`e4xju51+)q5kJOyptMN(> z)(__|XLI^Sf3OEXqh0Zu{SnUDJCC}G9nN++`Z3h|^_+Y=1=`jdoSW!{*h^3CM@N1- z*3-wQjo(EjT)nkJ;a(5Lt_#wm`W$YT>aViv=JXoeVy@wHx_6SG<=Y2svX_phjzL_L zUGdxF>%p6tK_&GZdF&=w+1KbKI!_;MRnEKrsN=q*v#ua~{I{^*=Ab!VgSt%&Xl)OA z)yFwUgR8g`var^JgBK;oITLphwck~7b->BKBz#F&NN->zI^Z8WpP?-{)mfkSD?V{F zT5y+Pi9bU-xDwU=uHXc7>8;97Z1a)s#MSXjsP7+fya68wfCrisC4u^^{+$2P(>z2^ z>jZ4p2c#khj$kQz_k^K$hSRwWi`z|KrLdxErmApbmVvt5H0^?woJ4E}loF&r)WW9~ z8bxQ&NgqNaeH9gl{$!}h;6c>^3r}kuLk#MINF9K}!hH7g1C}t+Hq_HM6A7-4iznvq}+6}j| zHM;8it-D|iSG2Z610o-@j#t>0(j#!vYJn|s2t`26b%{W);u8MlHCic`6)O=jm7=5P z6WCfk{7pXU^0~b8&=c_5`zJlK>1=6jQT)Fj=lm=4Q=&C1mf8>QN{PDZzj3J z+{uVQP7>ej!oG9Cqb)+eTMm5pWq3#O10T^uDhCfT74=MU8P0)$oTHAniM;zfb)9u_ z8{!npmUWbO#G-goof=PCM;ga0IC3+kOHZF>oGYFRz+_iAOxsBOY#MymWw?5=U?kt+ zY;1IFq`P&NL%8XEc*K*yf;GdrAU#5iUw4Za{0{qD!LDtMKh6stcM9&(3v5b!SxFu+$zk**^ z10L^nynx%}V}3)w)qd)8zVzkzqm(QD!AfHL)@VsTBOW?P4P_*J!so==@4-;V!yU{+ zKUQaYO-sUnJq6Q@${khcB&I{eFkh*yzGfX~gjsNWs#1&VhLY+o@}f(Q za5x)h67F$7F4B7;t?>RV>2uUVnfp9CaHG&Ft{v9^tgaH#(1N&zXvZ~&xhd@SA;P5hSeE} z@eXFr$PxIOl$mU`>^1CzIFHBM$AGqP)dY0=OXiT;?LPK{)+5&Q^w_T@N4`LXxg~ji z5ptSbs8HP@-c@ci7ZfE2bwvji{twji8-T-`tsWTF`7F{pJcjyB4t&7|dYgjK6Rb+C zotm0f9CH`0z&Jia{PCMAzUm2&IP-T<1ztuq|1~i6nD~6>A3@6URr4nP0vg- zJd-_j@!hxR1U<=VF~b=~Ro%%hK1Dn=(rE!TF9rWE1U{>{mH*-|DzcBpf)Q7w(so-N>j8yS7G5p(EYu`y_6Po893Y%P(SF+ zx<$`I7vhTUt{$%3L}NwakF-H^{WJWp>zvgsz?(ahtE$)KCMywp@B{uU9jg_4M%>O1 z?3HjbiQ`nd&%rg8{)+SvBUn3F3t9O&?~)Ul%_KeVfh&5OzQ{f-#cD-ZA7H_} zVSQmH$`yE4&4>XHkeO6Q37{0r$sy?Vjwe@{06ScB9+r~B7b63>j(+w)It1II+_V>N z)pP!8eLC(O^xxlAZxebrehK!3%777#Ke@etLW?74fw2!+*oMdxK96r4B2tw;SYDS?~oJWRuWeHhZ%Bb;6SWoY46kn z`|e4tdk>l{hv;>y#=O4P_~{F*F+O8quFdtCXqk-0{zYqJTSHq8TP~XmTx)=BfGyab z)n3kC+TPOE&X&v?Xe|ULn$?mXCPgQzDWxsv(1ViyZifQK5$itdFxzO`Zx~+hc`YZ< zX!>sbVpY9&i*18#H#My&V(f$L$(BSMHCQ%surIt%FV5FzsNTQudI_)ZJ@vgh<_`3s zm!j4jLARl_XP%QiRA&FG7vdb}g1Cj*;MabmPxK#Z<)6Sg{v+>Sgx#(M1GvL!nSpFk zJoBUM^Kf$J+4#Xu#OaDzpP*8?nzh5d9ece-l*DXDxYtpxNcvB|qB)V$xrI2sIo3E4 zyH*Z46QBE<{qY~Rt2`?X{6^YO!SLuqnB#Mby2p1I*9Xy4ibT)a4t^O9YggyF@bg5D zK*vAyBekNon+07Mar(}~8}8_8=jug7x&>PtPfu#4cnucc53@X##$mW;0JL4zvq1Bd(_mhn4^c)q! zp5*(XJjW$$a}oV_Rq651L?6Wod_f6f`g!D5>52cJl3TnY-k3|@O=i^Sd%;hr4BurF zO4woaNaQC@x(`lsi5OqLpq8lyT&>QWD_P)UuQ984XE3;%dL6!UpFh$&T^y!ACl@nU zI(SyY)s`-0J@`hq=|MSyvR)2!1vk-$^N^Ew5p}-AaIJcRnUvr}TF)$|w&a4p|iVeoVH8mR9^Jve9S@g9d#!(4=(=pRY^5~RglRHtAE=i5F132M3^9v&Q zIcCk1s!3m4xa+KI9sKO++{^l4`<2MCKGXk#v<^7WGE-CP%bHIjtZNag8Qq45$XQFU zqzQkW&geyW;-)-$Cf(A)cODVPWo6Ft0Q}A$x}}brj`PR`RCLQxVcl!G4}*RtT}ofk zmKua=$T*mH!qh6!QUPeb8F2NBa+TK6iv);AmdQ;ymb;OaaT;!7EiC(J)qRd`}W;G1Jjq$jsch zYt)fTfD67uH!mM?(n|0n)uH#nL>WgnwFfUfn`a!u3dc8PguB$6HI7vpy@qXyAl0wfn>L6lA9Y{)T$!YxIu3b9E+Auj$UJ>#m1KN@e7T--%g$ z+!nr92c^NqAT}$B3R=2<(lfOJmTFyeCys#fyrZ|c5q#>oaJS0CGZL4y47J$VaD>I< zT1Y?19k_ra=^@w*W}X){jV0)x&Z8$tyrlfB)8xQw(0+<$u2^>b)DCishx8UKM>nbs zjN_riqOZ|P?!>yyvpu5*Pyof`ByN}`9zPJa{ zOV$Nk-HX1Fp9X(#rzt&sw$;5V!^zI*9f#&c1#p8z;73w7^5Lv`%vm}~eJrS&Wukuk zfi(hMiS=*?#2>hgYOe+TY;n7uk%Q!fSr|@c{4Y81bFuJBpT*?w5K~Cz90;cMf!3Vn&0wydX;U_j7fF{Ci^63$*cGUVOu$h&DV*H7jX&yZMdDVB+Fx|G-Mtvzl^#7XUX; z4OZynIbX8w5bfS1M!ktXqb3|3BreP7yr#YP^4Lcwm~uag})X3Je+40?=Fi=;_V1uR*Lbm}eBm~7u?gf2(qob` zlhYGtU}DEOZ&$OAle5RYU2dwId8vNSbiN{Xj^dsKF-_n&bJ_Q?TxchM=3P~$_M|z~ zmx&vcPpHp=!6+`;fE@nl+x$aMqc3yN6u0QU3o{EtH|iKQmg;CQe+Hivzwat%_F2x0 zN8}RosPTOxcd)zcpcV66$><#zM~3+utEdBKc@Y`pA$;$B@*rt|f99fqXkqSYmrv}DR>FX#DV0LH#l=Ta&}jtyR|4N<8QiV zRVzqCpZ-AB8~k7(wwel_|pzV3nO`44f+wJ75tl(i2Sq$ye;)BO|XVi$xp3TE<=|zIl67HQACZQ zKCl2)2x-yZCJvd+d67r@SZIg#W(tM$WJa()gE?)Wio1o6g+#)&$d9kk>-T{Cv^@)< z1=AKV;U3Ikk$&9|;Rx_k*MLv&qR-?defpYRs;OxG(cYSYT5u5kB(ePcz3gYzXKTR* zuMelZ75n%Bce5-JS|jdlaq^!M#2))NY0rRgJV3v&D6y3Kma>9hh#yeTQ^%tjU1zx) z{i(@}M!T>yXTfChpJ(8ppQ*FlWiJR{l5c(Q{=h!ij0%d`w1(K&jM_;Q=TTdt=1H8l z%dyqG;3buvRp?Y7=PX8liM0M&qUb3e;0S60svnhMCzOW0r<$brVA9fRN=NWBEM^hC zK-G*hOufa^v9v(zZ=SfH2{vT@@J6g(~NAQsQ(9=}SG64QV9%>lbSd~zB zeCK+PkI}nmZup#Z)J(o|{zzYEAg@atjD;~iSX&aw| zQ@WVy`X~C1=Yb_E_V3B73uCPXaX-Q9cnx0ohI{V>xd@`p-v=$rNX}W+`46DVF@^gw zm|W^3`~Ly_zOmGLL%|+$!T`)bt)?5;!es7`;`k1Eq10D~fi2I4vHOsE%vYGd+nMX8?;qkUHL(L@K!~=plQw`T7eE2V4xj5Zs|uWq z_4W<+6ZT{Fs`l#kdA4~ralK3olxPYkVk>KxZMQKO?hcw5Bk1W>E*fI1WIJrz&lLC% zOkMiM`e3`v?C7qxPPSL{17lln<1KV_9Wyu{Wn9*s0m6eVd zbFQN_uR*=^zMLJxqu#+s%Hqz-o{C^UHRZc@c1a}|BgZ(O-Nqcj({#Yy;Pee-_t&Q% zzm>ZKtjcz%4a_CeF>z*uayDJ?9O2ZN!xD$fo4&!U_=T_FR-=giyMt42MoarAIC>Pl zb}sl7-LXptIxCtrrWpnku+f=V>KW#R%;GG6!MP$Felxv-6{v?y1kM=s3s9RM3_Ku5zk_#peZx8uNWY~ax^JTE*s*cbg+U0AtU zDY)+$$evR1RUEar_xL^C{~2JhS*Tt|6LA$s>trywPc?GKYv5SYg(^>d;Vb!KQgV9j zyQ7@h?|AHOR&m$^Tgfm_P@||%whEJl8ebMq7+$nH=loOry!!I{(^sy!U(@(&!q-mV zBU^ArKO+uUL{2!2PJ{nIp+dHi1YxoA zecQ?O#5I^?Xg2OZ|ICUmS_2}XQegBhlMM#m94dCL*#9x8EM_Hs{YKZ+da&04XxWWG zi(@glcR2dOHdLpYvvekxM8jznIhF8c&ETxcS^X27$ibTIJ&`y#1FR8WRD#nOdcm2{ zZ0o~Zs;ktG4uF5fqMpO}RIh2&AWzVz*aStp%W%Uv7C?xTv;IZnG=h_Lx>siE|B-0& zctD(_*RTG?N<<+S$=vc2hg>I;drqyP6!ElXXAB`)>CeYnmio-sp{0@^&hjI0;Fo;F zV{O|}k*4|B)Q{e&GN_H!<-Bgh^;T_S1Lub7y@$!PA5nABHSC1{55%|+!?p01t zZd4zNa=JI+?w3Vd>^JB2Y5c-(X6Dwy%G+TnMd@n&moDQfbc{{JhTC~OZnNhc{=>tL zX-+)fkq-y|ngX`cm_CnuME7q%d&Uq?&!RGrm-Ei$cDuV$;Ssi=x_J&(2!AsT&wh4RC}JV@~l1D=);l z1qZzsI7l_nqGUYxQZiO=0DozDR41p~j2&-a_Vy||AY*x~Vk9ej=@uOLj>H<}cvbcI zd(!!KQ|(CLx6~824wayBTmj`V=eSCmpZJosmorOxsCr&6I3dEVktXr{#7?b!b(ksT?%cPFxGzJ>=i`hQ{gi$;GLf%_I^yvW%9Vd^UJZf z`mw_r8qfWQ=N8B3G@eR2biH`?;pC(-#P)TWMdZXI$p%Vd6{m?*lq;mcBb;PEUS)6P zfY)D=IOzm?Tsr0rxWXUU>(zN|No>YU9OOdZCJDa8jpo}U;_e@?Gm4>TK7=(Iw%Q;v zm2s@z^z-LoMf2B7fVEtKZC{qYom%D^2ES-BT4pympQO#BS)_LMZgY?bomscQ-9}>T z#i@6-gf-Fz&Qk`oRUd*&tLCoyat^pC>FI41SLHo;ObqKc>l-VG%1R?vb2uHEC%g`g z3+XnLp@P^oPuHOaB0_+W%o5^bw~Z=KhV8i{A?PT`81Rm)%(?l3d1M# zU*D5;DaVbZMl+RcOg*G;;DWW`mDUC|{K7n_m-Hft8zvo`8LTsS`|_;9piY^HpXZUi z_+Y82sZ^Y$!?ZCRy{cfx0qj}LU|7gf4aiN<>%out!Jd&;*9s!XO#H@IvYq$jbT_zX zQ}L?mk=((#6Uh>H?H3$?s$gZ0+22{gOfPfwEAtnM67LVkS9WK|Z{-ofNtcpyKf<1@ zyq?F{?PI=I4S(^R6$>`Eje7K8Z0IZ&lZMxxgV*<%`>xu`O!A{4SYQEs!4Govm+n_& zxZjD`KX4`-$77tO<15y!9B%-q_k7OHi&&aC3J=NJ+QCqH!e3O(-O=5iJfa+@bT&@k zn(X>*M*Zb1XGF=ZDJ9`!`EK+!53?L$8@@N{I`0iX*(JSGL&2RDhh8xw(MBAc&A zSI_}G#7EX=x+i|HevzeLBd+La%;%DhhxDP35=+cwjiny619gpf@_zNLeL)u}5>%li z?`|yfRqK%{-67Iw4Mw2(jpEN}_TvKdPTmuV3?+__!~Yb(V&i|X$qB8T_b|G#uQ@Msg2QW8#zE$WxKKu~iuU7Tszv*Wg~$4g zGt`Ww)!!L>DhE1Vk^HqMRB_%>J55av+Y&vyFuJn$dT(d;$Z4MCFqNv+sN1dfK93fh z3$1k%3dhpbsKA;37EaS9`n#poSQKrmOkUYQY@2#5Cw|xs-zyBVg>7U-Z_Cc7bl__{@4fn;xxNUT7)CXZ5x6n6=FZ6fk9kE{VL!u`bdNQJBV%XgD0(L zA9Tg`%h1bGnEFUQG@8<(bpDG@z?aS!@Dsm-v)Eh##P>h>`T|v$_0Dxhe%6aTtqrR= z_1_l8{~J21IqSfvtn3US$5f3er!xsVV<#VP-?cpcd zP&ZL>z2|sDN9P}MhkuFeQ-aVIhV?XnY~dg|;5!3{OYTa}4s1jh=m=1@R>qu?D1PF@ zYt*Y({Z-mEU0vN^qwQyhePxfuph5fFCI8Wf-J!aZ>bBZ1s)Z;<5l5;8K1Xq7L(WP0 zu)D;-e?X4>>3=KE8q89i;0N|!juS(=LeiAc3=Qc-r2?<7id|0xXWzs+j%D9Rm-GvB zr4qxF%nH_18tzXGaF@2MAt*o1V~Iz1+WQRM-H);M81Gc{ZWd%UK#{vUsB0*d&q3h6 z)tDt3#Lv`g7mQw1PG-TSVisuxQ)BMHrIf~-8#}e|^ECXVDvub?qi3<&&>O0Lc(ae& zJ1vjZ961X;!UyQ-7|LqLs=`VQNAMjT2%2es)$1Bsbo=NCoPcFFrM^_#I5#U3g=#+H zdE(G@#F|T~WNF@a8&*nsC!Y{KF2!~S81qV7;Z-^k0Sx6l96;r+B9VfXbK)`n{t}g& z{qXu$L6VB&g_9fp-N8Nmz`cD>4gDSK zH+NY0?0tAKJHcMXE$IPH&=5ae44tELSVa@;Wg__fLU7>ae4fL{6uuKm-Dx5f`^9KK zUBvf$I8bx4io;VVfd?(iss@9wEW0NYdZP}P6Z9dH-*OpxFWOtpS>7upIc}wA6BQ z8Y>3~Pi7)eJGGMU24>|AQl&U+5a;78EN>N8U>(u-Q8LJDoZKJS*U`jKnTb!UlkW|r zPBoC4Q6B@z=*hM0&q*Ch9MywUyD%ESzwzVYM0JOV&Q4;tw|RUlF6_4yEqrJtmzGX!a^W7!7 zyJ(#H24fqoseRoSjeN)`SaWlD!LBkCU= zK;@?s159Q0=Im}l4A2MbnS^!BZ#hK2p=o4CibxIs($TzX2BWiar== z|2HNt97^xNBzE5*Chm*|7uGE0jhrpV&=GpdN<+4(Io~t!A?xXtIn2rR2_|6*d_-@JHXtK^>~*t;6}qhlO`MA-|4fHYSL457=9HQHPmLxzJ}R{p+KA#C7M_=Rdc-~%fBh||_9NCq{Mj>J%^N;H z=eG`VJ`bW6l+^neo^cHCP4(~)s*ci>eMN0q7_#_Glj$QHiSEJ}Bc~ln^xTw4HJkYx zOuR=d>Dh>9-h!oi^#Ydiu)5&Kd04)z1a_gcuf-+x2R~KZd7QIRT%7)_5aLM_6&CRs zRu7XjWgDd-p$|4dKj#5mZ(Rn6K;z`t&22y3}ORr!D>XOyyc1R0a z7U=Y+E}0Ysq#zj3DVW$1KnHzJ)TO$DhOPw?Kjvo76vfkN z|MX+7!9XHM)heYyx`UH291QC&2yp^x#fl00auUuoGRs-8r?wO2zjRAKFE6=hK0X%% z!I3X+OC&yqC4Bu2`(Jab#LM!&9EH?eTdKYD|ee@7k90#`Z{8B|p;4dr8f$gMOpd^#M>-9}vZ0;-KSRm3EmN@>x* z&rYvlF&J{W=|oNJtr?5YVc|s6L!>^$z922D=^EP$(`W~A+)~tu7ZFElR`7nl8x9lq zF6ZPa&RW$i`?8vV>ojIEWGz-HRu;IRd71uLm7cXO=<_$BU#&R*4g}3{@RuU^n^&1w zupEB>FjgyGcO~9|=ELS^6*cA_gz!0pSU5Kka5gyjY3NQcc}Zh+Ja%1)EH@Q-;!jY# z8(g`4ter;Gw+qB&Gc!S^QYmgrwp|7vofbw~AlKWU%=#am#>aG(JV|=|K_DSN!DUq= z6Gj(Fj{kxseZY;JoSTUE_mdG^C)T;d4B^%I|+Nf;tD+A z9DLqb7&txgiLJ?xx{)0Xpk6tY@AT$-?Oe5}+?S@0PB~CYqA&eFFV>d>`%C5em*^}x z9yJT`WEoJ@%AC99_*@aIY{9b(B$HX}Iz@){lA58oA{VgCh2%&hiRb2#=^UX?`zkq* zILmKX|G1M;ZLbOf*xS$?nM|E;A!x^X-rY&}QT*>iu&1A#s}bas=lK3w-tz%)6*Cw` zL(Z|u8u!RX0o z#BX$>)}~p0E3hHWaJWkLa~cibW5kQ$FwDPt{qRZzikKP7^qavk9!r z@PyuChY#T04I~c=2Cs;R8zMVv&ordPoD|D=cFnj+18@2c?2$$I)lk+ngF!Nr*mWx1 zxn03mDuN)`iP@e~nU{*&K0`a<33#D24^)5Bne_v`%p*i7yU`j@jB%SdY~tp| zAc)z)1v6rgIq)6@4KJLZZkxoOH!#3g5fO+llmb@vZ{nukL~0RO-!;zCE#$+~smF&= zkDHAJY@nBJD-ql(BD9hCFJbakSmjx=Dd|AHqf=@tY`3{gFxf;ba074n6As*G&UDR? z5D!jsvET4}>F5m2$%6Lcy1>si^N2mLFE2U6S(o{(Z7|Cwz=Rz^wPG33#5-qd@}FX? z46KxJ(BxkS;8joHL!Y7>f0iCK>1L|_KM-HLlRQHj@QJb20JpE3F=(!oAPy~w2@hkV zQS3~eMVh&AhP4xqdyQSGm{7AGCV@q&vtR|j*pPO=Q|K406*+B*62IDjupS)-g#h})TX9ClU(y5n3?$PR$_J^{7@wS`h|9; zX2l1uyA@(4K5~6r7@^JZe3;&|-4+=^$ofh-bpE;aOnon%Om*=NQgjXvxwn z=wLji@~C8d_@ifvToBpS7d~FY$@^_iM6{5P*IR{E7EC-4?$Z@!|BS`6ifdW{wT_ys zc1HES15CYo)R%*q!xYbzxr(3NLuRrB6ipus;C_keyBhx1a`3M~u*@psYc13>9%J1n zu=c&+T${Nk6F3W7W7+wz@vLB=A$m_LIjj+r4x zSOcj|)}?aP6r_7NQSm&Y;F0j+D^ts*l<$rO5mHXxhMJOU(w)e5Qe!{j5J{)?CwUH? z3}hpP@!LM`9qf>XM5&rj*_Al;Am@7|7U+-d3Ac6Q;JVyCWN_J;^{<7++UpZ60QA<67?T)AN(wlf)y_VuV7X{A~C%dYVr)36l zu!6A%5qZ_(D$E8sK142Z$?&sx$r@t8l{Htr4>`+pBlj4KE%#=UUOU)pgSi)LxGz_* z-4CFn??F+&foeLKk(Zl0*p^6e5;i=GyE_hc-7q*q<6+%x;*MV=mUwI+!Y9!}S0C4F zR(g=%X4s$R9ghMf8p;Y|Ud|pY_!FL0JpAlL5^1Qj#KWxmfG2%J58xLx<6^zySk!0G zSk%1Z48+$3m|I?rd|h)Q>+!iRJk7>@)xyY_Tf%gz=beqHL35GM!`u{yZv#s+mrr_~ zp~8F?|9yxZu#tVRj@Pl@h#zi&3hiU{Wq+mS9J$FJ6`yb`C(J?O;KL}*%%eh83!C<# zVDyY#{g%C+m_EcZ)Uays{lZjt;<;L<=@(I6Cq83ckh}sgY?Hxy{6cJe6FJN=K$a|-sn7_YO5$ZiJrtrh4;M)FkgkREWRs#b9c{e>;WhU2i+>L96wK@y9R zt2M)thq2Tr*q5c;SQu*}xDoy=0a-ushvNLK17Xsfoc?&qZdj}M=9P&I)W?#M*tHbMpp#L)CYXMI7kJFdYgg=si$^; z5%u=x@xAfZz46Tb`O9O;;-(N|EFj8X!MU=6cz+dNFXOCPkE+BzFoQef^D(Z}U<=vd z0+r%Ds%Kt3cq8e5T}`YJPWAB&pZB13J&VYBEbo36`}iU;hnYQ4ioO8VMCut8wOWQ> z?~aF9K=iST3|V}p-DK8l$@AB8-F22~9(^3uU?<3Y0=Z!XxcwXY_TIBRuv&tszmy;f zY(cg@1n)GD>hNmATL}?d#@<W-CzCk& z=Yctfaqf>~O=Kr6Whp)nr)TT}pO4XlE!#UrWm5Ch)Jt?1yS&OeL#^@xd{KSx6Q0^&0G3v-}QX+w1vPD8C^MD)E5Q z!G-*Xz7JpKN5^oMec)X@<{YED(nNa%?;|4>q7XRs)v4hYC4NqW?Z+7L+8K1+*5k(~ zvD&dJ!fVS$Jv$Le@qbv}psA`W zo@X7x6H1Fj{E`5&$rR+2Hge3@)HF`A)`M*Hc*W&=u}^Uk&eOqnkDoc{zsw3Y z)q-8vpOa-EpWAY7h+8MDssyVJs~Jo65S=L<_>B&nDdH?i+xQ^sKD*rPal12uwN>EV z*D<2y`grx~R52@XH7c;m^HI^L_etYaxSaAsal9t54uLp*121x6t?HXe#>!1yuR2u( z^~Poy)&F4;wWviD^H9P5$sh236bqt=S z`isa}{$xWuQ(wHlxGH1#Q2oCRxxF-bY7)07-%k!&@|qY` zJ%{49Od{8s270F&++wn>HRM)@*$XdVZ^Th?N(v|52W%yZc;PCz-!bfJE79!+es3{I z%LL8`^$$t&Kso{|@uXMDLw^$yTglH-5IKlnA|62_UT-h(-zJ%EDu?nn;6QU z{TR&7%xxeOxeX42`pY`8R)I@A!;hlUjrApAX-ZELu2y!HQ*iV>`pKDEY>D z_{$a8m-KG-^4k}&&kuN3&Gd`FvSq*Wt$SFS19ca>6mL!S?iu*@?#7PjZuner`1QMU zcr|UY(Tv2uf!JV5-djHO=t}dRvU4uzpnkwQfh`_4okW%39L%HZ#1qF&8?ntPAQ9pT zHRt>ZAu^U7itiZBne~Y!?#~zguU;D6g9qTk_u&D(guU<>zKCY%Y{n`zSEnX^MX|Gd zXJYQBh5H}Pz12+ECty!+K%hS0Urm5osyC_!KAu{qa;D4p-t{0F!mD~=QLQ+aD-qRJ z#^+Te`e;S}T~E4xCvqxJ$GW z!aL6Zshx=Jh2p2j@o(vv3BOez>Neuom00r>emUunN67nr~r!s-Tg(UuHBKUbch+Ea60TTQaw z3ZNPVjF=*b-D)wvC%d>z?x((LO~g3KepipvPI_?ED?Gzs+etlfIx*G)K8N9vM`QPm zn3hloZxYB{#VG7N0y~#&KQv;u7w{lnvp(>X7ySPr_uvW@obxQ<{ku6K*HblDeNl5X z>#-`bN^{}u&Z^swUA%YL3?$XVO4JsP>U^(oxiorRk zPY+&gzN*e@0tcZRyJ-S@X||E6&ZdepmR;A&U_Evxsu;$z&0(i4$DeP;+i#|xs=3+H zpgvDLe2d)S2CwrDpC7;=dCe}4r`BpCb_(MCr6=JH&V@_7EbR8WN5 zbzq4ft+|t{iI|TOF*DVGYyX5R{eo-$m8#V@?A%PIOc;rE-v zpZSmKSs3ie)p+|oXg!@`2`70=Cf{e*;rsf35ipNym zrBk63r+gp$Z68A&QeEeLQ5PM-9vH`-n1Q9s+NT+Qc?G*bGiUA-N593R{~%WW2!1FW z{5E*_X=3X0XorXkc#R!#mG3>`x9<_1+~hl_z|9YUqi~fm#YBs#imxV0N z9+I}k-@h8h>*>c{Xo?z25t#Lv*}0k|mW4f0h^#t~frq5xT}j8%7jBiNp{r)Q8@9nL z)(EU$`NkL`wNS2GD43JJGnfy>DwFu0YKZ;7q$+}!h(9VF9_@;YWdDa)^N2*caXy#9 zj`I+Ol;Vt6Ofr(_V+x4Z1U`n4hpN{=+8?UlsNSIJgZ$r1{NN?5`X)%(9ir9yhBe*h z-`5R)8o-_iVJCIwuk__PRI^uP0PPmUF#_wmY3z%2ppWA?8TuMk$G%29vzMJAZHf<^ zKJPeRgqe$v`VsG}Ij?L+15ba#Zym&@*J0`NiSJjyEnJ4pFJniE|12Fb#Yn4&Y>p89 zyycaNAD9R`Pt8uwM%1GDtzxQ{;cCn!pv( zjKSmJPvRy%#p}E=PE}1Ic*SY^9Uk#FuK0H{#t%kaR%fvn{I1OS`zqX%j#Lna5#Pw? z?*`L-${lu)8~TxBSzwO6!Lv)__BcNAH0vSpkGN^7u|=>ae(;s{K_;xHGSO@oeDDA) zYao8OKmQ+q4<2rOj4=9!I+A79BQ7t`Dno=(g*aU?RA>CO&I|R8ZZv8_hp^t`Sn_W3 zYR&^`iYacE2d~Gf$Wni3E><>T6wO7K9hc;L)p$>{VF{FVOV$PI13Jg`_0EY3^D5AmAP_x@%V}H_wVrO z;wH@J)E$q_j>ldn^D%|b!>Eh*;661VYE`}@KBVkcHGgRr2|K%keVxQhZwEn{huuuY zqYgDH7-Ff8!Ez=O9giU+8-{1?ZeV_04CS{j29vEm{#ZF;Hgdfz?#z771@=;uh^GSC zV;KX7(ai2L{7yr##qRiQ&7l)6Gl12LrT>p&&0;NKss6K$kFEG?=>uQll(@}A$@_d< zXI(JRjI#ze<_Uf~f*m4`p7ui^F)I|DXslx@NXlf&*C`CTT8KFjlNQQog(% zh*m4m!d{?TBf-DdfO^~{bM$}-Nb@NVD7K_ncjI~jWVS!pu3s&J=kViV!trBN3G} z!(~S?2CG#J=4he-A7kJCL-xnvZHgdP6AFEjNbD+KeI!${5)Z3qPxh4y`zk>mSQ88D z2198u*M1ZyA5&kr`rW`On!}K3#?NaIOH{;8H94yQ7Fx`RE4rc8BVB0qrf(&tK8i27 z$o;-=&(Ar&O|hphe%A-!*a&nmNuLE@s*`B?8}I!71Qlu ztz)g{V>8v3Q(&WKxo7vd&*F*c-X(CiE$jj90O20rIs24r9^;JM%A?d{KLvC{wlfeL z9>xk|tzsR(k6*(7h!cI+c-EWbOm_|YI0eUA^_}^|E6P&`fQ)E%c0YrCKY;HIGipDo z@o1muZwdE0$?1Hay(RARNuJ{%9H^~ei7R;}QZNeTxrVdT^!O2c7C%aTe#+w(5FM?< zl8^GrPV*cW$>+}UY$sUa=I`b8ZsXZDuom%r>c^S_N_c@Bi*f$Z_?f;IhwK*%S$9xukHJ@!USe8! zBf0SG>L?CB%fi32U@aN=oDRHOJaY9$rUdO0#+8wuNV}pat2|a)g_EKZJ5V`o z2$ofi@0I22%6wglCG7^;T}~cTh_BRt5Q2S+<1Q?y9=K0S5OwX#9$2&#AiA@cI`efK zRx?n_M%Z`__G>j`pXl#Z;Opw_kVfE`E!ca~=j};O-Oq@Jr5VznuX?e6+VayT{ALxN zp&Xc#@cY8Nk`kEz0*7eM<*wl51i!-x0}ce%sQxSzrb z7^-LBw{EHsaqKcZM%saw`Mo3Tu8r8Be6;LPYc*>NYd`Dn9=L?nTr_x#(p8c5sb}OM zyW|9qKa2&2^IgqcxQB&3Aew!LRlUMaBKSK`c^&E(6Ms=Pl3o8>>g&~W9A$~`a-T=a z3T0bAxCWoFw|6Y|Y{SkG76jK6-BzbVe5`db2s>vX-ca-DK>&4O9d zi?VWd{NgNm$6t8F-?`4~Q9s#rUh!LA-)H`!52s2puB`fCis8-5u`09le|b^GE&uX! zu_$A?OS)J3yAejF`ibkDfWD=bJ&=*#E@aq8ODv@ome>J1Xo^*elTw(KhTqazrPm~M z?K#&=drv-3V!)}{Ck5F>HSy@pu}Af{%AQ;Cwd_=L%KkowH@uBM#+6cUoaVo4j)$4| zBD_AB_fnkKqM6Ipc}2qbN@Jt4q##~{KmIljYx{e>(W>Lxf92UU^GE*$@Eh8>*;yqG z425|F`{FrP`vA*0kHwwA#-$~z z96_qiC$V&$S-02;FIgYBR!&}*3(JvSj%-hJDVCBxHV9#adZZdn6`%w;SYl$CjhSm1Lc6$2HlB@|i^}F8pr;G1n%dy4^%o+u-GGBf?rrBsH68 zYcRjriTzrG=h5ED%sbP0CA$(fE<3gGbt2w*AbvPGS2Ho5<8Q2F<(`|+{r$}y`D$D{ zVTjVm7N#W|)HU|THvD;pRP2g$*uVBb8otuANZ(po7P|Jj&${bth$a>hRj8*?b-9tm z9Ev@L5X}rEk{(D@Fa7o2WUY#A+LEs|=c56Uc^#s0@m6XXxLZ9V?iX&O$0;9>e(z?y zskr5*S!ay6;yi9ytkG*Ej_ztsk~N$t zn~hj+6JM|9WLd^f7Lt8T&UN{l5d2nY z_PKiJ)a#!S->z$xjH{l^u)5@iPswh?`-%tT8Ki7cj7Q|>c?uez|Nr!q&yfa=eyVf( zuTRrytcX{iiyD7R-!H>ouffup-2odNge4Egh9(lFk1^usu}1vdAG_{GgduxtVOYI1 z2!lz1UP2NRW-bZQUedXbO=nPM5c*K;vizHZ=EKIdOsYIl~OJ?LNDU$~A{S<~* z(YYgS2^03AUHjJt1F)EXxF+&^sg2Jmc`jL`_`7C)Tb@pO?TY8Vu%{L432S=5y2q(| z&B!1%>+(1@Z~|ZRH-6mAz2A;qC=T7h*PA$R^|Sr>AVr*t3dB8;{)&9V2kxN!&?o*c zzb)S+Z0nqH?jIr|J%A_MX+)-q8^ZB(>SK7#@BTe=-Bg9W{qi`B-Dla(N=f2I{X5;y(Rj_|pKqfsMbM%=n(H zt{iu~4u7|;5&v~Eo=2Kunj10+6D5a8kPOiUa zpz<^bVtkl5f0b#+b3H%cvD620!#Iz0zvPGZbIqlJApOFV_zG1)PID(^J4g6Xo~Qe> zggrlnH6GtE1WzSDHN?o0hU2}o_m%C;!7C{9QD!D&V2n3*T*n{nW>D zgvZINX6OB6Gu}rgtVidNK4;?piuy7d{zNr*SKzcyGmd*b zgL|ZNYAybMD|>XGk%?;G?_kgF;X9kKkF6~IUu!cvdcBcztmgAV9;-Y=_kSi!nALRd z{(Qp@^b@H}EahXd@q6N4$&RFfI~t3Swe{s(>qpH%RRf)d;%yG(yc)&ploc)H@#^nq zBAsCmH}Qb7mACjrMK{ut`cCZlH{<;q14$d-3h49;r+37k*q^T<#kyhb8 z>NT1>r=Ee8U_gpr)HgcXK&HlXZ~O9?-rW6${GG;puF12sW=)*WGrkdRu#t5zon7b6))6+=V*g}>5Lt9=exc5uKbSbq}B0f%Ec?;P32J=8Ch^6 z{%&>SG|i07C>jzMOHq;pFI1maUZxoMBUkq+*Z41UK(VB{TR(99o^d4~5&tUY)@c#W zb-u+_eal_=hChljVp8o<<+bP7wTg`8kA$P_#;VkRwFuh~f*)!`NaMNF(+&T!0BIba=&Bi34l zrJP?`f4Ia3+p>70hG{N+ogz#C=bwH3u0WCeet@0wi8 zzIc)&;LeGtzqF@{H=jn>SqNl>mXidGPGK{`*)Kwb6;8XpuKh?WNR9F5npQH*m z9uFieTc^+(>hqe7qTUnfL=NOE6DBB+s{V+H>^y0jG@;`}b=1q$hs9~E3~!+tjG%FF z9K_kIM3q7L!*Td`32#in%f(KM{SJ#w!rfWpVwJE6mLBq&pe$a{>m0| zRcZF@qoTQ;%ykMUf$&LbI{eLoOR+nv^Bm2LGej|KXZC~e%u2+fMY!v__kYhGp{GK} zaX741pp>;uNL=OI#MEm_wqFnw6yHfTk`$#O0K& zP(n*Er^J$$1ZgV5Qm`cC1tCEVMP(9HLQvq9;brXmIh)(t|E&N05BJ=2_OqWo{PyrX z=dPQpbZ%T9x93Gz%b@mTZ<9Bs?RpcQ*W8*%vGNPkdp!ql%|Ga;JUq#KV@Tqq;fei| zkOPab4{DAN=^lsn`sYR8`*u8{3aWblo%J_7q*|(L@i20oY(78qn(nu6cY1o?YF}`& z=i{mpz^1UzORKorUu%zE#qp4^3@bgi$EAIhMPcGIIihcL@Q?ClEUbK~`>9;~sPiA$ zJiju_a(wf0YV-A_bnoc6|C;8S&5=v9XZMqOrT@=JX4HW^ALE0ac}DYfQ{9l;RAGH| zb^GnA$J*!i2ldx{rY@`ZhA93tiSrp58~J;CZ|~m$+mhqYB)Mm`GxOz1fM;A;cjuaF zsb?k;>Zjr%GUyq?Fw?U-#MIWozcqdMKoWUe*_)G-F8z#j;^Y0tiYfXd9}l04&wit0 zMzniUw0$|jTjJ7rNyjHc26nW5Z?@xOasIP$>+5-guN6~%vH$&jXyBd6hB~R^&ztWT zEwZs=vb13`bH}d1CxrEmyLNt^M3duo1g4{pYG5nNiIK- zydKrJeWT$Qd3Z?ZXIb!T@@o9nRrwFG^z~sM*~y!u-5UO$(7gD2k(+0tJv^WI#Kx)b zRYW3x;@N?6?&<>k$_3fh|40sw3JtwH`gW*?=2wzY&u!ka-n6G>D_`GeKb&ly7&qiQ z@j!m->5EKSgLq7~;~MYVxCN)3VEwqHi|-QwFe9MbF z^p@E7Z~y$q-ube}S83bfpu>=Z|hm)thQV{>lRBsV&|?WkM_pq zN#6DJFoAV?`ZGV#aYV=KqRl*tZa$R^*n|9Y;nkzEKJvr%wBIp$Wx2#o`gr8!p5N=9 zQ4RN^m;F;~T2tmoO;{WX+y6;+`}gzS=HS5WscNlfHOk39IGUf*_4QWl+m#<5K7tG6 z(XVW-^*LXZO@&qQxAwDe^=9$!VfpVTMZ*ggjPp-&aJ-Pve#Ym zAHS1#desuUc#gGL{No|llky1m*iz@vBeG+h;pav5avML*!ssVHw{QL2s=Kph=Dy*e z`-C!Y?Y|diC(jBue<=}jVyYd?K)mhs+{KAB5(4^0J|Hd9DYaFSrZPt7bRJI)>fHErRUE&)9`K2{ zZ)r^YhnP_Bka$vMTkTo4k&lM0Cg*r?dc~_w4oTioEzimdGI4Hni^bKUL~TFm-ZytQ zF>KpdW^2}UuWQl{dE|?F)x&XZ8goZ<%b#rRQ$-$Wb2OadH+ytc^~V#5xEv<+@~LKDXiGKj7@cqvY6P=3~OB=z3`* z@PEDsX0|swoNjNgPlQU|(I}jw^NkI(ZiS40H-3qX?FYn9=!#JT*WoXAQ`^|3Pwbo} zPyvvqzNWE=9eAXxlMT;P%1+yrmkZjVYzv6 zH9f#{W47n)y_y3n$Q}{Dw~rqrL=Ezn(XCz}26HaDRc-W9=mps$>uel6iyG$r`pl+T z$1OYWfmv$3;kuI4DfRz+e#y$5lun+qU@Q4KH3hsKy}vF#iH^PFzK+Y&O??z+HmZMX z+mj_l*%Djr)m7{fd3g7Q z{Xd+{e<+!kFSOs~bJIP!;|Dd)yRr#C&0ffc%BGy!weZULU~~C>dsO+)M|xjX%AOSZk#wYOn|3@Z9TCaGbMhGW z&V!%HxLyi5GC3u&ul$v@(=W*GsH4!?gVT6>zVRDkA+|-$<~faWpZKi;phiwk$h67< z>?>zPrqqPx+uQ^0Vf&naYZ|J5d%C$VUi6l>%v9m)mLQdqd?H#KV>d0jA$Ry%DSwCw%)zUV|7l<+VH+buW z4w&ns9eg9*kuw!tkz4wGXSBCj`hwRcS9N37LGO+l+_q`{ZqfOa#jdmM>a|bpZ*eL; zfcx3jo{XNgJ~&-@VRmBQ<;;in`Fmz(&?J9)bhb=B_Z1<)mlRdMeA&6{pmI#2@V6vk zM`Y>biI2|GeI(ld;cf)4V-TwURF>dly?5;0)<7h##_^%WZmT(6+5v~d+xGp3OZSY= z?10!|O`0b6sE3gJswG^!pegI;&W$%;4?#f*rzGQ_>%PZ@4L+3Azq{PRVMPOPiqVVRJYwLPb-Xi6yDj!#y<0r32BiB!&%FAQ=Qe#N&vjDS zrLPrnoznLgL*L%>{H1-vQR-i6rh1cZ&bRQb(<#K;Tobyp=ed5Lb>*VT=pD;k%Yc5N zLvO&rOJ?tNjo^?d|714jzmnt|vw8Xkr!P=;hYW}(cT2N(iF#5kA1uF2ht!&{&5Gz` zd30y#5>a#WeL%Vm^YGtt;4q$8NlrwqTF2L#4!(?x=*1B0sQc>~5sT>e{l~1P?rqPS zd{O+uTUbKwTCN2SRwII$VeBU-q51~(?;c+-$(iL#th-!O#^WE0XVh2Z%Ed|Iar1pf z-{*I|8ygobRyWpjuvataT=BeqSa|{ceeAtT*E^Ov*W2<U!B z@2J=Dkh`So`YPcry$DZ>TK(jD31I?$mEU3$^yANdf(Pe!j%fVqly6VV-n`&-R)lR( z@5VcJ_Nu|KNb%~Lcs0F&XU4nlHr5-L=XJS{erec<9e0%z8-+gFgNoHW z50d?dF|0k^At`uvx}}2kuBdufhit$8JTc)0c_P=4^N`0``INs)kJOR*kI!__S2>Hz zk|7vhta9(9T5eqL8Xt9Gbf40lKakG9HSK%lQb&BnBDWuk8=hyV}&OVRE^3{$ncfg2p zedO0T^~vG2JqP(ySk`lD(59kqFEMkfcX96|KaBfck(g^fF3Y3O%$edL&q8}m2VGaA)f<2|{usWM zf7TD9Zq5Iym0NSB>s=2md}80?sp&xk@5w5DI%{%aK61-u{*THIoKznA=lAe@wH;fl zv3cvBzF&pwZ^AxS2(rDhGKWOPi{rfbUk;xwg*W(Kxn-R|Dzv;LOnF(Hgo-?q(S9m# z>aa)s^UB`X2i^(^YtvuW`bG6>bs^7DdP!8N)yvV_^G$AiO~*-Lun%Tc)N17@_esYe z+ue4_M(Gumi?Loo{?#+Fr+1ljzhselew)sTALRBRNfmR?VtrP}?j1XI?AD>?;h8mZ zi@G!9!tRRe`h#>Xz|`vh2X^Qx;j83Y>7!h!IQdD@CiiX+@%_R@LzIAi$9>OE*_5|=e6TS+bnJ%#hB+VO#$<`%< zSL6ZC&Ks-2I`lKibbevcFTM7(jD3cQ+dI*Y&49@ z*U2v1>+8hi@3eGSAIinaKkuc(UVf3rikablw(_j*Hr2#0MbGD=QP2PB*-yRQr-h@w z&>fGv8z(J2}e%ZGSy4r@DGUue_Dt&d&;;*LcqAxAVK##c|@6{O;6M z#G;%!{j>b?1A*U z{OOy+e{Wf`KX2;wu)NjbOFzR07HxxS{;t3OYSBA&iCvN$eNmS;LUrCRG*_REZ{|>T zTWv)wqo>=9>hrKt;)fmZj@aV1UhTQ06NHqU7)F%CS4-Bf4hKFyi$Z76cXWq+`~SY$ z#xYSO2Xjbt9+Y-JKijKEMEy;S5C7x6_*%R;bM^g&H+;DqfZciZAD@~$cm~v}x00>m z=R{0z3p46scxy=UqsfOFxSX)QLcIVg`tsa*nAlQ%hC8KQFzfS*JoK5%x9cYod+gKy z^_Y47j5@=k@7BZ}nx6-xYxj$%;%{@zpLuS8wOhIYe;CT*JK)~)8kcUYZ>J4nLUz`Z z49JJvwJ)8^_9({3@uk)X!v1zihOMpKu;N>fu)S2C84uN~_v)-Y`U&Gq-AG;*-nABk zZDXTgOI1X9N;PtQkY}fN*5s%q>IphI?fY8Cn)FGw?px7sO)ja{@2%(AXyxYhUeI4T zoeMfwen3Pw>mYxg)l-9bNW9xMdiTxa9@P9>d41TDZIZ|0e>{gnj@>NF@#ud!J*`#; zuwF`K0Rph9>B=}~Z9Lw|%i1e~4f{lgUODTKUQvC)8oWK1+V>tyZt;L3Ab!~h`2~3+ zYr~$sR0Z~nx_uX`%03&L`ob@o9UX!Czt~juVrw|ZH|!UOUzk?z7ti^C-8yHBcydE? zeNJfZ#3b_l(ew5^mH6e*Fx}fjut(>Yk6UaoURnDh=L2Kg&t=!743^TxIGFCg)2^vH z$!+5;9BFOL9?3KRA*U>ce_h)CnotQpOAf?8?35asUWjuRTgsZk-(Ooaod34=?15cR z{gbWu;|{$s`)6^in~;yUCPVLubq!WNUB5&?`rzf3?$HSDpJwd5NaOx_@u}ko{YNWJ`YD-PHcXT=WXIQ6tnd z{extaJ(_&`tPS{jSGXwNl9W56ceCb>{JTHTFZc2Ku-idVrq^BHy!t=i51a9|yzi!I zqnxTZO8lh?rbZ#(!Y;#(d-XY;)MP_Xw%o9_nKYg*!Gp)-IX%Mwo|`pxpI+>yJ{*{l zmk_T(L+mtJ(&GeI`@amgdVn0aK26-9d)8Oz7ZNY&O*%Lk`0K2!sP@?6IPuG2VHay~ z%;T=hJZ_!#TXS`5e7rU-vi^otshNH|3w%X<)t7YV5@W(>);8b?-z5hFV~cIAi~4eU zI_vLL0dy+Mec7XZo-Lp@r+3|&9lE0rXxC)mam$R52K|7$B{@4MV_U~vbr>8kNwa#GcB*?Sdw(qcRz{-Sm%@ZFgC;z==MEbkcY%a(~*vT_m^%qbsw=aOL$J#kol#J=k%Vu)s@lt^Jd&?G@jdf8a|z` z(ywQ~l(V`s1Z9Qznm(sS^20t!yXESvIwH%HBh(M)8rBtxZTK$nr8(ELEMBwTWc%jD zT7K)K)HLi3tM+#@dsOX~~sOyg%HqdO&8_Dp1-E^XB4P}vhl@$9n7a(UA~zj@lJ zhnn{2m7cui+NiiTxuc2JSzRApIeyWHkD;HB!IPCq1)AjZFSh|C_iQM*4n-JhC;V`U&|8J=wFm^egfE)U4at z3;MgHd4ON!-sms?tf!ENmc8++t6*xIW^jXSCWN+GBYIerY`;h=eP7kncizLOh==Tqq`hrurD zSnVlb{Bo@Fq}GXS6Thu66&HvDo|c9^w%Py9IJQGt2jjrE+ch(4#B@xbn|V^BHg8r^ z=#H1OG9EpL?7SL_d6&z$GHKRjcWH<5+LuG@P2$zV;AeJ94jSLYxav`SrreI*y{)=Z zyFfp_!hK?0eU|D^`dsAZ??^`8;D0A?V43&(7~R_D_Ei93oy4x4}A-ryXnu<84@ub(6*< z|7_(7|6&c?&3!^HP?no+!9=?8FX|P7`bE53+m)>lly|1fgEemKu7ji47gp+D!q(QF z99Oo)T2H=2u2en#>g77Hm~1#2Rj$=0tzx)WvoLG3^saB(EL&^If2cK)eZCZrR=CqV zI*b$NjC8yVJ>es+h+~&0%X(KYYAp6Ax~j3P4+0+tbK-Jc_SfpG`$VQ5DSy=0M^vlp=I0ateX~_tQl=r%%|9+>l^%#k|#M1hr z{1gwt#OmEs(_OdBJ1rF}&^@-B{?S6?(~BZ5QE!B;$Bvnq?fTvN^9MF-8z(h<)eY%5 z8}*~^BJR5&J9SRh=ZvIKCo}tM#r+vkFCTD0l#AgnOVW9!Ym{z=WSRlZh1 z|4!eYPpW6i%6xKZ7t7VUOtu%EVPUN#kwe_9Iauu(q5f+hTscK@tFMj!fdS+`3m}7gzqtIXi*I1{BYqcKS3T= z<6|43RCZa`$GlwBTo^CBX$?M`r{4v}VQsA>b6;_)ILIn?887SESqk<=jrJj(qc_I5 zXaKAPr{Ju38d{+xJljTbX0t}JNw0K5&E2|;>2J`@PNrt%7i{f$LDrPhP*_>=V71xJ|99WD@d*-<2a@r( zp4k{~&Zg6Id*f{0U1TiivwXW1cv~;`=2Q7rD^K(}!7xUw?*whzMkoFmgLRkq$5)dH z>r~i&_qw|Ix~iGd*~Su`y`Wc^=InHzC%dqDQ_0lf|Kn&D7hT<)uZvo}4k}urLw@AC zu84~_#Rq$2+^hTDXR)u=uzKzXs^orm>{TT}&P$Jy>?K~Z*JesyRqlyr5-W-Ra0#~{ zXL}K>%_dxP_j~*T9l50M*;nlH&Y|yDFZ4kPY?W_3gM;MzV7jSf%f9G>6N$qx>T@XD zda+1i4u{%}Sj0~@md5dB#-^%dEuAqp{6#9Si3aOWMI~_JH`4bti^W%y`(D(3FPg7t zjDz^~^f~A(IhQ{iDKmF0J@2jxH@J%5V&Au0IE%ZmG#$5F$SzqZRW|GS>`7vOh==uw zhc4G52jlr~j7zi@dKFFS=i75%IFz}YM|2VlMwwj5CTL? z{$M1Se^ydKuXdIrJ9bxqZ6-6#Bg}Z%YO-tBAKsL`P$MIYGz<->*s%Bbw()WFUd57~ z-MF)9*5wpn#t)~VZm55x(K<7 zk$hGMmcAWh>CxknUF)p}M#ix7spA|COC zsKVT_l%vg~*^`;^O7|V?h5bt9>g2O!E{vGJBd1nxp@1f#*H2WhG|7C7+!zV3Jh7Bg|4h=!0k@<#GVKOJI8WsiAgzs*{m2lu-@GMqu{$&x)ZMi*{hqye2`vguxB z`{^#KtsM34O?S(_eNDuS5TA~82l{z3BcdDhVq}|NW4G{%hRU7Ed&B>BpMqSVh}l>C z!O@69ok;A`$TB%0y)crytgJd@Gg#}!g>p!MW!3iuQ%^=~JcRt6mBo-1xo5SFjZIqF zYIcQ|!X)IFb+U`Yrcn*I`P)0Vy}}WsKrZY7{dAr)pbS=kaKa;N;**9j=z%JdHC!3vF)_X5{M#9Mv zS$6k(FaM!$B$O8TIr_@Nt?Uo!VqMwlv9j(w-;*tI2FvI(vlD|{1rDu#vgX4zw!v@4 z>OG!~e2nK9KjD26f{u}-@s2aU zW_qMRlxHV6z7-PkU$zJJtdJ3q2J=R8hx;=Nu0K~NY5p<--$My|gLkBXERK)Ez0p$K9H~bwPCCb(<{Vn%T>i)X@XS4oVD9C-(Q2_cY$+a}S!7$r z=HQ*##Y<bg%W6 z&mN!VPHc6bUj3Z^@JQy^e>YnG>pG;GEyYWbfqS^Rp3s>`7Kg+QwjQ((?TJmG5}kvC zS4brZFx%sIhv%p_Q#6Wg9(wta@i%-9&p7$O$@f68@|(IvCx#)bqL#7hVt=wR(lc|c zk74f3TcTqkla=S3$PR)UoM%Kl9M zHuyhrVNd4-o|*6EWGjCC^i=v~=>v2LU5?tx>Z4F^#t$`p~1 z;Pr@^cA0Ij!^=S%c*@$){;@Q8Ov~}dtg_^2HJ_x_n9%KPlHmV-!$UK{HnI(V8as~q z8vl&C(K6f`dYnNfhVy28JpRaxIazrOwrBjGyOL4ZaTVF4d*T3`8=kN1=h#%AMa#?& z+ic_$N3Cqr%s!gv3>wDs;5a+Jl4VjobdCLXEwki~BVRb>+kCG$iZ5e1o$YIEE>6u1 zk9NB{4&vR|CU--rIX9Eu^B14AqRQy}k8PVTv>ENZt}M2n|KEn1HiNjX$KHC}J0BkyjEY7Xsgo*IqxvMvZ<~^Mwz%=DubV57`tvT|d9* z^p{bLJx7(_$Aiw#!MtPHhifRI1FSVYp)spyY`unf7w3(F9UmDS>ES={nI%E-poY;B z^UUth@zHf7aVGsiD?Yo>yV*+C84qxx;DWF*l2>}uu5=fAsLDt>fU1w%x zc3l2*x1c!{zd?v)x(u0I5)$21C&ir)Uua#0Ibc#9oTOHU@z8YqQ)mS z0jw~FW&qZ$P~ym(FeWRE(gST9jNAo1E~12wg7N#{%V-1*Y4C+qm=ikC6lW*^z=3&V z0=UHda-j|)<~0yXDI7eYij47C) zuP5fe)?W*46O>q6ptpv&x7uF?=Vs`wf%}n8B*pQUNH^?jA?|M`cm~gK49F8Wf@Wy7 z!g!s~Z-db~pmqSY9MD641=12JMgcAjfbT>;Mp>i-n8X>A;Bw?_4najW%neEu7tUEk zFPxAkDCavWOZ3Ym`rg<)nO~gkl>t5f$24 zBUN!Gd{BF#4sjcJy4_6Apf|a*9R>( zwDE8O&D<~|)CXR;52X#I%SF`qKBO1E6(tdWgS>|lh?>Fy=Xk|IJQ4NBC;7zZ;3(_> zd^hr^oA?c>d+-_fjSc|$8{`RmCOI;Eql4fMC&4}V1ul3V&JX#IoINk}eEM>f44f0> zC9IJ$co)f8$W?eHfT&R?pw>VdB88Bq$a6?2)Last-Mq5CF z2frZoIribbsM+zU_$%_a_*CQ~d>bkAJa`HVXoY$T^%rsy2^=-@5eG^Sd>ISA%k@9b zK%Ib;Lw@lAZOE_3*+7bVV9t>SE@JL+o{@5-u18t4!kG;uw1v1%>RXgrQhQj4`p0Gw6S0cb}_`l0^sX5ScVlT?C09wc$Sd#LMZ^9Oq_#UJnN<8WcY~eWt4tzU}xQ9xN1F1x6 zG~`Cq1!$S^8<3Nce^F9V<~=}Js+7ZJ}xzkrl^QvOi_QLgbfNG0?Xun)Bk{u=oTDMf+Nkxy|FQivnM@sm7P;@o_)Z8!(`M0^%%F0w`Tpnk)*d^*Et;6J<%pNyIk zXAh+W^(8)+oMU_zz5)Fod?Stq?F~s4^b&BSND=%;+8>lS)D%cnyhh3;S|c7oakK+S zc~Vy(Zz1i`3Skdw0#dfo5}_R-trY$m^$GF|>JltJ`F(hX9E{gVJ%jcPpF-*(9`X#7+u-8KT9z6>53(@aHkJAd{L2ZLp#z~yv*Wmb(H<0u2ob+^&Cs3M^ zc4&if9#O-SelyPHCtnb0ASV2J^Z?OQLqARgKo1XnLG<+$6fH#swVa|RfM*(tf#_93 zOARgE|N8XAnUT1vrRbp_@5cMJa79U6RY8q?SfW=chx(JxDF)pmfl;83g8mBH7&6`< zOXMHaL&%@Vub;Feaxf|Ts7X<--GmNqBWAN1=B*iKw+Tw5M?HZ$Xw?CYs{GYJp-O)_ zpcGI6C;^nhQRFZ47yEPl`EXX?&xX3lUr3+;+6Dd`=)+bHl*Rr$I4guZa^M#QfI>L1 zT?{R}QVK^t97WJm3}^VRGB~OMSmJo9VMG`+)WLz?B#s&R5v^1kd>8Todca6;H^?+{ zJ#sopV^U&}uISy7J~w*y=&j44)B@0#Hvnz09YP7Egu@X=X-D~t(gDi$lupp63?}#xIRN>U^h(gDK^sB?jZ8)YXk{@HXo6X> z0&OuOL+Psls#d{SB{9<#|7Yg&2^!`2v;3L<3^=e%1*H4a{PF%oe=-~~{y2XEoW=N~ z0kLpI5OplHV*pVEB8he!+!qI}IDZnfqTtu5@Qeh13Op|Zo|+D2Hu1JB-~;3mR@J( zo(3pC1BAiR31%G82`GS6>V9F5a z?*qqR=<7xF^(U_49lhZ>z2GW76`%Gw)IACMBOl-!I|6@&6C()+4nSTr08sW(BVhcf z1dfyd#Qy_EC1@Mat3ZDgH5tk}+GNseN8U$&4Rs?Kjo}<3-RnVms-dhRqzlVpnCmi_ z^J0)@l+au_il9sfs^kN0kUlxU2gng5y)vK=kwySHBZc4)Y$Zc0ljun&?#FwOkMP%6 z<^qtX@GZIUWYip=^aV;ijsfMq5=L1AGLJlpqs91>q&|A3sPEANVcdZ}&HwL_knu2D zZPMpL?-_kRA@Bj(P}JKPb7Sm|u{tSHC|w%h3nR#T2yjF=93emr1WI}bpi@_9bpZZA zsYluG0zFug{L&3toq?`Bq3lBNN)LjAkdN?=?f}#fNPE-`_>>L==OG7>`h=u@JCJ%K zXdfJd9)Nnl03~t*>H*{jvJw|atq&}Jb2gaRcyKp8^N8Edo`DCM1@2kl5l!k(ZO>OcTB z(Pu;-@nC)n3>=a^vRlFR%_sBAhbsnv{8$c!Q7)SfYd1i+7!Zh zDbS3x=cJ9#CwQZP=*@#N2Y~tnOOi*B7w{al1o8xO0ba@Z-`)5Gl0)#<=rR6wJU4Wafd4PRKYR0Bi_m2XSW5pC=KK~gS^oGe^Qy{2YHua9E!thoy`q0kW@<^R@@b~)fh*8cs{l?w zlo1*Oc>}dNatEp1iwP={z8+pf{ek?G2Q})EeBwS*ub_^}BdCnBUr0O?{YKVHRKrVA@2+& zuHf&C1f>mxw4RDMM<8GN2DiCHn9f zGvFOa#ZtnqAeW$>NB+QH;P0xS2R&1yAsKt%TQTp9>jo&vm~BRRM*W2TKk}muMvmS9 zxn_a7oy>Y+4hSPZDnU=Qi5O>Ny!9zDFSVE;+afUHT+5`9gK63~-CKcXwt9pMbU z3#`#!Ky85iDEa6uVB~=|0r>|uhdv|v0x0L03q&hPuCgHIF}lY%3$-cI1S7yQC^70oi6x^q)ZL`^Mn4d}J@oL= z55yQD4uJ6h#sv|8NWe$H2f#bPTLQ14eDD9y|Jwfs`d;{-`(Hu(mH#D_uc3V9e+qcv z|JVNvuDv08-$4Bae)opBj`t$4=RNV{ckq@7XyZA?B9ZXM2#7!8i8=-1ktm2)GGUw; zo8YK%>}Y>-;Oo%y%>yk|0xjfLILjYn*4~ zIm|5Jtdn&GoRJX%+5@x@1>g;!AAp`FdKjrdKlC6lHo;f};}N7Pa$`EQlA(H9YGmO8A+UthW1D}8%-GlJJ7!U4L3 z!?A?27|LaorO>kk>P5sE*2^g0K<^UDasXamO0=+C0liBptKj+qsJ|o5ms7rl8cY1u z3g}%4^*5B&&`16fe}nH@3Qr^7xr}(uLU_so=%4?;Q7wShJm{GRW1d5_XTg;P#5c`> z7JlEX|9$6l3StIj3S|<^%yg(HKnqKpy$LXr;|Pp}S;cw98hdb-u^tH+2fcVcn!qTa z#z>&f7eJ@sP~tHJ+9QB=n6DTDl*N2SKcYsO4u+#Y^baNS7efhpe*wQ53dd;T4Wr;4 zW8j%%{?E83!x*O#2htADz9Q-w@O9XO-#8V%=S$-2um>spCG_Dnq&m_Xznr{(Hsx!$ z{x!@F0%vJH%osU;IKPWv#&P!N6LiNJCTYKvn0LIokoeUisAmK43HUzbBrLxoMvJ3C zj+{(jJTZefi{pve8%508aF~ffa0~HHW|BNl-3TkCHne$kUtIR zPK>?KGer4BuMzV!bnrqj6HBgjkn7zj?aiR&(37bF`%(v5gY<(wMNX)LFh>>(HYVM*Y=>N-q-+$MC3-CMOD&R8Uoc}x=Kl{)6&-hRHPx+7f5Bc}{ z5BPWbcK~+!H~H7YvDLrEzskSbzt+Fpzs$eHztq0~Fvma3|CN8He>z|yV1j>=f0Tc? ze(+;=LUG- z@I$W`uHk*y#wW1hJ~r{jKzOSHMxyj<{dyQ(n7fqj4k!A^nc_34(4z@%;skQ z4=~T$VYW}g+@J9O>oheYyRH|+Fk=r|uR3&uFzKgB;5 zs5chqHpo8|j{ZQWp78ab0c}EHPSgZtxIhb>%QirruijS*$n<6SqJ1&GH@?@te*kxU z_k34Ec7k*&GXIiP4!Lpjq{E54FwGJ4e)jM_40M| zb@CZ}?R+|)(kJyP;E?zPK9Nu8##z)as)#P}Bb z7WlsNt@W+wsVASE1(weLwvGeI0!*{X4)S`eHa1(Z8n8q|X3MrcZ?@ zO`=bse+8IKpGcgIrw@fUb%!^K=@Pn)W~HUVsGifF(yqX0chYvzR?)ttjiQaAb*FWu zF=$L$HMN==NsXZ1rQWArpq``dq3(m(SV^5qokr~e;8O+EdP*%Nk`hh12eWw=W_1r` z7tHV)Lfa1m>xG#T^h~S4|4Ikyyn@)^p8qCD&(9#CTm4@Gdii^U3_&Xv#-$?09sAum-;^kojV+)`Ad-Tb)dhGg06W0HXsUCV$gTSby^`< zB8*#mLOvROi#3$Bl=GBxz;W*>)c_I9Uwh!Tanw=N+0^;eZPYE)OVo?hchrwm3$=l2 z0PdOuoV68jj&`2*H|-H{QXH)kK&R7yf4a~Y(&qw?oTW$6Bk3l3BV87t4CoWkJz!?Q z+<+|s8v=d_xE2r<@G-yw&@&8-@r-ed&5W&#YmDC*?-*|xm5dr7HHF!M`5AK@b3Ai1 za|81_^CmNwnaO0axUAl+o~)UyS**3J)vVpDeXNtLqpZuUUsz88xvU(PpG9T2XNR+g zvWKxJvL^s0vInsTvU{=nu)DLnum`}|WWX}^Qub!{R`y}`e)bOb9`-i&M)o}RV)obU z8SF`LeHzsB*>l+6uvf9yvRAWL0LHrM&U(b!#oEvMiZz4Poz<1aV)0l7 z%pB%9<|XE6=5S^$qn>dTFp$xo(HdY2hzW=cxC~#vE?{jyuYleG4fHztd61+5^uF{u zS_ADi?H0)DCfaz~1e%_vqcu^RsE+}w0UAIiC7W`Ba+L75a7FtbPfI*y-|k25jqVNZZtkA$7MI!e(Dm50!?n#d z&NbF$aD};OE{`+and^M$yyINw+~6GG?B{ei+>ZB-H;x^S-HwTlu@0d_;%Koq+cWIx z_Go*oJ<1+oe`$Yhe_+3FKLVIq1-N4W)&9}`pS{j* zu^Svp$7sg{$2X1@j-7y`fQya`jz1hX9WNaJI#L|z4!fh(p>}GW6P=Ts+nt-8w_r9h zobgVp)8kaRq^=>ZVXj4hqpriQd#*oS*{*aK-OX~3bPsbMavyOgyHnh9kJK~AGtcvz z=T}dSr`FTM+rxVhsFLMP_liN*r-O8#@Er%OlIiOX_5NmE$u&=1a#y^`UZL)U}(UwfO`NhU?O88V?Sdb<0ZfZ=*H~9+|Asa0haibHC#r;U3_gB5;O#fqRa7hkKX%p8JlQ2PgtWabw`>G44?ANG^*@X-)R6~<)-7qA|5 zL?S(b9!3wR@1Sj`HBcKt6U_s?-T?Y)4F$6-=!re^JpmmX=v&}j=>6#V;0gD%^PG2| zb30uw*Id_Z*InlWr`6Hy=>k)~)9%}g;5G7mBTWIk)Qnp@0^Ez2#LmJ~~erY=pp znzl4OZF=3rhOy0WUea99oZY;%<(n2pE3Nfb>)qBd){)j&YrM5zTfesRZ9lhpA(^t< zw#(MX-p9^%a2$<}2FIVk&wX6|U6)=z+um(p*Yw~MUjqLW zbG;Z5MS(S4KwU)D(lj&+%}jeme@)*Rup>akkTA|LPBZKbCu0e7A+wxW!Q8~!#L|O) zjAF;J*Kt;Jgj^x_KKD=V6yA7V8Lx)7J#a%{bD%wNQ_%XLwjf*3W&SVxd4jJ6?SvhL z<-$_o2GIsliYQ&A6)VJR#2ds`u|<4G@=$U<_)PG6=~iifSr6Gm*%O&v)*=(igXM$e z{pCmHr{p39Pw`msT(L+wS6QbtDMzVBsMZ2DtG1|)s1B+AP~B2lRA$v^^(gf{^+UBw zZBzHq^wG@He5qNbS*_U(H~=`LIjs3!vsN=&Ge#4r;c4R33F_nOqw2}(DQdM^r7lyI ztL~_7tG-jMRt-}PRdog!R7MqB#ZvvPe4_Lz+=^zoRsLG`LiU4nw{&ChhTyA`UnDNE zSG-8PK>SSfOjIeX7E*;iflMG54CW8z?+w}+^dT@h(8F`^XgoSEjg!Gy$Nr98%QP{+ zWh`e{=uPzfw7oPgcsIMjLy7aIdZnHq&qCL7SD_=c6WeR86hQsz|F? zTE3#3RmLdGE6FX1FHR|LEUGFJ7b%Kn6iz8TRdBkXJik1D2p}~tCGW?)(|K3(e$8vi zYt1{He<*)Q!LR~TL4CpI!fk~Kg>i-6LSJG3qJBl!i*6K+DIQZCUJ_mc>a6r%fWAyu zHnwbB*?hqHvU6o&tutu;gN}oa*Uq=jm#%+Z$K5B~lRc9?y}iA>i+#&{xTu;SBpnb}OfibCP$0=LJQ=;M4j0_y_sF^MB)C zg|dQQ!rvj-DcB+0F1#taEs7RLh;K{oNrnaw4!#dyNx9PV(lgS5vSG4dxlmptFO^?W zTvl{ac2r(g{-U%hTa;r}<5f3RzpMCa0r1grwN|6kL})%}Hfy(PJL^8vrRXwr^YwG| zAN3J>i9uqRYM5d;Z8&SlG-Mb$89N#e8V?(@jTuItks87bVT9BeYmD~*%K@DLYNN*3 z+t}0iy>X-QiSdy!#h7J$Yy8)^(zwP*gOK~K;Q>7Fl;OGIg+XKtGEO$mFpf43H$H`) z_xktxBf5jSx!OhAt(uLRBz1~<9N>4=4b^+)2j%aI8;X_k@8n;~rpXRVk4rUDg|s=? z8vG&nUGS{n*})ej7bSm)Z-{>tT@(E)d@i&LY=Q}biGmya>-_gYAA)`h{4KBxuM6*Y z&UFqCY|aJnjQTM8GOFlR^h>l$v_8~6RLuQ<0g+jZC*Jd;`?&j&>#1voYm#fCYnp3| zYlG{1*CrPeJQKfz=3HQ(Ywy|CyX|?)^Onz=+BZd-VoVPk?lxr9<<#+Od9|J@U)8#b zwG~TBmz1_IYF{)ke^5RvHz4;`_WkVItn#dhSu?VZX70;el(9VHv-I%v{%M2LglU0k z$!Y0nOEMN@EY4b%H7aLh&hgx1xv{x%xg|LzIn-=Q_Qi}V8I#h+q@7FoCFM=>zsY-& z_a|>j-jvJ$xDwroYZBHbxZ|90!{bK8WyfX3#U{ijL?pjY7N^V7=~=!^d$uP#KPNlK zlGBoto0FBZD0gWtJD-u?QrK4bvh+piwaTlNSv9#e`E}WKf7IWre_j8qKC?cr{&~aS z4L419O(@6Bt=85cJI6l6Il?)?HOe&)e2_M0oAajg2KXmA&JV6Pu4$f`o{13OVt(!= z^#%1R?N?eS`sZ{rc;TBEn;2!Rau%1z;eExQ$?q-dDe5liDH$C+GWbOBkHMRRHwMoP z{wnxv@Xx_tN~cRN$}Y>43WZ{^au2v5-b#a4p;@S z3mk&8!ZX5ug)f9sp+xu-{~Z5t;Gw{S+=DnA&X4TV?Dy<QM{#z>t396%ej4Wg)v)PE@d zP)0*$X|;E?cfI?2_h#o-=V|*%ds16^+n3hK*6FQZw>n$eTDrIPYJJxFPpjOjvG%fl zZdF;0))Cf$)+}qWwV|!N&1YlTuh}nv*E`kjXmhlsx2ColnnRlhnfse3G)!nXS^Hyc z`|9@9y()WF-YLIZ{zciavUer#OE|^s;<1He3k&iK@?`)YELD7!|7HH`{8#z4`Sq~K z<<0L@@OeR0K}11PVRB)3al7KTTRyjZFMtk+Dvc>^DsC)}DvU3T z%a6*Rm^V3ZPww8_6~Nz_xjDK2gvksAL{nhNgKtDm(5qqZB1=WVXa}U$~I-&ecOFok-f-X>?m?bT?$vGJIx&i zQSyI~A?XG=gD^%o;}XPL*{lp!AI?CIo!i3A49p8$!C%4;6|@sD1T=w|AIyIf_$qKK zZwD_9{8JTA&HFv@_rS4&QG%bvm&7H~eChX!O$yZ2tHGv!t(v78s2ZR;tNKaxwR)y{ zp=Ob0x^}9zMcbw|=ybXgZK<}ewvV=trnja6{E5}dmC87IqP(N5z3hDOrQp$$;gX5s zX<~<{RWv|6R2(MJONIxJ4qhZ(AXUm#vbC}`vJHTVvPm+rOeDK6eIN~x(xo6A!6A|m z$tv+Gad&Yy@ow=Ru}-3uJOeaIS|qn5e@K$V$>PhROQK1_Ny6@e?t(M?v;33%6Z}9y zkRVr(19obM@ByH=u&;20V3@!asxd5ydSyuG}SylCF$ z!0!V^L9(EsK?8%H2fl=NJmDSW9_F6noB%m-vHxSg0qJ=UUSJ$M6%Ye>3%yC~1a=0* z04eNb_V?^{>{F~WEIm`hoE$JE;78gS+5+kvY8%BxnG6|-cxp1Wj9Nlv1HSQp>;J*K z-D~uOd0N~}ZmyT-bwMu9M6pnM(R$Km19nn(QE}gS2xRcgK07ygyL(Qj#FEwOyuN4Jogf0<{tkpf4Xo6_~h#$t?Czb z7Izj;5lT0<+rs<8pM^Iv&35 zpm>+KtE3Oa8>fTE$|lQFVn4i)|&*eCb^-<%s%7<4r7NZ=jrE$%S(NOl1un~_D&r~gU2N9#fB z1zBD`?KJf?71t~e`wsh#dyaef?jZMF$V$v}&vhqxl0EG~4w30^ z;gUjoeoOxG+_Sm)S(#avGp=SFPCt z;;BUwi#8N&DL9a~H;g2r5j2kDk3Y+)%;YGTc2Nl zxAAskWMg#WtA-a1JL`AWv+6nZ_4PIN;ie9zHBGCVm{x{$pnZ^irt>Q&%f)sbaUOB* zcIHR$kPfSfBOrp16+d@mX44U9Y!BP zPh>5Bw}}LePYu`TTjnk8cHgfR|=TzLxw4{_#}lWT`2*IXGLAE?FR6 zEN&3i3!e#|3QG88{KF7q9Dwoz|1H0qU&Bx0$MVmj zyCQoF{?|O&ELp5H0eE$z^ats7X&!LvLfITyf-GI;k=dY5l8p!aD!n502M0)B1wRkY z49*VzLOKMV@>a@~v1NT_{bk!_TV)ElQr=0?QL#a}QF&5zLZyO;SOYO}x++U`7vk$8 zRf%emdV#t|U9S$+=ryfsyLz8`r@C6zpxU5Xr|Jl?vPz{;wNtfMsiE~$`CR#4@t?vV z50Pu6DsaO@k}aaGB9zY|!Y_n_g#CpyAwxI@Y;{6VV$esx$md=nFzCpiDe?@&p z{eyBFb}|?!xC>qGm-(N1pLrAA@$NEbmGhG0XU71?P{(t}W5*unL8k_M2#$;ITHu`J z6guRN9kva&1J>i#$t~kro>^X6sv651+v@Cf@)}vqn94DgE6Y}uO)MT)Yy#f@Dd$wq zz05x||4o0IUXWIlRt@Nr-YY#cJuH1u+M+ajiZkVC@}cB=Ne`2nlgvp=QkJFsllFI- zI#Ziz&$4FylKopYE1QwMGjnHVbb3tsG2s1PX+6@mrtL_JO#7HN9*_e6ZYSMI`Y+*4 zf+9haFfwsyq9{e05}zKMzB_wQ_VK)9c~1(S77Q;MUi5eIqvBnqdrM8_4dumErB%(f zO|`!?TxmFOI&Z2sH=0eBMoVaONONpUd`p2f$695pvt5F0XS6fYdDC^rg|XIc&wY;x z)+G3_nuWW2uT%b@d`VME+Dh4{|&dHBCK6GfI;VIG{PG*{(6N4G({ zUR$TB(fq2prr8I%p@o{InjxBj8mro>z6zM2o~V|pgVm76RLj(IbzgNa^$hiF^%eCw zwL|SzABH>$lcR*7H`k)nnyAwsWR+hP7R5$5vg7vgJc_Z1bF! z=`B-QXSUL9bY+^iR}`LlJb&nrQAswlr|`BaQfi%<>^b)e@*)>ty5~J)EmjaCm&Bbn)F4| z@T53EW^zWdDaDc!n;MhaDXnwb*tF4Uv(o0KWkIYi%}``a&6=FGJ9l@ku25fit>m|o zx#jc9b(Px6p;g1GmR2vVo>)7fc1**V2BAf0X=$;xux(6Rwmrwb#_^qFkz8IKeu_8qFQWy%2aY zuoM3?ely?7-zV5D7$zJc{73Xi6e)?4OaQOGK#`~DtnQ{}z#{K#-8|h8{a}4H;1|QM zhV#br#+Z=kkm}Hy(1l?O!jeLhL$x8gkk|Sb`U%=8+D+>3)hi(e5dgeOw=!Lssr*X$ zrSh=ih+@Bdul%6wsH{O+C2f#4OJik`vayQs3YXHUoDA8?7{D$-lqy>FrD}$1pK7ma zj(WcOh-SZLyLOM(4iQX_wm`c?yFmM16AAgv;To@+s!?m?njbYkX(njLYQ?%>-9FtO z-F)3b-3je+?Rd=ujZ5W#=%21SsNAdEtlSP+t;@<+fGB0O@|p4}NZS>#1{;;V0dB~B z7AlGrYNbN?Q2Cc~r)s-Orw&n%g`8`issN-?q1vO|t=ys9sWhmxs`l!RYKA62Gam4l z`jL8yYJzII;%kLQrjX@JiX^q7TG2w`JmDn46u}Pu4*sd26G8m~2L^u6UCaHJy^_6_ zxte(`;P-$6S`ICO57Z0*%DpoP^;X|`J2 zmNAwuEX`)S`JMTdd5w9!xx`dp5}72XphkXUdVN~`!n%cZ5j9aYgR1*gr&VTG?yuNY zkzSTnwz6bpiLy{p*gtnb?zYS=nct=#)SQ5exLvVUZAq$ToU)T5|*(X*p9G5Q!otR{9{+{U;Tkdx(!D-(|<9ZJ$9Ym-^Y z?BuVLzDk;sI4yBW!s3M1_?GyQ38NDRCJsnElyorZLGoY8Kcs9)v8Q-a4yEo(J(2cf z+W3sI8LzY6WSz`CnLEE=enDeVW6|K!!KLfVzc0_J%&XjAv!`Zl{l@y4rm3bfOSPq< zxwLs&>$KLT))m&>ZQI*2Y`M1Uj;oGmuIH|NPrm29@11Wj>~We8t56eYQ)ts6o3TIO za6l>}iBZL@Vg3a1S`I6ZC1H!$&)F~8UAdjP%LBg&)CkmqSE84qHi=zwTY6hcm(%2f z6@wLrl!ugNl}WWuvq2L8i(D7=SM&{rIzzlM(O6*2Gb)TKVv8vi}|v zO!1rintTcP=`r#+c@Eq=6XN+qb-X%7lcMPbal2A0*G6ihAm_hIGXmbyUo%LvKr>%+ z67U+340xcquNesv^1J%F+M#l)wgDgaRCQPBAv^{wiS z>Oa*#s>iBHswt{ikdN;{F4iem!K%OuWjj@<>POXSRUvpu3^iR1i;1eYaQ`^f7}ZPV zYh_nuXXP8kd$63d6&dnem_3gyNt!0z3Yod?k{*)J#2v-cMN>rI3pWU-2&M|sgHnUM z@TWU1924gT>lRDT&@vX$me6p|$w2R5?{fE2cRN=**D&XB=PbueM-O{XdtqBq+j;BH z)?1+QjQ~rFr6sQ=zvXeuUoG=n7PjQVdJ?ml-CSVFvy3-SH2=`Jt?^?0ul1F+CACv( zrq^UuWmL7R>`*zpd|0`tG`KXeD6VK_!K#ARTx;&U?77+3Gp=X&VC(EXum>55*@*`e z_9g6!-yMG??w7de*r?cWKu|0{_Fn9rSXw+YJ}Tiu!q%kiNoYT$DYBG|Zr64X=BpIr60=JpV0)iXkGT2 zY->(i&c3{Tc>@aifqyi*=wZp7lEvlUln<`zTh&ryuUTFHZT;!SpCHF{(R`=rUXu-M z!gpI9xsqLFK~9?9Ee<<22c1;$f5GvLvS1aQ{C-($S z`>1`R-Jsv1A7>nEWQ5W~Cx%T9D+HVhI~jH@^hW58kZmFRjQfmsgVPXeh&H?j95fs; zwCS7lbvldgjP{sT1o}Ek^+DAF39>iJmr8KLRWDR8Reiw!=%((e{!Mj7bxrw)@`K{7 zVxnTI;=bax;->PBGEmJ^&(X})4ATzPp4OhxF4r#Aa=|Yt))Z?rT9r0Mo32gJ#p&Ma z-{{8~CK*N)&R*CRVheBt45kgD?T1}=Hjm2_;dfh84 zsU1*zs_INtUytJn{hRPC z;ph1C@riNqaq>82+_>1Wv0Gv`$K*yAM8A!G5#29la7^#m9Wmzk-Hsq|&xs-P)FQy>2fCii72bB&h-B-S={CVZ;%7W_b>h#*|+P~@_ z*6(lJ*SOz&*j(6@)3mSkQ0qwBa9gS)%~9wobbagj#&g|!!<+BR_05ExvvQh*mPya1 zkAwX>U71}W8o0>(kNK9#fjv18+^|M)MsSAlzTlk*IvVsE@-sI@zl-D&r3BX%E=n&+ zhr(*@8s%E0QlrwibPnCG#_Prhp|?Y0!xF=2@Fy(agsljh7W!3a*O1Rbh8f2glMQi( zKMjuzw+w$6W*X)g&gf5oofxl6)g)^6KxFw$^&GOaXCMpPq&lWP3@f@W@VxEdMQu_a zg*D&3%KgezMT+7HV61YSaIdis>yB%Wf(Nxw`>Xb7M10Mb;u}IcfdTYOa*3HP_atAQ{0ulVnTZ-m<* zA6g%>xQDE#Y_EKeJX9H`)T_1XMWBbD>i^NdHNGJU}Pa^ni)bi;JRX#FVt1>FVR zT!?WFfy|`p(sV)kAbmT1IFx*S9z5Z??l;{!-FndIt93_p$8}MH3HI2l{t_U-eh@EA=bjl2IR{i`Gp8q-aw?`sQot z+5qiU%~eeqeESK=MeT(gEeCQ{-%B<~+Ka+PJq5i5yMlfQdcb?YJHR=}sby9(-SFRj zv``u;EZ8l))4koj7IwK++iUGfu-h!DEw$~X^|^IC#0q~k|Je*Cw+S{pTK1dwn~$51 znV*_pn9rL}nB~8^_g8t{+s}zjk@`x9}gKcq+>)Dl1aUQ_AO-%`59w(xaq% zVb8)-;FCYfe3aQQt$*4{@L}>3^AeL1QWNa)t?>zQ$#I5QeQcNLF45maej7P6;;V=O z5&a|TBTNy(C|;BR7C`@uz7zdA`oHK+(Ho*W!+qVOyG1_+oR7H}^Dg#PY*t)hTwMHz z_@xQoC6p%=B+N>jpU6pKCh?O6$tzM;q;BIg0v<5uY@^Qe3p-z?bi{x{_br30-U?IP?4t_`RR@Gz)M53`MFWBFM9INdps z+&J!Ekdc4Of5(p##tJWpFNoE_n&3my15&5VElW})DOzA>&Lr)0?MeL+{S4zwz59C|x&Ts!?--E7@6@Ja@2 zhiFZj2H@$N;NK6|{H=bXhQ%N7+(TilZk4h{VO3NssuZJ@W0XP_Ulk15n=tTT0)U@R zXisV5wb9x3`7Mb#7gau3R@>KUr_mH|P%- z_8VRr-oj3gH?*{>i| zPOU@h0lR~?iU$83M4_%&_g?!>`?vbBTB%eicgc3ix&(I(9wr_l-YncE#8txafl~r6 zbIx%NGEXqSp!bJAK7s#*%1iU^aP4)ih8>YFU~lD!wxMk?tqH9&TBfuVHWfGhZFy`d zFc+G416G??nYWpDn%A0Fn%U+c^H9?OQ$vHLp-X+|`VO@nYgN_q>PeMTE7Qu8%a4_v zDpQxrOS#4T;=Tnv3;xV`oD+~q&&)~9NxhnUHF-hOf~1#;FB7GS!HKklfP|HC-^87Z zIUfU?NuyvpNMuT6Qe^+A!LWVR5p^m0m*_&kAJI3WRneO0Kcaq*It%z5XVJh7gElrbV%!vc02uUdO#*Evtw4rtdZHHvZv)t z$=RK|FSj5sFK>Ur{(?(Imy0B&qSA!&r1Gs*TdGQH%HYq7y>;#eUxUZwFaN+i06<*I;ivi@|0* zVBTZSgPp`|E{A)ScZH`4(gi)_-{UV6E*CBpFBM;gbz{5CDZ_a33DEGZ_Jekne!2b$ z?AggOrW*@GibB#t(?XAh9SKVf%Lw~5>`Is`)Ez1Uv>#SOf_L}y0tyR+k+lc8J1$gR5REJ@g&rQ`P^*Z%y&3jF_E=2c* zeuUl$@-zkX`!T~ILyjTea2WOlF13Un%1iTG-6XJqA?R?`x*rPN7_AtFSUJ1DvvO084XhmpMXnbf)s4!Fle@5gn z78;5SUf85~RDTGhX_{WCm+Mb}ec7wsuSFk>4*9AEd852hS|?=&bAtzn`-uC%S^|ad z58B4t!h6L2hy4fRcg7URZ#x;atBb6SsJ&Tpvu0NHoN7aru1ZmY>%4wIQ`J zb@6qx8@_DtG}25N=45kiQ)5%V);_I2wViEyX@6tC;QZMsam(BjJ>xu+y;HqYeN%kj z!(SkzP|_$%X^Uu1x`)1xv4>H?tYnU1k7EDBdBz#a8^|jNEDgL2`)&>ij|l%1KN8EN zBI$nlF?p&oP8kjRF4t=Ro$wsM0_#^SDx?3{*Z* zyj1+GIIZ|c@l-Jv))eNe=BZ9Wbh<^e1)|y#O_C-RS{uPj@2Q!tnWEuo1={JliMj}V zoW2co`yPnZzlAs<(~xE81xVMY>I?Oy`T@}X&2SSU_>YFepx+zxRr;R#0s7avXS#>F z$2vZENVoMj^&-&wN`u01UH_XtU6%!V-3C#@NNuhr7ovhljSeD)Xl;!4D#XPD;P)#5 z!Fq{)D@4nA+FV$n*Z|S^NXXod)sE4Q(}rt9w09xC$W`a5!Rc1rR^C-^QEXQ50qe?cGIpDt`WureGF3b47`=__YC(L4`BPSm9_-_KC;wX>0RUg)?Mc?L;m!bZGm-> zbxX_Emh`5SruCLhmUWOVjWR`T~+$*tn;;{HH;$O$Ui2XC>aZLM|b}=*nJBAh05N!fWa2aBOUeS$FjZtM$B~h|y zMfAbw{n3MBhQ#!V?GrmSZc5ye_$BeP6J{s$P3)h@PvRwgNQz9_4bNVgvNk0u^+W3B z^lj;VGJ9pd&w8Kb&h}=ja}~Lt=XJ~bE`L>iNkMVJ-J*L%ktLBO9m?C6->$qT>v)Z@jm#Wq&Vk(6k>*3qeOmjs)?2HsyKM(;Mu*CA$N8sI?iRaydj@y}ULMS3 zwYLd$3;s=MJ~fxRo4$`e2>uSl%(O69!QS3KI5!|pc*dm#QUf0aJqo%hxFyJd#cy@6 zF8C7ceDf=4%Fop8)OL+i^GNqdx7D!O@L5RbkRzc7LpO(Q4I3RkI^5V!->$q}Wjkei zdHcidj<#DEz976hv^sPZ#0qYM$B+noYSX!ZTQ=z&;4k!p{AUM}Ku_`If=3w|O1xpUzd~sJ>Kx4Uuv*tm(GXT+v*BSaz)T z3*A87Nd0&{-Qd@EF?5A@r2vQaf_%|C-7(#M@cnP=!t{E5BRJCUz|ZLjds(Z%KT-nv z>-*~?bP+n(2CQ47U!(72=xBItcmsQ0GYx$Vy$v*dfc_)+Gd##R^@cHfAAKCqtx7nmFZ$wlQ7H7 zvQTM=^d{`2S}p!g++EaNbX{;ma4G0gP$(~iw~@Vx{X63Zqm))k!~cuxKkqB=M)y|t zWal`i$S$+TS);87S`M}BYTDV9YtAv>G~G63H)b_X0>n4OH>evl4cvNe{hiu7wT2pf z&AY01RW~aCs7$FyuHXQ=lz(1MhrQM7OV*VvE?QdD2z%{T=B~``mfbV^eCFBA6&Wit zCZ$hI&j(p>Cwr1ji4BQ@1VO^BxI1yMuok;Bc314_*dJrx$G(eAj7^R`8ha#`3wRLo zAm(k%e=)n^j+D5xxK#f3t6izS zjDOBkJGNn5!&TF-rf5ryxthZZY5+#QM!?ki@O%7dm3rnbMH<1)}1*Y!}o@HOiAxO zXP>>-`d4lAo=-xHA|Tmhe{vvs3u`vKNZSG#fx=*6kS6y2VPrFoGLJIpx!YUz8}?t^ z-rO4Kvvw2q6rL5I5KEv38i)DMMn#5Vt7?;KqI#mbHtw;e2xG)<%u+EtiI(|ibzqrA1{8)CZ9yeQ2v@m*p)Bz?2k=V)qeW}Rx9VhT0NjZO58^=utS zHy$%rZUwJmq;|NrW_g|ReWklg^NWj$yA^dVDl5Z92 z`@-*^SwFHM&-#wW&6lp9yMA8!Y3V2XNBhUxA8UPl_5S7ir*EIXUGaL!>v=C1zf5~k z<3;}SqURYew!O%Cnf)^5b;@hSo3J-WaW3%RO5YxSyZ3G9cirE`zmI;e{t*75;l~Ca z(?50o)ckX+&v6*+G(@lT-nTp7&f!jc{^$9hV}FnT{qj%dA49e|J2f{ccWvIry!r)c z1#OBt6n!jtSF*4CK=~lu0A0C3YZz-9YjRnfmL>M(_J^nskGjve_j`AEb$*lo1a+Kh zQ`M@f5401nSN^@AfUo8w1 zhdod}P<~Z>h1RXRB1#c~?zsj(hbugCpZqhNH>L7I`5eVU#Y*K8Wv1%2O08C@H=-u1 z7f~<59BGPN5WOgRcg(Js&aqvv(?5-E8`lX=Z!hRkkB=;S7Jh9Oya?W!wF#t zs)Q5qC*sqwOt|&_i~cQr!@U-JHMTC+`Irl+TRO+^V+1kwXd60Erf4lR7kSaS(Kn*6 zM-NADDi5_xSEwxvkvdEf&5{4ZjDyxs_%LUPh*U>LM#Mz?9X>vsg>_YPO*33G6e^`C zO)ORnetrZM)DO(j&a2L;wkR`{8H&w{>CiJa2(1??36X`w%VK4RL&>XC)Rl8c;;YGIaa~bJsOVjgVYgfI5CJ2_@q9QTjwrzYMsCBKkOuM zST`(}EEcodJjXoUyw0@Qq&1cp=ji9@Pis$UHD%#t3riN3uu7OE-Aj6wY${n-q9{?9 zd@Ooj^t<49!T!8MdGm5+QfhWPIL7MoK&nRa2m@Z};ILj%HpHs*y#JzZ=pq;R_P#_YC`iuLE zn@Af=!=QKB6uK$&uKc##ub>pYRNYmb!qTB)`w$kVj#EF!x{2QRoA6iRZ{bTg4|i8g zR6>+1(h=DVYa{CWu@R#qu0>qO6!uL-HS}6@HMyF;>H+Has#mJ&P&<#7kC1N*$q2z8 zQMypFNYWIl)Ob-fQ8Qr!;atHYK_Nd6{^A+@Zv5{2&HN4gBshwj;MY#W^*BN@OcE-S z%dUr93z;XMFaN6isI0ESB5TD~kL`^6>xrZzN#)5EI2WR--Alfm+&j5n^8b?S z;@(arjYt}X`$~GEE8Y|TPu#S){xJh$u0~#ov}tUb4`H9e{!vX+tyZp9UWVqc3~yvh ztTmzQLeGR84|xdH;3U}?*)LhHEI%ZdMlH#!D^e5_l;f1URC`s^!X`nr_dJXU^MYm<0#`;-FRKY^7`dTCCMe*3Ns4d=fBOrk#{pM3(w!vIl2F znDhJduMfY9ewO^KhV>#V6J2{(){CD{e%gLHekJ`$`V*F|%07~PBKr%RImfckWY5f= zlD#;4MYbv1kUc+VVa}JFPdV8+x%m6XoVQr-b3Wv}%*o6t$SKX)nY%4F0En=+z+I46 zlwZ`pq<_h*(%Ge}%2t$V%PY!HSDdbRq<^Hh8?8nbe3{=YA1wWBgKd=EXaCQ4;}Lr< zdM|r>_`3S+UZ=M@)&kFbPjyeKC(#oJM`?`bnfrrH+i=?( ztiAT#_RE;E`<+f_6L$-DT})q`9*2kaWah$e-GXXGU4yGXj2Xe)!d}Nt!93xr;DTVD zXrYMy{KF(liCJQmu%LgYK`FHMxfwM6{Xz$X-h@7^160w+FmISCo+BnjKG9>*6VZ4q z*yV(mgjaC7EEH-56@m}^_xz!}5j+u>&n;)`*u|`TmWAnHwgy?^7~>@485n9E;Ub?$ z&7rc0pF{;Tl)tg|5_^dfvXmSV7!f!Jr+FrrX`xIhvo^f`?csCpCh8($h44aFsg|g2 zMLvwIm5`h;Hf3^3w>ll`ysQ7I{+A{nnkZX_x4hcsQk&fNx$PfydeX_3Zce|`<$jkZ z>5tN5JH>Ts+^%uE`Yr3XoY;6`<0)SuFw(3vXC6?L#CYbR+h zmtQUaRhCtDr1V&6kCJXBVa4j=?nT{;z7~FkqI-E^-@-nHs|r`bhnZR=F6I}1E&fs5 zsiafMi;~Qev+xI{lvgXy*XC>c>jvp&>8I-_8>Sg%8D|)$R8FakGR2rKn=YD0o5z}) zTN+#5T0UVKa?8@&GQg5%sb$%VRnPiA>vODywgtBP_6PQb&IQgE?pE$HPl?BjeuAFV zlNZ3ESj1k;X7XA5&2W^^Bi7KNJs@()=4Q52njATPyuheKXV^kwm!?2gLInt1BX^iD=!@Uru=bF^c$W0ZZAeY-8gRt`PYPU{Y<2P?zA-QE_x z;S1O&nvxAkcaRAF4>SxvXcT-YTl!1>TTbf(X)p4Q*xj+i5(g$;sdl^CiPQtB{+i5M z8*8tu{jhds?R~ZO)S6ObN{t8A?^l18l$q2nzD>L$S{>a%(^k_?(O%I-nl7CWX2nJJ zMRtAgJ{Dn)WrnkR3AhI~d?6{IFLd*D^GzWp6Aj>lZ4b`ZboMm1jpyKr#Uk;Nki{Xz zaBY}1M$LYxRUgGZiRHm5S~Iau;$%!2C5h6++VGW5!M%J-^oHo~xGTI?y;PlrbE37R zt%PP>*qKh|B5FPr?@jWiIchszn_rnzjkSzDb=`H@<=N$NDdSuEpKQ&Lr^kb}br1dVm_XfMxu6BewCfLW@*V)$D1U3;c9YL$w7H%7c zGvli*%ht#Kmwg&m4AytsH=7J|^$3UB@y+?endV9JaQsZa4}i^6;3nN=JY{TQtz&iM zbm0hieBMEjOsWJ-VSiB{QHFSzc(P=?-e)q?hk3IDXVy3AcyJ@*%nSlyeWEPnJV3k2nQ|Zt<=EJjem^ef% zf`6UCWpi(fu8Aa}@=y(WzDiW`jpORaX>eEWoZ2aMMXlwvuGhI)=T+K^w7F^X)4tUH zR6C?*Xw8e&FINAO_&ITX?1orYBr|eZ*s?HxC>h!lnumHIu$Y-Vpm$+nWgWkbqVlrJsUmz&BrYS(M~>iX$=Vb(m>Jj#66`q0|Z-p)S9 zG2hYH*#N7NbE9Lu!-F~{9M9KN$8*OZXJ6-D=OO1K=Y9Nm;tX@Doc-*5?YWraZ82>! z5k|_WF{+K54Vw)E30d{zrnhEtE15wWu&+0vnoxJByVQ`tpg>mOC+Gw}0<8lr0?||)HJ6x0 zr1)z1Zn&?z9ZrXHlXJ7Pud9!18nkz9Jgq%tSQo&KIpRC)Tj^irpGHg}9Hg6^9-JIp z0=iQhPAljuYVn%#oAYn*ukdH{=kxdT_V6ZhCv$glc5*sn#bS87hP{?O5A2-&%mK_L z*t;L0mch3hzsppxRyG8ufx>15KjbQiMPE6eI79fu_;sLN&4I5m4W8gJ@-gx&%BxDY znxzgxSvn_Te#C&tK9N(<1Dz8wE2563j>ZdZ>*UZWp?@SlC1JuyA;EET4ls@|CQ#$3 zWxi#;Ojo9>u074JwuD<0Cb^03mEEblRoUI#(_GD#WE<`p;hG1{xi(lH?91uT@qj&` zM7_OQy;^OFwnj@ZB{QYkQ|G14NK0&x(qLudC5`7bUDR}OvxUumHv83VXtN>Bjy5^o zWJANX4SUz?SMRS{-D_o3+f^+rP7zlpyk7Vi`AB)1xUTpb_d54E;~Aq9l}`2c_43J} z@}WKR1MCCrL0iyv(tgrD+&Rn{>529{^xyNp3cL$sF~2eobB}Xt2&)SxNdA_z2x$)e z)){$`vQSw~ovQ8}-XZ*O#9`dFzTo5~!{2MZ;6C-2dbDZ`hEcEOM);W0ut)6|?hY2tm56p2a2y3Un!8D;nqN^^(G!}5 zTa|Y!pP3(-w^+AZC)h{Zr#t63*SVLwXL%REFW=m6CG127{BK2pqQD{SxzmEvgHr=j z0&mDSh-id+6Kk-|b&QEF}hz zeaV&NTJk6HojBn?psM?VRnLBHYI*VL-T7 zx<~pp^lfM>WozZqu%%&tG`}@84}zWte83ZMA^d#!KbjeuM{tO}g75yb?4#^8n$e+r z89xh5xov^%0khZW?FWBJbz8FSu=$8NwKAnL%}~#lkY% zXJ_Yc?=NpJ>M!ap<2K_x_anDNTr5skbX9QC*D*y~qUR>ePPkI-dNqBjF7NLQ}JKQ(ScZxVgoTDyKpMoD~yCFsJJ?pPbz9}u%1C{rzPh%$_B?9wj>Vmd zs~090e#rj>_vOxf4Hzun3w{(FDm++tyXaPtyhK?ty>x2n&$3@-;tEN{SHma69e5d5 zI2Sv)U}CNDul7G9pOH0!HG(u#su1sDEp8p|Mg9doN5n>5u|r%b){FlqZYVw~JS^Ps+>iGyZ^5#UZ(5vagy?>neBkLM?O4e9JuCIMg^pH(M90jnZBzyHPf`Y)09% z@|oq6p?|XI&HC$=H!EjbW?I_V+uGy7DyZ&F_SPoSh?qch;7rxos@2Su%*J36USeKg z(#+uw!FIvL)DkL>$R#@XJNe7KrCvb2Kr34AvAEGhb6H&XoOl1zslRl-#H@LjI~Ds# zQ?ePkC%7}HWg3_#!I7K6o5h>SpUKzq%lJk>mA3P@L5(WrKZP>&8t)2kB0M59a8?{( zA7c*!J24Nlhl$h#swPpJI1BPu9bY}rzfSos_|N-8NIAmtC~7%0!>w4YSQLlk+~D8h z-x1vq31m`Py1awjucVX$HBWs+b3}6>{9t%#cv*P&@UG!fja1VvtV5VhVOFq0d7-x? z*CcYGQix5CL$j~<5&MXX?(^;dq7jc;4_hnDdh=G(R#Q=BL1jZzBU3kXH}eV02}`Q2 zhHZgkp2Oz0yZeHKq5&nfJ=IPxdc> zRGG}n;KmK5##6(H-bAv$j$h-K`!D*h!XtQ+2%$o$uILBQOvR7v4{SD%%S#i~6g&|< z7iGbJkQw?SRILnCa>KY`T6Kl`VEF#<$ zzE!tH*WK9D*vs7AoMNkGJL5Rv@WK&S>D75Rqk4%1|MevEB(pl0m*E@@=NTuHa|bJv z{fym))sA%!dyxj>-5}+qdZXui&U@0^+TGTD+i}OS$hyG#35Mkx=!-fl?3jK`tk_zy zv7$B3iYNLz`rpO^qY&qu3qB*d5%b#l%IWs_JXi7Qb|-t23KZZgF)(Owz}3K&0IG+UL)WHAkFJ^MKC1Wzm! z3FElalWWT)JRxYxE`I%c#ziCa8`2!EHR4&KY>B9 zsM9!;zI(rWXL@FOirhu+y`H_ES-x35AK@on1zrSv43cpJJ(MkitpX>0&um$q?4$gh zd`Q^vu%Quyfre+sWJ0ewCt+Sf4d{`kW3QG&w=QR~|6fHE(HKX7={vG=#b_4WEHIr&4F_YQJ`;+%1|F2r3 zYLlvsM-TR4a-F1FN#X=a0<9z66uBw#AIN;fj>|n%oF|%2Et2lDN~?lq)GUv zgU5r(ff|9uQSGQ!@E6HF63PgJ-EByW8p&WYvXU}f8>AWzeC(0>QeRb=&6Eq zaz-R8lC_+@l+ELaIKMEP8wfsW6kE-f$0B&8>JOI9SylV>N*N~)felGG7O)`%oc zk|?!O~psDKu+CT&qMJ*?m z5f4%0PVr7b=YO2{lJAml0zR)?vVd$1-sJ~yCpN%GmB>nD8NoSy$a}=QCb}y6Ci^Zc z$7l3T`3CO=sX82XAk3xms2(Wp;~G#AqL&(^HLyNPK1lM!1>(`7k)pMNbpkez#cRrH z#+nkC9Qf|b@(pnh`fnd5tbVK2WH;3^)-aaqw7NywMcS^VT}scP*LpASZeBPBKL>LT z=lst3ne#CBac;l-zWEVgvCJr%UNotAN^!6xSR&O*wLJ|z3_r|S<{$QN_C@Zc?j(Pr z-%YuwZHx@YBk&G;^1Ac>0uS~O`i6Bx^+XAxIMG$%HQ^7zcfmZ|Nqd38Ii59>~vhUUa>wgWt!?iD?11GofW#Jz_=x%Th>FDrmv$fFyy1}HOMs4 zI@Vg~D0j^8Oz~{+Z}tO0L+(N?or{`<&cvki5&l8`z#-f@n=zX*%b2B1J(#?;nW;=V zIczwnm?zPne;;^@PW`Ari(u2>JjOzX4|~)@&SQ>_TgIKipU0mgoGSb%`YGBdS|uW3 zdYgiN4*ln|bDW%Cte>p)_`c-@^MlUhasa@WE-Yej+-uB!FvvsLw7YLIz z;ICcnS?$^9Kj?3R`~G#Dmwh-rIDg|ATqId2Sq^{n0C|78Rbf}u467dY7V{@&Bo#3P zdvyzV-%miJEr9>`6#Qwo!mfw4lXsL4mkyE2z>F;B74eqgou!k9=z1-~x6Rkp)!pT> zx~v0DgH1A{%$Q1HC!^DH~xSYXPAVG$SQgBNIm_ZcE&pxF~UXqAXFE_y>CHEl@J` zgtwZW9cHSYs*2@h@?u$m>x+5BsghGA>x$MDtt?nskcYoQvASU?^5yxA0%idp zT(BiY3yV6@WX7`evKiVLT1pqt)u>FZJYqR&;W@aDZs1Ek@jdeW4PV%22#CXGc!+Ott%a(Ig907;RdCh*uj$uc$iMo6%j7#ttmjrnsn@r&5$-|Mg8 zPxk+d-c=W(J)uPn@sfN&b`5k1OaP;QEOQj|1nV?wDtjWk8K(`W1-Bvh9rr8uAa@rx zms5<&P{H{dJ@h@`Q*FcS={VlMaHQbe1Ev2cYJ|_!N2(Rsl60e9dPlw@z3>}84n7Pn z1CL6=m2&$D`U+;lF?s{_&l_+)qX58Ii~0aCZd?)g%8y~6!(M}}R}xtkxg}~-)I&Il zPlcZh9}qS$EKIJFUzS{w$b<^v0q_&waX#Z6{l;nuj=7U^QuIE>aTJPEDnE>`dG#O9Q_X?UTS}8CIPD+nTV-?AY zHR|Q+RhUnFi}@TwYi?;ES&yWiNmr9DCsB#P#I*^l6TZZKkJHAK#x$mh7n+8eHHtNg zzOsI@nV3^{g#Yg$?=f#H`(HMlC()p*_{THd^Ne^xdsB6{rop=0ZhX;W9smR5j? z#>P~(uXw01W%pEi>ie7cE66f(9ct?p zjOC2e%+t*I@FC!1W&sflVw9Bi6n#NDA8RDmWTaE9M_R!iuzuHK$&roGBG@u`5;qZd zz!8YWoRdzEIg2%)u>grn_#R5eyOV= z?SZX<)8tvQ$Y0ul9Ypa?f%L$fs@YX4mWEZp$>j{^ zkKmsYo)mVHbe7BxnH{oSv0dQ?k993{9;Y!sT^7Cs6=y+sQFty~PQLIBU@y=Nkz3(6 z!ZX5lgcXMth8_?f64U1fowReExJDS!Ynk8}<9KAvw5FTenJ*fzB3Lh=8>Ahi-B`N0 z^lQ<_qPqo;3Zw;sg2IB5f=@*sirSX8FU2sUyt%H04y{E)9n>{FEB~srn=Gap*4ozH z_8s<8_{JuB#(8@9d;6DA3#isOqee4FGD}!xECF`xGn`YLRh%`P$Lt5}W2{rGwooC2 zgW&WW`{x4hY_G-{?L3A)$yoDvb3<^8FIHZv98@{5l2OU5TxDEsgh<_R#c;!*H!$;eYXaI#% zIdPS|h_Co9IT}k$3dts9bFz@kBR%LDIH8ZBGZT1R30ID;)Gp`%dw{z4k@tgVLpDHf z&H&CH)=pM3)*9$O%DJW79I!Q-30n%Ei5`f~O0G!y$hw0=Tp`N_&lL90kglQKLM?KW z{Jru6V%Ms|jzY8gF!E7kx2W_e4j9z$G_N(a!qURx6>*9*S#8-v;S=F5=n$)eL)rb*y8gBg4Jh-Ob<89~Vdt(8)+M zK%u8iaw)uOJbM1zSJYp$MZ8IDg)XIWNK>HuM9^vVRb30a8ukWknp&7gOogg^7nF%} z!)J$I2DN*wYQ1WQe4D(!w2@RJPzsi^SF-6;^qqmdfs0^L4FTVGBDf^m9orl`?R)K+ zw#PP;)na{NeQ9Od1GbCK>&_Nnnb#rflJn35kaOgmLxMws>5_jWokKc?tioAwOnFrK zDC}|A5X~S>{qRQN=fY2gkAN1ecVzF#Ymt{RYAcPH6+S(@t){&uODCsa0$n-t&<)b%q$#LEh zWsSDJMQwM$u-EWW|3z=o8}+>me;M{0_8C6nu3cg%HoP^wGpxiKg7pVn;gOZ2DvQiT z<_LSZ{fz6ZYp!pOuOrooqB9ujGolVBjnfrx!7$!P-X;DyzFA-w{D4xmsi>)FxM+lk z?onJ9-V~;S5xERro_Nfi>Fl406u5r@4pW=C}`oIyD@=5i4dP`;6C66bl3aS_Y;qvmlz!w7ogLlNhX8Ulih{A7jI}fyAxZ>(jw{L8M^gvpv13W z{f#t{u3&?<=eFXW;+{iQ_KEw7_l8#+8jd=WI+D7wda|3cYjD$DmCX;C5yAsWaV7Ta zLCO)zNR?VezY7lVl7?cnRJK%34E;NF0QjfZK=lpb%DB@RGZ+gnFMmV5r~VhHi>@0h z@QA!iMj;U+*Z14^$@|Uw6L}Q#u>SV`?OpF*@Ba!8?W4ehz#Y_on^>D!rQBlfX~8)` zvM5m$z-l9DBT14a$vB`>c9VCL$1CC$S@7tmfU$ZBB)^UFP4X+?P~HW5xFdSXwdHl> zze0Y8Op;EJwnuitO5C?okl|Ah$O()iCK3dCG(I;4?ACW@mOab<)bRPnK>fTU)kC`>!@c zFVmxeX>4X`Zqe9PcD=*oXz6O|N`jIO7*O1I3rU(cu{XE}SmL~@7tBoNNaP5`f^)VE zJndvNYU-ZqpX=)x(~O;s>Be4$UWN?)R=hQ4eUdT3_@^?b@(Q%Ojh#)LHlNi;*FX}~ zNUvMRQ3*$$Ig>;@y%ANj+Hu88BBen#&3!nk+?@ z3QB4%S#xP?>0a@6akwZ3c8Lh#XZ{!dc<$fa1*|!&bnO2-kR`MNwW17JZO(uz@B+He zEb<5Wj(AHf^)L7T1C7NA-x=Qu%sY1nb_aSedofpXmvZGIwP?L;mF%?qy!?yeGx)K+ z6dl2|JP$q5`p}JVCoclwkr}Fh=9gx;w3f7!EEg>ky%f9@^u%ddk5`W;#e3SG-JX4% zag1>Ynid%O$^ZEq`oDQUdwY3$d%n89x^kV_&H`tNbFpi#>l-N9v$5wKcOG-<9Y)7$ z$12BVERjp>>IGtUJM4R#nH!ltu8%ugI7gT%c_JASIx3W{3MiXsT4)Slx7LmRUvySX zR?N8AvHvj#uHjvo81;A5>4-BCJJmaIjq%ENNp?vlqi39l`Pw1mGOa@@j2U%!3vjv{ zI+{2}*oN5FSvFXDntPb*U=?8hodGRT4@)o03v;GO&Nn;_`U>%o&_Lu|%u#>~dP zCL%@TY5y7jVtA;h`ltJqeudxUGy9IAC;WnVNpvDRkXwliBGw=6KjJ;=6+nZ_a1l-| z^u<*+pDhhN4xh{IiuWb>l$hJK4|WcwBAY6KSDiNiz3S!S<>C&~j#7urA>&~mt^@kY9+CpfS}Ny z>&@|MJZeup@b9Ef8Rn>QPFkO^#I+cd`ChIA(5*gj+;>Q@d|*G;0CSxIM&e-PE<_>& za0z=JTftZJr-`PBOyGZSm+z2cyH|bEeAGz6O*kKQE^2P{JTMkIM30CX9wh{MWJ37l za9@}+Y=C00;)3*o^q^p$Ad8*NK3;XWN=%60vd#9b z_WAa?cDxLrPE?0JZ@={r7)&A1*4b<>+d{`&$2Qjv*GkNWw}6$eN1D@KuwB!LdW0HT zOPvFq0|x?!;JGXb+zj3hUP3O`U+`Tby6C?Qgm2i#Lov5dazlZHSF%P2hXpqi+lUlT zHP16!rmc2mt;%N=&nxV>XE!TtRXV(6NXdtik0rh`Uzr6RDVyG{Z*FL4IG{hOzoNgO zHyDhDvdZ#Gi0Cc3wjA37*JIZ)|6%|9;QU|+OU@dJoU;U8GPv}=_!4k zDM+&je)4|vuA=`=N(jj_X{Pj{^Z`!wzonNkr(P(YC+;QsOGF7N;lH9Sq8j2_;+LWq zqWa)>DEKP=4DNL9W6o1fBscuOY^i(vJN#7CUx}hvR4ZLX=Y*$(>jj$yb&%zBf_s{q zgG>a9Nix?mHZa`CG46vj*9OSuvm?)}2{ZscrXQ}Fam;M^|DIwUWFBHJV=rMh<~8Td z#;obLBwx}jv|*?mvt^x1tLhon6YoWLRgxl6F*{^VNTf7enuW7CUz{hV_uy-i8k|j3%;Fe=Wc;E@+^3^Es^>7lggqVk&j6>!6tq|XOiye>^b8;>#m6ocC;(j z)dl*KpUz*-EAA`q2HyJKHs1E$?chfqL?&4Y^yG_izQvI-bV(@FTm3hi$%BISV;D6Jf z`yK4lC%~6$h{V+0(6v_h_5M511Tmlq8h}iPpoi@p?jG#khxatiS<9IT4Ft_%=?_iK zFy~NbiaXW)$otSc**^toZD;&%{qOx(kVp0gw^0S9q6pGQexN>q=a?Dni@Ux8Mv(=< z#lgP<-2*wdEY!}`j>Nj9y{Bzm(X67SuC;Eze!qSrRD&lCCor8_X-Gjm<*Tf!JZU*%d1HTX zKjl8@P9hSC-N;RhWks=;b5{KKE?TgEzC-_~gqzFF=ah1`fH7&|IKUge#J$41!OO!v z_^sfL;ELe7pfOv;njpDF^l^HX@yU?YMusk zp$c9MV8F-GpAm@p;@em&kd^QV_xQ`WYox+I^cA-kGy~bc7+DM(-itU!4C5kJ8nYhr zJNEH4@WDD*w*Pu{(d<}uLr#58V_sw4V8IYU0B6up@dz;*ol<3p3jU~#p`SuOhcZH| zLSCUy+F$yYbgOu$_!!=S4uW(f95xg5#W}c9v{~d8IYm1#FW`w7qNT!B!eh8IKjmfe zVB+D#Gn1IKrz0I&!Eycx{t%qANzPQ~eB3PlU~jvCbr&nczRfrkQhKDAaQV0)rP8QBp1eTBe+lbFZm6jIVcvE3+dVDH0c!StB^M#Qn^&V z9X){Uid~9Xs+pK%~$2g^X02R`?m=l!lp<_yn=i;8ObA8`?p}y8{ydTHY1DM;43>j* zK+(h_>3&x^QAW@`*D3@BcL{V2ID?KLL_f&OU0&r2_ySqjD`Wv#U@nq3=_KkAtdXpm zxJ%K`-victRxENl>FmG@&Wlc-jcvPadSDuA7+|1{buEL^p9oMS~&myK>yGP33ZpymuZ0Kpf>K|Q=wP7&wb3L z--X}k`?W+KtB)CE?nmOL8lSC~@8&-cJ`_faB1OA|dxdobwFJj8Zy5v~@-C!1HwEuM zH&7TDiz#4N%!LxkXtEcyM0+s*nC|<>7xYx&yDah)yNlgjJYAuX{^EIol*B3iY5oVe z`!a&8ARU_w#5U_O=LzR5_@Z`vPw1lUx#*Q>vv7lOF@Fi42eu8xBJf`w$fCVKr=iC> zkFPq67s8v&o6bw-C-N2O^B4qr!BgQ=p-)7JHb~Y=E=aFRbEQ9}B58;;Uz{x-h8b@U z)L%!C02;-PVCSQDZGd-u92n%&IFmW=Fk{<-rDd0~8ORv@i`5G%fd#B9=(R85F2a>i zz;A$L&%sC;{3ZG=st=9&d&wub^ae|2iRX&fBh%-X@Rx83)=8XICq*Yww<;uv!;;Rx zYJh&!Gw3jUVnTcg^EiP}C|tx}#Q%=>bqKTqk7(T_`r2jCs8xXZFwil`G0@h}cHjEM zs&rW~pYZW}K;;t}D=% zXxC_0X}ec+ugKQr=(ZXDHLxqWm1(9rCc;FTx|-9$6Y-h;HEn?+^or>n{3Lh5qvGdyEA+{eT}Jl)O7U1Uof9CT`Vt41MNmSdZRCrNAQCCD<+yKu5M$v_}NXu;ifZpo|Mop9Gl{v_9%1X5N0hzb}O^h4F%T z!Ej^()W`XB2`S4n$T{R!_Xqbi`)#`iP~l8;Z2306&5D(Zv!u7@FHfZ^2yGv_395#FxU;xtk&Uegh6m}aw0|&9 zkb1@5uJA==VVyv7R%1^yWX>M--0V!GW zL9Fvw-QXo!fxSP`SKW6Ve~ty@60$B;hw4am0A15XO$d$-ZbgQ48lxt|#&CdrG>$a} z8Q3jYEm#|an}VzSEB&iot6e$PeCx)_)s=1?rK?quT+y+o@Nj<^4EiZv^Dh}cZO0%IYY%# zz+zs`T*R2i&>^$E7gi8Hh|fqA@5%1QPQ<-rzhJ-MBeEO9pkX+J?A7kF1}B(M|Jl za#^{o8AurK$msyq_!sVE=&hRx8VREDti_?O`U#I-6Hz14zv69Tq_jyq61QXleB0}g zNjrc)h%eyqIUE+7^#bYOzoB8F_oZVvPw3}#EpH8;qQ7~)kR_eL+sUJK>Sy`q@%uLw z=&-J!KBMQ51H?nbTIeQWkQCdIB{l_Gz9`IU3;6l`^Mdn&S9tbsg6+8$DOkfKBXCQ} zlPty>Anqql6a7!L1Aamw-l05r$1^Z3k#@Y@yUY9B_tcl~FY+%Vmy&YiiOZOw%tUrP zTf~tdN%{q+8LtIu&glQXmlwoW#Glajb1M9b6m=3N`771^RsB`liPK#6of|6pnJT19TEwu?nE)`hlA0Ahn-* zh$*j>6p#y{{kreJZ^=Z3oy-2!}^Gw)WFa&ej`_D1m^X3gb#!ZMe~8tOAz@4e!+I$ zHl733_^7H;Rs93~127*_@qyUD59%k?8+BC+swFjrnoM7tDLL3r4T$=L&+mt$JKNvD zU*EsWx7*ji|3Ci>au%76{?szYGDdx5l|k~v8NlnyE9V>dQGzf*3+QH)yind1Xl#pF zMXV6$t$QM!J%w3~N%t1VaYl1iBH_7|SIWD9=P*H(B)W^|@Sx}j@|T~8X2JKpSF%?^ zGvWWh2OAv{5prMpNV**vMHiugzt6tI-pe|Gn}vlHWCz(zz@h4ici}P=@_l%J@eoDH z9l{&Nd&_^tM{^lD%?ZN!;2|{-G=aM96W)(o!s_@;nu}VYOVA6q-s+-R!nwi>=z-T_ zy})}h9UXDHcbg!Il{nD<`x_o25h}byX_EA+dg8K?cx*i5!s&@Ow1)`kd*;zU{=*X zRXM@jU^~=8t+C%mW1(#Zwo!kw0*azkvL?A4=Rr6bMRvuR6N)|Y9r1=}L$)So6Y~hV z_FCy%=PUH*_!FS1a|P@HZ_tl9M@|(1-$fy6URs}V54oM~neDJQj%CygrUr)~$NG)? zt@{ty{IxJ!KWaW|{t6A~MN~>L<{0w_@Ms5E23qngxt3GbGuEZH#c*IRw83(1nQNM3 z>SpX=JcxH=m2s_+_W$*?_Oxa=b~uW0e_M$Zl-5KO=r_iZ|56*NW0<`F-Hy9MHahrw z18tGZYN*mzl|W}W8+-Et&U`rD{G45!Z5%H&CCi{K?0~$iW`V|m@qxbsalx42=ioPF znx|Fqt3*|egAIaK^s(4f6`4<#kX><7PJzBch3w+<$fEy2ek3=;mvtd!qp;#tsI3w!Xq{cm#=d zm(dpmVp-G`UE1D)-hvz?Rpg^S8;bk$TH!ijBluk=NhZ-xp+q1OiyreI@f-0P@|I(s z$$=;JA?Fc?{<)l6!F|np$&2R4^851tLZw#0e=2w+@ChhEXF&%+Q+_kP7A(VSsLSL+ znQ)S58qSWs;`>-j#LF-fdWe~j0Zy!0ATP`po)Ml$lKL|t{hoXfenhSB6ZXKH<50N$L?4t5&cUvsywkHzf(V`Tf|MGyRWD3j^`%o ztTUc@(C!x_bL}GTLub9`z3Y6deP>V&Mi6S^0aV+|{7e1y(9gX}UL~6cng>P)#{?Ty zHN@MIQ&k7rba$1ls$*66s=4s)9Y;?27HR{v4f6py`&!^)yIR^ipuOm~*0D9RmD=)b zUF<#WGwuJNA9}?eF0B zZA*JAMEgixJ~!ds>fPeafu{1l|DivDh=sCqHc?3A5q=#Rk^Mha@4Q}}xgMs!tF6=eB= z!_*<_1oE3^W2IAFs7--Qff2!>s3yk-dteExgjJOcGiHB1*n_#lxd(W=cwzh)q&717 zqv3EGi+@IYgy^i6Nv!FtSC%jZ4*Zga{>J{J@D|TSPf+BMd5*dF zBRiMp-GV&0LTKfVU~@FE*1tXE4atHq4^Q=p({p@|1sa0?|JC0g{V7^Qbc8&HTW2b% zL~XI2+(@=YP4yZ&1rPLXDe$G-3fv5=2(AeJg08qluzAo#neiMQCwHK~*}>n=-wb#D z53bj)yN)N0S@tRROSbE_w$Rf~MlRwU`z(8wqGQ6+D^n>+bhH%4L<4WTT(;HJ7{Aq(-BV7?brEdFK2^O@U5!CI&IhOV40NSe z2mh&>S=Eox7gMcf3`tc;RYu_7Ku^?L%gJSASFBRZLFxVHSMX1esv@dZFxD`%j1tBR z<{Qir7P0?E|Lip~nv?iR{Jof~%;e7GicvG?ASWsm^Pe2%FJ@iTVYS$)Y(Swo6p!SM z#B6Ujp3O>$3C@Fek_04_RtU-jGvGMi3g6TNdjA)CgeOF&ahv`u+K=k%|1_NibQR~; zhR>Wc$2Edev^d4x-6>w&wYWP3ch}++_u>@y3&q`C1Icms|Cy}yuf6D{z)ff}-+X(& z`xQ6-I`>Gjy{x{>7Whx@npf%+&2)`}dAg&vv(}kd+#@FRK31jA#evMX)M9;%+I zkUFH6e&5Xgw3o35h}dD68rh9K4LuFXhD-({v;Q2pK#rfTP1U9A zg6thGq2>F>aLCXD^q?uZtvS`%)epo+;yz)IFdK}&Z?Io5;PZm-J@%CilnC4i-U+@5 zJr9)yGkP4l6FL+;9;}SAC7VBof4^_PZ#T6T?blV`b)TEFwIsAGl$9B}iO@)>L?YT6 z#Y)9b@N(>1Zj{3o35DtwERheX$?z%)1Rg_U@u4Uylbjzs46a& z6lLv{x;L5)G)oCSY4I9R+tu~n z0b97_yX-q2I2NeQJpO02Z*){_9G%{$SXT6Tm+==XAFT*4Kn!nV7m|gZaY1-~cv)m+ zWIh@@B^cJp@DbSKBf@F)YR$ny{Xti-2fOiW{%d}%SK}S&8s#eOEJY$}WoHL;^66|I zJ2~1p3=WIqw*8hp&6Z}{i0|dP^uN;i7NloR%bHf`M}Z%f?+M@6e_Q`;Q|gA)qUj~l zuYw8w1ur<=^WAgX_W*0Fhp>Ai{xoV`U|k>{l!bD!OZq+BJRD%gmh=JFA~zx~g!$Jw z7iWaC!YSdT@L2X#);QiUzK~~MI$O4gJu)peJyu#)O2(3i&DuQKXgm$t#yZ6M^Yz#s z*@4=j1XFsiNY!ZNXz^I7*jeznWO&|R!Jt+O%Y=1`jfzsr63RNNx~h`u66(B~e43tA zZFNnx9y~Igdkd5blxYy?$xdOhe4%_dK882(jXJM8tLx6QxzI4*@Piy^jb5b}baI_T zW7iC!u22iLi?lMGpp&$8QszP*ZEtNS&Ovpmrna{BCHKU4-4C6#w`)N^K7-mwRiUnd zD<9xpTUlL6EorT-nlz1c)}+O8Zl;J#rX*8KQ!CRT#DUr`VY$k>-X=gvjFRh3lxz!+2@0)?2@zF`jA6%P1)sv*;m7N$foFoUDaXP4zy z?Of_{L} zu?k$#)wWf()%G>^ERM{MV)kP2hZ|a(kUcNynVzM-NNt>2KXqH`&eS453;k@L-ZA|T z{GyT_$&ThOihDa#AakI4uzGM~V0~a1Tf5Ti=TzVj{WzCtAzSD$JCUJiU57DyHKn9` zPMR%d^6a1Gj2wU;xk0v8HUsW@NoL6&@jmg*XiWxjE-s{#MPWdxuvB3d&Ef`eov1^rQ9)T&X;vmEPl(6GO1zU6E0!tV%3pF4 zmdb1J4ty#;6=#!zI-I9;Gkg)V#sW6kSbJahRJWYos)W9jzJ;!(Zankx5>VBlXsc$c z=Awu>p^|VUJG{!E#;=ifdL^juny;EK%nD<5!*$!)J!tiE_J*_23e43%;bY#{-q#A0 zq`kbZzNuc$Z8U*y>7ed_t`|MYYV%sN&*HIcPT0a`d2T`{OJ_?-(z4&8oofa+>;V36 z)2QLvVcJdFE!whZ*PP59W55iy;<39{zlJpK(t4}bq3y2jqQ0!Srnnxz94`UhJ`*2- zTxcJqyC8+>wQ{f$JQj7x5;lcvgL!_V|CRn+8TxiL-#4ev;cE)NYC>RQAPL@@gdJ^( zZi!xtU5izTSB?K2-x~iU`$SBUSem3Za&tMIGv z>%g0UWGGO?SB$iVg1!^J)4mU2Ov8f1gP~9qe5z8U60>~Pm>HE^^_V~w#$5ISzku%k z;cx9PjAzZ@;LzYB`mqsswnPJdTmtrSZh|1m7XMDBn&15`{P_a;18e-N(S_IaE`_&j zaax=qN63*A@2BUECyoJ*A&y3lx{eq2SN4&%Q8rFN`q7^!*$CG7+3{x=)V!^5P9Oa9 zQrd;IbGEa#wyut@4&GMYTzCv7@HNd8$Pp;ZE@!WIzxSo*rDwl)pZB=`q$h5@)FucW}b;u?1Wae}#tcDPBA-Iz~Ih%MgBeBjQ8iNwQ3`4!j*6 zL?3duEW>@UYGe_2j4G;#&W_HF_5#O!5Wg2+C@c}Wv;S(XY^R(BGine@V6WEAo@1uw zf%1W}C*0f~?6VHjFaHB-Z)6{M4{rMr%|9CKJaI3aKuX>y-A>-dE}pujR6%Va@(Q=A zTQXTs)lAeB*Ok;Y(KkjJ^^e}gd%ZSyfq)OOh-T)v_AHyR!lah0(MmedSGqU4ruruO z28M=)+s50*Po@u~2dptkdpzkmey97O`ycnnY3A?C)ExaBeGg-I<4p5x^Z)QFIAl3y zk+ipY%=yhK7I10$pXm6qX&q^T(tpHXHCQwFI{YHslN+O+thQ{8@E3gUdh(mXE#Xc4 zP29{rd17c1dpSQG$!&qw!PddIp||)^$)e5U&EqZUiB)7t9R~j^qbiS%u9kX*dKF$4 z%RmUftEJ5ALAw6B1?-0o=y&MLfx{JNx0-~Cc_iP@Kcj=9_2EDjh~&)lb*_-=1c3#>`i3*_Y>cbf3KEW zBUSSBx%l(S&jIOu(_cvbI=1gp`(q!@%<{?g(KW+8leK-smF&vmy5+p#?B(j~T7Ju@`BE_gEcW z9o=``S6z_3`V8t5*^*7jc0LK`rIMz)rZ{{3^UTm=(BQw&KGEKRkN-{kRohe7UFYCL zmDiWm*V8v-8!=sfMt@E}j(7Sx-DY@P0c|c&>~*>gx{2V~OPKvrnPnRDIY)8NjMb0V zS29#Iw1hMA$n@BB*L=^MVxDXsZW?8>8Lh^`u!27tKO6J2i#(z|sqLs~$KT_U#->fv z-qYRJO+&}F63l9qag8yvF_Up2oH4J;r*fldyUPCMFYe%S(X!Fa%&*VGPk5dhN2f8T z-lvSbxBcwF-*FE}nG=Z^<*eCE<7eq$$S&py$RCS6vzcxS2mv!1YDk2LGL2>O%A^ zTdW*R7CWL=_#Pe5QC||S2wfDN6mQXY7F8Bh_F^OP4>w9Xyy_48kNY=y*J3?dz?%z= z{ZDq|uY#|G#lywI58(b+VAu6D@+`7Gx-n`*zj!KoCi)M2q~Gc4jpWPM3f2myu}6M@ z)?qgH=0SK}tLdfo@a~>KS@CpO=+gO0FcBFxGZdc?}`%cr8%etJ4{g(Ma*gt?;cd%Xl!Z zVK8Jqg+79fY>sS<7@|f{h9eoX_WAgk_?GyN_*poXA3)o0;0=-%wehoW871|v6`9&a zX1ykg7K%Dz4Y3bi@}$M9o{$eI`AX#Fy_H3kS(RIvM>$X&Aj;A1))i}uP0?T7hYu!c zWv6JTYFp9|r0ddjonYAy*AKyZBdU7_hohCIg+{JctB=t)k5Z3U|Dc2Fr|YX*uivbn z%tr8$;kjYCVX?svm*ao>>lu59=EmQR>x^rS2KXl344p{AYR88AuA!8%vauN);Q_{> zxDI?Xwqn94PVaP`d=$wP;IiqgX@_~g`MUXH#+@+&-F3j|GZr`gW<11=m8$)uy`_1i zxu?0I`HSxAnC>tXbFV%R`A!>+Ta0@^b+fZqIK-yqS4Dn>US^c70w2OyD6%@dDolu1 zBnSRTiR|{?#NNjy#K-a#K2P^Lly~m(SY7&)E9fd)^ZpqIM|uxC=S=KpHGEGbZ;~l! z3_iy{#;d?%lQ2bzhb+wuIoT0z5Z8*II3WTUVHr&s%?#}fZC1FapEU0^kCe}pR^Cmc z;5cE#9XS~~9(qaM=Z(mP3>wb*3=DP1DoA~nJayz^~JYPvCUgfF7U9s4=z*h(UJ1ra&S0&#=?_=*Y zstw+OZ^*EIfCp`2dQ!Sb7Sl#Jh^kb5>f6*;sgjS(E9*;ZPRB3!-2Lr5MZT+aH>_~4 zcK37ja4@e? z2A8h^e2xw5?$@a|@?DLqx~jXW{{zRB^b%|Jf9ZG98{7k(T7w5)TPBPY^+X)Z$Ef>h zdTIRJ30?Kw^@R-ind1Agk=tX)fd|QG<0xZwv>#*P!FNO5Qc+hS18?dLF3_KxnuTz^ zM(M}urx~Xj-{3VKb)q<2Bg9+Vq)oTv>20&P3ht0=@#iEpLM(F5Qm_ToyyFMJt6OwkI`-HqUw;T zCV7{xr}|M!wo1;J4bd-WESshx!OLSekq=8$!m zm*;gsXi?}HZ+ztXGJ`^=$PN#*5xCY#)hSg-8B}fq^FJN`H(nfFVo857|3S|YSjE{r z-MziM*Zi0Lg+j$b$LXso@pl~-8N~MZd1P61NwhMk?NWNH7O|GGj?s?Mg`AOA^oE`M z9sHSmS$vJ~BwWsk08YnQxSFSxx2^X$d!4oZjeaX0Rvv#C2JkUB0~dX1o>Y&7;|_HW zan^IxbId2RGJkshbV$RvWEA}Ik(qpG+UT_I)=t*V_HA~xOLYCueZyVAli$OK;(`E ze#Kj19UdUtgWG~*(R2JmRmBs2AsqXu^u24)&DIXr4rhyG!D(zjq!~Mo^}H{xN3Tb# z#4E*1%F4K6Ea#vhn~TVlpn;`ywx^}bSTJ`X7EEX_jA z9A?kVS|vM-%y3kHF=Wl)4a$viWD%Z>{dGUM+Ow(8Xj@L`PwMaM?y+;fs%r&zN-(Gm zKMbD@R(tuotw;{7c%?RYo<;Z8Nn z6F(T=faX6Gi^jU5h4?$RE%r11Bfdx2CsYUH_#17u=qSD@YASYbn+E$2`kG^Af zybLbNK$Jo)@O#(#wf+Ne^;ddUczC?skKyij^tAH~_m1{{@qO~;4CI6{xH3>IP&81@ zU(Ijz+P%_qu5c+_&+X6cb~q+Re4l&$?D=!RkN!XIQ4`W8rrqYbH#^J@8+xZ|?kczf zoIx2-*IgVQ;wSPjrE}BK*4|drTEiMmkEIv26|?PdY;(*cH(Tx#d@sm^R0nmzxxtyi zV!@KZ9)T`_aA3JkPH{N2_dfrtc3N|}Q&n=5j!d1PN@vO}2&%imh3R{KI=<&YGe=>3J#KA3zJ>vx-E3?KU`Ca)2#U{l+ z;$g8P-={y|SUjO$YNBhbd#HV=4Y9j6;f7v-efk3Mt8=RJDs14@BRLAG|U9El{^H?8cQ4hz^f<0Xf*aP^fm0j zcRdW+dWetZX0!cT|59JrSj^ZH56nj9W@ei?%{<&P(()g5$8y^;&N9|=-h9b?+;qg$ z+}P6S(L2z@6wz1LSJqqcm^))QW$0q;Y9wmZILb8AbO3#CD^qh*KjUCyvcY6%qwAnc z(wH?nl)IFB6?+u}?+)(_w~2J%etsCWFk|#*50wDEbRQPO>DW2C*^RLgu`zVJhhytFF|TAVvC4TT ztdXylcUE*!)EDdFCvY`mcQFf3>2k92>;Qj8v!h8$AatW3I`4w)Dc3P4yyNWMjX#KQ z=KQu7ItaVK*NxN=dOb~41)k76bkcuCaKGTzc&iSv;JFKjyV!*M)%AF}U%#a8e_ z^jcFS|q%Nd|sKqdI zk6KSyTf!YV;yCVD?3|CEc}~|>*A~|!3aX>4s-vo7DEWXR@ctfP?Q50(d|z8H+yC(P zb2**PL{Ad;R}1e+?`fPaT;9gMCOE*gLBn*D9Zx-P3K+pq-w0nN{(f!zfA|ad^ZA?j zo5P@f?e7~H5O~ENehof8SHPx!hQEc^vNKmk1$Lmg^z$7WP4B#g+Q{tbV!}KEudKb$ zm45iUa2Is2E1j04$yyDv(pU4R#-*`pN|C^%*Q&J>HB&SRJWI7Swc$HG)Kt}0WpmL> z`&Ro-%NkCr=qPcoKz&~kEBjX`I53Hok+Zp*gCOU zqAAgw_%`8v!j6QksQ(%zJh42qjNz=*uvD`&v^3@fjj-&u9I!mF+_yk7veZhbov;Ap zcPN=gn=KnG61LR|{mK&9#5c4zv__3lvmd^(pFZUcJg*OUOl-&Jxu&v?Ql^a23BAhT zZ(mTHS3KbB^n5{)@#ym1Z-4r&Cfe^B~zk*?&|>7LiH#>vs57 z7uZdd7RvKBIx941$MQw~Nj^g{Q?Wy_3(kH-enL1S%#}@--HSho_l|ePa@+=!V<7B? z=JaNJV-@42VK$$Qmt~K>hnwu3?76H92tnO=4Lt1)v8>UAX!}Ul$olZ=44qqNle5QNayW1bypV)gkx;siaOFCUnpL39_51QqLu2sxf2g!|* z{1S7ybGSF6XO^(FoZer&v#9OVCu%A>@fQA8{sQ2Uu|PcVBlshDIdnNxJX{>)t14Ub zso~yul%D~o_(JbIow-rs`*uX%5(b1^2VPkPuBx#_(>WocW~D`KX~YQ`M)jtAW}mr^|K7RBnsRafy4ah3_WqC#J@y@Xx-mUYo~@^Gx67 z_X^`X{S;s2GE5?c`PF>rzP4~`_Tj5E0xoKPbliL6d*i>vbH{gZ>oj5>ki~*9Q#O%u z)0r*Sw5T4OX?<)13WhtlAFrT8Dj!Ra{>bp#zZ<<9y%@a|T?lU|XEaZAT4Vy+xc|bn zaHEmI*G&o=!bO-(^1w}e0q#5oFPm6U2rYuQYYG~IGvNVx*zt7t_we8H-C<)=$TyK$ z`<~~9C!eQ?N6Ncf;9lZBME=QpH1;-h#Eba%W3D5vA#kijbWk_RObS_p)-Be*t!u0+ ztvjr{P`F>u&1|>r_(HhFfQ% zia%lf*ILN-tL>calC2Nt!)*`PyP>83n>*?&?5@1d{Cw6SxXIsfcEzivGQJH3;Zoc2 zjBd+}G}b%LyOq-T)UX-Wkcm>nzZ37?GJ%RHW2}Ma^jZ&je;h&UGy^|wNxLTPJubre z_raALhL$>KJQwVhZ}HuHkNODx1j)zlsr-d}Fg}8mAjO8@s`(E6&_q$N0hc#;7uD&7*m< zuf}szNK_;~AqQ4^=DQ|zO86(?NJ7iRmWlR6TVlVY{z+Stwj^!B<7Rx)IBt&4{Bvy5 znWS?`x@1+dIXNl$E7>jwlMW~CPuk1RJ|_K=oF}qETF))mriJS(*G=NlIj<$-m zhF>%r=Y-a=&mfk4qTQm;BX8LVjDlU%5=~TlT$VdU@J$rCj*x{K3N3*!6pl73do7;wOufb(; zm2sAK&UegpNLhIn<_lJ>Fx2G^9#|wYHv0?vYx^ntF?&DzU|i+ocF8lSr0qAGB#8fl zPk2Gj%0zfs_oy$nPyF+tZJ%wAZ7X%mcHEX~`)12!&&x^aYEPl2+h^Jb+WXu4@I&$% zS2|R1g2y;sIo>*ccQ$qUok8anvO=cP7p76=Jmo#J;h|;mX2oIXt@o_&f=|-ONV@Yp z!92Ku9|#tOA90i3OUlGegugo_G6N^-Z;_3p%$$mygjfGPejY#M9Ap->658NAw_V7^ zclidItRsrUil2BSSB4W&Qe6^SX&a|yJ*Qt0%S6j0OCjp2`Kr0KxfT8q4^34~RZKHD z)zZC^oot4E`aOC{M-oFTHBdK1HwPw66HQb6BGOe?$(%`4CMn;EZ(uCn5NDz3`k}BZ zIx5;KKI40IM1D*@6D@X0d3pIs;joZH$Rn&`cCG{uE?Jf&W4y}HlSvvQU0e|#%(MT3 zd!>$q6T=K#9a+vsJ~grion8ZY*_){uv6&!Qg<`LxZ=p*dalj&=Tm?HyW zSM4A>!3nRb7tE@gfjihdc}Zmx{6+9t*val=2AjZ<-tpey-htkRc!{QYetN3ol_F(n zS8-KxO>jd39*vO29}t>dg!td&83yIIq$Kdn1#J8iA( zE$nyf_w99IM_#}Wq68T(b;vPz;dtXH>nP!nw1|>N`5?zY$4uv3=UdlvS3OT-&tGH` z?DrkIu*3FIwWAEA2}pAGi<7kILy(0d`YK@KKtuTfBrOxFQXg(D=TcqLMdp^piAxfP^KnWimQCD}urXnWWw&LKd4c%=Gf!btQInPJ z%33xeMU4fGDTe8W|MWNYL}kO*I#_Vz5?;SKb-UT+divRDRQ9C*a6Ejy;TR;;iIBue1VOwgO(pRr%)Mhd#O*1;s$l(#q)a zsFYbY5#Ib2Y87>r+h_`XN1brZ@I{G(yzK9I7<3JG3my&}%D7|rFxW!6yB8?KhF#;zmIGtL6e9NaO>QC$j-arPST*ts`$HE<=ceLvvb3sbVavy8K>v#+za)8q6yue+|fR`d6) z%E{i(ji~SnFgP10e&W11DgXsgVvyp-Q&XWA`;uI;pQO3 zPpRd6{ipFgT8kg2#Lp-{4P8*3`mdk$?trm;32%Q91NEGCaL@vqcdM zqG7dRg<-UDtZ|HKw5hMTuepGwUZ>Ob&p`3=752EP7>IVt|A8?@zgR0dCQ5qeh1zi<|H1azyU|1)992t zMd!bce;s)oxg85Q3#F;f_AZ3r+_mCxCj)7stDffT~MuIBE>?pmHY z9;peG{F^1evg07mjX|6nxEr~5yLY(@Gkd+qE9pEQx~Ji_EG2I|E57o>1A|FCxEB~t zKRO&0^~Ugq@F~9D6QYx%|BGJ3^=m`42fghwYEo=6z1g>TGogi0k4%%xWH;#fzSmIH zQuM-GFNOLS4t6W?ckwr6No4}w4VT!h6juML9?kyn1gGaM3aE(MuQq^^{f{{0)hS{q{<)Q4w`m|8LYFEkY~7sh?dVcuccX(>&{@WO

=_xePHN%7G6Zo8*8S@+QCH|8cfoQ?Ek**^>h2?063*J=p6Y?^D ztCdzK?Ks!mjh4qjI13M`=r3@x%JU(eSIK0Dq9=EV_&Z5A1J$n$y6@P7kGLzf`R?z~ zLRkYAbu}KvGDF=N-T?+viAb+31mZ<}pXY+s6Av(%t4a1alIxr~Jvv=_BjOuTmL(NZ zLvRYxQg@u0Neq?GZxgvSti@UaS^QH81{;AIY6_f z7ow*zTsMSQI|r`Ar>NK5N$GdzLuX_^5zHQC0jc*mN`9XBm0pirjjUycf0(@x4a#N) zyh6!kOM;7NOrKHe*p=+=1#9~*J~Z?i-zeFXT*y_>d}(e z9M}|)Ig{{R`Y}uEMW0LNTU+UfFCa2nKwWKyhnEyg4BEhQ#c~er$xvX}MI`9Yp4v`i zZJuc{)332iuBw2@=?~UwJL(sL-`E-49ZUf=Cc0T=!Dfq3S>Lq&X?K~2O=j|01)S}l z-~sOY?)#p=udIsqZgqWi)I4(Q;GhvW)<6*_|+S9P$Nca(pXB`8nkOv{m$$*=Rb3$zKu!nEuNd!~rJu>EgP{PT#c z*TYxB7nub5!Cfh6pGjS_hzu?sZI#pH`!~^~82|>a3%$fq@N8y9&x-D4>1lb4`as1{ zg^&hcQabX2BOe7WBO5%LHn@|?bG?;oztOYBqxkjyV!BegVR(&IzyaVO=f+jEJo*KD z2BkYA{>*arIYaKyfBpyle_`!43V(-F%;|6dmgRjk!Ry26tIh9OLO=Fvda2KtPbZUC zETmsp4CRK_Xae5HuV+l)*T53?U`ZybhxLEyk5aWPj?9mwf+EtlFb)SBIkmCK$+9=w|H=>5^YcROm>P#52fN}#gT@nT8O{;T~I&SBUvL#z{2Y~9u^$uXZ;ub zc=$;BJqJC)owI{u5qF3KOuHYVo4cFY_cOFbk8lSbfNRYg$R8+xUWVX!TNzq2#m;RI zu15*3cs$Cg#G4n}uFK@u*Dd;KWNpU5+ruwG&0c_hzofA0XV;DiN7TTQK@UPa6I0@d=nz}vvGz|w&9I7FxG zC;dOURU_Nk`KE%7>7qAOaG(U}K zD&>SzvByYZ@aIfzsj5?^Ykp!v-C6cGaNwWv_w*|B*DlR2g&yfZjxK!my7nG zbi}WrAM}&ItN(1^Y(VNO1)lN_7-_K}49k$`$vqncj;kB|o=>2_UZQ4O9tRHbsTd7L zO`a*ymHTA*Z218{3LWv}fMdTS4kTF~6oc!c$&?jLy!0Py!d)+ED`6|iD_)nlA<>em zrJi9|1Y?3RJuJN}(afu#vyUE;eMf;V6iweb;KSF!4Z04)VJW#|x-P5}--KV$59k`` z4a;bFpc0+9o#w6Pf9((LAMshb9k?GD2Xnb&s8gsj9$EGIy))3*Ur5I!9fIs;_Zs(0 z|2zK%!&<}G=<(4l?Jext>4m2_QgBV(?2tKm0WF{QR(q%20KGH;KFl9vr-D(<g?t09_bwEXCG*Po$YnDCR!tHw`aeH#znl&k;&l%nf1VS%l3VA%jn~1DZhuW*x1|H z+ZA2>+~_$TVlT<$MYK?#q7x$CWP{;59)>Sv2%3VDf7I01()Yn{WvYLY{}Q;mZI%s| zvv`vINC(WD=u6!EWy_bx_|QCo30N-Xo0tQzWs%7V9^^hRfag#sls_aG+3K7-vFdxZ zHupj5mPBWwb9>5;lpg+We&G^0ZEo8ud!tG3;Z>@gHH7Y+<}(fR^BL36E)4X&7IAi%q_s`7RRGL+GFu#qJF$=y<{C~ z8ESdMM6;9sC%-X}DNq6@g0sZrqu`n|A=q&P{L$~)Xl=c1gKd?5wZ4qIlslLbPC1Tl z#7=FeHU<{5_-TCy=2GhG%f|D@N=#eFfCA&L^`+Cxqr161C z0T+(N)9@=i0G{{;d;AyFcv_L8l>}Kh%{jx_#nH(j?{~I!mURgG>ibCJ$Um+#uE(B7 z9+@$mz=`e#YFUTjc2$7a_y-Dyd;NR;J%j&oIr=!L8D)cgRLOZGD%#t(91=ysc z*-azyY*~zt@KS21+R6e{YZ|5b;dnOOXr~u?d{z zcAoa0J)zy9A8`EH0lGN=Dtr}4*a_h=;X34RNAL}a!7*eL$mGkY(=Br?bv454Nn*U+ zXfa2gj8~+|oT|7Frwf)t}T=x63hBJo+)5Vd92Ju9L_*x5o{ux-+i?Z`W^IW>Z1=_#a_)m z#XQmM0D-f}HQ)8p{n{=47?ZdvfSTThFGbcsmcTUKG@Z}vGcQ$^DyM>{gJm6M98X+N zU1RC=n#~sTJ?lg3S89xEp!*#|ZkgHpmG=Z5RUbm1LUrgh4o5#Ah<{RlOFxV7j#H5H zU7xx-^&4k-X9F-#CGZCv#h#HFV&g!|K#K^DA2@qT%v?ZCCHp49pW=_FQfiGiLmf0; zi|UH&2(#e@zInbA-qT(WKeMO4m%fOlxMhuXxmC2!ALFT>)sxke0}gx>Fw@yMS3cv# zR8%dcUZckpguM=L)V&igSaS#{6jktjW)>~q2Yht%>7wUpAzH7W?%!MvW z7x4BK@a*d9?d2WrAMF1ZY{gidsrut>GXo9oIn3@}&=pK%j|iuzGM-x112y57%?sv3 z-N=bwT}k{UlU0X02BhaEv^Cn|7y28VDmTs#%PcD_;x|1Hyk>rHL3EPW`vf^KlRBd| z{fXbG?PQ)W8jy|Xf5^n`1Z>Wn_z#MQa@I(;NLxG}^1;Dsitg}GTxAS6WQ?a?-Hz7T zZ1+re4R1}a9X+mW)Bp+gWcyLuVcTFZ`Y@o^A}U59cMu ztUy0u8ofs8W7_pu^(E1+YKbQ9kC7iE&3sLK8-tsJR}7a8qtKiPD-i{WjI{IK^WN2H zJqy=ooZ)vvHe+_9%-R$x*7ImW4xnF91Z}}V)TGnFiOlxS#D9H@r#zhQ>GV}z<6X2B z*4#MmQy|J8m6aY+IXtTNpe)t|Zrc)^M+&3$_zg(3DQQ#F4pD1XhG)B+_}0tS+2!_y zecvh-l&LY(V@gveRY1QruP3hunsTH7I+EYRb}UGrr@rqypUlix;T%>`t)NzdUvk)Y z*q08t_Yd~qE_8a6(4zj9{9XsnP2#Iedlu5qIRzJD7rD0}MO^HK>w#;5DrhYnq*pi| z1Whdcg=zGebD$b}8F%f&poi~LTc2g`=+Hw7;x}X^7tDozoDIER@i91#O3h+wjQalC z{${AUT!pjw5znu~oT*3A92`tebe1c47Svo7Fie6~e+}zlTX0)2gw9bj`shdDe{Cbf z6P~*C|3$O1JX#i9M*j`e*j^LwuP9fQLFm^M1Xs9$vpXNWyARBD64B%o9KK*7d%)9? z{2~UNp?Efj$jkQO`+kEw?MCQUC>7n`h4ilLn`)Ty@yz_nnPUlR!O`xq?h^jO{%LgC z-KZgMhRHabnp%8g^U?A96DIc^)+r{Eaa`LR@Xfl=H!cz=9JqtZ#TWXhzu{z73DkJU zNXN)H|5$$+G-Fz$rhO9k1o4fZipyxU-{wz-SAGm_yo2zP1uH!e*PSj*$+B}*KjK-s z0&M&U*raBU)pHnsv-XB|hC|vBt%6cok;&kLz^y=%&*l3gFgZ{LcKQIYo`dOeHCLM8 z&b>yNfb-K`)Q;DA*LVvCiUj5mkE+3!xdYx^bgs+7E8fHmz!J$E`7zKsu$G?KQgEKa z<-Ux%Rwm$54opO9!pfNi5415%)2@;3Ffo=y zJYf%+e~xe$;_nSm_%8J0HiFAvh3bbAFa%zpVIsWj*YJb#Mgd*DYVeCx4A%Uo~p6hV*t2mPA_8VrUDq zXC*$?-+_*O=6~Yv;qK+m!kPV)o`k`wSO=ghQwYA{H*iFw$knRCyB&oA_Q=_jnfN!vHq^EQHNHf=ji2)Irk)0# zKEa=ZIpKudz=I@#JRz(^sY993Z}aW;Wy75+JBo194_ZopZUnQbGjNneH%PQfzo(ZW z^YDhghQ9rHSWXB{4n2cE)mnPNFblRab0`lgwkf^)<@6Q5(7!m~-{&7g?sJ_wVzzmP z+0N^l&%9=;5U?f%X9YdoS~cNF%#co7*HhAe{RupBni4|xz+BXL|1x(N0tfR5vy>gg zNcnQi)FJVD_Th6fz>w9F0ch{7B?tfnYSKi)rHwJUbGC*O}dF9 zFZ3Th65SaZoAo&3wgglRh-5wqdkHf8#qJ(wf75C*tt zx__tCRW9?4Z#Qi0BzkdMe&fWL#G z-StvZP zZ-Z5X!Zi~dWB_i>yo`LXA${q5`h)0Wi&oVqcm*BR$1UeD7 z8v8eeSBFh_{P^H7ir&O=CUPA!)V4R0qEBq!p%@t63_==uvIdYr^ z=&?Q_ztu&BGd+N_bqfV!nVF9Yjt&;)315lE_*89%_Pa7tsl~PX%YDFY#(zuZuc9S( ziQe%mdfCFK{3+C(&SUXVF?1ef4(OyeCtk_Fz}xzo$^4e!)?k`1VzT3UUF;z_wsrBD-MXe|^6!*D2vqqnOE9{HHI}V@R!D=6MCEmA!@tzf&A3VV9Vhzgeb>J;_ z0$+XyEKxIRq7S@I8yW#cnd5gx^ILS)9cU?(PcNT7n)e|-AA$`%NPJQ8oxDo#H5V#E zUr=et6Uq~61Jk7mwe|+|JSL+lwAR1DUz?aOym)yJ)76=(c#!2nEv!tabm$h0vtQvt zJqI_m6{dAP*tMC#E(liZF31+~G7|LfJ?iQF=z|E)aV}hsN$k4><}RbDZ+^iaz98(& zd?-&X#y6)ry_u)zL$&3M_#Ny^DPwu#8&3OQBO@cySKkK9e?FdjUGdCniH5!z%#p&p zNX~x2A&Um-DtNP3(Vy6*1by_Z=uv$RehD^2 z8&M^H9ZGJ!jmb(aL&rYUYuZbrp5>U^kk%cc;PO-5|f8Kny^|Hj;`* zhiC$oMi;jouXPf*Qo;WXWj0lmJYD?b+k=*APW(H^{Q53@-zM}hK2oa{f>ZDf4hKc? zARD0cQwDIhb_sS2p7UJt%ni&4^r5z%g-YdpX4#3%PxR!Kx#$Bq=-*#Q^H{u;9)=%; zTfpi23LTOn{G8+BP(aUZ9kpF1nJb2hgzCeeT7fg)W;FN%Xe&!zk~f?)d>u{b8gQM& zgX(wqou}cV*Va|X{@I#7j=W-ve~Z7ezl#4{@LX^sGviMv$>&4g=n#5|@9|b#t6!tv zOrIbbO}FlmZV~aS48j8v{<7#$wE$i79?pXx!e54;;fdr435NU)&XF5XS-yl%ui#1Y zF@w0nS-gQB<``I#g{gUj|62@?h#oLRpTdzSi)yAuU-rMyqmb}$=NM-j?=r)Eg0{2Z zF9kF3EgFFjgZG9cXROKnqMf zIz-2RXmEHinZEf1=2Klbt1^Q-n1~va_;cStlWhq2(H-br%%UfLn|aUn$gapxdh<8H zY&Jy;v?_B+GqJTG^T7G!UBY*Z;iojj4@Qq_=+|gpz9Ogh`vd;#f$M=kP|+9(tGBjV zT|L5lLNt#C!)|X0KfM|`UUBBaA7KFp(Y?%%{>KDfi{R#cp+M*r=jsY#`Oon7EAe{= z@?WWSE#P{VQ6G$k^|FR@GX(ab7%LTHJM z1bZPWyf4TVeY%kDFBDeuM)F1;1s(_ffYUDXGMTH6W3|MAs~&q-Jd!^1Tr@);U3v`C z~PdXYxEg?(1pyQmoPgN z-M)MJ`})beSJ6?PL>|-|T;yT!fDd_pBRQXh%eNPH+Hrb^bHO5Q=ImUD8dECT5zo-Y z`M`M;3zn-UXZ3k{OHulC<|zL}72>}98U7QUyhhGQ^I~MY+2-avb{#of5{$$&Sy9csz$hOZ9kZaT@B)p;m1u7F4)+WTJ}TLe!0Vl*JjOL~Em$TKSnfwKmM`LX=0E{+E;ZtE zo{pYikp^;(ZHKWwiTf!S#L1l97r;4-2d4CSgzH|HT6RCZqZYUq-se=#Lwx+5na^JO z8TqJ#q>m%cU_aop{Vm$mgIII$==vJ0@j0}yvx7l82mkvDY9IBz6gn#!DHOk%8=rY&!Qs=)0B`TVd zq8;}HruipuoO$4#OAhi7?P*d4n8AMF;OuEJX~j`M5`BRIF!5<88APM< z41FQtxxCiDb1)2SU>?jXshu{Wv zxD^xr5DEwcz z1^c&?sk5m9bHrKHp?x`Lg{%7B_s&4j3rWS(``izlEVGsDZMEn(VvRAZ#y3u1ChB{PA_5K;WqVu>VUaAtcB+ z12a+=+MR{LA7n!zsV91J#n{_X?BHkUTGtOY4*tP@C`K<}aE1oFIbHfazoTG~84OMW zmFrgU1y7hkY{W~lD9$+raLIC^O)c82v+zf1skPPGT3TAxs2kLHW*2X9@7YF7%*UHng9Rgat7^pP`{i)wjd&o;)atXZ;!T2vnC+rsLZI$p2?N8rEShV8zv(Pl( zbliBtI2mN*Fmx_Tf!6(nIJlgAsS*nBt;wG_u7WpM?cq+_^cKC7`OGlXAztd<>O}X$ z$~wzAAbjMyp?aY*v;3-*Tomki00%z=I$~0Se`+L zYd&XxbM%jn1dl>;$`qao@9_%vBB=V+oysm{4$q1nL#I>pbVmh81sCx3-{KA>b1^qF z9>Jdqp7cERdkRRuOVoOzsnVMI+6z{719`$^v@D-dx6diTb`1Jky2XH$}Vk8u_9Tq+KVp_RiwK(G5-9G2|g%KpBblq{MWYcTE82 zOtF@BKk^?6!CfM4!516#dVMJz4#gAh88KPrpE;Sqodc65dK34+$qJh`4p**6s8F`1 z-`NU1qh`b{;r8r`?2YuMeiI$3e4MAkU%Chmw?Md1_*~>{L^LVqavvKh4V4XO3<{T| zDc91AmQ6QeTpqHxDqw+Y5Wi!Y{feJ@WqGZf}yhH!;HE~VO#9UyhzDmo52g1xq9r*8k$>T@U58ej; zL|8gyz@kbY@-L=EMToiA`QC-#TaPh6{X|cp9_QyG{MoY6kLnxl6&}y5r&QWEX`%=E zHQ0ke_$f8SP2 Xp&p64Qd5TOX;fMBU*WeZYV|3@U4bei-%GL{zNAOXVSbgi)vn zw&IS==GpRqt(%V`Q7n3|>&c@Flh^KLmQ>tS%(N!cx=brW%R{0~Gz|rj_FxOdGedk; zBsXco@4t%fSv^z<8b%sMq|dquyk%z8K}D~pB}yPicz+ohI!t??qgnL^Wh=q|=Yg9q zpBFE=>giRvlaM=(&+t621-HBmomG{!92D&!ewVOP?X2-=oEXq=l4qvfh^Q7 z(#tGk3TH)5cFu3$n|=mYQ4WVZ@!b0d1%mFV!_OuE6CL25-~d12Rdp3rQ#bsO6_OKD zgB>G+Oy_>defXIZ+-@Ax&i_?};ZB^uX%b9iy z+-TcKJ9IehD8#*s2zO>9IPp{X)a}M=xSg@RaXK2dSwQti5QQ8>|2|(ZPq04EfGC}e zMsM^rirAoi^=I%kEDp9YyC~CwXMKr-hs;|=bGJLWz$h~2T;vW4*xAa&Rnb=d2j?5P zC-Y#3dFiU&#Rp;^I@~MaH9e(wCFkvPbY$fFf5WFov=CQv&$IG+7SOTT71J?wSD9#?}$wj`^2|!mVU0j2G=V9vVTfsGI@4~(8Iu8eoN=t7hE}(sO9{Vb{d_%nlMiKv3sM_#Gh#%-ZK~JkqWP;3Hw=k z5%=+s^MLtQc~1WeKMFq$JPYg!Yzai0-1uDil7TJkL$7+-iUBi zg?n|9xzAAeYK6i6OWr8D@1o&7f%^Ils3!GiE+-l;`>D!u zp;Tl4p6YOnvbg4vxt0MYI@|+6ybP;h?0|kYL&!EIqRbvnY&lHWo&?WjynOndvjq z`;v(-0smZ(+0`-lVP%+aOD|Do=R;Vc{P2O-E}F5T7uJS6V>qid+?d?NgqP%S^XMBa zCnpoF-F3RP8H!y}2a8sv6&$Nv<4UZ&^jk$$K)7$Y>1+N>FXuRU*m<;q7lO&w!GIJ# z^b4M~jm(?m&nf0ASMfG%NzVH%-d3W|FWhR$4=T`w?!dWLg&x3NG*nN5#g@LtA+SIl zaKM@c7On^C6;t4@-Y0`D0*B`#^{yzZ$mhGESjt}$^MR&3wPs1O~nMCPA_;OdlgQRnF zZc+ON;B%eh3>O`MD&Ss4BSW}^!c!UxUbsBhUGzhwKP38>F{nxkSBIv1RA1`)-0bUS z;l^nDZi)!E@h@fLM;-`sy;ZZG1`09crJ;fEE(t4TC?7E;3(VQx}@9`MDqtHg|= zc%>i9L?)G?OD!z>KiMNbuGnn)s5RJY*}y6au0I@33%}+$sS8WCC^b(f@)qG))TKw$ z0wvHA^ zW936#z7l+_?_ht4M}zR1x5LD^PA|D03bzmp(l5Ym_=>Lu>6}hv15OacdLxtWFpA?& z6!nC|-kg2Zfc>?St5K5pCq84Mt1EgF@_EtwSP1V(aJoy#mJ)CWTThOXNDjAz>n%O} z+tkq+nzPhv_i$e-41Q)BoTXj#(h|`bUxvsQY2y7aZKa-G}qdxtRv(CBxaq;~2P8W;FJ8?ut%8tf#$X+>=$JgLvTLK}W+!h!k;6+OY&3tvYxr3L43Dtsz@ z7Ve(tCw$?Y{Qy=)X0tZ<6vAH&5fKEeICO6??iE_vDcOUWba!6cURv^f1Z;Sk8YQTjKcJ1jl@nk?ao3+J~f zbBAYeE9yqojuJNUNoMn};jz@?YfQKbx6`*_LiUUPTU>%Ga%L?9vp1W%QglU*(sP@H z0{LtF0gK?FbC8~WDkrP-N<>>rxDbu#VTm?$QPzEQBL!2H8zfE%{Wnw<&Gq6dxrqIz zkb^6%ee7h>zY%}X>hwItiQt3r3ku~Mj5<02GK-7j?EZ>7Yho2;I+0(WU;otb)X)sx z)Oft!8?o2sp));}T=x+>yMz8GSY;>Z?rqj@B=*_ZYYs95;n&rmyFLnkM$w2A%#KcH z(AD5tmE*nMWM>^loAM-{8%t2JO+~Z5D?jT3&-hjL&p_D9^}r6=i37sJPDV#l@}d&V ztLM;VYKU(`C1$3vZ83e*rlFRhDmX`9M8UQN9%ZZHbgXCfqQ4u&kPni35T->$lzvL; zN`UbT!d(ugUm(})g3Dkp^mi*W&#n}x5^&RqF4*8PI^k3NN1uLq z+DcwoZ!*4IbVcptk|UY&eo5;^SAQU9O+CCK1+(=A+}nKg&I>S?tPMU?dYCPlo0Z^R ziAPH*xDZ{*ePoUz+_gWc_m*(_wu46+%c=ecGuyr7%k9YH47j`$p$mBowa~%({(O(h z^l~P@;Vmd)6jAlN^#ygsbXo8$u0bz;K2P2&^ixa1&*+GD@{e>Ns_H81>ggNmU(=^^ z8+}Zz-WvZzr~NK5rVqXTv(&<($MHR9L2XgaFbinjn9J8X(N1K$HV0;%4=LtZdsg@Kr>lPHI!;fVep%c;VlkfZ|w(@wGL+j zSb6wg|H|*Fp%c&AVsKmbz#qy1mU@nH4rryNxYO@6O4Dr-^>#7(iNDfU>_vpVOU}Cs zuG_bG;dL{0F;!qjdJ>1@>Pl^;1iopaX-g%ZmO$JQors(4p$_0EenQ#)KAfQ0^!s}1 zyX*Imdp01~c#5~z6g1U3)8|@`x~=qq#6Nltt0DLDA9CKR`Ukx6|5RDJW|H~NO?th}aLhXuIvwg9{xLiQRdey8-3m`o`U%_FIoZGv z%?-{9&St_O81VLZ?FsjH01G*V(0zC(=Y1D^&%MvQKjD>r)_)ehaQ@&^Tq>UjUoo|v z5^RI2^H_R;tMRkR9JB@}_$T`pc^7);dggkH;~;hc@4{IBd;djna5dp3Ovm{mb1*vi z8#B@R;5Y1G+8cW7dq=oOxEr!+dTM#ZLv)INieGRXetaxr;Ev4)TU^&)*S{PNSy9#i z??CSk?>6r}@L&6Udwg^8Rk}%UsUaNL?^vbrzd8U%qXx78Xz+YveWQWH>iv7D-Ohs3 zZ_V5|nfh7uBa@gn-KLk*oApolAEsHt2>lL5Z6DlvTXH&-;>5WZKA3hmEjK-vY2@;c zm|ct^AI}-d31_u`_z`@5!MXI&_0O1(btZQmjK@hV+!s+b7HvEeJ1JG?U~jzAw>JD> z2tvgzsL!h(lQ9pNr7H$E&4bs$Ep&bF86OzE;7{hm^Lc4{VTv~-8{X29lHPVdJQ^Q^ zKaWzw${clpI#KyuxoP~@C}%}>Fwzxp!V=taC7%E8JfoeBU8(&-hRw#U#sELFD*U$B z>N9nTx>B9T+{woryALyqsW|;a^ihT&z2yn&6txNtcLmLb%=7T@UIJdG8~*84!Kq%t zGjpJ+KZwKorUcwRKbzuA(Re@p&U&T1Rs?Swqu7=2OpWQv6*Zm5C$b|>V2$7eoCS4r z9C_ zIcA8Jlir}o+O$zB0LgCxGnq+Uy%6F7rgAdgnQDNUdCDO zB$h}I=y>o%@TTvEFE7q}pFMG&1>Sky@xF<^Bg|*4O{9_$?C+~U~o=;& zPp@6{J@(LhKSsY|8~xPcRGM92)E^{A`vH~8cW}{n;S#VIJY6M zp)WWVoU;vCarx;$EL(?9Qv@%mzQmRr%rZ>z9F;O!_1rJnC9~QUofSZ5=|YH&dOwEg0c&K;swK1L#*y49qJakrQoB} zj7HNpYBBYydP_a399I6p4?92ov3cM>?=qjL1+TnMhAR00kS6C1vxr->O*8S`{Z8C5 z+4~ihO}O(3|MC>-;%klTVE)VpUpEWh^}oiAd`@^&z0{s?ey=LIz>rUZha~)--sq3_ zRr)J>xVyu(k=iC^b~%+?%3?6Ye-rO7b3QFIE;24MEi;u>O2RNGqU->BS`BP`cdnIu z?ORr|lBCH0cGJ5(h1csg{FfRUYZ*V|+1JU`!8C~VHLIGjno;~l#kb2xH7UHKO+@mt z%&k!NfI%Lo&r1$o#8Alaky%eG{Df)~8*efj?8}_&EnMSK%s^Jc&^M7+ccR}>3cT0} zy7_(RrHR&-XmNf`Z>Bwc;z%ehG&RHjU?I`*6kW_0V#5oQ)(4~PI4H7Qq4v16?IJ_W z!y1WK+%VrTUvqDB?`qF#&t29D?+Nc(-&%I;4PQl8Rc}>qIZru{@ah&8m>im;l%tqKahjdUa2QL#5nSV3?flzu#8J;t z*Rjg6+A-WY6kF_c=NsosXItlw&SK8O&YRBL&Wi5xc-M9Y9e&1>-;>YtwYz|Or0W;g zO4nLfC){mIdn$O|;J-PHy;;zg&v(Li5@$jO=-R!$*1lH0nZDWha1I88ur^Q$oexjI z4=bt}kvJPHQ0I$&NfmOdmhi%Iu?OoL>Kb06s4uv?NyL~oXmiAp0iIJXDEV<_F0Pf)Zu1Nt zF`hIQ;~q;4G#M4+Bs^bd5TDYOu=11IL(QVuwTIdh&7(QAXX;D!33!QkLkbAG?+xvY zos46YUzLtpS1nmfzy;cOJevOJ;J9xkCY-}#ME31%^|lK2+`LiSs99B;s_=E~!8Xm% zPr*gtFa3Uc=_(FJEtO_UPGVRuRvopj`b7CpDFa8Rv#GslGP^J*JelwCz)A+kJKi)N z$IRVC*u~(yPnx>nnOP4`5hn?15Iiws^I^e!t1dq&h+FETa zYd(2EL3ZK|<4t0872`XW#MtfHR&9^@fH|mnwVTRae#EOQ8lQq#B6kn9t6B>- z?G)2wQzNcpetduh!}%kwkJnAtOmdbDGYvKMHTE@%-`X1T=h?cMy4F+*8|XXw=+g|N zKU)HvK{4XB>>Z&Up+exSDuSR}>|NmPi?8!h_d$0vcWZYWcMJDk zaJ}_C^*n!jj(U!G{_?zbzjfzLr%C*_C)v+;ULrQE?Y|@p)ONk8<8zr_#Y?c^KOiS#V+$Fh8YT49(9d{far{B5B zwZZk$^~$x3HP$)Cc`Ws0YE(*ka<$~@$#+<*Q&*)HbQN-a@qF?0_V@C?1qU3*8Vm=S z0l0U8Yk@1pk>ohxIPEC!D(kX%E#75#!~GRL5N=Q1siom+1TJ?d^Qkt(>@D8S-kQD| zzQu4i?Lm7`>etp_c0SYp5#5|tTwBpx5zomN;TPZrdqm#A=@XrXdFhYzUpz7 z6pPLpu?#a0H_J1fmsnBSSPo=<6Qk&ETve_q&$Or7XUi8$E?X|!RqIt`^wP}>)kPW4 z)l~2|$JyHlq{@QZRZK0YhA>@Rr7TmrD?OAp__o5$Psp(w znH!m>TBcYYSRPtdnOB&zsM%EU19=YyEmfbQ&qlsJ&orA@d=tG9>PUWeL9MV>0j^LV zQ*Toh>dc?1DMa(BkFJ+axPO;9m-2utfuhIz|D2(vB>aunRQ<8cdPnF+=w6{&GY#y( zYbJ6H=yTtp?-)OD8m*{Bjr=1L3&LfjiMul)X^^Ey4^a z8T|F+;KX2Iyl*Gt`WE5+czJ+>~!x8?{fE2cWGxC zr$5D)vMG6U^8Dnv$!pM#DB&pXXzXn4?7*twsOjjN(krD`Qs1O~340S(#4nGp6<;U* zR{V|lZxgE}HcD=kJT7%?YCdN^=V9mHPQBCM?3>yv^{3?S$=ee*Ctgapo=_+;U*d_R zf0AmZR!NO@#yPDX#gi9KX~5(5ymG&HH*(c;opoGtoJc*wclJ#^kh(W@qGPJ#hVzP3 zxO*eLzj#}s$+C^QP{n(?8y@o4d{=y;CA5-#KF0aGGnXs3>#FCn=Ox%}4?VDo^yWmP zS7s4$fuw*D{8BytcmCqRV!=W5i5<+Zr^3`+k6(huS(lfI)=YZ(Ye8^-(#6p|*a2c` zl}@l$FR2BE4_T9$m62Zfv8dxwqWv-4^owbiwnzKTGTPFd<=2ARWA%YLS^a}-Y@J$w zb;NYc^glnCu)#u}b;f+r+|%CGo;@a4Oz!Ah(Mgs>%X=kO=}B(e6i&qnFq@zam|3qk ztS7&9np4d`+lJVV+Wxk+$LG8}@yS9DbR=4I8X8eQaK?|tzi}aXpQflFYLCHq&7^*> zHdLomnPpM!Y6Es%5Bia!jrubu`3y7=w-Yh9C|i^YmWr09w#K&Bwsy98mU)(k>V5TF za>Thf@=1&zWf*BV%e;Lj-q3Hfmz*DQmVUN=Hm5Ds_A^{JpT%h@VJ>4ntsYmClvMoS z7lN*7z)4Y6iB_Z4Z04-y7uHwSTG7>`V`8$#+_B%Z-?ZGZ7~o}HWyW5Jb57>YGvJg| z0~0JTN$zK)W> z8FM?Wz1CalqkI6ZJ=8dySAE*3(qozjcDk&gg5kaH4O0>_c+MU!p}N7m!ECgcc+dCL zXMF4q{qc(671G5+f@_p2OW);#%x7r&>}wC3Q;rCb4v4*Tim#b(88QKa1_YBW;&o};W{7-|=f}6l1i`GXry3OxcqFX2aHt(q& zKhZmtgY*rNb1rlHJ!nb`cA^NAxTic3Mzjhl!M zn&+wV82GS3yQW>x)|xk)FI&!8{<0pmuCOk%CYlq?E!CE4A~jDEUX-G7wAQr2B(-HZ zer|cSoT{;WieGWE-qJzYONQ53X-7WwY9?Q3y?Kv~IGVnpP8cbDHwe zqnfQO)D~$UEgvmLyWUO)nhMNt(*YY`=+T!zOnk~xv|fV1MU{1bcoxcR8Lu(hc5U-teiYKd-C`iN!m zj&JFwaxUzk*VMpN-}HxJh9M6MT7qeA2sgPl^Kao=Plg9tn7q0Rb!|~}Nrr&ksKtKj zg2vFEz|KJaNTJ9c<|#di&B@Gn#ly!%SH~ufjP!nrfqU)==k=uLv}d_{nR}IImB-{) z{H=m5h@-EAe+Cu@`uY0#mU)(Y8qxn;>|EkJlX5zxQDW1?Cvo@Vp2fY3n~*pvu}W&q z)Y7gJu1~Du&XUga$!C*a#J`F^`uXtZs82>DLX4kof4=+qX8g_gACrGfF5t-T5FL^p zj;@YSa$0h=#Hxw5_~`i3aV6vSuzpJDmT)5JXi|~X;;H4GWu2Q{n_d0g1L!FAaQAlg zajm8Tos}{>#hv6#8k#gbsbF&c*>gJvN^MnO>o8s`Ud*SqQ_RsTijdQ*TB~i z6i^g6Y{BY(#9x^9QxrE=w*t+|Jm~M8LX%s3tYj9S8|~Tu$ZH2v*B4}-SAqR=-g?3M z(Eh;wvu&`gh1OKtO=frx53_ju;fCQ%dxbv79`jD~bn8s(ecL_TG5axlBI}^-knM>1 zZ}V<4HrZ1HnV$sECgK? z1Dl`;^>9l=6?Xas^}JdVt&$GbAFUfK>n&ZhF4`s2Wm5@bagL~TL%cE0SQmWZHg%I) z-`v>TjTpAue$d`Lrg2O#IxV`ct)|VPdeyJVDHq_$egxcdGo`t5L_4aLx0JI~uvWD8 zv-P!|u%EQIjcya&z~0b4z%sxh{hv?Z^~G=fi19Du5jg7SEoUt2ZJTTkTe9u7^{rJ% zhiA~kyK1^+I)YE#K{EO^^nb$S1AVo=+8}d3PL&7d)#jyUzm}#A)dp%=wd`7~`j+~2 zfI5Yq)E{UM8BIFVVAC+uPHNL%h_6*G-&)$C36x@SSWamtv?`o;XPMwXK`Xg6y}Yl` zRQXrAqYO8XL}jnAd4*}UX%w@Yx$uDkU_sY_9i7G*SIktH48OE#kAAyexTaf}fM*Wb zP^()X+QKaECev$$*}e<>n>hD$#vEi<=x*J+W5e#FU9CQ8a%ipi|&VO-jw2 zoFlnTLiL2+asA@7I8|h<s{x+&H?PtTAmsnyC<_}p=++It>Z_B zmZGFINotZbA#p? z{YX=sgT|qw*^#_2A?i!iZZtpyPf`-TLK2wc(qL-d!0qjiV(T3AUy;!F6JP~g* zd&{fjrCV82F~WCv&+O7qJ-NuV$h4o>2)W06L_4f~fWb8cWPKOh5(k4{O9z{G8GVPJ z=*dV-ENU%bwb{(JR@TG z9c{g>-O~OuJun@Ev9ySF*mTI$)ZEg1)ppUgB6?M{CE6N2$vVy&P}9{n#%JUT^~kWN z8^)M^H%X6Zvt^5=lC6U6SKCP257y?^ugtm37nQS0b5kqRaB_ghEG ztPxnRa=P+5Ju!L~9GOvIn6}gT7cJBWXg%g3{tR=CcGdD#@ioG)_7WKU4d4W7fs0+? zTj4wJI`0~qI!tUbl2#W=GeVp}ObzE6oSzYTL8yz)Ms;1mae4IEa zp@eH z{?1rGLuWO@EW0%xpQX_LFjD7M@R##9K^xQqQ$Tbb9@C+yY^!FQY#DEPLEo{x(wf-qMus%JU z>iDM)Gz>HBqnBzoWj5JVt9np7sI}yo->>c0il~LvlAQIzZ;FQZrqhRY0}MkAIqBOL zF&8)Yvi7uovBp`iST0#^YIig{`E@dL&wflNJ{sde@vKGP%x@gcyfTkDr`c(BS)baU z*-X5QygcHlkx9lI?iI%bM}vi*zsv$=#)O3~QV8=Ss&gM-i-J2DD*LF!&6;_R$NIqPNi_8 zt-$xx0F|H*MTKs7uY04>oO#H6a*lT$^|){%riFgslm^l6xdibWC=LhMv`JbqDCV#-@HsZJ1mqxmiN%gc#!I^AE2- zEP4Ou`!4T0zkmPX!-tJ=>*FpaUrNsJ%Bsnv@m-QTCO>sNcjR~HcW-fTc6WF6a;2pPQ^zJxNWPVLJuz=${=`a&4grGf8z*YNZ@;9CQ5Pp5`71=3pNE=MZ~N>e7ExZ>Bb;7Vb$uY7T2^>eST1 z?ji2q0;2+N!3l~tmv}=B#GQ6aU_;=z=alD(^Rd(Aa5;9lcDimbKdlp~6KSezs;h1k zm69q(tPXU|=)0W(^|%C_+hO=9IavkKS@?%F8LWuP|K{4~*pFmBmbpSqxtQ-QO)Z(3 z^W6|F88E7c&_>8hOl?GO=8Se$t7@-o&z2>7mhZAQ$a*s7bj&!*7)v&KxcSizUx1E4 zbJO>xN?H|di+KxbeG|=bT09e$RBfYqqZtW1b2)Q)b8qGtOHE5n8_>5pgk!PBj3W!V z>_R%lUb?LD)V3$lmo3h-x`;hcO{<~3V|HUZ9ozPBeTb0eqE%fXDGd$)QE^T~E{kU3NsSUFZv;J%!#E!acKVRX_;-AtWH!n z7&jW<>EF?TJxCAsnqeKe=od9n?T1Erds}Cega5XP4o_x!Q=(0q7L|!f^nBeE&d)wt zPi+h_dZKN-Ex)yZHNTc$lQXESp$sUfm4<8JB5G69Ha9mhD{!8(fki4#eRCRK)VI2C zb!*tIQrGNc-9YE$6j&@fzSrr@+}d&`FU9M+4BUn?%i@Up9(cr~ww6Ovf7JY;N>n5+N?DRJE@MnaP6sHFJFojAHOMu@HGszrR z3w!xX+ut@VCa{~Vo2bTwgPR=Ep$nB z<@M#`z|d=h!3oZPD>!zq(5w}a7LrbtOwY`cxhcCPo626Z%CHQqvPoPC`nm?XCc3Qb zZGW;3Z)VCpoN2xWztETTse(guO@CFdi`T`M&RRNa<@hS`XPDtFh4Yr5oQ-rinh)XN zd}D_35|5;s%qAvq;wlfGB+*3G_2Kt;)Ilb91?llRaHnTiHBvQI2`}gs%2mqK@ZdV& zt)2m=s14`UOX_Rt`CQ+Fm@~d+&RA7lTm4k^kh`|9>IZ%DO!-W?0$+?;Qr7xW%S@F+Uo`naqTRx37|p;x;UeL;6Gdb8+Y5 z8f0mZ<#F8OxB`X(hA^|}&M3-?DvK)(0A%O!*PE>WP2Wx5T|Y!SM0=Lre4b)~A_1O# zN$%~6tVKVRNpK!gnD;hO_QwxsBWLq?3U?8l;k(HGMAeKPn^a^^3q6MlMDkbos3LD- z9bDAh=&5difz*b_c`0;0v(O}1dCGeZqjmoV7f%n?)F@IfG8b=&&HgR^&YljQ zan4E3x%L_MN46)ns`kp@t$AQ1+;<#y9C6s_Yg25gHjC9_)lj7^r7ev!8fO$V7c}oq z+nshTNN?T+m%hdlU#|es@yNHT`yfd?S1W&GR9@N8HN^4FOYsF;|$iJGJA1n5oS6{ zXB~ST`%vo;YcYxt44dESbJpRUJH<2A^SA4@YbW<;dwXkpdwXa5aK|8rf!@7`r>m!v zzq5ZuXl2L-e{V>1c=Qlw{uTHN3vcjM@DDe7w|E-{>Ib@k5qscBo*{)}0{&FOyW=$q z36ah1ge#s$mS0w0US2NzMg;EkC$lnf|K@~SDzwihj3wWdL=*ejs^J7Owmu#|7M(M zJZm^-XwGa<%B-L{xa${?U(qYC(XP{uqyEs`*RUXH2B`qX52j}3yK4&ZBdQFg;GVOHk;S(~1~!H~L(slBOR+@QEVre3C>^*`&I z!Q_iWf7}pH@1K}MKIE}ZHcT^I;>?CZbLr9A^M9= zoQwsYS`IdZ;8OfT?=sgo+qlcL*EGU3#FT^iaZ!CCeX=H1^A~>4z0lVQ-rp=Z5_!2t z!}@^!iSe27Pvc`_F+&N%TYmCXb(-44N|2&TR5gVEv=?)AzZRZ$BBNj-dh5!}E^ff)Iqf*@$YRT4D`72RU2olBJQ?Bnc9tV^wh=~b_%-AF5$S~B%v%7c_Dsnt`Dq#j7!gO7Tj z)ZVFUQ`e;KPTQMS!CcP#3w#E**jVD@>)5&PB{w(;Q|;4_9|rk~`V`$n)4!*qa~L?lG^? zufdwZn%i>KZbKl!yjntYv+6AdFfg0UE^I7SWO@OJ@Nr{NFI_vG{P5*_4x%l z2Z7(Mq(n|y1@u{`(ParPCMu~Z-p#L0Y6qyFabj5YG@r$0Mn4k#DB%nFF@FZ@7N$1z()$G;n)r~ZcH1>?^6}KgBQ=G=6Gd0#X)SEO}G_~Lf{{}`l zLOx7Bfal{WJjNb|9){JXm8=q%IA>=uuHl@mVEs!4*Pg-N`!{_)4qoszjw)+wYG_*H z7xE`}`h3%TQwaRg zi+rgS=*~~T9~D{?kY@=-Dt>vxXGrnguFgG+GOFNo&AoWn{iqxg4h0=tR_#uf85bD8v#>9G`9YUAVv$*+>$BsEB>m(n=BQF;#U zzXW)LS=>3?J=|U0EuF2L>sdk0rk_n8kvbyv9pyE9%!BPi?XBIvxK&=Ax230g z6wk9Gc(@lJv!^u~Dh~sH2HJp0ML6#d3=f1ae=0hVb#gT`_+Obb9_H>4UZefU-0FvJ zbTQeJd*M*mmQ~09=dQdq{Oy`d_XTcI&{)W5H=12_LTv zdtYH=eq(yPEq-Cvxmh=4*_dUWX`N{vz3EQXE|n84vy!g$6a0!W=d3?9&ov43kabLT zO?Tq%#T|`17&p^6&$xm6N%+^)#ZOdZ^7cTF9H-2pT+cq7+nCEZ!!*-0f&KcZ?y#;s zGuaK`ucl00_#3qCYtgfOS1e+8ZVX>fu2E9t7}Ffdk&>%SeW)u)`# zg|FT@_kDGt7aT!L?YRS;R^DtL7&2 z<=p!0`cj5+hH+p>C-i6ZLv#alWtrKE8B1NXD7)d*?}imvh&?pbkZzb~nro^QS1GQe zse|dZ{;s|p-t@)cz}G?(7F33mYna>SH0Ct^FeQ>2(#DjcPt>PtZ1A>bsCp|0C@(PS zX$mJwV7+zp_4VKNU-d$yQVP~)1Dx{9smjCGs;?(B{;qLVqv^VzcOz)96A{47aSOD8E76jNs`kBdLInCo~Q?o6(G*b#P2qHn(8yy=|d zoaH!d-LM^F8b&9_7CFX5%?*v#=na6n1B7kA1x9L2TP-PDS&@~IESQ1Et!0k+S0n{@Q2DuqnVtF?4?sJtpE$|!28>#2uu&yHhuF@@f51?&93c*s74Z!bJ}QaKOR zVHP?`GfvZ9+excsuJTp)U3XT0TA$O9$FLr*kWy#V{YREe8ksIZg;z0(nM@p-l1kc& zT7@2FjX`D5Q#JLq^xruL|4grUm%C<B%`tQ@tJD|aLzbdoW+;DBJRA)zzmGTizw~B!UthNuc&&`{S{XE5jtamIL~7F;c$4+^_z-C=r)0dRivpu4LN zb0ZbLb`LQ79l9;L!}{a=jB@>5`u;_5nS~yrL(v#R(bZfOatHy;5;l-h)p+nra1@Nt$8JyjV|Pw)cJLKG zss#f10>#Ll^YVvn%(LFJ&J)E{=B@W_CO`HB=e-i1qMpjGYOb-4QH~m%CpX&Gz$_eU zn`xT{>u`^4E`90`aH~g_N0#{+b2G-9Cz+Gd|4n}cUm}?9Pj6suU>;*0XYOV0X8w@= zH9co~TzcEI&dg%vX>HRwursHo4ND)!wCE_G^*wzoAKQW1QhrN5m{dJ1mW+&ypEH_g zgv@?(4>(nAn8^;ejDxbZ8eKu$G;XLkr z&b`imT%TQE-QU~?JqJAXz4g8KynlG}`FdPC*FDoy?=hI_38&-KyOo_}2 zk*l-|)rCSHm31WlV+h>S-I`sR-*q!}%kZL3&|f3bYM}m`?jPM)-9)Ysg>JQWJu7@M zZ6R$D?PDsh{wMu@!$HGa<7;C*Qv=ft<2B=C!&Jjz-68tUhnoK2J#k7J0ilUJQf-G*(si z%s8MsNzeL?Oe=96*HzV1ePb_npa&2f;sW5S+x6S^PJaGwe1jWvwVgkK2ilxenK_Bai2Z`lPzOww3mk z?mctrWc^Um0U8;a7*^?*>3`SF)-`1QlV4LnGn(_`IJ5|@nFJlu9%inpWNml}Gx0C* ztAg0fMYJ!u&o8Mjs=X>N6X><7?O@3ncuCJt&tM-d$wc*wrk}Pir(22@A$;aV&f!{0;ORp9CU9yVKga4zH1g6Mat! z#cjncyqX2Wzmsx2985Kx(gFM?o}s@LbHm$cafR<`UED^+ym1-I(<9v5LW?atVPX*p z$t=}i^^At0*gATJxx^dvBB|t;HVZWgWu*$>t6nrz1daCHpgE8cu=>;eCE??x;Qb%) zMSVH^@%|sa6yGqoPeMzR0%!gc+`Xl6K`pK1#`t1BfzcA0a)Vajj$JNKB0-wv_ zi}U^Af9gMk-`Rq|vcOw%D`kNG`+R$R>G-)@*pKJJs}?i0mvHvqN8d-Q!*Q~)=l)Fc zjqrCUPYIupUO4NVik*zP;jcubVd-h6JXO(036H1~@{^=^jFG#@)?J0q$WgpZMCQzX z6w)3tNi^K+LPI78QDW4rJ`DG!02s_7y09X!W{Rr{ai?uiwW7}>FkCZ@T7#aXrKYv! zzWN?h;1cSYs#&Vfa0`UTw`lSz!~Ylko5_hu-Qm6O2CY^X;y3_FBIrw6!GDSC$`^2PE;%zZ?rhUkN}@S2yX zmyry$0VJ%y+CUGmkr}6wop?D~w(;=To$v(h;6M2^xj99fHKkdV-oU|VPrX3%vYwiS z&TcJV;{v^RB28K)O*tmCdo|6NxfJFMuO+8!C)|fwupiFp&YJki{7eF&|TIgX;ZZK>B&vHEF>9Df=PB&_m}Re&PM)GF@4cY-gZHKe*Jp( z=+EdQnrfSCb8B<4O4QRXr~aXDX{f8CJEyy%%c+kCk;|o@NnXJy?I`U8%>*&#qW7P# z`CU6xyHdAYR|A~ClfIq)57silm6{D3d=Om8y_|O%FgX`G_5wVY1wiie@FKK-|0utr zKJUO9KV2~&9qci#jURaL7RI}|1>PHipVN?w-_xt zKC=$2jX{XJ_%gH zZ-GMB`T}fPcr|xI-zt3U^DFY=6FXAbgFL_2V4`nT?_ts{fbmvb9?Q2W>^eg_b!Zv(VDTEF7)3`bw9K7e$ru4 zq1#Cb5%vu2G;I}>F12{woqcFC=iz%`N-|wUTbpddtz6Sey#{5>G|o53i5(x%b=G#%-qYOFXkq-8*Ok>xXO2D9Fw@{OI1KUd zHaz@&8eF|9bL43}vfJ?XyHksFi*>a*Cm0Pz!(sUUZ+JZG=m|<1iW)ZPx3D|Q^rPr% zV%iWL`Zujq7v*QH%Otir{E3n}!G{*y!@;^?AbFE@3>mfG$e_H<+^h_4b(7hfYoMVM z`ixWHclTH`*RZ0#RK8MvqmIDw-$5UfPg6u=Q>U|rWl{gD{DMdPO@+`1U&rghOEygx zbcEtQ6?za8zMik8e@m0e2VThjdkG&eC0>eong3nI2VdZxtMShgdGtB)N4OKZi>|zT zcqKj$E5Wr+kng*Iw^!irI5jXe;PrWZB7b^_ZveZl*|*-mnoLW(|Gxi@-{Q0RwtKgF zbHGJ94JUCy|e;U+?J0C(YV*u?*3e98D`{$Wl_Pf4Gh zJ|{huDw|Oz8+jZ*=PQ_2G)9B@A*=O3fId(YK zJJ&jYb~SgM;qkt8{msi8SAy#*%#ro3p|0W7VAloSGaHT17SB%4dGBfO6yJ2;b+oXj zd}r8!clloVUi-TEJNXL+3J28q;cG&gP|k49aGgkm(6Qi?t%F z_!1c6SNvP2;nJbO3&_UKR-a5O1DOFf=8R5qd<0iVKC!=(ub!GHrP}8O8E5Yv(XUi#Ed196! z_VA;4@mi_r?9=(U+wSvOf{R#?8p;f^9*Rz(fa2YO)-+5iQ&mXA+D8B2!YiX-&m#I}-0xMDQg<^6EFEM#m zW=Kp(nXptrp|2-L`4MiB+i=4^iy9{^?+kBqCU=CGr><74Qe0JBgQYB-j1pl`A5qLD zpY<%iXho%yi6xDul^h{Yb;`jQ2@~S=RLh#I*kssCwY(e1BRp5%$1kEZ2&Lz$U)j`}=g3Wyf zor^GsJFPj-dvj@4(P?zYH((}Rhj@0^@ox{j$)fDdQ^=3)fO2vHdi_hv^YkwhlqX@j zy^uebx1;*X`-6rh!0>p&bdC8M**q3JorG6kRbC6vrSFn|agp1J7u%cIEqt8bME=65 zsC?vJ_&!eTZNv9N4?}hEb$=Lqf;Y=#9GjKFwt-&)tyl!KE1cxDRmZf6n1p9cVKEOM`>4;yYs9)VvpL> z>?!tL_PtD{M%&le*V=E`Z^44RY42w5W4~>?W-DMTWIJX(Zk<97>w4=(Ya!kvvTViY zjdqN43}fDuY)`d!q+Z!x*t*+#+n!thw6?c)g!R?HYPZ^~_3RDoXHfr~cV2cDNB>h5 z4rd8hF&E@2oGI2gFT=SObFwi!h8B(%j-LDk(BQo-@t5dtuF0~&p@eInOK2nzUZ0Axkxq~nkwKkcv^B?k`G_Mip-dI zF(2wk^}$!OAAL$>kvYgb9qXZ}78r6jJ>~eT24XMe@suP$IZw2!a8pLs+&STN#y)nKs zUPL?bD|@q#-S>{+7Q5<6!)?PgLn6$}Y+y-pqsn+m%(&qj7lk)5n$Im@EMUBAylwOv z1I9zfee}`}knFOC1^Na0Jo>!)AR2>W`eHn?B`E(K`l|3m%277@?alBan=o7YSC^<8 z!9M&^`$;=2vxaKLc{)yS(hFYI5vre|uVH|GkiNXGjIKDDaO*UyHQhBmH4`bJ>lIp! zcT_g?gCZ~ZC78o8*3_GzVn4%^5gG*H?NNs8b1VJTDe}c;G86AfRi!>C-lHvUr&x=I zHg7K97`!JqfcnHWoZnv%nz_O+_O90K z==r<_y=&Yn+__wNUCo?Ln7Wp7PIu10fg;^m-c`|6!&Tj7#>-`pbBObb2>niIyzEZkXoTFpl*_+{FRkzl(RUHHnH%bwl- z5NC{4T$&BocHyi|<7m z<4-QUuY`9d4%X2mw0jjI)kxt8g->wbwP&Xufp6V7`AGSB_TT)>`7f{+KgBuamh3uN zXK!)x8i+&jNqo#7%f$I~8g4?RITQZEDQz44+G^Sg+EUzC>G&IoT%6YIVrRG#4EP*X z;Q#u9ryk>~w{RYuPX*y6jMk6UU!jM+%Z}`ZnW1BzEBeY;;IB2}YQ)WrpC4Z#zHIzq z(^1n8xQhbsuB5NdM8~90=hXN`_Yr+wRr*vD_fQrXQ){?m@*7|3U+K&0%Avoxrg@4M zrZaP>nrQ!8QX=Q%HI;>#tJuGma#rq*-fx>?r{XesboIe-_K}M!lg9A&vrGTR$0!e; zQ)^)+j>priDIVeTWAie-4j1ETvjie&e&xy9@2PHfV zucDRSh%dI#EO(dpWP1Ew-dE9=u3#?wt1I$moU4T2^)1OYi66`)3%=}esBLqBFXo{J zqn8}RTwx%btoH1^3uQ}CXm5sZ`b8cOzmN^f~@IUJ<&!+hH09pD>CkNe8kmX+cg*?sNt%IN6o!oFUe8Shr6 z)~TS)|1j;{C1d}pAH$myEl z{M}i@S&i?t-nqoJ$aUL&$NkXr$Ww^*Y>Q`$XMlU4I}Z*WJ)FJ4)n+>vx)!>Md5U{9 zJ{4KAH~m-0rWCneWzaD+_crmqcE818XRTY{4<&tNd}?xFQi5qgkwf$cK8xog7b1hm zB{&v58B7ZN2s{ox4qgsl3HOWki@qlNL1fzX1!HR^u5~!HRbbQ3!{;P7ISf5n*AL_C zcMspa@AxT*9H__mQ%~XyAhhDk@o1|L2jnx3i1*3NnT{8cDyEEelXR8bzzap>)b;0t zF7&zLdTXF)pjbdAitt+t-~qRk>-8Pp4OY6_4~nn2KK`p{PJjIiyzCcf5XQ5ccZa8? zhK*ylA=cgYlCw-IxJ%BsY#=J^GCDqL#KU$+%H% zCWde9XDn(eY6=;n#_7gM#&X6gD1*uv^BId7KNwyb=Cb=AK<`+{SPJIzdSfqRU*l54 zBExO86lu(cbFm&hFx@t##F^u=#b=5CIj&h8Vprof!&bvWrry~=v4q}8Zj>1hm=2oO z#jTDT95*7aA6l-8aBF746Ke=>rlFy(p_rkxAsrljhkiGyuKih22kAfS|JJ`Syfr9I z64O1?1JiobTGL8a!mfr+^a)G!#X->T= zR-ILMi+S^F@bcf4QyCVTIORN6O$3uS;90N^zn6QANd5McgMlsWTfy!AvjN={tK z6YxVXEG;5^LUu}4vPm#8lcwO@P?F4|<*X4RpKc0$;vSSoUqW9)yMudzLxKZ>J-A;@ zfG7*1i*OJB51-*g#yrl@LzoeIL8PZyy6?T~C9KE0*0&DNhz7W#+5FuCT}k=u6u3yv z?HcaoDtJj1@#OcMc3*U-xqr9^c!r^{eFQ?D=K0(6-gDP;%d^|F&(jJ->a6>m+vc*k zy3zCI1B)(3|6ZH>tc9x?cW)QhPCTK+eI6n^e!6RlYZ)E$Ej0H#96KG=xdU}BwQIa< zlB+0vbysJ1=R(H<2N8{q*Y?+$_iY2bs4l@R$>YpR<#BFstat1|xAE5Y#8vXlQaxb80 z2%L5 z3YKNmJG6MDy%`d0J@qd|G&^n#<32VWh5H~HvZpJ@Mp zGcj5Fv$mnOpLSqoAAdx91pREb%=5le700&lNznmazVl#feSI8rINDs9gA3_Vh zCS}2UFX6M7il6-;yo7e3t80aq=2sFaJoKnL(S`P7jU0#T>?O2)_t2x&3pYULIV8-H zE<7PJ5!ca2_-R`4(sl6Gv&h!SMqYMANDkwBZo_@y8;Rg^qo*ThB8rGCq9!xwDM>G8 zJkfz>V>8J7nM>|a0ZAdrdXfeklL*w2dP^;mEW*pbGK{Y)(w}5`Wqt72T!cpO96q&X zv`Y0r9>&8>=t(!Aq$jwEMnYt`OePbsE8db>&{>IWMlmxe2M^)3;uWg@Wiapi;(*i= zN4@H}-<4KOR7_G-XTs4*)m_y_-2#+gwc5^X?h9Dn7rZk*3w$^VI^2oKH@FW7yi?~bX0%AD6N5q_%mFw zQ|JlG37;&Up)TZh^v8QNS2$a^1sNPy!=jlf5&%=)YoRDa^>+2_Km>3^}6r8@3POt+9mVKy_m0gHjrEXg-Srrl;r)- z`vR?3Vf-L>`gZ$fdS~E+SIN`V-PoPPx}&EN9_t>5vxm=p8Go)b-m~6~zKuAsO8q-P z;r4rXdsli^dn{lPW_P-Kyl0}Pj<=?_1beu|ANDQtuVAvUirHZ?{{`O_-&xj+Y&_Pj z{>`kG2~5GK_^a@^$Klb}KhP&2a(WX&38BW}Cb-|WB#k~-*cGzFD3I}+Y==AayYN0M~9JKkOL3z!ID9o+&h!Ps*}9L!&CT@cP6X8GV6Q+d_Z22D-l7FdJfOtBKRC1 z;SO7eFF$7UG8cZX0l1{c(dIlr(_9~~yMAcurs4Y?>aqGN`1F4;q04fv8KCK_8O=;-f@Tb; z;qRHe&%K%*u*I)2F-zp!(@y(^nS4L^WT%*{Po}PFnKI$MgBb%a5+>F!HJ_MT9l+b> zh3+km3j63v2EbOyrrV|6tJQPfnZS&_m8Q97DqeaqY8O~UP3HA`KoQ3BH8*S5YCA9| zoS>eFJKq#_V-U9N=&)MBuQl^XdQm^{Eb55^%47CyF&k$dI~O<;SjC*}6#nFmgN=i#kP3(MaijnkLmzQy{Mp~a??$WD z!Q0t8*E`4C1P_fCysu%PK|o+t-+8SJr~^}czxfU_xf@I~Xj>jEv*Y;NTwg5MH zOg*R8QFVN^eV3WR>%q+0dfI#5yZ?4Sp-Om45encGS4ON zIqz8ict0b9z{TJNyimTN2Db+Xga(H6c;Jm9aiJPH1(&&(?~q4(pDfIgFbKrToMXVa_XkckY5&D@#yI5DbFLiUpN%kPL4}6J?f|`6Y8s_*?!~J{XVw z)ACdD?qG#t?O6ghJaJ>GLUhx9UtP`_+*cU z1^pxRFKMY0Lv8TD|0UEsR1e-(nNX>a$d))2IvJ|Qv$&1Vc+a|+8CjdZ!dLphetD9!z89y_(x3?Y$mLi8?_Z8k zR-C0p?sg9Fw|U&hy~%kg#Cn^L-k>wOs>xIzsv7*_uDs_CnF-D0KjRQ`7*E+`^v*SK zv0uRIO1>Dih_^d2gDZ=6)5FP3q6o=1gQEyvgLK$AVunxxRozae3WMNB^;7j{EzYSL zr5vpkzF#$%1MPsvQ-UP*i<-0e>ONKLxr$~n!FUFue-TXLf&3m0ntSAf!1?RLqO1ak zBfC6@d^=jAcjO{tf+Q8WP8+GSlGC^!OqFawZ#|71rgxFo5gmsuaRyxwTS~gn@|Yr~ zjtz|tj@~D~GA*1IJ^+_aFq#c-wh1_*yD_`!dj=DqSkqG3OCnNy5%_9HsMn@`44{@dl_a@bJ5W3CevE zUk`6@?+(0pjrfxk_7p;M{ zX3aSlEEFyp&di5IhZBlMqGMyDNkg8*$z2hv3cqO}_ky@)H&7qI!$y+%AaYOl;7#ly zOVf;(-*~(hSCfM|TQW=Xgv=1EVPe9(r4)TaF7|hkJ9mn8N1QoCuP7&PVT^nfxq2hX z))*rdJ~#hJzDf21FKm{7;K|ly!Z(76*CnP(9Vy|PwFjqz;>^V^sLrX1t4rdnwL@JDZrLZ+qh9#r z_Mr}F_G_jysT#%Sn&H6;zp>)@JFLR<9RiN71bDpQ{jGpKo6O!@2hMjxu<<7NG=w;? ziQXWqHmf#2u3Vqs#o3uHz+TnuQ zjns@_E^bp7VY2oFo?tu^i{I%Wgztgy0u{)~-)Lf%YFBE<(?$5v+RbBKm8e6o&nr_E zn1WnZ)x;NY8WkrMg9)I{L=n3zkD9TP2)fe_5 zk()V^=d~H0tG#9Y(WqRJzLR{SvoA@`&*fNmN*0r3Vy5#+xHpmwRGhQU3evP5llR?^ zY>!o7+Lv)OA5GToTyiWY(ls2y1Ggt_FrGJej|P3A%&s;CuQ5 zk=r1AjpQK-A3dA|=A_V7*6X$S%wL16Co+Es*bUV~8`%W^m4W_2{*r;>I9b{P9Z7VU z8k`2Au?K|gA?^)lgZU|ePn^SxewcqaEWXnI{pe0Z@KNu2A9|PK_a5_00!`^-#s)_P zy9Rm&j`RODxNj%GvG0vv-(k-oPbK*2k2v%94Ft_O=?FiSVCZ{xk z`-oh7G0RDpCQ0YW7LsIZrqB117VwlELwyHo)O|M3#a9 zJh2fD(k*b^G^khO5Br2Xh+@n!9;2+2*ig@M`T|g~jiZH$aPw5B-p^iC9 zjza`i$t_M68uqVUuCk`sADtMD)3H)LtI!|SpFzW*D^ zeZ+8_D>o^$g#4|Aa3NCCB;{sCbytkC?gzN2gURHp0pGb5-fJ7d`(x6ObSfu-vS`nWtIDeSbNUc` ziSkSUqY8<#4}RGLsJ|3%6|+GUr@&pjj=s#uWZ(t0oiom1%^}TxJSc=lNa)Z`!3F3I zb7~d(qK(v9Gzh{!Y9J+eQ9CHX^9X=pR?$|~iahGDN}?8B#aYfX;@sAUHM$`A8_Tte zwP#^)E`v2t0v}|XJYC)vJZlWzb}8&E&EzfVB%rSROS^;C zpeuMPbUgGMXPCR;dvxZi@W9}(;9;`6&(hidfX{o&f5R^_RfkZ|;Jd~k{PzP>uyIDY zKwYH#?B4_F4AxRDe7|tNFY@k%<8I^Bzs0@Xy_1)h?$>UON8u43GJm=sa;B*7-s##7 zHd%sMf5>TKa_}>LzB65OU8h|qT~DbCu8ZK8V__=PaJ6=|0&z%n{po({UgBBgIp#Tz z0==qds{41h+%1LcP?(d=TlY85S5LAx#d{hwAv^s-F1$q3eTlw{^g{ywi06H~nX9yh zGvUS?e?Mzs#ZcwY`p~-2ZR#0iAkSkf)suX*M1k{y&8+6$sm!|EBJvBat$#;0L^nqB zkxMG(U1!k`Ye~r}4$AYK-0w6n%tG)4a`PfG67PXrx}+{?Vfxoe%#a`R?;A|6`mhoS z{e+D3%q;HPDA|5-((H5#+rSozkQ`Ps^PIYfS;a(FrNOK{Tk#Wl$29DL>^=xoa~Pk8 zWV7Msm=xJT9;#)|uKxo261?_#s=2H{JIFqQLkM=2TbUDYgCa~HTGK`R3RX4|hoZ1D zO_hvKL;?=Lm(;IVceXJ1NQ8@1URfR$Sy;JMwHYU|@hYKlt&R4)FFvOQV4*&TbM#U5 zjxMC6sv5KN<77bmrFgCA&BW|Fef2KBP6>DnpP77wS#Y|;N*~K=nF9^pd`>hIxyI%2 zjU#CIR)Gd|q^5)732t*&di7&qD(&I_C>PL=625W5{eBfFz z*YC*WbSE0Szj^$_>Djx`?HA*ozfASUhiWN&VxgNiE6jLfm=(o%WZ8KfBBT8&{rh;l zMQ_o+k0E#C4_NiT;Zb#*Q)Mo)MT8bU$eMc}PgwEUlc;-W8h;1VNua8OEq10{ayJ~G zUbz1j!dZDzW>2_+G_5Ik>*wV8c?kDeeBMhipdS0ftWS{-y@K?- z5}c-TkzjY5N|Gew;CCEH+$Qk+563KAn@yOp8}Kj{d8IjGxtZ4X;F>kV{x1S{dm3c- zS)>%RO2RZEB_pLHdGVMzMJ8Kya%%HM3P$$exmXrfQn7G}aC>~(N`XMG#jD|U=w0YH zu#Dx*HLnCN1(q_!GX!

+BBsLU}?-!Bh~BM!`XWfq@DBiT;JY1-^scL*DEZ#1WJ} zC%k`vU1a!E{Y&wB7{Qt|!9U4g+E>DdIk#s4^S`^E2jCA|y=z!&M*GM3g?Z)tz(Tr& zdx2+U;;iEHN(agW?!kRrKqA!)|L^__{)_%!T=*@K z^hgD~pWlGJ-z6I~83xxO@+LphK@Oq5@^66wkLLNBL-tp1`9N4gTUgaQfDhVa`QX&4 zV9YgvwI}@gOsHt`QUdofQGM`8c*g|sEN9sK$^zhB`BcKMuo2qPKAIkI@_$zs1}Tdw zq{>TtR32qvy5U{8u5D620yhxXTuZLAO*ql?!XMWTHj<=B0eNhsXv*$Vg7i1c38h6P z1tr&EL+Ze}p5bRbTso4j=~w9t$?xRTwusdw`DiP=sm@^49bmc$U-{ROxBToC$oK0- zN2bTuq+MhV`okb9QYG+C42aJ(L_w%*+?-$=R(~xL7znoB@CO z7t&aBGZ*g|t`Vvps>n=yM_^0fCeP{C;HKaMIB%!%$NmGH&CO}|D%X=0{5wZ58~B-y zo>?C5748$Z(WA5ksgUA~)HKv6be6=Ij8HPCV{fKU(rKKJgx(@ZF4za~iB9;i{9qzd zlsv;&L>?76@Q?9+7nz8Q;BB>p6S@)(y~uj)DeW$;MaK12DubTT%Xuyi9XXcZ-;0t%K)XP?MitB+APDTD27Qh2Twzd=%le zDYCsPP@nOp7Mi7eTvuYo`ifav7iKJP@lY?p_4*5*X3L~2q*cg-txSSl9cfkRzhq{X z(e!#6zTc#6l{5A^Vl+<&_3d+K^Z z?ufg9JD)qhtDx&T3ZQCq9nIa%-Mu_LJqB-_cY=3}_p0}%x16su?BdfGx8RR6-f9m}3yG*e$xA6!+& zS6P4;a)5q11zlQIx`eH;i5Ic!+Bp#kUhqwLjej%!D9y~aKQp=F?9OYMZKg4MUqFAe zi0t40WJ$6SWKcfA!8?%|$r;?(1eTVE9W{e}@(CLI^X!YM_)rc7XQ@gze4i|UD=?Lv zuV_dv$W@3zX zPXBj7nN2vbZJ_{laF5O^|4s(LF4-Pd@M*I8%oaYA?f46o#&sWpE4qU7NDXq4cFP3I zXd8TkHt-Du!z3%acyao;GGr))+0E}rmy^FdiJAtZ@Hl&gTBgBudZVlWnFhmoq%Gxb zAcjSz@*6`i{~mJrZ*aX)x}6(Y>f2HZUIz!Kkbj*+h>%5WkMzto{R-R5xPRNoNn38=4dHb7ox-TnxIA zH~0fi(2c;Yz&7%Dh6hH0jMQd=VhDUB7jF=##~;4?pcGo)GO{fvd&hg%!LQonUGHt^ zZS39c*#**>$MeITlzDzBg)dh=PfpJr)}`U_m`b?IxN|cjQM*;{7v$(ogNIShRo+#S znnKxJc2_riI~Gw(s5R6rDi>d4sAo8*n4_M5;6&E-*7N=e-trrGtkfU%4e}56pP+IE za?;VPgvz3#b85ipY*{j;abZ`VS!sz3)cv_9)R^1kCp%{>`&r%$EZExWUexmtGy1>l_`kF{kbO6xgt)1ZqI{Z(-i*0UCw?YU+NnA^4_4WaWGV@ ztnIn+lAWiVs}vrkyLit1Xf=%_gnk1V-p+G8QZ)=`>B;OTdwDj$!?;ai_c;UdTTyiq zoO>u=YaIC53;aFBy3-7nwhA`PCbXnwSd*-Dtch^utju=R%zKOA&DVfxNxz(n6Kw)h z_m-3d?hMf(b0FOg370((O}Cigp;%!Fkj*8KIdF|47($u(<5A7dfmb24jj z4$j?a5;GI2&oH{LfS`?%7-0=Oq90sDmElaa5boC_m@gH%HY6}y%5pjy$@(-UGAUAv z5*Ui`ygCm?R+D;)MnmAO4JZiknSKYG0viL}1Kk33S%m~HTL}Gv9_JD>df~fpA7_w_ zTh3p~FL)OlIpZwwE%691_sU%-= zChqf??8B?nBl41juDOrDm;W-H3IJNzv#^2wj8tL%;*GkaXJhAMLX)~kvX~RtFP?7G&>0yxt4{-a-L2Tp4!D~0{3^v- zR;U9Y80m^;%KCKV7nCuO4BzgoTWo^EK@0Xt)?3)#-yZ1 zrq=d5A8{6TxTyc|$ta-83qvEX>N#GXE!pp0()Dkp#C4{n&zcQmL*(^lu&>@w-a+}? zRrwA6=R9fUx&)~Xtib@10ug@AWRW^mM zI0?+Dkt_mYl>v8KNp^U9I-OIpGcp}mbWgZ3%gHd^0Fp6?%1eEaeIVKUt*jvGvAuMp z1^798lf~N>)?N-YVh+~wc%H*yU_tLdj|ykr-*uFAl?}mbs%PrU=JH#;hhLfr&3J3} zkEyIDLbE=cwWR^>r}>!Fs>o|H^6V9$D{ai4(FZTF8LH{*J@erF&EO+P@t)o)!QrmP zbDN9VZV=qb4&N?BX1PQqSAFB!*ht?he6qi@f?Oa=axGVr(Cb9dtQ`lPnZa*dRb>)RESf{)et}B_;Uuc_n!ypE*&A_4qWp>lnQY%1sm^og&rY zJlezd@MJuBe}w)E^$GP3rGuu=C5bI7_tRxClqpnya?8pGDg~0r+7`Z;&zP8eSy+yolnB&fezajjB65LnZBdGH5w`FdL`=0B8Ya*Dc#$|9F z#j~(26^E8P)$uQi=%@H3UByB4m}58o_ABrvoJUP@Ov9gWx?{X!qGPOMH0;m8j>){e z2d|SKj&F`)@V`4d+dHSAPC4Z~;Y1z@6MPoT)pS=KcRgIQN4bwsdXItRwSAsy@KkPi zuY2?Q@-ib@>nrXr>i?VkiMfGUnRBW#!Ll%J`{E{kJ@_jp`WPT&0zA22QPJFs+==7> zS^X9NlUZ~-*V*-y;NHVx!(rS#Cy%ly31`#5FrG-NGxa$@>GA#S&JHJLyQ%DJwZYR@ zG84QF8t0ZfSf^&2daO>`@EI3$B`q)btFBBS#N zbAjj7dsraf@b^j5q;uw$lU7lYB*7slP4?hm`4+cr3(h8PnB3oBVSVK9e_@7(m>Fnv z|7rizE}~?7-UiJ&O*b%|zIgEnPO6x*F2^^wKAO*)Fi2{n3poca)PVYkU&A_T7&~Zp zda_@+Q%WjJD_^j(bfR8?GLFJIq7MCB4rbK~xfH*i=QviclGT&dm4)z@ej|O&RePVw z^9|{Fyrb7i*WjKyNLrSx4>#$bugRqsJ;Q!9CY%3PoA`Sf>vd0?siDzf(R$!*M)Y=x_^#g~6XF~@$zA#+4_SPb!QKYYD~+K9hiEV#znIUv zh_=N|4rz8Uooe(;tvE|B;A}0j{WR?C)g%?rT-M^Hl0@W%_2qoMgq>(7KH4Jt`>^B) zjN=5ZqvxDTzTrsr8qUTUuB_>xL7h>{)WwOX0iW3jr-c^um(6)kJ-%)g_^pLu9%h#q zD9HKnbVVm&Vhf8gl}iODlODY+^MmT-Yy2!}$^^3y&eLP5 zF+8@ul6I0`VJ&v0D;Y~V+*}w5b9fGV!Z5AHcPk>P$j{S?^`@PqBcI=p@1I8!jCo_} z@NSd%uAix!;CtKfSep@>6C2N*bTH4A&;yk~zvkn&b(b0Sx#-F00ea%2yk3n)Xbiov z@V_=tDQMhYf(_r`Ik<@G;v~<*Y5L_;{C$dl9g7@~Y>8~5ADRxgxOpUNBu6AUoD6Pv z7x(SU;j{G30uwyPTL;63=#H0#2UB$^J@o~oWiWaIdMH83Ly|Jj25aFSO3=7PJZ(#a0i=l_S($d z6qai17s1O%beeQ1?&5h+$XWt4WjCE;;KMzURhO1CH(*5QI%(a3f$xDca9P|sEbqr zb&|JtDz`JynF!)jN9m+j-=^5X?%o{?q6ia@yqprV;CPS|wv~(3_6gm=Jb5EfQ!Om+ zzv&H5(>-ja=Fz{*1lbryXD;x?pWuCcVZw0=9iQN4^kHUS10Ak}DcLjb##4B`?v)&r zoP$Sok9x{|`hdK|G9b598${ae&i_K&B0rwe?CZLA9O_`lyN(W~x|Y-e4(B)KcO!$;m`mAK6JJ(;;a z++eczmGvSh@k?^z6@RVS?@FK9gJ8cRH#t$CrnaNi zUk1J;JYL($+tYnkq1!10+9)zv6!0R_WRJk(wv%-_RyL03tOZwe8Ce$aE*IDLBYe+S zgAq4pZUrTV-_k9-E*9|&^yay!#`^S=#1nI}XTOT=!E=8&J4Z=or9bd&-G*kNXS8=T z2bqq-+iWYVN*hkhA`@(9cz?JPTyK5Y6#g^xIJAhW!u<9ld0q?Xo5cNWr;E4(=XM42 zr@mCxKsE3lW#BLW8~--^(>wXQ_)UJJ|E2GxZznnLbEr}9QHH^a?*)IpFC3QkzHXeg zy3%D0f@wRNbJ#K%bL)Kv;l7;Wv~(HX>rLj#PpGfH?_j@fpV1$O+9eO}vX%TbV6M0E zw5NPmn|5g7rT(Z*r<(N(NXZ|Iys4Ic%uz6ktzQF4B1zdrg!JkO&X&GD=TnRtt zK~TaZqXy^5F`-dR=}&?nq%t!pf_kts9pfYz$Lm-{kA$z&9X$biNQ5V3#D}IOtFO>6 zIjK6)x|uuUVt7Y_1M(-D5H&k+9Tb|2(S$yRYnzAXVlX`Uz3lVPzz05a1)I?<1X;84 zp<{1A^i@SU_Zj*y}Z)2GOoHY?m^(|1>1nDI@k=vjWFPNW+6UhhISTA|cHCD~j z(mn9AR??%)XI4IwS}a|{qu2t5dI~1irOdTrA6{o$(d@6`Wjh$qI{seI>m`}Bl(*KR zJl#vbbDr;)klFiOr1uftJo~84naI(mOitJd?$Uc?Gye-#7L!UqbMtV8i-}n&Fy=f= z?ZrNdPJOR!L=P^c%h0Y=G#&?DGS-cX5f*>I0= zm+<`X0`AtMVZqUpfgiPG?zx{rG#L2>e~Q`E6^h7(sNi*Xpk`A?sAqJp!B{v}mHu)x zb&wwQE&aI!RzO9b!#*S*i0Ake*NMoSuy9?(u@<)m4Oq(D;0X*jDgKX@K@vKmUlM)B z5%>*BFpEl{i<$%*L*(|wp*!nN2JTks6K4!PXYM+bI6F_JyVwoBdkrszG;q8)e1Yq! z>%giXs@_V8tjQ=T(naCDx5Hs>IG$ANIKd>~ahO3B!8@w0_E+44$KoJ0AI9fO*i)Od zTXCS;iznM|&PxY)*#zfm9sf6rj~b8HMHjeM&Cu>w&{o2YvamLEsr zztjAMlI5o6DCebZ%s_W)w(@<~XL>95=PXqjf0r<>FSp415*hJb(4SN!qd-F?@pD|I z7E?lJ6W|1RmFK=xuyBR1U}OT9;DOgjcP9odgDJpZpXnXr~)P(iGCsX`8ufd zHjvygXz=RNb7!McA}Nvk)DC9v6TunVffNhh!0Z%uzD(BB!k?*6)Hi&R6Y00Vp(1}2 zeoUu&0LRs7;jWb6?o|m_4OfEmApWiquFgv>UaE3+RtT30m!!ijn)!AE_<$X8GMfPM zy$-J41$bj0De?Vs($klP#n&iOmq*eW{CWVm^<)@@3p2UYr@{DMgZ2p@Nr9<%q{P`w z_zj%rbnz+rISMH+R*b3_tIzqPGrxuLcoS@hCB&|w{{IiwVk|RPy*w*WUCvm)&_lP9 zw3T$@UZkKpOvKqqn%w#!~hc&r`f=K+w$RrtrN0wc`9R4~Ne_C+HoUaseAkpm(12|CLXr|N zy~3nLyl1jB{7`7Oa}wF+b;lkI{Gh+zF(8Eu*Iy$a-0d zEFmvA#_h;@Y8b!4W|5{a5DJ4SNBAv&=6rOTXKe%n>1TPlnKS=lgzt``3QY zRiF30`*Z*2|37D+efC~^?X}ik(?Q$(FYH|>ktwHQ_HjhvmP8UNmYtoIMRf8XS?kfe zEXn#lYYw{IkJ0eXK~7oBnavaikX0kQMz&&)x)Q}K`ZxsII2y`0HG2{fOf#Xq-)3*k z-j1JWF?LrC*?V1;GYnci3(CD3PmeOWrE**1i!lPL+yeaT(#gfs1^MkcY(NBETw1InJAkspp?rr{cnrJ9f2AM9emn`CZwKiA0l2}_$N(4M1HA#+?h$r6by6Cn z{DAcL03HWt7B(#0g)jAFe5pHANdA=nG`J}{$7*7G9%G;0Ip&5CL;NOo>n&mbR zd+!PON?iu_p=?0no(oqUhIQZ)aIFIR%I#p&+^mU2bl#62R-de%S#7e~Vc$57JU7L& ze#P3b02%ttBkvq}iT8WHNL0!+Y#lT3J^czV@&#BQzCQ9LR){Y`Z0K}8KS28aoU)Lz z?8pyCR%0hwd1Or}n~rQavY9py^FGlm{4JtXC`j?b!|RW+*?I>s}zPUrb;v8?tX zL*8Rx{9N8vxGgJ#RZ)l1jCFEN_Eli`U@RMNXKyCf?v$K*=n!tsc`s)=-fKH^>fpQ5 z1OBe}NUXN zSGVG|K9Zf{E9?@#NZW`f00b4^ffMmkY=H*8JJ>%Q&yUII5xz{{i2Wb~+t`Wd-7mrG z>n40iAI1jpGFpXC(QoUWdVBF{1ii52RmJ1;46?+vCHk}nmW(0fbbTh{1NQk}^G>o2 z-nR4jj^Rc?9B*I_AW2G6Zb`4c;V{3hQF zI{3jvdbLYGj`wVBNL!!wCRuSGAYVskY!UU?Z=@oX%ZBk0Me#fGWot*Nms*D`i=|V4 zXKy2Yfq2CjC`w=UJ}r2sPi-RVvI}#OcGr^$a3)>|&oEbg@qW8Jtda7C6$*2qN}I5^ zE<{`Q26{5ZbKH#|Wlt=&SD?Y{Sa4}5o$$fF5_|mByl<`tlwUc1Zw{po`p$s`L(y_R zj<@Cn_PP^@*H>)mI9huM8BlU{56We<);_d$32k@f3D+YT+>O@z5#stMpsAZqKNiAK z*AuULsGu~S^VN{h&qJo@K%aZ#NpvrHX&y!M`4n+x6VXadEqsMC70&fOp7kHG`(6bW z{!v(!_mf==pSvB)=QG5oeLz`CPItxV{SL*=We;C2^%yk6r;)GcqSWq4oWrqqJi&fy zI(w(j*tva=%(I%E$VPT4(%onWw}J1=*vTla=5vbnSucRwgHrE7Ho6uMGUXFGJ~f-Y z=KhcwXdl@g4yL5z>sk_9U^(JAiZg3jXwY^uZ>uRw=+|8M{v0&4|E0VKm!FK5W(-on zV4~`7Bu+>9S)`M_2>W7FN+Z@;O}O{*$X;yCQjVY--Nn1YcOY@-okP-%PCyE|4QZq~ zd74uS(+YpY@AED4DLl%|+{Ya2UH3PUN#r7Wj>N12!R1v1q~cos}yhxAO|!;}Xp+SA{acMn>|KI|5*!CS0V z@J%g6F8u@ewfu%R;~qQ-4zs67%S*wtpbApkDS0i~UtLH2`-x3{l{V+)&F6``*<+;R zty=?MhQ|3V$;scI>}0+2Z_2-i@_haaL1()RjqWad+*9fQ$ptkSQ+q~w54wVP*yZgg zsKq-tu0o&rXyF*}Wj2{PHWsq!0G_8J7hTD2@gd}>*+E}$8kU28yc1?7?`t|j>3~+~ z1$?OVp3i2yf9(;tlirCaZ;g&{t;Z<~iEd59zvNsrhgCx-mklE)A+ zUK|rk39`bJD_NTiALrm>sl3-$VY|5r@7ZgJN57hPV7DSpUGEB29o0R;Ug1aLJZ6@d zP89nP;yyZ&QL07>`8Ftb$P9F=PZS@IMe#N)jjf=86^m~nf5iLPh=)SkESJ*lH8`-y5N&!}bSy)@TV^OJCxR$J1FF^@z123E6m7H3TQt%Z#XDk-R%aG2i z=T{{M-F|igi}5;{gfxE#l76GSU0~Al>`*UZ2cDagjsAQQd+cY~UEfD^>9uIe&(EnG zWXXeA_ZMeB&u+SJ_RZOi(WIqi7i9gA^<&m6#84nG@&M&FNmv^ApP3neS5G z!lpTc7_=|(WLQlex!*F=ac-2&uqowoir!y30?pjyBNLDdKE!i;VUPx-kK2V8!yiZf z48BxV;Q!6Cn#1>dWxY)F$5v$9hS`nS;Sc4lM&D+a$JTl!^7B~y*5_h%+)ZRmb*v1R zVRcZB-S2ak=2m2_^~}2w+5Ep`cP`B9!rtfI{I~EV&L^MjzCdq){pbu+3B}LmOLe+W=1C7qdy@Fe2Q1X+myGEn_oqGelPrb7yIbD zoO?aU4daPLzo*!s;EPog9shQG0pEu+4v)5vWth_Dd$X8eme9%r>Ia%+3 zYCo0t1Tx@jXktGiQ|lt4-B#h-z6a``m#6o1)XhH`D%=E}&&AmOyRnlWnEw*H`;vPgJNp~nXq@c@4<-a&oDFt0+e(GVaOW(K=KED{w{xw?38R$>n zz@G6GyNm}YeNua)UF?$D7XK2(tz3qlu{V6-9yG`!nfb?q=Jp9RvJVGa$UyQr_C+(< z3%U2kpquQ9w01FCt;W2So*Z5H*Y3opVs*+oc)y~jzJ~iR2=>_-jCdM*{ii99U||@< z-n};x-Bs+{n^P*0Z*X_vPB_;m?9(5?v$_X6%8QVZ&L{iO1;J{44R-4;@VLv!OCZ1N zdX!_ydsv(}#QcIhiav7-4q_wy1Do;=-Yln_MwtbF7L=jh>4lBB_c9{x?g;+clgS$L zG1lD$?60=4Z{1Jicsfp$B~u7w;xmtY2Zsv(EIf?;qd4=}IOTLC(3^vueKY&B3izV6 zpxlH`ZzwZ332n4=)oam*XQ6ABPPsmwdgoF)Js;8}0t0kxC3k`szwUc76t6wX7xm(2$4 z4Dz4fif(TbaaF6}hb7^q=i`lVFPUcKo1phF~^murg1nK-=9XSH!I|; zonLBssqcBS%W~eBw47X6OURsPt6UqSxEGryGF!ajTsTD^%SA0$$tSIOSI{h?FI3wa0A*(J{)vbEjtmvi5b}Ay7E54UEut9Ft;wd2<49JmC`5pKg=xr5WRTMkXLvkJA+B^ z<0~m8iHMO-{7(D>YqIvY<4gJ))|!Eo3!y(Hh_+mlyE=Cw}TP`{j(e5J9r2k&U}0ZpUrwM=b zCdX$ErgYEjM&`wfGtbOCBeNl;DWwCMmHTG)&K!={;Y)Z(>)lMccX{RynOi71nR%I2 z@GNW$SMPYF9oDn%M+Ra$8v>V}M$E)q_VQW8NHjtNp!lzkh&ex!m6LU0_65XnjYMnp zO*RR=$;#XwTi(OKVlEc>z3}2%xm|NR=RSxIX%^*IN@XbV6?vV>95*)adt~Zk^2@-H zuMB$9ZTZ{qp{;6`DbW`wxSd6bwUSSqGrE{Pd1JM9}N)G-E zV#cqAmc5ZmGOg5$(%KLqFdnb4TRL#(J*7V8Wrd?5Hi&xU&{ z?;NQ!i@noX9nz~e`u?YW!Mot<$zcJrqbFMK@KUgf@9gZ1`9a*#|!Gd-AihwI6c z)-?S*B9uy}ug7Qb^|WarpG7O)-&GYaz-;J&Rq@<6So6&gY z-w?FU#n2uJ->2oimU};?BeLhIWRsB}$Dy1fXjZo7{D{VIA@3BLMb4mUl;?;MdWe|v z`_ORq#qYf*wx8=+7d`pBgPvty~h3G}@kT&!UEJkn9#>||L!JzMQ7U!%* z4|xDTk+j@mc#c%bJu|m4QAlmj`ETPJ z^A-MT%g8LXHvi{*wG6P-di6I)O-{Dscr^K6Rtxb@kW)uo81NH*w%-ns{p=N)(s z$#-dR@M5?RN$XxDhFd7NL&3{->+v4CjMiGxLQQOcrNcYjHX)C#L{IPoWevyG zd~SxbZRLLtvdACwiC4CvImspCc>&xli*pC@dfdc1`xZ^gOjg_k_K@T7JQ_}R&B18Q zAHWZ382oZ9yYA=FN4!e}>(^-iH`7K6T)Pq)$_7{<8!@K3cyXLaZ&0IB3Ngl3WG7#P zK3>2WuY}v*OL>CwF=Z76cem8~lz&rhOT8Uw^Wh+QJOvH^50b}7eh&>+0Ll z?v+B`|5U&}_?QqwSQc(rlAUiU_P^=;rcas?0v_Vc#_Oj{Y$i_2ldEDlg9hq4$#w;#ed>`44>oC{~BIJ zBgksd3$LN(_|#S-M(6;UF_r`x*P9(jU3M4Sh&O$eox}CyQ&M9q{1BuYlCOAQ{B;_EAN#*L&_6u*4OKKRJvTM)Ctb6;;X{87-@5Sq!mJi(r0c+` zQ?fR~t!Lp+B7gt8j@*miNjLI3UrwH;wqc*!gEK?n;gjIy->}Ek9=l9d2_g*}qR(#0 z6K>{N!`PF*Oy0yf*mTy0+_NZZgC71gq=k#JTV?mAJWho4!tAfJ^Ro-GFClNzc*;gf zeW>xB(8Af2z37_i=hcP3UWv{6K`7jN1iZJolC@yERt4ddHr*LGpcs|**p1kGYUB=j+OQ@s>)cCy_`pO-~B1>J0K zb^!0Qo5*0#(T)A^basyi$A`?Fi_ zhTi7Fj9TDpiHr>7!aZa%_z@5Nd9?B_*em`!3V*x-Xs#~hsrB%z$|oXr194Kb(w|I! zCjEAD(qBxhbq)O9l^0SmhW8Vz*D9?w`=_+DrR>6&yFoJ_2L<{d%D(NQzw&R`2A|$a4EN7D>-gUcXI%%^UYoOuyggr0K7#8`fESN| zbN7N%ccolHxq{q7HzL*EPkDm!IvGelr0zoE@z+xJqjM>REO0udJ*5}r-rPaRd_(c@ z8jHT_>D;Nv4qvb?*HDyKrZVsIX+gwI4`KkvBWuiL_q`iFd|ZA7xbXSBap6j|oxQQJ z-kjf^Ro@M*YzOpWZLzmDCtjy989nMj2dYvkVz)V-Qk~L-^PPxtAHpvERVc++ZVJ8KFP|bG6p^TSfrpQ(c3>wd6}YkvaiWaw25_qvjCR0hG^@q!-DxZUccWk zqj`n$MeNHCVl4XVDa`uoSgK#cV*Naxh0muv$=Ro|ML)-Wa2k8u&+#1iIqATi%3fFRg&+~ zNq8ciN1dzD$qc}IZye=iJo!E#&(VA$VSgky)<(+iklpk*VmG&AW!cF2@431FedTBT z&%^s~G1jLo@Wms@$2GwH)_9!X8DjHR<4ahac&w)6#^{besA6+>6MQ2Z%u#U3@HFvy(!szz6X0xA41t znMi?0;OxrRb_wydvWn&5Q?fi`1y;0o$?`J_uGohREFH15oe^wqq{U&^u#zaC*@}_7><3^ujoc)6gdDQkk7g40v=+bFudx2T1AUx;hJ85xbjpQzKBYV!nEy-N z1IJvBBr_Aq{xxhgkK?y@PsoQ=9}A9rXjejaXJ9vZA!P!3lZTNChd`ePfR#7kZ*dvE zv!^3z9Yfx;O-N?%;@i+4J;&+TiFfdJj#+5m2BWLG0`IRzWPUgXKh0n92%o`P8^D^X zng2cci~j@nklrjOHzjXz?pJt3y}+vOncD=9O;n=zFZ@9EomY4R;lMy2PS0tSQzhpF zY{|v2CddgOGc_B})ukI9*g*VlB)BK$Nr=lsgvA|KzcdQi-Z7-8Ss zk?d6^KP<>yn7bd2S_?}~cf7zRQ#RtKQ;(feFZk#Oc+Kx2m&keeJ=}%fZx%MaP2`s^ zgYM~6;C(3?s{Z)uKSK^V?ZNVh6*v#6_nwry0uSAazNlR4aoFTqhFEIp;HKj(DZj;^ z(b4^e{aAj8HSor~kTriJei9FXF%wzw^1Yr*S%mk}TK2d*@aZii1Df>DZCT9&;AqNa z{0W}No6>(KYi165=o84Hc^cV6S|jUT#tQ2RN4%BQJq%07D7fz9#hxTicO1V)uqFpl zZbxI?E3EQf*q{5b>U(3^y%COm6&~)bXssTUqHM7}MEx%yi>7?5`cfJrY3IHS#;(O51(oB0w&@xE82c0y}-R%&H5ha?ok6Z;o-vU8!U&$7qq z$9}dYQ5j`Zvj;_cWz{}Q-{V;ugABsrRxVEI}#qLilW!Oo&R?>zioKEQwXRq}T}$0`_yRbd!> zttYFYE#-vVO1WFXq4)8bxtl$${0bYg7EYx!1P@!G3F=N64DWmvOU--ia6d){{Q~{S z9Hi0z!bxZ5%m_J&-{IQZ?0?@49t-dD>m7E)Z<6h6GM*Zf@Kl_@)weQF(UmjakPx<=&V( zp4>klAvek&A`{Mh0#VOR(4$|+-gyXqOjE%5xs)ICR^XquEpIP5Uyk4-S_&V?%E%|@ zz;CaHTaTnDhhZ8T{Y&wgmbze%SlL@ zZxqhOhP#5Ym$>K>&@RRJ^njvGWcHWx-pvg5glAH^VZ9!P5B`L(-XRrRe>2lmV3ClxK-Fl%L^ziekAkDHX6IHsGE0ii2-SjF)0iPbDT= z#?S-gURXwy^nBv5XYp>i5AkOD0?-x{-W}+0f1~WBY^Q7`T6G0n=UZybruMXq zx5)Z1j);*#>_)q1w5Bx0PSk*YDsHSH|I&w^O;MlE$2&tYn3uvS+ruZXCC0xq9J4FA zN851jUl|uLx`s&0r(!*-LME-Mc#f99j+9&MS8{;NEA|EPxRap^gIMR+5QBXod%ya{ zDxk4aY{E|bv%W#k`VJX;Wf$&Eo{tOJRae1wlt~8GMMxKKu5+Tu3xgl7AS77tH5E=PY_O`X~!j>JgHuvjyb2MD- zX!{cGX@`f`Ih?7(RkfR&n@48-y+l6!Mh2y=_#OP7`#-)DdX9GNPgZ#r*Y|U6C+mJg z?lP>T3xjv}qTChiCw`-L8EBw9O|PdPk3bt=!$S5sbYK}8+h5R_DL%Xm8KN8E1K0!U z{Au=--vgrzbmuMbe;vTvD4r+J-dsFmH?XtB&6X(q2H0?}$3FNhzAHZ#mS;}dQzXN@ z4M+R|&z@hgupU5%nW^__`LcnUhv2o9(XCz# zu08`Z|evp3z_Z!``q7FjIvn!HJ_#|a2Mf%HEh!Gf#_l*3Y zYQsCXAtTPDjL(0Z+!y!oe+Say?bt{L^6gf%GPki$yOtHvh23jQu;LunMs+ZxT>d_6 zso#M)ui)V_1W%a`_>eXLTT{sWwIz28(&d+AntB!9I+}gsVDix2l{*}6CQde+JYdVg z$pe&p@H!tw+)26b5Rv#5c>OcH?FiYn ztFhM3MW($5-gXC8oKsMd#@U^;>2E0Y1A*C_-1jN@aVCUB^?E7v*@AD{S8hm&O`31HU zLs>vJfHJ&+t2B8a^2rLYi?d6}O)`@*k(dbOw0a2seJ56%JIQ7#zlt8@=o4Smd%aq~ z8PDMTGWD?jR6rWgu2nqo5cZtSaK`oYRK6PWu=o$b+$51^0gjyCEHJnmA-FS!A4u8)zKCI)-@UF-?3!7|Vi z@Aq01wq$7k*98B;$I<8C3Fce}t!Rsv3K4N&CIe z0b5@rW?%pkUpJzJ+o7pxjz0EOv^Ev<52L4A%1WQa%DIJ{JK|B5(DUS=@8JdSa2rLz z?O^5Z#0t0>Yt0%~=QklvcLFO``r6@?`=J33a(oaPFrM}N6ms`VVTHdGj*sO&fnMp6 zpkwMoCT+#+bft9RzXy3B`%`46dW14E_dm2WEa-uIqZhlLqWGl;$Y(eK`|T&tmmlGJ zqC?8Zy@!78ga0AolHaW&T)8p3g6oik2SdGHBQol1xc&aTsz|>bkpLcIFENvM*!_Zy zC=IEhHrZoaQF=jDpTpy234Vyj0@V)4z>i@?`HZribt+rP*;sn6LrQr8+s7gzAyN?1 z&mc3O;=2Zs!CV~eO?bk5q@`b&|2$+T+5Z}oC#^NnDqY|tHz4QUi5}_mmstly%>d1em;m><6*xmyDOk1?5ohX;F3%rV4WwM-H&e=*P)?$pE3enh~kHt=H>!#ZxE~zcQxNMq#BFryR$( z(Trsv%!~W2U25ce2tqRH}%6~d-OG^^r+j(^{5+3k#VA8gdA^lI4m=6} z&xTmN+Ocx_!{vrU&0h%XW(t`78eH#nJa_c2^aZ>({Z}#qNtb#Sr5F6-X{;ObD9UAA z3Y};zcujqL4U{{l8a$^gJF(Jmp7I=PkTX_0x{KNGbzmRYk)pbNT0hCZO|#bBm1^i zrzL=-PzO*5~Z# z-sJr&|G}GUFgv>*L}6Y9?QPHdh+4qm&I`G~YQpI%g?uKZq0FVw^rtJ#oje*@aK7ze z-YO!PW{3PHk3+*pV=EX2MHq(NU=ZHqcT;*HrFBD2yBxc}{3tr`*#`SUTjh9zYMcxw zz!jumD{}K(iednV;az?MyQOyMo*Ggr!8P@!y(6rZz3iuc#{#mG|6f=^Yw$sw!+z^+ zqE5#le`?M3=j}`V$YgOX{OB6E(&g+hwP(~(`^HiYL2kks8gUX3X=NFW<GLdrN2p5#4oUOe1{k74t#QX#azh8a2B>m2j1%>6(7YS-Z*D4obe z%KfZ`E7AD3AnHqg`8A0_EysJCWpmtt|FQC0%%VI?w8wBtPxNG+D0*K+B}yjViL23Z zd`Xf1e;QFEPqF77g=cebG#>5Xh?<{+Gt}9;eJuCxnf$^_Fd#7Lxeu1K#dG~?w zH&ME>6YPKmtu-^>44!xfIXzD(sD{^i0a}usXhxO>8|E~0BQH@#QSPHCm+%GoEwIv6 z3AW6`#y^2jpelO5=`v*3uwBgNFGv_z)qPVV=??Dv%y=yRfAHW2-kg^YhJ zS&JH=^|}DL|7tvJ`cvdPr2HulhYUm`@D3XqzK=({ARFcv=*~8fM?kulQp8zRK?mQ6 zeMMX1g}Q}!p`jrc!wlBp7i2bA5Q(wST&_v7LA9D7Fbp--^B&m+=p89sUIDZBB*ImkW<6Hq!Yq9jjB4*$97 zC9$YgEmjR#vT?`}c`ZJ4eaXky2dklYYIiIWS0ID7Mgl#Pyuy_zN3eLTLe~5*Mf)xB zyt~<>_77Q6`m&~PB$mDl^q?(#uL-%a>*6z70}r7p`(u>lRBL9;Oc|Rc`enkB6Q+Vaw2PeA;{?!?M&?QKn z7op8;i${JZ;-{_-ahW$0OVyWe*HiCm_}gXFl|JA=cNA<3am`hb9nK_9?@}a-8-Tw2QU~JYaX0pjfqcI$d>g>| zyRmoNi?w42v-Bu2d=puxpTPsS6iOf6idnq}eV%+rzC@F~F=f482SH3-6|~=NSammr zeABOyLu4*lRuloSm$h~bn)EYSXIJxHVP#~QhOYfHc+Fbya~ttmImoaT&?+=UQWbBK z|4k1{H%dG3UAeWZp{ti&Bp=*9K-ovx4!4xQfcyfK^I5a3~_Yb%hL zmmnRAzkLzPoU}O{KMVTK55W3KA#cSHIG=nJ?&ALrvRdBH`nZpC%ENs(MY)G=CSR>` zDCu3Fo!QZLW>4FaaxVJO`pAnFu@fG{dN~ZY{2kl4YzIG57E)$Ihu$H($|Q>XyNBZk zdkf_Xa&?`~YSMc{H(^73537LQ1E)M}icu+nKmV_2%T|$@<9)pSr{JM^FLtRL(1n~2 zZ)|{{P6e!rC5a*^WUsiN*nwZs!F>Y`ypNB_V-&@5%2&J%r6IhqCToOOx%1wQ0@lVJ zR>!vRj)`AbAFC)UDPL1QrcA|;?MdEB^8isV%0H_-w6~*8luh}1^eR`tHQS*llt1d} z$cZ(uF;t-_KTs(O4vzUGj>Zm`#rvNR1$~4hN6C$=;iKY*iX)uO8c@Er_wXBfoAL%_ z3bD>p*{!)uh3mZ$_}(Yfo)7O_0#8-^%Qnh>@>>=s4zWCv>Z$m_H{u;S7t*IT^zPsE zvL_xogV_H*gH}k{H1j8G{rp-SS72#gvVdeH7&rtd2Bt z2J7h}Wb`ih%iaiQQ~u+T#Lc{bh43TFa{O17OTQF*{ga7+KbNBY|4qK7Dc>Ufv9WaagE316x4cuGkY zxeIURK9sJMHk5O*{GNjBQj@$^6^Ls-K4f4lhefzFzQZZR{vJVpwhbHJN^Hh+gYWTk zSn`x-;(ol7rPJ((*5?M|r}Zv|Zv6LP7jk{Ts_x;}^;}hsOC7uMtq0{g$`$MuJ3`gZ zrzrnreS9HL#A~k_)SwbrTA5>I=)wv7s=~Kp`CWnBm>KZh)WRGrh?&rd&Fmjn6Jh=p zJoN*t;8XFmAB%NmD6yXX*)w({N~{z5jtk+e%|q;G(}FYcAZf;bBfd3(7o7$-sts?d zS#Ug5B?Uf}MZU}(=$^J9MXrRhC{K&ZTDb3K&Wa-+#+N@83RD_9LV512Sx}w#0yW?n zr}LziNbha%`svE9Rq^b-=+Eszz8?vndxjhbuTef_-@6ova|a{IMB*&RC~LDk(nyTd2@VcqDDrtpriW4wbm_6!JqQ-jz`4Mk6`Sh`Wz4IlrjJQs3>J%juu zEA&J(Mw9ub?~{mde*ye|20MwO-5v@p+>IZ4FCyJ~@U*Mgoplax*twkNcf?lRp7n7N zG^KgaK`Ad+9ilPnrk=vittRWDTJUMn+9*XlJT6r!I7%UD|AC$JAa5nzhqd#M|9jla z_iWA_V3@Ok;g$j>mlu&i7#MF zJh&B0(hX~a^22GJ-4EW3fNMSq-+U51!UR^_%iz?Tly|Wm{x@*YkC00jLc&hTJkku^?*%u0VJ#%<% zpqHI^2X_blwJ&VN{GJajJ(uVo#TA_fbycpb>LJpmD!6bA)~2$-PLdij8Rrx6lZmzD zcR1-b_L3W+(yN0{#&_6GmJ+Qbf5oq%7+;}7nj8M-uy^?socj#g{sGwc9^M9T7QO~X zDrR;Heq1ky&q?9Ti*SLL;RDYG3GO-Q&5QgJr=Cdt3H&RQ$z=Z3!X(OM{uOEDTJjNj zoH8E1uJ?yN%I7Fn!f0ZS#-ZOG1EWIN zh$U8A`le^-4)yREdZ%%`PI(6l(nt6he#n^Tvd%t5zhX!zGWZ)j`6A10-Z*?$JVZl^?{66BlHgI5K1j+FoRq6F9nD5Q(bkGW%fZs4|198nnBND3 zXW)L|ya#CS3^L#^So=1CyUKC7hS^vVb_pwkFN|XCzX5;s4iMq-x1lTsx4)y-a-_$V z;Xciu;^9O;wHAKmUwLKxj9>Y#2=s0I?+F=a^m{jZ$6b8x;r};^-sR%*J4e;iFXg9E ztzERfnX(mJQ9t#+lHRSPzlso99{Q`8*2S#4h4fl9eLm9DTt4UXDLHBZ*r(6={4eDH zYl^-v=Kl-6`z~GoDy-hG`CJ-C|2-`)<#{XE@5<|HH9c6(_qB|CJ+xXPm6t?m& zsBh%y>WLx}*U+yOeABF~;rv=^Yz*@vSzplpJ(Rt8I_aC<=B_>(A7uC4%lFI>nV*ez zO#fPgX<*ece^I}3$VA7HySPHYeXRjuzScxt_+&%Yht{W7Nln&+@=3|IRGqb36FjYk z%&OzblvB8_oFH{sU3!0b9qv1oV{J+u&Ys9!wfL^1N)5h=2AstAsvN6O^jV32)zNje zs=k~SR!Sq*pH^a1*5ElI=WQ|U$hFd9RsCOy=+L@fl7T8u;4m}-Y_g35`E zMtO)Uhw)Ve!c`fYpj{yp<;>J~?d9}7Bb_~gQi*@Tq6)|Av{HrpYSUgdo+K(&jk9W5 zH7bVM6|fo|7xob1XUfc9Dnz;-%kD6PU**ZvugHgTA>Pz8UkV)1e{twb26=dJsOMV> zf}CPe3!yQ&U`rvNNBGz8BT$|+sE~eTgp5=2NG|bL%VilwdH&0VvB-{9j$i6a8IH$t zEF1c$ddJc43j9|LV^E$h<<2%9RA+>Oq%cu*_+%h(;$P!Gi7Totyg4EKR|w-*Mhvwe zs0c3wd)-s}ues1X32rBHe+}+e8&xTlDgGsh3#!J!YP6=e4QTd+lX`9y>Z(VoVfZVa zw<7ffd5yIkBUOB{@6_p6C0FQN zL69!wPm(8tGv0Ap^=ZLNJT0txVRtI{Em=-@&DIa;MDmHaiwfab{4NRJ6B^EnD8qjV zJ|%0HX0?>ztmr}MP)r%h@w zdC@G@)=^JU`{rBXdy*r?6D8Z78jkWt)h_f5_*xy#G~%e=%1&O7Gs+U6dzAS=`2y71f$#9?Wvm~Vy7%NSyFj<^UMOZ6}Uz*S30xk=Gh3DdUxY>qlS|8%F z5PF5u&=YZ2uMnNnpVo~&^TPTOr`1j=g%zi)5#kv+d^6|OIn`INVJ-&(BoEblxa&N7Prz_NehCZzUzq*Ryqp8xanyLk;ROBS{8B5D z8#H3|SuodrMMdA0K|}CYZzWxLR4H<_p|^sE{-{7*!9}p}7<4{AT+0u1No{3@RyAU^ zt<0t=JY7;s3cX5)r>4-KG-~SU@_^D6Q7`o(mFqed28yR^M`$^VRz>-=rxHEP4q5=w zy{y2SbHninpQ?E{oD&UIZTakon(Ao2Ey^qU`v-J*KWBB`6j@g!r61zXeQIC8 z?lxS>qf$%yt*0I0 zs-zs?!*o%rU9!D+w${Fmrn!3mmneX!qU(t2 ziS9X@O=-UQyXmLu$8VySqCKKJqNbuHW%yo#_9Z>*Ii+b^ZJ0jk4xQEWOF?UWH0|}C zMtu;?)!m}Vs;3g4qFso4AiC`*>Wup(iY`cKzoLDUo~&Jq$F7m-jM~&4dWLGN70WiI z15C{^G$v6)^O_Yc9TeD+$>zj&p3OZ`ko~JlVev6;+sJJkc-8^_=)I;WP@JM~ic zh{mWrjmf)rUyCEqi2Ve$DOjnOnh8-UwHI6PZ;e9F(I^ae^+~g=`^9TD@;H-%L~=&& zme3U))q;9u3aBTGhN)%EsOCjSwWvQmOW)K}^)SN4qZMom|EgweYo(==|4OPF3r zYl58CUxcJv^&L8=p6I9+)SLJuAN8qmYpklF>t16%#xq){e!g0>EJnppS9LUZ>Y-Pz zV5xDs7hc=yhkBsC#`uwdbWQvg7qc!bzg*9qlwMO(bLqLj_Qq` zEh%2lR&AZtpZK79Dhj5a`J1k(Cwh+RsC7L}b^Y6|3U+GUd{#BIgY^^C%M9+;oQp>4 zPrTJ__-T5o{-i~fR$kU*k4mk^XY0Fq9CsnQqL%b@KT$2XUA3susui_XfObuExDa}* z8tRLl;ri~6$KoewSD_wD{?4a$9W`RX!hLnm)mL8;zIy!D1`8tUgZgOLxP70Aus0l3 zGtN-bhG8a{2w!wG)Kw$Si29;_8p3|EYP-D%t7K%lQ%{Psry7Ew?oqq?9eZL-^EmxP zJym`1NFy#7^E^vhACj1~uaHJlP}UjGlAf#Q2&Tpgz?b1{xpWzszxfz-S@dC!jGhF(GK-k*kwqY28maS4v3p-#R)#iGt>+H@{GC1 z#xq0B^X+*T>@+KyWA)f~x&`&l&@`0Q2hYAB?E8*>s{1HBQ=5L8R*ZO=viNHpUWE}; zTu1fevy36`iCR$);z;z{ebo$U%WeN8`2)5%DHTaiXGLH=YH}ym2y_Q$t$qss*eWtxG zVl6+%BQRWj=h5eN{hy;!+mR0@V^nYBY{z?aJQ_+Kn`SPq)_BwvW23Ow>q|IiF0a+8 zzH4RajMs+cIX~5FAX#H^)fI(jg5?R;7?y&uXoY&CCwbLs4QYg48>;E?xTl6_q?Ybm zq->GO`fS7nuf?L!i8Gc!Dncxt(NUw1vmL37`zjpP8ue;-zmHx=5e|_)3LbGixy@u{ zsegii3KTmm0@ZX zI{6pGG-u|{l9GziA9E|spXXci9wFpjxQCGrs5SRdt0!6Uf}Vbf^X2~4ww~|0>X%zn z+wsq^`)4ajPmDJnhagduzQ=y5M}ns5Uz9xbw4_gZhVa1HXKoegyGEwx2m+?n;s~Bc zwUCT9LffM@M#m=`chnb+)PL^5(Olk8GxjAbOwZTMY1JA(RKu-B42dnrUU;4bb@ks^ z5obQ3l^RFVH;u>b=|;f>UToRJ=zEz%TH0Jh;%5f8PAIQn2gBS6nU#)Y3%WQXxus@JTc}N;vSK%3QpR& z=Y*sBr+V&@YWY`$k)bFkxy=Y=_bNFTSEBcg8nNLQ#~^4J!_=SHsvzVi#bcbeqetO; zd{_K_G(?KtC#=vM7*a+15uY1ZTEq?0X3cT}i8vyS(XHu;5rU?;o?l~-cTIwYK2|lrhe`q3Avej_!jY8t>KolQ7!V+t-Btr;FYAqSFo^9-k=X|uJmhe{7 z6ltrZb@VRj@3U2O9yG$ZK9Uwq75qC=vj_`gv85T0ND$X-CYT%Prtj6P#(sKrSq9Qm zlBatu#Mw0Fd-l|dp<${oDlJX6skPUR@ygsgP8ri8?b7&) zKGiGOSB<}J#rn>otqJ@6JK~{6VcbY?#;e7gLA~&5@w_J240-Q0Opy(Dw`bfou1DDV z*>MG`y<{!uIhsX5E1P2pj*=dP7p7#)50J6iVE2uxw(c#a-{?i6-JX*^_DJ9ojtJlWLFqu2bH|5(<_u{yz|_)R@7D#56)mNNt^;iGU&uyud*se3hRKI&@x z?xTJSGI3WQVeY$(FYcFWs(tN6t>csJOxFC8JVO>>jX{5gn2-7$`xB3GMH&{yHa$sC zP<^j7->REz-@-HFf?@5E`hHUh^)VTfW>MG_@6n8!qj>IgRWo2p;d;7X zts8>sbsTFV8<<1d9wV93);f(qnCWM#1-I{>t98R&@HQqHqVZW=K5AYJfA`s=b3cv! z8ntWa)AQ-iIRA!G#A09bbM-{^){=42)tj^xd*~H&H0Ab_llBcIKPk4LJ|!cHqj0Z% zUhBqEV$u)O72$8hinzK2wb)`jMmV}XQ*O<7lnx?QFho2e!ND`5t7=o9rrXI;cNn@w zVS6+^lm@{PlXOoJd(`jPzWNn$AnK)r#j24&OHc4UNiPH$?@S_JFmAY49*^PSRTQrZ zGP*+=Fg+>q7vHB58LsZJc!Tx7uB+avruu9c$NIv8NOiSZH9wxegbr#=MJ{643D)kV zTQon2)JahC>}ou^Gq#{-$NP?!y}VZ3u16E;L$b!*3$-k$=rhiV;Oy}g9hb)wSAmZj zpW3$s>Xo8ZGtto$f! z(~^uK95${Sj$WI3j{gj&WT%+4rz`5I;cL5vDXZqsYuI`w*!y@) z@KSW9=$Mb5H}|jT6Le=XYQrbW3+jiSpc=+0kITO`LZ255%@<!%oB zjK>;#yhroloq?o=gaRF1KN)AF4#sW4GE$S+zoO&S)Ai>$EDBvo)v}Yw`fCZv>(*nA zpAjMv2P}(6S{N}@{k9*3DVRB1l-F$8@Vr{~vV0WJ7loT?v0$P;dqnDg#FN;HpKN?E z#(92BffMM)nef~uv+ETQ`=P5vG1yPkS%*kJjr$ zdk)Wlctx_mFzh_u&)=h^Nd9vU4)v(p?;e(+HU=K{jFR7drjej;O3DS zHVGw&)UoLLQ+=%+%X7j?_rjQ|JM=q_$4Ae!@6y`PxQg-^)l#bw4=hV~mt~w&4T+W+-Q9#)-SIN$Bp24^dy^{VeMfe`iW`vOL5bTRSN6;2D6OJW1 z?G+&!ZhGZ8^IW(;y6$B5HC&CkM_=)b`-*vj>?6{v7xe{*SQz`Lqk7?<>bZuPkN^J> z`X0CFyL86=&{@rmJ`Fe3Q2QE*M_TlZ$C{jpYrwdw`HQ&g*@-h{%rFLP?0%l$tM5_2 zpw^7(qCnzAI^&j-kr#bRgs`8gr^Nfs3)RzPREI@5^7^gEqsZ%t9#T-!P*drcwvYbyY%$$xqS~)gxn(kC8?RW4#vQxYQrlPj)35h5q8a7_&s-wH}Rg9$}m_^)SwR zQEF=G*?R!@!B8^9qGTPZ^FQ14Skyyx;y>}9`Qc)N;8y5mAdL0kyaXGbdN?F zX|iNPYY3xMWXpXpaf^(!p5_k-Fo=ZMen2z<_KBXWGNP4yz4S8M9A z=Ojz(&`L{?bVF@12GEUUan>md1;JjyKWmd9E~8)6-=B4JXfk z@@%g);i@6e7ygd!y+)z=(Z673UJ!T8k}3znkJ>Y$)`WF&rTU{YhD|~%Q(!!O(y4cRcE>?>CfVOB!E7yCQB2 zMyhWtPN;`)O*k60#9mJtss3Hx5cbOUO!$eC&?7xkPc%x+gm>7|fm${#ikqqxN3R*x znB&@s-;X}3wjdnok6UvObVdErb4>5lqI>RnNVv1>s*i$6w6GSPMUO>i{Aav04E#LL zw%4t(L8I{1mF2RZL#;bdOXm7`m1Wy<#Yyr>oEzF)Q4n+C2=r*uAty~R6C~LQ92b)=+AZh zEsi*zj~JO?nqXnP)|2BL7*Ev?x1bS6`lp$Xl-;X6@}LA~ygCFaV~5tZY|4(8)Vx_5 zk7F?ORNwtqfBh}?%`3{-n6zv7djD?EBhyCLi_kQjM5E1{v^L}1M2NVjett4n8g~K# z%XG$gW2mlr^hH;UD6MHz97F79q75}=_u8dC9q4>H-Ww=_FaUTR5Lnca5arTTw znr-88(r3?@u{!q9<95p$mt;xLuV>FQ6QLuDldOuOv#mQ#DaBn9iBA~sy9IEK@96v0 zzRw!Ys&jOWh)<@5MMq^Eu(T7orRj~vkkEZS*?)SL=t*49!YloGhLh15v&;ug?-Ki} z<}9(zn97;Ux@|!v(yZ9d(MMsO#u?X`;bWTQ(R0Fy^oh54?5TPb;T)+~A`P2jB-$O-^yrK=QF=)@ ahHFGDFeNy8Jw?nlJup1frfEw`%KrgR)PX_( literal 0 HcmV?d00001 diff --git a/TekkenData/Sound/minus_14.wav b/TekkenData/Sound/minus_14.wav new file mode 100644 index 0000000000000000000000000000000000000000..6cea28b1835b10d34a07c2eb2e23fb52ddb7b47c GIT binary patch literal 258092 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 zer�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%0A%a=fmmWj4iZ7)fM~oFnWRC^nZvVaxul!h1AvH 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 literal 0 HcmV?d00001 diff --git a/TekkenData/Sound/minus_15.wav b/TekkenData/Sound/minus_15.wav new file mode 100644 index 0000000000000000000000000000000000000000..2c142e3e301df0a0a9748d17e0f8a29adb135066 GIT binary patch literal 217132 zcmaI71$qX#bU8p z9Mze}8la&9jvP2gYe_bZ zNVcO6_zT;kWL1AJ9EaVHB+6ie43f;?snIW06MB(8D3|fWK&((A3)+x(a2z$h%o%wC z<*PkF{y`6-1Wx~Gs1IX5`Ic}*oypUv1A{Fwf-u1T?D;c@Nv*SZEPOGe$LI8F3LUL~ab^4x&o9;F0t|%^Ck8Mkp8cL8&s(8>0j9 zLaAg2@)u*J#ABYyoK$%R`kTo6C{Ko{+PDN4u^7$r0c#XVs{SfMVcD}ye@ zDPBYC$O=Y+Wgzetw`aYVEKEVT$82p2xOoTR%nu zuaG^2ANd{U3}g>lN!~*)e(ZCUhzKLM8IR+Ua6tU<^RbuloFbBtr@RcJ;X@h{#&{L| z!0>_T$F!ojWY|Cw8M|myw25Mx^u}?iJ!zmGks^bc0SOBR6XrYiu?;}5i+@(7N@jD%doEJ;~}i5EQL zsMuQp`45k1v)U#?Pi>2O{DIjM+hae}k*pxj4D=sLB3@AzC(RHyO z>LbGkI;z(+82{u~)Q-lan8LoadZD!zF@feNX0F2cAUm-q6NQ+2P$n^&^rSq(Sc6B5 zGi;*;ZE3DU4Hw&T=W)s3fnVdF`Q()iJqmAu`RQbz*^Fp zascuMkz!UP1J^N>=l|Uvdw-mjNfLddKG=g|f^sgcmk|N-1hW=FTM0e7#>4_4fTIv2 z7$&3L#441J7!a<=B0574QNMw>AVOG=kw%sd^cC^*zvnzAYccYOIfytjIv&wltWkex zG>S)B7oe_$A|1&J^bN*@9N4J|D-%2tTPcbd-wj;Pp#_L0W;9tpnoNEnevy|+KSBUm zgXj$0|6n#md#RT4k2*@#(ZQ_DaMeVsKjIPbf{7D`XKGHXxyg8mK?$)@dz>_5GAm^P zw1X^0#9(0H2=RchCY%|JDOWQdVzLsAO8%ochGsDwn|hK|90`%^gCp)xa0QKcQr^ZD zC+*SHD*&_%8OX2@r6KdwT2c-9nb8B=;Dk`I_`1EU17C7&Ul>isHe%tRoK)^8%Tz*s{M zGF(Qz)!L92=nuk-Y(mM{3Z+s`pd+4RU#5;ctVSDk!;iWrB1d+SEYy*i8_{o6ix!fv zF(Xj~;1!GsWV?D*g0jh{6w8DGF$AR`hiUDLQHl7Fwv3Jg^}#FXEgF;J7r9Lq5OUZL z$HZ@SWDxe04H+zmUD%SDm+(k7(l?_6V?ScA?)AT-3cZ2$pl;gG7O_Ay(Ff!QVml*; zY^6*^R?wJeBeG2GU5aWP6Y+$ve!0Ydw2N7hFg#~)#TJAJ`GJ^3IfU{#`5UpqcBrSC zW0V7kYlJFcrH;sfJY#U8k%-5{e)J7WVb(#&0*Y1U$ixD1e_+g_#_EhgwqOm`VQ)l= z)<$SM%&2G^T}NzD25Ly`L>|%HhxSoCkvGW?#2@k`B8Ro~O%ibo zT)9x}V{5`#U8f$4&|vgd%OR8*Jt%82_>ty>$3VXl6Br%T$ANi=7>yDbTmGBX*pqA| z`^iS+3$7LM?vxfFgfWR0B2vgz^*ZQd#t%fF@jZ>rc_n@uC6k-gHZojPXJd+c#E?8o_EHQImj=c?#o|D%nSNMDxtnG|2#TH;7()xaGp_C*;?WD?8OmN7AbdNAWM zHc_@@G6ZSML^65>vkH?p8SN;tP%qSmG(@?~&XU1KJ(pk)26eR-#7Ra1qdmz~+e|#B z$fUmH8?u){3ftp&!~sH_dSVNlzepR3A8bwf6ZXt5fsj{gNbRUMu@6W1c>PRylrSNt z(ddMS8b3q@B@t5?>=-*y8=7TN26_~CEL^DVg`;-=`9Sud9O{exD5KNdMAo8x>ap-Q z@)DV$?uCdGerm?3{q!+Hw8O^8LmWSD^)W+97V3o9l1JEvk?*M%M`Ls+&yc4mS_nPtfgc=QEsL9aj%5P;{7y2nAwR?o}@@Y4e F_%(Ll*-u0L;z{S#2{gadVah+ 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�<~-Iy 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ℑ5}+?Hid&&J{%#g&WwiwGOt~*|UgVt3K9j9yruxl{8yWpryIIN1 za^I72Fyl%3gY=-Z(6sSs~mIis1qJ}BoYGv4EvcWL7DCuB~@Y|WaQIW3a`ZdtZ$d-eu;S$E3o zoEMrOk{?(QRPY5e*ca0OsWrW5=M~Q_9zhScuUVCfD;BGYG(|a_sWQc7iyzXRqb9LB zCK=xII6iP9Jx}^6%HuB%z_X>m=~g7qA~lPjsq3m&Gc&4_u7mEJ{(|0YFc}8vf7CbE zeXaXJ`-4{cZg$}P9A|#aK=AEr;_qZ;K*!S$r7>OLR5~qP+&AvV`F0~ zd!{yhJU{4P>-#b%m8o#XF06Hi^@iE(qas}~^Lb|KR~l9sh8c&^!F#i@74xg!8{Qid zSTl{Yj9pD#nB4xBPL7XF-!t#(oiUKE+}Dk-naA^n|9)V#VLp0u`o{WN0xZoejV(*f ztIZ*F#{7%#ahdIAe{)&daTS}6oBuE$u^zYjF?q70v!c_N->WiXvL|z>$JoZ&esTEtpw2oi4vn;*CGD9 z_^S!m5;`P(moz+iWb&KjSIJkCuO&}Qo|-(Gbtd_2a@CY7Dce(a@cETevsmrZJESW! z6`7&TUGK^~=1NS79YJ5elg!5JM{nKj`P=eM^lEEGudP_-qBNtg;fvyz#ZLOt-J|b7 zdvehUPec(8kv=lhYd2DE#^wLiniv=1AoEdRXcXt zcG?swD-&sgm?tF5)Ijco@@`q3YC9C!3_ z_H;%#A{`6t3+$C`m26{~gWTTQ*80@)uVu4&y*Y(`#Ce7sLq}sL<922?g)#rTj-{Su z5&bb|nC6(`j8R6J57F4vkZ#pqn}8#x2xEj%=J%X3o;BVv+%nYF*VW(F-qp6#w$lE= zeMtXB;JmJrwzKvoGaDRQo7PtspsPyH?F&qaRTv8OgPB)+#cIt&mvcAHG|_Z|8Ff*XM9XXIGpmk%>(Yqr!Z}bl%j=+|oRhK5kj%|8qWf zK5#s8Ot6o)Pqj_81zCfb@Y>h9&vMX`V2(Hc!1~wpuPKvf6l;iQ%0q2>oH`9dnXtT( z-gdtmw$SzTj3E!76krT6N>A$7y0^M9^n{Z*ZXNNI%*yUk+_m@vlZs_lldi~6)SX^{ zOPG^!Irmy_Np3;z=gd8=%gliPvR-H9re~)&PyHtKcGAtH)(Nc=6mgokVKIYZdPNV2 z{yAz$lqW(N*)6J`TAqikDJ1`hCh#b z8nrj>KwO`s-bu+R$tj7cNvTg#AEquzU7q?b^=;}yd`U=pNV+-GoH;jZZq^89BX7yu znit7DotDLIiqDsxDa|0mu>)n$A=IwIn{=dC;}GVJCFqlR??2+RZA>X_X*gj#ZhUNh zY949**?Qi3&RWQx{@T*i(!tWv(uw)>am+|q>{#Gf?p))1!@FAV+~REN{L%^Jbo|3= z$!cJ4V1HzNY@KD9VcBEeXP#`HWKLz>u-vo^u@1HlqF?+8W(FQ$B5%4W)ub`&%x}%F z&D$;8Eni`oy~a{w1A4W6q551UImHOnwkL=Nq^>HFT$1PyUNxPD5rF%-JP;0Rf z*8Ov^UwUaq>2dh(U1)!%!W%FGOVgK`z@O2t8ZuXNM14ffC7ZpdvlLzS@y;>Mb3W&N-ut}s+3K^+C)6j{C)zjGH_w&r^7kv_ zm*$)1>+o^<+;{xxc;k5M=-~66PoZzA??KmI*Dt@w(qSSnY0{a?QQR2 zU*=fhc+MP{!H%CCukHWY&)P5GKQio}IX-v1W)Z*qhZ1)ROHDo|37z=0lB*?oMFmAeLGv=}N9^g2jBOdN)H12RCvBz$UTMPF z_%rdAICET$n3^$-qZ&u`i0Bs4KJ5FjmZ42U&j()#{wla}@EKPBkbxl^LVgXY5mGB; zUGSRVEO!4=R_&l#LGgi!fd>Qk1r~iM{Sf~CLvTJmA>hxftngX6;z!xl!( zk2(@_H0Imbma)cIQ|v_6i1^|0TavaWO-`MdIxB5<+O5=Esf8&8DfTo++Q7^oG8g8~ z&%Mozr0if<0oA1}fuajQ| zze;|U`Nha-zxl5DuG+qJd>P#7>}cy~8^Mg+0zbZm4af z-AS+0y~cyaUrnn`iJaLabAq|Ht(Gm{QQ*k;DexKYJIwcr&s86jkI_fxqwzV-zF+OT z!uKmzGuJxTTGuq!R99J7IhTobn^nobvj4$={Q*Cg8C=F#Mqeh{Kh}S(-)g@Ju1T(E zzE6GEu!j4N@GbEv^l9kxrB5SgeXvu1$6fnPdu#i5_Wicqw$s?B9hPmD-^^Rh|C#N(r9wq~tQ-;_Qrd2+Hn-Vy(0^jFbsB3ef@32PFj`>6kT zC-hdRo+0ADu=F2wAA>@ILpB7j54Ht6f^P@k41O8%3VUBZlx9^S5rJWW`R@zgPk%q{ z{hbeYK71YgP4KnQtD%j<8i%cB?G4)#Ha~n(_}R!)k^5ry$8?YH9{)vR{lr;G^O91M z6J^wL+Q*ErjCa}ZvZpcYV|>BHf@}0{U0<}Js7!GgBG_lex!60}ta*S$im#a)R6}1w zU)fmIIMOu2^r!j0S!O)PI$|8_eK-5Qbp7KR>>B3!+PA6iYo9khp}rq||L1qduVz5) zfc^pf0(SfF@sIP1@q6a?-0vIzrvAyCfyjXH0Bu=K+0wF}vQ^7fDc81ayRvo4)G2cy zU~fQRKuCc6`y2oF{>NQMTwnWq>$BUj9gEb^afj0mXA6!9NCUu_U`tc*520p z=0D9=v(21mDqzBVw5f-wpGn2Al^|V+uDYhCW(yoA4UfqUhkBR5A4%o9w*Q2(FdjbXQO zhjFxNtZ9^alzFS=H_IdI6Kkd|%~sY?-Z9)c%z294f7|zt?_k$J*B;j)*9O;Wm)YfX zW%wldG;ua_F0jwD54H`lxvizvIMxp9cF%@N2KNr$6SOC&a!|#f`hkrCH@;u}e&^eR zZ~MRL`DXN+@o%oaz5KTG`_AtT1YMioZ+buH-Q0HsWbgFv_3s-8ei=A1cwF%1kZU2P zPECzeevll)oA=PBw`RciaR4r#+OhGtaG zuA2QJ_g(HEOr4)pFuveJK?w77{fl0gd?-1D7NwQCgZi5Gg7%8;rY=$!PMldq-@(wq zu-vrVG?CecWgV3q7oBIExz0l8V&_6;Ip(`{TXiq!Q!2Gn$!KN1p>|wFr=RI8BddU{O)N-9<_JjM?KGLTj?^C4qgTP6 z(!HhH5^c$oq9;Y=SXG%y9#r(9D7-kb_+`oSl8L30>FO6p?e#2oJ6JI3T~n1jhs?tH zhRi`ZaKX?8Lc!c~@maaTP&Twa#bEVG;pOZePd|F}$1~~gU>tYGAY^gRqv5>{4vsvvv_DhZnjzH%J zXA!8sE^7d`y)0|0W18cjW51)KqlzQS7HRw4y48Bza+2p%%W}kg%zVRi)wII625w-L z!NL69H1O*-X53uXUDExc9jW!#l+jdBms1a+v)6C1WJ6K!ip`KY-&w^u#l47ij~ARQ zxR7@)@7tW#IlJImY|KRsOZk|B^dxy<;=;tf34Ic##7~dk8n-E~Yi!ThZP8nzS4OUh z+#bFy+#F^OvwSpvoEthXG&3Y4q)bTJkl>)8pyPoj0&50V58N2IIdE>!oFHegJvcZh zoD&idv^;QaU`${{;EdoI!5X|pRQSj6PEp;W0;AtY-;B8tGdp%}?1{KP;(kdOldvJ_ z*Q7fs_fq~!yPGyCV@gI|W`5?G>{Ho^xhc6%nLZs)zr$l_?$?qN-3c?-2R5)X)y;P1 z{jAh&U~cgb#t3tSIoKL*oej5;@9;WK`W*0S?rQ6r?>EcO$KTJt(67L+tKav2!c%yB zOMHL88%*(aTY&h7 zTQ6G9TXIc#rqe`d7np~zi+;TAnROb^gzx{<&(t?z?Q5f%l=&PM;`CAEh=$V}s}{2e zB=_4LjbuOi{=cQCZ+1yx$$WYri~f2HU)PkG(Px+mH;exIesI8>m;tj8j(S4z_+npr zSPQp1n4XlcDZOSA3z!iw zGvK!WZT}H|!~J@=dbu)v(|v2h3+=`$l(0VYtLNwA=jZpr^~AN(wcfSBHQTk6KecnU za{cT(%GXOgJj5}~@y_!5mZf;;MG!__J8(JHF$9Bxn z&eFa?Cy-Beq9(bEwrEJaCEC&zMT?7C!)pFr@K-@jer|r%ylQ!4vPWmH&)AUBB&~7U z{*?VG(~_qrw@hl0bT;99!ri#rakpY_$IyTz>RROW$eR&2Bd&&D4PP3zG_2CcN+0is z+z(kByf%1l(A=QIfrkSz!XMVNMtvClVcUnTAIb)n56lb94Rmk@ej(QV5c)dQ8s-dp z5cXGCB+DFb4KE1K4Yx=6L_Ljp9Md+wU3_T5$AtTd_Yw~z9Z9mL7*iT>UH@e~&zO@v zKl^#^v)paWy>l0o6m%=C=2Oq-5AaQ0du@B5HJF*osg`NP zybCPzEdN-ZTXa^f^^E1L<(Bz|d9rDWsim={@jH6xPtcFkFVn5m{i>+KtxaX%y5he4q~dE%--zVs9azo#!r~ zb96oTG|odY=OUG!{gdbuDn0K+`z3XA_Y{9B{K@@|Vv%@JhO44gIpBp{?E44ivrK1( zOr|bL*HzyeKIn|z&){#^Mj!rW#xIQw{V)ZYKER6}H;=ZAv3z0u!upx5uC1fJvwf^% zjANj409M@N?B~8xLD>y9W6Lg@FM>u%zbg5%#2FSNy%B9 zy(Ift=CjQB^tkl0Y30(^rmRUBkUSuHeA2|EbBU)D?{L|PcvA!_@F{x1r zQKO>9M%8D{jhqu%5?&gf_%Y!lbZE%c;A_E4Sj|J4hKvoJ5W4o`s*m4>wGMj{_BiZT z_|5R)kv~T+i(VGpJGMt`kGMW@v*M=3eHHh0oKKuRZe-l3xaske<2xpHPyCSlU-GK7 z^=W|_Z!+d(Eyy~beLlNNZspw0%%7@-H_rs$hojY;hYD~WN^hxA6dlbq^=0)6-5Oml zLw5smOG97dK;!48nx+rtNVC3kiXP2g#|JG(e@ocYdZpNLOf#9h}N z*8;!Aeina&e>eZ0{(by=`1kYw(f_XhP5+SrqXQzq^~VB^25j;F-QVBO*YA?=6<=wx zmG6`5Gv9ZSugRq+%B|?yW2YsC zzk`-!By}Vbw>r=ooEJMXnq@@J8DDjb0aEx(W$+q*UUEZXtUAbccdP(E}DX> zXbVI)RFS;zYR#{jq0DMXqp$xndWiSd^wA8_4%M#Jt}{OSOuT{SzUBw!$7Z|5Vj0g&MGfctf7UzJ8MfKBGIoFaEcsh;4I$L`28IMhWoBlAJFwHPcHQhHpFv=XOOZsz6dG1e^Y`^|X zLo+zdb%y@%bNlss^uIH6XaZA~>S^k0UQ=m5oT_1|At|6HrXe}aU2s@W@P}8K3(&uK zaB)L&tbLiSce&tv!E@$VAIUqIHz#*)?&F-tIURF4<#fvKl>J3!{mlMp1JlmKvF9Y_ zC6-AHNL-k(FkxH#_V__@Kg4+{#*7D$_h$`aU5>sKy+8V3^y#RRQGpS`5s6{3Vaq?R zB?9(_HvicAWA4YakMUt?VS(YV!pB8SjW`=|Jfei=Az_iBkv*e(MaRa(#z4r&j*A-` z_jBAYaf{;?#WjfkBL3fme-f%BS5DradMI^u`l|GG8EZ3YW!BEDnpHU~Av-y{9Wy-_ zGynG6q83G?ipLepJf`C?n`##5B$3w?cM~MA{y}GTY zZN6nbeEmYRFDsWB@?oYBn2Enk8%=A-lGZV;GA=egGW^S~s$kd(f~^N%AEArTJ!L)6 z{jEDduC%(Ywr(o#`zZHh&}cL})w^JNx}tzDqoy2%wkb+jA1C^pT52=vA{u?s;7&oy zQJp0mUrTzKHfA;Kj-Vy35-hJb10wEoZ@(FQSz?1K6{y-OCUen(wu zf!CDYC(_4U`nOa;kL_0+fGaF2yjS>FVMO7_!gGZe3#&5AsaZj@f>+EVzMpe1r*l@f ztST85GG3>>Pivm`Roa}?xv91kd&(C{^^-0oTu%5tp=&~9LTJKoiMtYK5gRAPr^o*s zJ3RJI)Sal;5pN>0!!yILgkKNe8@@ZdAIlbQ4>yGy!`Fnb4WAn^C*nfng~*hs)Trp_ zsOVo}M#T(^85)xoogTd+dU^ED=-ttWV-Ca&!wWP`Xq+%IaZF-iVs7I8q{B%y$#pGF zTb-7jk(x0nYev??tb0sVot3pFYh~8G?0eZQ^IGLiDx6R#JV#S{7A4Zp(T)1)NBZvn zOmxT}72D7i98n*|y5*`bsV|_bodLHIp`Hy!ECyiz!4uwX*<%@L{RLLPgH`fZvn?|% zOD)SRk*qe>Hde_2G`2ReW|P%|tl{Kbx4yHzvVE|J+S@x?J09Af+V{bkwz7U_Z9$IU zJjir0dwvkhVRoATG~F{zXU#FqH9h04_A&P{Z(;FK=0k9akC=PeQP)i#)bxlX@*&bCB_BDapsBU-Q>4w+v^hHT*13twg1n4 z+g@aM+sl*7dSicQ|JgpmuD2WPnYK)_Tv4{aZ4Yf1ZRc(G`IFkN28q_--?D72Y~R|N zTEDW^wA8VTg-7xsuWK`#%>||+(-~%`f6k2EJ7lnz8kZY~lk@g9`WU+zdKen$KhwL& z+pW+p*Dhq{-bU>vZCO^ax=6hTpDCKoKhSZBE>P+$8lls(lGe5^RTsF3ML zilU+dcY%_Is|{Hr^M1*jlsh4}VNT^bKhn(!x{1QvOML zp5#olCk{{eIpJZ#{e(4%>l2?PKBnE0H(_Y}u=q2vCu29n{1)>~%$G4OW7@_vjHw@^ zic#}>;~0CaId($aV&^d-t2pU^p>eM0Yq{s|`%jwG~5Y@O&z@=0ox+&Fnt z%7zqAsxqxtdbjje8SOX$Nf|pbcV<516fDeHnA0(@W8TmCBl36W@5!Ie%4Uw^{=x%= zZRxe1fkHl(zDrWyQGf<5nQW2t@z{g5cN*G-Ug|z*p&T$}=QQoejOuiHU3onG8pE%K z@}@GTpUlI}apq|APIB&ElN(il?AhMt_LlD~`IbUUs3pjfVa_)H4@+Kvg|wLLrX*9m zDZ!j%9$*5F%QzHHs;dn2=0`cO}EO?g{c2i{f$Ehx*VO%X>^J*pP~#ikDF;)Y9^sZ z3u6t`{>T)#UfOe-3z{&H_Cah&M`rY_*KYnapF3TjrC-iW$76<*WWDxtQg)FuzG`^F z%=h1!1y+XS#&-Q~rb&-xLi1WO%a>tj()67ToeafH=)G*bX3RHc8T%Ut8&mZ0`WpDS z-I`q*$us1u3YoHXR5e>QN3|S) zFFntfdFr!SEAp4+m(8z`e=_fQ-iW-P^FCu8$~};~H|JnZ-Rzp#3o;jHek8vt^L(eK z%}k3;i%eUTzAXJ-`t9^X=||GnrLRfQls0^l2k-%A*y)1iw_Mz+**~_yhWRK52oqaZYF?;+*?v32?T+iZy zg#`(P$%W&JM;D(jxl}T>bP{)Ufr;@^rPAY0X7I{PMd^Rr0)(u<&JEZ6%4aa`rOz zXSQdy+qOHl^~?q?uohdJW9P0&dBaU3DZNmd z^4T3_IExB|oxd`}^PS;6xoL}GfPR4fweFSf58W}{Yuy{2ipE{fb^m}1^tvkAO4_xW z4Iuhe?BGaEA8l`x3%j%{SSifXcB|cJ!CF&+|CxFp9>I%8h()iwlr;$M;JrFfeNS^& za|^}H6g<#j<^zj9tqFOr)|xh&czRzq)igzU`ag6NKH46f)dSkY+D7P^_ULx&9)Z~s znZwvh-(G)Fe@eekf0S!|PCRp4+mdyQxMnwB83iLPGvH5ZPH7I{mky~9s~2k)@~(c? z3Kwu+^9T*zZ)%z6bBS)d(!*DJ_RB1pq41espuHQ(9P>@8O{#EeECXQx+A=e13v=ck z(dS|`z1KrnAE-9FLO+fds2HUWXMffb>N}s7JT56JDk-uv>#$A3H?a3OE z{ZsZWFk9oi&+|s*Pss0F(7xbR!CP7u6c@y^@(S_`E*4%Wlo@t1Bee=M$d;h_97s)W zCzfcDcTyMEmwLLrR56@FTP$-ZQt=X9RozvGv2>z!`GR+TU3*pQhmS4$f0oVyOp0q; z+tb}u)!id7xD(tZ!QI{c;O-XOAvl9WkOX&!;KAM9U4lD|wUuGla+{}M>v7(&GoQ4+AhG@gIx9ThPntDrZtF;2L`A)+1N7y+9wBN}* z?L-e7RFl-R+G*`KXEEnQ)*a_gzVGgVs@-tK9cPxE=$ zSq~le9S_Mr{GEik7?`aG@dIdw=4LScjA(Dpi9;D!*faDRJy>mU25L#oTMmx;cYO2K zqe`t7tQp*I?X|9%*UXL7J3I7kdU3s^K3pHBdv%|l)<|QtAfNk(|C|3Ws)%S`a$gx% z2VW=OGw&nsG0$nwt;B1b{A&~K9*3um=YO7PPfAaN#0H5Sc?M_4&x?Ho3C%buKT+7>yEG6zIwkJU(0+e_U+8qOJ93_ z>GEaSrxl+jeVq95!N-Rm^L)?8}D-&Nn zK0`vfgf{R;2YUv4;ykgQZ=UZWQSr?7vV60BoBW&nE6JW82Toj#OzA7eHImGI#tRnP z%NS{n0Bav(twvuy5$7h!?bwGS(`a-Y;+1(4g`s$XzCxGu-SNZGN$H@pS2`(`sVhow zZjMxjDR#1Jx2aor-VOCCPj3&-yg}+Pde8w{9ynaz+~3^9IzallhX>1;6Z?yj$`t$ulS4l59(| zx-7_!QP-nx!rM!pESStp){OqODSW*NDgH?DE&5w@eU>}g6Y&ohmrfE4uT3lWb)BH>U-qp$lHGSoL~<`~7y-%Jro4`5{{i!q0p-MppW(eDOs1y%-D1#;@S^efCOAL&o^ z26`R+K;UrT5SVQRy`p|V->=Wt=jlFr_%>u}`uzd_A^$`YAa~nVV>3umKO>8tSzqM;(|^Wy-dEXQfqPTiL~-nC=XtuCFpMq=1ZD!Vat^pg;o5K9xzDNG>ZrBURoWV@udA`>@yG;T+x~tvN1~>;f3&Sx#3^(=w zD;X<09Q2voVhgnenw#0SaLuRDvlIr6o5L*CrMaQhB&oaL(JgQ;fe9Q-g;&>^UQ44j zSDUMg!7b`>hpwe!%t*B$nB(u(%_$Ry4N@+bsEj+P5$CalJ|JIG#GZhNy@>C|ZaGn@M;=?(+3dVN;m5}5-iNAdZ zG$k`}Iaq=c`6!%$ar8~C@xxvK&$RdliRSqt z`q=WUPH<c-R$p_quiqUh4{&5t!gZbG< zx8PRaG4GiJ(4UmYx#~}JY~fb8^^`m0ps~luZ~kg-HP^v3Ji_j&VU{;48D|5h0&~gy zUd-P750p+gxuaRl^d@@RK*m61z!}i=aQ0(RPhq4mhH{5*32YABqVjv`d*RFN%j0Xt zn(v?I|3RL0b-gNc&dPxczDvIJzBImBzPY~b%=#Av76)E{0ghyCr~mut`{27kCb;mw zfC==*Mq^_?ukr)H^q9byKxcm!e>;C0e{;^A<@!=RB{jo5xK=#_Jp+sUOZ+VG-SnHHuNrNQw0@XBNI7+z zSJ}n4%-iNz=5(u3YTm>XLNv9n=<6mh@B4wjR3hBgd$`+tXJre^iVH;{6sBo#0II~d zJ`Xh*nSCfbQ{o};0_E@{bY5l1{aXb7H--$uIQ)M)pyQSN!1~~0XC0?N1NXrlEaVsu zep-fU${oB1@}dKp3a0ccyjxXMw5s4Ezma90#gW+|8BPW0p3c&rG@>@#Le02G-KCDB z3NEP>L*4OJIZb}>H}!`)o;j>f(UoUlw1w27>I3zjDzo(D&S-X6xN{A=r5L~CH~w=Q z^C|f%N7jHqc8*h(R`X;8^oU7?A*jOrn0jmRq9H0B^B-v^_+T2EeCFL zO}oTd(#?6%dCA$InQ9%azE)SQt@Z>H+`yjv;f!+@cm3*Wz+5<5OQw}qE5hnZQVK8` zI7M%^Nc&rBiW;e8uDQ5}iG3QBVNoR3qoEoP}?Z207M)6E8 z4PsJKEvepM{j9g?C?|3ben2TBT1`Gar69Gvxgt=@ESU9<1w3Wx1cP{9TIAR?}#XSM%g3-9(%;o=@C^i@PHPs3G z#`Ezjo>g;s62`MG;qmYh-FtI?c?50h3?qI^K6fGzaT^XL!h+yGh!C)J!omIgsZ)P{L!~5Q<7c+_))65y>I)3jJ z>yi~|CAX53I$Q>Q$P#^#-c|3R=Rgg1n%|h7*Koo*Wl0^eKk#p0OJIFqhB4QuPnv2~ ztA=%eQ)8$;L|;iB`YGe2A#>*mtEIqE5B9H8poe~X}sZoU1lhp5yE2^O>YJ~W7b-$x#54cnpus| z==-dR03`aaGU2BOMN$2LxmU(mI_w{sYxaZJU3&+v0r)d0O~MV80zu`gjs9(sQ= z*_(pvuP00Q7bS~Qk3W;mk<}3me|;|KNPDfb_Dp@Gj-ig7?U+f5`BBGYWfG^%6BJG@ z6*<>F;=g$sl%^pFO_CC(HU>A$%sRvx#H`?ex({`3e>FmlRFCrSnxox~b9@E=dCHzH zMn^w`3OTP*5KoAaxFTG(U$uwBIw;7!-X2_ZD*yWc@^J6rNF%k*0bWH9`ka-@I;Ee| zliK<<)4AH@JB+eVz<*bAh3?~o^$ed9CwKQ`CK4I>Oh(`kAsK^xS#nN`chzlJ`Q6}V z3_zX#3P+RPI7vv>d44>~%Hswj{;CJ@7ixx=S2cXyvZKe_hW_*vzatfDhy(21@=0Wk zqDq(CwDc&wRVobWo5hF5hoi78>yj)C+^~$djDu zJ7{RPa|&g`14w+IJos!%Uf3dP%)+3yCxZV5E7Py1#V;tBBupQLHQM^vff zIA_ED1@LUmN@&QsPoC&?0g7>vdr=LX(!L+~2N&RO}$dQAPk*%Cjk`Ty@fSrT7}7ijiHW50%l zC_Bt8hZGl|4KYyl^1T zQ%mLqLs@I=tLgO+&i>2}XJRpey_4IK$FV|Lp$LX1c#+iYbE&Bh zv+r7=3_T({7!+!mbA|IPxKai!lO|2Bg?GXrrj_@VdrD)iiI&=#3f{va?St}JapB8T z0}s{)RLk|5nCzrd7y%;oMft{TpqC>6_jy0N61AzagZkuvx}RIPFdVB9%raiEbNf1~ z!Sb8T?VE{7_$Zc5aVVR3pLx+dAI2+u6`r_-(72{xF0z6dVmT@#54_v;aIy06XT+T) zBYW>Zyyi!-$BWS)y}*rGJZQyR<`51uefW+PcqvDjy)0snNLE#ETo1(8QGjdl?YV}l z^EW(+KeN_Q^ZfdAG+TBDp*(Q1MlRR?&#QXk5lnjGEc z6XTJQ+sb2=#5G6q=q9k%fPpPD|299vem`rTF@;MhS-#nVzXXe0C9U3OFR|hx*n@uWDM>k?tWH$SbuAB^wi@)naYnpxg#IBXT4gcOxx`sh zg7qtF9&2cDSWxy@TmEKxQhaNn*_Y4j5#DPl@Nn(IYQ(uT0&V^vcq6k&a8JQ&Jqw0) zg&kQOZ?A)BlU<(bP#lCH_#= z@Q0F|((?G07J261e`tlHt6$9|rc#r-~yw`5oZsH?QjazmzY>ZmwsbUiq-2J8!hY0VN2#YgV%>Ax=4TGEKg3JxEAIF%`un1I zGbVSWbc|-tRHq+br>s$i!5t8tknHa+aPp4At)Ii(`7vniU*t%Y=QplmEdf>fok?Ol z?!@%C1T4a%pdj~GC3_|NXU-L$lBj5^OYO#tstGuOi3{~7{O#SGS3T)+AMx{!gHGMY zn_vw-L$T=eo8ytShW*)^GiVv-iM*EOOmxMIp)XDtCrL+Xg_}YiC6DqqXVq1-56}2) zB|mZ*>m2cebjAySIY8Pw=>*75gN5A5w@W>`vap#%2OBP#3JX(sdwsGrK zVo9Er_zT`4R~_o0^#zY5@!gz9?fn6NJ=5~w3792V7uUW3Kf5>nU#fuRLtkPW;)-*Ua~EN_^emw<`&M)lCPSajxN?bqT+u{Pa|JsciS+ z0UJ-BrQjnvPWmofXe29G@}a~dbS7?H#mEE~Z$Qb8lgw_()2f5ZjgLb!4ZEuf_1!wA zh^?uNB@=KyzKW7DEPlJ!?AJ+em~XF(3#IrLcg8n!IlDC$9>PsB)T&YQ%B=k{73Tr` zGjhU5?8#~Y_qRWFpXBlgH&-z8boga7;+YgLBFUtY49*CCe^=`9F7{sb6plzH<2xNg z*!NTLLN3EMoDsjbVR(#nWCvbVZYU+;eN`d{FfDk2crd2tePws#aKwW_#VYaKwYq&f zb-j(ukV4EEcjAwni7I^>-bmN+IjhZ%xy5T5i8pf;_nA1E9dsOYR*}VN%rSdI%b_d z`Usg0SJ)#pg4Khw(Loksg1VaLYb*Y!*tT2k=?CR5>%pwFJpA}xc=WUd8wA{Dm&|mATYfY{|1rb00>%T7h114XYT>ie%Ru$!|UoE z>Vi{cY-k$a!8AM$)8cR^zRQvacZu_MJm1bJyuzTU<2`B7&*nlWnE2CgM|__ak>AjQ z9rg|H@PFXXtmSzb3x`^AxySG`Q&W>o;Ac#xOXl$qnnp;nfk)uGFGI4m?BA8P6+dyc zQ`}D7Sdx*5i%il;{1dA?syi;j->Jr3`IX$I`*6@DtHcgQ^OPESK8Y?S86PD;ULJ-$ z3wuX*C;XP1EV(b+vsX2E?NM+z#EbGp=w+xVXKs0X`7VO9yXdgRLss%8vt+uetFK7HOeYw7xjW<<_GqW=uSJ4)qD1BtJ~f1@UQqj8mI?;PSM z+}LVjz1839mCTB!hkjEsp0lIE5U)z9dS60 zke1=UB>n;7dw+nlPy88ISbtkL=u7LEwM-SAZc3hGnWbFE8BF|`rDr|>=5_;ZQ$cX6 zH#oMnWmevre^TQCdf&Kbd>oPb zW$30Rqc+^2Y*BWB*v_Qi6OZS~)(mj9(&kmV{v!BhMnP`u!CXVK&~DJ%Al3=4!E1RU zzV%Xb&7lX~tL|0n!0Ma}heEuB`|JIffF0D2;ozGF-QIUR{XT=?^oOH%lL|bVZhSKJ zgXFV4Qtm3N;r_aD>-@%fu#Jv+Ewxcud~L)FR=(4__&h~$62#IQ59Y*803%CcPyc}v zXBl)}1*ow*;eRR{U9ip#_`KX@PTG|7AuaepF>0lKDCB!lv)|>u9!-ZQ{*33ig;tW8 zwTBa`KYd(fdv*IP*bc&ZXpB$!2WpwAbW=%THd}MpbD6-L?$8J1!9i>--%JhmSstE8 z$x+yeYI8LnmXaC&C*0+nQ~?Lz?fpj&xs#hxI1j(T`RmWR$9K>ipH1=XPKN@n9(9;_ zxQX}QSbV6Hb5lybgXA~vr+2-}4O)O6<`|yvOYnUhjIVl4UY}%m?BPjlKriJB_yfa@ zVTSm}38qyI1)kIxHMxBjFx5N@Mku+Il9})c-cy3=RsRFcFGbC~2Nt#XV#RPvyjEYT z+1$C@A7J9v0|%*&zHAiQyXV#`D>=1EdAKm$;H|C((Hm!tvh04%A0PM;sE$8t8Lgb= zhs&)|Q%vIKt72ARj#(K`{R6>~yt9Atq&?5sCmxJ~ITbJqnazStgJr25HuIfb=46x^ z_5a9%lX|zo$HeYD9H3!v98NPeZ)7#Lj#K|OfdD4 z@BdJH`Kg2+gA%&%MULaS?n;J%1%F%cxlHr~Bx_rO_Y_C-vW)w92fp!=wQwnT1#Eu? zRZh)d4sM5;)hJa#I=~ZwF%DKrWLfB&+udh!&^ElbNW0V1?=$up zk%6c{5uEtXyDzz~CA*aDA8nuZhMDA6SebnSeFCSM-*j_zclCzZwU8;$8C)v=qHZg0 zmNa9)D<{BM9l>m>1$;vBaWBH$U9u)q+tb?n*m~JA<5c?;>=QY+Z9Y}OAIxzYY=^1D~@0Us9*Nu)nrXB6sJY{SbFb?XV)DqM@E}o#vDLA!nOpe;fhb+rupCu>G*T z4SnKMyxw{RdIcnpW{5Ued#pZHzkoF?!vAI*^Ts-$4&yj4=7R&>XGykA2_|=2?VIh} znF~x}RwI6&3H<%#^pb0>HJ03!ID!1sKZ$SjcmEfEx)hC_7$?qQS`sohiVD@BbWMm2ABZ+`k) z;mu`);c|!CKWLanJLb@z$b9I+d#(fzWFqIockPGv4KJzO_(E)l=MhRY65E?y%vdmm z?l9I)}l|n{gqnEF{ zZx2ir@lB?2Kh#h&nSVh5F-Owb zIlw<93#K;b(gbsyDY>^E(L*ak6zQiLgAe4OR_+fAPjIC^Oel2N^({#T3b#erq&BdV zzbD?iU#XpMaXtv=yb~B!xRMNQwa2lL+_v+~9TtNE{EAXda{Htf7Z22j-0Nd-ZY<0h zKixmw9}mX20leoUj9Qt!2-hejwO|tIg~gdizkH~O# z;*C5FWI%eIi};Mz!PDyq^`{u_6pSn!SzaxxHV|eGn#!g0YOCOyZ)A3p2CT|MFWiM% z>kXXqtKcmqj500vPu;H7ql_zQwv~E;KeW@MB8sm(BPxsx{Z|Y?oPIYd|K)Ch zr|(JMQQuJi2!D0Z#s2V+|AtTBQfs5-hwe&1u*QoZ5o?}*qQ(E?wpn82(+ z^Y}*bf9TWn@vc#>2Qbd$+wgTS4d{Pb_}+B`qK z&3#}4-IzoD0KH1h`jfNj2KCHj`$T&+M-9h0yhx`pNp>2FA>1p;g`2O;L(4N-UCg~$ zm^8j#^zFho`;8h%X6v0CogAIvK9m4I8VU2FEHlxLocA~AUG`EBg)`5LrJj;|eHr!o zSa3hN51ZhuD_YZ#-R_uA-tIZ>+G6LgP0 zi`OVTZQTs)d+TM6SO*4=ml|8n-psg8Ch#4~+3{3=rZ>Q&;W0_PYm~Kc zB#Nm;9mO0asH<-T?gR=4@(2FMT%a)=lE(10UgEKzjJ@2+=wOUt=C%@_*>>bUo#cK? z!>l+Tz3Nw3FnO49++$&eVn3`NRDT24YDB+R96vYde`YhAI-{KX*(W73n@b7XAPe{H zYUb9RLCa(gw$L`;wu-u2#d$sjDCjs62iD-RoeI6pR&ccGAp5IviP#NSX&(728|_={ zwY2J54mFo5Ihg6t6JFJ?>CfQ4)`C-+2_E-$KA&3PoS#8ni!x7_9K`-$7Ef7+N%)a0 zcByLwt4K|)ZYL)sD=7+DsOzRNlb4*dF)SZU^vTqrf?2syGuA|{FdMcy@1@&TT9+uTYG0tw7qtV$z&}s)L1LQ>cUUS!7Q@9 zy%YHl1#QE5zmhRm4yR=C!!Jpi$7k?MIkVTp_ACN6o)sVb5!93heMvm{*l5&RvR5RN z@DcT`+JSC=CEZLId?zQSig}q;WB|J^ z$~lplJERkHP|Xn#RLTR_Mwg{dOKVJD zTAMj*6uq&WiJfpi7ziss@)sbw2ltWd(wJ|5GyU#R-tA!+zx$|IC0B6>vzIx%)0CV| z)o`c(#g^69j(*`I&jtxlxZ{Vxp@bsCW7I%XB{OcQ0~QT@RUdJY^Dc483JzN=b2wk z4GC*GOyzw}qON_!&#?!StQq`Hi{Wr*5`2=O{ro~ghoq@D2Jc*mj#6encVSfi&P?uR z=ypiK3%MxIN=9a*#hGJX<{WGhY8A>D%n;nfd*2PmCLI%2@tVj3E?kRTtu4$de!zJu z9##}g@&I^b=A<3ywbF5~S7&N6nR+V7^L`#aUNktYWKE9c^_KvvdP?v6j6P3hOLA@= zXT8C@^eh?WH%XVd$^4`uJzjP`g`v#VGQ-Mw!kq6u%-qvVZ>Nxfn2JwuDH%D_I1`UC zdw5}cX$y0NIix0+{9HMsXT$j|EOTi%hq;(D6(RfNfpypF3oa(P0ez`y<#%plrf>@# z*&d#?_I&n7$Z{!84={n5Pg{F?s)Drk<|HVj1dS72Sr5J=>DMJ^s3hm{RG#f=p0HS{cv?Yl6xV0*(IF_e4$DtGRJT(OV;OM`drDe?{D?DV(5d< z;l+`g8C3)Nj$2@%@yt^@f+6(epAY!|)xy6&Ju|~I)ChH{(-Ocwe}#+u1gv#F6N`Ib zfwcHxiTv&dtRQ`#c*t&t<9?OT_Z6R&Jfjtv{WM}i`W%0pwlIhUAD_Xy@!_m8kqPj5 zu=BQLI7Qpi*s9~aQ-=GbGjqjg_P`$cxc#8~1zB>&$UWyJ>!=yb%klJU@(ljWA0(IM zH5oxSs2~4EgWL+nSu0y>TLt)tlk~~@8<@Uh)CuY<{JLEv7^gQ=;MNpr&86ntKyNOy z3(0OyBDr7y&(I@~lYhv$ky+^nRR86<_eI~llwQ0v&sJmJ4^-)(oLS$&t1j9u*!okE z+=5pmd98!#;UvdcGJ5t}2dz8ofOqio1Y=pvsWi`;&$rOulB^?{6I_D-R)<<+H)qf< zoXe5}E?SV&JlB%5R1!RHAo`Hf%(zp7!xUuJ##F*FAMZvd_s>&sxrn5wq-f@r`QX$@ ze(~SbrhW0-O~Z;|E>Qxma!VX3(t`D$VRF0>9%OOuu*_;UwKDTk!6Tx~aB~`;=|aam zhXamK1g|d|M#s<0I9pTj&nC9hU|A2rxh3;<2NyWWjqBK0z6D$REj1Zp__M%u&*jf-|_G(ZZ+- zruD+{#!*G92xd3kCi)pSOc}{fm;3KCzpohmvh?O%;r>Y0t>nGU;qCZ$hp4{QPYjlCe#Il!`+8iLEu??u?wPCGDk|l~;6>XZ|et(~`y2mL7KliFEVGPwEWL>7f3aOj6b&{G7K0w*`k; z!>qh;iVKm-ngN%Sf6+R0;Pvba{u7+cStq$BQg403w`!Vwy1fjXz`^uDU76*k`1Z<9#lJpA!@93uC~1DB~I-Qpmsk-y+{m*?)=hz4gS&r@4c zlB=~HJwjaDU;eON#)(!Rt zyO+$}46LM35*&)Q!6)!qTESKM4BjS~l4Y9aFSwy*q5j-2EL!HayO?Vg;{=!7=AL|Z zySdp4~TlHX?axFsJj88!txaH4be6Qi` zcyIq?-vCE%F7-$b?#9CKZ#vsL+Mb|-kX*hwtgGl+{^b2Yn@W<*pB23C)ztCr@Dj{s zW#*oll{B2+C%$cNxoOX0UPpa+}6Ug-r_sSg=ek|P$yc_`S` zCZ3n(V0>~n3%-2Tao%wp*1yc>M$m8BX!d2sE!ln*xK9Du;4y4rwlyr6K-IK~C#pYl zk8a%C8K|+O7VgIVEc510Jj*RZZ9*^UMW3MzN#JZa89W`_2!Hnk_2CpS=3lsJvv4kq z24l@fw~?LsXE*Sh`t(!BMb}CFC4NHr;be3tkH*ImzGENWLs*!Zbef77cG$vch3c`+KoOlrJ6z&Z#&tu%UHFjmC~xI)vna2efg}#r#>7$ zz%$OB-OS#R=aW)Nr`)2VzCr!7iTD2jZpl<|rC4x_nbgxcICK7`NBDxqMtV%i z;%fCfJhF*lNG{Q>81cfQNg%s|C&zAiJlvGfs-sOnDIj?p8y$l+;^ zV`U*~k3eWAXLD8@IK-DZfj!RT**1&wuOw%&%y;(kzyD=lO0AyL@dSpzc{q)WtUs-G z;3S8ran`~OjN>kU1J|st+1tFzog_VZ4ishw!C56kdLezO;9bJoX+`Z?jO^|w^h)c% zHfQ0h(Vx$)pE1Dr#xsr-1b67NN+Ys``sjW2kJQKc)x2s|t%epu{jTEyuQZ|&qJjrJ|%fAs^>>-@8wYJr^MlkhjQ9qW06DsG)V&*;@@Zd>LhGTbTE!W{B zX5}2bMx}9#v+V(ObQC$GS=C?EJnX?^^ZxT6q1uEm(7(ixcJLCN*k;(H-MNQFL*I}+-vabe=9F(Zf86vf?KunA!<(!UtQ5Ru z-ZD3#5uJ`l_BWo#SnE6bpy%c-G6A!zIn~F4xj^rQvBN{6EaUkHyjubGqTNjGIq(Oc=QjD*XUo<0n- zvtR=E#(J1{*wInzon(5G1}TuZAR1Kqp3o0wefPj=E>ZKYf%V%z*gLp|p5`UENOMrL z+`$|_y#WO80FiWvj-?CPV7aWkmY02*PEDuggDE)CoQPg8*8C3*h7PVD21X%#>h{z_ z)$G;nZPZrkK2X_8Ryk`S2@}1^nO=_X(m>7`nYRohe^K}}ci~1hfiIRB|IWei*=1H& zhu%@ai>W=_i;v8%D&bdm6Fh1!nB#S3{0Hs-;!)Jtk)C>CF5jipnknFkh_2@W`obDX zwUcJz6QbaGBK7GD|8qZddGizJ-~uv{YJjRm8sWw_=Ip{Zx`59^19<(j!87Bz^92L7 z@IsO2zaJTH^Qg8DQa6al#3FP!ZJ4J|G^Q9$sCg3YallKe@_~M-E|}07_?wTI%Lap< zV0F5HNO&0i$o2Xc7ot7pZu4>AX+ZQ2hn+{A*PK_KyQDtBoghfnC2t}v@u$1{5bUQG?S;H~V<>^b2RedhT* zMH-s$4LigAI}STBCw?IZ;koU`L+?B6$eQ#wgVAyCfe*OazTCcE-KwC0U}$Di$outgWlk zML9wJDc}1U)Y}88A*Y}{lv>7Tc#Yd|YNR)gVb5+MyD<)oDjB?k)I1B1;E?&qdt5-? z`WN_SP3e7B!7|yv%r-aAZ$oC|;~e80=V0`|FrFJy(?#1;+KZrU>IbK!7qjS<@CUMU zW@IN7<)rBRxgX20L=P;zifCVQF?0GJ_BHGYxS1qw&qeoGgZ`ib=)`#cM1S5u&Om=~ zxI4HNJZ0XTB9Jn0DDhC@0C>UI!mo$VAjh^Vk{Hn7NI5H$h2Iwt-hxf@_(H?6Xbu zBjL=YpK#_z(z}!llnB&d?pGW=7=hT%6a1zbaIC9X)vR6QXdL2uOH1bIZDu4g({m_E zjsQ3Pt-#g5f5v;`p5vM$6WI&7x%2bsh4q8*#4fWBuV`1a&HVkIXp47JlUKsqGY#I4 zpKx<}<$dG5OKl>#d6iw&U5n68KSSRAhD!sRMY{j|NTz zYN8<=%Y1QJ#FB`e;Jf{NJ#cg@<=aD@@!b8=U4fbB3UjUbn%T@&IK+jx8@ezP+s$lf z7vI5pX01<^=gJsrm`q^*E@rtU=uuNKn-xCfBys~rGdo+${0G_^_f=kpXwjOQEzQf! zNw0xg310IU{(>VE3TCJB$qD!O3A3H%sFFV8Mlgvp^$dHAm>=yp9!lTAZ2r(E>GRNl ze6oMGzfoQ*xox>^qsSK(_2?G*%}vZ(4})_HK71L}Fb3{1#wMY|=3!I#_>#fnz%!;G z{S@|l;9awR))imr4@5s*k@MM3endv}N43xdSKz<5BZYFM@wc%SO>vK?E>Ydl?0xfn z^$qY0@JKx{6)%BwFdhg$3mqc!QnE=~+uPVzhL(o{6qK#03dI|CpSDLkkBaPh;;Y2N za7Tu^N4q~oy^Xp>j~A0TJ@FS$Hct~0U=0$%zLRbDft~@wIDZGY03Pm|`e++h!VHH! zlO&%@484C_>UB9+R!|q`PRf_`ud+{R;ryR7Cv{a}_7M?g^i_ zmgq?AOy=2M9KS9nzmohDZa^G;o-Xm7<7L+PChEVa3cTKhzCV3;6K^NxhbJ&S+0$vI+L7P6SE|CAY-jb?IZbH4%4UF=`(FF^Wf7pfu8=J zSNa=$p=-V?Dl$5<9{2ZZe1%Q~jt4T~Y*{>_WW*tGqa>fh|Ch1Y=&AHkKC2(p-l!|4 za1RecXZu`x0e7H_qpi{2xa_~^ml~0%9xXj?O*QZX&lJoYRG2KLME4_lgmv%@n}b6N zU-hu<5Y^BH5a-9t#EOUAb-L=p70q7%Wo-XFufyaR5~3dVzxt8kiU`5`&3*=w&6Rrlh;H`zcsvN+Y## zhx%eV`1=(UtGB6D?rQh7!T2LLMZ+Y1S0g;5J=x&zPa;cfHaU|Mz^X@ihI!)Y|1Xj= z`9%FsJq%ZK862zjaI13J^Vm1je@{1OnzijU?3dkF+%MsWehqvL3{4!GI0(MS4jg|m zI88?T8Ty^qUl@OWY#BFIJI_~AZ6}}VX1P?+x+AXqkWNBwv=WKnpUflDWM{1{* zxL_Z3A9YIxN)Mjla5KULW&l-R0iUy!rQr82oHZS%!y7E|sS@;>522;LIPS#aD#-oxJM`V_q|z7~fg4n)NBOwIGo_0rJzCu>u* zS!BKZ${sw6m+wG)OMk=PHDjtwsivSs&H6pdck_$&MesZEmfnK}$Pr*7fW zjENWpRRX=66TD;9dWzkCgVxc zB)U~}DYCno;_=igu1DP8+}WG)8!ZN(a04~eBi}vWF6NbMovWSe;e@x;Tj{G4S0y@l zwjM@4z^m04*&UTz%O6dCr1E6+JR^9>pVCZO!(GjN!*|2?F792NN*n=YZh0MN-kTB<33B>xfjHSw## z^IR`gy;MpvEm?9S%6Jv~CN^InPv8QX;u)z$q^2**oM{F+@T#^-wt2w?K^uf!;ZErQwvi27R9;s`TPB-$YVIHp^OkYTm=!xK_LTROSMow0qOHJPoE!uh46;}g1jS9i@yh;{qaeN|k!kcdr-XMH3XTfZ0;hB7g zk~!AT)yK6o*@|SH;E`|k?eM)x_%ES492R+Yy5U;GsDj6+l{b~I_=)nJ{wop@rrweZZXDJ&xvo-XLJ(+7t zFCh2-AoL}X_!T{8Hd+czVL5WS6P$i$1y>oDa7Uf^tKN%$7+=UQtRlc1)Rp znf$tM8@|d0c>o#g`*9rG&pBF|zAEIhT+{6{?4OK}#xVT$H0IQ4;W}4g?sy9i zG4T|*=YH&tCS!6jxbowKhY892$^3sS%N3oARO&OSdrH7ZmTaB;c+95*d${Sj?3v?T zrWM3DDqaz%$&+snKf^|YG7I* zr$48EAUyOFH5c&A(%e+#`D^f-(S%GgSxM` z)(3B*JkDeI!Y=2I!K60yH??_ha3#?aI|2a)ywH$ z@fN7e87)&leQY%H#0h{hGrv^$0wMDxycoD7xTcE#Ebq74q-AU zHc{3#Fzfx~^+tl}4gxQlO-f@LXIiK5fV1GsSI{hM=3swcWbKB-Bl?1R^!Gd92k!~) z3KlktnlJG6kh-@BI)4X((oCFhH~4*H=zHIQ0d&{<=mV`j))G8_2ds^x-b5l5OPpX5ux);`1PTbhWxll}zvzV38^HRC;f4fM(1B z%D76nCXx=6Ldgo-p=#_!fpYYz4F z1MQKPCMk8&1K)k$y1<5j?B&KlFjJqQUnV&-7r0>x{4&dEr8PfKLsfVzHPFXL99W8w~5++F!$Qu%2IIr zhl+3p{=t!FFaMMQJG+1us3{nGeQ+?*vkD%a7H-7{c1;?30R_~2_@5M2 z#V=iQ-nZd}yBRO5bez$Pn4g}upXK9DQu8bMm43ng!B778{>}Oh{W3GtC9dVJ&d&Bu z57{!$d{2BAycfO4&EsY-YJ?qRZ)9ao(i{$h7oXTtw&J$7&Q3Uy_H}**gKNv&!jFM$ zefVZi!1IRS2{98M>Nb6oUK+i^AyRtlqmgf@HP)P}L(R^7aSZcL@nuLwA1j(TgL^hZ zQWj7Pym(Su~f?{6ATL6K;( zL|0W1x4dldqzBpu+l4nfO`oYZGaH)XMf2JD-dW$-$T=CG9pOaxfde&xeXyQ+_!qv@ zW#BLs;Q5OtW+1O6J9FA=oN;nL?dF--2i~Bd(lyW@e8H>yEIyAiFJ8+GqY=3Fo6x(^ zOZa|4?gHUBJZ1gDd3l%~`z8I0XlIMVS!qp;;(-@86CP<1d|yklx0j$Bua4fd6Powe z{2cLqdVpqq68yv%+Z0^Iqu@Q^2~T*WDaEx)x_UmKRQh@<8?6G?}|T6F}xca z2O9@7kW41?37NG&g$Izu%4*3hW*7?W|ClqEgo9LvIgkft@CY>723#cJ(00ZDZa-@- zxPxftrN4>-tB9bkXiB0%Bv?r@*!VADXT3vfV1+^<@hZ5d-p5UFv>L@cvbDFh_fp_; z;1+t#+7WdkYAQ998G)EU8($k=4Y)5;aqcXl71a{pi|3|ZZU+~x2%n3Oc?G4vnVLEG zZajfRGm#-IW7rwvl<@&=U}x@%RH$W7hn)l+-Wj%(If%^YOW~=r0lX?5z8l*dTOI3h z@y-a|vj?BZs(}iDN8GcA@j?*qZ^?_zfW|kYnFVH7IdK2tNu$UU43NVobRy$=sV9n_!ouVW!$9sTTLU67cNR?L%Y-G6G%DW1`u~_$eE^$&43;j>w(t!$b5G^L^L4MX zQz?Z<#b@6;U*SNpz$E+%SCNZx!F|C!$}z&x&FpE01wwxDwT*@gCs{82CCvpM&N0}i zGEco4y29?s9D0tXs|L!|%FKW}@Z2B6doLp)-4Cg&yTA|sPOmYT&*V?;#n$lc*5lQ` z1=q@}j;oH2X#OsRE-@wQ4{!f7H}TQnugs-3*fyYB*KnSQj?Q+@&*0vZ=(C*MZ=wbJlX_}3TCu#$tj3DSc8K`qU@PW3!<9s0I(?dDxS%Jir#Gr*=61F6)1hcLi)@^GxuQ831 zR{4%fQ22>XbOO1PvL_v&A36(%=z8dKr~|lOHS#+@qi$}C&yeV!+rcGR$el3{?)oEm zB*G~Z{Qm+f{Au(_rC4*|@r;IVSp}{BbJPcIz@m2GVX_mJ#S-qf-h5uo@DJ**^v9pC zztRU@{YLSGMkgfu?|*nA-NQdXI6)in#aO_c^eN9)Dfqxk(E}*VGu?0v*TDxAt$Zqa zs8!SiGBX(_JY>L~ar#*Oz4_jh4611Kv%~Rrs0l}PFg;u)aLb!;jm0mAn*H_`+& zv%*br!i^e&`apE*x0z;1HlCb)3z)qY;J%bU-x5B+3C_id?A0CcPKPshoyxhhjo!rK zcAdq#MyiZxpJ!^bwB5`hCNU!wFNTZOd8-dx4;_3XJ6felxUNm-+&BiWC_P;NGvHMj zxl<(r zhM9=?k78oOnUv8{0j}dsd>_)$L!IQgt&cC>bu=<-h2`M{Czl74U~q;WjuRtz`Jh%hqSfPkyOA|Ml$qK2bkeKh36sn z_DH_p=kUu@Gc%FzP0pEna9gt3Guve@a)r;c1s))B$8>}T;bTc3TnitJvgD7|psN;d z*?jQFveUoj3FQt6_i786g?N5^f-huPx>Xteju|ilUziEn>25_oG7vuv;ZY5O*)Q3r z!qsStZg&$*EzyS6uxc@-+-jwwKi@|`*p52>Hr&altT)X08nG{k>_W@k0S(`BylbuC z6|$bo@XADUF_e9J5v_K0UTYyUAF9zo<_|&>&M|jOV^5DK%nn<1dR5WXSH=J4Idx42 zaQJb2Ch58FQ^EiK0Ec^+In4Y6|E*1&1$FUHv$40*aUu+)Pq}Jcu+}lBkLTujWq)HA zZcr(+gjtapvuFgy!nLb_|3qupg(Ep1kqy=Tj5k&zW$4g;$vxkClmd3+D&lS`62*4gAmo@J*jGi#mq4 zVm_YcW4I~jaOQNz!e__}E-0F$-FQd*YAa?t1*UwSd$0$03GjMYGwOl1>i^UqoEP(O zB|pX5gty!~$9s|j$fSYK{MdfaJ`1jHDVPi=c}~T{;~2hlE1hecRhTo*L+fMWGt~gS z;Wg$?jqpD%i+^%Rb!bQ6wuqn3c(|j>IorfE zIL>9n2R2FxSEOdD1sC=ibF5>WNb-Iw!970D-LV}m+;=rz9j}enVwFTiGMqcxyV+0K zj`O)b=Nn2DhAiYKw`ni_8nN^z70?H@V+LLy{-JpJe8(H8ES}CY9kU$g;Ckl<$9>0l zUJ;FeaP@GL2&KTK^doyZC4Az-%ux$azvsa})lT2Bo^$FK<|Uuuvu!munJe)FPEJ_T zBjd5*#OYgllorh7^7EcM(g&}nCaQt9yeyi*Xn0Jk!J-G^jGP+|SXMKGIRekcbNX3w z1o{~ld6ui7Kd42&_>jH&9?qIzz4TDc2hH}qfHfU#tq}TvCX&5H`+JW*PnXx zA`Uo=`E0xKahXBSBHl5@;4RAMxSM%*DWjM%ATT(vME_I&4J{>5HU5i_tcvhGbZUhR zu&lQ8cOTFnY=?LH46J1^_2@6m+0F*e1ZwCt^wel61s6Tb9;=9Uelv4`az5Q? zN}5f9vsBbEle<7Xm+OY=z?8M49m<*XG3;$vGjs$!z(-E<{M`jtnFFVDAT{joV2qN9 z)&Y+55xlyDTbzph(T>dMU+_o%-7$b9s}KB}DD+Ozwg@z8TbXUk9T|g1O>q)fUXjc4 zft|cx`&Zjaa+_o&{Ebh6V17S18*Z^g4_1R!5x2;+c&?r&(e0u8o_lWi{P1!SWk~@o z5pkG2!mrvFO?dXh@nO8p?4dE7o__9L?&RUA$uynlKH@q-;@DN!dG}@a>F^Wbd&2jJ zPvPIEC&Q#Z-aon)1fAZ6vuhJ3xid7$Ey?6gPZw|%G_x3ik2$#t|uQ!=Dxi?2*_QX>0 zrQ_$t&5i3E-zmOOVv)o$-qPOwz5%{~*Xyn2spmk8PdP`3e&q&XBPZn=_?^Ex8-qyb6B%oaKO(I8ksehUOqW7HlaKf>K z*6}Uk&m>+*oFAAIc*Rax#cHBA(v^TSa4&E>P~T|4^yoIu2@S|o+QBqar3uf5@ zJie~ufYFc}=AK<}uk`o*y>}voy zxE|6yuESiESj0@UO8iC@KH&X!~7l4eo2<)Hqn=q!UPz@JXZ7^{TVFdol?v+(`Xa(67C zM@#ESPloRvdww`pE%7E_sjg6aYrVC(;LzE$tYm&p$Hk!(oo{WBSxzkas(tp|uo_$1 z-;nNlQahyunIqM9*LHuRUnLDeTMQTCIr_3~WSF$42c5?&$O!&kO{=ZF0M{%Fj;1)1 zv&VeyxJRPYmb#@_{UaNJAex|b2o7xa2>=)sJc29EwFeBinl=*&fCJ| z>>bb!@jH8Kv(!0iDb6d&=>82}@P2y4nrPvh(I1GuP&~)Wp*mc|t$i2{u9LfMOW2mM z6=BO@|F{YwH%*a33_KYZVPhdf6-p2WDstlnJSjlR{sb-pdWdfuAeNKbOlI?}qJFfrPyY|08GXLE@dnQ;Fxv%j=f#EjBK;>W@l4D#TWf z?UK+jLFPjBJ#{>L;`hhzjs1t@ypORL;?Kk%PCSu#*>ldb*|WpbE3s?hf%wDmR$L&i zLqeB?9Nu5Nzxj*f)=|=5%U9DU80sK@e}8%AH;wT)>F({}UFlinDdj8fYsdR)!(8Y! zGnlP#GAhGcd}!Qf|K2gi!sDCIy&`qu4LFl>H`QZZpkEZ7k@$Pd-Vpzap3M6*kvEbK z@44UU`}(rOo`UP7gLfo+T!#{-T*p87B3=A>$7M%RrJ#~s&8>E0K2(WkX#%-%l1mi{ z=022^xRPoKwGH*}zi^V;u^z)6keS6O*JxLCcrXrt({dyx4d*+7ll4c)2nD_jcJUK4yi8F~dkOT2Cd+Qkp@j1Aw2wta`@VUE14`qR;H-&mTozvvRb1y{4O5 zu+;dQ@wFk<@D;AZ&xHR8yQSR{wwH2mv6l$o(eN>|>3;0C#)w13_EIl0A>ykK7&H9W`ia_B7{IXEKrFj5_7x$N5b42SFy`vvV)j^*^{#;WlzR`@1gsidzojs=dS0TrE@ z{KPEg^9hi>GU0AG;VLbG)3%(b#obp89jTC}zXYd7T_|Fto+`0YY7>s6KDB3fx!gt#&-tI!}xP{pIwcejU#Z~()OlVy0M0_BDz((#NFaG;hONVv7~V+u3P(cyTAsv)p@DqG~QM{cFr1h zy(#(auwlR9L!qc(M?>zG;ep`_z3ek^<|~pGCutLq4Y;D7CJS^#M|>0CW4>Xbp^veT z@n4?D1UxA}BgcC21(=I>NCsH6_UJMW17E4-_6O7web|3S$oZRit(q7b<4!PzKL-uP zIhV3gFzSs)qjp9${9Yg2z;%K_D8N0nQQRyR6$^=Rf=>9=INewnENLyVwkQB@?k@Gh z({=)`w&QX0{y=Ikb`TfhVpv(INIf!E&@gCSwE|;C-3cJ>M)_Wd%{_(VSw{ic^`OF!x2kcjf>dxxU zYOc>*Q{5BYXWSRuP2AtO&$%vf(!09~x(d0x*`Dkgcy3m7S8zY{JoFs$9mZxa$6qv1 zEMW4h{;l4vUYE!1`N#Xv`)QzhAPc>&-8`4Ok=qf3jl!417s67GDM$0h-HmpW3qH`s z+_kx*Vq@^~^Tbqi;i}`dau(=qdCTx^a?DQ`0`eD|G-rv-)VfmE+7jBQgcE zP}W$_eVOh$n6oIo^L281D)rPY1$rLI&<`Uza)W?_RcQJN|(QszPH z)vJTRuI|ITa0h+JVyf*{LJMJwv_;C4t@8K8P;rP@2_M2e`kidv6Yz*WO&8ljcM0V1 zZaA&|bbWOT=!+|HOHZb58qMwf5C&l{_yMcY3t0^}v?uWodRVj2ZM+5t<4t~k{)oI0 zc{gJ>W4GCnYI>EHoXng)kzSD_!K1+kz6ZWhXp;H zgV)Yi&gzbuj)LUOs+_Bh?hWqhM8WJ2vRB&I*vr^T*gDy|+m_fD+m}0*InFrFIqEsS za%{G5wZF7Iw@uIbHS0v?k<9j%u9k(C*_P(k@2s%=fXs zyniEJwkh6^yd^w^Jr0k@^M${b|2}+%AH##gx5Br>Q^V84r@?P_!?kY){(-mP(rH*V zjRWu#9+?7|>seqn%DpRtF5DEnC~RcP*NL&j+{9sc#qGtjdxY>K@1w)Q0P34f`gQto z^J6a$CYQSKzKRn{o0l(otPd8~X%ye9rCOcB-y8--$0Vd-D_mE2ePL6Kxp z-YXms((z(VHJA-|n1ig8SIVc<)9NerKlP#fKt3s)7Dj@V_<~w@wQ+?pB1FOUnZ%En zgOnrdd}1t57nf`F2?1dgJc&lcbY>_Ojpe{*w%0eq)inuC$F2C&wB^qRQ75jE*U9ze zda?{A-I`=e`k2|h#?7h489RgLPJO)ZNLg$-66k=hQN!BwYYgkC1gaVCqxW1F&jA5k z+dgJZmIPaZwqHqy$I%{)##%n^3$neo8`OHiYr0#yH%ZZ?qMAmB{!9IH!+!?t@tTBW zp_8#A`TCBbGIJd5Uh4_RU_5o`CSIp0@JSxfV`qSw_@D8A#!lqNd(wSrvAkIRTK-Bd zBbAf#gqSdfTzQk+bwj)4m(DJl)dU;ZayBB$|Nu&G0Z!Q7!Eh0%h8aKkSN zNMWg)+*#f#ZIf=I0sD!elwo_)-lWmE29-zWpbjqAIfjto6Jy2qc>bcgVmjp9;8!nX zUR@wjfZ?p+RI0(1o{i2`EL_D8VeWM}F6QnYq#_@JNTkhr%CG-wqFs z4898f3nVE%tN>j8n)oUFQ#c$92P6K7|ETx4cZqwUyRxgAD?8hsz0kGT)!yCSy~4fB z?RN!S3$hnx+Zy-^eyT4Gj3B7Jy@70Xlihh8c!%1~I0=%Owx_1RV$*vw zt|VNtmGP^nTlOYY2G`P#S;Nn|DWI~FbzhSguCX7lF4Pg)Nv&{A{zp0{9ui+s#cDf= z-G&|1w2zDp#RekQ&{7Iv7Bj>qQWL4VTt&Vj-;lrIeRoZ~BQ|CB*xxwV_#IxdXYhz! zPEU588tOh@v#4B9uE`8^fiO$RG}zg7)PMgT-iU6ehUre1{*(H1ukSHzH;lk%ZoF=k z?vUYk!*X$vSP|V(jSuip_(!;o#-=u-(dHzx=)raf+hLAP7Br3J`uJH6(hby^@SeQI z8L5%2De>@`O*k{ z=X-*^UMek=T;#fcg@1*e_|G3nI+WC#ocgV?v2m-kRf;OP$`$pZT1G9a?j=W7kt#_8 zc@BrggJMT&&{5K8=@C6azOsXRL(Rid31935eo} zoG6wgqSPICJxJDL1{m=aXaaE>9|x${#33Ymy=ubH)bJC zSZiFz%~+OK;I8qN@So69Y$0|KItgDey-KGZX$xlQ5*pq|i7D(e?{P0W;aC<_GNchIyq-z@u= z*WNU5UGEnl>lb;ac&B+k^;Gmc%6^<}b!0delPmvozHlyct#DO!f9lqJ;Y|+J;k3G} z`z(7b?hJ3ne9Iim*~|->7HgVyR@TC-<@|bP{nxrEb6(~rmI{_}8RI#bw=$MlmRTNI z{;`y@l(c-9@lnSA%>OeREILbV>lfCJwhp!-_QCeg?RD*?$kmsuSFMgrTc*(}Si59( z&FXCLXrJMn>8$Un?;7tO>sIKPn|r?HS8LBNp7EXr-bUV=z8k*HflUEt&=o8WXJTn^ zIn14L8nr(3X|zgI+iRUcH}W1@R%g(@O(wKj#KrwKl1)fzTzcFdHWjzQ%WOf1y_w-# z!y59a<|*4AujC!@|MHD*jo(NOq%q{rCPXc`U4_MB;#sP<&&B#;FW$=w!v!_*<_VAaa|C5Y~FKnh9IrD@Vd>4MZn?oP&A#XF(8JX#tdX}RH+bW@TP83*^M zvQAm8T%o?}Ep!*og9A6?j=n@#Asm(tNNI998F{5#RjR_7UMPIWM&v%6btC*+SrCN< zoZC~<2~O>4sW!b`%n)NP+)$r~cRfRA{HG@xzY|&u4Y)Hd87~@l6Q2n+gfMZLUM@f% zS%f*+orF6eRTd=dM2Ev|@Nge26F-;gN^Zd^oHm>_WaF6I8gATq-38q;JgDp9HamkF zK8?q^$hg4xBVA)j^4<63t~O#zvA9@5d`jj2z0gO{?kEj=To27xEIy1s@KH9&E@jDC z@@-;2=S7t-0(hiBMM4nEqx>8)jm4sl5W0)qxJ?e?VqaQ(%VWGtUGNkYFn0OEY8@Iu`gr1GX5yEzK>=Bh15zk>-ERFU;NyUxqGIm)SkD zN9Ik-bzVBvQqYoYkuufHVb&k5eY5&yEy?;Vt1`i&$@;&n$5|%FhmJz7WY=KNa1Q_> zPjOEPPepe{_hw=We8u(tjs8CaR|5};JH%P|_l|IO_(=3%G=?xn6|@&Bhw~1TD zuf=-eE#WU=EnyZc!X73%$GMLm%TMGh$|a?s`jNU@*`XYhPssVyTzOKQyieXKcUHPn zH!oLOD6N!x@?Ck5JotUB+F1UUQ{3(Sp9jeUE0)XIMvuN$X|zla7!QLd`z)t+iU6%xPn(wJ&ohSy|aJlTK2 zdGexgQLsrisSUN@RUT&<? z+n9I-nu}VESVsCpY9=-oM;pf*S8-m?u?0E;2kTp*iEv&%C$BKAH0?~@l|0!r(UcGO z`-FHxyeHfh28%z6XQY$TUHQJ;T4_x#{8jNQK_y$YtBsPICihSIK4nYFwv4>_Pn1V7 zb85k9>@4+=E^|X(mM_WQsqIvU$!^-h*R}HB6mqYLTIRBNp4+yOSdMe47Y&qUQDKnS zPuw7Fmg*~CD;?EN>N(|tQk8k~LHJNXyu!W&gO)QVGqWc-e{vd~s@)2}?IrCNdxm|Ba|<))KCTh& z5pKKN=3eDlt29yOP@ip7HY-Qr?rz|}{poLS$$z6hP+dMPos*78ha|36sk7Ww-orURC7+d7 zlUIkxL*>!(D6BVfWut0PYn$qr&YRAewDVg*sle>y3u!D};Q*h=!p5~e+_I-TT9l4pgAcbOMqobmibFSv3Vli&XBYWz2>v;QmfAE&`l=pn-`hfC6b}qIrw9mBtYTJ>u zBg<#?Sr=P>vrgs=b+z`eUd%j~x!$tTGAZMij92C~bJ!d*7t1J`@tb*xnPi=o_B!MB z-d8(c^?2RqwI|JyR@G9&@`Lqz>(AB+*555BEN#qf%m>o;rTv&TB5g|g#Pq5e)iZ1s zo28_+INk3WYa45G>!Hl!nWHm@XBM-Tv|h`)nsw6thg~z?t?jJsJj*m|hhvxHy7NzG zE%)c{lFXdO2gV0h23H4<1P@UGPY9k0{vJFJk9=HYY-D(JShR6&liYJ~$oJ*Ug%!x4l--%O$9eioXiC2CY{p+ zF($kbjthsFdE6DgfcJb$d?1dLhER+u@@e^Zd5|((F{y$&R2`{yQcE9~kID6whTPiclwxWL^>gN!rReT1Di@V}PU1h(b7`-*g)OTju4Ud?Ualr9 zoXtw~aTVz6+NvGYVeA;3vRA&v`}m-Igm>jS`J#MY*77!_BBhzyRK22HS57cnc|c$M zM0zBxN2}mF?wcGrM;=cO+AHi49)Oo0C5#aMhKIjiS|{nGBx$lRRrrQlwS}=YeeX7* z4)1Fpo-Q5PnuNi}|86|Z|7&90VBF09vAs}&e$przq#E2dLwH<;)xzp)B~`geow`_B zBw0nPSV$@)T_d`17Ej41W$kYHKrN{DGW9flo&0sOc3#J;r>8jq`sqXIBPm@>6^qd4Bnb(^ zRb~JSs5UemlCQ|At=Qq6Mgv*%1N<3obg85=NfC5R7UJ4n46Sg@BlS62QeT4$uLh9$JVir&MX!|!X!OlPKZKeMARY;~FWY|QGG)jR8q^>^#0%pI9?EHf<$ zmPE_vmM<(jE!!-sEbA;!GahBEH*YcbOYfcjZCZ=8&r@rp7JFUtb>COtzgqoj-K)@R z-|LJtTiVy=&&`F*Ma(DFo1uWVo24ib%QjcxyCy~z4s*7K|uwwAVd`&(NPM@fgp`Px~}-PpauyTx0V zNz(!Ue*bLZCDAb0C^$SkG+Y~`#Gl+<4Radgq`@mripE7f=+hj5)2(R$9z|2M0C5|Q z^*s0sAL7g=$D87p(yL7d|8Nwn%w^*hW3G@dXuaA^<89+S`m!$#UmHG$Px&9ZO39KU z)tA1J{^As`Wh>ZM`d&(x)8xu(Ro-!<)pcafcJg;}7pV)=$P~7G9XT=oNQ;qIc#phW{!98>x+Y!}ja0sRVw1Rmc~BR!{b^|zq4j&n z;!0sLBo<}{TT7}T_2IeyNv}O#9w*mRzEX}T$CO?40acaiN-8^-Bx;dkR1sP)f08-) z8g+%*L+yidzy`IyslVx4YT#ALE0Uw8nCTjibvvJ1S@~2MtBht|Wa8u2s}VIj$*EGRbW8qAeyBcD zXCzNg9!NA)zfqe|S2Uq!Z_F&%!aQ&n&%B$`S^0z8cCoZr()ykH^g4eryMJW7Z(L*8 zV7RNlrBBtH^%@ppDqVUf_}umJ-24Ho@dY-~)lrW>PTwk`8m#&4K0tH(r~GlSQ>L?9 z{S+<0PH!6F<317ppEywPW23)B*F{(G?`hFZpz$h2K8<9DvP0d8s>C)hMhycE1KoUG zd`~>jJtI6rJU&m@Go2|DVu#+c?$Yiboc)}~Y)5R@tbbW;nHia{GR>LItc|UgtXHgl zVwH8Jbr^Z?XvWbDb9#FEmb9&DWztIXt4vz)w32D}QvXgJmO4CjLF&BJscAFPqUoXZ zDjA<;bjs+E(c0X~yg%(wT9?$0srpny>ciAWslC#Bq<@rAIOBljfW?}bmAT!zjY-wN z);+{%>qzS{>q+bHSx2+#vGuv+xZwE9dE41FyEBk(oolFjkb95!fVWkkSzuIXTxd@C zSN1m3!cLy^iqNuvH?hzB*`er%s&4ov@o_YYC8_apt3p5GOQ3*3I~{t zoL0^#qDe4Sq(aM8VoG@?ibwdl_h;79l`iTv=bm{fyxA5M+Xu3eH{FZaDQ&}W0r1I@2$0>2jI6~{S zwKKN?>`*OcPOX>>dC6$^=q*1Zr*EcH?~SHHZD!&rVuAOw+h$TTDNoE7AB&H~PMqal zkErYbHvkQwq^xgB?5N#?xwrQ1?9W`&!m znFol2#H-A^CvtarsUOxz8>B|e_xpoPI-&nvp9c1jp^r|}XzLC3aDict;U;|auXJ^F zRq)687{0Zp&wc{^{yAuMYktw^z@|4PdNOCy`mkhl_;b-twc@w>H0Ke!itI=$aCa_1 z4ExEiwZe768$ugG;b1V>C)h8z54^3`uU_$9^*(n$ad&a`a6MxNT-a6A^`mR3E1aE^ zJ=OV(bEtikUE8Znv`(_7b5)sOy{%%3~ zg7m4WQ&azV^~bBwf5HD6ziRxdul=r5AB8RsagMK)iixHNW6HZ~uDR5gyNDv|$Hd^%j|NHhYJC$^oS~HSunB2Yu!{^-KEE0j8l$X~t9g zRxu4$`>UhD!f8G8Ud~)cQ&&@+lv*k63$!a>C?FO%l)OKg#f&MP+30fm=VwenCy?Vy zno654n=YA1@X5#N+%|G2X!GYM(qm9ML!<}NU8x~E$`9oaSj&pi8TP(zqu2PMP(bhr zLE#DKQL7=!GHbmgULoUrDQ*_F2sWd`IL0`NT6m*z8?~}lKV$x=$=69Gr4mvTv6=WS zy`y#}`qTHml>d{z#}S%(TR`n%VhFc3N8RTS2bO)F8q{z)sEo;C*gf%lz0Z zWk~nwX=RhlO2etnqbB~B&$%i7MR&1COee24ph6l&Od*yMONjQwUcUDw=HwdItgW#f zxUsh&wf7mcVMv}X3RBXco0l{>+cpdRW34XMu+b#XxS8-`VY|K6G_hxcfoO|2 ztmY3|kvyyMsTaWAKO8#}+mf?6r$MAa#2xmA2Sobfbaw%DtE!R1p`)S9KxSa2e}zBM zuk&B=UGx?374q%yZ1G%jU3D3<_1Pgu&@tLE-ciO;!m-f)n|+UMk8MWQw5%r97S^D} zW0{k&D5E|#?tt`R=|7Mc)6+B4hnNSMYjB1?OfQ%|KJ}+m<+c2J&a1hvUc7q#YWwRQ zuUnR zYd=f>H(kjPGR|2pSU#|RU|nZjYi-8ka8bN}Y5mH&IBRj%6#G>BZ_dTeey;vloyU2` zdnb6e`L=<*YUN)8CM)WX`AY_i2P=dthmYc+c_nr=X34eW)}ynSkv9{4<6imyprkq+ zEmqBs$_G!%h5oBE&Jouftp**OwR~KYfRHkWQgji-9k;O4$)qNF00;iCem^=G5B2j5 z^9+BWQJF~Xm?H)`yFJLJo&Vp@UD_+PmD|dqV&s;eNoRTnYJUO~&)w>N(;?ILEmWF zSuL-Y<72CuK25Hid?Wd<+-k{sg2Zzs#fRf z8a487th+_iEVMpLf_?f=c}=F>sC=*Vre0~l*BOf07E73Q(KPGmF05-9{I8C=90{=+#^AZleHR0yl_wlwhjk zj@RVf6ZC!l!cRcc+BpxOe`0K0Yy(`H!qE?+M{|D9sgP6tz2@ln@Xz7Nuv(VUnO`e%T)7p^SSgh>D|q}%ttd0W*oL0w;ZzUwVcbioH55d(>yDEPWtP#w6uO{z0y3X zq10EYFH*avbx#}4nV({wVrGG4{>ePSJT-kv`o*-1X{U+CY=9o8KS>W$OKWpx#hh%e znNbaxnv(gS^||$rtTS1YvVP9`lbZdob+7eo*2SzV_DlAFGvK_;-BZm|#k0h_#H-<) zw*)o@Hqi%s6e@^ z%wXfH^?Y-gS(aed^cR?kR_rj&5nnK6`dvLipBf?qWUDvS>tLK-tL;r~P4`WYO#f0b zHlk-+PTrYBj53WjWhG}O-%YvC4&%F&&8Cf}d&)y4h4Z+RDeoiop*qJj*VN6_#dLvA zZn8Rsul6r}UprGtQz6c-sQ%4#O7ps1#Hno0KIbAB+EK)FFaj&soBS)kkgL*pYCFub z#3x{icCe>9C!P_t8d&RFkBY~rA+Lxlq}9~SxqvLuIPwiEKm4T6gQGxmXIsPZ!|6wPP=RWE> z%EY*!YghL6?7y84oTD7W9r5-AyUu2?tp*wKVOEhW18?5mmfn_I=D*D)%|*?N%}dQA zGlplJ%eat{YJP2QM$WvS`XIGVYR%NnYbX>RsxNg(+Tyf^>EEPJ zpgxYIMbe6<6-%3+IzM$0;UQY3wM-kCHY)9G+L^Rv>C4k&<{a~A%UDar%<`F87Q02m zT#RKObcd+UR=8SL)vU7ia`vl^D-N&I=ZsM6C%aX5S5J4(bMG^+#>x9%;8_5gSST0@ zg)ZWceE_XQR&LQ~EE3baXO7_6wisTu=23GTZ?#hND8t}TR7MZ}IlPy437r$PSwoE4 zh=LSu%}m2G!*8JSHo?od2;%(}Xs0dw6w4XTu@}jKo07tN@}Y2Fm z%QNKJRCMKKt#3*dUy4=58dQsI#3^K>ot(mFoY`tARZE-qK58rvQ5!uQmZ)E2xQ3`9-<}_s#467 zCxX>Hj8^Uedi-nTWlc-9AN8$?Iai#JD1?lDqc-n($lcdeYA!{%DSC+Asgc9NN8$(c zor9V3Z4fmK$6m5xG3L6rc|=X*M%;>JtK1(0=@7Itd6Kv#-sUUvHJK6*0-IPwC~Rbk6?cch|ZX7 zFd2^Nj>FKcuiK;B4>xe2{vGVS?+ra*=ZykU{*7V1euKV=uBmPkT-Zx!FFc?J(=>C_ z@NxJPT)GeMsAdVR6B@(I>=D-sAIod+K7Ci=U1jw6en)Ac2pUFFv|ih+evo@9 z_s`t2u+km5?py;Jqhq7v;kOQn)C<)MO%6;6Eb;&5Ur6LoVb%mof5?B_Kg&1GSK3?7 zYx1a`-tOM+Wv->JO4(JiKXMdwJY}BSlo^#b)1P@7T;bEKXIY(XU2K=KE@TyFKU3LK z$+FnI(0m~MNc!CLS?PDu@1~bx^Qs{!ej|39_n7ya_nLR`yY1$!=7Z)#^vuu9F>{oN zz5nx<)a5zpvGjW8dSwU_k=a`1j@0dAHT zJgyS<;&!*g>v)m%7lNz9tHW<2ZzFE> z!wyG}MpwWC&d&AZodPVzm`Ipn7};98hWQ^KD`WYD_zGk22(> z8`59z`@swB^DBUp=n0zQq4G%4Z~=cZ2UVG!b|fE#<)B=Y6Ezv!`g3Z*uhcK79M7nA z=!5%{bKWp(DhCd5k}`#JJ5y<@wxEWtXc|P1{Dj$Q7IT>;%3`GmJD6f*;`7XO8k?G% zWb$zud&s5oa=8+_7Y(yDNu8?JRI8~oIQvD(sVQtd8!{6X$nhiOALYk%?+?Hm&E_`w zo_+Ev_NDjahw=*g!+*pl;-_E^I#2_5P};Ng`BB*SreAqpZ|Il5BDDJG9by1u z*>-Ow8iFPrEDe-q!1IYC+lt&R(_s&2!q?-aaUf0>@a!r`T3wxHOfz$QfXU`M}U*U(Yl4Ia~{y8qx}oP_6ViMOH5dMRFIcQFAix`8-yKSkFm zKkh9`Ol{&E?`)`5EPt1ee?bBs33+I)d`xUYS69~`5SO{);@nFedn_#P8sbHC4^FZ^!4c~QN2t4m#_Yn6W*8o>u z_S@{c*|%ZC{hWQqdCIxKvCvV#o(vviebz|paO<pp2;hvUe zEX(kkJ?7FGWirlWoX+^j@{#3#8PAzGw`1#DoGSca#x2WD%b%IoGqI+${+#(!=34f{ zr7R^ZEiJ7r@tN-|XV@9nvesmSJQ37nhII#ftIf9Ewz>A{SPvyRDmXrIGa8 zoUWtcusCi>+^6VvqY z$x25$!E)r4i{#$N%40>F-wb4GHG=xEC-dU|{C*`d!!+F#QKOthquLxifS&GF>+`fZ z*mQL|7!ND8WhM3{pP5clt8ZXx`w4Zi!qCc1c6mZhEvXa-4V0XdmDNa9eWq5 z#xjz&FTG2Cnj}tTuGA5v!60hO5hBBL@mryhFbwuzA!9+KhKc-Is4JWTGw~bviyNR) za^TO-Hq0mH(kWi$rhCnOmw`%i)XEC;pyzBC#Sm0JG7#(LC5RPS!ZiaROSVU!xyA6aTg^(Xkf5YiRsg6+M(` z;DIzAcNR5vHowjg>)&j6v+B)ikOvjs{4eiC-u~F$*qEHLIprheaS^B!2}L52L2zud z5re-Qz8k(Bx)o{^Y8*-nrUrchf1rrJh~LRRxTd?NdpqaC>9V^zx;wjTxU0EGyT-X@ zWKYZ9=RD|q>UiXs59eon)|#x5ASmn^S)ACj85fyD8LdX()XmVFt0Kfu%uX;W;V;5pE)-(2DxyQWr(Gnr8@|YgG|#x zmaxTV$+Nt(oXR|zSv0F?)=JwdTQhqTdy-vmUuRomdt-ZN+X>$4e)hxc_U`Z8v)%LD zK9|S!m+O`*-<|IsgQq~b;3q*-I5~_#Quv2R|A>J9NX2N?=-${4EZ%i_RnVL1#2)S{ zI+&WbhABaXgH{7~!54|$l6ohVM}xe(zK{M7?%$)vWAAtWCP9VOk^&=Tj8K^R>@4vy zIi@we;%X|*Tq!2?1BWq;+{P$WUM{VmXPzeM;cn;4dGcK_@5$uFm&ywmV)MzOiSs4`4ZcHhV-fy#2Hg2QxZh1Q#u?wxdtCAY<6>ik+o3fYGX_3> zuwkg79N+mMI^FAyYxy4W=+v|}++jZQv;G(TN5nGSQk_PGzM6C`$)1$S`=knL232)O z(dad!8B+-_vNSl!4vja32h+dkD@|k;)AU^nl+pD#7d~finTU$QnE3Vd&yVrjuKVWm zHMzTZJImGDKp0qYdc9CnD>m>6s-U_b2oVT36I3_r@*muAp>Sk|hZw{P5eLwf^YwKrQ zY+Gn6Ontn^z75{|pZ00?iA>Zg*sI$=BkNAF->~1dpNDre-9E#?} z?1psnJF=%|&&Y0{-7b4M(ZJQf<#M@Q<=y4n5m(Ih%JstaqkEM5k>{>wrEjfI35bDf zf$M<>;F?bbP6iV2IkFLT!=Hy|Mdn797b_d9i`LX0xCu4i)OfQD&Bs~j ziwS7U4km1I*0^J+&0I!nJ)JpN4*Fm|wu7(HLa*vc!0z9^0F*q_5e4yaZ|N zq*C1l7kncB-76K53*&1vQ{GICI8&agRg!WqFiUgTaUPTpb85F!LH;E7*RX;7?S0NK zs{?-jt9+3P*CyJ;wnTBFCZX|OcZfUL9z7sqJ)?qMBfb+7#K!Ou_VZ4j#tA!y&U=J# zl9?70fT@gTxZ>sE<()GAVJsvR5@NyBBC#`k{s&4Jz4nDc(3YIhSYQ z8O%XJ{2P49a_CQv7)~&CSZBBmN2w9)gDu8goSgl1Finkj41cl3+5i6h9p-P%;IMlc zzkiR5S^?jG4pAFDI8D>%0I`+NF2R}K&Z*YUV=Y5XRMRW--#W0E2B0|cm*H!ELW}TE zI>FaF!g;?zPn5&s{*n!MC7~+(i}O5MlTo`f+=gt!WA1}=YOFcp99V}xiy8(Xh3C4M zoUgGZba1VXP-A?{UFFkz^jY{F6fzX#Mr(*FPC+;;>-BD(LsynbSVwfO2IBFy6z+2o zG=fVce2mJ%$b=>Qxi(rrGva5(ThZ=15O)yw%5`y?Pi`Vw&NI_SmX1#BcZ-Vcn_ndc$XTGPCyPJES zYc2{FCfAMZ8`*=2d}p5XwDYXdZm4}{V_4jG1QUm@W2mFaXxZ9cFcuCc!K!FImx*&dtP=6S1Z>L*I-v=;xl;n zPh5{&uUR(V^8Dp#dY#;V8q;dfRTE#v9zrGj9|53y6ej*E3XimcVqQ!Ex=7!{dIcp}$rS;swoi|A?WVf=?veH@Lk_GF2pFnpW99hkUU}%@@`vB@=88u5TC2{;@ddk ztHDI{fr+pVY*STG5sj6misskWmiqr7J?Xdb2U3_PX&zyh=|6v#egc7&@g7G!m%V9U zup5WSwMWp4Nk{u)E4=tWshy9YnN|mF^L=pn_Rw<-2Jg^?=QIW7ik{RgV|62SS?Gr! zLi7GGVIfcTNBinO^lCJXcg^4EcewOE4owPG~fatF8u5W=R)=_%c-Du|)K<&fDK0@P=G^*b)0@ovEY#z!_l~=fQ98_wU4^?=t`1<#(NPop!Bqt#SS0n&4{h>Im!aYgZ%Jx2`^}-mVV(jo^}8N3svS z&&yxBzH|+6_jmv1S>h?-E$(%C+@6k}?~uUCb2spO25=K++)I z%PaM(^?eO}`RPvq*I(L@qmRO2UulTKJzon7bHB6?4&WUoVHG8fTdwi&yV9$DLLI2} ze#?a=LL;#$^B6(;5ze4CYx;#8kpY+Ku5eEf;KCF{+hrZB{wJ{Bel|`Z*F=pK(16e| zg9qUZbfE6vA?^cZQAYfa4sszKVu+8K#79r3R&7b`@FPfLjVqJ~Bi6)ePXzbdk2<(9 z(SaF39dPUd2ZYQFy^ea2_Wrju6qCdWWUa4qL{h>cawuFTt-dt~nsWMux`n#u=yI(@doGg`xC$kYBAii;(=;3I<>REspwTCy{IL}oi=<~sGQ0dX#30>ZU3s$JRnGkw)UxYxlPUbg$_w>51b%?F`EVntNJ-X-7` zk#GyI!21bzQNcNeYe=hv^XSl3i?0;_H0}j?d|%vB<~?K4?;L=la6f9up5U1B@Pcd2 z9q|Z!j!8iz$&@h=snLwPeL)Zld(uH2*KY=F!zu)U0;UDQQ%l`MJ@42rp zxU2i#``&h_>3rb*&|Ah^%KIfzgxJh%I_i$V=pE;7=x%@xP7^x#>eSQ`*G1O_*K_LX zjwoNHx?j1Ac}jYMZl8MxJ-`OS<94}6dB%9I5idN?JWo9@JtG2-bUE6NKf>L*5`FczysqQWebzLPPY_JlaHFu`81gUrkew1V{eR7$ z^c^73{ph9KBRf1KJN!v+c7oZ;RN`}-Tk7Dsw};F)6I^av5Ji6x7GtI{QHX~L-(PqI z2VQ#+v3%w) zgoT;VBKS9T`G~7+578)B%i6iLrcy$4o#}Q8Y z63*wvBs<>W?GoGK6j2a$#BXuYI?w!~7fL_(IMb;~za~vZpE@b&DLSY|d>jTP4aM9o&j zjGIkKKC^357cjf0Q4fhFAzPxegYG(lhvFFY`9DC*GA%QX+* zlVCkR!mmp6T{{hjeLf0n!@y2#d9x9RlH50y-&RI9@*z4pZ}JPF5IG}n3N9Y?@?yC$ z6tE`c-ih7E(WZT@S*%rTU2GLz7w2M)(K7!$`o(*#$Ot;FzY=5qf7B1x*Jw7f~H z$-WL12^9`y2D5^5g0q8`fF)2lP${s^zurH9*hkb3)CnBIgYPt+j zI0lS$0cK&R!e_#!h!TlM?`Lm#S9lbU@k#h`I2%lBy=eVt-Pji>(oRP;vTv+)tR)UT z``&BXK0@!cR9>mP_QbZlt$7vcW)cz7w&5Y5d0A~i&#!V^Mb!1X;LlSBr@5lIz)X(o zgI50rJgBblt{e~F>;mssE71y`yBD4A>G~=9?VRN=!5jRIFShpHf5@q>#O$^%9KEhW zH(`r$lW{Hc(>Q838EmLl<7)VnQ*`O8$O#A0Al0-9J5&G0GqI@-zIzg1cNsdVqu7IX zVR|(TEsxpc)t}LVtIPMQ3>R=BbEleMrk|19H7%Q=sO0_1g!&HM?0PW%ukjO=)_~U45T|@h15T1TT6N=(e_A9O{$nrermForZIp^=9%Hhi1ZE-CsISk}qkvZn)0Ro~s&~fGRVIqu{jbQuG>oW(g*F5Ub;TIm8R zi6wa*N`RbbgQ~lx@i8xP0TpD|#Q)-7;%8AcPMZrAN6+*fTKB=YNZb~@T>r(#HHc4M z?Kkz_6hwWz!`mKjcfZ*TZ(~aS$-JX@bS%u9ocBwfrhU9Cwwr$aFg|D-qHSO_KSDct zU~EvV0Qj`~D93#dzVveBQltPlmvv}6_6YY3R}7U8-3s0bwhgrnMMF6ugigZWhMI)R zvQw)Q_#*HRwe(T{VQzwr{(=5M{;vK`{!#vM{AsO!tbe@!Ki@0g2fh^FYVR8FN$(%t zCcZ`>-44Q#9_Cx=UFSXP`NOlwv((eZ+rs;sZ@F)ge?AJCd;Ae!4#;iMH`lwsdy3B- zh==O8{>J`7fsa7Uoe6vytQ#B>{4v-!_yaCBWGOB_#Di&&tiA=PCK7D7R|r8|AI>t(i(b303n~ zcr&!ccja3AmH5dCQ+d~RWp`=8!O$I_h6l>`%-VP8cCz!V{9f1iBkI*rM2vdA5tEs( zVOk9&nz18FBYW3`kKamaAti_jVoxSY&zRH23Ga+mVFkPZ_f;HRR9(4_+z_N%0gxcu z;K!C{dzLJx$l8p4xHOU}eGWPW&*Tr;t_A_y zJ1n>334>7Ac+E*!fL8NZw#IGZTg0a_v+4s*um~-KjIKj4+o2dZ?RH*rx2~t)GviEc$@qVaHW3E zZ-bXo;Ee|djO}mcp`*1DUh+;f7?0#1$=7_`OQNGS;?0k5I^=iCKazJiZ-3qawzdC| zqju4Mf1LLe&xIy=jq_^e*US&(2lFlYnYf*p@=No7kLDi9y#}7;B|L?hxifN~#2%CP z`o}b1`HQ(1bI;_R&9mVXP?>lei_fhds~pRY`l5zdBJh&T=x8|6#;6|muSU@#cq}H+ zY-aI9doK=k9BGC01bHzDXU;BaH2&m-vU9 zr)_RKo&kPsJYP9a%)6I+KlconP>f^HxgN*Obv$n_dUrpf3HV8V>HKWE6(cMR9eUXx z@$=MtH79}kE{rc4&Tski@SB@~vyYpf?V$K!C^;0sy>VLnrwP@`2xSvW<2iWe-5qec z4RN^eziW%vdnfz~)+VfEVlsv-v@W44@4RKGn0wfQH0KuH`ff9hYj|rT?0h8tK>Ss( zN1DGDL~*|MbZ!Gn{E~#FWVLY#U*RG<4^QdqXr=GML17>M1^wWzZ>RSA6~(5M_(JhB z(3x<6M_(Gh1U0ag@lZNJsV|C4fDfkmyrrQ2d^h1azl0$P z!xDP&UharL*)ZZXzMY!ST2uTv3zJ`$fxSa2=G_5Yj;wSbi#Zc5@n!mx-tZhgA|24B zzs1-7g-1IwesugcJpG`%$5lzFme7M7GZxNj<|K|M9#33Ce!D?E{Wa%$G_ETJ=&iqJ zPy8CaWnZEPmHUy2SyTW;HLoM`^E$L|YvOx14a{Z&s@zW!9z!N%!9_5TC9YCn@@`+zTN1j_7~E{!`#+XLnr zW2pTm8&h@Zy6cHo6T?&=kErz>cLbYkaP}3qwU~~zhO48 zFkx=OeyWSA2~`q0(2u+Ecj=!vFj1SM>xsPy2NPCMb8Ji8nK+qO_&@x&qEzuM!L!uH z4`_D${P_P+T zq*A{e^MQLQoL>|qOo{v}c79sZp$!qLp$gQ! zEK(velj^?@`L$NCM(`yHe;Y&V!G8ur>1fTK3Y`cY__L#uH8`Ik9959sN$s`fgCVU+Hw_gFnUo5>ra1vPyirl6izH z%C0P{nckCqQhrI#N`K4lFONrS*(S4btQRHOz1ZL766U;po0*$Afjv*R_HO_d{3J z8ueP2cOl_PIOhbYc1?UWyAZyK9b`xR;-X8@`EQH%xl6@yUx;VpM=;0u7`!*Pqe-30 zTF%-d=T}BKA7Wp%=5Xq6gc0$Vpw^KL>-*8OjrKP<036u-|c&ApRoD1nB{5a5rVTdfDpIpGt2a)Gn=Cy18US$@e9z@TU8)h2=u_i&_wPEKY1j(0ghzsXmQcPqW#$S=v;PDRsXI! ztFJ!KzJ(p}pgMw4+1ClJ@#z^w(4MpX2=$SbztU%3iI2ttT+)~#$& zw?sE2@?rRJtReTekf8I5l=lmS-s~s(Y|&Fi+PD7f_?c))gX5K`?bFn1Q_-JAO{qh3 z<`plcWLnp{8hb;@a@;?5Bm0bXi_5R;XXN#dcmSV;AOA@D-?De^q7SNl*xrker`~Pg z2iKu<_bgh?{%x)%qti^Q( z@H{%vi=A-VquK0}n1_v9dQS(Say3^uYB~~_Y-4}7_t7)*QGN`|HC}hhf{-6N$8s0chgU%|IKPI%hS8qTXYKh26st!P47r;PhFF~mi2_+ z%(Tw6&b7p2zkR+#epK$YTzmG<7)pQYj{M!|Ovf>DaT~VK%Gg53~+8)odD!?7s-6vJ~h#5@xFu!6HvzD?| z&S!0)$prb&Xl=lQsx_>33#*n4U`LZXSU2})M#!h(53&wVlZNpNe@I8ugH(ppsN$lio!R5+!=yXdsNS$F3o!X>P;emf)E1330z9pU-O#mq2nkUWkx z{BMLNw710R^dEY#H(@{QXhY*q#LpwV8+$jlf_?Z-CLEe?$&LwU;pNqf`HM?(H3`~_ zw05=@lB`|!j_j?>P9BVP>8R{<_MGcWI33)*E^|ZX*38X#e4WP5vvt_zvR39y-n^7~ znH8f)X1cL&;Xg+(DUvtRvE&^+Xz@#cogUOz)Gao4Jj>PoIbPcV%6X zN05>~&?kJ8z|{QIzqpr-*vuZ+kEMsE_hEk#tqFM+bn;{RXY9ELWfrklY(@Mc&q$pa z?d?^A{$Tq|Tc(Naf%HB;yDyUX7xqz_nwiedv_tr!ab|jYCcEw}Pk+iVZBp&nWoc2W4!vrfk52VS?I_z(RvW$K_S7Azhf{;`38N z)?O>a_xxzQ)vjfH;0!!yG=A`S#i14JvX9h^3SW`>s0wdkb6ZkjL4|r1_hmJ&etb2q zqV{gmTA_XDGf$&`dmQ5#O$bNgS8@V-*j$G_?p}PoUo3tepPAA4)I3g{CuUIg zN{(bCt6HK;VkUM0+0+NqFDPb2PUBin!+T}ZzZOV!0d@_MvtO`(s{EYT0g_#m4v3wA z?mmgJgFRTyFVDVuPsg5N&&jP=+Rn?bM)!U)_e@Uoa(V75DD0Np^Y~LtWo47;*xd#p zQA-);x)#c62KHY`Sc=v5uk6n3o!Q&7kAfjv!Skw_Ju*MAL*`@Iq3l5PP&x^E zq-?wN5gad1UzR=}DJ9>mov9tEBUzJdH2Zz7rhln@(Kn-;pPf1bFOS-(CaGqr)A58k zn{XP>u1;N^dOGz|Y99LRZ1zfi6CA%L)dx?R6Y=)C5bAh1H6ryw>XFoA?AUfGEBor3 zYf>M8*CklCnx-4!5nGS#ga1seM)xlv|Hk;+oSi-+eKmWX-jTj7eHYgH2e51PBlJuk zgT?Q_bT|4C?@-1TnZwz&{7zOm=$+Zdo}h0+%M;U+c-|Dv;y=-T8ZW_1+h;nlqiL8NH}^KIn-8$>^82|Da{K1@Wklg6Y@yp3 z*N(-uVkz5!O{oWVsPXKbT^vs`>as6$bu#q4*0H|Awpe4dit?V@I>K zjLFm~u2WnM;k=IZGd5!<)?O?}fU7;R+4SOnE^D|BWTx+U!aV#czAyfP-7e-7Pa}*e zew%%v2D8rV>BY^Ne{=v|SnU}1kw2OCAe6txqr|u@nlF4{@m9u#XRvq7Bz(c%V{G>` zuBIfvU_5MLax0WwgK|_XuEd^z%c6ep3GAQToIMp9B@as0CsZWF891nytjjpnsd%g0 zmAsCiH9s_G;$pP$LkJDgYa4Jp1b>bWXu9V|yP#gi2zal=pUiB07JK4x^p9HO?QrUjjf~)CEcqZdsxrNf0b{F59kqu@3=dh)eTnV zeqh(-lH3vbBaviX^UI;t-i$NtN$807HWWGdac&}O5j~u1O!y_cfq5Q(u*h4j+^%eC z_DM#oM^^N7*BLPxd}M7uk3~_PNZn z;PL)U<*A-I4%_;(#Cs_72&+LiXOHpe=_k^I2m_&*yVIvZLseM|^k>F&wxv?3M)b)K zN2}h>?&x>X^DIskrB>2E-od=kCaLDBwy7hKPED8(TFhF6byD33eNxvV53gWksBvm( z*%C&}-Y6T7-o2`9Wm(fyQ>g#4)W1{1;Q%8zzL>fX`}+gzb37cHpN&<13o>jww7oL* zBYPDti*%Uo>7$XhL)gXfZK(AX%6lJ{fQMOm^HWBi(&#FkGnZ#BWwh=Aw2t9e06%0` zoViH2l1wk8`rFt7_sQ*-I~#ak0ll7)J2lq_%AJ<`G}i-b_BXUw9mcJ@#(KbCPhmFf z<&0t9hWEgmv7fPnb)bLtC}D1VR(xfAZT!3VYiLuP&`zg_iJudHK7LYtOKZII7!~#qauc4EYm+6(OtJ-(cMIWZ{JMrhb5|5!#4g>ZVx_$Vi|=40&JaeWZ^z@Y zH_y*y=ZS0B9ph&1kH=qZkK)xy?c(x#vH`ZbbNT9AsJ21zKKOYoWMqCqa&~em-eU`) z+R2P84NM-&h*JGz6LwKG{s2C;S^@0CnI@O%uNtZJ>8N3`uq>J@TGd&$YMlHATn5&30k;ABMf^LVAS9vlr}X z_+Pfg-mnXgjnUZO2eI$^u-L<_DE)5i)7Y3;Unp%OoOCq3#rN_vSq5nzdO0URp@+m~ z=Re6`&F&4o&`WNF0$<1f;~n~y_vfF(nsH_R9Hip_)+rbaZC;IyYQKCfbedIYI1908 zZA5pihWl&HdL37bFb!J&J96wK85^z4a?V?Q02?$mJcFTuSdh|lY4N6 z&V8O63+)ccosv73nbXHIigh`ws*i!%SLA+U1avw*+2MTmaPBU4e|dxWb91wKH=eyV zpC#od`1Y;Hwl)K+>pDuX4bHG0nLUsA6LbI0y@F&Jn7cK16DeGo8_e-VblTS`)2rn3 z67!5lutuKNF8cvJtt9t5Q<67uHJdkYMr)hhk5=#&Y5l>Q#?0~Vh6cAEy4_EdWjHxp zO}K=bT|+Jd8I>DId9Te~m+OIitCOpoE6HxhC1z)~D!iyku0?Kd#@^O26YZt!tJzz! zH)kJ5Yn+CjzCHUJBk8NL+)cm=)gP`T%hM(Fgf2(3?v-ssPoh#bm#G1NYKQjTmHoe) zW)EfCszi1Ldg)K}G1j4>{>VP#A7sX|H}~UcB#%MQA7$1uKEDfkUX)p$c`fs5)Ni_t ze$a4Yjb*<2BxwE(u3kZ#eV6zPGfQOBA;-G(5Dv&T;9NVq7sopI>NaDi^y9KOQu;Ts zRsKN8!DDOWs=_7e<=W(0(ZYRz{}`}jExVfUpe5IU8}oCUfo~6N6dz)-*ptQhI>9wM z#*T^|$Q~li!Np_2$p^vR>G&d*V&^yrUxd!Ay?h*@2jgWuz;=zN{tL;o435%}xdi7G zorcbL6=Ss*vn#ypz4sS=f!$>f=;$P5T5oK~=VRBAFV-Mr{Fm&rS|M2h?r{`S@*KQ6 zu4f10p{#%SA>JrUSu5)o{%heP%h0IjCcnk^b3Oi5l~}jECw<&&7&Y#Po_aiX>b>9& z^5@!!gw7|EXbTOH^9}K~u3Nk(nnPtqj7pP#C4a;(V>)31974XKGf8(QXZe$AE$N<= zrB(7UxnfSppKxWH_Y#Tg5w!3%nap{ZgTkB;e(RI?;vNkd% zI3FJSAY+cL<1OO9!F|7E_n)aib1Hr?6Jj679$~cal-Q|Ie_i}BcjVWy7yVcHY1pz~ zU_|JOe8>E;SVdao8|ItQcS+D!oCQV?&YhV%5joqDwr#^6Ob6!VxA_r1VA@OVX?laB z7-xQt6`ZdjG|bk|Zeq;%Hx`H9lKG4A<1(;m0e$S3G6OQ#qB)+Qxsg8n1N6o3&pb>& z{zkOL9!S`lnYHYjy)Zo|{S7_E`5YIe7jVCrHMQrbKSAD(rXT+h>yq7truraq_g$X+ zlwOJFXi0hta~!@(&qhz3K-|w6uUX4dHI+!UaweBf5o3G0CS%xLGsi|YfIBjS&}8q% zf^aie_fxv3v5&op7CRb>co#d_ENa2rZ!rE~W{K9p9^Uzivg;#x)n*w*)2u*BKjS}<`u!*IM&g0QBWN(!!G$j8cs-W%8_>lsh-~FWi8T7o z3LrU;p2=6NU_Ax+4#RTRAJ364Scdn7woCBkU5Uo@d3+@L_XALPUupWA7pNhvE~bG5%{=FS0i}cvE<)?8KksKW0UPr}F*rLAjV9d(eJ_b-7=Wsgsex z&*W}IMxKl$Zif9L!M?d`vOi`&&rZjBJSzKW_9?7Dx3EIs*+`r=*qN$iH)ghFzR%2$ zj_5&e#b9*1H*yE%PR`W!;%bVqujO;{atPnL~Nr2jx? zU5&;%JvB2mo;}5%P7O;vh-P~u;fmB%sq<48U|Bnhe(;%5KeuP97ycq`(1x3^f_J^t zJ{%7~Uv5Tdie6nCT{@PEr~WA0#3*+)9MAxr} z-hUKUX8C#cp(p(yTK2^B2Ur+)q+8KvK94=?E(bbS1D_i*{qV?njM4RRSP2#b#T}XI zz_TUxxbx_DJO&@t{Pd;SW%$*WX6rHE?NnMuddz5al4)o+OBqd!=kvL)*pZ%OwF=FR ztrDw*3~kPiKb>P25C)?Keh`}&&EKpNuZ~POjM0NrBOdT9+T#?)oqi*zpL{ey<0St^ z;~dHUQ(7lu8W_2n(H<5dgpxb3yU=y?j~_`q$9T?Yd`h&p;S~HB<};?f3VmE-+8|D% z4z}=SP)<+61$Ze(aFm@%DQMd_lo)P4p!x%_P&11?uH zH$!7fjTm{(V2@h|RelQhd^SELegXaAM%X3R<6ZLslsE)B><0~=L(o`ogIHtea94gd zHrQtfm#`0MOV;e$BVRSY4Joh^?Q;s=U9X{y-iQ8pS?(x08r z`e35TR~Vao1U$JG8}CKgOQFg$7#Y4O+Z&DXG_H@xwxyT5XZAOw@M5&SFPLdH6&vMv zG{YB|D}5JUV!bmLuu5PLJiOY`n{AqD5*-g>c7IE*56;vh(HaPtqSDWAwDswMYG%AV5#4DN>X(HyS(>Gh5R$0vdBbCa{sELWnj z{*v5+9?I0tWM$?9G)4z)ip@!ORoR?6;ZM;SA12vbFTzi$U-3=av7D9Z{>AL32e7%` z&n(6M^muROd<#8c?P)$3FODae5j31$^DyGwkM4UNdhfBtZAnjasg59ruJ|1vLch2c zwz2KWozUnqH0H&TANPt#^IeAgofA>~t5B!r7T!~8iSW>CF=jqYCb;Zx8s4udOIN^CFM&dk*%cxrvZSn?A^SI`sa z2F&*^s#CNX|BgBFZx{uBixJdE8AH7(eg>mat>A+i^j#8L5*v+;Vj$r>=(HVeyjQFi z{p5|TSo0-z$QO{7H%4=o4q|U+`C6`}kNE}s_ceMqx6|M2nd_CSPQPbCb_p8r%Tb@` z6h>b(hEtU>k>8=eFBv0wj-Hmrt-2EG5=ybW{J{9nRP@vl%nP_beQ)~W^reiL9M9fti{D1Gw8oQCSZY@wZ{}e4oylLvMM$C*silm2tYX&G;?#GkS*gkRUydV; zO1+MC=oNe(UQfM4_!wV~8LS6787Vu3<0QO0J|pheJpGn2-X&O+=abfQ()j_~(dN`9 zW^I(E*sdhKAE7zrIEpdUlPO#y`w0V4Uzb{4f4wjiw6u7*^wk^vgS8t?0w52@!e4}1c;s}&|KryhQ(6=GMec&8^RXl&27AYwGM}v{Iz0sQ4H(vA5BlW&0e3HvKfV=V2U&FuwT|=a*PJbR=&k5~d*|7O;}& zT#gIC$jPiH_aXDN#*l)1`aWadgKx2k$#3a*Y^;BxgKxnfU?+OtE{-^d6lsl>{fipl zDS0SbVORVrkH@><%%Tg~8~rMK3bcA#8P_r-^Ra=c}e$Qr~VI=5IB=H4Er*7!VhtM0|FS4Cfg(JkVspJ?B*^bV)jeQt@!7{Tv zvm!GGd+QgB6MfGABj)LU$Z95IGj9>z!6x$(R+*8RQIUn_KlDuBLvvIw^(~&if=&7b z{{Ke*egtWGAGV!4=-1xKxb|(x`MWsYnz@M{?{)B>K2YTKT=gd?j`r1fm@gm24)h%T z-#19}Lv)0>gr6y!_C&9Vw%-Js&r$fDosMqNhwu<#1pICa+Q^dZ;>gyX$i=a3)kSA% z30FKGOWviqyYX9pn!d#tENGw6&zMJ8%LsD{tKnYQ5!+)+JC)J@0r1&DQ0{BU-U(QT z=A$RE>~Nk<)|hqDGA5tn+v(xHMwmg^MA(D=t;S6?SEXgmoqA~xu_z2*oOEbbs}hg z;H&7h-jukRKHU9`5)DP~9feH#gnsILdZ{azO|Xs`N19!;5zTT(LVHnMQatI zdIf87oJHN_JJy}hA#o&{NON?OdepucnffQT_g^BpIt%}&sf70l@(CLPe;I&P;Bs`D zHaJ}iY$9Q~SUxq6V#VU0#V@Lhal+KMG1r;~P zAHFjEl3Xl>|K$c|4u8+exHFkQJcjjghvDON6LR@Hr1FvI&-=wR9{3wp5c$x*mwz8E z`l>EKOIfFEnf1q@;k8r|A^Ib3fT54GI}5wcrkd`9cj`ccW9(bvzQ?^+0tko zuti|6bjEkHH?361^>8XAZ_sUP;NtI=M2XD&g*K9^CWvoa?!y3`$=wjF*UhcSB841K#5p(SgZ z9Kq9e96M$@L~(j>JehDhUtXHIII@pD0Hr?8=+p?j6h{*#zyst9vj9u&TEcdCNeXI> zGyAd_FAVu%)WBXYh%j%B~{R9^2 z5x`;sJ&dV%nJmB}y$%oObhbX0?3TI1u+SfqyD)bVR{Xx$#{Y#Ke>kJI6Y+2O8Vm0l zq;XlUX1)eGb!#k%$K)?VBHu4Mr9|%YU9|GIrqfxPkrgmJeSYlksMnS zL?^8o#c6}2JcJaR;04$Kx@m~4-5Xh256N3O^7N>Py(bM7{Ta;>(t5M=DfKKQ;UqML ziRcRdLFafG?czyv+Iy(+bD%{0Hnv7OHla6K105z2kHvSy{=x?EE71Es zHa|88jb{pDLLW0eH#YVLb1SXpURVwmyXY1)yPvUetjH~6)L;%W<2(FkrV&0M zyp1#&0p>k{Huw;p1O3s&uV)PATrl$_ar}(q6rN1sTCpYfrV&0TOeQGyH2z^U;zw z5(Lv4*q9q&?`w;^?S=nxZ?v6Tum(Pk*XSGhk=O?(;h8)qzlw4AP58s)@}>C-F^v+| zjU5y_n6dn}*p)ib`o}S9e?l~0`2xoFFJpxV`J&2cC=G@SLDM$SzVM|R4!(1>e5 zyT#CLjB(j*lyhsO$E(b10CJ5X+Y@&!Z8GmgGuj|&G#VY2=0p~jO_X~k)f5b_A`YDOK>cj)3uFJ zfS>WT5Y5kv&0-wr8#w4Btbvmm5gvmUH43WN2=ODa`_PYX!qfUXtj3o^?dKCtA;{;Z zH7(zSP=~-`yij^kY!|e?1rME{!Iee%XJhkk(fiW8_E+El&l3Jk zcqIR*X2-z`?#}{2K}z4uw4r-+7Vo z<`)>xmh5{0PV_4O*PuI%7mvZhq%a;T97hR6iz>~Bj4;o@ZZHErwuo`#dGueGbM<{R zGO7{l_0(r8Lsa0w$wSLAPovhT^?g*N>t)cpjrOEtRpB6L0)zC1Sn5v}zVel-i=)+=a3mI97^ zoVVh0C7CQGR{iAt35Ud5fB|hHn{pR=&L=|qCo$S2`|@S1?IQUgU+FuL*bheX<9_7! zqws>Ek#F5=u~%ZRBW1?1hQxTnhhX4Dc*AG#hRH~w8R&c8@SlrxUj(K~#xH?q%;iq! zd9lUlg_;$+94@kg^Y#mSV#=TozL|GVlL*qIC?sV`&qHCNn6JmoWG-2sG!`w zfgYxj|5VEH38ndn|9g~9D+atn7z+;@jbwZ^n*Z};Bpn}*JwzBxcz__A(VfW2Tal7C z5c=`In$-gO60YK^FFMSX{IB77G2uc+W6ptVo)-O228JiWOM9X5bOX9aqWv6#7SsqT zt4)umI;(J0i1ghQHe>PQ-)N=fwASMM5^Tt`pt)}&+r~`VaT@eD9s2u>|D=eMPhv*E z$J|Yh^ew&pf_T&OQ={`#-b|0anELmZdj2JG_4TKb?0zf%HWd6Co_H_ihk-vs!6eNs z9SC0C2IXE0)n0*i*BhMEyruKNzSF?Nvk9VM`E?)vcQ_FX+Q~dSop@(*JSW0dUF+`j zXzsJG&ZH-(SZDCXX=n<^A*oJ4i|kJ50bdYj=)$pQ#34HKv{6o;xVE#|g_s|OA!=S3?;c_q2Yke6h`g;CVxZdkf+8F+C;6?KR|8ewZ zKcdGn5$I0j$)~{iW1a}=YPYZPpi-YktvUy)TtMG<0WG~Ezl{GX_G>hKZinxdFlL{o zA5?@PtvFT@{i_Be!L{fgHAEk46pjCA45%gg*fepd_#kp* zaO7Js6k2&E_7r-6X3ojNHUc>_94_!G*Dr7!8R?uOvAez2nI^Woo) z?*9WFjv?r*6{X%HsAu>l|FO}#_ptK3gESNEjwQUy{W#u=(*%AaTAsigK@Vg60i2L2n z3QYYYULaf374XL1{4W4{+QaW0j+z5@>fdyKEO71wSM3Je+tLO{@mIUFC$vNA9!8rS z4)1M7JGNjH_aOdF(Zdep>Ofjrt*t(By+}i=1GnCje;qKPTBMWL)JB(t%II*F;3dpj zhpYQ2?5W6oHlGKF60sB*l_6;EwlJ&&+5RVdr-Zw0ktgmpc#uXye#iG<13mB!T&;&A z{Z3ei-v4WaqifIzex?tw`tP87-RUSiUc*eerEswy`D?s#1?TSx;%h&E>r0~JLa<*J zTTy{V%XFSam=p25Z=jYLgfIC|p)VQu*mSs{!xxn}0porE#PVe{{`ItfMi+7e=*vhtgQ2*e%~A@ z>>DU$4)irMqPQ>7FXr$}+Qqj#6D4UhOx=E*G5 z68-6o^cH<8D`KjJz%H-a}cf&(4M`QRutgKssB zcvln7Esio)0H9<6T?+&AD!itZRkbYsIx>U@M-q=db=pTb{Jz+%DDu zouwUG%u$4JJ~DdR0g2j~w;efli>@@YK=Ha^x6*ZYB(8$5yK?T1#-n@1=td0nak>$t z59wW3!ZDGLT^Ei{MfZMwOq5zryjHvOqs^-}H!{cjN4P$M44bp1kcw z%%eFvf1Q<?(X zjiNQjgMo2NTInDluNIPIQL8ni71e(G)57~kN40l-BvXA_U-%&1!g57^yEVZW=@-@c zvt2Hs8u-H!WgI2@SS*>4WLCVSNi3F$X2=U0^WbJ#gqOlyT}j{A2?mSjOW)WE#!D7! ztt3eUQGuSx4^pyVJy)CHnbJQtawqB$7hS^>^G{KdDC`%G3ag8G>SZQK?~ryam< zM|3YqCs`E0%fTUb!7bD_rQF3MnJ@hXlVsFd(qp6#s5NC1P`j#CrPt`XGQ2|P zYP7yMiu4<4JHm)PxURynCKysZ;w9B1ZKMXVwCYUFNHdXsQXBlzeeJ(7Ogv{VLLJU} zCM?tw%`lNpBOWBK6f`K|tF)f|h!>vL=b1Q`G%IOY`|ws*`$XJJvG@J^iQ*`h@Z9mF zm(`8FRlcSGy;slN)Znwrrl%^YxMc0

    rJbts+nY_F)^dr`wZd9oMBJ);_n&(`K$ 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 literal 0 HcmV?d00001 diff --git a/TekkenData/Sound/minus_16.wav b/TekkenData/Sound/minus_16.wav new file mode 100644 index 0000000000000000000000000000000000000000..98306fa669bf2178d1285f9bd134d83503c3f540 GIT binary patch literal 247852 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%0A@`d-f@`KyS%x2nPMZ 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≷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¨nA%g74WIWYMayDC)!D&WGz&UljebQ0YIyUudOlSym=UXIWQ# zXpMLtyU2X0AUh9-JBK_cUi|5#{uP!rPivNT0S(Nb)KWfY4Pau6eA)VBsf#@9gM2pg zrshr6rs`4$;PSWt9{zhWFg7Nwr-P3IhpWK(e#hSXZl(#2*eF;n(~_q0HF9R^GWD6F z2e#!rucrsz2X|Y-R$63i-r?&SNca;i;FnCu7{iGw&w1I!%>6xE>9Sep;wRif>rjP2 z=4vNuvM*mq%HRhuHU+)^N!Hnlg0;Wl43?p5?%_-u*?=VyDH(r*0`$TkaydQQ0CS~3 z6Mz|gZFg?{SHbLFgYHe_drf4*6WpEg7u)u+XmB4;&H4W8#BS#>PX!;(f|FqC^>|K* zw`~AIXJ;`rCNUDsaA@LT;(h{?PyYT+b^wn!;SE6o2gha1{mt<^y#ZqQIQBT!l#JXp z+~GTNOA)#+U(6f3K_5?xrbbIrpQE3m?PDEczNjaPJz}&UITrKjq47u}Vt`}QjgCDd zJUiTo{w=f<`y%@}Yp?K<{Q*y*N&J3`@X7Fza1qYD3G8b`cy!pwdHx!*h6aUy34i7} zkOmHTHGC}#^IjO9%UhqoHQ)iA{RroH66d=^cos8(FYFBWi~Nk2z=Ft+_%KBA;d#Tq z*(_3@w1YsTQ?wnarWMh>oQ~{apCED(TF2VO(qmuX_U*x0(i}?%OW({rWncV2ycu83 z>`XeVn73Awo6v)=LA#6}*}I%25qw-m4yqZI7av{meN!Iq77J(lbmpndQuv2zIpb%N zFC^dOE;$5!T{H6DMLz3abfkLtnpR@|6nY>tK0hyDTAd;Ns4UxF;qfLi#@bR4(q$fM z961$TL=m9d!L2r0JHRqiRqG z&rlY^l}q$=v9EG){%$JnD8|y4htj2=lB4@8OxX3xKX4GLP9n{3+!Y>@&bgnrb!2h2 zyDNGr3`!kOj9sL7PQyRo2EKje!4qp|b@gOr7%kNt#d2;OPw3gNInTZ2{qUE3$;rQq z`&CQ%RWb%Q;B)mFzCaQ1H8bAsD>?O^G!F>+2K?mq;K}nb?H<*Idcpj2DD@}^doWe_ zjlW5KgF|_))L%f{+T)Y-Ck~QV&`Pz0S2~r=S!Pm3Qa5SW)G^FMliQc~Z{zL~qZ5qIGC$8dX}OTVwk7HfK9Mj{#y zfzO!1Vh*uG?alcgpOKo8lF^NRSO%=_SI*V>#6P%I%uig2UyftyAG^qHy=A;bycBP- zg|oewXF*ZkHYpLKhiLJ;QzX`t${{0E@)QZv$>ij0;MW4ryAN(Zk(vN55aTW{aCO1G zc@0{m=k3q(-V3uq6FLSB@5>&y!lt|l`WMRD@rfNkacU%8Dw)bj&0w}TNjB-^_;mQ_ z^7#4K6;e&_b1zkp&XYTCN7J;K>PQub_sait^cJbXi^zg+LlvX5m**7qC9CJJ=yn`x z|Dl`Di`IzNflUrU-uXi0GB^1apjqedh{xawS7zqL;3R&+!dZhYs9L=D#ohD-l3OVO_K3n zl=v8H#p;su-GbEK9x!zOj#Xj1co`fc!QJ{Ho?Bve=}c`Py|pk;=0g;cTa+J_`6`d# zhVwOJC>bjI$POP*o}$R|JxR$jQ(>`P&zzSu0|xSET!H?>3E!Sn1#j+cWGmihhWrD6 z_4-sv@)nmRFG{Y!ba@g_?oV(gy(zwws(9%i;d{7bT1h&4`Lsu=570LJj3?V5Pp9G@CBm(P>dsSRjQlYE<;nQG4o3MevK~)zOAxQi6)6g_&!5RX zdNgl0h94*6mGhT;n>+x|y8|g7(@C#xr)aCVPL60L{2Iim7Fj3xaLD=rcP-(urNzOy z5d47Y+{ka?i+5OllyhyCe^0XfGJGO?;g>WY=dD|~-HEe(1!t`N_(tyJY(3Op5Wr`*I7_CDGhCCbUdsm>G!v-}^-@Jn#GyiLxcD)ltp%3tsW;UFdLp(MDc zd+|5_f`i&h(#H$pRvSYRB6I-yWL@&iq}fSFal9+R9jpv5bD4R?*LoOVb2sC@TDyzE^agXpN$4DuW(Nb_MjFo{Wh{W(k-<+SLdQ7 zH%t{SFOMvZNQZAs4k6`OUw~h%LZloPz|wHuj%dxFu*-12$bFp48OcUH)v=WiVrTZA z*a}0D{;Vr$2)~+4$q~u!_Mm$VOX7v_rSOvQ7vxWv7XAos-7VaetbIkp`|zv%i2VI9 z7_$f)!`bjDxZENzsABkJ%1LnVAW`gBQg*@5pC^COc_OqG|5^&~(`?pQ{FJgMWeh9M z?no(`@+W(Aa8lHTFh}E-icvg50lyoDxvWr8#Rzw~k+e>MR;>TZcJMz6umY1)|`I0HM6!z0n ztPN3wV2m9d6>HduxW@m)hPr(<3&OAKp?iM|W|t1!3#Tr_o=I?*a#Eqr*y$eFFSR5AIB0HIDH)x%Gi#1J zu^)U5)F?or;l!SLxTtn0YO28Kh)rIku_{So-~17v3z z&pW469;Pf|w}BUu+L4j6CA;2t!R!4rF={Df2l+H{BKa-XVuLtA57#AbPHfA*=6|p! z>JDUmJ?;9ySM1!FD{v9$v?B8<^Z`x4w z^~q>imxz8y3Vetze+aDZf&M#=yy|Qn>gf4$R@FC(K7$3eA<^N}oPBN@#|Tj^?eUvE z&Ys0X$nmugY>#p782G*oZT$dJb82b;J)jV>^hLP*a3ZSGJ3HPQvaL!shZSLGzlbh= zIifuk1|X}iAU9Dr{PbIqsdGefMYh1Vw}!W|KI|ZPyO>>$M`J-+8*WM7qMOi=%-GPz zMaD#KlVkZXKD2wV5%wlVr)H#1WHoz!DEGqX@VIb!tcPs&aQ7KR!8gM)RWw|Nz4&T{>mujZWY@V2;jLKd#8a13 z)=@sC45Eyr9H12Asr$p_!k3ZvwGL|x`7LLs%;N54;Oyj-VcfehWlM@`{El8qo>;|B zCH=zhVGSFEm0&&6_G!FWx_6~l_+WOlFM!Ct=p8=b?_G$aUWwY7APC6;UR(Nz3yKx6Rs1eZnB7U_l ztVis^s^G31pGjz#a1X2X)4`|mA(J*BcgjLyyK<3Jqg`VA#KDwzSY1&&u>pA@A0@YP zdoX4?c(M^GcOD#ZG{*(R&)$JdJdMn-2b0#K-A_vTC}|D9wDVCj@(Y$qzBhR_QDoX5 zvjsURr<3FED111D?bLDECXr;`<-0_jN!r1B=ZQ&E$x=BKd%+}j)|`wyF)XPyPd>t) zk!8^@D)Ory^rkPqFzqAqbJAWi{jLPJJCIQ}13CEClK*E2Sq^HD6E7k06p;k7t94=h z`tro3;n^evtsl4gcd}mCM5J{_pXBE0*Wwx#aMsW0J;2?P)G2( z0o3$f(wUzo#%(dXLA57RH9zq$YseDbDv*~FV(o1)R(8}Ovw?hT&$6nk3_I}NjHM8p zz6%T06!zw7LF{Sv*fHW#_F^MHi{z$!|C;|huw|2Uk98l5qph*M+z~AvO<|9KGkB~H zfz4Zirf-0pulcM5E2mLpe|wUWDK$gt-pGEmyov1Y+9mQlKC5w5U)y=@q3gJp%bThDH7^_A{IvKVQ_?np=BC2q$ufv^zM9b91&U^uG`BTb`lxy(y z%3QAueuu%nCE(qrloHshhT$XZLt)rb24J^(7wgppN|$hFu8jy+4?htOg%iSgc}H(z zaW;lGK^4}8dr;~jL%$M!6)V>gdT=RxgYsi|r{ljUsyzs^`JiX$r@Ng%CTCYN$PJD#Vj7dKd}pI$~5+D7*AQx-W(UA=b|@>MAaS+ z8L+!Ni&gv!cJ;^(zP^o3W^3R(B)n8sEu1Br)FSq58$cY}ynyVs&#*T~Q}SUvLm5P- zxD;^tHL_3*A^UhcxN|M|%Ik3GonUcxvf-3WD22xTAh`P`TI9imN@N3Q2yRxO+; zF>8t1zLnSspZj9Uyrcz=pZ5XB=3uX0ND&V`Nw(SX}IUeeJXGcKHiI6_gb;~YXoHncz!6h zpUl*&u)Kd5n}N@5S!@ZIKbcHoHDiB(@1GOFzJxf~El_@~93f?0RQ|aqiJYqk#n;-h zTfo$}#HTGH(s>nLuNBDmlkmdJ4qkwKfid`a>FB*k2Azp+n~Quf5{q6_){li3LQec(4-r>a4>)f~tX&bb`%Ku-vST?a zlv)7%2xCcFf_J|oKKKS$0%}Ie6VH_p2}3tdK_@PUAK*-5yyO)l4@8a;ANLVuG<0AA zvijGKU(W<1Uxh9-2eXG0OLHPDTEkX5k?)`;@50wxAvbpbbKf97{&{rw@=%p~pam_% z?T{^2;(bnrGNmW}?l*9GCh_z=+&b2l)cFiCx3!T18c_ODzCqH?8_5%CL+MPZOJN(x z$d&NbaBe8vi_pc-!TN2HAK}!$AaiHOV%Z+s$3`gad2F4(6DP16FUWqzD#(tcB^lWk zcoutu@mr!yZgV6ILaxPPj}d2Z!nf_niQ?4Me+q3Er!` z&vTJlFC|_ie^yztgf?=1rAhF}mE=29nMX{>Xt?J9tkA>J!#_`2LcZq9uWSJx<13ow3YY#jLf|k zU-uW>J0?5|9zKK^opH{dypp!;q}-&G2ghqu?xgHQ78ns8ik|*H$4c-;BpG?61ml#R;~p$nlaWh0Ik}`c+_#a7t5uHN1K?kMq~eW4>)Z)lD+;dt z0R~QnX1(dOj@S9_hRwe-cF7^gK}S+M5QnrKPOLTYUt{@@pMMo}@-mdPSgasYRLR(V zv3pn_)B@@|i`54Q!O<&3I{h6h&br&zSckiWc+>4b%x-cW{fR}a3OP1DAyd_9Way0S z`B;=J9VJ6|hYBDKo+GFI4$AMqUsZfF3yEL5geF}mp&(I|PqVAtAhOd<=h#1?a>Aq7 zeC|ZDZjdlHVIF$q_v{?Ilsg6`OicJF;UuLv`6?^0?{Yynn(S%a$#$uI@fNd2yglnH zGE%NW1GGox-R${vC*N5J2$lU!*H=@1Wqr$GH1i$K`m{UoIOQN^K5}^r?9PQKNr{Q> z9kt-L%KttRd3_%HxNU_GUj}=VlG2e6ESh*A@eovHHmj(6xjh}UCkrXF6L-=2kMU0} zqy2@+-zUBuCCOI`dH<&KyHeuA#GG9Nmw$2lG&DsszJz^YSLl1hs37`rQzu_HLi<2q zBfroVtY6!S`8z}O&k3-6s>ADi#Pb&+I;|{ut4mOBk!F$8UCj`df zIh!6BP3*d4^E)Ve$)_@j(us(M8tj3W4bPd@j;_RZrueelM7%r$Kdy&Nm(2cLD}l22 zqJ5CeUx=22_Z~*Co`k1s0C4#gs|_y_;d(0dG;wUx@VwMPdbHJ^_u?ZvM-;4Vx35DD z24WSPOU&d-EJ2@824LN76KRVjyjWxhnA9!&7E*QnaC@-!L*g-(gUQ>$xdd$B^(b%R zU4N9AxXs{r<8agP!|=+d(0`wW6PAN>77yP64{Z$>+<=`e7aT7KH0cP~ygIxBJf8>d zOKvU&_4o@p{1*Ck!Ehl~pH}0kcHsXgD8l}5Mr`WovC|)go~`1^6?}`XNv3A|4Jb_t z`zYP!6Xp8`p0&Tid3awddb18Iz5My|Ib6h+AlrU=yaigv-imdvBd|BFq8xJNFe?If z5$n5!Sl)}|4lIYaazgY9H2THZ3q+j!fIq5KK(XQ~Wznj#up{zcVD+!~Kz~8vVnJZ+ zIi#|mkk_6JK8>_DA00Rnd>nq;g8jZK5HArUPtH$7L!M$SLo^r*W({R$XP=B*d6XO< z^YLj_BTi)j7`uZNWZwbR$I1Jf#bMxeY+|dxgsEWqVIW?(ScmceB^#wEr6GBx2PXDM z)*Z@sKQh?%WOtKZM0LE!ZYHmT=iNE?HoxEC&cRWV4$+R0l+U0vw-dq%bvW0K6y4oNmup}e3>&uxM+HFT)`;bSW z3{vwgsPAs@Z9VeQ46?V%M^PJX={~rzsC7Ls@Fg(ub?ls#kc0zBz#EXYCL{B{NvTR? zij;+8ShKXY;{xRh>$r5hfXtRLnu%3I6|src$D>^?s%tB-ybQ(0)tM--nn=5OQVXWu z#y)imnKmDCuWZ=T@e~UdCGkosJ}Sw(=ZSA!g0)+?s<_W|__WTGJnXRJviq?^p9eQG zAi);oS|;@6Q*hCPSgy{8v%>$`z=v}e;HjTsHyVOO+5-+f-0{pISdsc+CmsYJ?#tPJ z@cvH7yq(C&(klD{maMvH%#S!5cN4H%I&F6(1lgl9vo<^(dhea=qT3MqPz#(d&hHrd zb0O?nZK*+a=1t)JPGW5TK>sbq{%}>X!7CqFf4JA-7Wv`0|v`H?5jG8(jN-91RK^h^oELfoI0^mW^Qyg8cKwmV=s}lXaREX zn%Hn+MQSmp6!DZng&N06UWPacW=^GTL?^iNC^sk^`N%75P4D-<_;;>W=O@(Rp&G5LNwA(kP_mK3J5V zbMkF5 zrd=K>x;A_9c0|wq0PojKtX;40Ut&@WiFgS+jZFrNSCdJ6J67k-NXMU&?RpkRwfqb8 z<&j{2^TYz=v)+~PBetnt3Ch2D8eiNgJaQ3o{1qb-v@mD$ksB%tIdW52%Pt>s7pw)@ z*pd7=w&tz)={K|Y{B%ZjbZ`iE==ZS}ZeV<`xqOaSIUa@??MrpNvk_1MF@| zc{27mYcUGqi@f31cKg7Sii;bryYZI~&YjOjsa21QtA-M9VNb4^lqc+B7-2*zX z607)r$}f0ow&JN?PmKFo^v8Kb!VM?xy(^r%4N-EhVL^Js`KLd?zVd)B! z|0Je1!pN~H8@_>n%RN(w@hpzD@nJG%C@y3-g`~R7T)|jTR>oIkJ^TP7zt%FtKcPwO zq#U4VpP4GG%zOguE)d8QxI+A=@()%+`x;5S*b?&FZ3%2<7m`C*Spw*6rI6vCVZZj~ zWY2n)On03)whwBL)B5C;?8s_`>3E|r!gsVL=?(Pc(V>wau>r)jt{exJda-hTRN17jke5=fx&w-)6 z5_^FlK-G5n*Us)Kd#_kSI*Ab ztjNmAex%=H3mC{f&tY-Co5G@Dw2yP7yiP_wzR#`I(jM8 zwDpmd@54`92>G}k{Iq{~ptER?=h+v-FA@D&1yA#X&X&{?UfPb*fTyY=7gyj)rSPLz zo*#F1rqr*Y>1`C7a~^vC z2zKS>Xtl31I^(hHe+MOtrIx~8SB_|%3Vc^&{F>q4>&keJCwgxgy2mN}`#D+L_9$5^ z8sbUN9_Vvo^T-5w6jS*vEKsT7Uo3VXKH%Q?6~CigBzLR!=qf`Nx-NJvW)k(W3Yl(k za49;}mt@4+AG{v?8z{R4Z@7%^n-LFY3wCc?1_oU~&pij%IU9_Fl|R*^~iZ}vsK6KnJnaIU7vy#3&Eli_He!tXvt=ll%6@sGrUMH7o*J-Und z#~j3i$_Fc3(MojRDcFc6^Su-vxetx>T;f?Q&Bx%@+wd{X$Cf>TTKkaM|1G}zVpSf^ z{nHXh5t-4Av+dyR?VNVpj+Ic2X-(0@2>5-0BHn)v31K_?xXeLT9^)he`~DAoXyfu& zKa`LOZh9Q*@eP{l$5@d^hDJegx;h_F735(>X0{>*yCd$e;9lx>>(LvfOELGnSDL;$P9I}7TVHfTJ zfd|0PGsJHzr{7Yn$P1a@sg(Ee1#A7r2G&~3mn8f0C?u{IS&i9$%dsaYcaaa}PAGXLAm?eU(2o!eo}a?9S3FTU$a+!`{Wdvv60ZECv#jhT zE5k2%C3m2Oy-&no(`Yqvn$?fi1+zPW zMeOH2*r3Y;%|-DyhmhV$hl&3=g}6-;T;cnS5ifd#c$9Vcvp&OHIt820`&iuGAnrsl zCt6EVg$UGVu}-(7JOx+FL;TtiJxwV+ zDKjauWzXQ+P%Ltjh)>_jN|dZvsY(!YksE9H736@EtYu`gInHOMu$~d@y@6(sk2`80 zGrXJH%jp%pks_2+N^R>x8H}xPI5BJgL0;B+*M4y7@$lXilwDYqPp6(mg8mD(lZ>S+ zpVL#GXI6)U@=8Odw)6s1$FGhX30`Sb$@hQ;RNOZcA1k9|<* zBUqeI11o_*Dtj;%B16I>fqGE??qr`F0{@-FF4l7cv$1q7$3nWDY&s{2|2j_`*so;V z`5BAJNpjw0#Gd*%dtY}(!yD#e!qx=W2af{HVYK8su!KELX%%YYbjN4GhUye$ksgev zYGY^vJ7}LKXV(q(X-LM7TL!M!1V2s(IByeHeccBaE|Ty7>yKZ=r!x@FIh@a{c(EE| z`K{;fZ3{)|%MRJSp)Xy*$ChB^i_n-ioJ~z@8lNOWIuCKC0eE}?;#bO2-@SOR6Ubiu zbLi*L*T@22!DD~G_Oz4et8K``>%rr%L#snya%DbiDMlhqbfh$;JWElWMlJeQHdH>8 zFO0&z)O_wlrGH0b6BBD<2OoX-`YRmt-oTi*h5)^*7ONjEj*UYtUPAzz}nV$ zlj=~kwz>$o8Npa_+40+>K*kRILfeP{S;eZy&w-oC(b0H+#^C=MLKy%b?#Y_Xm%z|A zz?S?)jgYDpTP+>B3`MeDPVh4ktYqs7JRLs~;js!?@dGfg8{W@n!Mn$t{i--IAQ{1e zOGJhI46Z3IY(4n326=QoQtk|_T2sI_;nV{5BVP`Ft>Ef6NVVS}G5^duuN~OVe`KwJ zj)$q^98$3CLJ6$CR0L_})U1?DM3$vPehqWwHWs5xVEHld^E)RmuSWttz|$$n3mJJv zc4hf$(^Co|`IdK*a0Q}8??MVLm|6@^)`NJq8qu5fWQ=%+G68JV8n<7uA6!PKV96Ca z?O#a2(bQt(iK`Q>#hA5WH^o=5@wIeul^^3>`-8DpjBRa7>)7)yPGbf+ST%PCq4x2ZiNkU0AAiXl!cTpDWdbrWtACRyBEJjOH~3c>Z)AJ) zw9)t{KO+iI-pU1(g~V+wLqFR9hdB(N{*#!lVnA#SWaDmV#bc0y=U~-Y1dOi+;y1HH z?k{A|`-{9C>B(f9H6aoTB;0lx^=`ZM1kZwV-Px6OAowO+la01Er2*1w3*wn1(>~5x zga^Re;&`0Pb9^G923PCxWCLgKevH`fTKxAs&%R1DNk?$K0h0Cu>|>W1={Fgy%)qaL zVCp^itnZ?pJ6OA@wG4rT7?k2~a8JAdU5LGE1-`c7)0DW421w1-;K2_Q315c2rc0sa-pTH^dC_#T z5RsKgEXOS*1=2$qcZ5 z6!<;>sase-jQ<9)N?UuFb#bM$TLbwLRG<;%Y5ZBrYg7h~QxLwB2@i1?Kk!X>agyXY@AlCr7}SUFhLI!NX1<(_ey*9fO-~!)r4sbtW8pD4cH? zzoug)`XY5L)MP1|x7KPYMn!o)hEd*2?F;Yh2ag=;ax8AdBdy#Hl7H9mlAwyi*sD-~Wb2q(g=;f$sPebmDoWdBs4q550t4w-c+i-V6 zItwXxDp?pNQpOlaHR+S>ekd&4ZHEZc*Y7rhYH}g z$;}$D?0k|!3GmOb+v{*IxVakaoCo)u5uAlg@dUL+_MhXlp*X1Fs=sQk5j61 ztje(lrJB?0N|Jv_8y3m_l0Z;EF4o~l9?VJkgIp#%!L`+Js+D}N;`?*TRPbmJlBL$^ z_2$#xMRaJT#&E2*6R~uC#;U2stmImZz3YAWcn_q~7U-GJ;caPyblR2Z@3$O(?}+V4 zc@|o*9;n$rtbK>)*tA z@%J5+pZR|;9CIW8uMR0AzzU9QkaxeLjxX@5P6S)u<*i+vy!#5=RPCt?7p+QpI8>4E zYDmEKkmH+#8qwZ5_<}0q1FFQe^4Q+W5q(h(f9$=i?5yOxLzQ`=I%mqjfeR8Jd5cl_ z%kB4m9b57rjK>iu(O1}#r$XD_qr66G0^NJk@#K5RN{}NMMQ*-`?t28A;7;tyt0^nc zP$WYyAq&);!2H1bSP#1*JJ$)+gb$ZTvMLU>&5eaIH!+rp?8$=99r+UFvUjw(FBmSomyr&k~z@Ma41j-;yW+HRYeanMKi*SvqmF4tMiA! zvjcpz?s6wy(sj@Tt-YQL#%nG0I_g?WjveJPQBJKv;H~x>);g_;Xw(y-1{2(8JlRz~ z=Gl2Xu>rpO9lZP`xSN6vJ+IT%i%0K9S1*EgPz-sY5*ozIP`0sX_6yN9z5qjKV-NTU zo&N*0j!EF`Jaqq6(8%3b4o*a`QEo#wqkP}SA)5mo_737&Yhrb1OOY=7CfQWGqUXFx zc?S#DaI~LkSQ!^1MQz4^@FUiZegBl*$k&IM<)iT46y`huzAHG$Pmxb4KfiPGt2okk zIq<(JdY1N589^CO`M{NN=)j+08QliG~$GVbX z`fVt{V6c8NlI23jgI5xZun112qFAoI6w!e{paO~s`5s@(CivP{cvyD8yU%hhf`7Rn z+_8w`#D&0^;;atH8@el03JOsP3)}O^@ULUl?$2(cz2MB9LM=I04{5h4pXaeNb%S=i z3*}J0kKV*KzUuCI4t&)rgQj?L#o1qmFSiAIYhWEN2Pe*f?<^ho84D(dLS$h`PsWuD zSdY_lE`|7(vt-iV={WHUc=8H*xPc-aV+oXQI=I^tiKIQ0u|cpgqf?LXCQ!-NjL|E> zcI5n1e*7wA>AedLCSNcwanN~!TBno?{Eh`e!9!@q%h7wrgULez!?A0ym*8C1e^l$U%Fm%-j0vAI|=l^d#?vstx|HN&=96}welcGb8@RL^G0a>^p~-4(!_ z@^1_FgrD7!0AC~?qZu|Tt!-`WRy{Xx{Pz*8(8Yn}^k7s3Y`loBdmI19E%;Ojo$opl z@KNMV;e+f?!j~EF*^eoof?w15e=IuVAUNOKaKp~{jueL^J~+(`m;_ zxW9Zh$DtE{qpx14_36>tb47FG@hXcvQ5^~R1tj3N;idzfCLlY!cWiUco{sc6g`)ij=OT^D?)_76AN>1LFe9GQyO3c^ z!rw~p>rP_*wO*D9Kz&#}`rvy{M(qTF~U*F8> z#dQKtQ>ucw4R(W8q2)?8w_GKR$$%y#-#f9=q1c=q#{%JUU!AaQj*0#{2MxAiEKVMkvmVp#ms)S25z_rOj4G=dGK0UdL%)wb+K7m!?cF~*E`;~9lSpT z_d8Ab9sTwQoOKV`Or(i^56ltj;t)=nR$N@Iuhb@!_klcoIZ)OnVmGR z@2rl0OO7v25f5#Emp?4bkV@GWPz97jUB53SS!Eo<9wa~lj{Nn z4Y6!?0EfFn$p<2#jdZ%#L@;_bWhwI8Mrn?%G2}A^CgC7(CdrQD`%M&+L8(4fE z{?Q#<^8he)n2Sr0w`2@4eIEor22(!=vNywv_JF6yfqLbaJ{9~8j(Q%fy$F`15Vw`d z<+77>dLQ{K%fM6b1c&p(UyFdniXp5_sYhu6r)-P#+Xf4^xaM>4%_e+WQQA{pqbR22 zWyeQbbFDG*dqbXU#+eRq<{r+@Jq-LF43@te>H}Zy=6Lt(jz08;Dhv;O;ON6x=tO_G zb~ku)8{Xa!iMuwuxwcy)_#||t0_`nHQS4a?SbvJ1?Sm?P%NoIDj{i<$YzAN{=s-+N zUAXKcP`;8-zbg&p16xb;WnkehS57`YqF z?s255J>ch7X8$WZ2$GdQhUX521>c7v9>DsEj7$1g(jGM|S7xE*r_yz-)Kec|2R;JKYyh1V9nSEV!WR1TyM;LutNA)2AQ zBVQn+uS1^xnilUP`s55Hg1nH0{)q1?XGU&p=UPKqit-q`ZBy|06>#`%EXF;+VzWfO z>v-}+Bxa49av%SWg)bUSiH4wi*;y-;1No*Hez~&fxKA_sEx}d!0QzI07)zNThEE(#HVHbH=HpvVW?Gsj%av$Yk{6IDE_16M#n_$yy0aSDZHr@ko zwa3^J%4Uky#mYwyKA6)dbc$uP&lyP7Wp3)QG^CkFSN-&6Y zngI(^B64ebj*?Y#A<5oBc@T^dKdp_1S{rXo4Xodfp}jupG}tO|*r#0#aU(cyJtX62 zxT7j~CM~uc>j&=VyCVFzGCFKkM-{5MYxh(0J;e$203X<5I%hy z4PV~zzZ}0#p{=*TSy7_n@Z_!ZW&?7+VwIQDTdlF4&zO7)B^$|Dyo+7$W%P0&#N zI{v!@j=U2cc`sOag7fFlg|E5tCz`T$82^JaXZdvv4fbYgI`C6IWnpM`T9ORc4q;(a z3Gz#;qH?3B7Xxz(K%a!m8Q|+tbnYk^Zuey4Y7rNIR*6`%TJ*Fjn!jv&vQtfhA1^=` z-i)mBGZ=joi^3&r_Nk0rPB2ZJ@ZG&w zmXDz4?nb}WE`C4qkv~_fRsKS*(%Kd6EtrovF9cqfz@}LaYsiz}bqlPWU9ou%L`Hib z4log~#;m}{NYeALrhExzZ$YB_)kWh{xjT858enY6c}Y)&=!Q~_sYnUXwSgpwBukd=CiQRAIp zX+?XEHn7jlxwgB0U^-l;>M8^&2!?#W}8|NUxuO zrCBz<&h%EgZi`?m@KpHO0Lu3e<5ZeaOC(O?8YB6uv+HY}(MDDptp-zPQAShVg!48* zI#O)a1C-K~B9tt6jIOcXL~Fs;Gv`Z)v6_XR`zhbrH|}FB(v#4u27{?Rp!#irnO4}K z8xp_K91XZJr6Hv%MHxRbV@pxIt=7CKX7U%H?*OvjCa`oNWh4?~7yKlRDNj(!Q^cQg z1L=b8Q^>R1k#LuTdkdYmxd2`_AC9~n8Cg3eEkkl%g5LWvoOvpC-tqA1Df~Bs`xkNL z3#X4tCzTCqJ^XPyva)Pb$0%oh z@l538^{fVxuB$cGSJ7=#;kB`70-QD@9-g93@2H1{+m5l;nD-{8VlXsv7`}iBl)2#O zN;DX0GKzgW06xlBzYksa7k>Z3Y+fMK(sg{k>EXNC;JNvr%6XhMsz9J14|*So7g<%(bHO#Pw+`D$L^^;Qoh4B^*!G^;mCX8$%o(v7l@C(7P#r; zXts<*W6SJxVe#jDe2N6`K%cu0J4_W|_8B4pn*qVC-JT4JsT3Z+ji%fmJM8;#?2q8k zpJ17tfsbXT(~3Xlze)U>=JaEIPepsw+L}>F=6$e+zsqWy&d`E4v5R$v_v`pN--;FK zh&0fFw{%3$l>J;f`C#PvvAk^>wJL5xYi%VVXrCu(sq4^OzX1nDLsYg?zC-fe%x5Fi zMZTexP@2V#ht5Hw_y`Su7!pSx-uW86dkJdQ2+Li4EO^pstAVQzJKf@bMniIPaj0A# zY*Bg1r;~v=E7=iZtVjsMXK%8f$Ti9(q@C0FhL1DO+Q)nkWeZeOYX}!HCkx=fQ=q5g z!0%z$65nOsy0exywG6#0RrltrIS%6={Yop_f$oVhuX$>Ym4?ecyS8J}l?A8M)*H};R zQEOzyEBo=0FZMm&Fpx4VI+V`{aCMA}SDB6lc?R08+Pn@=?RNTg2yONxmMVF{FM+=| zi4adgV$O&jQh-v5HGP%QY^xI&rG0RlQQA;C;In;)@szwXo+3Hu6DY0hit{O7P*zaB zW+sH&!sp{yuaxWVD)y^X<|{pUYztyhE<-+@D$H(E=D0N)Zx?3;c^&M18z|@%P#&hy zz{DgXem(<-7oqvCgXgZs7x}I80DsGx@$Ep=ULb2fz9&K1NoQsG4NHsSK>h&sq$5Wt zAtLS-yPKaMT3f$|uo7Nrq9N%ra1V0T+5g)3UR73ZI&G<54Gp5a$rC#}~(vV01> zcnoV#Wvo5rp%7(=IVt1nz8efF4CRo`HYe}Q3Qfs^jxKsq7~g6cWCQ8xDvy9yTI=&L zvO-0^rH58SW~d6iQT@7JhT4nsoa)L#U8L-H>ws>fqyE7AkjSsrYgqL;wLL1IhO}tOY^xK-cp!PA*AS>ZXf78 zd}l!(%umF$&J}_86mvUM+{OJ`?^FUvF3q=omn1gx4zAw8T}50?vW+R$IwwzOf$t|k z3j(oJuz|GCe4mEHT>wiIuX%>gF@BvQZsaKCH-7z&mG>;yuRuGlu_iW!Lilks35{Mh zw;b$Mt+w68n@h3ws)CbTA0k@i0oSiGPBT!JG3}2hE#YCbhRQCQr3$|vgjy*!&8}6( zV(`d69@-j=P(37sGO1Ire*~N_PXLe+( zI7>MPZYt{H97XZ47nwofs%(y$+3QHjx7^%bM<>3?Ooy5GsIx_9LT=8Fhaoo@ExKF? zd8|0_axd6j2}r7rEwd4j_MD^UE#11&*63N%kvrp~cn^v%zlHo4A7bB9&edrY$$T^6 z3k#h6dXe)l%YP|8z7iU+nDa~VX37?}ma-1Z_7=xgzJWT(&-o?SmVg7Q!D?B?|0}t+ zl3JEh&oaKh;CcPOob#KgX9M{2BeJLbrMn$v+0E}g=8LzU!^FAWh=0}HT?5=N+W!Ajo_qD zA}5KL%I2v2qne|V6vc`YHmCt0PeH9%i;8B?fE_{HEd<^>G zXnfYgu*MC7@(c%425=m~aUlQc>|l2s!d;_XtmymDDCw2jYu;-5(D`VT>w7Zirn*+o zaPOZ_Yv$4(#gWeg=N7uw$y=`9pVNDdz%pmI|B~OU_@$%rSbWV0eNDvqMrh<_XEEMH zyxUf^8Ce`;Mc%@H+mLZ2yT=ytes+xeyPBjfjzE7;faNEck>hS= zjlQM6}qfdIT9 z;=aQiqwa34PYS{(vH~@k(9*I~WGBrIEa{k&A}CXQS6;pgKtFQxE02RUWm?YR?$&-t zIXR!7|8sH|8Cl)aS`(F(kKzTbR)bmHsXBBN)aK_I?LS@w2rtN|IJ~SFI{sbmsQ(1{ zcW~6Vs8=yQMY*?#t0@Q1>MiO=MsOfIztwW}NjSmgkM4IC*H1-5WpXW5tEI1ay+v(O zTk>*7Eh*rv4Tas?i|{_3%g;ww|y1rgs7CAs*2|HZE;AG+2`T>(b* z`!9})5xnls7z7J;b>>g^2Enwf0(MUCz3y73*0F7xYxOP1&u;Nstyb&xysoLmii7a* z?iS&5CE`ZLAYZmYjf5PH8YhjrU|;{G@PC54s=IVeqpP_Ru4vXmPKHWm4l_8o5o{Tr zXq~4)wX|MYrUc94u?9_o4?(QpSr9AAT@+|81?(2(BM263iJA+q3IacQ`Bn@^e$ES@ z6xE^H1(R9%CHxR%3j?zPXZakg2~*XAEbiW%?hakkQ--;DcqWglTjvWo$W^=ao}&Dx zYmypsaaDMuo(N~v7xhdvsn^2abQHZyHg>^z20ocMm&A86;}_(Y;8(CINEPG?HZ?bb zUd^MZmX4xdl3i}`EuBN~rz`TI3r;Tm13iL6!G&PdXrX?I8roT-g<+mFxDlKf3|l>d zwyQjS!__M|5{%!XR*PU2)arc(lh<9%dP2~zHk=3MRV0B4@}(zTpq%0V3w+LUO=l%j z>j|~Y+NqYS4VSt0CoRy^f7467Ulwa&p86c2{~800kp6`KNsc1Ow_ziyu@&s5a9;p> z_bu*@@hzGWW;8Xz!U~SX zCJfL~-@2;vx++ak@Q@yO$jUMKpZ}%#XL5JTH?I3L@-6R-D5LUursIG8C38mjnCRe0 zSCTjMKe2e-dF*1o9?JnacI-5kz8qajRN%LSlM{m_twL&#&ev+tBV=YQ2 z?xOmIp~6kgxr*EZf)#@sL5Q@88^Eb-d-k6}lI{`Ah{}q>iZ|(bqn&EAe(62JfBTbE z!a^2T1cfO)p?%f_t>Q1LUsxkaRkEsZQRfWn#Y2Qg!Yy$Y;ghc1eC%G_}O3;HE3>AYxy-e~khwBd$pgRbd{T{j9Oex<7#8}S~K#s1=+ zo9?&9Ms&zypN`_d#*gf%F%%}Nt!jg2My*L?gCK{tL(Ve1JqEj|jYO~?1+9G@wHVC6N_UgB0MRy3>%|fFQw-)P{?oE5t8O@5u zPrp^aerqIcjCI!T(){TT8wp+4bD9~AitteoBwk_~foit1I*KX;{*glk8NzJAl(0wG zBs?;B6VwX(4SEH|Ixk4{nuyMcv+11b5PWMi#J}_|yVqz?gqj4Y2GP2r`c#*&#@=af z^!O}X*BvHD=sltbUeZ-h{^mdNM~{iB$#`R&f(chd`EK!i#NoNxED6OZhOUa*sa~B| zA4PA}QlptV+Nk_{Wb~Y2oT$3~(^2E7u{X?DD>aH5S)&fRPrdg?-LEILbDi+hqJ=Or1=L(?1SQjknAKE{rfuk69(4EW9{n$1C%6z48IRIY z?=iY${|VxBm*CuZYEe3r4)a( zqp(?bt5?D>wMcNU`t&YggnvH%Hp5EY;W5VEq^CuVgaL{F9PNK`QuR~M#P3z>^o+Gz zeX^G5Xg#$z`O(lAS$i~oHYcJ8>8K;h8%48B1`w{QR;yj_R84{d-KA01NZFj&S+n~1 zyYxo2K=rBL;sc@-f?17^;7s-FS=FL9Xb$y+$s&R;&5U#=&7^QrtyW77T6BlnVl@ft z?RmSysEr`q-!1J-?@=4ndp)V6AYVNdyb5B}j(8n{UiC!nP>+QT_N?l)`*;O^_7pF0 zy|trVQL9CZ1fRY=!di``a8&{ zHHvnpT5V$xuV3>Z*fQ!Uh|uV0J_LiNO<5oG4$}|RYu^jatJ+}msP^f%&T6b}*8Lo6 zgf(NT*=mc=zMV6Ou^O#TD&x=pw%JqPHIkYwL9Cxm)vccEtVYw`WOu6%24x0S>X~3i zoWY=8ZxMv+ibhQL=|5e!cd2y-rK(x2G-%fw)A4@__a?isQQvj9?$O)|O6*=w@vKh< zkG>y*GtGqNQ8VG+r8yBjNTNP#kH+7y$Jb{^!yX$&t6T3;t8GR#>Ka2E3Bj{jAqu=&{jY#d=_vVvy?JrQRFfSv&M?<4YB^Rd?%`;h(il zz4ch9qt&6i{=1Df0tO$#ZPjI?VECxfF?wNh9iJbKzu-)~+hAVpw6?`t>RYd)L5S+N znbVW1PdzYdVo+w(!Fai0MZ8w4$L=#~XS3+(nH~MiseVau$<(h|)_HrM+G-rddeT!skL7B4+7a{A$3{j_XiwS5$DzgkkK@3<$H|X_Z>?{K!LzO!rAf#5)R+Eh=FLAB5z8GBVil8js8-oXr zKUR~?t#LbRvtgK?O*`^>gN>-oj#^-6>h!!PrX&Qu3GQn^I+7%+OGPIUZ#DMM$JaquwT!rJ)&`OtMY%(cq%h)Z#N!d&lnD> zSJq=|huY<5z_(xb7#tW>d8+20w4T^3_`dtTY24CcyB|?cH+=8>h^U96P02hZIYknZ zVA^PRT25)RrT6&ust&8)j#j6iYu|T+ZI5#rO`|Iwo=qn3|5^PSlYftrjh5c6^F|L0 zM)f|sYGZ5lNs9CIR4w=86Q{O@lRB?4@S3Pe5!Mqw&c4m@YpTzBk(R0(4p|GWrS@iP zk@ZLKGng_B#o$O>!P5ZikF{7MZM51jP(4=tf)Cwq+|Z!ZdT8G^%QlmGpVgt-1Vd>@ z$mA3CU*n)2h$elb+(GJz9=eCl}*d+`xgZEB;w z)q2B*I7Zu5f6b54|L>^z^q6drVi4)aN)RN?!z2W80D~8uHE8fOMR=nYTYGd?@BDWQ zJ$*GD)MO0RV{@oJ83YL0WVetEqO0~UtKE;P?$xMx4AR?muRi}fFS<`xJPlPpG+W}= z_AXh+Wcv|kH~WL#t6mCvOcF9E@{nPWrh0j~n++Q;!z+E89HF<_I2n}vTQ0O`t=)p1 z|D~fwNBkVbd#7jg7l(M&^}i5pv!Lf}e)JCOm3n71+-QZ(o3+Jgt>(;VuIlxpWtzQ> z^uNd3=#p=lwJ&W8{TV-I{!Z(IwcjAiVA|TOnf9Y-GpT<1*2j-Vr@V};IWu@MShQNC zaTq-`sIZwe>SnX39@#IWDMowJj+1c4q(j|d+(*}~_kITKXmDvTW9{)+;(MqW_gp9~ z9C<9#m}#6mym?BeUU@ELlu&ni9I!VU=Br(T=XkrVkG`dTj`gf+vhlLnu=(|4pm7q8 z7_P+oZ0!?#du_r~0N*0jrus$GJS^JS=zRQ&wcFrBb8K`a-U^!=qm1$E_P=VfKAGMs zjZ$aSI^!#n;7pDbAJDzlF1^p=iD1V1A#Ny|@b4#V+&!*a>ovM@xnHfecE{_F_gq)? zUwm#1nyrO#`8PgF8XxPM9|u1w_I5w#)&up#;PT&?pi!`qh{KKAA^b5Ywl~J>*4P+C z*n9M}(Zx8#TFZ>Sd5AX{inqo_*XGE^LG{|)nnbDh8|72m3@0^jdar$3o%Wo@!~T5h zMYBz3H61LDQ#M;_xAn#MHa;`)H`ok#x?v;kvCT#x{(j#wjai(!t4~I$G*gB(#zDQ^ z+QwK{4Kmd(8w0~8jk(}K{6qI@%r$;#&-t-1__g=hXzE^_O{=R}9jd`YxZ#cU+ryr} zmi9fy?>tvBsZz94@348-`_w|!?O`*H-@0bwFHAH`t=HltoBw+bRF~DN7W-Q4j9PDW z)=MnD4K_>v`)(U&UyJo#^;B)Y`OjbC=Ne{iT-|Tr#-9RI&Zus4kh~E&f6I3 zE&u(T;he76?AlSktuJb&#!&a!*!nja_QW}j&7|Ec%A%U=DG%Fvi&~(5dHx|IVW`JEFN<26<0Ea5r*@khU?XTU zxbCuc7^a!*VYBHW!|GL=?2J)K>z$u*lax}C3xb8WU9c}#6zQxlK)htLd8f9Ei+)(3dHCh|hPosZ+L_8+x zt?HA_utAgHz|)t1L!7_!ivhmd$tVRB< z@ma7MeLwtNHnP@M|E+TxDZz=g%v$exxy_vKcf2Owevh4MnQG8n8ND>DN=tXszTalw z`li`6T(cheZ|jfs?%(s`A;j?7TIGA87TbKA{A*M}b*etS$#i;2(dN~%`;7|OxLEHD zN(8CWq@)Ml=Cbi(y;C*ErO)^~HM_nK1_?HP@e%SfXl=EtJi?#vS$upovT5wx^{!dPW~Rr#I*xgCVutT4Zo$7H=DWi@%A}8GDz9M|+b|XfNG( z-CgkN$3N|u`~K-@Fk}8hMGM&51iRu?1_v5@>zh$J)oC*lZ-quxW1?@p%Tpzzbp~yQ zHEA^nucLVk@MD^`ej6LzVf7ol`2XVcPH$Cv;-jWf)N^XD?vKxj{!?w%QtO35woz~O z-Qe8Mv)yY_vmalBH*33Q)9h9TPaZS%9@U|{;&5Sg`%y{zCVQWUOh2PW!!){9lZ}C9 z#p*W5^04aLWq148wh^#v_GW`YtHr<9##2wKHlqT%Pnc8aq9c7IOUP`|;FO)vkN&ZK4cmVLuL4s@I^}W53SC zN6}Lwy;HMg+|4Mfu1U(09AUb?ozYm@FRRPnqj9o()h=sge3WfOZN%((-6gD1+ii?Z zzqA&s5B8^;44b{2VeQmNYV^}Wv%S^&FUYa~b&v7Be~-D1wAF9Fu%cnq=`x1One)+XzpU^EW1 z*3x)itoJs$#t+iMv{5cU^EP^FgV8BJ_G(9*Ls+{!WzyaDc7ry99~)n5nWt#R5mk@c z?|Wn|O^flWQLt(9r@colF?iAQ($Kt(MA)JC*zBZzuSo&cTF;+Eb5xf`*uMRk+Nh?* z{x}}R`I{^eaeVSHs=DlX;gXkk>}b46BjmB$a6<3(Ezr@%+D2OcSwAKB*^I{Tx7o3I z_2cHD+D1XO_z{e250ZyG@35ndwC{z+P@}H@^;=^m%ZklS*W{yao_=`G%Bji=Y_G%998(R}J1UQ#eVrCI+sj;rM! zhHbQLKGYWLxkks=YdWaiuknbFr`4io^j?EWYqhTEyr((3{=bypzt8v8TJKvBi~T=> C8HTC= literal 0 HcmV?d00001 From 85e586a19320e1dcd3ef84a22da5609b451b0d70 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Mon, 3 Dec 2018 22:05:58 +0100 Subject: [PATCH 28/85] Added auto throw break :) (optional) rename to use it Co-Authored-By: SamSi --- TekkenEncyclopedia(ThrowBreakVersion).py | 693 +++++++++++++++++++++++ artificial_keyboard.py | 77 +++ 2 files changed, 770 insertions(+) create mode 100644 TekkenEncyclopedia(ThrowBreakVersion).py create mode 100644 artificial_keyboard.py diff --git a/TekkenEncyclopedia(ThrowBreakVersion).py b/TekkenEncyclopedia(ThrowBreakVersion).py new file mode 100644 index 00000000..5420b3ab --- /dev/null +++ b/TekkenEncyclopedia(ThrowBreakVersion).py @@ -0,0 +1,693 @@ +""" +Collects information from TekkenGameState over time in hopes of synthesizing it and presenting it in a more useful way. + +""" + +import time +from enum import Enum + +import artificial_keyboard +from MoveInfoEnums import AttackType +from MoveInfoEnums import ComplexMoveStates +from MoveInfoEnums import ThrowTechs +from TekkenGameState import TekkenGameState + + +class TekkenEncyclopedia: + def __init__(self, isPlayerOne=False, print_extended_frame_data=False): + self.FrameData = {} + self.GameEvents = [] + self.current_game_event = None + self.isPlayerOne = isPlayerOne + self.print_extended_frame_data = print_extended_frame_data + + self.active_frame_wait = 1 + + self.was_fight_being_reacquired = True + self.is_match_recorded = False + + self.stat_filename = "TekkenData/matches.txt" + if self.isPlayerOne: + self.LoadStats() + + self.current_punish_window = None + self.PunishWindows = [] + self.current_frame_data_entry = None + self.previous_frame_data_entry = None + + def LoadStats(self): + self.stat_dict = {} + self.stat_dict['char_stats'] = {} + self.stat_dict['matchup_stats'] = {} + self.stat_dict['opponent_stats'] = {} + try: + with open(self.stat_filename, 'r', encoding='utf-8') as fr: + lines = fr.readlines() + for line in lines: + if '|' in line: + args = line.split('|') + result = args[0].strip() + player_char = args[2].strip() + opponent_name = args[4].strip() + opponent_char = args[5].strip() + self.AddStat(result, player_char, opponent_name, opponent_char) + except FileNotFoundError: + pass + + def AddStat(self, result, player_char, opponent_name, opponent_char): + + if not opponent_char in self.stat_dict['char_stats']: + self.stat_dict['char_stats'][opponent_char] = [0, 0, 0] + if not opponent_name in self.stat_dict['opponent_stats']: + self.stat_dict['opponent_stats'][opponent_name] = [0, 0, 0] + matchup_string = "{} vs {}".format(player_char, opponent_char) + if not matchup_string in self.stat_dict['matchup_stats']: + self.stat_dict['matchup_stats'][matchup_string] = [0, 0, 0] + + if 'WIN' in result: + index = 0 + elif 'LOSS' in result: + index = 1 + else: + index = 2 + + self.stat_dict['char_stats'][opponent_char][index] += 1 + self.stat_dict['opponent_stats'][opponent_name][index] += 1 + self.stat_dict['matchup_stats'][matchup_string][index] += 1 + + def RecordFromStat(self, catagory, lookup): + try: + + stats = self.stat_dict[catagory][lookup] + wins = stats[0] + losses = stats[1] + draws = stats[2] + + except: + wins = 0 + losses = 0 + draws = 0 + + if draws <= 0: + return "{} - {}".format(wins, losses) + else: + return "{} - {} - {}".format(wins, losses, draws) + + def GetPlayerString(self, reverse=False): + if (self.isPlayerOne and not reverse) or (not self.isPlayerOne and reverse): + return "p1: " + else: + return "p2: " + + def GetFrameAdvantage(self, moveId, isOnBlock=True): + if moveId in self.FrameData: + if isOnBlock: + return self.FrameData[moveId].onBlock + else: + return self.FrameData[moveId].onNormalHit + else: + return None + + # Set the dummy to jump and hold up and this prints the frame difference. + def CheckJumpFrameDataFallback(self, gameState): + if not self.isPlayerOne: + if gameState.IsFulfillJumpFallbackConditions(): + print("p1 jump frame diff: " + str(gameState.GetBotMoveTimer() - gameState.GetOppMoveTimer())) + + def Update(self, gameState: TekkenGameState): + if self.isPlayerOne: + gameState.FlipMirror() + + # self.CheckJumpFrameDataFallback(gameState) + + self.DetermineFrameData(gameState) + + self.DetermineGameStats(gameState) + + self.DetermineCoachingTips(gameState) + + if self.isPlayerOne: + gameState.FlipMirror() + + def DetermineCoachingTips(self, gameState: TekkenGameState): + + if self.previous_frame_data_entry != self.current_frame_data_entry: + self.previous_frame_data_entry = self.current_frame_data_entry + + if self.current_punish_window != None: + self.ClosePunishWindow(PunishWindow.Result.NO_WINDOW, do_close_frame_data_entries=False) + + # if int(self.current_frame_data_entry.currentFrameAdvantage) <= 999999: + self.current_punish_window = PunishWindow(self.current_frame_data_entry.prefix, + self.current_frame_data_entry.move_id, + self.current_frame_data_entry.input, + int(self.current_frame_data_entry.hitRecovery), + int(self.current_frame_data_entry.blockRecovery), + int(self.current_frame_data_entry.activeFrames)) + self.PunishWindows.append(self.current_punish_window) + self.punish_window_counter = 0 + + if self.current_punish_window != None: + self.punish_window_counter += 1 + # if self.punish_window_counter > self.current_punish_window.size: + + was_block_punish = gameState.DidOppStartGettingPunishedXFramesAgo( + 1) or gameState.DidOppStartGettingHitXFramesAgo(1) + + if was_block_punish: + leeway = (gameState.OppFramesUntilRecoveryXFramesAgo(2) - 1) + LAUNCH_PUNISHIBLE = 15 + BAD_PUNISH_THRESHOLD = 13 + # if leeway == 0: + # self.ClosePunishWindow(PunishWindow.Result.PERFECT_PUNISH) + # else: + fa = (-1 * self.current_punish_window.get_frame_advantage()) + startup = fa - leeway + if fa >= LAUNCH_PUNISHIBLE and startup <= BAD_PUNISH_THRESHOLD: + self.ClosePunishWindow(PunishWindow.Result.NO_LAUNCH_ON_LAUNCHABLE) + elif fa >= LAUNCH_PUNISHIBLE: + self.ClosePunishWindow(PunishWindow.Result.LAUNCH_ON_LAUNCHABLE) + else: + self.ClosePunishWindow(PunishWindow.Result.JAB_ON_NOT_LAUNCHABLE) + + elif gameState.HasOppReturnedToNeutralFromMoveId( + self.current_punish_window.move_id) and self.punish_window_counter >= self.current_punish_window.hit_recovery: + if self.current_punish_window.get_frame_advantage() <= -10: + self.ClosePunishWindow(PunishWindow.Result.NO_PUNISH) + else: + self.ClosePunishWindow(PunishWindow.Result.NO_WINDOW) + if self.current_punish_window != None: + self.current_punish_window.adjust_window(gameState.GetOppFramesTillNextMove(), + gameState.GetBotFramesTillNextMove()) + + # perfect_punish = False + # if was_block_punish: + # perfect_punish = gameState.WasBotMoveOnLastFrameXFramesAgo(2) + + def ClosePunishWindow(self, result, do_close_frame_data_entries=True): + self.current_punish_window.close_window(result) + self.current_punish_window = None + if do_close_frame_data_entries: + self.previous_frame_data_entry = None + self.current_frame_data_entry = None + + def DetermineGameStats(self, gameState: TekkenGameState): + frames_ago = 4 + if self.current_game_event == None: + if gameState.DidOppComboCounterJustStartXFramesAgo(frames_ago): + gameState.BackToTheFuture(frames_ago) + + combo_counter_damage = gameState.GetOppComboDamageXFramesAgo(1) + + was_unblockable = gameState.IsOppAttackUnblockable() + was_antiair = gameState.IsOppAttackAntiair() + was_block_punish = gameState.DidBotStartGettingPunishedXFramesAgo(1) + perfect_punish = False + if was_block_punish: + perfect_punish = gameState.BotFramesUntilRecoveryXFramesAgo(2) == 1 + was_counter_hit = gameState.IsBotGettingCounterHit() + was_ground_hit = gameState.IsBotGettingHitOnGround() + + was_whiff_punish = gameState.GetBotStartupXFramesAgo(2) > 0 + + was_low_hit = gameState.IsOppAttackLow() + was_mid_hit_on_crouching = gameState.IsOppAttackMid() and gameState.IsBotCrouching() + was_throw = gameState.IsBotBeingThrown() + + was_damaged_during_attack = gameState.DidOppTakeDamageDuringStartup() + + gameState.ReturnToPresent() + + if was_unblockable: + hit = GameStatEventEntry.EntryType.UNBLOCKABLE + elif was_antiair: + hit = GameStatEventEntry.EntryType.ANTIAIR + elif was_throw: + hit = GameStatEventEntry.EntryType.THROW + elif was_damaged_during_attack: + hit = GameStatEventEntry.EntryType.POWER_CRUSHED + elif was_block_punish: + hit = GameStatEventEntry.EntryType.PUNISH + elif was_counter_hit: + hit = GameStatEventEntry.EntryType.COUNTER + elif was_ground_hit: + hit = GameStatEventEntry.EntryType.GROUND + elif was_whiff_punish: + hit = GameStatEventEntry.EntryType.WHIFF_PUNISH + elif was_low_hit: + hit = GameStatEventEntry.EntryType.LOW + elif was_mid_hit_on_crouching: + hit = GameStatEventEntry.EntryType.MID + else: + hit = GameStatEventEntry.EntryType.NO_BLOCK + self.current_game_event = GameStatEventEntry(gameState.stateLog[-1].timer_frames_remaining, + self.GetPlayerString(True), hit, combo_counter_damage) + + # print("event open") + else: + bot_damage_taken = gameState.DidBotJustTakeDamage(frames_ago + 1) + if bot_damage_taken > 0: + # print('armored') + game_event = GameStatEventEntry(gameState.stateLog[-1].timer_frames_remaining, + self.GetPlayerString(True), GameStatEventEntry.EntryType.ARMORED, + 0) # this is probably gonna break for Yoshimitsu's self damage moves + game_event.close_entry(gameState.stateLog[-1].timer_frames_remaining, 1, bot_damage_taken, 0, + len(self.GameEvents)) + + self.GameEvents.append(game_event) + + + + else: + if gameState.DidOppComboCounterJustEndXFramesAgo(frames_ago) or gameState.WasFightReset(): + hits = gameState.GetOppComboHitsXFramesAgo(frames_ago + 1) + damage = gameState.GetOppComboDamageXFramesAgo(frames_ago + 1) + juggle = gameState.GetOppJuggleDamageXFramesAgo(frames_ago + 1) + self.current_game_event.close_entry(gameState.stateLog[-1].timer_frames_remaining, hits, damage, juggle, + len(self.GameEvents)) + self.GameEvents.append(self.current_game_event) + self.current_game_event = None + # print("event closed") + + if gameState.WasFightReset(): + # print("p1: NOW:0") + # print("p2: NOW:0") + if self.isPlayerOne: + if gameState.gameReader.flagToReacquireNames == False and self.was_fight_being_reacquired: + self.is_match_recorded = False + + for entry in self.get_matchup_record(gameState): + print(entry) + + round_number = gameState.GetRoundNumber() + print("!ROUND | {} | HIT".format(round_number)) + if (gameState.stateLog[-1].bot.wins == 3 or gameState.stateLog[ + -1].opp.wins == 3) and not self.is_match_recorded: + self.is_match_recorded = True + + player_name = "You" + p1_char_name = gameState.stateLog[-1].opp.character_name + p1_wins = gameState.stateLog[-1].opp.wins + + opponent_name = gameState.stateLog[-1].opponent_name + p2_char_name = gameState.stateLog[-1].bot.character_name + p2_wins = gameState.stateLog[-1].bot.wins + + if gameState.stateLog[-1].is_player_player_one: + player_char, player_wins = p1_char_name, p1_wins + opponent_char, opponent_wins = p2_char_name, p2_wins + else: + player_char, player_wins = p2_char_name, p2_wins + opponent_char, opponent_wins = p1_char_name, p1_wins + + if player_wins == opponent_wins: + result = 'DRAW' + elif player_wins > opponent_wins: + result = 'WIN' + else: + result = "LOSS" + + match_result = '{} | {} | {} | vs | {} | {} | {}-{} | {}'.format(result, player_name, player_char, + opponent_name, opponent_char, + player_wins, opponent_wins, + time.strftime('%Y_%m_%d_%H.%M')) + print("{}".format(match_result)) + self.AddStat(result, player_char, opponent_name, opponent_char) + with open(self.stat_filename, "a", encoding='utf-8') as fa: + fa.write(match_result + '\n') + if (gameState.GetTimer(frames_ago) < 3600 and len(self.GameEvents) > 0) or True: + summary = RoundSummary(self.GameEvents, gameState.GetOppRoundSummary(frames_ago)) + + self.GameEvents = [] + + self.was_fight_being_reacquired = gameState.gameReader.flagToReacquireNames + + def get_matchup_record(self, gameState): + if gameState.stateLog[-1].is_player_player_one: + opponent_char = gameState.stateLog[-1].bot.character_name + player_char = gameState.stateLog[-1].opp.character_name + else: + opponent_char = gameState.stateLog[-1].opp.character_name + player_char = gameState.stateLog[-1].bot.character_name + opponent_name = gameState.stateLog[-1].opponent_name + return [ + ("!RECORD | vs {}: {}".format(opponent_char, self.RecordFromStat('char_stats', opponent_char))), + ("!RECORD | vs {}: {}".format(opponent_name, self.RecordFromStat('opponent_stats', opponent_name))), + ("!RECORD | {} vs {}: {}".format(player_char, opponent_char, self.RecordFromStat("matchup_stats", + "{} vs {}".format( + player_char, + opponent_char)))) + ] + + def DetermineFrameData(self, gameState): + if ( + gameState.IsBotBlocking() or gameState.IsBotGettingHit() or gameState.IsBotBeingThrown() or gameState.IsBotBeingKnockedDown() or gameState.IsBotBeingWallSplatted()): # or gameState.IsBotUsingOppMovelist()): #or gameState.IsBotStartedBeingJuggled() or gameState.IsBotJustGrounded()): + # print(gameState.stateLog[-1].bot.move_id) + # print(gameState.stateLog[-1].bot.move_timer) + # print(gameState.stateLog[-1].bot.recovery) + # print(gameState.DidBotIdChangeXMovesAgo(self.active_frame_wait)) + + if gameState.DidBotIdChangeXMovesAgo(self.active_frame_wait) or gameState.DidBotTimerInterruptXMovesAgo( + self.active_frame_wait): # or gameState.DidOppIdChangeXMovesAgo(self.active_frame_wait): + + is_recovering_before_long_active_frame_move_completes = ( + gameState.GetBotRecovery() - gameState.GetBotMoveTimer() == 0) + gameState.BackToTheFuture(self.active_frame_wait) + + # print(gameState.GetOppActiveFrames()) + if ( + not self.active_frame_wait >= gameState.GetOppActiveFrames() + 1) and not is_recovering_before_long_active_frame_move_completes: + self.active_frame_wait += 1 + else: + gameState.ReturnToPresent() + + currentActiveFrame = gameState.GetLastActiveFrameHitWasOn(self.active_frame_wait) + + gameState.BackToTheFuture(self.active_frame_wait) + + opp_id = gameState.GetOppMoveId() + + if opp_id in self.FrameData: + frameDataEntry = self.FrameData[opp_id] + else: + frameDataEntry = FrameDataEntry(self.print_extended_frame_data) + self.FrameData[opp_id] = frameDataEntry + + frameDataEntry.currentActiveFrame = currentActiveFrame + + frameDataEntry.currentFrameAdvantage = '??' + frameDataEntry.move_id = opp_id + # frameDataEntry.damage = + frameDataEntry.damage = gameState.GetOppDamage() + frameDataEntry.startup = gameState.GetOppStartup() + + if frameDataEntry.damage == 0 and frameDataEntry.startup == 0: + frameDataEntry.startup, frameDataEntry.damage = gameState.GetOppLatestNonZeroStartupAndDamage() + + frameDataEntry.activeFrames = gameState.GetOppActiveFrames() + frameDataEntry.hitType = AttackType(gameState.GetOppAttackType()).name + if gameState.IsOppAttackThrow(): + frameDataEntry.hitType += "_THROW" + + frameDataEntry.recovery = gameState.GetOppRecovery() + + # frameDataEntry.input = frameDataEntry.InputTupleToInputString(gameState.GetOppLastMoveInput()) + + frameDataEntry.input = gameState.GetCurrentOppMoveString() + + frameDataEntry.technical_state_reports = gameState.GetOppTechnicalStates(frameDataEntry.startup - 1) + + frameDataEntry.tracking = gameState.GetOppTrackingType(frameDataEntry.startup) + + # print(gameState.GetRangeOfMove()) + + gameState.ReturnToPresent() + + # frameDataEntry.throwTech = gameState.GetBotThrowTech(frameDataEntry.activeFrames + frameDataEntry.startup) + frameDataEntry.throwTech = gameState.GetBotThrowTech(1) + + time_till_recovery_opp = gameState.GetOppFramesTillNextMove() + time_till_recovery_bot = gameState.GetBotFramesTillNextMove() + + new_frame_advantage_calc = time_till_recovery_bot - time_till_recovery_opp + + frameDataEntry.currentFrameAdvantage = frameDataEntry.WithPlusIfNeeded(new_frame_advantage_calc) + + if gameState.IsBotBlocking(): + frameDataEntry.onBlock = new_frame_advantage_calc + else: + if gameState.IsBotGettingCounterHit(): + frameDataEntry.onCounterHit = new_frame_advantage_calc + else: + frameDataEntry.onNormalHit = new_frame_advantage_calc + + frameDataEntry.hitRecovery = time_till_recovery_opp + frameDataEntry.blockRecovery = time_till_recovery_bot + + frameDataEntry.move_str = gameState.GetCurrentOppMoveName() + frameDataEntry.prefix = self.GetPlayerString() + + print(str(frameDataEntry)) + + self.current_frame_data_entry = frameDataEntry + + gameState.BackToTheFuture(self.active_frame_wait) + + self.active_frame_wait = 1 + gameState.ReturnToPresent() + + +class FrameDataEntry: + def __init__(self, print_extended=False): + self.print_extended = print_extended + self.prefix = '??' + self.move_id = '??' + self.move_str = '??' + self.startup = '??' + self.calculated_startup = -1 + self.hitType = '??' + self.onBlock = '??' + self.onCounterHit = '??' + self.onNormalHit = '??' + self.recovery = '??' + self.damage = '??' + self.blockFrames = '??' + self.activeFrames = '??' + self.currentFrameAdvantage = '??' + self.currentActiveFrame = '??' + self.input = '??' + self.technical_state_reports = [] + self.blockRecovery = '??' + self.hitRecovery = '??' + self.throwTech = None + self.tracking = ComplexMoveStates.F_MINUS + + def WithPlusIfNeeded(self, value): + try: + if value >= 0: + return '+' + str(value) + else: + return str(value) + except: + return str(value) + + def InputTupleToInputString(self, inputTuple): + s = "" + for input in inputTuple: + s += (input[0].name + input[1].name.replace('x', '+')).replace('N', '') + if input[2]: + s += "+R" + return s + + def __repr__(self): + + notes = '' + MAGIC_THROW_BREAK_NUMBER = 1 + MAGIC_THROW_BREAK_FLOAT = 1 + if self.throwTech != None and self.throwTech != ThrowTechs.NONE: + throw_type = self.throwTech.name + if throw_type == "TE1": + # press 1 + artificial_keyboard.press_and_release_n_times(0x16, MAGIC_THROW_BREAK_FLOAT, MAGIC_THROW_BREAK_NUMBER) + + elif throw_type == "TE2": + # press 2 + artificial_keyboard.press_and_release_n_times(0x17, MAGIC_THROW_BREAK_FLOAT, MAGIC_THROW_BREAK_NUMBER) + + elif throw_type == "TE1_2": + # press 1+2 + artificial_keyboard.press_and_release_n_times(0x18, MAGIC_THROW_BREAK_FLOAT, MAGIC_THROW_BREAK_NUMBER) + + notes += self.throwTech.name + " " + + self.calculated_startup = self.startup + for report in self.technical_state_reports: + # if not self.print_extended: + if 'TC' in report.name and report.is_present(): + notes += str(report) + elif 'TJ' in report.name and report.is_present(): + notes += str(report) + elif 'PC' in report.name and report.is_present(): + notes += str(report) + elif 'SKIP' in report.name and report.is_present(): + # print(report) + self.calculated_startup -= report.total_present() + elif 'FROZ' in report.name and report.is_present(): + # print(report) + self.calculated_startup -= report.total_present() + elif self.print_extended: + if report.is_present(): + notes += str(report) + nerd_string = "" + if self.print_extended: + pass + # notes += ' stun {}'.format(self.blockRecovery) + # notes += ' a_recovery {}'.format(self.hitRecovery) + # notes += "Total:" + str(self.recovery) + "f " + + if self.calculated_startup != self.startup: + self.calculated_startup = str(self.calculated_startup) + "?" + + non_nerd_string = "{:^5}|{:^4}|{:^4}|{:^7}|{:^4}|{:^4}|{:^4}|{:^5}|{:^3}|{:^2}|{:^3}|{:^3}|{:^3}|".format( + str(self.input), + str(self.move_id), + self.move_str, + str(self.hitType)[:7], + str(self.calculated_startup), + self.WithPlusIfNeeded(self.onBlock), + self.WithPlusIfNeeded(self.onNormalHit), + self.WithPlusIfNeeded(self.onCounterHit), + (str(self.currentActiveFrame) + "/" + str(self.activeFrames)), + self.tracking.name.replace('_MINUS', '-').replace("_PLUS", '+').replace(ComplexMoveStates.UNKN.name, '?'), + self.recovery, + self.hitRecovery, + self.blockRecovery + ) + + notes_string = "{}".format(notes) + now_string = " NOW:{}".format(str(self.currentFrameAdvantage)) + return self.prefix + non_nerd_string + notes_string + now_string + + +class GameStatEventEntry: + class EntryType(Enum): + COUNTER = 1 + PUNISH = 2 + WHIFF_PUNISH = 3 + LOW = 4 + MID = 5 + THROW = 6 + GROUND = 7 + NO_BLOCK = 8 + + ARMORED = 10 + + UNBLOCKABLE = 12 + + ANTIAIR = 14 + POWER_CRUSHED = 15 + + # Not implemented + LOW_PARRY = 9 + OUT_OF_THE_AIR = 13 + + class PunishType(Enum): + NONE = 0 + PERFECT = 1 + JAB = 2 + JAB_ON_LAUNCH_PUNISHIBLE = 3 + + def __init__(self, time_in_frames, player_string, hit_type: EntryType, combo_counter_damage): + self.start_time = time_in_frames + self.player_string = player_string + self.hit_type = hit_type + self.damage_already_on_combo_counter = combo_counter_damage + + def close_entry(self, time_in_frames, total_hits, total_damage, juggle_damage, times_hit): + self.end_time = time_in_frames + self.total_hits = total_hits + self.total_damage = max(0, total_damage - self.damage_already_on_combo_counter) + self.juggle_damage = juggle_damage + + print('{} {} | {} | {} | {} | {} | HIT'.format(self.player_string, self.hit_type.name, self.total_damage, + self.total_hits, self.start_time, self.end_time)) + + +class RoundSummary: + def __init__(self, events, round_variables): + self.events = events + self.collated_events = self.collate_events(events) + total_damage = 0 + sources, types = self.collated_events + # print('{} combos for {} damage'.format(types[0][0], types[0][1])) + # print('{} pokes for {} damage'.format(types[1][0], types[1][1])) + for event, hits, damage in sources: + if damage > 0: + # print('{} {} for {} damage'.format(hits, event.name, damage)) + total_damage += damage + + # print('total damage dealt {} ({})'.format(round_variables[1], total_damage)) + + def collate_events(self, events): + hits_into_juggles = 0 + hits_into_pokes = 0 + damage_from_juggles = 0 + damage_from_pokes = 0 + sources = [] + + for entry in GameStatEventEntry.EntryType: + occurances = 0 + damage = 0 + for event in events: + if entry == event.hit_type: + occurances += 1 + damage += event.total_damage + if event.juggle_damage > 0: + damage_from_juggles += event.total_damage + hits_into_juggles += 1 + else: + damage_from_pokes += event.total_damage + hits_into_pokes += 1 + sources.append((entry, occurances, damage)) + + sources.sort(key=lambda x: x[2], reverse=True) + types = [(hits_into_juggles, damage_from_juggles), (hits_into_pokes, damage_from_pokes)] + return sources, types + + def __repr__(self): + pass + + +class PunishWindow: + class Result(Enum): + NO_WINDOW = 0 + NO_PUNISH = 1 + PERFECT_PUNISH = 2 + NO_LAUNCH_ON_LAUNCHABLE = 3 + LAUNCH_ON_LAUNCHABLE = 4 + JAB_ON_NOT_LAUNCHABLE = 5 + + NOT_YET_CLOSED = 99 + + def __init__(self, prefix, move_id, string_name, hit_recovery, block_recovery, active_frames): + self.prefix = prefix + self.move_id = move_id + self.name = string_name + self.hit_recovery = hit_recovery + self.block_recovery = block_recovery + self.active_frames = active_frames + self.is_window_locked = False + self.original_diff = self.get_frame_advantage() + self.upcoming_lock = False + self.frames_locked = 0 + self.result = PunishWindow.Result.NOT_YET_CLOSED + + def get_frame_advantage(self): + if not self.is_window_locked: + return self.block_recovery - self.hit_recovery + else: + return 0 - self.hit_recovery - self.frames_locked + + def adjust_window(self, hit_recovery, block_recovery): + # if block_recovery > self.block_recovery: + + self.hit_recovery = hit_recovery + + if self.upcoming_lock: + self.frames_locked += 1 + self.is_window_locked = True + + if not self.is_window_locked: + self.block_recovery = block_recovery + + if block_recovery == 0: + self.upcoming_lock = True + + if self.get_frame_advantage() != self.original_diff: + print('{} NOW:{}'.format(self.prefix, FrameDataEntry.WithPlusIfNeeded(None, self.get_frame_advantage()))) + self.original_diff = self.get_frame_advantage() + + def close_window(self, result: Result): + self.result = result + if result != PunishWindow.Result.NO_WINDOW: + print("Closing punish window, result: {}".format(self.result.name)) diff --git a/artificial_keyboard.py b/artificial_keyboard.py new file mode 100644 index 00000000..b01052c7 --- /dev/null +++ b/artificial_keyboard.py @@ -0,0 +1,77 @@ +import ctypes +import time + +SendInput = ctypes.windll.user32.SendInput + +# C struct redefinitions +PUL = ctypes.POINTER(ctypes.c_ulong) + + +class KeyBdInput(ctypes.Structure): + _fields_ = [("wVk", ctypes.c_ushort), + ("wScan", ctypes.c_ushort), + ("dwFlags", ctypes.c_ulong), + ("time", ctypes.c_ulong), + ("dwExtraInfo", PUL)] + + +class HardwareInput(ctypes.Structure): + _fields_ = [("uMsg", ctypes.c_ulong), + ("wParamL", ctypes.c_short), + ("wParamH", ctypes.c_ushort)] + + +class MouseInput(ctypes.Structure): + _fields_ = [("dx", ctypes.c_long), + ("dy", ctypes.c_long), + ("mouseData", ctypes.c_ulong), + ("dwFlags", ctypes.c_ulong), + ("time", ctypes.c_ulong), + ("dwExtraInfo", PUL)] + + +class Input_I(ctypes.Union): + _fields_ = [("ki", KeyBdInput), + ("mi", MouseInput), + ("hi", HardwareInput)] + + +class Input(ctypes.Structure): + _fields_ = [("type", ctypes.c_ulong), + ("ii", Input_I)] + + +# Actuals Functions + +def PressKey(hexKeyCode): + extra = ctypes.c_ulong(0) + ii_ = Input_I() + ii_.ki = KeyBdInput(0, hexKeyCode, 0x0008, 0, ctypes.pointer(extra)) + x = Input(ctypes.c_ulong(1), ii_) + ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x)) + + +def ReleaseKey(hexKeyCode): + extra = ctypes.c_ulong(0) + ii_ = Input_I() + ii_.ki = KeyBdInput(0, hexKeyCode, 0x0008 | 0x0002, 0, ctypes.pointer(extra)) + x = Input(ctypes.c_ulong(1), ii_) + ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x)) + + +def press_and_release_n_times(hex_key_code, time_interval, n_times): + for _ in range(n_times): + PressKey(hex_key_code) + time.sleep(time_interval) + ReleaseKey(hex_key_code) + if n_times != 1: + time.sleep(time_interval) + + +# directx scan codes http://www.gamespp.com/directx/directInputKeyboardScanCodes.html +if __name__ == "__main__": + for i in range(5): + PressKey(0x16) + time.sleep(1) + ReleaseKey(0x16) + time.sleep(1) From 326b0ed1e529ce896754bb957501507a676d7977 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Mon, 3 Dec 2018 22:07:46 +0100 Subject: [PATCH 29/85] rec & opp columns default off --- TekkenData/frame_data_overlay.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TekkenData/frame_data_overlay.ini b/TekkenData/frame_data_overlay.ini index 95fd7109..e1d302eb 100644 --- a/TekkenData/frame_data_overlay.ini +++ b/TekkenData/frame_data_overlay.ini @@ -18,7 +18,7 @@ xchxx = False act = True t = True tot = True -rec = True -opp = True +rec = False +opp = False notes = True From 5675428a7647355b1da4ea2ee176598a14c50d2d Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Mon, 3 Dec 2018 22:08:37 +0100 Subject: [PATCH 30/85] remove outdated comment --- build_project.bat | 2 -- 1 file changed, 2 deletions(-) diff --git a/build_project.bat b/build_project.bat index 17168000..02502855 100644 --- a/build_project.bat +++ b/build_project.bat @@ -1,5 +1,3 @@ -::install the pyinstaller requirement first if missing: -::pip install pyinstaller pyinstaller --windowed --clean --icon=TekkenData/tekken_bot_close.ico --add-data TekkenData;TekkenData --name TekkenBotPrime GUI_TekkenBotPrime.py ::alternative sample command for building: ::"C:%HOMEPATH%\AppData\Local\Programs\Python\Python36-32\Scripts\pyinstaller.exe" --windowed --clean --icon=TekkenData/tekken_bot_close.ico --add-data TekkenData;TekkenData --name TekkenBotPrime GUI_TekkenBotPrime.py From 8aa18e084493467d9e2318856dfc33b3630a2389 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Mon, 3 Dec 2018 22:09:37 +0100 Subject: [PATCH 31/85] version number --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index 4e3d00b3..b450f9ca 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.11.0' +CURRENT_VERSION = 'v0.12.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.11.0' in CURRENT_VERSION: + if 'v0.12.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From bbb97e5c06025f6b8b0874188ea8aa118ad7373c Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Mon, 3 Dec 2018 22:11:17 +0100 Subject: [PATCH 32/85] 2018-12-03 CT updated, now prettier and smarter --- CE_TekkenBot.CT | 454 +++++++++++++++++++++++++----------------------- 1 file changed, 234 insertions(+), 220 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index 49507fd6..975fbb36 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -5,66 +5,69 @@ - 1006 - "p2_data_offset" - - 4 Bytes -

    "TekkenGame-Win64-Shipping.exe"+3447B80
    - - 6870 - 0 - + 4445 + "player_data_pointer_offset is in "Memory view -> View -> Userdefined symbols"" + + 009900 + 1 + + + 4444 + "p2_data_offset is in "Memory view -> View -> Userdefined symbols"" + + 009900 + 1 1008 "rollback_frame_offset" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1A680 + 1AB10 0
    1009 "frame_count" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1A1D0 + 1A4D0 0
    1014 "p1_move_timer" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1f0 + 1F0 0
    1018 "p1_move_id" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 31c + 31C 0
    1020 "p1_recovery" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    368 0 @@ -73,9 +76,9 @@ 1022 "p1_hit_outcome" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    3A4 0 @@ -84,9 +87,9 @@ 1024 "p1_attack_type" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    3DC 0 @@ -95,9 +98,9 @@ 1026 "p1_simple_move_state" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    3E0 0 @@ -106,9 +109,9 @@ 1028 "p1_stun_type" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    3E4 0 @@ -117,9 +120,9 @@ 1030 "p1_throw_tech" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    3F4 0 @@ -128,9 +131,9 @@ 1034 "p1_complex_move_state" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    408 0 @@ -139,9 +142,9 @@ 1123 "p1_power_crush" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    4FA 0 @@ -150,305 +153,305 @@ 1038 "p1_jump_flags" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 544 + 594 0
    1040 "p1_cancel_window" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 568 + 5B8 0
    1042 "p1_damage_taken" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6ec + 73C 0
    1070 "p1_input_attack" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 15CC + 162C 0
    1072 "p1_input_direction" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 15D0 + 1630 0
    1074 "p1_attack_startup" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6860 + 6920 0
    1076 "p1_attack_startup_end" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6864 + 6924 0
    1147 "p2_move_timer" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1f0+6870 + 1F0+p2_data_offset 0
    1148 "p2_move_id" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 31c+6870 + 31C+p2_data_offset 0
    1149 "p2_recovery" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 368+6870 + 368+p2_data_offset 0
    1150 "p2_hit_outcome" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3A4+6870 + 3A4+p2_data_offset 0
    1151 "p2_attack_type" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3DC+6870 + 3DC+p2_data_offset 0
    1152 "p2_simple_move_state" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3E0+6870 + 3E0+p2_data_offset 0
    1153 "p2_stun_type" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3E4+6870 + 3E4+p2_data_offset 0
    1154 "p2_throw_tech" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3F4+6870 + 3F4+p2_data_offset 0
    1156 "p2_complex_move_state" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 408+6870 + 408+p2_data_offset 0
    1157 "p2_power_crush" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 4FA+6870 + 4FA+p2_data_offset 0
    1158 "p2_jump_flags" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 544+6870 + 594+p2_data_offset 0
    1159 "p2_cancel_window" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 568+6870 + 5B8+p2_data_offset 0
    1160 "p2_damage_taken" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6ec+6870 + 73C+p2_data_offset 0
    1161 "p2_input_attack" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 15CC+6870 + 162C+p2_data_offset 0
    1162 "p2_input_direction" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 15D0+6870 + 1630+p2_data_offset 0
    1163 "p2_attack_startup" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6860+6870 + 6920+p2_data_offset 0
    1164 "p2_attack_startup_end" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6864+6870 + 6924+p2_data_offset 0
    1105 "p1_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+03413220
    +
    "TekkenGame-Win64-Shipping.exe"+03419720
    - 2e8 + 2E8
    1127 "p2_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+03416100
    +
    "TekkenGame-Win64-Shipping.exe"+0341C660
    - 2e8 + 2E8
    1129 "OPPONENT_NAME" - + String 13 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+033FDB20
    +
    "TekkenGame-Win64-Shipping.exe"+03403C40
    114 8 @@ -458,9 +461,9 @@ 1131 "OPPONENT_SIDE" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+033FDB20
    +
    "TekkenGame-Win64-Shipping.exe"+03403C40
    70 8 @@ -470,7 +473,7 @@ 1136 "----IGNORABLE----" - + 0000FF 1 @@ -478,10 +481,10 @@ 1005 "player_data_second_pointer_offset" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    0 0 @@ -490,10 +493,10 @@ 1102 "player_data_second_pointer_offset" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1208 0 @@ -502,10 +505,10 @@ 1007 "p2_end_block_offset" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    c8 0 @@ -514,10 +517,10 @@ 1010 "facing" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    ad4 0 @@ -526,10 +529,10 @@ 1011 "timer_in_frames" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1A158 0 @@ -538,10 +541,10 @@ 1012 "p1_char_id" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    d4 0 @@ -550,10 +553,10 @@ 1013 "p2_char_id" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    6924 0 @@ -562,10 +565,10 @@ 1016 "p1_attack_damage" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    2fc 0 @@ -574,10 +577,10 @@ 1017 "p2_attack_damage" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    6B4C 0 @@ -586,10 +589,10 @@ 1032 "p1_throw_flag" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    400 0 @@ -598,22 +601,22 @@ 1155 "p2_throw_flag" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 400+6870 + 400+p2_data_offset 0
    1044 "p1_x" - + 0000FF Float -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    c00 0 @@ -622,10 +625,10 @@ 1045 "p2_x" - + 0000FF Float -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    7450 0 @@ -634,10 +637,10 @@ 1046 "p1_y" - + 0000FF Float -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    c04 0 @@ -646,10 +649,10 @@ 1047 "p2_y" - + 0000FF Float -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    7454 0 @@ -658,10 +661,10 @@ 1048 "p1_z" - + 0000FF Float -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    c08 0 @@ -670,10 +673,10 @@ 1049 "p2_z" - + 0000FF Float -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    7458 0 @@ -682,10 +685,10 @@ 1050 "p1_hitbox1" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    c0c 0 @@ -694,10 +697,10 @@ 1051 "p2_hitbox1" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    745C 0 @@ -706,10 +709,10 @@ 1052 "p1_hitbox2" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    c10 0 @@ -718,10 +721,10 @@ 1053 "p2_hitbox2" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    7460 0 @@ -730,10 +733,10 @@ 1054 "p1_hitbox3" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    c14 0 @@ -742,10 +745,10 @@ 1055 "p2_hitbox3" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    7464 0 @@ -754,10 +757,10 @@ 1056 "p1_hitbox4" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    c18 0 @@ -766,10 +769,10 @@ 1057 "p2_hitbox4" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    7468 0 @@ -778,10 +781,10 @@ 1058 "p1_hitbox5" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    c1c 0 @@ -790,10 +793,10 @@ 1059 "p2_hitbox5" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    746C 0 @@ -802,10 +805,10 @@ 1060 "p1_activebox_x" - + 0000FF Float -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1060 0 @@ -814,10 +817,10 @@ 1061 "p2_activebox_x" - + 0000FF Float -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    78B0 0 @@ -826,10 +829,10 @@ 1062 "p1_activebox_y" - + 0000FF Float -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1064 0 @@ -838,10 +841,10 @@ 1063 "p2_activebox_y" - + 0000FF Float -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    78B4 0 @@ -850,10 +853,10 @@ 1064 "p1_activebox_z" - + 0000FF Float -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1068 0 @@ -862,10 +865,10 @@ 1065 "p2_activebox_z" - + 0000FF Float -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    78B8 0 @@ -874,10 +877,10 @@ 1066 "p1_health_percent" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    11e8 0 @@ -886,10 +889,10 @@ 1067 "p2_health_percent" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    7A38 0 @@ -898,10 +901,10 @@ 1068 "p1_input_counter" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    15B8 0 @@ -910,10 +913,10 @@ 1069 "p2_input_counter" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    7E08 0 @@ -922,10 +925,10 @@ 1078 "p1_rage_flag" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    99C 0 @@ -934,10 +937,10 @@ 1079 "p2_rage_flag" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    71EC 0 @@ -946,10 +949,10 @@ 1080 "p1_mystery_state" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    990 0 @@ -958,10 +961,10 @@ 1135 "p2_mystery_state" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    71E0 0 @@ -970,10 +973,10 @@ 1125 "p1_round_wins" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1A16c 0 @@ -982,10 +985,10 @@ 1126 "p2_round_wins" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1A23c 0 @@ -994,10 +997,10 @@ 1084 "p1_display_combo_counter" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1A200 0 @@ -1006,10 +1009,10 @@ 1120 "p2_display_combo_counter" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1A2D0 0 @@ -1018,10 +1021,10 @@ 1086 "p1_display_combo_damage" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1A1D8 0 @@ -1030,10 +1033,10 @@ 1087 "p2_display_combo_damage" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1A2A8 0 @@ -1042,10 +1045,10 @@ 1121 "p1_display_juggle_damage" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1A1DC 0 @@ -1054,10 +1057,10 @@ 1122 "p2_display_juggle_damage" - + 0000FF 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+3447B80
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1A2AC 0 @@ -1066,5 +1069,16 @@
    - + + + player_data_pointer_offset +
    0344E320
    +
    + + p2_data_offset +
    6930
    +
    +
    + How to update addresses after a patch: https://github.com/WAZAAAAA0/TekkenBot/wiki/How-to-update-addresses + From d00b71396784f7e1b0abf12905a683653671740d Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Mon, 3 Dec 2018 22:13:41 +0100 Subject: [PATCH 33/85] 2018-12-03 patch addresses 2.10 --- TekkenData/memory_address.ini | 62 +++++++++++++++++------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index 8b3ac99c..0a1d2d50 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,10 +1,10 @@ -;2018-09-05 patch addresses (2.00 Season 2 update, timestamp 1536191607, date from https://steamdb.info/app/389730/history/) +;2018-12-03 patch addresses (2.10 Marduk update, timestamp 1543859969, date from https://steamdb.info/app/389730/history/) ;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. [MemoryAddressOffsets] -player_data_pointer_offset = 0x03447B80 -p2_data_offset = 0x6870 -rollback_frame_offset = 0x1A680 +player_data_pointer_offset = 0x0344E320 +p2_data_offset = 0x6930 +rollback_frame_offset = 0x1AB10 ;----IGNORABLE START---- player_data_second_pointer_offset = 0 p2_end_block_offset = 0xD0 @@ -16,11 +16,11 @@ expected_module_address = 0x140000000 ;Might not have to be configurable [GameDataAddress] -frame_count = 0x1A1D0 +frame_count = 0x1A4D0 ;----IGNORABLE START---- ;frame_count = 0x6a0 ;resets sometimes on p1 backdash??? ;frame_count = 0x70C ;caps at 0xFF -facing = 0xad4 +facing = 0xAD4 timer_in_frames = 0x1A158 ;----IGNORABLE END---- @@ -29,7 +29,7 @@ timer_in_frames = 0x1A158 [EndBlockPlayerDataAddress] ;----IGNORABLE START---- -round_wins = 0x1A16c +round_wins = 0x1A16C ;p2_wins = 0x19BB4 display_combo_counter = 0x1A200 display_combo_damage = 0x1A1D8 @@ -45,7 +45,7 @@ total_moves_blocked = 0x19B5C ;Outdated ;NotUsed [PlayerDataAddress] -move_timer = 0x1f0 +move_timer = 0x1F0 move_id = 0x31C recovery = 0x368 hit_outcome = 0x3A4 @@ -55,29 +55,29 @@ stun_type = 0x3E4 throw_tech = 0x3F4 complex_move_state = 0x408 power_crush = 0x4FA -jump_flags = 0x544 -cancel_window = 0x568 -damage_taken = 0x6EC -input_attack = 0x15CC -input_direction = 0x15D0 -attack_startup = 0x6860 -attack_startup_end = 0x6864 +jump_flags = 0x594 +cancel_window = 0x5B8 +damage_taken = 0x73C +input_attack = 0x162C +input_direction = 0x1630 +attack_startup = 0x6920 +attack_startup_end = 0x6924 ;----IGNORABLE START---- -char_id = 0xd4 -attack_damage = 0x2fc -throw_flag = 0x3f8 -x = 0xc00 -y = 0xc04 -z = 0xc08 -hitbox1 = 0xc0c -hitbox2 = 0xc10 -hitbox3 = 0xc14 -hitbox4 = 0xc18 -hitbox5 = 0xc1c +char_id = 0xD4 +attack_damage = 0x2FC +throw_flag = 0x3F8 +x = 0xC00 +y = 0xC04 +z = 0xC08 +hitbox1 = 0xC0C +hitbox2 = 0xC10 +hitbox3 = 0xC14 +hitbox4 = 0xC18 +hitbox5 = 0xC1C activebox_x = 0x1060 activebox_y = 0x1064 activebox_z = 0x1068 -health_percent = 0x11e8 +health_percent = 0x11E8 movelist_to_use = 0x1208 input_counter = 0x15B8 ;goes up one every new input state, caps at 0x27 ;raw_array_start = 0xABC ;this is the raw 'buttons' pressed before they are assigned to 1,2,3,4, 1+2, etc @@ -92,10 +92,10 @@ juggle_height = 0x11D8 ;Outdated ;NotUsed [NonPlayerDataAddresses] -OPPONENT_NAME = 0x033FDB20 0x0 0x8 0x114 ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x033FDB20 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 -P1_Movelist = 0x03413220 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A -P2_Movelist = 0x03416100 0x2E8 +P1_Movelist = 0x03419720 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A +P2_Movelist = 0x0341C660 0x2E8 +OPPONENT_NAME = 0x03403C40 0x0 0x8 0x114 ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x03403C40 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 ;----IGNORABLE START---- P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 From 7d03315ac677758e3a8c94982c2bd0e9856b1b69 Mon Sep 17 00:00:00 2001 From: kokole <3148715+kokole@users.noreply.github.com> Date: Thu, 28 Feb 2019 21:05:25 +0100 Subject: [PATCH 34/85] 2.20 Patch addresses (without ignorables) --- TekkenData/memory_address.ini | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index 0a1d2d50..c8dd31e1 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,10 +1,10 @@ -;2018-12-03 patch addresses (2.10 Marduk update, timestamp 1543859969, date from https://steamdb.info/app/389730/history/) +;2019-02-28 patch addresses (2.20 Julia&Negan update, timestamp 1549252573, date from https://steamdb.info/app/389730/history/) ;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. [MemoryAddressOffsets] -player_data_pointer_offset = 0x0344E320 -p2_data_offset = 0x6930 -rollback_frame_offset = 0x1AB10 +player_data_pointer_offset = 0x0345D930 +p2_data_offset = 0x6a50 +rollback_frame_offset = 0x1AEE0 ;----IGNORABLE START---- player_data_second_pointer_offset = 0 p2_end_block_offset = 0xD0 @@ -16,7 +16,7 @@ expected_module_address = 0x140000000 ;Might not have to be configurable [GameDataAddress] -frame_count = 0x1A4D0 +frame_count = 0x1A950 ;----IGNORABLE START---- ;frame_count = 0x6a0 ;resets sometimes on p1 backdash??? ;frame_count = 0x70C ;caps at 0xFF @@ -58,10 +58,10 @@ power_crush = 0x4FA jump_flags = 0x594 cancel_window = 0x5B8 damage_taken = 0x73C -input_attack = 0x162C -input_direction = 0x1630 -attack_startup = 0x6920 -attack_startup_end = 0x6924 +input_attack = 0x16BC +input_direction = 0x16C0 +attack_startup = 0x6A40 +attack_startup_end = 0x6A44 ;----IGNORABLE START---- char_id = 0xD4 attack_damage = 0x2FC @@ -92,10 +92,10 @@ juggle_height = 0x11D8 ;Outdated ;NotUsed [NonPlayerDataAddresses] -P1_Movelist = 0x03419720 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A -P2_Movelist = 0x0341C660 0x2E8 -OPPONENT_NAME = 0x03403C40 0x0 0x8 0x114 ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x03403C40 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 +P1_Movelist = 0x034279F0 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A +P2_Movelist = 0x0342A9C0 0x2E8 +OPPONENT_NAME = 0x03411CC0 0x0 0x8 0x114 ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x03411CC0 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 ;----IGNORABLE START---- P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 @@ -109,4 +109,4 @@ WARMUP_PLAYER_NAME1 = 0x033B4408 0x50 0x0 ;OutOfDate ;look for name + opponent's WARMUP_PLAYER_WINS1 = 0x033B4408 0x50 -0x34 WARMUP_PLAYER_NAME2 = 0x033B4408 0x50 0x140 WARMUP_PLAYER_WINS2 = 0x033B4408 0x50 0x10C -;----IGNORABLE END---- \ No newline at end of file +;----IGNORABLE END---- From 68f72f90007895cbe680c1637838751a08278724 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 1 Mar 2019 08:41:03 +0100 Subject: [PATCH 35/85] FAQ --- README.md | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 53bd2835..12a9d86f 100644 --- a/README.md +++ b/README.md @@ -1,51 +1,51 @@ # TekkenBot AI and tools for playing and understanding Tekken 7. -Created by roguelike2d. Maintained by the community. MAKE SURE YOU ALWAYS HAVE THE LATEST VERSION OF memory_address.ini +Created by roguelike2d. Maintained by the community. -## Tools -Download from https://github.com/WAZAAAAA0/TekkenBot/releases +# Frequently asked questions +**Q:** What is this thing?\ +**A:** It's a program for Tekken 7 that shows frame data information of your moves in real-time on PC. + +**Q:** How do I use this thing?\ +**A:** Go to the releases page, download the latest `TekkenBotPrime_vXXX.zip`, extract the files somewhere, open `TekkenBotPrime.exe`, and finally hop into practice mode.\ +If you want to run from source instead, install Python 3 and run `GUI_TekkenBotPrime.py` + +**Q:** The bot stopped working after a game patch!\ +**A:** Wait for a good soul to update the `memory_address.ini` file, or fix it yourself by following the guide on the Wiki. + +**Q:** The frame advantage of this move seems wrong!\ +**A:** Double check using the alternative "manual" method to find frame advantage with the help of `tiny_live_frame_data_numbers`: +1. mirror match (because not all characters have the same jumps) +2. do your attack, neutral jump, and don't do anything else +3. set the dummy to neutral jump as second action\ +...the little numbers near the big frame advantage ones should now hopefully display the correct advantage. + +**Q:** I'm getting the `PID not found` error even though the game is running!\ +**A:** Start the bot as admin (or alternatively start the game as non-admin). -If you're using a compiled release version, run TekkenBotPrime.exe. If you're running from source with Python 3 installed, run GUI_TekkenBotPrime.py +**Q:** The bot doesn't show!\ +**A:** Play borderless or windowed, full screen doesn't work. +**Q:** But I really really want to play full screen otherwise my game will lag!\ +**A:** If you have a multi-monitor setup, enable `overlay_as_draggable_window` and move the overlay to a different monitor. +## Tools ### FrameDataOverlay A window that can go over the game to display real time move information read from memory. Requires the game to be in windowed or borderless to work or can be run as a standalone window on a second screen. ![Robot feet and bear paws 1](Screenshots/frame_data.png?raw=true) - ### CommandInputOverlay Display command inputs, similar to the one already in Tekken 7 except it gives frame by frame information and includes cancelable frames. ![Robot feet and bear paws 2](Screenshots/command_input.png?raw=true) - ## Bots Currently in progress. - ### Details Tekken Bot bots are programs that plays Tekken 7 on PC by reading the game's memory, making decisions based on the game state, and then inputting keyboarding commands. Ultimately the goal is to create emergent behavior either through specific coding it or, if possible, a generalized learning algorithm. - - ### Frame Trap Bot Pushes jab or a user inputted move when getting out of block stun. - ### Punisher Bot Attempts to punish negative attacks with the best available punish. Punishes are listed in the character's file in the /TekkenData folder. - - ## Project details - ### Prerequisites Tekken Bot is developed on Python 3.5 and tries to use only core libraries to improve portability, download size, and, someday, optimization. It targets the 64-bit version of Tekken 7 available through Steam on Windows 7/8/10. - ### Deployment Tekken Bot distributable is built using pyinstaller with Python 3.5. On Windows, use the included build_project.bat file. - -### Updating Memory Addresses with Cheat Engine after patches -When Tekken 7.exe is patched on Steam, it may change the location in memory of the relevant addresses. To find the new addresses, use Cheat Engine or another memory editor to locate the values, then find the new pointer addresses: - -Currently, Tekken Bot only needs one value (Tekken7.exe Base + first offset --> follow that pointer to a second pointer --> follow the second pointer to the base of the player data object in memory). -To find the player data object you can use the following values for player 1 animation ids: - * Standing: 32769 - * Crouching (holding down, no direction. Hold for a second to avoid the crouching animation id): 32770 - -Alternately, you can search for move damage which is displayed in training mode and active (usually) for the duration of the move. - -Whatever you find, there should be 9 values, eight in addresses located close together and one far away. Find the offset to the pointer to the pointer of any of the first 8 and replace the 'player_data_pointer_offset' value in MemoryAddressEnum.py. \ No newline at end of file From 7c2a2b89a1712f0dc1bf95c90a47d72da1b77e5b Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 1 Mar 2019 08:42:07 +0100 Subject: [PATCH 36/85] version number --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index b450f9ca..a5ae5823 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.12.0' +CURRENT_VERSION = 'v0.13.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.12.0' in CURRENT_VERSION: + if 'v0.13.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From 015b301cb3540cc9061d38d5fe80fb163f37644a Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 1 Mar 2019 08:42:52 +0100 Subject: [PATCH 37/85] Update build_project.bat pyinstaller requirement --- build_project.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build_project.bat b/build_project.bat index 02502855..aa2a6915 100644 --- a/build_project.bat +++ b/build_project.bat @@ -1,4 +1,4 @@ +::get pyinstaller if you haven't already! +::pip install pyinstaller pyinstaller --windowed --clean --icon=TekkenData/tekken_bot_close.ico --add-data TekkenData;TekkenData --name TekkenBotPrime GUI_TekkenBotPrime.py -::alternative sample command for building: -::"C:%HOMEPATH%\AppData\Local\Programs\Python\Python36-32\Scripts\pyinstaller.exe" --windowed --clean --icon=TekkenData/tekken_bot_close.ico --add-data TekkenData;TekkenData --name TekkenBotPrime GUI_TekkenBotPrime.py pause \ No newline at end of file From 39ee22e26aafd615ec06c84a3c7afb74373cbb42 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 1 Mar 2019 08:48:27 +0100 Subject: [PATCH 38/85] 2019-02-28 CT 2.20 (by kokole) --- CE_TekkenBot.CT | 212 ++++++++++++++++++++++++------------------------ 1 file changed, 106 insertions(+), 106 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index 975fbb36..58e2f726 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -1,5 +1,5 @@ - + b7Ej%2nldAU:MM2b.}cxWeIh0Gi32eO*Ft]WMuP5%{mcIVgA6t9Fkwal+AgInNpI$=7,zGoLEqjnV-i7R=ffx00 @@ -21,29 +21,29 @@ 1008 "rollback_frame_offset" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1AB10 + 1AEE0 0
    1009 "frame_count" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1A4D0 + 1A950 0
    1014 "p1_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -54,7 +54,7 @@ 1018 "p1_move_id" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -65,7 +65,7 @@ 1020 "p1_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -76,7 +76,7 @@ 1022 "p1_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -87,7 +87,7 @@ 1024 "p1_attack_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -98,7 +98,7 @@ 1026 "p1_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -109,7 +109,7 @@ 1028 "p1_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -120,7 +120,7 @@ 1030 "p1_throw_tech" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -131,7 +131,7 @@ 1034 "p1_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -142,7 +142,7 @@ 1123 "p1_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -153,7 +153,7 @@ 1038 "p1_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -164,7 +164,7 @@ 1040 "p1_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -175,7 +175,7 @@ 1042 "p1_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -186,51 +186,51 @@ 1070 "p1_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 162C + 16BC 0
    1072 "p1_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1630 + 16C0 0
    1074 "p1_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6920 + 6A40 0
    1076 "p1_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6924 + 6A44 0
    1147 "p2_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -241,7 +241,7 @@ 1148 "p2_move_id" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -252,7 +252,7 @@ 1149 "p2_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -263,7 +263,7 @@ 1150 "p2_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -274,7 +274,7 @@ 1151 "p2_attack_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -285,7 +285,7 @@ 1152 "p2_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -296,7 +296,7 @@ 1153 "p2_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -307,7 +307,7 @@ 1154 "p2_throw_tech" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -318,7 +318,7 @@ 1156 "p2_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -329,7 +329,7 @@ 1157 "p2_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -340,7 +340,7 @@ 1158 "p2_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -351,7 +351,7 @@ 1159 "p2_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -362,7 +362,7 @@ 1160 "p2_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -373,57 +373,57 @@ 1161 "p2_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 162C+p2_data_offset + 16BC+p2_data_offset 0
    1162 "p2_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1630+p2_data_offset + 16C0+p2_data_offset 0
    1163 "p2_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6920+p2_data_offset + 6A40+p2_data_offset 0
    1164 "p2_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6924+p2_data_offset + 6A44+p2_data_offset 0
    1105 "p1_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+03419720
    +
    "TekkenGame-Win64-Shipping.exe"+034279F0
    2E8 @@ -431,13 +431,13 @@ 1127 "p2_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+0341C660
    +
    "TekkenGame-Win64-Shipping.exe"+0342A9C0
    2E8 @@ -445,13 +445,13 @@ 1129 "OPPONENT_NAME" - + String 13 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+03403C40
    +
    "TekkenGame-Win64-Shipping.exe"+03411CC0
    114 8 @@ -461,9 +461,9 @@ 1131 "OPPONENT_SIDE" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+03403C40
    +
    "TekkenGame-Win64-Shipping.exe"+03411CC0
    70 8 @@ -481,7 +481,7 @@ 1005 "player_data_second_pointer_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -493,7 +493,7 @@ 1102 "player_data_second_pointer_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -505,7 +505,7 @@ 1007 "p2_end_block_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -517,7 +517,7 @@ 1010 "facing" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -529,7 +529,7 @@ 1011 "timer_in_frames" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -541,7 +541,7 @@ 1012 "p1_char_id" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -553,7 +553,7 @@ 1013 "p2_char_id" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -565,7 +565,7 @@ 1016 "p1_attack_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -577,7 +577,7 @@ 1017 "p2_attack_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -589,7 +589,7 @@ 1032 "p1_throw_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -601,7 +601,7 @@ 1155 "p2_throw_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -613,7 +613,7 @@ 1044 "p1_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -625,7 +625,7 @@ 1045 "p2_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -637,7 +637,7 @@ 1046 "p1_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -649,7 +649,7 @@ 1047 "p2_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -661,7 +661,7 @@ 1048 "p1_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -673,7 +673,7 @@ 1049 "p2_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -685,7 +685,7 @@ 1050 "p1_hitbox1" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -697,7 +697,7 @@ 1051 "p2_hitbox1" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -709,7 +709,7 @@ 1052 "p1_hitbox2" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -721,7 +721,7 @@ 1053 "p2_hitbox2" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -733,7 +733,7 @@ 1054 "p1_hitbox3" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -745,7 +745,7 @@ 1055 "p2_hitbox3" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -757,7 +757,7 @@ 1056 "p1_hitbox4" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -769,7 +769,7 @@ 1057 "p2_hitbox4" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -781,7 +781,7 @@ 1058 "p1_hitbox5" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -793,7 +793,7 @@ 1059 "p2_hitbox5" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -805,7 +805,7 @@ 1060 "p1_activebox_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -817,7 +817,7 @@ 1061 "p2_activebox_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -829,7 +829,7 @@ 1062 "p1_activebox_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -841,7 +841,7 @@ 1063 "p2_activebox_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -853,7 +853,7 @@ 1064 "p1_activebox_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -865,7 +865,7 @@ 1065 "p2_activebox_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -877,7 +877,7 @@ 1066 "p1_health_percent" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -889,7 +889,7 @@ 1067 "p2_health_percent" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -901,7 +901,7 @@ 1068 "p1_input_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -913,7 +913,7 @@ 1069 "p2_input_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -925,7 +925,7 @@ 1078 "p1_rage_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -937,7 +937,7 @@ 1079 "p2_rage_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -949,7 +949,7 @@ 1080 "p1_mystery_state" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -961,7 +961,7 @@ 1135 "p2_mystery_state" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -973,7 +973,7 @@ 1125 "p1_round_wins" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -985,7 +985,7 @@ 1126 "p2_round_wins" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -997,7 +997,7 @@ 1084 "p1_display_combo_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1009,7 +1009,7 @@ 1120 "p2_display_combo_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1021,7 +1021,7 @@ 1086 "p1_display_combo_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1033,7 +1033,7 @@ 1087 "p2_display_combo_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1045,7 +1045,7 @@ 1121 "p1_display_juggle_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1057,7 +1057,7 @@ 1122 "p2_display_juggle_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1072,11 +1072,11 @@ player_data_pointer_offset -
    0344E320
    +
    0345D930
    p2_data_offset -
    6930
    +
    6a50
    How to update addresses after a patch: https://github.com/WAZAAAAA0/TekkenBot/wiki/How-to-update-addresses From 799b92149a41ccd9047e8ac991764ed413e77796 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 31 May 2019 12:08:10 +0200 Subject: [PATCH 39/85] version number --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index a5ae5823..6c0fd791 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.13.0' +CURRENT_VERSION = 'v0.14.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.13.0' in CURRENT_VERSION: + if 'v0.14.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From c32761b8ddefec6cf08859b43a646a033bb0b1ea Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 31 May 2019 12:10:06 +0200 Subject: [PATCH 40/85] FAQ fix --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 12a9d86f..049bec18 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ Created by roguelike2d. Maintained by the community. **Q:** What is this thing?\ **A:** It's a program for Tekken 7 that shows frame data information of your moves in real-time on PC. -**Q:** How do I use this thing?\ +**Q:** How do I use it?\ **A:** Go to the releases page, download the latest `TekkenBotPrime_vXXX.zip`, extract the files somewhere, open `TekkenBotPrime.exe`, and finally hop into practice mode.\ -If you want to run from source instead, install Python 3 and run `GUI_TekkenBotPrime.py` +If you'd rather run from source instead, install Python 3 and run `GUI_TekkenBotPrime.py` **Q:** The bot stopped working after a game patch!\ **A:** Wait for a good soul to update the `memory_address.ini` file, or fix it yourself by following the guide on the Wiki. From c75a4a8911f63d7dc57bb2bd6209a322a1ddf938 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 31 May 2019 12:11:48 +0200 Subject: [PATCH 41/85] missing character codes Co-Authored-By: Alchemy-Meister --- MoveInfoEnums.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/MoveInfoEnums.py b/MoveInfoEnums.py index 3f3470d3..af94bea3 100644 --- a/MoveInfoEnums.py +++ b/MoveInfoEnums.py @@ -229,6 +229,19 @@ class CharacterCodes(Enum): EDDY = 35 ELIZA = 36 MIGUEL = 37 + TEKKEN_FORCE = 38 # Not selectable + KID_KAZUYA = 39 # Not selectable + JACK_4 = 40 # Not selectable + YOUNG_HEIHACHI = 41 # Not selectable + TRAINING_DUMMY = 42 # Not selectable + GEESE = 43 # DLC + NOCTIS = 44 # DLC + ANNA = 45 # DLC + LEI = 46 # DLC + MARDUK = 47 # DLC + ARMOR_KING = 48 # DLC + JULIA = 49 # DLC + NEGAN = 50 # DLC NOT_YET_LOADED = 71 #value when a match starts for (??) frames until char_id loads From 5f59367aa5aa79f35032315a2169f6d30cace1ca Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 31 May 2019 12:14:01 +0200 Subject: [PATCH 42/85] 2019-05-30 patch addresses 2.30 --- CE_TekkenBot.CT | 238 +++++++++++++++++----------------- TekkenData/memory_address.ini | 14 +- 2 files changed, 125 insertions(+), 127 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index 58e2f726..fea218fb 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -21,7 +21,7 @@ 1008 "rollback_frame_offset" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -32,7 +32,7 @@ 1009 "frame_count" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -43,7 +43,7 @@ 1014 "p1_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -54,7 +54,7 @@ 1018 "p1_move_id" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -65,7 +65,7 @@ 1020 "p1_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -76,7 +76,7 @@ 1022 "p1_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -87,7 +87,7 @@ 1024 "p1_attack_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -98,7 +98,7 @@ 1026 "p1_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -109,7 +109,7 @@ 1028 "p1_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -120,7 +120,7 @@ 1030 "p1_throw_tech" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -131,7 +131,7 @@ 1034 "p1_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -142,7 +142,7 @@ 1123 "p1_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -153,7 +153,7 @@ 1038 "p1_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -164,7 +164,7 @@ 1040 "p1_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -175,7 +175,7 @@ 1042 "p1_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -186,7 +186,7 @@ 1070 "p1_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -197,7 +197,7 @@ 1072 "p1_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -208,7 +208,7 @@ 1074 "p1_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -219,7 +219,7 @@ 1076 "p1_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -227,10 +227,21 @@ 0
    + + 4446 + "p1_char_id" + + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + dc + 0 + +
    1147 "p2_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -241,7 +252,7 @@ 1148 "p2_move_id" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -252,7 +263,7 @@ 1149 "p2_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -263,7 +274,7 @@ 1150 "p2_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -274,7 +285,7 @@ 1151 "p2_attack_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -285,7 +296,7 @@ 1152 "p2_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -296,7 +307,7 @@ 1153 "p2_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -307,7 +318,7 @@ 1154 "p2_throw_tech" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -318,7 +329,7 @@ 1156 "p2_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -329,7 +340,7 @@ 1157 "p2_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -340,7 +351,7 @@ 1158 "p2_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -351,7 +362,7 @@ 1159 "p2_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -362,7 +373,7 @@ 1160 "p2_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -373,7 +384,7 @@ 1161 "p2_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -384,7 +395,7 @@ 1162 "p2_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -395,7 +406,7 @@ 1163 "p2_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -406,7 +417,7 @@ 1164 "p2_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -414,16 +425,27 @@ 0
    + + 4447 + "p2_char_id" + + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + DC+p2_data_offset + 0 + +
    1105 "p1_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034279F0
    +
    "TekkenGame-Win64-Shipping.exe"+0342C9F0
    2E8 @@ -431,13 +453,13 @@ 1127 "p2_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+0342A9C0
    +
    "TekkenGame-Win64-Shipping.exe"+0342F9C0
    2E8 @@ -445,13 +467,13 @@ 1129 "OPPONENT_NAME" - + String 13 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+03411CC0
    +
    "TekkenGame-Win64-Shipping.exe"+03416CC0
    114 8 @@ -461,9 +483,9 @@ 1131 "OPPONENT_SIDE" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+03411CC0
    +
    "TekkenGame-Win64-Shipping.exe"+03416CC0
    70 8 @@ -474,14 +496,14 @@ 1136 "----IGNORABLE----" - + 0000FF 1 1005 "player_data_second_pointer_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -493,7 +515,7 @@ 1102 "player_data_second_pointer_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -505,7 +527,7 @@ 1007 "p2_end_block_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -517,7 +539,7 @@ 1010 "facing" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -529,7 +551,7 @@ 1011 "timer_in_frames" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -538,34 +560,10 @@ 0
    - - 1012 - "p1_char_id" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - d4 - 0 - -
    - - 1013 - "p2_char_id" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 6924 - 0 - -
    1016 "p1_attack_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -577,7 +575,7 @@ 1017 "p2_attack_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -589,7 +587,7 @@ 1032 "p1_throw_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -601,7 +599,7 @@ 1155 "p2_throw_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -613,7 +611,7 @@ 1044 "p1_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -625,7 +623,7 @@ 1045 "p2_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -637,7 +635,7 @@ 1046 "p1_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -649,7 +647,7 @@ 1047 "p2_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -661,7 +659,7 @@ 1048 "p1_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -673,7 +671,7 @@ 1049 "p2_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -685,7 +683,7 @@ 1050 "p1_hitbox1" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -697,7 +695,7 @@ 1051 "p2_hitbox1" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -709,7 +707,7 @@ 1052 "p1_hitbox2" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -721,7 +719,7 @@ 1053 "p2_hitbox2" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -733,7 +731,7 @@ 1054 "p1_hitbox3" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -745,7 +743,7 @@ 1055 "p2_hitbox3" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -757,7 +755,7 @@ 1056 "p1_hitbox4" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -769,7 +767,7 @@ 1057 "p2_hitbox4" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -781,7 +779,7 @@ 1058 "p1_hitbox5" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -793,7 +791,7 @@ 1059 "p2_hitbox5" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -805,7 +803,7 @@ 1060 "p1_activebox_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -817,7 +815,7 @@ 1061 "p2_activebox_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -829,7 +827,7 @@ 1062 "p1_activebox_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -841,7 +839,7 @@ 1063 "p2_activebox_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -853,7 +851,7 @@ 1064 "p1_activebox_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -865,7 +863,7 @@ 1065 "p2_activebox_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -877,7 +875,7 @@ 1066 "p1_health_percent" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -889,7 +887,7 @@ 1067 "p2_health_percent" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -901,7 +899,7 @@ 1068 "p1_input_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -913,7 +911,7 @@ 1069 "p2_input_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -925,7 +923,7 @@ 1078 "p1_rage_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -937,7 +935,7 @@ 1079 "p2_rage_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -949,7 +947,7 @@ 1080 "p1_mystery_state" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -961,7 +959,7 @@ 1135 "p2_mystery_state" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -973,7 +971,7 @@ 1125 "p1_round_wins" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -985,7 +983,7 @@ 1126 "p2_round_wins" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -997,7 +995,7 @@ 1084 "p1_display_combo_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1009,7 +1007,7 @@ 1120 "p2_display_combo_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1021,7 +1019,7 @@ 1086 "p1_display_combo_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1033,7 +1031,7 @@ 1087 "p2_display_combo_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1045,7 +1043,7 @@ 1121 "p1_display_juggle_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1057,7 +1055,7 @@ 1122 "p2_display_juggle_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1070,14 +1068,14 @@
    - - player_data_pointer_offset -
    0345D930
    -
    p2_data_offset
    6a50
    + + player_data_pointer_offset +
    03462930
    +
    How to update addresses after a patch: https://github.com/WAZAAAAA0/TekkenBot/wiki/How-to-update-addresses diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index c8dd31e1..89a9fdcc 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,8 +1,8 @@ -;2019-02-28 patch addresses (2.20 Julia&Negan update, timestamp 1549252573, date from https://steamdb.info/app/389730/history/) +;2019-05-30 patch addresses (2.30 Geese nerf update, timestamp 1559211558, date from https://steamdb.info/app/389730/history/) ;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. [MemoryAddressOffsets] -player_data_pointer_offset = 0x0345D930 +player_data_pointer_offset = 0x03462930 p2_data_offset = 0x6a50 rollback_frame_offset = 0x1AEE0 ;----IGNORABLE START---- @@ -62,8 +62,8 @@ input_attack = 0x16BC input_direction = 0x16C0 attack_startup = 0x6A40 attack_startup_end = 0x6A44 +char_id = 0xDC ;----IGNORABLE START---- -char_id = 0xD4 attack_damage = 0x2FC throw_flag = 0x3F8 x = 0xC00 @@ -92,10 +92,10 @@ juggle_height = 0x11D8 ;Outdated ;NotUsed [NonPlayerDataAddresses] -P1_Movelist = 0x034279F0 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A -P2_Movelist = 0x0342A9C0 0x2E8 -OPPONENT_NAME = 0x03411CC0 0x0 0x8 0x114 ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x03411CC0 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 +P1_Movelist = 0x0342C9F0 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A +P2_Movelist = 0x0342F9C0 0x2E8 +OPPONENT_NAME = 0x03416CC0 0x0 0x8 0x114 ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x03416CC0 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 ;----IGNORABLE START---- P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 From e94bc62abe34823f2a259280b5162eaa7a0f196f Mon Sep 17 00:00:00 2001 From: Lucas Priestley Date: Fri, 31 May 2019 22:22:21 -0500 Subject: [PATCH 43/85] Add startup and recovery frame display to command input overlay --- GUI_CommandInputOverlay.py | 31 ++++++++++++++++++++++--------- TekkenGameState.py | 11 +++++++++++ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/GUI_CommandInputOverlay.py b/GUI_CommandInputOverlay.py index ce294aab..da66ec7f 100644 --- a/GUI_CommandInputOverlay.py +++ b/GUI_CommandInputOverlay.py @@ -66,36 +66,49 @@ def __init__(self, master, launcher): self.stored_inputs = [] self.stored_cancels = [] - + # Update state to reflect game state one frame ago def update_state(self): GUI_Overlay.Overlay.update_state(self) if self.launcher.gameState.stateLog[-1].is_player_player_one: input = self.launcher.gameState.stateLog[-1].bot.GetInputState() cancelable = self.launcher.gameState.stateLog[-1].bot.is_cancelable - bufferable = self.launcher.gameState.stateLog[-1].bot.is_bufferable + bufferable1 = self.launcher.gameState.stateLog[-1].bot.is_bufferable parry1 = self.launcher.gameState.stateLog[-1].bot.is_parry_1 parry2 = self.launcher.gameState.stateLog[-1].bot.is_parry_2 + starting = self.launcher.gameState.stateLog[-1].bot.is_starting + recovering = self.launcher.gameState.stateLog[-1].bot.is_recovering else: input = self.launcher.gameState.stateLog[-1].opp.GetInputState() cancelable = self.launcher.gameState.stateLog[-1].opp.is_cancelable - bufferable = self.launcher.gameState.stateLog[-1].opp.is_bufferable + bufferable1 = self.launcher.gameState.stateLog[-1].opp.is_bufferable parry1 = self.launcher.gameState.stateLog[-1].opp.is_parry_1 parry2 = self.launcher.gameState.stateLog[-1].opp.is_parry_2 + starting = self.launcher.gameState.stateLog[-1].opp.is_starting + recovering = self.launcher.gameState.stateLog[-1].opp.is_recovering frame_count = self.launcher.gameState.stateLog[-1].frame_count #print(input) - self.update_input(input, self.color_from_cancel_booleans(cancelable, bufferable, parry1, parry2)) - - def color_from_cancel_booleans(self, cancelable, bufferable, parry1, parry2): + self.update_input(input, self.color_from_cancel_booleans( + cancelable, bufferable1, parry1, parry2, starting, recovering)) + + def color_from_cancel_booleans(self, cancelable, bufferable1, parry1, parry2, starting, recovering): + + # default + fill_color = 'snow' + if starting: + fill_color = 'green4' + elif recovering: + fill_color = 'red4' + if parry1: fill_color = 'orange' elif parry2: fill_color = 'yellow' - elif bufferable: + elif bufferable1: fill_color = 'MediumOrchid1' elif cancelable: fill_color = 'SteelBlue1' - else: - fill_color = 'firebrick1' + + return fill_color def update_input(self, input, cancel_color): diff --git a/TekkenGameState.py b/TekkenGameState.py index 52cc598d..0ce98a0a 100644 --- a/TekkenGameState.py +++ b/TekkenGameState.py @@ -339,11 +339,22 @@ def Bake(self): self.power_crush_flag = d['PlayerDataAddress.power_crush'] > 0 cancel_window_bitmask = d['PlayerDataAddress.cancel_window'] + recovery_window_bitmask = d['PlayerDataAddress.recovery'] + # TODO FLAG CLEANUP LATER self.is_cancelable = (CancelStatesBitmask.CANCELABLE.value & cancel_window_bitmask) == CancelStatesBitmask.CANCELABLE.value self.is_bufferable = (CancelStatesBitmask.BUFFERABLE.value & cancel_window_bitmask) == CancelStatesBitmask.BUFFERABLE.value self.is_parry_1 = (CancelStatesBitmask.PARRYABLE_1.value & cancel_window_bitmask) == CancelStatesBitmask.PARRYABLE_1.value self.is_parry_2 = (CancelStatesBitmask.PARRYABLE_2.value & cancel_window_bitmask) == CancelStatesBitmask.PARRYABLE_2.value + + self.is_recovering = (ComplexMoveStates.RECOVERING.value & recovery_window_bitmask) == ComplexMoveStates.RECOVERING.value + + self.is_starting = False + # Check is player is in startup + if self.startup > 0: + self.is_starting = (self.move_timer <= self.startup) + else: + self.is_starting = False self.throw_tech = ThrowTechs(d['PlayerDataAddress.throw_tech']) From 5014643af2a70a647188a56371b70bc527dd465b Mon Sep 17 00:00:00 2001 From: Lucas Priestley Date: Fri, 31 May 2019 22:27:21 -0500 Subject: [PATCH 44/85] cleanup code before pull request --- GUI_CommandInputOverlay.py | 12 ++++++------ TekkenGameState.py | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/GUI_CommandInputOverlay.py b/GUI_CommandInputOverlay.py index da66ec7f..8ceaf12b 100644 --- a/GUI_CommandInputOverlay.py +++ b/GUI_CommandInputOverlay.py @@ -72,7 +72,7 @@ def update_state(self): if self.launcher.gameState.stateLog[-1].is_player_player_one: input = self.launcher.gameState.stateLog[-1].bot.GetInputState() cancelable = self.launcher.gameState.stateLog[-1].bot.is_cancelable - bufferable1 = self.launcher.gameState.stateLog[-1].bot.is_bufferable + bufferable = self.launcher.gameState.stateLog[-1].bot.is_bufferable parry1 = self.launcher.gameState.stateLog[-1].bot.is_parry_1 parry2 = self.launcher.gameState.stateLog[-1].bot.is_parry_2 starting = self.launcher.gameState.stateLog[-1].bot.is_starting @@ -80,7 +80,7 @@ def update_state(self): else: input = self.launcher.gameState.stateLog[-1].opp.GetInputState() cancelable = self.launcher.gameState.stateLog[-1].opp.is_cancelable - bufferable1 = self.launcher.gameState.stateLog[-1].opp.is_bufferable + bufferable = self.launcher.gameState.stateLog[-1].opp.is_bufferable parry1 = self.launcher.gameState.stateLog[-1].opp.is_parry_1 parry2 = self.launcher.gameState.stateLog[-1].opp.is_parry_2 starting = self.launcher.gameState.stateLog[-1].opp.is_starting @@ -88,9 +88,9 @@ def update_state(self): frame_count = self.launcher.gameState.stateLog[-1].frame_count #print(input) self.update_input(input, self.color_from_cancel_booleans( - cancelable, bufferable1, parry1, parry2, starting, recovering)) + cancelable, bufferable, parry1, parry2, starting, recovering)) - def color_from_cancel_booleans(self, cancelable, bufferable1, parry1, parry2, starting, recovering): + def color_from_cancel_booleans(self, cancelable, bufferable, parry1, parry2, starting, recovering): # default fill_color = 'snow' @@ -103,12 +103,12 @@ def color_from_cancel_booleans(self, cancelable, bufferable1, parry1, parry2, st fill_color = 'orange' elif parry2: fill_color = 'yellow' - elif bufferable1: + elif bufferable: fill_color = 'MediumOrchid1' elif cancelable: fill_color = 'SteelBlue1' - + return fill_color def update_input(self, input, cancel_color): diff --git a/TekkenGameState.py b/TekkenGameState.py index 0ce98a0a..df7c975c 100644 --- a/TekkenGameState.py +++ b/TekkenGameState.py @@ -341,7 +341,6 @@ def Bake(self): cancel_window_bitmask = d['PlayerDataAddress.cancel_window'] recovery_window_bitmask = d['PlayerDataAddress.recovery'] - # TODO FLAG CLEANUP LATER self.is_cancelable = (CancelStatesBitmask.CANCELABLE.value & cancel_window_bitmask) == CancelStatesBitmask.CANCELABLE.value self.is_bufferable = (CancelStatesBitmask.BUFFERABLE.value & cancel_window_bitmask) == CancelStatesBitmask.BUFFERABLE.value self.is_parry_1 = (CancelStatesBitmask.PARRYABLE_1.value & cancel_window_bitmask) == CancelStatesBitmask.PARRYABLE_1.value From 8a3ff5e2075b5b68796067b77fad728b7261f2ae Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 11 Sep 2019 01:19:25 +0200 Subject: [PATCH 45/85] forks info --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 049bec18..5a0babff 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +Check out these experimental forks for new TekkenBotPrime features:\ +https://github.com/Alchemy-Meister/TekkenBot/ \ +https://github.com/compsyguy/TekkenBot/ + # TekkenBot AI and tools for playing and understanding Tekken 7. From 67f3f88215634bb9278af064007b75f151769f25 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 11 Sep 2019 01:22:35 +0200 Subject: [PATCH 46/85] version number --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index 6c0fd791..0ab0fb6c 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.14.0' +CURRENT_VERSION = 'v0.15.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.14.0' in CURRENT_VERSION: + if 'v0.15.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From 2bd40118d0b3ed54d169c242c8af1839f90ca582 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 11 Sep 2019 01:24:23 +0200 Subject: [PATCH 47/85] Revert "Merge branch 'master' of https://github.com/WAZAAAAA0/TekkenBot" This reverts commit 5705b4d0009864bd274033adc76c1180b9ded748, reversing changes made to 67f3f88215634bb9278af064007b75f151769f25. --- GUI_CommandInputOverlay.py | 25 ++++++------------------- TekkenGameState.py | 10 ---------- 2 files changed, 6 insertions(+), 29 deletions(-) diff --git a/GUI_CommandInputOverlay.py b/GUI_CommandInputOverlay.py index 8ceaf12b..ce294aab 100644 --- a/GUI_CommandInputOverlay.py +++ b/GUI_CommandInputOverlay.py @@ -66,7 +66,7 @@ def __init__(self, master, launcher): self.stored_inputs = [] self.stored_cancels = [] - # Update state to reflect game state one frame ago + def update_state(self): GUI_Overlay.Overlay.update_state(self) if self.launcher.gameState.stateLog[-1].is_player_player_one: @@ -75,30 +75,17 @@ def update_state(self): bufferable = self.launcher.gameState.stateLog[-1].bot.is_bufferable parry1 = self.launcher.gameState.stateLog[-1].bot.is_parry_1 parry2 = self.launcher.gameState.stateLog[-1].bot.is_parry_2 - starting = self.launcher.gameState.stateLog[-1].bot.is_starting - recovering = self.launcher.gameState.stateLog[-1].bot.is_recovering else: input = self.launcher.gameState.stateLog[-1].opp.GetInputState() cancelable = self.launcher.gameState.stateLog[-1].opp.is_cancelable bufferable = self.launcher.gameState.stateLog[-1].opp.is_bufferable parry1 = self.launcher.gameState.stateLog[-1].opp.is_parry_1 parry2 = self.launcher.gameState.stateLog[-1].opp.is_parry_2 - starting = self.launcher.gameState.stateLog[-1].opp.is_starting - recovering = self.launcher.gameState.stateLog[-1].opp.is_recovering frame_count = self.launcher.gameState.stateLog[-1].frame_count #print(input) - self.update_input(input, self.color_from_cancel_booleans( - cancelable, bufferable, parry1, parry2, starting, recovering)) - - def color_from_cancel_booleans(self, cancelable, bufferable, parry1, parry2, starting, recovering): - - # default - fill_color = 'snow' - if starting: - fill_color = 'green4' - elif recovering: - fill_color = 'red4' - + self.update_input(input, self.color_from_cancel_booleans(cancelable, bufferable, parry1, parry2)) + + def color_from_cancel_booleans(self, cancelable, bufferable, parry1, parry2): if parry1: fill_color = 'orange' elif parry2: @@ -107,8 +94,8 @@ def color_from_cancel_booleans(self, cancelable, bufferable, parry1, parry2, sta fill_color = 'MediumOrchid1' elif cancelable: fill_color = 'SteelBlue1' - - + else: + fill_color = 'firebrick1' return fill_color def update_input(self, input, cancel_color): diff --git a/TekkenGameState.py b/TekkenGameState.py index df7c975c..52cc598d 100644 --- a/TekkenGameState.py +++ b/TekkenGameState.py @@ -339,21 +339,11 @@ def Bake(self): self.power_crush_flag = d['PlayerDataAddress.power_crush'] > 0 cancel_window_bitmask = d['PlayerDataAddress.cancel_window'] - recovery_window_bitmask = d['PlayerDataAddress.recovery'] self.is_cancelable = (CancelStatesBitmask.CANCELABLE.value & cancel_window_bitmask) == CancelStatesBitmask.CANCELABLE.value self.is_bufferable = (CancelStatesBitmask.BUFFERABLE.value & cancel_window_bitmask) == CancelStatesBitmask.BUFFERABLE.value self.is_parry_1 = (CancelStatesBitmask.PARRYABLE_1.value & cancel_window_bitmask) == CancelStatesBitmask.PARRYABLE_1.value self.is_parry_2 = (CancelStatesBitmask.PARRYABLE_2.value & cancel_window_bitmask) == CancelStatesBitmask.PARRYABLE_2.value - - self.is_recovering = (ComplexMoveStates.RECOVERING.value & recovery_window_bitmask) == ComplexMoveStates.RECOVERING.value - - self.is_starting = False - # Check is player is in startup - if self.startup > 0: - self.is_starting = (self.move_timer <= self.startup) - else: - self.is_starting = False self.throw_tech = ThrowTechs(d['PlayerDataAddress.throw_tech']) From 2d73ec4233f04e4881d04fedde88c15338b80e8e Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 11 Sep 2019 01:26:34 +0200 Subject: [PATCH 48/85] new character ID Co-Authored-By: Alchemy-Meister --- MoveInfoEnums.py | 1 + 1 file changed, 1 insertion(+) diff --git a/MoveInfoEnums.py b/MoveInfoEnums.py index af94bea3..68c82239 100644 --- a/MoveInfoEnums.py +++ b/MoveInfoEnums.py @@ -242,6 +242,7 @@ class CharacterCodes(Enum): ARMOR_KING = 48 # DLC JULIA = 49 # DLC NEGAN = 50 # DLC + ZAFINA = 51 # DLC NOT_YET_LOADED = 71 #value when a match starts for (??) frames until char_id loads From 50673d2c1be94cf9e50e1bcb5262a52002edc31c Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 11 Sep 2019 01:29:26 +0200 Subject: [PATCH 49/85] additional offset fix Co-Authored-By: compsyguy --- TekkenGameState.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/TekkenGameState.py b/TekkenGameState.py index 52cc598d..a79c1d8e 100644 --- a/TekkenGameState.py +++ b/TekkenGameState.py @@ -182,7 +182,18 @@ def GetUpdatedState(self, rollback_frame = 0): if self.module_address != None: processHandle = OpenProcess(0x10, False, self.pid) try: - player_data_base_address = self.GetValueFromAddress(processHandle, self.module_address + self.player_data_pointer_offset, is64bit = True) + addresses = list(map(to_hex, self.player_data_pointer_offset.split())) + value = self.module_address + for i, offset in enumerate(addresses): + if i + 1 < len(addresses): + value = self.GetValueFromAddress(processHandle, value + offset, is64bit=True) + else: + value = self.GetValueFromAddress(processHandle, value + offset, isString=False) + + player_data_base_address = value + + + #player_data_base_address = self.GetValueFromAddress(processHandle, self.module_address + self.player_data_pointer_offset, is64bit = True) if player_data_base_address == 0: if not self.needReaquireGameState: print("No fight detected. Gamestate not updated.") @@ -339,11 +350,21 @@ def Bake(self): self.power_crush_flag = d['PlayerDataAddress.power_crush'] > 0 cancel_window_bitmask = d['PlayerDataAddress.cancel_window'] + recovery_window_bitmask = d['PlayerDataAddress.recovery'] self.is_cancelable = (CancelStatesBitmask.CANCELABLE.value & cancel_window_bitmask) == CancelStatesBitmask.CANCELABLE.value self.is_bufferable = (CancelStatesBitmask.BUFFERABLE.value & cancel_window_bitmask) == CancelStatesBitmask.BUFFERABLE.value self.is_parry_1 = (CancelStatesBitmask.PARRYABLE_1.value & cancel_window_bitmask) == CancelStatesBitmask.PARRYABLE_1.value self.is_parry_2 = (CancelStatesBitmask.PARRYABLE_2.value & cancel_window_bitmask) == CancelStatesBitmask.PARRYABLE_2.value + + self.is_recovering = (ComplexMoveStates.RECOVERING.value & recovery_window_bitmask) == ComplexMoveStates.RECOVERING.value + + self.is_starting = False + # Check is player is in startup + if self.startup > 0: + self.is_starting = (self.move_timer <= self.startup) + else: + self.is_starting = False self.throw_tech = ThrowTechs(d['PlayerDataAddress.throw_tech']) From 3aa14ee69ab5e0e8569022cafc402d9c80c52918 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 11 Sep 2019 01:31:07 +0200 Subject: [PATCH 50/85] 2019-09-09 patch addresses 3.00 (by Gelatin) Co-Authored-By: jlee366 --- CE_TekkenBot.CT | 343 +++++++++++++++++++--------------- TekkenData/memory_address.ini | 69 +++---- 2 files changed, 222 insertions(+), 190 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index fea218fb..30172bb5 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -1,7 +1,8 @@ - + b7Ej%2nldAU:MM2b.}cxWeIh0Gi32eO*Ft]WMuP5%{mcIVgA6t9Fkwal+AgInNpI$=7,zGoLEqjnV-i7R=ffx00 + b7Ej%2nldAU:MM2b.}cxWeIh0Gi32eO*Ft]WMuP5%{mcIVgA6t9Fkwal+AgInNpI$=7,zGoLEqjnV-i7R=ffx00 @@ -21,431 +22,445 @@ 1008 "rollback_frame_offset" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1AEE0 + 1C020 + 0 0
    1009 "frame_count" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1A950 + 78C + 0 0
    1014 "p1_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1F0 0 + 0
    1018 "p1_move_id" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 31C + 32C + 0 0
    1020 "p1_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 368 + 378 + 0 0
    1022 "p1_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3A4 + 3B4 + 0 0
    1024 "p1_attack_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3DC + 3EC + 0 0
    1026 "p1_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3E0 + 3F0 + 0 0
    1028 "p1_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3E4 + 3F4 + 0 0
    1030 "p1_throw_tech" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3F4 + 404 + 0 0
    1034 "p1_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 408 + 418 + 0 0
    1123 "p1_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 4FA + 522 + 0 0
    1038 "p1_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 594 + 5B4 + 0 0
    1040 "p1_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 5B8 + 5D8 + 0 0
    1042 "p1_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 73C + 76C + 0 0
    1070 "p1_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 16BC + 175C + 0 0
    1072 "p1_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 16C0 + 1760 + 0 0
    1074 "p1_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6A40 + 6E80 + 0 0
    1076 "p1_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6A44 + 6E84 0 - -
    - - 4446 - "p1_char_id" - - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - dc 0
    1147 "p2_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1F0+p2_data_offset 0 + 0
    1148 "p2_move_id" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 31C+p2_data_offset + 32C+p2_data_offset + 0 0
    1149 "p2_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 368+p2_data_offset + 378+p2_data_offset + 0 0
    1150 "p2_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3A4+p2_data_offset + 3B4+p2_data_offset + 0 0
    1151 "p2_attack_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3DC+p2_data_offset + 3EC+p2_data_offset + 0 0
    1152 "p2_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3E0+p2_data_offset + 3F0+p2_data_offset + 0 0
    1153 "p2_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3E4+p2_data_offset + 3F4+p2_data_offset + 0 0
    1154 "p2_throw_tech" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3F4+p2_data_offset + 404+p2_data_offset + 0 0
    1156 "p2_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 408+p2_data_offset + 418+p2_data_offset + 0 0
    1157 "p2_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 4FA+p2_data_offset + 522+p2_data_offset + 0 0
    1158 "p2_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 594+p2_data_offset + 5B4+p2_data_offset + 0 0
    1159 "p2_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 5B8+p2_data_offset + 5D8+p2_data_offset + 0 0
    1160 "p2_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 73C+p2_data_offset + 76C+p2_data_offset + 0 0
    1161 "p2_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 16BC+p2_data_offset + 175C+p2_data_offset + 0 0
    1162 "p2_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 16C0+p2_data_offset + 1760+p2_data_offset + 0 0
    1163 "p2_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6A40+p2_data_offset + 6E80+p2_data_offset + 0 0
    1164 "p2_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6A44+p2_data_offset + 6E84+p2_data_offset 0 - -
    - - 4447 - "p2_char_id" - - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - DC+p2_data_offset 0
    - 1105 + 4448 "p1_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+0342C9F0
    +
    "TekkenGame-Win64-Shipping.exe"+034855D0
    2E8 @@ -453,13 +468,13 @@ 1127 "p2_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+0342F9C0
    +
    "TekkenGame-Win64-Shipping.exe"+034887C0
    2E8 @@ -467,13 +482,13 @@ 1129 "OPPONENT_NAME" - + String 13 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+03416CC0
    +
    "TekkenGame-Win64-Shipping.exe"+0346F810
    114 8 @@ -483,9 +498,9 @@ 1131 "OPPONENT_SIDE" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+03416CC0
    +
    "TekkenGame-Win64-Shipping.exe"+0346F810
    70 8 @@ -496,14 +511,14 @@ 1136 "----IGNORABLE----" - + 0000FF 1 1005 "player_data_second_pointer_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -515,7 +530,7 @@ 1102 "player_data_second_pointer_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -527,7 +542,7 @@ 1007 "p2_end_block_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -539,7 +554,7 @@ 1010 "facing" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -551,7 +566,7 @@ 1011 "timer_in_frames" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -560,10 +575,34 @@ 0
    + + 1012 + "p1_char_id" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + d4 + 0 + +
    + + 1013 + "p2_char_id" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 6924 + 0 + +
    1016 "p1_attack_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -575,7 +614,7 @@ 1017 "p2_attack_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -587,7 +626,7 @@ 1032 "p1_throw_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -599,7 +638,7 @@ 1155 "p2_throw_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -611,7 +650,7 @@ 1044 "p1_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -623,7 +662,7 @@ 1045 "p2_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -635,7 +674,7 @@ 1046 "p1_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -647,7 +686,7 @@ 1047 "p2_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -659,7 +698,7 @@ 1048 "p1_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -671,7 +710,7 @@ 1049 "p2_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -683,7 +722,7 @@ 1050 "p1_hitbox1" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -695,7 +734,7 @@ 1051 "p2_hitbox1" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -707,7 +746,7 @@ 1052 "p1_hitbox2" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -719,7 +758,7 @@ 1053 "p2_hitbox2" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -731,7 +770,7 @@ 1054 "p1_hitbox3" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -743,7 +782,7 @@ 1055 "p2_hitbox3" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -755,7 +794,7 @@ 1056 "p1_hitbox4" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -767,7 +806,7 @@ 1057 "p2_hitbox4" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -779,7 +818,7 @@ 1058 "p1_hitbox5" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -791,7 +830,7 @@ 1059 "p2_hitbox5" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -803,7 +842,7 @@ 1060 "p1_activebox_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -815,7 +854,7 @@ 1061 "p2_activebox_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -827,7 +866,7 @@ 1062 "p1_activebox_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -839,7 +878,7 @@ 1063 "p2_activebox_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -851,7 +890,7 @@ 1064 "p1_activebox_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -863,7 +902,7 @@ 1065 "p2_activebox_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -875,7 +914,7 @@ 1066 "p1_health_percent" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -887,7 +926,7 @@ 1067 "p2_health_percent" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -899,7 +938,7 @@ 1068 "p1_input_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -911,7 +950,7 @@ 1069 "p2_input_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -923,7 +962,7 @@ 1078 "p1_rage_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -935,7 +974,7 @@ 1079 "p2_rage_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -947,7 +986,7 @@ 1080 "p1_mystery_state" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -959,7 +998,7 @@ 1135 "p2_mystery_state" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -971,7 +1010,7 @@ 1125 "p1_round_wins" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -983,7 +1022,7 @@ 1126 "p2_round_wins" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -995,7 +1034,7 @@ 1084 "p1_display_combo_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1007,7 +1046,7 @@ 1120 "p2_display_combo_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1019,7 +1058,7 @@ 1086 "p1_display_combo_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1031,7 +1070,7 @@ 1087 "p2_display_combo_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1043,7 +1082,7 @@ 1121 "p1_display_juggle_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1055,7 +1094,7 @@ 1122 "p2_display_juggle_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1069,12 +1108,12 @@
    - p2_data_offset -
    6a50
    + player_data_pointer_offset +
    034BC4C0
    - player_data_pointer_offset -
    03462930
    + p2_data_offset +
    6E90
    How to update addresses after a patch: https://github.com/WAZAAAAA0/TekkenBot/wiki/How-to-update-addresses diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index 89a9fdcc..375c89c8 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,22 +1,21 @@ -;2019-05-30 patch addresses (2.30 Geese nerf update, timestamp 1559211558, date from https://steamdb.info/app/389730/history/) +;2019-09-09 patch addresses (3.00 Zafina update, timestamp 1568016084, date from https://steamdb.info/app/389730/history/) ;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. + [MemoryAddressOffsets] -player_data_pointer_offset = 0x03462930 -p2_data_offset = 0x6a50 -rollback_frame_offset = 0x1AEE0 +player_data_pointer_offset = 0x034BC4C0 0x0 +p2_data_offset = 0x6E90 +rollback_frame_offset = 0x1C020 ;----IGNORABLE START---- -player_data_second_pointer_offset = 0 +;player_data_second_pointer_offset = 0 p2_end_block_offset = 0xD0 movelist_size = 2000000 expected_module_address = 0x140000000 ;Might not have to be configurable ;----IGNORABLE END---- - - [GameDataAddress] -frame_count = 0x1A950 +frame_count = 0x78C ;----IGNORABLE START---- ;frame_count = 0x6a0 ;resets sometimes on p1 backdash??? ;frame_count = 0x70C ;caps at 0xFF @@ -25,11 +24,9 @@ timer_in_frames = 0x1A158 ;----IGNORABLE END---- - - [EndBlockPlayerDataAddress] +round_wins = 0x1A16C ;semi-ignorable, makes round counting work ;----IGNORABLE START---- -round_wins = 0x1A16C ;p2_wins = 0x19BB4 display_combo_counter = 0x1A200 display_combo_damage = 0x1A1D8 @@ -42,30 +39,28 @@ total_moves_blocked = 0x19B5C ;Outdated ;NotUsed ;----IGNORABLE END---- - - [PlayerDataAddress] move_timer = 0x1F0 -move_id = 0x31C -recovery = 0x368 -hit_outcome = 0x3A4 -attack_type = 0x3DC -simple_move_state = 0x3E0 -stun_type = 0x3E4 -throw_tech = 0x3F4 -complex_move_state = 0x408 -power_crush = 0x4FA -jump_flags = 0x594 -cancel_window = 0x5B8 -damage_taken = 0x73C -input_attack = 0x16BC -input_direction = 0x16C0 -attack_startup = 0x6A40 -attack_startup_end = 0x6A44 -char_id = 0xDC +move_id = 0x32C +recovery = 0x378 +hit_outcome = 0x3B4 +attack_type = 0x3EC +simple_move_state = 0x3F0 +stun_type = 0x3F4 +throw_tech = 0x404 +complex_move_state = 0x418 +power_crush = 0x522 +jump_flags = 0x5B4 +cancel_window = 0x5D8 +damage_taken = 0x76C +input_attack = 0x175C +input_direction = 0x1760 +attack_startup = 0x6E80 +attack_startup_end = 0x6E84 +char_id = 0xDC ;semi-ignorable, full list of character ID's can be found inside MoveInfoEnums.py ;----IGNORABLE START---- attack_damage = 0x2FC -throw_flag = 0x3F8 +throw_flag = 0x0 ;semi-ignorable, might affect the "type" column x = 0xC00 y = 0xC04 z = 0xC08 @@ -89,13 +84,11 @@ juggle_height = 0x11D8 ;Outdated ;NotUsed ;----IGNORABLE END---- - - [NonPlayerDataAddresses] -P1_Movelist = 0x0342C9F0 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A -P2_Movelist = 0x0342F9C0 0x2E8 -OPPONENT_NAME = 0x03416CC0 0x0 0x8 0x114 ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x03416CC0 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 +P1_Movelist = 0x034855D0 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A +P2_Movelist = 0x034887C0 0x2E8 +OPPONENT_NAME = 0x0346F810 0x0 0x8 0x114 ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x0346F810 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 ;----IGNORABLE START---- P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 @@ -109,4 +102,4 @@ WARMUP_PLAYER_NAME1 = 0x033B4408 0x50 0x0 ;OutOfDate ;look for name + opponent's WARMUP_PLAYER_WINS1 = 0x033B4408 0x50 -0x34 WARMUP_PLAYER_NAME2 = 0x033B4408 0x50 0x140 WARMUP_PLAYER_WINS2 = 0x033B4408 0x50 0x10C -;----IGNORABLE END---- +;----IGNORABLE END---- \ No newline at end of file From a9d5742d978f1ae9f5933a1eae9260d4a6c1662b Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sat, 14 Dec 2019 07:02:50 +0100 Subject: [PATCH 51/85] correct steps order --- README.md | 6 +++--- TekkenData/tekken_bot_readme.txt | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5a0babff..c7e9781a 100644 --- a/README.md +++ b/README.md @@ -20,9 +20,9 @@ If you'd rather run from source instead, install Python 3 and run `GUI_TekkenBot **Q:** The frame advantage of this move seems wrong!\ **A:** Double check using the alternative "manual" method to find frame advantage with the help of `tiny_live_frame_data_numbers`: -1. mirror match (because not all characters have the same jumps) -2. do your attack, neutral jump, and don't do anything else -3. set the dummy to neutral jump as second action\ +1. start a mirror match (because not all characters have the same jumps) +2. set the dummy to neutral jump as second action +3. do your attack, neutral jump, and don't do anything else\ ...the little numbers near the big frame advantage ones should now hopefully display the correct advantage. **Q:** I'm getting the `PID not found` error even though the game is running!\ diff --git a/TekkenData/tekken_bot_readme.txt b/TekkenData/tekken_bot_readme.txt index ce9419b6..10e26992 100644 --- a/TekkenData/tekken_bot_readme.txt +++ b/TekkenData/tekken_bot_readme.txt @@ -1,7 +1,5 @@ ------TEKKEN BOT README------ *** MAKE SURE YOU ALWAYS HAVE THE LATEST VERSION OF memory_address.ini*** -*** MAKE SURE YOU ALWAYS HAVE THE LATEST VERSION OF memory_address.ini*** -*** MAKE SURE YOU ALWAYS HAVE THE LATEST VERSION OF memory_address.ini*** * Launch Tekken 7, then launch Tekken Bot by clicking on TekkenBotPrime.exe. Tekken Bot should automatically locate the running Tekken 7 instance and start reading its memory. If Tekken 7 is running with admin rights, make sure you also run Tekken Bot with them. * Frame Data Overlay requires Tekken 7 to be in windowed or windowed borderless mode (switch first to windowed, THEN to borderless). * Users with multiple monitors can get the overlay as a separate, draggable window on their second monitor (display -> overlay_as_draggable_window). From 490112e1812f6e0fcbf2bd293f6301f1fff8e3a3 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sat, 14 Dec 2019 07:03:36 +0100 Subject: [PATCH 52/85] version number --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index 0ab0fb6c..2d9f2949 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.15.0' +CURRENT_VERSION = 'v0.16.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.15.0' in CURRENT_VERSION: + if 'v0.16.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From a7e4ace407ed873067b17b10ce11375ae04b942b Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sat, 14 Dec 2019 07:04:12 +0100 Subject: [PATCH 53/85] new character IDs --- MoveInfoEnums.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MoveInfoEnums.py b/MoveInfoEnums.py index 68c82239..d0c35478 100644 --- a/MoveInfoEnums.py +++ b/MoveInfoEnums.py @@ -243,6 +243,8 @@ class CharacterCodes(Enum): JULIA = 49 # DLC NEGAN = 50 # DLC ZAFINA = 51 # DLC + GANRYU = 52 # DLC + LEROY = 53 # DLC NOT_YET_LOADED = 71 #value when a match starts for (??) frames until char_id loads From 020e1e51d86ff2bacf3b51021827f068f15555d6 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sat, 14 Dec 2019 07:06:51 +0100 Subject: [PATCH 54/85] 2019-12-09 CT 3.10 (added extras) Co-Authored-By: compsyguy Co-Authored-By: porcino Co-Authored-By: FimoX Co-Authored-By: Alchemy-Meister --- CE_TekkenBot.CT | 356 ++++++++++++++++++++++++++---------------------- 1 file changed, 191 insertions(+), 165 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index 30172bb5..943e15ba 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -22,445 +22,445 @@ 1008 "rollback_frame_offset" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1C020 - 0 + 1DEF0 0 + 8
    1009 "frame_count" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 78C - 0 + A30 0 + 8
    1014 "p1_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1F0 0 - 0 + 8
    1018 "p1_move_id" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 32C - 0 + 344 0 + 8
    1020 "p1_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 378 - 0 + 390 0 + 8
    1022 "p1_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3B4 - 0 + 3CC 0 + 8
    1024 "p1_attack_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3EC - 0 + 40C 0 + 8
    1026 "p1_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3F0 - 0 + 410 0 + 8
    1028 "p1_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3F4 - 0 + 414 0 + 8
    1030 "p1_throw_tech" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 404 - 0 + 428 0 + 8
    1034 "p1_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 418 - 0 + 43C 0 + 8
    1123 "p1_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 522 - 0 + 682 0 + 8
    1038 "p1_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 5B4 - 0 + 714 0 + 8
    1040 "p1_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 5D8 - 0 + 748 0 + 8
    1042 "p1_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 76C - 0 + 8FC 0 + 8
    1070 "p1_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 175C - 0 + 195C 0 + 8
    1072 "p1_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1760 - 0 + D3C 0 + 8
    1074 "p1_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6E80 - 0 + 7580 0 + 8
    1076 "p1_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6E84 - 0 + 7584 0 + 8
    1147 "p2_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    1F0+p2_data_offset 0 - 0 + 8
    1148 "p2_move_id" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 32C+p2_data_offset - 0 + 344+p2_data_offset 0 + 8
    1149 "p2_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 378+p2_data_offset - 0 + 390+p2_data_offset 0 + 8
    1150 "p2_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3B4+p2_data_offset - 0 + 3CC+p2_data_offset 0 + 8
    1151 "p2_attack_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3EC+p2_data_offset - 0 + 40C+p2_data_offset 0 + 8
    1152 "p2_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3F0+p2_data_offset - 0 + 410+p2_data_offset 0 + 8
    1153 "p2_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3F4+p2_data_offset - 0 + 414+p2_data_offset 0 + 8
    1154 "p2_throw_tech" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 404+p2_data_offset - 0 + 428+p2_data_offset 0 + 8
    1156 "p2_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 418+p2_data_offset - 0 + 43C+p2_data_offset 0 + 8
    1157 "p2_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 522+p2_data_offset - 0 + 682+p2_data_offset 0 + 8
    1158 "p2_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 5B4+p2_data_offset - 0 + 714+p2_data_offset 0 + 8
    1159 "p2_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 5D8+p2_data_offset - 0 + 748+p2_data_offset 0 + 8
    1160 "p2_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 76C+p2_data_offset - 0 + 8FC+p2_data_offset 0 + 8
    1161 "p2_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 175C+p2_data_offset - 0 + 195C+p2_data_offset 0 + 8
    1162 "p2_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1760+p2_data_offset - 0 + D3C+p2_data_offset 0 + 8
    1163 "p2_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6E80+p2_data_offset - 0 + 7580+p2_data_offset 0 + 8
    1164 "p2_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6E84+p2_data_offset - 0 + 7584+p2_data_offset 0 + 8
    4448 "p1_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034855D0
    +
    "TekkenGame-Win64-Shipping.exe"+034B0C90
    2E8 @@ -468,13 +468,13 @@ 1127 "p2_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034887C0
    +
    "TekkenGame-Win64-Shipping.exe"+034B4200
    2E8 @@ -482,13 +482,13 @@ 1129 "OPPONENT_NAME" - + String 13 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+0346F810
    +
    "TekkenGame-Win64-Shipping.exe"+0349ABB0
    114 8 @@ -498,9 +498,9 @@ 1131 "OPPONENT_SIDE" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+0346F810
    +
    "TekkenGame-Win64-Shipping.exe"+0349ABB0
    70 8 @@ -518,7 +518,7 @@ 1005 "player_data_second_pointer_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -530,7 +530,7 @@ 1102 "player_data_second_pointer_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -542,7 +542,7 @@ 1007 "p2_end_block_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -554,7 +554,7 @@ 1010 "facing" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -566,7 +566,7 @@ 1011 "timer_in_frames" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -578,7 +578,7 @@ 1012 "p1_char_id" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -590,7 +590,7 @@ 1013 "p2_char_id" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -602,7 +602,7 @@ 1016 "p1_attack_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -614,7 +614,7 @@ 1017 "p2_attack_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -626,7 +626,7 @@ 1032 "p1_throw_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -638,7 +638,7 @@ 1155 "p2_throw_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -650,7 +650,7 @@ 1044 "p1_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -662,7 +662,7 @@ 1045 "p2_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -674,7 +674,7 @@ 1046 "p1_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -686,7 +686,7 @@ 1047 "p2_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -698,7 +698,7 @@ 1048 "p1_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -710,7 +710,7 @@ 1049 "p2_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -722,7 +722,7 @@ 1050 "p1_hitbox1" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -734,7 +734,7 @@ 1051 "p2_hitbox1" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -746,7 +746,7 @@ 1052 "p1_hitbox2" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -758,7 +758,7 @@ 1053 "p2_hitbox2" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -770,7 +770,7 @@ 1054 "p1_hitbox3" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -782,7 +782,7 @@ 1055 "p2_hitbox3" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -794,7 +794,7 @@ 1056 "p1_hitbox4" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -806,7 +806,7 @@ 1057 "p2_hitbox4" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -818,7 +818,7 @@ 1058 "p1_hitbox5" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -830,7 +830,7 @@ 1059 "p2_hitbox5" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -842,7 +842,7 @@ 1060 "p1_activebox_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -854,7 +854,7 @@ 1061 "p2_activebox_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -866,7 +866,7 @@ 1062 "p1_activebox_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -878,7 +878,7 @@ 1063 "p2_activebox_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -890,7 +890,7 @@ 1064 "p1_activebox_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -902,7 +902,7 @@ 1065 "p2_activebox_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -914,7 +914,7 @@ 1066 "p1_health_percent" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -926,7 +926,7 @@ 1067 "p2_health_percent" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -938,7 +938,7 @@ 1068 "p1_input_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -950,7 +950,7 @@ 1069 "p2_input_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -962,7 +962,7 @@ 1078 "p1_rage_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -974,7 +974,7 @@ 1079 "p2_rage_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -986,7 +986,7 @@ 1080 "p1_mystery_state" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -998,7 +998,7 @@ 1135 "p2_mystery_state" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1010,7 +1010,7 @@ 1125 "p1_round_wins" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1022,7 +1022,7 @@ 1126 "p2_round_wins" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1034,7 +1034,7 @@ 1084 "p1_display_combo_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1046,7 +1046,7 @@ 1120 "p2_display_combo_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1058,7 +1058,7 @@ 1086 "p1_display_combo_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1070,7 +1070,7 @@ 1087 "p2_display_combo_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1082,7 +1082,7 @@ 1121 "p1_display_juggle_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1094,7 +1094,7 @@ 1122 "p2_display_juggle_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1105,15 +1105,41 @@
    + + 4485 + "----EXTRA----" + + + FF9900 + 1 + + + 4486 + "FrameCounter" + + FF9900 + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+34B013C
    +
    + + 4487 + "Distance" + + FF9900 + Float +
    "TekkenGame-Win64-Shipping.exe"+34B008C
    +
    +
    +
    player_data_pointer_offset -
    034BC4C0
    +
    034E9388
    p2_data_offset -
    6E90
    +
    0x7640
    How to update addresses after a patch: https://github.com/WAZAAAAA0/TekkenBot/wiki/How-to-update-addresses From 861ec2db3737c7db8334ed116a55cd8d00aa8d83 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sat, 14 Dec 2019 07:08:14 +0100 Subject: [PATCH 55/85] 2019-12-09 patch addresses 3.10 (by Psylence, porcino, FimoX, Alchemy-Meister) Co-Authored-By: compsyguy Co-Authored-By: porcino Co-Authored-By: FimoX Co-Authored-By: Alchemy-Meister --- TekkenData/memory_address.ini | 65 ++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index 375c89c8..92164f76 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,11 +1,11 @@ -;2019-09-09 patch addresses (3.00 Zafina update, timestamp 1568016084, date from https://steamdb.info/app/389730/history/) +;2019-12-09 patch addresses (3.10 Leroy update, timestamp 1575878728, date from https://steamdb.info/app/389730/history/) ;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. [MemoryAddressOffsets] -player_data_pointer_offset = 0x034BC4C0 0x0 -p2_data_offset = 0x6E90 -rollback_frame_offset = 0x1C020 +player_data_pointer_offset = 0x034E9388 0x8 +p2_data_offset = 0x7640 +rollback_frame_offset = 0x1DEF0 ;----IGNORABLE START---- ;player_data_second_pointer_offset = 0 p2_end_block_offset = 0xD0 @@ -15,18 +15,18 @@ expected_module_address = 0x140000000 ;Might not have to be configurable [GameDataAddress] -frame_count = 0x78C +frame_count = 0xA30 ;----IGNORABLE START---- ;frame_count = 0x6a0 ;resets sometimes on p1 backdash??? ;frame_count = 0x70C ;caps at 0xFF -facing = 0xAD4 +facing = 0xD44 timer_in_frames = 0x1A158 ;----IGNORABLE END---- [EndBlockPlayerDataAddress] -round_wins = 0x1A16C ;semi-ignorable, makes round counting work ;----IGNORABLE START---- +round_wins = 0x1BA6C ;semi-ignorable, for a fork, makes round counting work ;p2_wins = 0x19BB4 display_combo_counter = 0x1A200 display_combo_damage = 0x1A1D8 @@ -41,29 +41,30 @@ total_moves_blocked = 0x19B5C ;Outdated ;NotUsed [PlayerDataAddress] move_timer = 0x1F0 -move_id = 0x32C -recovery = 0x378 -hit_outcome = 0x3B4 -attack_type = 0x3EC -simple_move_state = 0x3F0 -stun_type = 0x3F4 -throw_tech = 0x404 -complex_move_state = 0x418 -power_crush = 0x522 -jump_flags = 0x5B4 -cancel_window = 0x5D8 -damage_taken = 0x76C -input_attack = 0x175C -input_direction = 0x1760 -attack_startup = 0x6E80 -attack_startup_end = 0x6E84 -char_id = 0xDC ;semi-ignorable, full list of character ID's can be found inside MoveInfoEnums.py +move_id = 0x344 +recovery = 0x390 +hit_outcome = 0x3CC +attack_type = 0x40C +simple_move_state = 0x410 +stun_type = 0x414 +throw_tech = 0x428 +complex_move_state = 0x43C +power_crush = 0x682 +jump_flags = 0x714 +cancel_window = 0x748 +damage_taken = 0x8FC +input_attack = 0x195C +input_direction = 0xD3C +attack_startup = 0x7580 +attack_startup_end = 0x7584 +char_id = 0xDC ;semi-ignorable, for a fork, full list of character ID's can be found inside MoveInfoEnums.py ;----IGNORABLE START---- -attack_damage = 0x2FC +current_side = 0x123C ;semi-ignorable, for a fork throw_flag = 0x0 ;semi-ignorable, might affect the "type" column -x = 0xC00 -y = 0xC04 -z = 0xC08 +attack_damage = 0x2FC +x = 0xE70 +y = 0xE74 +z = 0xE78 hitbox1 = 0xC0C hitbox2 = 0xC10 hitbox3 = 0xC14 @@ -85,10 +86,10 @@ juggle_height = 0x11D8 ;Outdated ;NotUsed [NonPlayerDataAddresses] -P1_Movelist = 0x034855D0 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A -P2_Movelist = 0x034887C0 0x2E8 -OPPONENT_NAME = 0x0346F810 0x0 0x8 0x114 ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x0346F810 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 +P1_Movelist = 0x034B0C90 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A +P2_Movelist = 0x034B4200 0x2E8 +OPPONENT_NAME = 0x0349ABB0 0x0 0x8 0x114 ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x0349ABB0 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 ;----IGNORABLE START---- P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 From 89868ca67054c24c4570dd6e78bbebdfd4e1f604 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 14 Feb 2020 19:05:20 +0100 Subject: [PATCH 56/85] version number --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index 2d9f2949..4f2f6287 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.16.0' +CURRENT_VERSION = 'v0.17.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.16.0' in CURRENT_VERSION: + if 'v0.17.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From 01880ef9f54b0061fd08bde03a64613c965b88b0 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 14 Feb 2020 19:06:02 +0100 Subject: [PATCH 57/85] accommodating the new Jump status --- MoveInfoEnums.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MoveInfoEnums.py b/MoveInfoEnums.py index d0c35478..59bc94c8 100644 --- a/MoveInfoEnums.py +++ b/MoveInfoEnums.py @@ -153,7 +153,7 @@ class HitOutcome(Enum): class JumpFlagBitmask(Enum): #GROUND = 0x800000 #LANDING_OR_STANDING = 0x810000 - JUMP = 0x820000 + JUMP = 0x4 class InputDirectionCodes(Enum): NULL = 0 From c8c21aed6d51b857c96ebbe99759deffd15ecf3e Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 14 Feb 2020 19:06:41 +0100 Subject: [PATCH 58/85] 2020-02-12 3.21 CT --- CE_TekkenBot.CT | 249 ++++++++++++++++++++++++------------------------ 1 file changed, 124 insertions(+), 125 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index 943e15ba..135c0b80 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -22,11 +22,11 @@ 1008 "rollback_frame_offset" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1DEF0 + 1E080 0 8 @@ -34,11 +34,11 @@ 1009 "frame_count" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - A30 + A40 0 8 @@ -46,7 +46,7 @@ 1014 "p1_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -58,7 +58,7 @@ 1018 "p1_move_id" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -70,7 +70,7 @@ 1020 "p1_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -82,7 +82,7 @@ 1022 "p1_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -94,7 +94,7 @@ 1024 "p1_attack_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -106,7 +106,7 @@ 1026 "p1_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -118,7 +118,7 @@ 1028 "p1_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -130,11 +130,11 @@ 1030 "p1_throw_tech" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 428 + 430 0 8 @@ -142,11 +142,11 @@ 1034 "p1_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 43C + 444 0 8 @@ -154,23 +154,23 @@ 1123 "p1_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 682 + 690 0 8
    - 1038 + 4541 "p1_jump_flags" - - 4 Bytes + + 2 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 714 + 726 0 8 @@ -178,11 +178,11 @@ 1040 "p1_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 748 + 758 0 8 @@ -190,11 +190,11 @@ 1042 "p1_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 8FC + 90C 0 8 @@ -202,11 +202,11 @@ 1070 "p1_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 195C + 198c 0 8 @@ -214,11 +214,11 @@ 1072 "p1_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - D3C + 1990 0 8 @@ -226,11 +226,11 @@ 1074 "p1_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 7580 + 75e0 0 8 @@ -238,11 +238,11 @@ 1076 "p1_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 7584 + 75e4 0 8 @@ -250,7 +250,7 @@ 1147 "p2_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -262,7 +262,7 @@ 1148 "p2_move_id" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -274,7 +274,7 @@ 1149 "p2_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -286,7 +286,7 @@ 1150 "p2_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -298,7 +298,7 @@ 1151 "p2_attack_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -310,7 +310,7 @@ 1152 "p2_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -322,7 +322,7 @@ 1153 "p2_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -334,11 +334,11 @@ 1154 "p2_throw_tech" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 428+p2_data_offset + 430+p2_data_offset 0 8 @@ -346,11 +346,11 @@ 1156 "p2_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 43C+p2_data_offset + 444+p2_data_offset 0 8 @@ -358,11 +358,11 @@ 1157 "p2_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 682+p2_data_offset + 690+p2_data_offset 0 8 @@ -370,11 +370,11 @@ 1158 "p2_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 714+p2_data_offset + 726+p2_data_offset 0 8 @@ -382,11 +382,11 @@ 1159 "p2_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 748+p2_data_offset + 758+p2_data_offset 0 8 @@ -394,11 +394,11 @@ 1160 "p2_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 8FC+p2_data_offset + 90C+p2_data_offset 0 8 @@ -406,11 +406,11 @@ 1161 "p2_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 195C+p2_data_offset + 198c+p2_data_offset 0 8 @@ -418,11 +418,11 @@ 1162 "p2_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - D3C+p2_data_offset + 1990+p2_data_offset 0 8 @@ -430,11 +430,11 @@ 1163 "p2_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 7580+p2_data_offset + 75e0+p2_data_offset 0 8 @@ -442,11 +442,11 @@ 1164 "p2_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 7584+p2_data_offset + 75e4+p2_data_offset 0 8 @@ -454,13 +454,13 @@ 4448 "p1_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034B0C90
    +
    "TekkenGame-Win64-Shipping.exe"+034CF130
    2E8 @@ -468,13 +468,13 @@ 1127 "p2_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034B4200
    +
    "TekkenGame-Win64-Shipping.exe"+034D26D0
    2E8 @@ -482,13 +482,13 @@ 1129 "OPPONENT_NAME" - + String 13 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+0349ABB0
    +
    "TekkenGame-Win64-Shipping.exe"+034B8F80
    114 8 @@ -498,9 +498,9 @@ 1131 "OPPONENT_SIDE" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+0349ABB0
    +
    "TekkenGame-Win64-Shipping.exe"+034B8F80
    70 8 @@ -518,7 +518,7 @@ 1005 "player_data_second_pointer_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -530,7 +530,7 @@ 1102 "player_data_second_pointer_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -542,7 +542,7 @@ 1007 "p2_end_block_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -554,7 +554,7 @@ 1010 "facing" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -566,7 +566,7 @@ 1011 "timer_in_frames" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -578,7 +578,7 @@ 1012 "p1_char_id" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -590,7 +590,7 @@ 1013 "p2_char_id" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -602,7 +602,7 @@ 1016 "p1_attack_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -614,7 +614,7 @@ 1017 "p2_attack_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -626,7 +626,7 @@ 1032 "p1_throw_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -638,7 +638,7 @@ 1155 "p2_throw_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -650,7 +650,7 @@ 1044 "p1_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -662,7 +662,7 @@ 1045 "p2_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -674,7 +674,7 @@ 1046 "p1_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -686,7 +686,7 @@ 1047 "p2_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -698,7 +698,7 @@ 1048 "p1_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -710,7 +710,7 @@ 1049 "p2_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -722,7 +722,7 @@ 1050 "p1_hitbox1" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -734,7 +734,7 @@ 1051 "p2_hitbox1" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -746,7 +746,7 @@ 1052 "p1_hitbox2" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -758,7 +758,7 @@ 1053 "p2_hitbox2" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -770,7 +770,7 @@ 1054 "p1_hitbox3" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -782,7 +782,7 @@ 1055 "p2_hitbox3" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -794,7 +794,7 @@ 1056 "p1_hitbox4" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -806,7 +806,7 @@ 1057 "p2_hitbox4" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -818,7 +818,7 @@ 1058 "p1_hitbox5" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -830,7 +830,7 @@ 1059 "p2_hitbox5" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -842,7 +842,7 @@ 1060 "p1_activebox_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -854,7 +854,7 @@ 1061 "p2_activebox_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -866,7 +866,7 @@ 1062 "p1_activebox_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -878,7 +878,7 @@ 1063 "p2_activebox_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -890,7 +890,7 @@ 1064 "p1_activebox_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -902,7 +902,7 @@ 1065 "p2_activebox_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -914,7 +914,7 @@ 1066 "p1_health_percent" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -926,7 +926,7 @@ 1067 "p2_health_percent" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -938,7 +938,7 @@ 1068 "p1_input_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -950,7 +950,7 @@ 1069 "p2_input_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -962,7 +962,7 @@ 1078 "p1_rage_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -974,7 +974,7 @@ 1079 "p2_rage_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -986,7 +986,7 @@ 1080 "p1_mystery_state" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -998,7 +998,7 @@ 1135 "p2_mystery_state" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1010,7 +1010,7 @@ 1125 "p1_round_wins" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1022,7 +1022,7 @@ 1126 "p2_round_wins" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1034,7 +1034,7 @@ 1084 "p1_display_combo_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1046,7 +1046,7 @@ 1120 "p2_display_combo_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1058,7 +1058,7 @@ 1086 "p1_display_combo_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1070,7 +1070,7 @@ 1087 "p2_display_combo_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1082,7 +1082,7 @@ 1121 "p1_display_juggle_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1094,7 +1094,7 @@ 1122 "p2_display_juggle_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1116,18 +1116,18 @@ 4486 "FrameCounter" - + FF9900 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+34B013C
    +
    "TekkenGame-Win64-Shipping.exe"+34B0EE0
    4487 "Distance" - + FF9900 Float -
    "TekkenGame-Win64-Shipping.exe"+34B008C
    +
    "TekkenGame-Win64-Shipping.exe"+34CE3C0
    @@ -1135,13 +1135,12 @@ player_data_pointer_offset -
    034E9388
    +
    034E66E8
    p2_data_offset -
    0x7640
    +
    0x76A0
    - How to update addresses after a patch: https://github.com/WAZAAAAA0/TekkenBot/wiki/How-to-update-addresses - + How to update addresses after a patch: https://github.com/WAZAAAAA0/TekkenBot/wiki/How-to-update-addresses
    From eea39b354a7c8f7f74e54db24aea4de2b3c76e0d Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 14 Feb 2020 19:09:50 +0100 Subject: [PATCH 59/85] 2020-02-12 3.21 patch addresses (by FimoX, Alchemy-Meister) Co-Authored-By: FimoX Co-Authored-By: Alchemy-Meister --- TekkenData/memory_address.ini | 55 ++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index 92164f76..5c9e0ec2 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,33 +1,33 @@ -;2019-12-09 patch addresses (3.10 Leroy update, timestamp 1575878728, date from https://steamdb.info/app/389730/history/) -;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. +;2020-02-12 patch addresses (3.21 Leroy nerf update, timestamp 1581497390, date from https://steamdb.info/app/389730/history/) +;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 [MemoryAddressOffsets] -player_data_pointer_offset = 0x034E9388 0x8 -p2_data_offset = 0x7640 -rollback_frame_offset = 0x1DEF0 +player_data_pointer_offset = 0x034E66E8 0x8 +p2_data_offset = 0x76A0 +rollback_frame_offset = 0x1E080 ;----IGNORABLE START---- ;player_data_second_pointer_offset = 0 p2_end_block_offset = 0xD0 -movelist_size = 2000000 -expected_module_address = 0x140000000 ;Might not have to be configurable +movelist_size = 2000000 ;don't change +expected_module_address = 0x140000000 ; don't change - Might not have to be configurable ;----IGNORABLE END---- [GameDataAddress] -frame_count = 0xA30 +frame_count = 0xA40 ;----IGNORABLE START---- ;frame_count = 0x6a0 ;resets sometimes on p1 backdash??? ;frame_count = 0x70C ;caps at 0xFF -facing = 0xD44 +facing = 0x144C ;Joueur P1 de son cote ou dr. = 0 , oppose = 1 timer_in_frames = 0x1A158 ;----IGNORABLE END---- [EndBlockPlayerDataAddress] ;----IGNORABLE START---- -round_wins = 0x1BA6C ;semi-ignorable, for a fork, makes round counting work -;p2_wins = 0x19BB4 +round_wins = 0x1DAB0 ;semi-ignorable, for a fork, makes round counting work +;p2_wins = 0x1DBA0 display_combo_counter = 0x1A200 display_combo_damage = 0x1A1D8 display_juggle_damage = 0x1A1DC @@ -47,19 +47,20 @@ hit_outcome = 0x3CC attack_type = 0x40C simple_move_state = 0x410 stun_type = 0x414 -throw_tech = 0x428 -complex_move_state = 0x43C -power_crush = 0x682 -jump_flags = 0x714 -cancel_window = 0x748 -damage_taken = 0x8FC -input_attack = 0x195C -input_direction = 0xD3C -attack_startup = 0x7580 -attack_startup_end = 0x7584 -char_id = 0xDC ;semi-ignorable, for a fork, full list of character ID's can be found inside MoveInfoEnums.py +throw_tech = 0x430 +complex_move_state = 0x444 +power_crush = 0x690 +jump_flags = 0x726 +cancel_window = 0x758 +damage_taken = 0x90C +input_attack = 0x198c +input_direction = 0x1990 +attack_startup = 0x75e0 +attack_startup_end = 0x75e4 ;----IGNORABLE START---- +char_id = 0xD4 ;semi-ignorable, for a fork, full list of character ID's can be found inside MoveInfoEnums.py current_side = 0x123C ;semi-ignorable, for a fork +;face = 0x142C throw_flag = 0x0 ;semi-ignorable, might affect the "type" column attack_damage = 0x2FC x = 0xE70 @@ -81,16 +82,18 @@ rage_flag = 0x99C ;mystery_state = 0x534 mystery_state = 0x990 ;Possibly Max_Mode ;Uncertain Value juggle_height = 0x11D8 ;Outdated ;NotUsed +distance = 0x13B0 ;semi-ignorable, for a fork ;super meter p1 0x9F4 ;----IGNORABLE END---- [NonPlayerDataAddresses] -P1_Movelist = 0x034B0C90 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A -P2_Movelist = 0x034B4200 0x2E8 -OPPONENT_NAME = 0x0349ABB0 0x0 0x8 0x114 ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x0349ABB0 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 +P1_Movelist = 0x034CF130 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A +P2_Movelist = 0x034D26D0 0x2E8 +OPPONENT_NAME = 0x034B8F80 0x0 0x8 0x114 ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x034B8F80 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 ;----IGNORABLE START---- +;PLAYER_SIDE = 0x034B8F80 0x0 0x0 0x70 ;0 means we are player 1, 1 means we are player 2 P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 STAGE_SELECT = 0x033B4E68 0x80 0x78 From 36093031c09dae9304ab0e6297f4e2b16409716b Mon Sep 17 00:00:00 2001 From: KulaGGin Date: Wed, 25 Mar 2020 12:23:52 +0200 Subject: [PATCH 60/85] Updated addresses for 3.30 patch from #1 posted by Fimox. --- CE_TekkenBot.CT | 1376 +++++++++++++++++---------------- TekkenData/memory_address.ini | 49 +- 2 files changed, 732 insertions(+), 693 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index 135c0b80..c4167aa1 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -22,11 +22,11 @@ 1008 "rollback_frame_offset" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1E080 + 1E100 0 8 @@ -34,7 +34,7 @@ 1009 "frame_count" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -46,7 +46,7 @@ 1014 "p1_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -58,7 +58,7 @@ 1018 "p1_move_id" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -70,7 +70,7 @@ 1020 "p1_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -82,7 +82,7 @@ 1022 "p1_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -94,7 +94,7 @@ 1024 "p1_attack_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -106,7 +106,7 @@ 1026 "p1_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -118,7 +118,7 @@ 1028 "p1_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -130,11 +130,11 @@ 1030 "p1_throw_tech" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 430 + 418 0 8 @@ -142,11 +142,11 @@ 1034 "p1_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 444 + 448 0 8 @@ -154,7 +154,7 @@ 1123 "p1_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -164,10 +164,10 @@
    - 4541 + 1038 "p1_jump_flags" - - 2 Bytes + + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    726 @@ -178,7 +178,7 @@ 1040 "p1_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -190,11 +190,11 @@ 1042 "p1_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 90C + 7fcc 0 8 @@ -202,11 +202,11 @@ 1070 "p1_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 198c + 199c 0 8 @@ -214,11 +214,11 @@ 1072 "p1_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1990 + D6C 0 8 @@ -226,11 +226,11 @@ 1074 "p1_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 75e0 + 7600 0 8 @@ -238,11 +238,11 @@ 1076 "p1_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 75e4 + 7604 0 8 @@ -250,7 +250,7 @@ 1147 "p2_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -262,7 +262,7 @@ 1148 "p2_move_id" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -274,7 +274,7 @@ 1149 "p2_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -286,7 +286,7 @@ 1150 "p2_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -298,7 +298,7 @@ 1151 "p2_attack_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -310,7 +310,7 @@ 1152 "p2_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -322,7 +322,7 @@ 1153 "p2_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -334,11 +334,11 @@ 1154 "p2_throw_tech" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 430+p2_data_offset + 4ec+p2_data_offset 0 8 @@ -346,7 +346,7 @@ 1156 "p2_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -358,11 +358,11 @@ 1157 "p2_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 690+p2_data_offset + 682+p2_data_offset 0 8 @@ -370,11 +370,11 @@ 1158 "p2_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 726+p2_data_offset + 714+p2_data_offset 0 8 @@ -382,11 +382,11 @@ 1159 "p2_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 758+p2_data_offset + 748+p2_data_offset 0 8 @@ -394,11 +394,11 @@ 1160 "p2_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 90C+p2_data_offset + 8FC+p2_data_offset 0 8 @@ -406,11 +406,11 @@ 1161 "p2_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 198c+p2_data_offset + 195C+p2_data_offset 0 8 @@ -418,11 +418,11 @@ 1162 "p2_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1990+p2_data_offset + D3C+p2_data_offset 0 8 @@ -430,11 +430,11 @@ 1163 "p2_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 75e0+p2_data_offset + 7580+p2_data_offset 0 8 @@ -442,11 +442,11 @@ 1164 "p2_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 75e4+p2_data_offset + 7584+p2_data_offset 0 8 @@ -454,27 +454,628 @@ 4448 "p1_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034CF130
    +
    "TekkenGame-Win64-Shipping.exe"+034D7860
    2E8 + + + 1136 + "----IGNORABLE----" + + + 0000FF + 1 + + + 1005 + "player_data_second_pointer_offset" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 0 + 0 + +
    + + 1102 + "player_data_second_pointer_offset" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1208 + 0 + +
    + + 1007 + "p2_end_block_offset" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c8 + 0 + +
    + + 1010 + "facing" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 142c + 0 + 8 + +
    + + 1011 + "timer_in_frames" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A158 + 0 + +
    + + 1012 + "p1_char_id" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + d4 + 0 + +
    + + 1013 + "p2_char_id" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 6924 + 0 + +
    + + 1016 + "p1_attack_damage" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 2fc + 0 + +
    + + 1017 + "p2_attack_damage" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 6B4C + 0 + +
    + + 1032 + "p1_throw_flag" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 400 + 0 + +
    + + 1155 + "p2_throw_flag" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 400+p2_data_offset + 0 + +
    + + 1044 + "p1_x" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c00 + 0 + +
    + + 1045 + "p2_x" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7450 + 0 + +
    + + 1046 + "p1_y" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c04 + 0 + +
    + + 1047 + "p2_y" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7454 + 0 + +
    + + 1048 + "p1_z" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c08 + 0 + +
    + + 1049 + "p2_z" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7458 + 0 + +
    + + 1050 + "p1_hitbox1" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c0c + 0 + +
    + + 1051 + "p2_hitbox1" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 745C + 0 + +
    + + 1052 + "p1_hitbox2" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c10 + 0 + +
    + + 1053 + "p2_hitbox2" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7460 + 0 + +
    + + 1054 + "p1_hitbox3" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c14 + 0 + +
    + + 1055 + "p2_hitbox3" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7464 + 0 + +
    + + 1056 + "p1_hitbox4" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c18 + 0 + +
    + + 1057 + "p2_hitbox4" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7468 + 0 + +
    + + 1058 + "p1_hitbox5" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c1c + 0 + +
    + + 1059 + "p2_hitbox5" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 746C + 0 + +
    + + 1060 + "p1_activebox_x" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1060 + 0 + +
    + + 1061 + "p2_activebox_x" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 78B0 + 0 + +
    + + 1062 + "p1_activebox_y" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1064 + 0 + +
    + + 1063 + "p2_activebox_y" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 78B4 + 0 + +
    + + 1064 + "p1_activebox_z" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1068 + 0 + +
    + + 1065 + "p2_activebox_z" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 78B8 + 0 + +
    + + 1066 + "p1_health_percent" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 11e8 + 0 + +
    + + 1067 + "p2_health_percent" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7A38 + 0 + +
    + + 1068 + "p1_input_counter" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 15B8 + 0 + +
    + + 1069 + "p2_input_counter" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7E08 + 0 + +
    + + 1078 + "p1_rage_flag" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 99C + 0 + +
    + + 1079 + "p2_rage_flag" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 71EC + 0 + +
    + + 1080 + "p1_mystery_state" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 990 + 0 + +
    + + 1135 + "p2_mystery_state" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 71E0 + 0 + +
    + + 1125 + "p1_round_wins" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A16c + 0 + +
    + + 1126 + "p2_round_wins" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A23c + 0 + +
    + + 1084 + "p1_display_combo_counter" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A200 + 0 + +
    + + 1120 + "p2_display_combo_counter" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A2D0 + 0 + +
    + + 1086 + "p1_display_combo_damage" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A1D8 + 0 + +
    + + 1087 + "p2_display_combo_damage" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A2A8 + 0 + +
    + + 1121 + "p1_display_juggle_damage" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A1DC + 0 + +
    + + 1122 + "p2_display_juggle_damage" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A2AC + 0 + +
    +
    +
    +
    1127 "p2_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034D26D0
    +
    "TekkenGame-Win64-Shipping.exe"+034D42B0
    2E8 @@ -482,13 +1083,13 @@ 1129 "OPPONENT_NAME" - + String 13 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034B8F80
    +
    "TekkenGame-Win64-Shipping.exe"+034BE100
    114 8 @@ -498,613 +1099,15 @@ 1131 "OPPONENT_SIDE" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+034B8F80
    +
    "TekkenGame-Win64-Shipping.exe"+034BE100
    70 8 0
    - - 1136 - "----IGNORABLE----" - - - 0000FF - 1 - - - 1005 - "player_data_second_pointer_offset" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 0 - 0 - -
    - - 1102 - "player_data_second_pointer_offset" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1208 - 0 - -
    - - 1007 - "p2_end_block_offset" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c8 - 0 - -
    - - 1010 - "facing" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - ad4 - 0 - -
    - - 1011 - "timer_in_frames" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A158 - 0 - -
    - - 1012 - "p1_char_id" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - d4 - 0 - -
    - - 1013 - "p2_char_id" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 6924 - 0 - -
    - - 1016 - "p1_attack_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 2fc - 0 - -
    - - 1017 - "p2_attack_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 6B4C - 0 - -
    - - 1032 - "p1_throw_flag" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 400 - 0 - -
    - - 1155 - "p2_throw_flag" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 400+p2_data_offset - 0 - -
    - - 1044 - "p1_x" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c00 - 0 - -
    - - 1045 - "p2_x" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7450 - 0 - -
    - - 1046 - "p1_y" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c04 - 0 - -
    - - 1047 - "p2_y" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7454 - 0 - -
    - - 1048 - "p1_z" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c08 - 0 - -
    - - 1049 - "p2_z" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7458 - 0 - -
    - - 1050 - "p1_hitbox1" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c0c - 0 - -
    - - 1051 - "p2_hitbox1" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 745C - 0 - -
    - - 1052 - "p1_hitbox2" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c10 - 0 - -
    - - 1053 - "p2_hitbox2" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7460 - 0 - -
    - - 1054 - "p1_hitbox3" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c14 - 0 - -
    - - 1055 - "p2_hitbox3" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7464 - 0 - -
    - - 1056 - "p1_hitbox4" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c18 - 0 - -
    - - 1057 - "p2_hitbox4" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7468 - 0 - -
    - - 1058 - "p1_hitbox5" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c1c - 0 - -
    - - 1059 - "p2_hitbox5" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 746C - 0 - -
    - - 1060 - "p1_activebox_x" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1060 - 0 - -
    - - 1061 - "p2_activebox_x" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 78B0 - 0 - -
    - - 1062 - "p1_activebox_y" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1064 - 0 - -
    - - 1063 - "p2_activebox_y" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 78B4 - 0 - -
    - - 1064 - "p1_activebox_z" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1068 - 0 - -
    - - 1065 - "p2_activebox_z" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 78B8 - 0 - -
    - - 1066 - "p1_health_percent" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 11e8 - 0 - -
    - - 1067 - "p2_health_percent" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7A38 - 0 - -
    - - 1068 - "p1_input_counter" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 15B8 - 0 - -
    - - 1069 - "p2_input_counter" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7E08 - 0 - -
    - - 1078 - "p1_rage_flag" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 99C - 0 - -
    - - 1079 - "p2_rage_flag" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 71EC - 0 - -
    - - 1080 - "p1_mystery_state" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 990 - 0 - -
    - - 1135 - "p2_mystery_state" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 71E0 - 0 - -
    - - 1125 - "p1_round_wins" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A16c - 0 - -
    - - 1126 - "p2_round_wins" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A23c - 0 - -
    - - 1084 - "p1_display_combo_counter" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A200 - 0 - -
    - - 1120 - "p2_display_combo_counter" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A2D0 - 0 - -
    - - 1086 - "p1_display_combo_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A1D8 - 0 - -
    - - 1087 - "p2_display_combo_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A2A8 - 0 - -
    - - 1121 - "p1_display_juggle_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A1DC - 0 - -
    - - 1122 - "p2_display_juggle_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A2AC - 0 - -
    -
    -
    4485 "----EXTRA----" @@ -1116,31 +1119,68 @@ 4486 "FrameCounter" - + FF9900 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+34B0EE0
    +
    "TekkenGame-Win64-Shipping.exe"+34B013C
    4487 "Distance" - + FF9900 Float -
    "TekkenGame-Win64-Shipping.exe"+34CE3C0
    +
    "TekkenGame-Win64-Shipping.exe"+34B008C
    + + 4492 + "P1_distance" + + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 13E0 + 0 + 8 + +
    + + 4493 + "P2_distance" + + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 13E0+p2_data_offset + 0 + 8 + +
    + + 4498 + "facing" + + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 145C + 0 + 8 + +
    player_data_pointer_offset -
    034E66E8
    +
    034EB8C8
    p2_data_offset -
    0x76A0
    +
    0x76C0
    - How to update addresses after a patch: https://github.com/WAZAAAAA0/TekkenBot/wiki/How-to-update-addresses + How to update addresses after a patch: https://github.com/WAZAAAAA0/TekkenBot/wiki/How-to-update-addresses +
    diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index 5c9e0ec2..b449e2f8 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,16 +1,16 @@ -;2020-02-12 patch addresses (3.21 Leroy nerf update, timestamp 1581497390, date from https://steamdb.info/app/389730/history/) -;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 +;2020-03-25 patch addresses (3.30 update, timestamp 1581497390, date from https://steamdb.info/app/389730/history/ ) +;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. [MemoryAddressOffsets] -player_data_pointer_offset = 0x034E66E8 0x8 -p2_data_offset = 0x76A0 -rollback_frame_offset = 0x1E080 +player_data_pointer_offset = 0x034EB8C8 0x8 +p2_data_offset = 0x76C0 +rollback_frame_offset = 0x1E100 ;----IGNORABLE START---- ;player_data_second_pointer_offset = 0 p2_end_block_offset = 0xD0 -movelist_size = 2000000 ;don't change -expected_module_address = 0x140000000 ; don't change - Might not have to be configurable +movelist_size = 2000000 +expected_module_address = 0x140000000 ;Might not have to be configurable ;----IGNORABLE END---- @@ -19,15 +19,15 @@ frame_count = 0xA40 ;----IGNORABLE START---- ;frame_count = 0x6a0 ;resets sometimes on p1 backdash??? ;frame_count = 0x70C ;caps at 0xFF -facing = 0x144C ;Joueur P1 de son cote ou dr. = 0 , oppose = 1 +facing = 0x145C ; Joueur P1 de son cote ou dr. = 0 , oppose = 1 timer_in_frames = 0x1A158 ;----IGNORABLE END---- [EndBlockPlayerDataAddress] ;----IGNORABLE START---- -round_wins = 0x1DAB0 ;semi-ignorable, for a fork, makes round counting work -;p2_wins = 0x1DBA0 +round_wins = 0x1BA6C ;semi-ignorable, for a fork, makes round counting work +;p2_wins = 0x19BB4 display_combo_counter = 0x1A200 display_combo_damage = 0x1A1D8 display_juggle_damage = 0x1A1DC @@ -40,27 +40,28 @@ total_moves_blocked = 0x19B5C ;Outdated ;NotUsed [PlayerDataAddress] +distance = 0x13E0 move_timer = 0x1F0 move_id = 0x344 +face = 0x145C recovery = 0x390 hit_outcome = 0x3CC attack_type = 0x40C simple_move_state = 0x410 stun_type = 0x414 -throw_tech = 0x430 -complex_move_state = 0x444 +throw_tech = 0x428 +complex_move_state = 0x448 power_crush = 0x690 jump_flags = 0x726 cancel_window = 0x758 -damage_taken = 0x90C -input_attack = 0x198c -input_direction = 0x1990 -attack_startup = 0x75e0 -attack_startup_end = 0x75e4 +damage_taken = 0x7FCC +input_attack = 0x199C +input_direction = 0xD6C +attack_startup = 0x7600 +attack_startup_end = 0x7604 +char_id = 0xDC ;semi-ignorable, for a fork, full list of character ID's can be found inside MoveInfoEnums.py ;----IGNORABLE START---- -char_id = 0xD4 ;semi-ignorable, for a fork, full list of character ID's can be found inside MoveInfoEnums.py current_side = 0x123C ;semi-ignorable, for a fork -;face = 0x142C throw_flag = 0x0 ;semi-ignorable, might affect the "type" column attack_damage = 0x2FC x = 0xE70 @@ -82,18 +83,16 @@ rage_flag = 0x99C ;mystery_state = 0x534 mystery_state = 0x990 ;Possibly Max_Mode ;Uncertain Value juggle_height = 0x11D8 ;Outdated ;NotUsed -distance = 0x13B0 ;semi-ignorable, for a fork ;super meter p1 0x9F4 ;----IGNORABLE END---- [NonPlayerDataAddresses] -P1_Movelist = 0x034CF130 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A -P2_Movelist = 0x034D26D0 0x2E8 -OPPONENT_NAME = 0x034B8F80 0x0 0x8 0x114 ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x034B8F80 0x0 0x8 0x70 ;0 means they are player 1, 1 means they are player 2 +P1_Movelist = 0x034D7860 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A +P2_Movelist = 0x034D42B0 0x2E8 +OPPONENT_NAME = 0x034BE100 0x0 0x8 0x114 ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x034BE100 0x0 0x8 0x70 ;1 = if you, the player, picked left side ;----IGNORABLE START---- -;PLAYER_SIDE = 0x034B8F80 0x0 0x0 0x70 ;0 means we are player 1, 1 means we are player 2 P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 STAGE_SELECT = 0x033B4E68 0x80 0x78 From f9576d3eaef5e68d10129d3cd0088e9ab7502ae9 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 26 Jun 2020 03:40:00 +0200 Subject: [PATCH 61/85] add dcep93's fork --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c7e9781a..052d9863 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ -Check out these experimental forks for new TekkenBotPrime features:\ -https://github.com/Alchemy-Meister/TekkenBot/ \ -https://github.com/compsyguy/TekkenBot/ +Check out these experimental forks for new TekkenBotPrime features (and sometimes faster updates):\ +https://github.com/dcep93/TekkenBot \ +https://github.com/Alchemy-Meister/TekkenBot \ +https://github.com/compsyguy/TekkenBot # TekkenBot AI and tools for playing and understanding Tekken 7. From 3c87ef99ed7fb35c86439522834a48ca44952704 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 11 Nov 2020 06:41:26 +0100 Subject: [PATCH 62/85] version bump --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index 4f2f6287..bf676d23 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.17.0' +CURRENT_VERSION = 'v0.19.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.17.0' in CURRENT_VERSION: + if 'v0.19.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From 4d9fc2cadc07fe69cf18125b1ed9becb6be2f18b Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 11 Nov 2020 06:42:15 +0100 Subject: [PATCH 63/85] added Fahkumram and Kunimitsu to the character ID list --- MoveInfoEnums.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MoveInfoEnums.py b/MoveInfoEnums.py index 59bc94c8..3b19a8f5 100644 --- a/MoveInfoEnums.py +++ b/MoveInfoEnums.py @@ -245,6 +245,9 @@ class CharacterCodes(Enum): ZAFINA = 51 # DLC GANRYU = 52 # DLC LEROY = 53 # DLC + FAHKUMRAM = 54 # DLC + KUNIMITSU = 55 # DLC + NOT_YET_LOADED = 71 #value when a match starts for (??) frames until char_id loads From a51beae4cfa93c2fe5b31755676440b482766041 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 11 Nov 2020 06:45:39 +0100 Subject: [PATCH 64/85] 2020-11-09 patch addresses 4.00 (by Gelatin) Co-Authored-By: jlee366 --- CE_TekkenBot.CT | 1421 +++++++++++++++++---------------- TekkenData/memory_address.ini | 47 +- 2 files changed, 735 insertions(+), 733 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index c4167aa1..0deda022 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -1,5 +1,5 @@ - + b7Ej%2nldAU:MM2b.}cxWeIh0Gi32eO*Ft]WMuP5%{mcIVgA6t9Fkwal+AgInNpI$=7,zGoLEqjnV-i7R=ffx00 b7Ej%2nldAU:MM2b.}cxWeIh0Gi32eO*Ft]WMuP5%{mcIVgA6t9Fkwal+AgInNpI$=7,zGoLEqjnV-i7R=ffx00 @@ -22,11 +22,11 @@ 1008 "rollback_frame_offset" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1E100 + 1E300 0 8 @@ -34,7 +34,7 @@ 1009 "frame_count" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -46,7 +46,7 @@ 1014 "p1_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -58,7 +58,7 @@ 1018 "p1_move_id" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -70,7 +70,7 @@ 1020 "p1_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -82,7 +82,7 @@ 1022 "p1_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -94,7 +94,7 @@ 1024 "p1_attack_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -106,7 +106,7 @@ 1026 "p1_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -118,7 +118,7 @@ 1028 "p1_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -130,11 +130,11 @@ 1030 "p1_throw_tech" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 418 + 434 0 8 @@ -142,7 +142,7 @@ 1034 "p1_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -154,11 +154,11 @@ 1123 "p1_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 690 + 694 0 8 @@ -166,7 +166,7 @@ 1038 "p1_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -178,7 +178,7 @@ 1040 "p1_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -190,11 +190,11 @@ 1042 "p1_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 7fcc + 90C 0 8 @@ -202,11 +202,11 @@ 1070 "p1_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 199c + 19DC 0 8 @@ -214,7 +214,7 @@ 1072 "p1_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -226,11 +226,11 @@ 1074 "p1_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 7600 + 7680 0 8 @@ -238,11 +238,11 @@ 1076 "p1_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 7604 + 7684 0 8 @@ -250,7 +250,7 @@ 1147 "p2_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -262,7 +262,7 @@ 1148 "p2_move_id" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -274,7 +274,7 @@ 1149 "p2_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -286,7 +286,7 @@ 1150 "p2_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -298,7 +298,7 @@ 1151 "p2_attack_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -310,7 +310,7 @@ 1152 "p2_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -322,7 +322,7 @@ 1153 "p2_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -334,11 +334,11 @@ 1154 "p2_throw_tech" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 4ec+p2_data_offset + 434+p2_data_offset 0 8 @@ -346,11 +346,11 @@ 1156 "p2_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 444+p2_data_offset + 448+p2_data_offset 0 8 @@ -358,11 +358,11 @@ 1157 "p2_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 682+p2_data_offset + 694+p2_data_offset 0 8 @@ -370,11 +370,11 @@ 1158 "p2_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 714+p2_data_offset + 726+p2_data_offset 0 8 @@ -382,11 +382,11 @@ 1159 "p2_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 748+p2_data_offset + 758+p2_data_offset 0 8 @@ -394,11 +394,11 @@ 1160 "p2_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 8FC+p2_data_offset + 090C+p2_data_offset 0 8 @@ -406,11 +406,11 @@ 1161 "p2_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 195C+p2_data_offset + 19DC+p2_data_offset 0 8 @@ -418,11 +418,11 @@ 1162 "p2_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - D3C+p2_data_offset + D6C+p2_data_offset 0 8 @@ -430,11 +430,11 @@ 1163 "p2_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 7580+p2_data_offset + 7680+p2_data_offset 0 8 @@ -442,11 +442,11 @@ 1164 "p2_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 7584+p2_data_offset + 7684+p2_data_offset 0 8 @@ -454,628 +454,27 @@ 4448 "p1_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034D7860
    +
    "TekkenGame-Win64-Shipping.exe"+034E1570
    2E8 - - - 1136 - "----IGNORABLE----" - - - 0000FF - 1 - - - 1005 - "player_data_second_pointer_offset" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 0 - 0 - -
    - - 1102 - "player_data_second_pointer_offset" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1208 - 0 - -
    - - 1007 - "p2_end_block_offset" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c8 - 0 - -
    - - 1010 - "facing" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 142c - 0 - 8 - -
    - - 1011 - "timer_in_frames" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A158 - 0 - -
    - - 1012 - "p1_char_id" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - d4 - 0 - -
    - - 1013 - "p2_char_id" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 6924 - 0 - -
    - - 1016 - "p1_attack_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 2fc - 0 - -
    - - 1017 - "p2_attack_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 6B4C - 0 - -
    - - 1032 - "p1_throw_flag" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 400 - 0 - -
    - - 1155 - "p2_throw_flag" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 400+p2_data_offset - 0 - -
    - - 1044 - "p1_x" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c00 - 0 - -
    - - 1045 - "p2_x" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7450 - 0 - -
    - - 1046 - "p1_y" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c04 - 0 - -
    - - 1047 - "p2_y" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7454 - 0 - -
    - - 1048 - "p1_z" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c08 - 0 - -
    - - 1049 - "p2_z" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7458 - 0 - -
    - - 1050 - "p1_hitbox1" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c0c - 0 - -
    - - 1051 - "p2_hitbox1" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 745C - 0 - -
    - - 1052 - "p1_hitbox2" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c10 - 0 - -
    - - 1053 - "p2_hitbox2" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7460 - 0 - -
    - - 1054 - "p1_hitbox3" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c14 - 0 - -
    - - 1055 - "p2_hitbox3" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7464 - 0 - -
    - - 1056 - "p1_hitbox4" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c18 - 0 - -
    - - 1057 - "p2_hitbox4" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7468 - 0 - -
    - - 1058 - "p1_hitbox5" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c1c - 0 - -
    - - 1059 - "p2_hitbox5" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 746C - 0 - -
    - - 1060 - "p1_activebox_x" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1060 - 0 - -
    - - 1061 - "p2_activebox_x" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 78B0 - 0 - -
    - - 1062 - "p1_activebox_y" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1064 - 0 - -
    - - 1063 - "p2_activebox_y" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 78B4 - 0 - -
    - - 1064 - "p1_activebox_z" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1068 - 0 - -
    - - 1065 - "p2_activebox_z" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 78B8 - 0 - -
    - - 1066 - "p1_health_percent" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 11e8 - 0 - -
    - - 1067 - "p2_health_percent" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7A38 - 0 - -
    - - 1068 - "p1_input_counter" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 15B8 - 0 - -
    - - 1069 - "p2_input_counter" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7E08 - 0 - -
    - - 1078 - "p1_rage_flag" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 99C - 0 - -
    - - 1079 - "p2_rage_flag" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 71EC - 0 - -
    - - 1080 - "p1_mystery_state" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 990 - 0 - -
    - - 1135 - "p2_mystery_state" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 71E0 - 0 - -
    - - 1125 - "p1_round_wins" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A16c - 0 - -
    - - 1126 - "p2_round_wins" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A23c - 0 - -
    - - 1084 - "p1_display_combo_counter" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A200 - 0 - -
    - - 1120 - "p2_display_combo_counter" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A2D0 - 0 - -
    - - 1086 - "p1_display_combo_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A1D8 - 0 - -
    - - 1087 - "p2_display_combo_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A2A8 - 0 - -
    - - 1121 - "p1_display_juggle_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A1DC - 0 - -
    - - 1122 - "p2_display_juggle_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A2AC - 0 - -
    -
    -
    -
    1127 "p2_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034D42B0
    +
    "TekkenGame-Win64-Shipping.exe"+034E4B60
    2E8 @@ -1083,15 +482,15 @@ 1129 "OPPONENT_NAME" - + String 13 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034BE100
    +
    "TekkenGame-Win64-Shipping.exe"+034CB390
    - 114 + 11C 8 0 @@ -1099,86 +498,688 @@ 1131 "OPPONENT_SIDE" - + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+034BE100
    +
    "TekkenGame-Win64-Shipping.exe"+034CB390
    - 70 + 78 8 0
    + + 1136 + "----IGNORABLE----" + + + 0000FF + 1 + + + 1005 + "player_data_second_pointer_offset" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 0 + 0 + +
    + + 1102 + "player_data_second_pointer_offset" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1208 + 0 + +
    + + 1007 + "p2_end_block_offset" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c8 + 0 + +
    + + 1010 + "facing" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 142c + 0 + 8 + +
    + + 1011 + "timer_in_frames" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A158 + 0 + +
    + + 1012 + "p1_char_id" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + d4 + 0 + +
    + + 1013 + "p2_char_id" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 6924 + 0 + +
    + + 1016 + "p1_attack_damage" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 2fc + 0 + +
    + + 1017 + "p2_attack_damage" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 6B4C + 0 + +
    + + 1032 + "p1_throw_flag" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 400 + 0 + +
    + + 1155 + "p2_throw_flag" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 400+p2_data_offset + 0 + +
    + + 1044 + "p1_x" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c00 + 0 + +
    + + 1045 + "p2_x" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7450 + 0 + +
    + + 1046 + "p1_y" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c04 + 0 + +
    + + 1047 + "p2_y" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7454 + 0 + +
    + + 1048 + "p1_z" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c08 + 0 + +
    + + 1049 + "p2_z" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7458 + 0 + +
    + + 1050 + "p1_hitbox1" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c0c + 0 + +
    + + 1051 + "p2_hitbox1" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 745C + 0 + +
    + + 1052 + "p1_hitbox2" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c10 + 0 + +
    + + 1053 + "p2_hitbox2" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7460 + 0 + +
    + + 1054 + "p1_hitbox3" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c14 + 0 + +
    + + 1055 + "p2_hitbox3" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7464 + 0 + +
    + + 1056 + "p1_hitbox4" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c18 + 0 + +
    + + 1057 + "p2_hitbox4" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7468 + 0 + +
    + + 1058 + "p1_hitbox5" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + c1c + 0 + +
    + + 1059 + "p2_hitbox5" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 746C + 0 + +
    + + 1060 + "p1_activebox_x" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1060 + 0 + +
    + + 1061 + "p2_activebox_x" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 78B0 + 0 + +
    + + 1062 + "p1_activebox_y" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1064 + 0 + +
    + + 1063 + "p2_activebox_y" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 78B4 + 0 + +
    + + 1064 + "p1_activebox_z" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1068 + 0 + +
    + + 1065 + "p2_activebox_z" + + 0000FF + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 78B8 + 0 + +
    + + 1066 + "p1_health_percent" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 11e8 + 0 + +
    + + 1067 + "p2_health_percent" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7A38 + 0 + +
    + + 1068 + "p1_input_counter" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 15B8 + 0 + +
    + + 1069 + "p2_input_counter" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 7E08 + 0 + +
    + + 1078 + "p1_rage_flag" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 99C + 0 + +
    + + 1079 + "p2_rage_flag" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 71EC + 0 + +
    + + 1080 + "p1_mystery_state" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 990 + 0 + +
    + + 1135 + "p2_mystery_state" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 71E0 + 0 + +
    + + 1125 + "p1_round_wins" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A16c + 0 + +
    + + 1126 + "p2_round_wins" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A23c + 0 + +
    + + 1084 + "p1_display_combo_counter" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A200 + 0 + +
    + + 1120 + "p2_display_combo_counter" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A2D0 + 0 + +
    + + 1086 + "p1_display_combo_damage" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A1D8 + 0 + +
    + + 1087 + "p2_display_combo_damage" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A2A8 + 0 + +
    + + 1121 + "p1_display_juggle_damage" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A1DC + 0 + +
    + + 1122 + "p2_display_juggle_damage" + + 0000FF + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 1A2AC + 0 + +
    +
    +
    4485 "----EXTRA----" - + FF9900 1 4486 - "FrameCounter" - + "FRAMECOUNTER" + FF9900 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+34B013C
    +
    "TekkenGame-Win64-Shipping.exe"+34C32E0
    4487 - "Distance" - + "DISTANCE" + + FF9900 + Float +
    "TekkenGame-Win64-Shipping.exe"+34E07F0
    +
    + + 4492 + "P1_distance" + FF9900 Float -
    "TekkenGame-Win64-Shipping.exe"+34B008C
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 13E0 + 0 + 8 + +
    + + 4493 + "P2_distance" + + FF9900 + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 13E0+p2_data_offset + 0 + 8 + +
    + + 4498 + "facing" + + FF9900 + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 145C + 0 + 8 +
    - - 4492 - "P1_distance" - - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 13E0 - 0 - 8 - -
    - - 4493 - "P2_distance" - - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 13E0+p2_data_offset - 0 - 8 - -
    - - 4498 - "facing" - - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 145C - 0 - 8 - -
    player_data_pointer_offset -
    034EB8C8
    +
    034F8D48
    p2_data_offset -
    0x76C0
    +
    7740
    How to update addresses after a patch: https://github.com/WAZAAAAA0/TekkenBot/wiki/How-to-update-addresses diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index b449e2f8..57b4884d 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,14 +1,14 @@ -;2020-03-25 patch addresses (3.30 update, timestamp 1581497390, date from https://steamdb.info/app/389730/history/ ) +;2020-11-09 patch addresses (4.00 Kunimitsu update, timestamp 1604908695, date from https://steamdb.info/app/389730/history/ ) ;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. [MemoryAddressOffsets] -player_data_pointer_offset = 0x034EB8C8 0x8 -p2_data_offset = 0x76C0 -rollback_frame_offset = 0x1E100 +player_data_pointer_offset = 0x034F8D48 0x8 +p2_data_offset = 0x7740 +rollback_frame_offset = 0x1E300 ;----IGNORABLE START---- -;player_data_second_pointer_offset = 0 -p2_end_block_offset = 0xD0 +player_data_second_pointer_offset = 0x0 +p2_end_block_offset = 0xDC ;D0 movelist_size = 2000000 expected_module_address = 0x140000000 ;Might not have to be configurable ;----IGNORABLE END---- @@ -19,15 +19,15 @@ frame_count = 0xA40 ;----IGNORABLE START---- ;frame_count = 0x6a0 ;resets sometimes on p1 backdash??? ;frame_count = 0x70C ;caps at 0xFF -facing = 0x145C ; Joueur P1 de son cote ou dr. = 0 , oppose = 1 +facing = 0xD74 ;Joueur P1 de son cote ou dr. = 0 , oppose = 1 timer_in_frames = 0x1A158 ;----IGNORABLE END---- [EndBlockPlayerDataAddress] ;----IGNORABLE START---- -round_wins = 0x1BA6C ;semi-ignorable, for a fork, makes round counting work -;p2_wins = 0x19BB4 +round_wins = 0x1D92C ;semi-ignorable, for a fork, makes round counting work +p2_wins = 0x1DA18 display_combo_counter = 0x1A200 display_combo_damage = 0x1A1D8 display_juggle_damage = 0x1A1DC @@ -49,20 +49,20 @@ hit_outcome = 0x3CC attack_type = 0x40C simple_move_state = 0x410 stun_type = 0x414 -throw_tech = 0x428 +throw_tech = 0x434 complex_move_state = 0x448 -power_crush = 0x690 +power_crush = 0x694 jump_flags = 0x726 cancel_window = 0x758 -damage_taken = 0x7FCC -input_attack = 0x199C +damage_taken = 0x90C +input_attack = 0x19DC input_direction = 0xD6C -attack_startup = 0x7600 -attack_startup_end = 0x7604 -char_id = 0xDC ;semi-ignorable, for a fork, full list of character ID's can be found inside MoveInfoEnums.py +attack_startup = 0x7680 +attack_startup_end = 0x7684 +char_id = 0xD4 ;semi-ignorable, for a fork, full list of character ID's can be found inside MoveInfoEnums.py ;----IGNORABLE START---- -current_side = 0x123C ;semi-ignorable, for a fork -throw_flag = 0x0 ;semi-ignorable, might affect the "type" column +current_side = 0x145C ;semi-ignorable, for a fork +throw_flag = 0x418 ;semi-ignorable, might affect the "type" column attack_damage = 0x2FC x = 0xE70 y = 0xE74 @@ -88,11 +88,12 @@ juggle_height = 0x11D8 ;Outdated ;NotUsed [NonPlayerDataAddresses] -P1_Movelist = 0x034D7860 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A -P2_Movelist = 0x034D42B0 0x2E8 -OPPONENT_NAME = 0x034BE100 0x0 0x8 0x114 ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x034BE100 0x0 0x8 0x70 ;1 = if you, the player, picked left side +P1_Movelist = 0x034E1570 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A +P2_Movelist = 0x034E4B60 0x2E8 +OPPONENT_NAME = 0x034CB390 0x0 0x8 0x11C ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x034CB390 0x0 0x8 0x78 ;1 = if you, the player, picked left side ;----IGNORABLE START---- +PLAYER_SIDE = 0x034CB390 0x0 0x0 0x78 ;0 means we are player 1, 1 means we are player 2 P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 STAGE_SELECT = 0x033B4E68 0x80 0x78 @@ -105,4 +106,4 @@ WARMUP_PLAYER_NAME1 = 0x033B4408 0x50 0x0 ;OutOfDate ;look for name + opponent's WARMUP_PLAYER_WINS1 = 0x033B4408 0x50 -0x34 WARMUP_PLAYER_NAME2 = 0x033B4408 0x50 0x140 WARMUP_PLAYER_WINS2 = 0x033B4408 0x50 0x10C -;----IGNORABLE END---- \ No newline at end of file +;----IGNORABLE END---- From dbf50674f03deb187d6c48829a6c1867ff2e370b Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 24 Mar 2021 12:11:52 +0100 Subject: [PATCH 65/85] version bump --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index bf676d23..8a6ed1a3 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.19.0' +CURRENT_VERSION = 'v0.20.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.19.0' in CURRENT_VERSION: + if 'v0.20.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From 93e75b4c8f6166d05a53d66579f015f3aee5e675 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 24 Mar 2021 12:13:39 +0100 Subject: [PATCH 66/85] new byte sizes for attack_type/throw_tech, new character ID Co-Authored-By: FimoX <21201911+FimoX@users.noreply.github.com> --- TekkenGameState.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/TekkenGameState.py b/TekkenGameState.py index a79c1d8e..a7a26f8a 100644 --- a/TekkenGameState.py +++ b/TekkenGameState.py @@ -331,7 +331,13 @@ def Bake(self): #self.xyz = (d['PlayerDataAddress.x'], d['PlayerDataAddress.y'], d['PlayerDataAddress.z']) self.move_id = d['PlayerDataAddress.move_id'] self.simple_state = SimpleMoveStates(d['PlayerDataAddress.simple_move_state']) - self.attack_type = AttackType(d['PlayerDataAddress.attack_type']) + + value_integer = d['PlayerDataAddress.attack_type'] + value_hex = value_integer.to_bytes(4, 'big') + value_hex = value_hex[2:4] + value_integer = int.from_bytes(value_hex, byteorder='big') + self.attack_type = AttackType(value_integer) + self.startup = d['PlayerDataAddress.attack_startup'] self.startup_end = d['PlayerDataAddress.attack_startup_end'] self.attack_damage = d['PlayerDataAddress.attack_damage'] @@ -366,7 +372,12 @@ def Bake(self): else: self.is_starting = False - self.throw_tech = ThrowTechs(d['PlayerDataAddress.throw_tech']) + value_integer = d['PlayerDataAddress.throw_tech'] + value_hex = value_integer.to_bytes(4, 'big') + value_hex = value_hex[3:4] + value_integer = int.from_bytes(value_hex, byteorder='big') + #print("throw_tech = ", value_integer) + self.throw_tech = ThrowTechs(value_integer) #self.highest_y = max(d['PlayerDataAddress.y']) #self.lowest_y = min(d['PlayerDataAddress.y']) From 080e4c481da58049845618936232e431f56acfe5 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 24 Mar 2021 12:14:35 +0100 Subject: [PATCH 67/85] new throw_tech values Co-Authored-By: FimoX <21201911+FimoX@users.noreply.github.com> --- MoveInfoEnums.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/MoveInfoEnums.py b/MoveInfoEnums.py index 3b19a8f5..840c95fa 100644 --- a/MoveInfoEnums.py +++ b/MoveInfoEnums.py @@ -92,10 +92,10 @@ class ComplexMoveStates(Enum): #These are tracking states> UNKN = 999999 #used to indicate a non standard tracking move class ThrowTechs(Enum): - NONE = 0 - TE1 = 1 #both 1 and 2 seem to sometimes include normal throws that can be broken with either - TE2 = 2 - TE1_2 = 3 + NONE = 29 + TE1 = 28 #both 1 and 2 seem to sometimes include normal throws that can be broken with either + TE2 = 31 + TE1_2 = 30 class StunStates(Enum): NONE = 0 @@ -247,6 +247,7 @@ class CharacterCodes(Enum): LEROY = 53 # DLC FAHKUMRAM = 54 # DLC KUNIMITSU = 55 # DLC + LIDIA = 56 # DLC NOT_YET_LOADED = 71 #value when a match starts for (??) frames until char_id loads From 0c564befece36bf9f297b485da75866c710c4093 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 24 Mar 2021 12:17:09 +0100 Subject: [PATCH 68/85] 2021-03-22 patch addresses 4.10 (by FimoX, Gelatin) Co-Authored-By: FimoX <21201911+FimoX@users.noreply.github.com> Co-Authored-By: jlee366 <9054521+jlee366@users.noreply.github.com> --- CE_TekkenBot.CT | 382 ++++++++++++++++++++-------------- TekkenData/memory_address.ini | 75 +++---- 2 files changed, 260 insertions(+), 197 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index 0deda022..89bbfa64 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -22,11 +22,12 @@ 1008 "rollback_frame_offset" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1E300 + 1E490 0 8 @@ -34,19 +35,25 @@ 1009 "frame_count" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - A40 + A70 0 8
    + + 4529 + "" + + 1 + 1014 "p1_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -58,11 +65,12 @@ 1018 "p1_move_id" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 344 + 350 0 8 @@ -70,11 +78,12 @@ 1020 "p1_recovery" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 390 + 39C 0 8 @@ -82,11 +91,12 @@ 1022 "p1_hit_outcome" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3CC + 3D8 0 8 @@ -94,11 +104,12 @@ 1024 "p1_attack_type" - - 4 Bytes + + 0 + Byte
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 40C + 329 0 8 @@ -106,11 +117,12 @@ 1026 "p1_simple_move_state" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 410 + 428 0 8 @@ -118,11 +130,12 @@ 1028 "p1_stun_type" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 414 + 42C 0 8 @@ -130,11 +143,11 @@ 1030 "p1_throw_tech" - - 4 Bytes + + Byte
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 434 + 450 0 8 @@ -142,11 +155,11 @@ 1034 "p1_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 448 + 470 0 8 @@ -154,11 +167,12 @@ 1123 "p1_power_crush" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 694 + 6C4 0 8 @@ -166,11 +180,12 @@ 1038 "p1_jump_flags" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 726 + 756 0 8 @@ -178,11 +193,12 @@ 1040 "p1_cancel_window" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 758 + 788 0 8 @@ -190,11 +206,12 @@ 1042 "p1_damage_taken" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 90C + 93C 0 8 @@ -202,11 +219,12 @@ 1070 "p1_input_attack" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 19DC + 1A0C 0 8 @@ -214,11 +232,12 @@ 1072 "p1_input_direction" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - D6C + D9C 0 8 @@ -226,11 +245,12 @@ 1074 "p1_attack_startup" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 7680 + 76E0 0 8 @@ -238,19 +258,26 @@ 1076 "p1_attack_startup_end" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 7684 + 76E4 0 8
    + + 4527 + "" + + 1 + 1147 "p2_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -262,11 +289,12 @@ 1148 "p2_move_id" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 344+p2_data_offset + 350+p2_data_offset 0 8 @@ -274,11 +302,11 @@ 1149 "p2_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 390+p2_data_offset + 39C+p2_data_offset 0 8 @@ -286,11 +314,11 @@ 1150 "p2_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3CC+p2_data_offset + 3D8+p2_data_offset 0 8 @@ -298,11 +326,11 @@ 1151 "p2_attack_type" - - 4 Bytes + + Byte
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 40C+p2_data_offset + 329+p2_data_offset 0 8 @@ -310,11 +338,11 @@ 1152 "p2_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 410+p2_data_offset + 428+p2_data_offset 0 8 @@ -322,11 +350,11 @@ 1153 "p2_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 414+p2_data_offset + 42C+p2_data_offset 0 8 @@ -334,11 +362,11 @@ 1154 "p2_throw_tech" - - 4 Bytes + + Byte
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 434+p2_data_offset + 450+p2_data_offset 0 8 @@ -346,11 +374,11 @@ 1156 "p2_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 448+p2_data_offset + 470+p2_data_offset 0 8 @@ -358,11 +386,11 @@ 1157 "p2_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 694+p2_data_offset + 6C4+p2_data_offset 0 8 @@ -370,11 +398,11 @@ 1158 "p2_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 726+p2_data_offset + 756+p2_data_offset 0 8 @@ -382,11 +410,11 @@ 1159 "p2_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 758+p2_data_offset + 788+p2_data_offset 0 8 @@ -394,11 +422,11 @@ 1160 "p2_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 090C+p2_data_offset + 93C+p2_data_offset 0 8 @@ -406,11 +434,11 @@ 1161 "p2_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 19DC+p2_data_offset + 1a0c+p2_data_offset 0 8 @@ -418,11 +446,11 @@ 1162 "p2_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - D6C+p2_data_offset + D9C+p2_data_offset 0 8 @@ -430,11 +458,11 @@ 1163 "p2_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 7680+p2_data_offset + 76E0+p2_data_offset 0 8 @@ -442,39 +470,46 @@ 1164 "p2_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 7684+p2_data_offset + 76E4+p2_data_offset 0 8
    - 4448 + 4528 + "" + + 1 + + + 1127 "p1_movelist" - + + 0 String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034E1570
    +
    "TekkenGame-Win64-Shipping.exe"+034E6720
    2E8
    - 1127 + 4448 "p2_movelist" - + String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034E4B60
    +
    "TekkenGame-Win64-Shipping.exe"+034E9D40
    2E8 @@ -482,13 +517,14 @@ 1129 "OPPONENT_NAME" - + + 0 String 13 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034CB390
    +
    "TekkenGame-Win64-Shipping.exe"+034D0510
    11C 8 @@ -498,9 +534,10 @@ 1131 "OPPONENT_SIDE" - + + 0 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+034CB390
    +
    "TekkenGame-Win64-Shipping.exe"+034D0510
    78 8 @@ -518,7 +555,7 @@ 1005 "player_data_second_pointer_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -530,7 +567,7 @@ 1102 "player_data_second_pointer_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -542,7 +579,7 @@ 1007 "p2_end_block_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -554,7 +591,7 @@ 1010 "facing" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -567,7 +604,7 @@ 1011 "timer_in_frames" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -579,7 +616,7 @@ 1012 "p1_char_id" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -591,7 +628,7 @@ 1013 "p2_char_id" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -603,7 +640,7 @@ 1016 "p1_attack_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -615,7 +652,7 @@ 1017 "p2_attack_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -627,7 +664,7 @@ 1032 "p1_throw_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -639,7 +676,7 @@ 1155 "p2_throw_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -651,7 +688,7 @@ 1044 "p1_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -663,7 +700,7 @@ 1045 "p2_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -675,7 +712,7 @@ 1046 "p1_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -687,7 +724,7 @@ 1047 "p2_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -699,7 +736,7 @@ 1048 "p1_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -711,7 +748,7 @@ 1049 "p2_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -723,7 +760,7 @@ 1050 "p1_hitbox1" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -735,7 +772,7 @@ 1051 "p2_hitbox1" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -747,7 +784,7 @@ 1052 "p1_hitbox2" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -759,7 +796,7 @@ 1053 "p2_hitbox2" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -771,7 +808,7 @@ 1054 "p1_hitbox3" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -783,7 +820,7 @@ 1055 "p2_hitbox3" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -795,7 +832,7 @@ 1056 "p1_hitbox4" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -807,7 +844,7 @@ 1057 "p2_hitbox4" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -819,7 +856,7 @@ 1058 "p1_hitbox5" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -831,7 +868,7 @@ 1059 "p2_hitbox5" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -843,7 +880,7 @@ 1060 "p1_activebox_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -855,7 +892,7 @@ 1061 "p2_activebox_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -867,7 +904,7 @@ 1062 "p1_activebox_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -879,7 +916,7 @@ 1063 "p2_activebox_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -891,7 +928,7 @@ 1064 "p1_activebox_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -903,7 +940,7 @@ 1065 "p2_activebox_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -915,7 +952,7 @@ 1066 "p1_health_percent" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -927,7 +964,7 @@ 1067 "p2_health_percent" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -939,7 +976,7 @@ 1068 "p1_input_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -951,7 +988,7 @@ 1069 "p2_input_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -963,7 +1000,7 @@ 1078 "p1_rage_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -975,7 +1012,7 @@ 1079 "p2_rage_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -987,7 +1024,7 @@ 1080 "p1_mystery_state" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -999,7 +1036,7 @@ 1135 "p2_mystery_state" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1011,7 +1048,7 @@ 1125 "p1_round_wins" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1023,7 +1060,7 @@ 1126 "p2_round_wins" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1035,7 +1072,7 @@ 1084 "p1_display_combo_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1047,7 +1084,7 @@ 1120 "p2_display_combo_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1059,7 +1096,7 @@ 1086 "p1_display_combo_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1071,7 +1108,7 @@ 1087 "p2_display_combo_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1083,7 +1120,7 @@ 1121 "p1_display_juggle_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1095,7 +1132,7 @@ 1122 "p2_display_juggle_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1110,76 +1147,101 @@ 4485 "----EXTRA----" - + FF9900 1 - 4486 - "FRAMECOUNTER" - + 4519 + "Distance" + + FF9900 + Float +
    "TekkenGame-Win64-Shipping.exe"+34E59A0
    +
    + + 4520 + "FrameCounter" + FF9900 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+34C32E0
    +
    "TekkenGame-Win64-Shipping.exe"+34C8460
    - 4487 - "DISTANCE" - + 4521 + "FrameCounterAlt" + FF9900 - Float -
    "TekkenGame-Win64-Shipping.exe"+34E07F0
    + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+34C870C
    - 4492 - "P1_distance" - + 4522 + "facing" + + 0 FF9900 - Float + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 13E0 + 148C 0 8
    - 4493 - "P2_distance" - + 4523 + "P1_Char_id" + FF9900 - Float + Byte
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 13E0+p2_data_offset + DC 0 8
    - 4498 - "facing" - + 4524 + "P2_Char_id" + FF9900 - 4 Bytes + Byte
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 145C + DC+p2_data_offset 0 8
    + + 4525 + "P1_Move_Id_NoRB" + + FF9900 + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+34D3154
    +
    + + 4526 + "P2_Move_Id_NoRB" + + FF9900 + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+34D6704
    +
    player_data_pointer_offset -
    034F8D48
    +
    34FE008
    p2_data_offset -
    7740
    +
    0x77A0
    How to update addresses after a patch: https://github.com/WAZAAAAA0/TekkenBot/wiki/How-to-update-addresses diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index 57b4884d..ea608f21 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,33 +1,33 @@ -;2020-11-09 patch addresses (4.00 Kunimitsu update, timestamp 1604908695, date from https://steamdb.info/app/389730/history/ ) +;2021-03-22 patch addresses (4.10 Lidia update, timestamp 1616400124, date from https://steamdb.info/app/389730/history/) ;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. [MemoryAddressOffsets] -player_data_pointer_offset = 0x034F8D48 0x8 -p2_data_offset = 0x7740 -rollback_frame_offset = 0x1E300 +player_data_pointer_offset = 0x034FE008 0x8 +p2_data_offset = 0x77A0 +rollback_frame_offset = 0x1E490 ;----IGNORABLE START---- -player_data_second_pointer_offset = 0x0 -p2_end_block_offset = 0xDC ;D0 +;player_data_second_pointer_offset = 0 +p2_end_block_offset = 0xD0 movelist_size = 2000000 expected_module_address = 0x140000000 ;Might not have to be configurable ;----IGNORABLE END---- [GameDataAddress] -frame_count = 0xA40 +frame_count = 0xA70 ;----IGNORABLE START---- ;frame_count = 0x6a0 ;resets sometimes on p1 backdash??? ;frame_count = 0x70C ;caps at 0xFF -facing = 0xD74 ;Joueur P1 de son cote ou dr. = 0 , oppose = 1 +facing = 0x148C ;Joueur P1 de son cote ou dr. = 0 , oppose = 1 timer_in_frames = 0x1A158 ;----IGNORABLE END---- [EndBlockPlayerDataAddress] ;----IGNORABLE START---- -round_wins = 0x1D92C ;semi-ignorable, for a fork, makes round counting work -p2_wins = 0x1DA18 +round_wins = 0x1BA6C ;semi-ignorable, for a fork, makes round counting work +;p2_wins = 0x19BB4 display_combo_counter = 0x1A200 display_combo_damage = 0x1A1D8 display_juggle_damage = 0x1A1DC @@ -40,29 +40,29 @@ total_moves_blocked = 0x19B5C ;Outdated ;NotUsed [PlayerDataAddress] -distance = 0x13E0 move_timer = 0x1F0 -move_id = 0x344 -face = 0x145C -recovery = 0x390 -hit_outcome = 0x3CC -attack_type = 0x40C -simple_move_state = 0x410 -stun_type = 0x414 -throw_tech = 0x434 -complex_move_state = 0x448 -power_crush = 0x694 -jump_flags = 0x726 -cancel_window = 0x758 -damage_taken = 0x90C -input_attack = 0x19DC -input_direction = 0xD6C -attack_startup = 0x7680 -attack_startup_end = 0x7684 -char_id = 0xD4 ;semi-ignorable, for a fork, full list of character ID's can be found inside MoveInfoEnums.py +move_id = 0x350 +recovery = 0x39C +hit_outcome = 0x3D8 +attack_type = 0x329 +simple_move_state = 0x428 +stun_type = 0x42C +throw_tech = 0x450 +complex_move_state = 0x470 +power_crush = 0x6C4 +jump_flags = 0x756 +cancel_window = 0x788 +damage_taken = 0x93C +input_attack = 0x1A0C +input_direction = 0xD9C +attack_startup = 0x76E0 +attack_startup_end = 0x76E4 +char_id = 0xDC ;semi-ignorable, full list of character ID's can be found inside MoveInfoEnums.py ;----IGNORABLE START---- -current_side = 0x145C ;semi-ignorable, for a fork -throw_flag = 0x418 ;semi-ignorable, might affect the "type" column +current_side = 0x123C ;semi-ignorable, for a fork +distance = 0x1410 ;semi-ignorable, for a fork +face = 0x148C +throw_flag = 0x0 ;semi-ignorable, might affect the "type" column attack_damage = 0x2FC x = 0xE70 y = 0xE74 @@ -88,12 +88,11 @@ juggle_height = 0x11D8 ;Outdated ;NotUsed [NonPlayerDataAddresses] -P1_Movelist = 0x034E1570 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A -P2_Movelist = 0x034E4B60 0x2E8 -OPPONENT_NAME = 0x034CB390 0x0 0x8 0x11C ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x034CB390 0x0 0x8 0x78 ;1 = if you, the player, picked left side +P1_Movelist = 0x034E6720 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A +P2_Movelist = 0x034E9D40 0x2E8 +OPPONENT_NAME = 0x034D0510 0x0 0x8 0x11C ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x034D0510 0x0 0x8 0x78 ;1 = if you, the player, picked left side ;----IGNORABLE START---- -PLAYER_SIDE = 0x034CB390 0x0 0x0 0x78 ;0 means we are player 1, 1 means we are player 2 P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 STAGE_SELECT = 0x033B4E68 0x80 0x78 @@ -106,4 +105,6 @@ WARMUP_PLAYER_NAME1 = 0x033B4408 0x50 0x0 ;OutOfDate ;look for name + opponent's WARMUP_PLAYER_WINS1 = 0x033B4408 0x50 -0x34 WARMUP_PLAYER_NAME2 = 0x033B4408 0x50 0x140 WARMUP_PLAYER_WINS2 = 0x033B4408 0x50 0x10C -;----IGNORABLE END---- +P1_MOVE_ID_NORB = 0x034D3154 +P2_MOVE_ID_NORB = 0x034E3A04 +;----IGNORABLE END---- \ No newline at end of file From 44d2aae77d10e677707bd9d4c0c6dc3512527a00 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sat, 27 Mar 2021 00:20:50 +0100 Subject: [PATCH 69/85] version bump --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index 8a6ed1a3..3c60eeeb 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.20.0' +CURRENT_VERSION = 'v0.21.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.20.0' in CURRENT_VERSION: + if 'v0.21.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From 37f6689f0e726efc278e3f5c956b4332feb0b726 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sat, 27 Mar 2021 00:21:35 +0100 Subject: [PATCH 70/85] add missing ThrowTechs enumeration Co-Authored-By: FimoX <21201911+FimoX@users.noreply.github.com> --- MoveInfoEnums.py | 1 + 1 file changed, 1 insertion(+) diff --git a/MoveInfoEnums.py b/MoveInfoEnums.py index 840c95fa..989ca698 100644 --- a/MoveInfoEnums.py +++ b/MoveInfoEnums.py @@ -92,6 +92,7 @@ class ComplexMoveStates(Enum): #These are tracking states> UNKN = 999999 #used to indicate a non standard tracking move class ThrowTechs(Enum): + DUMMY = 0 NONE = 29 TE1 = 28 #both 1 and 2 seem to sometimes include normal throws that can be broken with either TE2 = 31 From 7f2a9611e187ce7c2d95bfbf9bf93c1c6617bd99 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sun, 30 May 2021 02:09:59 +0200 Subject: [PATCH 71/85] version bump --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index 3c60eeeb..b640ba40 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.21.0' +CURRENT_VERSION = 'v0.22.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.21.0' in CURRENT_VERSION: + if 'v0.22.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From 14d380d5169c92d7a12080586b7512779a32558c Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sun, 30 May 2021 02:11:49 +0200 Subject: [PATCH 72/85] friendlier message --- TekkenGameState.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TekkenGameState.py b/TekkenGameState.py index a7a26f8a..0e412f48 100644 --- a/TekkenGameState.py +++ b/TekkenGameState.py @@ -85,7 +85,8 @@ def GetValueFromAddress(self, processHandle, address, isFloat=False, is64bit=Fal successful = ReadProcessMemory(processHandle, address, c.byref(data), c.sizeof(data), c.byref(bytesRead)) if not successful: e = GetLastError() - print("ReadProcessMemory Error: Code " + str(e)) + #print("ReadProcessMemory Error: Code " + str(e)) + print("waiting for match...") self.ReacquireEverything() value = data.value From 13ea1fc90ef403250a51aae0b1d2f03f2e8e90ef Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sun, 30 May 2021 02:13:52 +0200 Subject: [PATCH 73/85] 2021-05-27 patch addresses 4.20 (by FimoX) Co-Authored-By: FimoX <21201911+FimoX@users.noreply.github.com> --- CE_TekkenBot.CT | 194 +++++++++++++++++----------------- TekkenData/memory_address.ini | 6 +- 2 files changed, 100 insertions(+), 100 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index 89bbfa64..d2f7899c 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -22,7 +22,7 @@ 1008 "rollback_frame_offset" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -35,7 +35,7 @@ 1009 "frame_count" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -53,7 +53,7 @@ 1014 "p1_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -65,7 +65,7 @@ 1018 "p1_move_id" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -78,7 +78,7 @@ 1020 "p1_recovery" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -91,7 +91,7 @@ 1022 "p1_hit_outcome" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -104,7 +104,7 @@ 1024 "p1_attack_type" - + 0 Byte
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -117,7 +117,7 @@ 1026 "p1_simple_move_state" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -130,7 +130,7 @@ 1028 "p1_stun_type" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -143,7 +143,7 @@ 1030 "p1_throw_tech" - + Byte
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -155,7 +155,7 @@ 1034 "p1_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -167,7 +167,7 @@ 1123 "p1_power_crush" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -180,7 +180,7 @@ 1038 "p1_jump_flags" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -193,7 +193,7 @@ 1040 "p1_cancel_window" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -206,7 +206,7 @@ 1042 "p1_damage_taken" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -219,7 +219,7 @@ 1070 "p1_input_attack" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -232,7 +232,7 @@ 1072 "p1_input_direction" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -245,7 +245,7 @@ 1074 "p1_attack_startup" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -258,7 +258,7 @@ 1076 "p1_attack_startup_end" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -277,7 +277,7 @@ 1147 "p2_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -289,7 +289,7 @@ 1148 "p2_move_id" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -302,7 +302,7 @@ 1149 "p2_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -314,7 +314,7 @@ 1150 "p2_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -326,7 +326,7 @@ 1151 "p2_attack_type" - + Byte
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -338,7 +338,7 @@ 1152 "p2_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -350,7 +350,7 @@ 1153 "p2_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -362,7 +362,7 @@ 1154 "p2_throw_tech" - + Byte
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -374,7 +374,7 @@ 1156 "p2_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -386,7 +386,7 @@ 1157 "p2_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -398,7 +398,7 @@ 1158 "p2_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -410,7 +410,7 @@ 1159 "p2_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -422,7 +422,7 @@ 1160 "p2_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -434,7 +434,7 @@ 1161 "p2_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -446,7 +446,7 @@ 1162 "p2_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -458,7 +458,7 @@ 1163 "p2_attack_startup" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -470,7 +470,7 @@ 1164 "p2_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -488,7 +488,7 @@ 1127 "p1_movelist" - + 0 String 10 @@ -503,7 +503,7 @@ 4448 "p2_movelist" - + String 10 0 @@ -517,14 +517,14 @@ 1129 "OPPONENT_NAME" - + 0 String 13 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034D0510
    +
    "TekkenGame-Win64-Shipping.exe"+034D0520
    11C 8 @@ -534,10 +534,10 @@ 1131 "OPPONENT_SIDE" - + 0 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+034D0510
    +
    "TekkenGame-Win64-Shipping.exe"+034D0520
    78 8 @@ -555,7 +555,7 @@ 1005 "player_data_second_pointer_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -567,7 +567,7 @@ 1102 "player_data_second_pointer_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -579,7 +579,7 @@ 1007 "p2_end_block_offset" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -591,7 +591,7 @@ 1010 "facing" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -604,7 +604,7 @@ 1011 "timer_in_frames" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -616,7 +616,7 @@ 1012 "p1_char_id" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -628,7 +628,7 @@ 1013 "p2_char_id" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -640,7 +640,7 @@ 1016 "p1_attack_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -652,7 +652,7 @@ 1017 "p2_attack_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -664,7 +664,7 @@ 1032 "p1_throw_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -676,7 +676,7 @@ 1155 "p2_throw_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -688,7 +688,7 @@ 1044 "p1_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -700,7 +700,7 @@ 1045 "p2_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -712,7 +712,7 @@ 1046 "p1_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -724,7 +724,7 @@ 1047 "p2_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -736,7 +736,7 @@ 1048 "p1_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -748,7 +748,7 @@ 1049 "p2_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -760,7 +760,7 @@ 1050 "p1_hitbox1" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -772,7 +772,7 @@ 1051 "p2_hitbox1" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -784,7 +784,7 @@ 1052 "p1_hitbox2" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -796,7 +796,7 @@ 1053 "p2_hitbox2" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -808,7 +808,7 @@ 1054 "p1_hitbox3" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -820,7 +820,7 @@ 1055 "p2_hitbox3" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -832,7 +832,7 @@ 1056 "p1_hitbox4" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -844,7 +844,7 @@ 1057 "p2_hitbox4" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -856,7 +856,7 @@ 1058 "p1_hitbox5" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -868,7 +868,7 @@ 1059 "p2_hitbox5" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -880,7 +880,7 @@ 1060 "p1_activebox_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -892,7 +892,7 @@ 1061 "p2_activebox_x" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -904,7 +904,7 @@ 1062 "p1_activebox_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -916,7 +916,7 @@ 1063 "p2_activebox_y" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -928,7 +928,7 @@ 1064 "p1_activebox_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -940,7 +940,7 @@ 1065 "p2_activebox_z" - + 0000FF Float
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -952,7 +952,7 @@ 1066 "p1_health_percent" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -964,7 +964,7 @@ 1067 "p2_health_percent" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -976,7 +976,7 @@ 1068 "p1_input_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -988,7 +988,7 @@ 1069 "p2_input_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1000,7 +1000,7 @@ 1078 "p1_rage_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1012,7 +1012,7 @@ 1079 "p2_rage_flag" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1024,7 +1024,7 @@ 1080 "p1_mystery_state" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1036,7 +1036,7 @@ 1135 "p2_mystery_state" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1048,7 +1048,7 @@ 1125 "p1_round_wins" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1060,7 +1060,7 @@ 1126 "p2_round_wins" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1072,7 +1072,7 @@ 1084 "p1_display_combo_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1084,7 +1084,7 @@ 1120 "p2_display_combo_counter" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1096,7 +1096,7 @@ 1086 "p1_display_combo_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1108,7 +1108,7 @@ 1087 "p2_display_combo_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1120,7 +1120,7 @@ 1121 "p1_display_juggle_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1132,7 +1132,7 @@ 1122 "p2_display_juggle_damage" - + 0000FF 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1154,7 +1154,7 @@ 4519 "Distance" - + FF9900 Float
    "TekkenGame-Win64-Shipping.exe"+34E59A0
    @@ -1162,7 +1162,7 @@ 4520 "FrameCounter" - + FF9900 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+34C8460
    @@ -1170,7 +1170,7 @@ 4521 "FrameCounterAlt" - + FF9900 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+34C870C
    @@ -1178,7 +1178,7 @@ 4522 "facing" - + 0 FF9900 4 Bytes @@ -1192,7 +1192,7 @@ 4523 "P1_Char_id" - + FF9900 Byte
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -1205,7 +1205,7 @@ 4524 "P2_Char_id" - + FF9900 Byte
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index ea608f21..6e59ca18 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,4 +1,4 @@ -;2021-03-22 patch addresses (4.10 Lidia update, timestamp 1616400124, date from https://steamdb.info/app/389730/history/) +;2021-05-27 patch addresses (4.20 hairstyle update, SteamDB timestamp 1622102379) ;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. @@ -90,8 +90,8 @@ juggle_height = 0x11D8 ;Outdated ;NotUsed [NonPlayerDataAddresses] P1_Movelist = 0x034E6720 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A P2_Movelist = 0x034E9D40 0x2E8 -OPPONENT_NAME = 0x034D0510 0x0 0x8 0x11C ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x034D0510 0x0 0x8 0x78 ;1 = if you, the player, picked left side +OPPONENT_NAME = 0x034D0520 0x0 0x8 0x11C ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x034D0520 0x0 0x8 0x78 ;1 = if you, the player, picked left side ;----IGNORABLE START---- P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 From d25de03e33002b71bc579e7cb76c1cff696e4155 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sun, 3 Oct 2021 03:53:30 +0200 Subject: [PATCH 74/85] version bump --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index b640ba40..4932fb2a 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.22.0' +CURRENT_VERSION = 'v0.23.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.22.0' in CURRENT_VERSION: + if 'v0.23.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From 4f426d74f7a92a31693fe762f138017d9bd620eb Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sun, 3 Oct 2021 03:54:23 +0200 Subject: [PATCH 75/85] 2021-09-28 patch addresses 4.22 (by FimoX) Co-Authored-By: FimoX <21201911+FimoX@users.noreply.github.com> --- CE_TekkenBot.CT | 958 ++++++---------------------------- TekkenData/memory_address.ini | 38 +- 2 files changed, 190 insertions(+), 806 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index d2f7899c..d2d6e8f3 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -1,5 +1,5 @@ - + b7Ej%2nldAU:MM2b.}cxWeIh0Gi32eO*Ft]WMuP5%{mcIVgA6t9Fkwal+AgInNpI$=7,zGoLEqjnV-i7R=ffx00 b7Ej%2nldAU:MM2b.}cxWeIh0Gi32eO*Ft]WMuP5%{mcIVgA6t9Fkwal+AgInNpI$=7,zGoLEqjnV-i7R=ffx00 @@ -22,12 +22,12 @@ 1008 "rollback_frame_offset" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1E490 + 1E710 0 8 @@ -35,7 +35,8 @@ 1009 "frame_count" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -44,16 +45,10 @@ 8
    - - 4529 - "" - - 1 - 1014 "p1_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -65,7 +60,7 @@ 1018 "p1_move_id" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -78,7 +73,7 @@ 1020 "p1_recovery" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -91,7 +86,7 @@ 1022 "p1_hit_outcome" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -104,9 +99,9 @@ 1024 "p1_attack_type" - + 0 - Byte + 2 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    329 @@ -117,7 +112,7 @@ 1026 "p1_simple_move_state" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -130,7 +125,7 @@ 1028 "p1_stun_type" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -143,11 +138,12 @@ 1030 "p1_throw_tech" - - Byte + + 0 + 2 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 450 + 7c90 0 8 @@ -155,7 +151,8 @@ 1034 "p1_complex_move_state" - + + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -167,7 +164,7 @@ 1123 "p1_power_crush" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -180,7 +177,7 @@ 1038 "p1_jump_flags" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -193,7 +190,7 @@ 1040 "p1_cancel_window" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -206,12 +203,12 @@ 1042 "p1_damage_taken" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 93C + 360 0 8 @@ -219,12 +216,12 @@ 1070 "p1_input_attack" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1A0C + 1a5c 0 8 @@ -232,12 +229,12 @@ 1072 "p1_input_direction" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - D9C + Ddc 0 8 @@ -245,12 +242,12 @@ 1074 "p1_attack_startup" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 76E0 + 7780 0 8 @@ -258,26 +255,20 @@ 1076 "p1_attack_startup_end" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 76E4 + 7784 0 8
    - - 4527 - "" - - 1 - 1147 "p2_move_timer" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -289,7 +280,7 @@ 1148 "p2_move_id" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -302,11 +293,11 @@ 1149 "p2_recovery" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 39C+p2_data_offset + 39c+p2_data_offset 0 8 @@ -314,11 +305,11 @@ 1150 "p2_hit_outcome" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 3D8+p2_data_offset + 308+p2_data_offset 0 8 @@ -326,8 +317,9 @@ 1151 "p2_attack_type" - - Byte + + 0 + 2 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    329+p2_data_offset @@ -338,7 +330,7 @@ 1152 "p2_simple_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -350,11 +342,11 @@ 1153 "p2_stun_type" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 42C+p2_data_offset + 42c+p2_data_offset 0 8 @@ -362,8 +354,9 @@ 1154 "p2_throw_tech" - - Byte + + 0 + 2 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    450+p2_data_offset @@ -374,11 +367,11 @@ 1156 "p2_complex_move_state" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 470+p2_data_offset + 448+p2_data_offset 0 8 @@ -386,11 +379,11 @@ 1157 "p2_power_crush" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 6C4+p2_data_offset + 6c4+p2_data_offset 0 8 @@ -398,7 +391,7 @@ 1158 "p2_jump_flags" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -410,7 +403,7 @@ 1159 "p2_cancel_window" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -422,11 +415,11 @@ 1160 "p2_damage_taken" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 93C+p2_data_offset + 360+p2_data_offset 0 8 @@ -434,11 +427,11 @@ 1161 "p2_input_attack" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 1a0c+p2_data_offset + 1a5c+p2_data_offset 0 8 @@ -446,23 +439,11 @@ 1162 "p2_input_direction" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - D9C+p2_data_offset - 0 - 8 - -
    - - 1163 - "p2_attack_startup" - - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 76E0+p2_data_offset + DdC+p2_data_offset 0 8 @@ -470,675 +451,91 @@ 1164 "p2_attack_startup_end" - + 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 76E4+p2_data_offset + 7784+p2_data_offset 0 8
    - 4528 - "" - - 1 - - - 1127 - "p1_movelist" - - 0 - String - 10 - 0 - 0 - 1 -
    "TekkenGame-Win64-Shipping.exe"+034E6720
    - - 2E8 - -
    - - 4448 - "p2_movelist" - - String - 10 - 0 - 0 - 1 -
    "TekkenGame-Win64-Shipping.exe"+034E9D40
    - - 2E8 - -
    - - 1129 - "OPPONENT_NAME" - - 0 - String - 13 - 0 - 0 - 1 -
    "TekkenGame-Win64-Shipping.exe"+034D0520
    - - 11C - 8 - 0 - -
    - - 1131 - "OPPONENT_SIDE" - - 0 + 1163 + "p2_attack_startup" + 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+034D0520
    +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 78 - 8 + 7780+p2_data_offset 0 + 8
    - 1136 - "----IGNORABLE----" - + 4500 + "----INonPlayerDataAddresses----" - 0000FF + 008000 1 - 1005 - "player_data_second_pointer_offset" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 0 - 0 - -
    - - 1102 - "player_data_second_pointer_offset" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1208 - 0 - -
    - - 1007 - "p2_end_block_offset" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c8 - 0 - -
    - - 1010 - "facing" - - 0000FF + 1131 + "OPPONENT_SIDE" + + 0 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    +
    "TekkenGame-Win64-Shipping.exe"+034d24a0
    - 142c - 0 + 78 8 - -
    - - 1011 - "timer_in_frames" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A158 - 0 - -
    - - 1012 - "p1_char_id" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - d4 - 0 - -
    - - 1013 - "p2_char_id" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 6924 - 0 - -
    - - 1016 - "p1_attack_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 2fc - 0 - -
    - - 1017 - "p2_attack_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 6B4C - 0 - -
    - - 1032 - "p1_throw_flag" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 400 - 0 - -
    - - 1155 - "p2_throw_flag" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 400+p2_data_offset - 0 - -
    - - 1044 - "p1_x" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c00 - 0 - -
    - - 1045 - "p2_x" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7450 - 0 - -
    - - 1046 - "p1_y" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c04 - 0 - -
    - - 1047 - "p2_y" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7454 - 0 - -
    - - 1048 - "p1_z" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c08 - 0 - -
    - - 1049 - "p2_z" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7458 - 0 - -
    - - 1050 - "p1_hitbox1" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c0c - 0 - -
    - - 1051 - "p2_hitbox1" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 745C - 0 - -
    - - 1052 - "p1_hitbox2" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c10 - 0 - -
    - - 1053 - "p2_hitbox2" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7460 - 0 - -
    - - 1054 - "p1_hitbox3" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c14 - 0 - -
    - - 1055 - "p2_hitbox3" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7464 - 0 - -
    - - 1056 - "p1_hitbox4" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c18 - 0 - -
    - - 1057 - "p2_hitbox4" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7468 - 0 - -
    - - 1058 - "p1_hitbox5" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - c1c 0
    - 1059 - "p2_hitbox5" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 746C - 0 - -
    - - 1060 - "p1_activebox_x" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1060 - 0 - -
    - - 1061 - "p2_activebox_x" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 78B0 - 0 - -
    - - 1062 - "p1_activebox_y" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1064 - 0 - -
    - - 1063 - "p2_activebox_y" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 78B4 - 0 - -
    - - 1064 - "p1_activebox_z" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1068 - 0 - -
    - - 1065 - "p2_activebox_z" - - 0000FF - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 78B8 - 0 - -
    - - 1066 - "p1_health_percent" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 11e8 - 0 - -
    - - 1067 - "p2_health_percent" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7A38 - 0 - -
    - - 1068 - "p1_input_counter" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 15B8 - 0 - -
    - - 1069 - "p2_input_counter" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 7E08 - 0 - -
    - - 1078 - "p1_rage_flag" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 99C - 0 - -
    - - 1079 - "p2_rage_flag" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 71EC - 0 - -
    - - 1080 - "p1_mystery_state" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 990 - 0 - -
    - - 1135 - "p2_mystery_state" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 71E0 - 0 - -
    - - 1125 - "p1_round_wins" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A16c - 0 - -
    - - 1126 - "p2_round_wins" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A23c - 0 - -
    - - 1084 - "p1_display_combo_counter" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A200 - 0 - -
    - - 1120 - "p2_display_combo_counter" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A2D0 - 0 - -
    - - 1086 - "p1_display_combo_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A1D8 - 0 - -
    - - 1087 - "p2_display_combo_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 1A2A8 + 1129 + "OPPONENT_NAME" + + 0 + String + 13 + 0 + 0 + 1 +
    "TekkenGame-Win64-Shipping.exe"+034d24a0
    + + 11c + 8 0
    - 1121 - "p1_display_juggle_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + 1127 + "p1_movelist" + + 0 + String + 10 + 0 + 0 + 1 +
    "TekkenGame-Win64-Shipping.exe"+034e86f0
    - 1A1DC - 0 + 2E8
    - 1122 - "p2_display_juggle_damage" - - 0000FF - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + 4448 + "p2_movelist" + + String + 10 + 0 + 0 + 1 +
    "TekkenGame-Win64-Shipping.exe"+034ebd60
    - 1A2AC - 0 + 2E8
    @@ -1152,96 +549,83 @@ 1 - 4519 - "Distance" - - FF9900 - Float -
    "TekkenGame-Win64-Shipping.exe"+34E59A0
    -
    - - 4520 + 4486 "FrameCounter" - - FF9900 - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+34C8460
    -
    - - 4521 - "FrameCounterAlt" - - FF9900 - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+34C870C
    -
    - - 4522 - "facing" - - 0 - FF9900 - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 148C - 0 - 8 - -
    - - 4523 - "P1_Char_id" - - FF9900 - Byte -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - DC - 0 - 8 - -
    - - 4524 - "P2_Char_id" - - FF9900 - Byte -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - DC+p2_data_offset - 0 - 8 - -
    - - 4525 - "P1_Move_Id_NoRB" - + FF9900 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+34D3154
    +
    "TekkenGame-Win64-Shipping.exe"+34B013C
    - 4526 - "P2_Move_Id_NoRB" - + 4487 + "Distance" + FF9900 - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+34D6704
    + Float +
    "TekkenGame-Win64-Shipping.exe"+34B008C
    + + 4492 + "P1_distance" + + 0 + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 750 + 0 + 8 + +
    + + 4493 + "P2_distance" + + 0 + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 750+p2_data_offset + 0 + 8 + +
    + + 4498 + "facing" + + 0 + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 14CC + 0 + 8 + +
    + + 4499 + "P1_Char_id" + + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + DC + 0 + 8 + +
    player_data_pointer_offset -
    34FE008
    +
    035001B8
    p2_data_offset -
    0x77A0
    +
    0x7840
    How to update addresses after a patch: https://github.com/WAZAAAAA0/TekkenBot/wiki/How-to-update-addresses diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index 6e59ca18..03320211 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,11 +1,11 @@ -;2021-05-27 patch addresses (4.20 hairstyle update, SteamDB timestamp 1622102379) +;2021-09-28 patch addresses (4.22 update, timestamp 1627977765, date from https://steamdb.info/app/389730/history/) ;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. [MemoryAddressOffsets] -player_data_pointer_offset = 0x034FE008 0x8 -p2_data_offset = 0x77A0 -rollback_frame_offset = 0x1E490 +player_data_pointer_offset = 0x035001B8 0x8 +p2_data_offset = 0x7840 +rollback_frame_offset = 0x1E710 ;----IGNORABLE START---- ;player_data_second_pointer_offset = 0 p2_end_block_offset = 0xD0 @@ -19,7 +19,7 @@ frame_count = 0xA70 ;----IGNORABLE START---- ;frame_count = 0x6a0 ;resets sometimes on p1 backdash??? ;frame_count = 0x70C ;caps at 0xFF -facing = 0x148C ;Joueur P1 de son cote ou dr. = 0 , oppose = 1 +facing = 0x14CC ; Joueur P1 de son cote ou dr. = 0 , oppose = 1 timer_in_frames = 0x1A158 ;----IGNORABLE END---- @@ -40,8 +40,10 @@ total_moves_blocked = 0x19B5C ;Outdated ;NotUsed [PlayerDataAddress] +distance = 0x1450 move_timer = 0x1F0 move_id = 0x350 +face = 0x14CC recovery = 0x39C hit_outcome = 0x3D8 attack_type = 0x329 @@ -52,16 +54,14 @@ complex_move_state = 0x470 power_crush = 0x6C4 jump_flags = 0x756 cancel_window = 0x788 -damage_taken = 0x93C -input_attack = 0x1A0C -input_direction = 0xD9C -attack_startup = 0x76E0 -attack_startup_end = 0x76E4 -char_id = 0xDC ;semi-ignorable, full list of character ID's can be found inside MoveInfoEnums.py +damage_taken = 0x360 +input_attack = 0x1a5c +input_direction = 0xDDC +attack_startup = 0x7780 +attack_startup_end = 0x7784 +char_id = 0xDC ;semi-ignorable, for a fork, full list of character ID's can be found inside MoveInfoEnums.py ;----IGNORABLE START---- current_side = 0x123C ;semi-ignorable, for a fork -distance = 0x1410 ;semi-ignorable, for a fork -face = 0x148C throw_flag = 0x0 ;semi-ignorable, might affect the "type" column attack_damage = 0x2FC x = 0xE70 @@ -88,10 +88,12 @@ juggle_height = 0x11D8 ;Outdated ;NotUsed [NonPlayerDataAddresses] -P1_Movelist = 0x034E6720 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A -P2_Movelist = 0x034E9D40 0x2E8 -OPPONENT_NAME = 0x034D0520 0x0 0x8 0x11C ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x034D0520 0x0 0x8 0x78 ;1 = if you, the player, picked left side +P1_Movelist = 0x034e86f0 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A +P2_Movelist = 0x034ebd60 0x2E8 +OPPONENT_NAME = 0x034d24a0 0x0 0x8 0x11C ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x034d24a0 0x0 0x8 0x78 ;1 = if you, the player, picked left side +P1_MOVE_ID_NORB = 0x034D3154 +P2_MOVE_ID_NORB = 0x034E3A04 ;----IGNORABLE START---- P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 @@ -105,6 +107,4 @@ WARMUP_PLAYER_NAME1 = 0x033B4408 0x50 0x0 ;OutOfDate ;look for name + opponent's WARMUP_PLAYER_WINS1 = 0x033B4408 0x50 -0x34 WARMUP_PLAYER_NAME2 = 0x033B4408 0x50 0x140 WARMUP_PLAYER_WINS2 = 0x033B4408 0x50 0x10C -P1_MOVE_ID_NORB = 0x034D3154 -P2_MOVE_ID_NORB = 0x034E3A04 ;----IGNORABLE END---- \ No newline at end of file From a07ac31c73f15c5bc1b11f17dcadd473f6bfc53f Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 29 Oct 2021 19:59:11 +0200 Subject: [PATCH 76/85] version bump --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index 4932fb2a..e2caff9a 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.23.0' +CURRENT_VERSION = 'v0.24.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.23.0' in CURRENT_VERSION: + if 'v0.24.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From 0be4745d141322650fa65307847e2e4312ba08a9 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Fri, 29 Oct 2021 20:00:04 +0200 Subject: [PATCH 77/85] CPU fix by skipping error loop Co-Authored-By: FimoX <21201911+FimoX@users.noreply.github.com> --- TekkenGameState.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TekkenGameState.py b/TekkenGameState.py index 0e412f48..85dd6c4f 100644 --- a/TekkenGameState.py +++ b/TekkenGameState.py @@ -174,8 +174,8 @@ def GetUpdatedState(self, rollback_frame = 0): if self.module_address == None: print("TekkenGame-Win64-Shipping.exe not found. Likely wrong process id. Reacquiring pid.") self.ReacquireEverything() - elif(self.module_address != self.c['MemoryAddressOffsets']['expected_module_address']): - print("Unrecognized location for TekkenGame-Win64-Shipping.exe module. Tekken.exe Patch? Wrong process id?") +# elif(self.module_address != self.c['MemoryAddressOffsets']['expected_module_address']): +# print("Unrecognized location for TekkenGame-Win64-Shipping.exe module. Tekken.exe Patch? Wrong process id?") else: print("Found TekkenGame-Win64-Shipping.exe") self.needReacquireModule = False @@ -189,7 +189,7 @@ def GetUpdatedState(self, rollback_frame = 0): if i + 1 < len(addresses): value = self.GetValueFromAddress(processHandle, value + offset, is64bit=True) else: - value = self.GetValueFromAddress(processHandle, value + offset, isString=False) + value = self.GetValueFromAddress(processHandle, value + offset, is64bit=True) player_data_base_address = value From d0576cc73bc280dea9cd438e4b66d1e5c57c96cc Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 17 Aug 2022 15:39:24 +0200 Subject: [PATCH 78/85] version bump --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index e2caff9a..0df4836f 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.24.0' +CURRENT_VERSION = 'v0.25.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.24.0' in CURRENT_VERSION: + if 'v0.25.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From 02b632b4146faaf32c0f425636b7cf53e0bd84e2 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Wed, 17 Aug 2022 15:46:01 +0200 Subject: [PATCH 79/85] 2022-08-17 patch addresses 5.00 --- CE_TekkenBot.CT | 209 +++++++++++++++------------------- TekkenData/memory_address.ini | 18 +-- 2 files changed, 101 insertions(+), 126 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index d2d6e8f3..564cd7a4 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -1,28 +1,25 @@ - + - b7Ej%2nldAU:MM2b.}cxWeIh0Gi32eO*Ft]WMuP5%{mcIVgA6t9Fkwal+AgInNpI$=7,zGoLEqjnV-i7R=ffx00 - b7Ej%2nldAU:MM2b.}cxWeIh0Gi32eO*Ft]WMuP5%{mcIVgA6t9Fkwal+AgInNpI$=7,zGoLEqjnV-i7R=ffx00 + 3u9nl2nldAU:MM2b.}cxWeIh0Gi32eO*Ft]WMuP5%{mcIVgA6t9Fkwal+AgInNpI$=7,zGoLEqjnV-i7R=g,*;:Tw,R16YeH[_iEGt*C+U.qF + i)p]22nldAU:MM2b.}cxWeat2GmJN6?kvc9VRmF;@GMB1(nRL3z]z]mU%-@a8lIU[lELi2$nKn2P=DLS$HoHEz}$rY6P8,33:(^B)lgLA):%XT000 4445 "player_data_pointer_offset is in "Memory view -> View -> Userdefined symbols"" - 009900 1 4444 "p2_data_offset is in "Memory view -> View -> Userdefined symbols"" - 009900 1 1008 "rollback_frame_offset" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -35,7 +32,6 @@ 1009 "frame_count" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -48,7 +44,6 @@ 1014 "p1_move_timer" - 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -60,7 +55,6 @@ 1018 "p1_move_id" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -73,7 +67,6 @@ 1020 "p1_recovery" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -86,7 +79,6 @@ 1022 "p1_hit_outcome" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -99,7 +91,6 @@ 1024 "p1_attack_type" - 0 2 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -112,7 +103,6 @@ 1026 "p1_simple_move_state" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -125,7 +115,6 @@ 1028 "p1_stun_type" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -138,7 +127,6 @@ 1030 "p1_throw_tech" - 0 2 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -151,7 +139,6 @@ 1034 "p1_complex_move_state" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -164,7 +151,6 @@ 1123 "p1_power_crush" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -177,7 +163,6 @@ 1038 "p1_jump_flags" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -190,7 +175,6 @@ 1040 "p1_cancel_window" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -203,7 +187,6 @@ 1042 "p1_damage_taken" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -216,7 +199,6 @@ 1070 "p1_input_attack" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -229,7 +211,6 @@ 1072 "p1_input_direction" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -242,7 +223,6 @@ 1074 "p1_attack_startup" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -255,7 +235,6 @@ 1076 "p1_attack_startup_end" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -268,7 +247,6 @@ 1147 "p2_move_timer" - 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -280,7 +258,6 @@ 1148 "p2_move_id" - 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -293,7 +270,7 @@ 1149 "p2_recovery" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -305,11 +282,11 @@ 1150 "p2_hit_outcome" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 308+p2_data_offset + 3D8+p2_data_offset 0 8 @@ -317,7 +294,6 @@ 1151 "p2_attack_type" - 0 2 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -330,7 +306,6 @@ 1152 "p2_simple_move_state" - 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -342,7 +317,6 @@ 1153 "p2_stun_type" - 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -354,7 +328,6 @@ 1154 "p2_throw_tech" - 0 2 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -367,11 +340,11 @@ 1156 "p2_complex_move_state" - + 0 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - 448+p2_data_offset + 470+p2_data_offset 0 8 @@ -379,7 +352,6 @@ 1157 "p2_power_crush" - 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -391,7 +363,6 @@ 1158 "p2_jump_flags" - 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -403,7 +374,6 @@ 1159 "p2_cancel_window" - 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -415,7 +385,6 @@ 1160 "p2_damage_taken" - 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -427,7 +396,6 @@ 1161 "p2_input_attack" - 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -439,7 +407,6 @@ 1162 "p2_input_direction" - 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -451,7 +418,6 @@ 1164 "p2_attack_startup_end" - 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -463,7 +429,6 @@ 1163 "p2_attack_startup" - 4 Bytes
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    @@ -475,17 +440,15 @@ 4500 "----INonPlayerDataAddresses----" - 008000 1 1131 "OPPONENT_SIDE" - 0 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+034d24a0
    +
    "TekkenGame-Win64-Shipping.exe"+034D2520
    78 8 @@ -495,14 +458,13 @@ 1129 "OPPONENT_NAME" - 0 String 13 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034d24a0
    +
    "TekkenGame-Win64-Shipping.exe"+034D2520
    11c 8 @@ -512,14 +474,13 @@ 1127 "p1_movelist" - 0 String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034e86f0
    +
    "TekkenGame-Win64-Shipping.exe"+034E8770
    2E8 @@ -527,13 +488,13 @@ 4448 "p2_movelist" - + 0 String 10 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034ebd60
    +
    "TekkenGame-Win64-Shipping.exe"+034EBDE0
    2E8 @@ -543,90 +504,104 @@ 4485 "----EXTRA----" - - FF9900 1 - 4486 + 4521 "FrameCounter" - - FF9900 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+34B013C
    +
    "TekkenGame-Win64-Shipping.exe"+34CA460
    - 4487 + 19 "Distance" - - FF9900 Float -
    "TekkenGame-Win64-Shipping.exe"+34B008C
    +
    "TekkenGame-Win64-Shipping.exe"+34E79A0
    +
    + + 17 + "P1_MoveID" + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+34E75A0
    +
    + + 18 + "P2_MoveID" + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+34EAC10
    +
    + + 4492 + "P1_distance" + 0 + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 750 + 0 + 8 + +
    + + 4493 + "P2_distance" + 0 + Float +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 74C+p2_data_offset + 0 + 8 + +
    + + 4498 + "facing" + 0 + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + 14CC + 0 + 8 + +
    + + 4499 + "P1_Char_id" + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + DC + 0 + 8 + +
    + + 4522 + "P2_Char_id" + 0 + 4 Bytes +
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    + + DC+p2_data_offset + 0 + 8 +
    - - 4492 - "P1_distance" - - 0 - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 750 - 0 - 8 - -
    - - 4493 - "P2_distance" - - 0 - Float -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 750+p2_data_offset - 0 - 8 - -
    - - 4498 - "facing" - - 0 - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - 14CC - 0 - 8 - -
    - - 4499 - "P1_Char_id" - - 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+player_data_pointer_offset
    - - DC - 0 - 8 - -
    - - player_data_pointer_offset -
    035001B8
    -
    p2_data_offset
    0x7840
    + + player_data_pointer_offset +
    03500238
    +
    How to update addresses after a patch: https://github.com/WAZAAAAA0/TekkenBot/wiki/How-to-update-addresses diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index 03320211..5eeefc4d 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,9 +1,9 @@ -;2021-09-28 patch addresses (4.22 update, timestamp 1627977765, date from https://steamdb.info/app/389730/history/) +;2022-08-17 patch addresses (5.00 ping indicator update, timestamp 1660723367, date from https://steamdb.info/app/389730/history/) ;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. [MemoryAddressOffsets] -player_data_pointer_offset = 0x035001B8 0x8 +player_data_pointer_offset = 0x03500238 0x8 p2_data_offset = 0x7840 rollback_frame_offset = 0x1E710 ;----IGNORABLE START---- @@ -40,7 +40,6 @@ total_moves_blocked = 0x19B5C ;Outdated ;NotUsed [PlayerDataAddress] -distance = 0x1450 move_timer = 0x1F0 move_id = 0x350 face = 0x14CC @@ -61,6 +60,7 @@ attack_startup = 0x7780 attack_startup_end = 0x7784 char_id = 0xDC ;semi-ignorable, for a fork, full list of character ID's can be found inside MoveInfoEnums.py ;----IGNORABLE START---- +distance = 0x1450 ;semi-ignorable, for a fork current_side = 0x123C ;semi-ignorable, for a fork throw_flag = 0x0 ;semi-ignorable, might affect the "type" column attack_damage = 0x2FC @@ -88,12 +88,10 @@ juggle_height = 0x11D8 ;Outdated ;NotUsed [NonPlayerDataAddresses] -P1_Movelist = 0x034e86f0 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A -P2_Movelist = 0x034ebd60 0x2E8 -OPPONENT_NAME = 0x034d24a0 0x0 0x8 0x11C ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x034d24a0 0x0 0x8 0x78 ;1 = if you, the player, picked left side -P1_MOVE_ID_NORB = 0x034D3154 -P2_MOVE_ID_NORB = 0x034E3A04 +P1_Movelist = 0x034E8770 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A +P2_Movelist = 0x034EBDE0 0x2E8 +OPPONENT_NAME = 0x034D2520 0x0 0x8 0x11C ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x034D2520 0x0 0x8 0x78 ;1 = if you, the player, picked left side ;----IGNORABLE START---- P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 @@ -107,4 +105,6 @@ WARMUP_PLAYER_NAME1 = 0x033B4408 0x50 0x0 ;OutOfDate ;look for name + opponent's WARMUP_PLAYER_WINS1 = 0x033B4408 0x50 -0x34 WARMUP_PLAYER_NAME2 = 0x033B4408 0x50 0x140 WARMUP_PLAYER_WINS2 = 0x033B4408 0x50 0x10C +P1_MOVE_ID_NORB = 0x034D3154 +P2_MOVE_ID_NORB = 0x034E3A04 ;----IGNORABLE END---- \ No newline at end of file From b18f2540077aa5eed7ced9450741fbc0bcd6c9e4 Mon Sep 17 00:00:00 2001 From: Triforium Date: Sat, 3 Sep 2022 01:32:22 +0800 Subject: [PATCH 80/85] Added passiveBot; Attempts to do counters whenever possible Signed-off-by: Triforium (cherry picked from commit 6199e037c2e0b7f01ede9e165b66784bcf4538f5) --- BasicCommands.py | 11 +++ BotData.py | 96 +++++++++++++++++++++++-- BotFrameTrap.py | 2 +- BotPassive.py | 71 ++++++++++++++++++ BotPunisher.py | 4 +- CharacterData.py | 17 ++++- TekkenData/CharacterData/LuckyChloe.txt | 49 ++++++++----- TekkenData/CharacterData/README.md | 7 ++ TekkenGameState.py | 24 ++++++- _TekkenBotLauncher.py | 3 +- 10 files changed, 252 insertions(+), 32 deletions(-) create mode 100644 BotPassive.py create mode 100644 TekkenData/CharacterData/README.md diff --git a/BasicCommands.py b/BasicCommands.py index 8f815ba8..93941bc0 100644 --- a/BasicCommands.py +++ b/BasicCommands.py @@ -157,6 +157,17 @@ def BlockMidFull(self, startup): self.AddCommand(UniversalCommands.BLOCK_MID_FULL) self.commandBuffer[1] = (self.commandBuffer[1][0], startup) + def BlockLowNow(self, startup): + """ + Testing Function + + A more instant access to blocking lows + """ + self.ClearCommands() + self.inputController.HoldBack() + self.inputController.HoldDown() + self.BlockLowFull(startup) + def BlockLowFull(self, startup): self.commandBuffer = [] self.AddCommand(UniversalCommands.BLOCK_LOW_FULL) diff --git a/BotData.py b/BotData.py index f05b744c..647601a9 100644 --- a/BotData.py +++ b/BotData.py @@ -1,5 +1,7 @@ +from xml.dom.minidom import CharacterData from TekkenGameState import TekkenGameState from BasicCommands import BotCommands +from CharacterData import * class BotBehaviors: @@ -16,7 +18,7 @@ def StopPressingButtonsAfterGettingHit(gameState, botCommands): def TechThrows(gameState, botCommands): if gameState.IsBotBeingThrown(): - botCommands.ThrowTech() + botCommands.MashTech() def GetUp(gameState, botCommands): if gameState.IsBotOnGround(): @@ -26,13 +28,97 @@ def TechCombos(gameState, botCommands): if gameState.IsBotBeingJuggled(): botCommands.MashTech() - def BlockAllAttacks(gameState: TekkenGameState, botCommands:BotCommands): + def DefendAllAttacks(gameState: TekkenGameState, botCommands:BotCommands): + if gameState.IsOppAttacking(): + frames = gameState.GetOppTimeUntilImpact() + if gameState.IsOppAttackLow(): + botCommands.BlockLowFull(max(0, frames)) + else: + botCommands.BlockMidFull(max(0, frames)) + + def TryBreakThrows(gameState: TekkenGameState, botCommands:BotCommands) -> bool: + """ + Spam break throws when opponent is attempting to throw. + + Output + ----------------- + True if the bot is attempting break throws + """ + if BotBehaviors.OppIsThrowing(gameState): + print("Breaking Throws") + botCommands.MashTech() + return True + return False + + def OppIsThrowing(gameState: TekkenGameState): + if gameState.IsOppAttackThrow(): + return True + elif gameState.IsBotStartedBeingThrown(): + return True + elif gameState.IsBotBeingThrown(): + return True + return False + + + def DefendAndCounter(gameState: TekkenGameState, botCommands:BotCommands, gameplan: Gameplan) -> bool: + """ + Counter (with another attack) whenever possible, blocks otherwise. + + Output + ----------------- + If True, the bot is doing blocks/Dodges/nothing. + If False, the bot is countering. + """ + if gameState.IsOppAttacking(): + oppAirborne = gameState.IsOppAirborne() + frames = gameState.GetOppTimeUntilImpact() + 1 + counter = BotBehaviors.CanCounter(frames, gameState, oppAirborne) + + if counter: + counterCommand = None + if oppAirborne: + counterCommand = gameplan.GetMoveByFrame(ResponseTypes.low_counters, frames) + elif gameState.IsOppAttackMid: + counterCommand = gameplan.GetMoveByFrame(ResponseTypes.mid_counters, frames) + else: + counterCommand = gameplan.GetMoveByFrame(ResponseTypes.high_counters, frames) + + if not counterCommand == None: + print("Countering") + botCommands.AddCommand(counterCommand) + return False + if gameState.IsOppAttackLow(): - botCommands.BlockLowFull(max(0, gameState.GetOppTimeUntilImpact())) + print("Blocking Low") + botCommands.BlockLowFull(max(0, frames)) + return True else: - botCommands.BlockMidFull(max(0, gameState.GetOppTimeUntilImpact())) + print("Blocking HighMid") + botCommands.BlockMidFull(max(0, frames)) + return True + return True def UnblockIncomingAttacks(self, gameState: TekkenGameState): if gameState.IsOppAttacking(): - self.botCommands.WalkForward(max(0, gameState.GetOppTimeUntilImpact())) \ No newline at end of file + self.botCommands.WalkForward(max(0, gameState.GetOppTimeUntilImpact())) + + def CanCounter(frames: int, gameState: TekkenGameState, airborneOpp: bool): + # Dont counter crushes + if gameState.IsOppPowerCrush(): + return False + # Dont counter if we are currently blocking + elif gameState.IsBotBlocking(): + return False + # or already attacking + elif gameState.IsBotAttackStarting(): + return False + + # Counter if the attack is more than 10 frames + elif frames > 10: + return True + # Counter if the opponent is airborn, and the attack is more than 5 frames. + elif airborneOpp and frames > 5: + return True + else: + return False \ No newline at end of file diff --git a/BotFrameTrap.py b/BotFrameTrap.py index 0c97b685..85e71116 100644 --- a/BotFrameTrap.py +++ b/BotFrameTrap.py @@ -26,7 +26,7 @@ def Update(self, gameState: TekkenGameState): BotBehaviors.Basic(gameState, self.botCommands) if self.botCommands.IsAvailable(): - BotBehaviors.BlockAllAttacks(gameState, self.botCommands) + BotBehaviors.DefendAllAttacks(gameState, self.botCommands) if gameState.IsBotBlocking() or gameState.IsBotGettingHit(): self.botCommands.AddCommand(self.response) diff --git a/BotPassive.py b/BotPassive.py new file mode 100644 index 00000000..c0a2fb96 --- /dev/null +++ b/BotPassive.py @@ -0,0 +1,71 @@ +""" +A bot that plays passively/defensively with pokes, waiting to punish and small counters + +""" + +from Bot import Bot +from TekkenGameState import TekkenGameState +from TekkenEncyclopedia import TekkenEncyclopedia +from BotData import BotBehaviors +from CharacterData import * + + +class BotPassive(Bot): + + def __init__(self, botCommands): + super().__init__(botCommands) + self.gameplan = None + self.enemyCyclopedia = TekkenEncyclopedia(False) + + + def Update(self, gameState: TekkenGameState): + + self.enemyCyclopedia.Update(gameState) + + if gameState.WasFightReset(): + self.botCommands.ClearCommands() + self.gameplan = None + + if self.gameplan == None : + char_id = gameState.GetBotCharId() + if char_id != None: + self.gameplan = GetGameplan(char_id) + + if self.gameplan != None: + BotBehaviors.Basic(gameState, self.botCommands) + if self.botCommands.IsAvailable(): + + if BotBehaviors.TryBreakThrows(gameState, self.botCommands): + return + + # Do nothing if bot is countering + if BotBehaviors.DefendAndCounter(gameState, self.botCommands, self.gameplan): + return + + frameAdvantage = None + if gameState.IsBotBlocking(): + frameAdvantage = self.enemyCyclopedia.GetFrameAdvantage(gameState.GetOppMoveId()) + elif gameState.IsBotGettingHit(): + frameAdvantage = self.enemyCyclopedia.GetFrameAdvantage(gameState.GetOppMoveId(), isOnBlock=False) + else: + BotBehaviors.TechThrows(gameState, self.botCommands) + + try: + frameAdvantage = int(frameAdvantage) * -1 + except: + frameAdvantage = None + + if frameAdvantage != None: + if frameAdvantage >= 10: + if gameState.IsBotWhileStanding(): + punish = self.gameplan.GetMoveByFrame(ResponseTypes.ws_punishes, frameAdvantage) + else: + punish = self.gameplan.GetMoveByFrame(ResponseTypes.st_punishes, frameAdvantage) + if punish != None: + self.botCommands.AddCommand(punish) + else: + print("No Bot Cmd") + + + + diff --git a/BotPunisher.py b/BotPunisher.py index e2f55c6a..c382e103 100644 --- a/BotPunisher.py +++ b/BotPunisher.py @@ -34,12 +34,14 @@ def Update(self, gameState: TekkenGameState): if self.gameplan != None: BotBehaviors.Basic(gameState, self.botCommands) if self.botCommands.IsAvailable(): - BotBehaviors.BlockAllAttacks(gameState, self.botCommands) + BotBehaviors.DefendAllAttacks(gameState, self.botCommands) frameAdvantage = None if gameState.IsBotBlocking(): frameAdvantage = self.enemyCyclopedia.GetFrameAdvantage(gameState.GetOppMoveId()) elif gameState.IsBotGettingHit(): frameAdvantage = self.enemyCyclopedia.GetFrameAdvantage(gameState.GetOppMoveId(), isOnBlock=False) + else: + BotBehaviors.TechThrows(gameState, self.botCommands) try: frameAdvantage = int(frameAdvantage) * -1 diff --git a/CharacterData.py b/CharacterData.py index 6f7602c2..57d5456d 100644 --- a/CharacterData.py +++ b/CharacterData.py @@ -7,6 +7,16 @@ class ResponseTypes(Enum): st_punishes = 1 ws_punishes = 2 + pokes = 3 + wall_splats = 4 + whiff_punishes = 5 + throw_crushers = 6 + mid_crushers = 7 + low_parries = 8 + mixups = 9 + low_counters = 10 # Ie: Counter against lows + mid_counters = 11 # Counter against mids + high_counters = 12 # Counter against highs @@ -16,13 +26,14 @@ def __init__(self, json_data:dict): self.json_data = json_data #print(json_data["punishes"]) - self.AddDictIfExists(ResponseTypes.st_punishes) - self.AddDictIfExists(ResponseTypes.ws_punishes) - + for responseType in ResponseTypes: + self.AddDictIfExists(responseType) + def AddDictIfExists(self, tag_name:ResponseTypes): if tag_name.name in self.json_data: moves = {} for key in self.json_data[tag_name.name]: + print(str(key) + "::" + tag_name.name) moves[int(key)] = ParseMoveList(self.json_data[tag_name.name][key]) self.move_index[tag_name.name] = moves diff --git a/TekkenData/CharacterData/LuckyChloe.txt b/TekkenData/CharacterData/LuckyChloe.txt index 87cbe7c1..a3c2c936 100644 --- a/TekkenData/CharacterData/LuckyChloe.txt +++ b/TekkenData/CharacterData/LuckyChloe.txt @@ -4,38 +4,49 @@ "st_punishes": { "10":">, +1, >, +2, >", "12":">, +2, >, +2, >", + "15":">, d/f+2, >, 10, +4, >, 12, d/f+2, >, 10, +4, 14, +3, 20, +1, S!, wr[16]+2, >, +1+2, >", "95":">, d/f+2, >, 10, +4, >, 12, d/f+2, >, 10, +4, 14, +3, 20, +1, >, 24, ff[0]+3+4, >", "95":">, d/f+2, >, 10, +4, >, 12, d/f+2, >, 10, +4, 14, +3, 20, +1, >, 24, wr[16]+2, >, +1+2, >", - "95":">, u/f+3, >>, d/f+1, >>, d/f+1, >>, f+2, >, +1+2, >>>, 15, ff[0]+4, >>, +3+4, >>, +4, >", - "15":">, d/f+2, >, 10, +4, >, 12, d/f+2, >, 10, +4, 14, +3, 20, +1, S!, wr[16]+2, >, +1+2, >" + "95":">, u/f+3, >>, d/f+1, >>, d/f+1, >>, f+2, >, +1+2, >>>, 15, ff[0]+4, >>, +3+4, >>, +4, >" }, "ws_punishes": { "11":">, +4, >", "14":">, +1, >, +4, L!, d/f+1, >, b+4, >>, d/f+1, >>, f+2, >, +1+2, S!, wr[16]+2, >, +1+2, >" }, - "pokes": [ - "0, d/f+1" - ], + "pokes": { + "10": "1, +2", + "14": "d/f+1" + }, - "wall_splats": [ - ">, d/b+1+2, 6, +1+2, >" - ], + "wall_splats": { + "10":">, d/b+1+2, 6, +1+2, >" + }, "whiff_punishes": { - + }, - "throw_crushers": [ - "2, d+3, 2, +1" - ], - - "mid_crushers": [ - "0, d/b+4" - ], + "throw_crushers": { + "17": "2, d+3, 2, +1" + }, + + "high_counters": { + "13": "d+4" + }, + + "mid_counters": { + "13": "+4" + }, + + "low_counters": { + "6": "u+3", + "13": "+4", + "14": "d/f+1" + }, - "low_parries": [ - "0, d/f" - ], + "mid_crushers": { + "13": "0, d/b+4" + }, "mixups": { diff --git a/TekkenData/CharacterData/README.md b/TekkenData/CharacterData/README.md new file mode 100644 index 00000000..0a3b7f5f --- /dev/null +++ b/TekkenData/CharacterData/README.md @@ -0,0 +1,7 @@ +# How to setup + +**TLDR;** Read `NotationParser.py` while referencing from other characters. + +------------------------------------- + +**TODO** \ No newline at end of file diff --git a/TekkenGameState.py b/TekkenGameState.py index 85dd6c4f..173e9a48 100644 --- a/TekkenGameState.py +++ b/TekkenGameState.py @@ -347,7 +347,13 @@ def Bake(self): self.move_timer = d['PlayerDataAddress.move_timer'] self.recovery = d['PlayerDataAddress.recovery'] self.char_id = d['PlayerDataAddress.char_id'] - self.throw_flag = d['PlayerDataAddress.throw_flag'] + + if self.attack_type == AttackType.THROW: + print(str(self.attack_type) + "::"+str(self.char_id)) + + # TODO: This current Throw flag address seems to be not working + #self.throw_flag = d['PlayerDataAddress.throw_flag'] + self.rage_flag = d['PlayerDataAddress.rage_flag'] self.input_counter = d['PlayerDataAddress.input_counter'] self.input_direction = InputDirectionCodes(d['PlayerDataAddress.input_direction']) @@ -455,7 +461,9 @@ def IsAttackAntiair(self): return self.attack_type == AttackType.ANTIAIR_ONLY def IsAttackThrow(self): - return self.throw_flag == 1 + # TODO: Add back once throw_flag address is corrected + #return self.throw_flag == 1 + return self.attack_type == AttackType.THROW def IsAttackLow(self): return self.attack_type == AttackType.LOW @@ -793,6 +801,9 @@ def IsOppAttackLow(self): def IsOppAttacking(self): return self.stateLog[-1].opp.IsAttackStarting() + def IsOppPowerCrush(self): + return self.stateLog[-1].opp.IsPowerCrush() + def GetOppMoveInterruptedFrames(self): #only finds landing canceled moves? if len(self.stateLog) > 3: if self.stateLog[-1].opp.move_timer == 1: @@ -961,6 +972,9 @@ def GetOppMoveTimer(self): def IsBotAttackStarting(self): return (self.GetBotStartup() - self.GetBotMoveTimer()) > 0 + def IsOppAirborne(self): + return self.stateLog[-1].opp.IsAirborne() + def GetOppTimeUntilImpact(self): return self.GetOppStartup() - self.stateLog[-1].opp.move_timer + self.stateLog[-1].opp.GetActiveFrames() @@ -1014,6 +1028,10 @@ def IsBotStartedBeingJuggled(self): else: return False + def TestBotStuff(self): + return self.stateLog[-1].bot.IsInThrowing() + + def IsBotBeingThrown(self): return self.stateLog[-1].opp.IsInThrowing() @@ -1197,6 +1215,8 @@ def GetFrameData(self, defendingPlayer, attackingPlayer): return (defendingPlayer.recovery + attackingPlayer.startup) - attackingPlayer.recovery def GetBotCharId(self): + # TODO: Has tendency to fetch for wrong player + # Need some better way to verify if the char is the player or smth char_id = self.stateLog[-1].bot.char_id #if -1 < char_id < 50: print("Character: " + str(char_id)) diff --git a/_TekkenBotLauncher.py b/_TekkenBotLauncher.py index 78357257..5f8002ce 100644 --- a/_TekkenBotLauncher.py +++ b/_TekkenBotLauncher.py @@ -1,6 +1,7 @@ import math import random import time +from BotPassive import BotPassive from TekkenEncyclopedia import TekkenEncyclopedia from ArtificialKeyboard import ArtificalKeyboard @@ -66,7 +67,7 @@ def MashAccept(self): #Useful for Treasure Mode ArtificalKeyboard.ReleaseKey(GameInputter.Keys_P2.A) if __name__ == "__main__": - launcher = TekkenBotLauncher(BotRecorder, True) + launcher = TekkenBotLauncher(BotPassive, True) while(True): launcher.Update() time.sleep(.005) From 34c43df033770688ec471dce623199b8dc875a75 Mon Sep 17 00:00:00 2001 From: Triforium Date: Sat, 3 Sep 2022 15:41:02 +0800 Subject: [PATCH 81/85] bugfix with counters added testing for pokes and simple movement (cherry picked from commit d7d82f38d1f3a4f95224da64f9485b8d2c7ca8be) --- BasicCommands.py | 32 ++++++- BotData.py | 59 +++++++++--- BotPassive.py | 114 ++++++++++++++++++++++-- CharacterData.py | 11 +++ GameInputter.py | 5 +- TekkenData/CharacterData/LuckyChloe.txt | 18 ++-- TekkenGameState.py | 7 +- _TekkenBotLauncher.py | 3 +- 8 files changed, 218 insertions(+), 31 deletions(-) diff --git a/BasicCommands.py b/BasicCommands.py index 93941bc0..0d89127f 100644 --- a/BasicCommands.py +++ b/BasicCommands.py @@ -20,6 +20,16 @@ class UniversalCommands: [0, 0, 2, 12] )) + BACKDASH_FULL = list(zip( + [Command.TapBack, Command.TapBack], + [0, 2] + )) + + FORWARDDASH= list(zip( + [Command.TapForward, Command.TapForward], + [0, 2] + )) + FORWARDDASH_HALF = list(zip( [Command.TapForward, Command.TapForward, Command.TapBack], [0, 2, 5] @@ -36,8 +46,13 @@ class UniversalCommands: )) SIDESTEP_UP = list(zip( - [Command.TapUp, Command.TapBack], - [0, 16] + [Command.TapUp], + [0] + )) + + SIDESTEP_DOWN = list(zip( + [Command.TapDown], + [0] )) BLOCK_LONG = list(zip( @@ -134,9 +149,15 @@ def MashTech(self): def Backdash(self): self.AddCommand(UniversalCommands.BACKDASH) + def BackdashFull(self): + self.AddCommand(UniversalCommands.BACKDASH_FULL) + def ForwarddashSmall(self): self.AddCommand(UniversalCommands.FORWARDDASH_HALF) + def Fowarddash(self): + self.AddCommand(UniversalCommands.FORWARDDASH) + def SidestepRight(self): self.AddCommand(UniversalCommands.SIDESTEP_RIGHT) @@ -146,6 +167,9 @@ def SidestepLeft(self): def SidestepUp(self): self.AddCommand(UniversalCommands.SIDESTEP_UP) + def SidestepDown(self): + self.AddCommand(UniversalCommands.SIDESTEP_DOWN) + def BlockAndWait(self): self.AddCommand(UniversalCommands.BLOCK_LONG) @@ -182,6 +206,10 @@ def WalkForward(self, startup): self.commandBuffer = [] self.AddCommand([(Command.HoldForward, startup)]) + def WalkBackwards(self, startup): + self.commandBuffer = [] + self.AddCommand([(Command.HoldBack, startup)]) + def MashContinue(self): self.AddCommand(UniversalCommands.MASH_CONTINUE) diff --git a/BotData.py b/BotData.py index 647601a9..7958d7fe 100644 --- a/BotData.py +++ b/BotData.py @@ -1,11 +1,20 @@ +from dis import dis from xml.dom.minidom import CharacterData from TekkenGameState import TekkenGameState from BasicCommands import BotCommands from CharacterData import * +import random + class BotBehaviors: + # NOTE: Bot have trouble defending against attacks like Akuma's "hyaki zangeki". + # Likely due to the fact that the initial jump is counted as a mid/high attack. + # Causing the bot to continue defending mid/high when a low is executed after. + def Basic(gameState, botCommands): + if BotBehaviors.TryBreakThrows(gameState, botCommands): + return BotBehaviors.StopPressingButtonsAfterGettingHit(gameState, botCommands) BotBehaviors.GetUp(gameState, botCommands) BotBehaviors.TechCombos(gameState, botCommands) @@ -70,26 +79,57 @@ def DefendAndCounter(gameState: TekkenGameState, botCommands:BotCommands, gamepl If False, the bot is countering. """ + if gameState.IsBotAttackStarting(): + return False + if gameState.IsOppAttacking(): + # TODO: Poke on whiff oppAirborne = gameState.IsOppAirborne() - frames = gameState.GetOppTimeUntilImpact() + 1 - counter = BotBehaviors.CanCounter(frames, gameState, oppAirborne) + frames = gameState.GetOppTimeUntilImpact() + dist = gameState.GetDist() + + # Higher the number, the higher the chance AI chooses + # trying to counter + COUNTER_CHANCE = 90 + + # Dont counter if distance is too big (2.0) + if dist < 2000.0 and COUNTER_CHANCE >= random.randint(0, 100): + counter = BotBehaviors.CanCounter(frames - 2, gameState, oppAirborne) + else: + counter = False + + oppLowAtk = gameState.IsOppAttackLow() + oppMidAtk = gameState.IsOppAttackMid() + oppHighAtk = not oppLowAtk and not oppMidAtk if counter: counterCommand = None if oppAirborne: - counterCommand = gameplan.GetMoveByFrame(ResponseTypes.low_counters, frames) - elif gameState.IsOppAttackMid: - counterCommand = gameplan.GetMoveByFrame(ResponseTypes.mid_counters, frames) + counterCommand = gameplan.GetMoveByFrame(ResponseTypes.air_counters, frames - 1) + print("Get Counter for air :: " + str(counterCommand)) + elif oppLowAtk: + counterCommand = gameplan.GetMoveByFrame(ResponseTypes.low_counters, frames - 1) + print("Get Counter for low :: " + str(counterCommand)) + elif oppMidAtk: + counterCommand = gameplan.GetMoveByFrame(ResponseTypes.mid_counters, frames - 1) + print("Get Counter for Mid :: " + str(counterCommand)) else: - counterCommand = gameplan.GetMoveByFrame(ResponseTypes.high_counters, frames) + counterCommand = gameplan.GetMoveByFrame(ResponseTypes.high_counters, frames - 1) + print("Get Counter for High :: " + str(counterCommand)) if not counterCommand == None: - print("Countering") botCommands.AddCommand(counterCommand) return False - if gameState.IsOppAttackLow(): + # Out of 100, higher the number, higher the chance AI chooses to dodge + DODGE_CHANCE = 40 + dodgeChance = random.randint(1, 100) + + if DODGE_CHANCE > dodgeChance and oppHighAtk: + print("Dodging High") + botCommands.BlockLowFull(max(0, frames)) + return True + elif oppLowAtk: print("Blocking Low") botCommands.BlockLowFull(max(0, frames)) return True @@ -110,9 +150,6 @@ def CanCounter(frames: int, gameState: TekkenGameState, airborneOpp: bool): # Dont counter if we are currently blocking elif gameState.IsBotBlocking(): return False - # or already attacking - elif gameState.IsBotAttackStarting(): - return False # Counter if the attack is more than 10 frames elif frames > 10: diff --git a/BotPassive.py b/BotPassive.py index c0a2fb96..b86d9c7c 100644 --- a/BotPassive.py +++ b/BotPassive.py @@ -3,6 +3,7 @@ """ +import random from Bot import Bot from TekkenGameState import TekkenGameState from TekkenEncyclopedia import TekkenEncyclopedia @@ -17,6 +18,16 @@ def __init__(self, botCommands): self.gameplan = None self.enemyCyclopedia = TekkenEncyclopedia(False) + # To count how many updates have passed since we last did a random action + self.tick_till_next_rand = 0 + + # Prevent doing nothing as a random action for too long + self.last_rand_action_was_nth = False + + # True if we had to cover distance in order to get into poking range + # for the pervious action + self.last_asked_poke = False + def Update(self, gameState: TekkenGameState): @@ -34,12 +45,8 @@ def Update(self, gameState: TekkenGameState): if self.gameplan != None: BotBehaviors.Basic(gameState, self.botCommands) if self.botCommands.IsAvailable(): - - if BotBehaviors.TryBreakThrows(gameState, self.botCommands): - return - # Do nothing if bot is countering - if BotBehaviors.DefendAndCounter(gameState, self.botCommands, self.gameplan): + if not BotBehaviors.DefendAndCounter(gameState, self.botCommands, self.gameplan): return frameAdvantage = None @@ -63,9 +70,102 @@ def Update(self, gameState: TekkenGameState): punish = self.gameplan.GetMoveByFrame(ResponseTypes.st_punishes, frameAdvantage) if punish != None: self.botCommands.AddCommand(punish) + return + + # TODO: Make this better + # Sometimes interferes collides with countering/blocking + #self.TESTING_RandomAction(gameState) + + def TESTING_RandomAction(self, gameState: TekkenGameState): + self.tick_till_next_rand += 1 + # Do a random action after set updates calls + # NOTE: Not frames; Update calls + if self.tick_till_next_rand >= 32: + self.DoRandomAction(gameState) + + def DoRandomAction(self, gameState: TekkenGameState): + """ + Do a random action. + + Possible actions are: + - Poking (If within target distace) + - Dashing (Towards a set distance) + - Walking (Walking towards a set distance) + - Ducking + - Stepstep + - Nothing + """ + actionRNG = random.randint(1, 100) + # Anything generated above this number, the bot chooses to poke + POKE_CAP = 50 + DASH_CAP = 35 + DUCK_CAP = 20 + SIDESTEP_CAP = 10 + WALK_CAP = 5 + + TARGET_DISTANCE = 2000.0 # 2.00 + + # Ensure we dont do nothing for twice in a row + if self.last_rand_action_was_nth: + actionRNG += SIDESTEP_CAP + self.last_rand_action_was_nth = False + + # Try to poke if the last action was spent getting + # into range for pokes + if self.last_asked_poke: + actionRNG += POKE_CAP + + if actionRNG >= POKE_CAP: + # Not in range, dash towards + if TARGET_DISTANCE < gameState.GetDist(): + self.DashTowardsTargetDist(TARGET_DISTANCE, gameState) + self.last_asked_poke = not self.last_asked_poke else: - print("No Bot Cmd") - + self.RandomPoke() + self.last_asked_poke = False + elif actionRNG >= DASH_CAP: + self.DashTowardsTargetDist(TARGET_DISTANCE, gameState) + elif actionRNG >= DUCK_CAP: + # duck for a few frames + self.botCommands.BlockLowFull(random.randint(8, 12)) + elif actionRNG >= SIDESTEP_CAP: + # Pick between SS up or down + if (random.randint(0, 1) == 0): + self.botCommands.SidestepUp() + else: + self.botCommands.SidestepDown() + elif actionRNG >= WALK_CAP: + self.WalkTowardsTargetDist(TARGET_DISTANCE, gameState) + else: + self.last_rand_action_was_nth = True + + self.tick_till_next_rand = 0 + + def WalkTowardsTargetDist(self, target_dist: float, gameState: TekkenGameState): + """ + Walks a bit towards the target distance. + """ + + walkFrames = random.randint(8, 12) + + if target_dist > gameState.GetDist(): + self.botCommands.WalkBackwards(walkFrames) + else: + self.botCommands.WalkForward(walkFrames) + + def DashTowardsTargetDist(self, target_dist: float, gameState: TekkenGameState): + """ + Dash once towards the target distance. + """ + if target_dist > gameState.GetDist(): + self.botCommands.BackdashFull() + else: + self.botCommands.Fowarddash() + + def RandomPoke(self): + poke = self.gameplan.GetRandomMove(ResponseTypes.pokes) + if poke != None: + self.botCommands.AddCommand(poke) diff --git a/CharacterData.py b/CharacterData.py index 57d5456d..c984534e 100644 --- a/CharacterData.py +++ b/CharacterData.py @@ -1,5 +1,6 @@ import json import os +import random from NotationParser import ParseMoveList from enum import Enum @@ -17,6 +18,7 @@ class ResponseTypes(Enum): low_counters = 10 # Ie: Counter against lows mid_counters = 11 # Counter against mids high_counters = 12 # Counter against highs + air_counters = 13 # Counter against mid-air targets @@ -46,6 +48,15 @@ def GetMoveByFrame(self, tag_name:ResponseTypes, frames:int): return moves[punishKey] return None + def GetRandomMove(self, tag_name:ResponseTypes): + """ + Pick a random moveset based on the given reponse type + """ + if tag_name.name in self.move_index: + moves = self.move_index[tag_name.name] + return random.choice(list(moves.values())) + return None + def GetGameplan(char_id): directory = "TekkenData/CharacterData/" diff --git a/GameInputter.py b/GameInputter.py index 3bed39a1..c22174b2 100644 --- a/GameInputter.py +++ b/GameInputter.py @@ -114,8 +114,10 @@ def checkFacing(self): isBotOnLeft = self.isOnLeft if(self.wasOnLeft != isBotOnLeft): if isBotOnLeft: - self.SetControlsOnLeft() + print("Bot on Left") + self.SetControlsOnLeft() else: #bot is on the right + print("Bot on Right") self.SetControlsOnRight() self.Release() self.wasOnLeft = isBotOnLeft @@ -248,6 +250,7 @@ def HoldButton(self, button): def Update(self, isTekkenActiveWindow, isOnLeft): self.isTekkenActiveWindow = isTekkenActiveWindow self.isOnLeft = isOnLeft + print("Bot on: " + str(self.isOnLeft)) self.checkFacing() if isTekkenActiveWindow and not self.performedInitialKeyRelease: diff --git a/TekkenData/CharacterData/LuckyChloe.txt b/TekkenData/CharacterData/LuckyChloe.txt index a3c2c936..79e0f139 100644 --- a/TekkenData/CharacterData/LuckyChloe.txt +++ b/TekkenData/CharacterData/LuckyChloe.txt @@ -3,7 +3,6 @@ "char_id":"22", "st_punishes": { "10":">, +1, >, +2, >", - "12":">, +2, >, +2, >", "15":">, d/f+2, >, 10, +4, >, 12, d/f+2, >, 10, +4, 14, +3, 20, +1, S!, wr[16]+2, >, +1+2, >", "95":">, d/f+2, >, 10, +4, >, 12, d/f+2, >, 10, +4, 14, +3, 20, +1, >, 24, ff[0]+3+4, >", "95":">, d/f+2, >, 10, +4, >, 12, d/f+2, >, 10, +4, 14, +3, 20, +1, >, 24, wr[16]+2, >, +1+2, >", @@ -14,7 +13,9 @@ "14":">, +1, >, +4, L!, d/f+1, >, b+4, >>, d/f+1, >>, f+2, >, +1+2, S!, wr[16]+2, >, +1+2, >" }, "pokes": { - "10": "1, +2", + "10": "+1, >, +2", + "12": "+4", + "13": "d+4", "14": "d/f+1" }, @@ -30,18 +31,23 @@ "17": "2, d+3, 2, +1" }, + "air_counters:": { + "15": "u+3" + }, + "high_counters": { + "10": "d+1", "13": "d+4" }, "mid_counters": { - "13": "+4" + "14": "+4", + "15": "d/f+1" }, "low_counters": { - "6": "u+3", - "13": "+4", - "14": "d/f+1" + "13": "u+3", + "20": "f+4" }, "mid_crushers": { diff --git a/TekkenGameState.py b/TekkenGameState.py index 173e9a48..6453b086 100644 --- a/TekkenGameState.py +++ b/TekkenGameState.py @@ -264,6 +264,7 @@ def GetUpdatedState(self, rollback_frame = 0): if self.original_facing is None and best_frame_count > 0: self.original_facing = bot_facing > 0 + print("OG-Facing::" + str(self.original_facing)) if self.needReaquireGameState: print("Fight detected. Updating gamestate.") @@ -408,8 +409,6 @@ def Bake(self): self.use_opponents_movelist = d['use_opponent_movelist'] self.movelist_parser = d['movelist_parser'] - - try: self.character_name = CharacterCodes(d['PlayerDataAddress.char_id']).name except: @@ -1217,7 +1216,9 @@ def GetFrameData(self, defendingPlayer, attackingPlayer): def GetBotCharId(self): # TODO: Has tendency to fetch for wrong player # Need some better way to verify if the char is the player or smth - char_id = self.stateLog[-1].bot.char_id + # char_id = self.stateLog[-1].bot.char_id + + char_id = 22 #if -1 < char_id < 50: print("Character: " + str(char_id)) return char_id diff --git a/_TekkenBotLauncher.py b/_TekkenBotLauncher.py index 5f8002ce..86e3562d 100644 --- a/_TekkenBotLauncher.py +++ b/_TekkenBotLauncher.py @@ -1,6 +1,7 @@ import math import random import time +from xmlrpc.client import FastMarshaller from BotPassive import BotPassive from TekkenEncyclopedia import TekkenEncyclopedia from ArtificialKeyboard import ArtificalKeyboard @@ -70,4 +71,4 @@ def MashAccept(self): #Useful for Treasure Mode launcher = TekkenBotLauncher(BotPassive, True) while(True): launcher.Update() - time.sleep(.005) + time.sleep(.005) \ No newline at end of file From 134ca639ecc7354231e8bf4e70df6f7dc5b579c9 Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sat, 17 Dec 2022 01:50:48 +0100 Subject: [PATCH 82/85] don't force Lucky Chloe --- TekkenGameState.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TekkenGameState.py b/TekkenGameState.py index 6453b086..fd37f10c 100644 --- a/TekkenGameState.py +++ b/TekkenGameState.py @@ -1216,9 +1216,9 @@ def GetFrameData(self, defendingPlayer, attackingPlayer): def GetBotCharId(self): # TODO: Has tendency to fetch for wrong player # Need some better way to verify if the char is the player or smth - # char_id = self.stateLog[-1].bot.char_id + char_id = self.stateLog[-1].bot.char_id - char_id = 22 + # char_id = 22 #if -1 < char_id < 50: print("Character: " + str(char_id)) return char_id From fe93ca193a71ea3d9ccea34bd205507e09b4d58e Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sat, 17 Dec 2022 01:53:06 +0100 Subject: [PATCH 83/85] version bump --- VersionChecker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VersionChecker.py b/VersionChecker.py index 0df4836f..f234e074 100644 --- a/VersionChecker.py +++ b/VersionChecker.py @@ -2,12 +2,12 @@ #from multiprocessing import queues #pyinstaller workaround https://stackoverflow.com/questions/40768570/importerror-no-module-named-queue-while-running-my-app-freezed-with-cx-freeze import json -CURRENT_VERSION = 'v0.25.0' +CURRENT_VERSION = 'v0.26.0' def check_version(force_print=False): # if 'dev' in CURRENT_VERSION: - if 'v0.25.0' in CURRENT_VERSION: + if 'v0.26.0' in CURRENT_VERSION: print("Tekken Bot version check disabled.") # print("DEVELOPER NOTE: Remember to update VersionChecker.CURRENT_VERSION before publishing a release.") else: From 430d9a62ac8fadbd238952d75c0d9844b928980b Mon Sep 17 00:00:00 2001 From: WAZAAAAA Date: Sat, 17 Dec 2022 01:54:58 +0100 Subject: [PATCH 84/85] 2022-12-13 patch addresses 5.10 (by FimoX) Co-Authored-By: FimoX <21201911+FimoX@users.noreply.github.com> --- CE_TekkenBot.CT | 37 ++++++++++++++++++----------------- TekkenData/memory_address.ini | 16 +++++++-------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/CE_TekkenBot.CT b/CE_TekkenBot.CT index 564cd7a4..bc1529ac 100644 --- a/CE_TekkenBot.CT +++ b/CE_TekkenBot.CT @@ -444,11 +444,11 @@ 1 - 1131 + 4552 "OPPONENT_SIDE" 0 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+034D2520
    +
    "TekkenGame-Win64-Shipping.exe"+034D55A0
    78 8 @@ -456,7 +456,7 @@
    - 1129 + 4553 "OPPONENT_NAME" 0 String @@ -464,7 +464,7 @@ 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034D2520
    +
    "TekkenGame-Win64-Shipping.exe"+034D55A0
    11c 8 @@ -472,7 +472,7 @@
    - 1127 + 4554 "p1_movelist" 0 String @@ -480,13 +480,13 @@ 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034E8770
    +
    "TekkenGame-Win64-Shipping.exe"+034EBCF0
    2E8
    - 4448 + 4555 "p2_movelist" 0 String @@ -494,7 +494,7 @@ 0 0 1 -
    "TekkenGame-Win64-Shipping.exe"+034EBDE0
    +
    "TekkenGame-Win64-Shipping.exe"+034EF360
    2E8 @@ -508,28 +508,29 @@ 1 - 4521 - "FrameCounter" + 4582 + "FrameCount" 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+34CA460
    +
    "TekkenGame-Win64-Shipping.exe"+34CD78C
    - 19 + 4568 "Distance" Float -
    "TekkenGame-Win64-Shipping.exe"+34E79A0
    +
    "TekkenGame-Win64-Shipping.exe"+34EAF20
    - 17 + 4585 "P1_MoveID" + 0 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+34E75A0
    +
    "TekkenGame-Win64-Shipping.exe"+34EAB20
    - 18 + 4583 "P2_MoveID" 4 Bytes -
    "TekkenGame-Win64-Shipping.exe"+34EAC10
    +
    "TekkenGame-Win64-Shipping.exe"+34EE190
    4492 @@ -600,7 +601,7 @@ player_data_pointer_offset -
    03500238
    +
    035037B8
    How to update addresses after a patch: https://github.com/WAZAAAAA0/TekkenBot/wiki/How-to-update-addresses diff --git a/TekkenData/memory_address.ini b/TekkenData/memory_address.ini index 5eeefc4d..5d14fa28 100644 --- a/TekkenData/memory_address.ini +++ b/TekkenData/memory_address.ini @@ -1,16 +1,16 @@ -;2022-08-17 patch addresses (5.00 ping indicator update, timestamp 1660723367, date from https://steamdb.info/app/389730/history/) +;2022-12-13 patch addresses (5.10 streaming mode update, timestamp 1670918536, date from https://steamdb.info/app/389730/history/) ;IGNORABLE means that all the addresses contained within the blocks are useless and can be left untouched because the bot would still work correctly after a patch regardless. The bot keeps working even if they are set to 0x0 (except movelist_size and expected_module_address). It won't work if they are removed though. [MemoryAddressOffsets] -player_data_pointer_offset = 0x03500238 0x8 +player_data_pointer_offset = 0x035037B8 0x8 p2_data_offset = 0x7840 rollback_frame_offset = 0x1E710 ;----IGNORABLE START---- ;player_data_second_pointer_offset = 0 p2_end_block_offset = 0xD0 movelist_size = 2000000 -expected_module_address = 0x140000000 ;Might not have to be configurable +expected_module_address = 0x7ff6eaf30000 ;Might not have to be configurable ;----IGNORABLE END---- @@ -58,7 +58,7 @@ input_attack = 0x1a5c input_direction = 0xDDC attack_startup = 0x7780 attack_startup_end = 0x7784 -char_id = 0xDC ;semi-ignorable, for a fork, full list of character ID's can be found inside MoveInfoEnums.py +char_id = 0xDC ;for PunisherBot, full list of character ID's can be found inside MoveInfoEnums.py ;----IGNORABLE START---- distance = 0x1450 ;semi-ignorable, for a fork current_side = 0x123C ;semi-ignorable, for a fork @@ -88,10 +88,10 @@ juggle_height = 0x11D8 ;Outdated ;NotUsed [NonPlayerDataAddresses] -P1_Movelist = 0x034E8770 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A -P2_Movelist = 0x034EBDE0 0x2E8 -OPPONENT_NAME = 0x034D2520 0x0 0x8 0x11C ;NOT_LOGGED_IN default value -OPPONENT_SIDE = 0x034D2520 0x0 0x8 0x78 ;1 = if you, the player, picked left side +P1_Movelist = 0x034EBCF0 0x2E8 ;You can find this via the character name in square brackets: ex: [KAZUYA] or [HEIHACHI]. If the address is wrong, the "comm (input command)" column will show as N/A +P2_Movelist = 0x034EF360 0x2E8 +OPPONENT_NAME = 0x034D55A0 0x0 0x8 0x11C ;NOT_LOGGED_IN default value +OPPONENT_SIDE = 0x034D55A0 0x0 0x8 0x78 ;1 = if you, the player, picked left side ;----IGNORABLE START---- P1_CHAR_SELECT = 0x033B4E68 0x80 0x3CC ;Alisa 19, Claudio 20 P2_CHAR_SELECT = 0x033B4E68 0x80 0x584 From cdf28ab6cbb7cf5032496b69140eb10b06df1b2c Mon Sep 17 00:00:00 2001 From: egdose <57728907+egdose@users.noreply.github.com> Date: Fri, 30 Jun 2023 10:40:06 +0500 Subject: [PATCH 85/85] fixed missing module import for sys Imported sys module to enable the code for direct execution using python --- GUI_TekkenBotPrime.py | 1 + 1 file changed, 1 insertion(+) diff --git a/GUI_TekkenBotPrime.py b/GUI_TekkenBotPrime.py index b3e532b1..7fd91660 100644 --- a/GUI_TekkenBotPrime.py +++ b/GUI_TekkenBotPrime.py @@ -13,6 +13,7 @@ from enum import Enum import VersionChecker import webbrowser +import sys class GUI_TekkenBotPrime(Tk): def __init__(self):

UHeNPX#Lr=aVXNT{j(r~TaI@k;Hw5mQ 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 zρ_K{RHJ|Um2Grn7Fc2>@EMTkeYxM@ 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

GJH~@cPw9-SF#qu{9>Es|?DeMF_Su^=!Ww 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%0DSV?z7^hePGjsE8+k*8}|lE$2kUq}ViKilXHl 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