From bf0ecc50c6e3ebb53796409a59f3eb3e6288d9d1 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 26 Nov 2019 13:49:43 +0000 Subject: [PATCH 001/243] Update dependencies from https://github.com/aspnet/AspNetCore build 20191125.10 (#650) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha1.19575.10 --- NuGet.config | 2 +- eng/Version.Details.xml | 6 +++--- eng/Versions.props | 7 +------ 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/NuGet.config b/NuGet.config index 1832c0de6e..04240c3996 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,4 +1,4 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1ba3dcf09c..9fa8c13938 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/core-setup c77948d92a2f950140f09384f057cb893ec3955a - - https://github.com/aspnet/aspnetcore - 6f2b107b88cfbc7d4293103a74162f9075257ce9 + + https://github.com/aspnet/AspNetCore + b81c1a7954445cb202e1d85d09cee09ffe18dc37 diff --git a/eng/Versions.props b/eng/Versions.props index 0a5b4f1ee9..baa575710e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -7,7 +7,7 @@ true true 5.0.0-alpha.1.19564.1 - 5.0.0-alpha1.19572.4 + 5.0.0-alpha1.19575.10 @@ -28,16 +28,11 @@ 0.2.0-alpha.19254.1 0.2.0-alpha.19254.1 4.5.3 - 2.4.1 2.0.3 - 5.0.0-beta.19562.5 - 10.0.18362 - - $(RestoreSources); From 51d3b880d2b8bc63a71a7b71c61ba7f096ecaaf5 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Tue, 26 Nov 2019 16:00:30 -0800 Subject: [PATCH 002/243] Add documentation on EventCounters (#605) * Adding some initial EventCounters documentation * Add more stuff about incrementingeventcounter * Add pictures * Add more description about how to write your own counter * Add out-of-proc consumption, more samples * formatting * more formatting * Add section about concurrency * cleanup, formatting * format * Address PR feedback --- documentation/design-docs/EventCounters.jpg | Bin 0 -> 145629 bytes documentation/design-docs/eventcounters.md | 326 ++++++++++++++++++++ 2 files changed, 326 insertions(+) create mode 100644 documentation/design-docs/EventCounters.jpg create mode 100644 documentation/design-docs/eventcounters.md diff --git a/documentation/design-docs/EventCounters.jpg b/documentation/design-docs/EventCounters.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd53df33b21ebcee0de8021ea3b9b4eeccae845a GIT binary patch literal 145629 zcmeFa2|Uzqzdt;pB%-n}nTqWD9>Y|!C0oU0on$A3?8B7GzJySOWGyk-cVibSA^SRG z$!>;>(JY>CzyE#ibI!e-`#k44=e+*sIfk!!y~br+*EOI0dVk*EgRz4-(5dU%dfFfw z8XC}Z;0tsx3DN}79y#*+8+gzG-$#!hJxWJ+^aMTqvExi9n3xz(FfyKGK6C0M^J!*A z##0=pPP4MHv$Hd?aB^|5ah+jfXZ!soG_=6q&>dwsdX$0fB;!f8|JRR$7SQSAw7v8J zv@{n$M^4kwo~AkI0D(aunxnvMe^2;N51J#u9FNf-XE?zK45&H@U`J8d%p6Iyzc9`rqrKIpPmow5REgo|ip#=86fu ztrzPBxyQ%Zt|sP`wK53E-^8)s^By?CA*g`4i2uE`KUVhdTUgkCXk~w1*gvmp0>ng1 z1AKV2r$JEA{>^BSH%AVy!#y~ZfkPQMlz~GTIFx}y890=ILmBu_kpb~R1$bB*>R!!^ z!1oP^xRVfvKv3V3{3)&@`7fljHyJ&S8uiW8;#GRNRNlc-P&NL`si*}%%!7bf``6A_ z3A1l)N|u}N?*xet7ZA^+Ka1Ta`gHOjBc<*x=?4%{bh5PG4WN!#(Ae2PE|g?#P3lPC z`E=!Q=ds-G3n>nFA6%i&IhM;9-##x@bbZ6)!w_89(MDRjV=mA-z+B(y;n04;z*#mE z>mONcW>x5CzWQk9X}2SltTs_ZF93={OqyZ^ak4n#MVYx-A_@W?a*f>9_#W=Qtlp6DqVx|432Ac5i?YpmQ{DV9En?PU2^Uo8=J+&d9yhz zG%6SlshiP84#>dq@yf>RY@Zizqj%llVf9V~{*;WTj*hR%J8iHmUc+Wl53g zxc1jUrr5IYGS{UVOTJXcQS}m^w%n8bdi|+qU-P?Acm7*iK`gP&r}{BX^dx`7;S$B^ zvwjh^kDi@N6Mar|x0jdpd`0pQD1B$OQAsRbj(_lJDate3G3(tc?8g+`ErRd7liRP- zl@gwxCq&-Xf0cO~Edn~c{>SYBZ7~t{b~4}z_E?-lK$b&=?jR(9PNT!=#1%UBix6G!r)m~#UP8^u)%RWhL`?Y)T)z7tkjc;j3^-Kg(CAsg@G(7O;Os?VI z-5K&S?+7U*llDRao7Ms+W(8J6-}PNgD_^-aQ{w^mqr%Xi7a`(UQL-pj{G`Q{XVQp4 zr`)k!0p_}M^J2PRRld4aQ*so>K7^iomFpxO=)$&rOn@eQ8K<%mIf@smLq{|pYrxN- z+4E#;%i~hEq-Z8CBtYio$Q?)6?(VEJ@Iv_-wdf-uArGqO_ks}jJ~bPC?fnc7J0|lP z*6jBKGGNkX-UM~RYoA&A>F!;)(@^tS^j*79@kS`OAtdXahGVmt0r|;@<6^!wD)Q&Xjg|w@T{o>7)_B-w76EpR2&UuxHeTPb`sysk-;hq|Q{6@5UmPSx z-^uByZiF=3GbR-#_GY1Np2AXexJ4btE(IF}-3kj@rEI{mv#~+DAC2Rk;u6aD>=>#F zVx|X5V|pmvM)|JI^vM{r3Lp1exDKYW!L+WzNyDw@<;Rx&!q}GwpvaJ+Zd7!@#9n*N z#D|*!j&1XXA5T3CD7}*^=W)MAYU(a3bXvR)*VI@8t(c9z$u$Gx#Pq&R@_Sd~2=N1* z2>~f~5S2S8vfHQiN!Pzl2q&$M=NeUYb@Ir~OVkQL73`f<=AuU>+v{07zP`v8)pi$L zTBnR{H8=Y$JEY$;yTIk@YsaN+Y|wMXI(Tr>9fJD4v^IutDN+ujo(_QP4(_!m78!h* zTD|N-bInQf@h2fI?yr7tZap{fp^6d5O9L9N)DL<}J|u3GDs4FnJXe{(gfn=n7HwEV zBOeBao+tC+W^xNUc4n8?2s#xtcH->3cAhCPwPxK}KHEFHb0f9ADHkCM_{#4B{qNCo zXz@i)Ekf*r+wZiwitdVC>Kk9)545gJle@mPo+WM5?p355gLbM(+6u_fY>4N2rQ7j{ zP3u$l&m=){si8tOu~L@+{3!I)rL|JbHgF2*N~C31ZMCrv7ki=BVOPZF@&(SzAPz3 za_pDi(ESpZQ5N?B+K9Y9*M|9_$sO}fd*_AK{nzP+c+0IC14x1!t;J^(aoJt<%Cn!}&3#cK zwSpNTmKx3d1(vJEl^lL)7gIGw^_xFASb@jHwf?n zC=rZRraXzDMrRdrYMy@9I)W0N$k)5lY@OD`wKBZYw72f^q{9{;Fu@hjo}Qxe<)WnJ zo`ZOEjCDzkcS5ufF+?a$Cdru*Z zxUP|z$xd3<4vbZoL_TnC9A8q0`(wgP8`K z877J^Bt5tUVICewAO<`h0&366Szh={DTmKn^Bg@`OiV60*5jzp<1FqF*Hzm^CIbjd zb$aZJ{7}yz19J-sdsVr7VboJxl@E(8y-ID@RB@{4j#}-m`*KDdGz!9)<3?qv#lxR; zPAQEHvegfH+^*0DS*1X-Xqde_Y@>QNCe7g|L;0^@mv<$NOzYCSuMF8aWjPzCd9#(B z@Jrl&oZJd2>i&{AL{=LT#?7|%^Sah2sb`i@-h|D5j%&Xp`_YV+ubBJ!F+ShrV=h^s z3gj6CJKizw9%5QsEu~&&XM_!0(n+6qc(ZD~lF^h1!=lv;s;U}r(^H9M5ynj~_MO|G zGdno^$YPe0qoIr5=0U$*4vL6GrS=WNajO$0T9e|e81KJNjbjonD$0Gv~2_236X#lZ30EO|QsLDEI`PokB zFQF`%15oS9(E||g8y4u>CR!@@7B-v0YQ%+{3tu|`#Q_G9X%BBijVg?V;xv5^KwZnU z{mZD!2cYm^V&MVk+E5pmc)tDsH2)CUu1>yn0D9{(&q6*mjl|c3c77es@Nf_R6Xo!R zcPP)l6701t4Hn{_A>A}lpu;aGP{>^fBfFpPUBfYC{`p%!Ypd961#eL^u(9(IF_E{A zfSl|9u4@Y+jYoAfvkxV8U6S0|urq$1zwQuwUA`^FLC_~&uLZ<(Vy>vvN}D5GivMdP zTiUD9@XpcJ{t4S9EIHu{p0it;jTrXbvZTY}HnQvCqVx1V9bz$t$&RS|)zHT#M2qbs z@j938wsBbWHoq`;WS4&SX=UN1AeL|qWnx0xFNo^>tAm8&0a2*a;{(Cx&PVjBITac{ zqS3iUtiYc1Y_AVbDC%QhhYd<38C^Ji!CmBP!5}+q&n~V>pTD5CS3J|yM(h_4C(Hy)I;Tk|eK} z?DHj;+{_a&G+b2+w4SD(w`PfgxQAfl#I=St-`2#R6#`#4_Uw+l)OV}uI|~^48~&w1 z(HF0?zIM9kf3~r-WS>s_b|J&9nDSJrpFg>+9(33t2_;^{+!8 z#hyB8KXC0qrRcz~#=9?+swx?5C##4)3F#RE@>TAiv zHb!w@P^!}_TrTL$<(~O`UmJ-Eq9sYdydB!fc>sF4gSFK8aRo=xt26PuH^rv3W72tstB&gfGoBd}T{uRPe^TdpW6RXayt z;o`Ttyf>GmyIXo;kI+tB3ms3JXNdJlv)KKTF6rsGD@$d^XW4`xF#c)C>gWRg1Tc z>1$Tt)qCC3JX*oXm}ZIRMdw0_Zzaun%MM;`*)1jM0U1FC`C+`u23hO9vxZukp+*nZ z{m95ehs_Um*SuLsZWB8GCn` z(E;gO3fYfBxrnW9ia%PxQ9L>w3?@t^n7(fhr(M{NSf0{z65 zu86BdyHZpKID9*{r^vEkvPqKE8B9MD7amHG34qw!(|#&?8x0cqTUUuR(@L3}hQMIu z{;Lt*;@UTUv5#8K+mhs1R1^mT`V4T6vA*h11NXqHVDt2&Zn+FK5~!-430gavvaRU( zchPaG1G$cqqgv%nRcbC6hnum*JA$d{P17iQF9jH^6xqf?NmC|3$%5bssB{WpOQ46; z?zhoMnVLU~*RDGN9fuOEX2%XdxaUY`ax-kQF+q6icQ=M68bDRe_pL-nM4 z@%HGB)Ex~Q&l#<8c*x#B;0iJK#oPKOAL=ROdL6p#0E9V59oR>pY6AIUU*DMk*o{_fa4fC6HuL`xG+Dd?> zmA5Xeqnb&}jX%jIy(ZQ+|7emtKgj0}K;u40JHR+!q2zAw!#%bk*^SB`ll{|QWoOxR z*uV6V>ckt|t0&NsNSRcYw2Zw(KiF)@Pn)1nkwuYGloc>JFiFaD9ZA%MR))gGH)eE_ z_rfh3=hlz)4LZ&gY?;L|ZN1$Y!t01?`3C(XF>(7xOXPzo zOK&ceZd6aYlB>vVhsy9bHU3Z;4wd21GyKW@9V)}2G8`(yp)wqXNrySZzfOz}J;R}A zIP?sMp5f3l9D0UB&u~~xI;1h$p3agf$| z2tdO;e4hOoIevS@&u5kMfyG4o#m>*0Wm-(v&8Nra#2)tuK9{}Bt8o-3Rf8ArO!tp~ zsNee)UJ@dl#wPmBU!wbM5%3>07=jv+9K27f=y~hngx5~+_2J-#zppJ z>ik27pXQ#l>yHY=doA{pu96KS2$yh7vrG_yU|xg`p8ah$$67TiZNS~0Ce7$^_jKZm zu=PuzSpM6EEebS>i;G>kf$Gy!+t$`b0{Rj=m;4jQ7GJ&G))P!Jvih#@C-^)2Dgd`d zI-sMFm1jF5T4#8(=JlTltywi*m^7?1W^hcx{DBR-_)!&x(!==^?i0B_hh9J!HWSOR zA}n7pvk|9{mNBbL3gt+#k6!9erDb~fh9#-kuARz+r;o9hT@K>N|4_ect?^aw6ZsU+ zuRGL98#dgj?PgX42q*pY1o_=NV%R0cjVn5PsVYE5Nwe!4k?Km|y|gv6LQ9nCHl=t0WrD$K~_8TK}8`*w`{CiN(??ESGwy0`4hi`SbSBJuI zs5pm~0W@C;iXa#fXD&gHQP0sFfbRWagFj?y5<-c&dE&fV;WJX@jD5UuCsrXLK4;w$ zCi>-qtveIFZp(Q}N)}0jS;DAm?=Q)SWLcAJJ#!VIQf- z@3c2FQ}ROjSHY~!rzepPt30j@h+A`KCJP38*1X)hw}_p%F)LnX#(b(Uop$ zFLoq1rER0NdbrIJuW<9lv$#Uc?U-L-OB}zBLmGmE$KS?z8?xKqJ!T~QcqV~itoE<+Co@+y0DY3u=L*%zfKl6N1K9ZrB|9)MWE8>p&%HC_rVvBGcN zZp$lnsqQ+atvhWZxWvXNwAoFoaM$Nsmwv`Lsb@mmBg+VenqCHCU4Q-n6D>B-?+aFg zkRQH}c9MP?wAG#IaolP6g3|z*y>RNNtxFQ9OBbQ%(2EGWQr$_GS5`V31oD03d#XxH&{Nz&mzheuN9n&Si%a(71##cc{dk zn9ih>k)TJQ_Eh}wIHMrYesKp6H5XgrV?5#;GhTHTW}LZMijv}en0$TRJTt*tPpIgR zrVVSIc5t|jAhC14M7WKgb;y3$clxF+8wVao@8|Ck9WD2{`w@-MBRPaJrpdBPbvHgL z$7R%_85JTDHq!M~DAnclPg9c~#oavQ(NMO~ZURSrLKo2H`0NS(%KXj-mD_pmx}*YO zF6aBEaaPE^8>EO^iFTc{YzR>j^YR{*mIy7H42Z#g=`e7^dPbR?v;U~h-*@BF{$+^5 zv>u;Ng7kcFUtgT|c5p-8LVbOfcB=W3_m)6epS6wEoLZ78FH;`o`^NHvEuu zNmu}P*{!0S@{%g+s-I!>l&VtC|B>j8KLEXWNVD_;_8zci|Bg79X7Tpn(8C@0-?Rg| zNPD0GcRm^Ci3NcP;qRHgAJkl)KcNm*B0IMZvhopB!vI34Di5W`mG( zg)>4pYO?QKe=I>74{iCCf*va^U7Dnn&=SGv(Qn zjn?*@smeS6)zYseRZQvnrUEIVranyHM_P^j7qP1-ElUWTF8~Ct!>vK(QQ@ALnpo4`LoxQh;dJ*0sR@EuGDnreF zdt+nEFUyyqx@YX7k<=lnK$ z6N3AT8U7DqN1DZLJ%X5Ee@f>Bc)~`$pUtma`>(WmEn)`s@K4pd9j-o%w&GDWB%YPuQEk>dgNu+5k`><#2|7up1oiAyxTM z4*$$y@!z5;)}=W(9jsI$LprHNL!>;C>6Mg%+sn}%Q7b!f?N0OS<*(TV=y*Wxf38&j zHP^{mIAJl3EQVf3s!@fYlW@0fKjmL20mqH8?wNUjz$In)0OVngY%8XA@1U`Elqv#R z*be!ATghWOHe^%w^{A+o%AIYJk#BL&*60`KN@{5kSC3CHG*C^;eW+)3m(+A5TBLNo z|DPxn)X@Z=;R{4K1|2oaEp_@1k@u=k!Tuw5)s%51LS6s;3a3@^odPV@^4&tZ3%^U= zy)D65^H)(lf?0X#r0n^nJOn-I2+_yj>3ThWD`u(T)d2|YV#nW-HFu+T7+3N~*S1mN znAK{{$cUNQ_VkR^r;n|kM>vzrxgNcLe@QS2L|f{%j*3k0M6I92HN(T3IUAyl;`v3& z&G4yc*SY2=Zs(Zl9U2lE1VoSN@cnFEJYi4m4N^~A-@~EclzfPu8`B;EB@{JxR&_y~ zvB~^AapBu+!G7mp!YhD z^AG<~J2=-ZT{WU~~ z+-Z@@p~6^B77()4FPgctV??J`*h(ab8X`RI+tV3SIiO<>ciMt zLYiVW1%$bPX6=H1XPv)@WuppXM8hJEQEp*5LcEOXP0x-LNVfUTh75Fk`6zFXOP~so z3-o4+mjdnDI%wxiuWOoE#jh!@?{BKPU+5b7B5?C~+rAg=Y?z+FNNvXKB+GmW$q^o_ zp#spt-0&q8p?}h|FR&TY|ISzbamoFU-qpjQhdc1UXa_D+J~S)GBQf6p+@?O7Vse>( zHa~Q77W~kKeS<1REWi5ZF`>jz|M918Jx1D*h8QSO6xP)jDNuzs-HHf3@3N{yN$9jW zTUi&ER$q2a`y8p-Z82Jec8!g=OHx7H_7uQ!w!CX(3|3|V&dk0~oaR>Vj2({z1+E&3 z*AO*H&{Yj?d{uUb(YOwlnt-Q=4f)6uVJ7tYBNuDB9K!U?buA-5(aAE^&7stEi8lXc zBX?*50ztHMDI$7LViUq2GWIi#+4K{PP7`kujz!P6rx(cK%4O)TE^Nk?g&psr72#*F z?r#ATMfai_p?T8*^7HC3WFwqLz9&JvxUTvDa z77IKQ&ZIa@e2kkgNkc#O3e2ww@U-RYYKI1c_*uBQLEAk4g8WCZ@jsNnZ4oH+EiJ-1C_qznGg3h4UwPJl^05CSo)I!VUUFJz6v{ufnw&ZV z5axlH3trg_lVpG#&=ZFD?3nf*QTrl}S&GtVPTc_~1rP7LU(i^(dVJ61GBdt9cMdvM zcxC7ZzB9Q)(TT_Ylc;=dvX0sl3F$RCP#IPzaos2uLnzv7rVl#u_$deoCk9nU`dQ!T%? zn%Fw8cUJeVv|>X{-u$qG<4yHQ)EkYn)F};qBF5hxlRY7h8#panK6LH0{-3kWZ z!c=2lgKZcv#RE_$FuNWeP0+w2pX_Rr%+R=I=c-I*thNw*y)Q!47bHv+xQikd@iD1lnUkp}XdcviwgG$~4ef~)$2S_KeTxGFT2A`=)J0xey%CxjVKd7$ zItIqw6p~$=Jt7(LtBMHAy$+oTl+vSKZHB%%QV$KM9vRjU4FIx;nNtG-XIASMe=2cc znwMSpq?Ue~yiOiF;`SN^Snj)H7-Ar}(QNYk4C!{x=y6rZvnJ`O>nZdC)G>ua>r%d!Yi{D=fgW2@_IK{qJZ9{Xh`nrT%9o@E zq8U}7`9_u{I$(`rZBz#l=P~L^1~BVkq0?79!61JpzvZG_iO&I`Gj6M%oWKcj;ksJx zERki7n(L00j!{0Xh>B{ycno&&d~HM$d3WpCHdztZG<6g4 z0I!u)6I(@s9sS8`4ssZhoC+D|)|FHFQNSW{3%d$R-`<`#Y0TQ(43sJ@Ow3OWeBJPA z-TU+BK*1zE;Zj$g|KeM1HSx~DHfZLJ#z(vKu+qm?9S6>NZ1@RO z^yo7(53v)Ad~^Uh^%Knz5$a3qnV1yUbS-xIb7#X6S_N3(zb(HHNY#` zJXGGxk_h=?1A@EHmDo*Bmeqix7!|&23!9olOJ|kE9#G}jx?o5WZ zAAl+sKO-gDq?xbsQX;;8oX4{-Dz4VU$uF}v)DJ-3Xlmw35aMr{tpCc_=mDc+Fe2}U zKD%N05{$8_kcATl_3stpdOoBB)w8hs2cS>G_#tY~Z#-kJq?_2^Qp&!77e2${6KbeliW5!4FOD|>B9Z#1}@T+ z-KEl-wGYY`30Z5fda^Kicx~@D>#=or)<1C@x&j3mJ@kSr z5g_@q&$tS}CDTl|kA@%tY>W`Vq+L7*rzE*E9)Ps1VV{7*|KW*tWE;TR6y{D09RVlp zVU^=Nq#ctBNNUHQ>Vs=pPmS-QUbwB!P8@(7BS;#def-=}FSR@|yqQjYlaF`^Yo8tI z)%A=F+e-sL``3S)_T~o4i=V;L<69UTH0gRk(g^p~hK&Jhi>mJ@GtQujcPxI!yYbWB zKHsV_&wIs}kpB(~K8^NdiR3ZZ>u?vqAfGx+&lx=xK@`l8hky%j(t%hz*Je2qd;{ z=)_3a0*vM##wUf-JUxRIOiK0IKE#507I10<7&R_mD7*8Bzvz{V#-EW8%`)WVcyMBDUW2U)ef1C8*=*a9H6(yx}ifskRx z8x<4U;9floO-u&pIK6)SGt~O83)uhHl6MD{rX7HUgh@uoDS)Q3P}9cLra1oq)DuM= zn%xsW0IhucM&I&JiugC5VehGZ$Rhy%TE2!_fD@*hFiRH5o`eHR8Kg=U1t)365jwjWny=fJlq?qojm4a z=Y>l^-j)B!ET_Ni2Hp5?yD?t~*bRTcZdi<%{;K*7 z5sJvUyxDC<1YqRK4RVmneed^=G@}6%myG;0jFSe8_A|g}OBFAi0Ew@nCWrPo;1wb7 z4?xB6C%@?0DL<5tqEisXaMRFP_>KphppCc$V6xa~wo8CB7ch+4TGo!+hDK-emCnQ9 z5jOmG`TNl)4nVFm$?h(%@sD50&pvlsREvr7C`@w63oJ;CX-txJbQBg$3QBTYZL&pU z0DiYtB{I~Fr6(BA+f~C^p*Iwg`Sj|=geiu|`@cqe75;!_{S!RvFP~xgp`Ysw;+sf% z2$3O0HSrJ~gC@L3vb(R7|Cv4}y!yg*e7(&1lo!u$$DYzvT&h|{m-~}5m0QsyzMq~H zsqjY{2O!Ejs4FTATmkR)WJRa|$DG%RNGx<64mhHY{&j*XihDi7Gzt;pZD7H%iA9wL^^4W z&40NDy=47{cHUxH8pyJW4RG!eF{Nbr4;Dm2s-3$N%D`6a&Qves6F#4mv2~`Kh&Rck zYU&CqAL`jZK5vfe-xx*_;hJT&jkWlt!ehlb-9Em@*6Ms29<1_;m7yk2c3c;nxcW9p zcYm@9kfKszq5c5GA2&Le_1Kp%&57|3cmH_+Qe9Hw3=6y$dH)rztcMzRH2De7<9c(N zOZ&#O^PY5Mbv&%2#LQa0O@n&`V){;#p)RTa+Q-yw`$)NW&+}Y6M4YZPaP`qlnaq0v z#QsFL_nid+4ehGk&wNF5IAzDz{LYMj#&bBFp-a4-A`!1_$9+?chZ051!6gu)C>d0~ z08Wh4dI{#NhNM_qk94EvyzatK(!A;SmkQqDHBE`tn`7l1`#2tvfyDD-Q-vJ~Pmx^B zkkC%(8CyyLM4)hmUln)u1@#=RJ2p4zt6NOowWQ!k9`Q>@bY48VYIMBqPIjNu6CY5h z@i?#&v;4Wq0}!W0fYY6NT;|iZi5;8pHdtBpix)>O2{V>)y|UZaqu-06U@Yp>TEUU^ z(ob%6PDB8J2wRMDIB&{m=|i`d>lUKdBlB3x>BJU?+?-C-N?7+{z0 zkj_7WreWtC`cry-BUVCR(Vdlz%rIWxYlb1qutF<8O7t06Pc& z2w&g9J?WYeCc-@NHQmTFKil7>j?Sp8-*>m*b(s*1zV?dteELz?c1*LAr<|fVdjM=h zkEBoLBJSf*I#1f*bPs{7m#Q(e`*z9wgqoL=M*24y-$bmgey`(pq}j7-F43k4puGK+~uN=IJR$&zvt4cES3?znn*VzTG8SBf-f<(9lABh*^YXFHupL|$U z1?3E&?c`@4a(rp26Iil5s`Q{S-~6fVg4WUK+|0VKY*}5+KPj)tCi&EMfRVa3RNc8= zBfAtpt}azRjMLaME_b<5@mT8OE%)=Rxq({uJshU_2M6_z)R%W~0di0dC$mLh3lo~v z1MFJC990=e{s7i4R%F|y;JhhkzjGW79kNOSx=*BEek!MzDiBUvaGZR^@<<_5h-5Q- z|K}IE-g%SnC`WxaOEuke^TL!dG404VsgCzR#&UWfQ#2dV$O@;?Y`DCC$B`i0u?s#!qV~_E>~^Y_L_} zDJv_BsqSOe(;2qJf85TX5H*$-HqAq1~2b`8z6 z#?j1*emQBrHgxBDsUoLlGF?|tRiSdoUfxi;1JKwHVC!>D_*X(Tyn4*p5@|s>!H?dX_Ho^G4uxq(ebwXE29f*l zqrm@0NRwE|LN+Jy^iP|o(d*fh^;QJ9^LPz1ZRzdiWRraCy!Vfy5;$Wha03*w*PDs8 zP+lSc<2dD9W7!y|qyNpL)O~59lh;0q+pJw&v~}*?S*?&15)ZMs6OA)rnMi0?g7f*V zA$gW<=!T@LNFhR7dezaqsVx)8mU5jK zecE`%voPSIue{VNOy4xmw_=>pLY%)+ zH9}U#4R!IK8}O(JQ1bWAGiwSI(>tP&c%x|aTy7AmBe*13 z3ul&{6L5d#17U{EZJK#$`rJ)fy5!2Y{!^Skd>;x{ux)n@8?$`k5#KT*iVL>}gO3sW zFh4pX8=;2EMN53(>*F%P}YmtF}oPFEzS&22#(`snfjRBIe#u&L-vH)(qAmadid<3nDz8@TH z*&pkMjX6#(X5m~W@C$^=ema6ZD*0qq;scTggqr|zzrz#1|D;==>{?4xZx|5((0?8L z0Av{6_`V6Ie*j8mr4*t!VE`|G&Ks6Tf3E>Vd>J(^K#;_9Zs>WHtPZUbsK!s7VG&aRG0|I0_EZj zDYr@WTek*;!u?Pzv%qVGGwINCPL*GPkvj)qtFcWf~bjr3|q zA)4=rKkn32lvUF{j3bQq2qqnQUnKFhL+pKpEa;5d0f>0frX-|*Iu%M&Q`uNsRfCSW zS=|`TZO*ZD-quSb{xb8~Yl+$5O$bDTRR5WzRh8{;BBm8u#IYI7P z?*%zk9YIeoUyp5ZI;irCH!=>~lgT@%PS3IK&I1rAR3$*O1$+ioc>rQwvANJx6$a*N zS+bV6B3PEU6D7Ef{vP-$5!@#LdM%J!^Bi&YJ6WqFfYebR5tD?4a#*kW%dau`-ArzPAC^6Vcg4@e z$5UxqWk%^!(p<4^N{&ieSl%wL+XVG59ndz4c(I$D?bI$!iURWX(#=QeNWdM2X@AKL zc=oeD63x>njic-u7`j8-s%vDsB?;B<9t?;_@?d3RSKTx1;`LsJ`NW{kPLhl<`kSr+0RGBGP z&NR+F2JH0BafiB;JcnrUcNd~%?j!->jFwIG`!{!gC#OWwf|3wa=ofU^OyRp3D_7N& zt*7~Q^^FZF`RRc+{rXOc(@_$iJCZtpPLnq*ioa`qbZf(q5Zt^WF$S-O<&2;*1aQLk z6=Jr|$i>9$om03`rY|T`rW@vHCg*9(f#KGMeLzhl6Bvdyjs&pk5F_ReKwLmp&q3ve zJ93jva<07IZ5XLQb(-$<z0E>e@JM54&OKMm6U;LZRQr}EtETXvDg$pa7&v8W-( zez*exOQq{Rk^sjmx1vrENyZIC3`X6qOM^8;PPgR#Lp_U2xlM8%H?NvuX)CoWq?EJn zAPS2>+b4b@2~LzJjavBm)*9$3gg!P7jDfW^m^b%JN0YT%IUM_h+y}-_e>Yg{_`0p# z@cNn5@+Vc61o#;M65@FZAv}6tgN-bVj|fMEC?`@f-n*uGt2c6GDWwIdK7F(K^m^`| zdmnSA&U@$r<6mBjoZPLfjR6;u5R) zsZMVYq?iy32z#g{S(vD-+{qGwW+y}O5p6u~%Vi^*KfRdXddO{#ulPLnlqD2&3>$-e3Rbg5|`rM z0ceB5|L#p_8?@Xe;q6#RL~ELbf@*kPwVxP(_?ggdo5uP-m+q6ucK#0L=C_qAV}hNd zjRv}($gKP>jl9JHPv#0c`x(i;A#OiiC z?~f8Jf2+$$QT${(lo<-VJBAPFwu6yxPuVCNUu#RA;du2pas zdioA^!Up_AOFw+b^Wm4PCm*!mzi3*1N+HtTy|5Qv+3l|Ml&phkWldzADE%6G(9O_p)2+Y!EJuOs9I1L+t#%lU{YJ@S!&B4nV>N_+)CgI?ySrUx0cK1c$TRZqPC$ zB`WR!l&5M6x;=oLOAft&7k&hU%)qTu`4b#4>d1CHF`+}Xy5_zF=9}b%xJ&etrLtO2 zDVIr!^RbL}O+!JWP!e#`(5j$l1eDf}VSuv4eD?&h%k#MAQqMcWozuaq{W-T!)rNqkW3uV8PND^~8@%3W|_oJTE zZ=etF(oQ4qqQ|>id05sf@c!#a9tgA;+1844C?xDX|A_27zjSAMi)15Z=oj+VYCp?} z9E>*fBh!#zpIyp4W+>N+aDU#T&>meGs*OyD>A%DaA+mSHB`Y6TOtN$wr0NdWx|H zt1Rm7d2TAXj}bZEV_bs$%EF(|Jp#g&79{Z^;7*;T!{E#s=ZVNJGn{Z#)uoauHStV{ z*b0a77hkrt3r1?nOcvAZ_ikHNuBDoqc@+bqN>^Qm-%F^Jq{aAmLmA0hL-yfrO-PHO zjp3Yuw|edarzly0?M8B6)H>PXPIA1l1lV=4V4vjl89;p<6Z{PcaIpa1npK; zO-|Zqfp+Zto;{{P`}jOy3cUK+uA^*jfp!=HI0d?CoK|*w0#86h3%C;Xgeu@>!!=N< zxKb&pDx%!u=0SU-GpF%YGGklPGyNAgZ!2MNRUs?V>jpSCLT(LS2t|@b=+!27C|TTd z?Zy;FmGFqa9ACKjCVum3?tRz3Q&6MSH%I=2nE1Cj(7=vuN-*9Aq?3 zD5}6M(U5)ctRan9CnQkzy1HNLrCZw{RqkqQ-N?AUVm0zY;HIlwQuOAQXR9(1T!^lA zA_Kl1o4vsbl*56#UO2EG`f=y_?lE$tqJCe|CTDL&*s+;+_gCcxWV!5G&$7^B;1dl5 zQGEA$FmU&u8nTcDDq-?R5ssVXZ z2I{}Z3>WinUT?|+j(n)#r6BOF_5;wj8=*i*xGlVjUZ3>EH4svX(zs$mG=69b%u41R zl3MpI?#m;&q+41#*m?PFc{tSC8`P8q-oN2JrNmh4O1@8gHt)6-Wut+Yj;T^9nfqQv zG5ld#A3b1htLK!G?|b<(Q2th-OOCbAs+y7BIKENy73UuzrHstC3aq};JW#|^=SR)E z8@jd0*L-^`q>cJ5eiE@oAK*Rj|I4&H!=878=MgE*b5)yulZxqEG~AmC);jRVedPjnp)RwgQ%#WD1u0lh&1U+6)91Xz5xrpMO36jK&01z zC@57xKtKoxh}1}z8hS6%C834hNhl$Z!dsr(b~*d(d(XY+-TUs_j-d|LfUwrT{_=hE zn{$4*+a?4_>VCZ_upf;N6JDnnf1i;075Eb*Z!cL-m=GQm!!(`Ikhtl|rWO1;HbQPF z!9ecjz4|hSvzyU>e5-%_ysagOO-LiTaoGdDe>`#=LcP5oIW0f23$JBM}h1yM$pI_beg@*A*)2%JxrY%%3aI!k; z4I}RKOKnW>r+d44dqfP^nt}p5HN>FL<%>nj)Lz~rA2bKb3D$VE z7bqCx_p$|o6<*-A3!IL8^V<$&4SaaQt_Npop(V1~&V}daP0pyS@c%USdY#85!XO-v zCZ7eSi<6088&$qvNzCsXn8^p6L3C``&4xd+vQliM)GlB96eoRZg?_KF`fkVDmKdoC zQ?apUlc$jXsKu#M)e0^>5*dkd$aRch4?;MddPNuNvZnuZElt1Ty6=ZCd75`Kg%{q7 z4m{hENuYo5szqs%l7o6sBTi_*k0aJ-al6y;!K-B2X|2nSu50&AqT+G{yjXn?N!*&eOXjcT7*KdJ+(!)1 z6SC;Z%?Zs4JEedu@vOgM#7rOj)@QBG2T-QJlOZ1mh!Q;u0EGi4z4;HCHS3Tm0InegqqLDKZg19>KQ)KZgp%8CEb#@ z->SZV?F^q>GUT#<>sVq(yKaukJ`b)U1&hbZPd-DH@RUu;*H3VM9jC@R&5s@>sirE; zVfLc}NT{#R_wLv1a`nRj#E5Z=F&ijtE%HNvKxgml1VDKWLoh-tCoze;B-UmyF2P4a zMhjb`+kDj|L2Dy~?rTNB>Bw=>RR#MkXOMl0Gqc;iumL3$Zi`^ID^DD0fTC+>nxUr( zKDqUknxZZ&J4!_z6>3|18hv{;f=i<9`@@%Ow=~5Umj5wJcLik+M4P$56GfJYA0y_@ zm;<|_mhON8Y1C9dZvO)79Zw74Tows!ZiaA&q|jrd0or{9AY?LZf-WsDJXn*AM}9kL8{WFANV+;EyWhzA=F$Pk|5Ikb{vEn^KZ3IS zzmGb^^>^`rCwuMKmS z;F}NOCA$=$X1DJmJ*WTgCq@EQ=T>-G)=Q<6WMRBv17irB5rvfjILF?j;z*PBRt&dW z!07;vqCAAuxn{PAsgu)V(seS0~Tu^;gYg}XC3+DdT4Pb9E5zytP!gUO<<^JP`j z^xg5-S9osEtd>n{1z+NkGH`G=d)m~WN>_Wk+;P-zPaUtGtt8t)7cHik=x zt}s`hdS|Jo#_LCU=7XN7ejnv{qjvZxm#_-RF9hCb;nzHQT0#E+L{Hl~S-kLCl?96H3t8%S;Xn8#!Gqk>0V)`=*6B_t*+_HQpa+nygKhB0eIy*&@!l=pMD> zVk25*?3E2Gfd|eBBAIA1Yu-83kLz{vJhYWnZ*{JCa&a7`|ui1JxM7(X+GS|wpG(CQA0 z?1%?XfUg^5i)AusF!U$EE|=f9XDCvY|9I{NC(BGUT^FFA1&9~`YUBWZH6cS(!|Dbh zO3EAQBe`t37+*H0!qA6N*0n)=>eC^keSH3FXR;YqE;G*Etd(_@7=hqdW=2-4oNx$p z9HL(L1$$6vK8&h{R?wI>4d81@nAPRXC75rSec58|2`4Bhu=Kva_LuolgnD=Y!YJ24 z>1xjqXRwUT8?<8{jo6Vl{Ps7(#iXKV%_NjLc=DoKWY&UYHO|DTXGHQiS=o?*uo=J5 zu)*a4@aF<2=)U5_U$}Hj$e$N=%$Rg{7f%xDH`8%%b9YGU3r33;a&_z;TMLk$!CGZc18OGQX783VooY`chT*%QaEnJYM6&p|$Eg#90iu zrQ{ABkXv%0?8F05xa^(DUwZo$3 z+q$bl9d%cxffl^|h&SN!h1Fa!yCW z*9uHCU5)mFgA0FoEM4j_w3P0ZpMno71>wV!YP;W@l8GZVE@%$%4W_-}PP}h#b#C#5 z=3KmM-iI&BFRGv4fIOZ=2R5K+sPxot7H3AbDG#^q5d*RKOxx#6Uz%`@m&B-eOTmzBo0Xexo=`i(sB6zhJ>Cvi*N4$b#g>j5wdC>z#WiOZ$u|ApaRS(}Q zY8KHEh~f=zYkN>%doQxXZ)lRK_9$_Hdd6OS3fh>gT!$7*CgdjH+AvD$s;*6OcdEcI8Cj%49*OTRcqvT@eXEK zG8ZbQit=vEp8nQOtrnYuRMIU#t^kummq;R{;*cSzALTCEH7UwN$T<&K(^XU1DiC}uV%*44Ru0oZu9`JtFx0-S;%b4&w?@DuS@*IQrKURrtkDaCc; zEX}hrgFTU6aDwYIEr%1gJ&Z2#0_)=Qo^B!0wTH0+{DKhIJ?sFPfDaR*8Ij83cggj>x@oaT1RbC$PJP z>>1SNP-;>0W2n_IB0ySkxJ(P|=^y=-etA`R&SXEA0DNZBa{z*q#P(9YB4cfS4{!U2 zTt}jIboZ`8MuVyIk(BEvh=%~y^$=vX33%~fQX*t~@iJ}4X8_Oo(=YP(s0ja&>%v1W zC}6bF-qblbQhuZsVEC~5v11b`=@L_t{qs6KQ6T8*)R?n^A!-a!6E|2`MkubwFMo+qNQTzhvC9^bVs2miiTVc3i^ zFT*$@+S-31)ckeX;eYhkHRS}~KFqYCKUKm|!@JX{dii5O(OBd?CA}HWnD#)7=c|Lodb{p^+jvp4+Qo8O z-p@o`z5Wds#arGdRePoz_QyN4VXkM@M4n#H6$afTNYNPlPGRT2euRY=#esZI0w39` zan@q+Em0DiiQFg^KX11*XR3B$>Pw&-L;smNdVp}G0`fwws-<>M>5eYU1UKc*+B_Iq zO~YA48$B@Bl7Az1D}}^!TfqyVIV(J*B;})uqZVcnz3UK+tGxY6>_ko3^8U2=OR)Cy z^QP^T$5BO|i^r!Phiq2aD zDEYAk|53FHD)hVB>wk!l5ei>M0N6n>Bc&U>@4|vR;(GwffdfjVF37GFeCgXAx>z92 z`xB`7D_R?9jJ8{0#Jn`0m+Xa=k8xa?t^(T7Sm>2!w4uRgdkKo z3jkN~HY7{=0i`e1Jsbom9DW9fiF06F-#(bau}}xh^Gm?NGZQ=g=STiImVZv7|Mjb< z977${%53BBQ#wWF!L6Z_J6$u0w=U1#yM9`WOT`H=K#=j6nK?3e-=nI@(5v#6mh#gk zHOJ#S>TeIq&kJ-GaRbBypR?aFI&7D zQ(`c#kb;C(eFHMIfAa&THT-P?FT4V5algqX0Pye+)AdxwSQ{Wa{=)>LR{wW-IREwG z+7HS}6n=rN0R61^G7QnoxUQs`hZ2xerSn4ogXI)_ z_N+LmanJDkvzD(F0_3c~4{#c<4_P7A!eWun%#RXH-`2SvfL2CiEmquZS$3+FB^<*m zBUdcUr;#T*)5lnE)}EWaasj@-Gm<=;(nI_pF_1&K8)5!_%Ou{5SK%`!&keJY9~BTG*tP`sR&Z$b%_ASeP!nkS(@NDN zlK5T1heAr6y`vwq&skI?m8ng4lx&DU%5rpC>lJoQQNUR}VtB74x~(-=@+vRF89=z9xE^*eg%kWEiV%GSL=i6V#%nh4?Pu^G zF-a*9lZ1~fm^0Jt3j&_h*dLKeJ^4puG7O>0s*xpwfS^Q;?nh8UZv?E^aX;5Sz}yA# z=ZF3|rhiVU{~uRWx(tAuFE2+QbI}ch9wV!`wc4SV{KP{v&ZqbvN{=y9YwCUBcZ~>f zWwsE*txdd*Vfr%mg~_zbmr0NB{LBa14~C7U+u+q1lC?+cl-ZlqWgQ=DT>r}M_4vRY zw=MgOms3{*-Fy;2vn+LOY)AdCd;JBqki$_U0o0-u&bToB;{)F0KoU^dBKmeTSn*bNI8WQUpNq+#U z=_CvMCD=)}QvP{lbN?>%^G3Ro)Mg}$hk-fQROLxrIk!I$OOF&d)C{lp3$M5ZJ)Y!n z1rJwOHCwR6t9=y<^bu`)aQy(Zv$7So!Ao#&!p0>VE=T5d7IVSw=It!@ID}kAzEpbq z?abT#Z}S9Z{&DW=9B(okj!5}e*R{f^Xu=YA@r`QA+={v zKXB4U(*@hqevvf%r|9#uCY`je*EJ(BGcKGi^*aT(O5s0P`cgiw7f{&yuq-g4|9?9t z|5sFfsL;p|w0wk&iKj#%PQlljeR6--Er>(u3@(2mth7z4lbh78Wc^&?%u$Kft);Oj zs5xMQC>DT)T~37Qf32<)l}eRdSoZQ|1&4dKuEwV|iWA~8+SqkvI}a0%r5=Ff=w^kN zLMYkU7lc`#79EjYO1H&*@Us?qIxtiAddYMPL)F8LT%w&z{HQ@Aj1qo zNDynrIkkXZv3W!CB{Y-_6nJMc0|dL&V$1hof%&TZjT>0A}A9&krsig_3EXP2em z4WgL`pk5^Pwj(~@K!E^$J%C}dEcGx zJnz!W0+VrTpTl4#x|w0o&vJP{5}pdDb{e~>Bb{B;3zd$wByz2FS|_!&yQ5Zgf2|DT zLsixOg@@peqVm7}H5UjX3ji&Xk5pBv^E_^G2jBCp$*rOb%#Fxi{k#GDu(Q(0$mNy9 zInFW;Bzi?LRKK%Z5Ud(mSP-&+g-B9aR)G}r>j7vE>RC_84O;JE3RwpVXT|_E1#)~3 zflH^dyhCi^5CF^T1Y~FozKN`cls+3DZMbVb`L7?s4F9)J-mi+J>hA^<3OK5+X$n^X z?uk|cWU|0Kydjcka1Y+w;Ac&~d;l_Z0z|yEIOH}x}4<4261_?O3w-;?_r~V-%k-tGOQ9=P6wx_>#oBgMN@|UvD z-$kcS{b9e@e@6wLQ^eCZt8!>|cV)iB1a7Fv@VKG|QJws;Y-x7Ki!uRVo!u-#Ute+oWKyhA$!~+Z=-Ms@4G6AxE z47PZEZ;PM?5+D#xZL~OIK_Z#L+q~5eKxLEr4AN8j#1>D0ddOazyQwxgH@W_WS_y;^7Ho@u z)eiMnC40j_`qLBWZ%r^M@!1<*8 zBa!ZQ(kd7>sYv)t*wj9UfSn)b?K$mxMw!JRTK!wmdK*c&bsxM6h>h9oCXbbBgIn2; zB0qMyIQ4M@lc$386cmX%~ak@OhE1tGzFj^G3uApX!|@EZkz zG`JPaLIT%m$G+B!UPxMtp~UOP_>J;fMb4+(f87w7^a<43#wT0;uArkaf@t z)IKGlO59}QI6al=q}_1)&hh-(kt1c_&#BK?k4wGIIw|r9v@pNq??f;_lElb#lrKtv zx}gPLER!@Hd5l-105bcXsu!1qZP9bb@5G*o8;lgy&;7r^y$+RL`{c+J5O|C2K1gEcU-^$!hF_Rn9_TkOo zqO8?Sz=M>v4(PhaBreT(5^n491ar6Mn~QhSn+*j+KSEjg5s*8apZiTzb>WGisz^zd zmt!=0fhvBHYaBB$KlwgJjGzX)7VhU#ph+G`W$|g8!sk_2}h9jpvw?@?b`<8Cb zpK$FQ=f^g}sSjGf2*8>KJ}Tch$svVg^SMDpOnXPt`dq}h@Q`#315RkWK3jIX>BytH zXsmIogJqWA=yxjBdns?@^-cPt@;t{>*twbm!WcoAaJd3dpUF zj=?6FKg(yz zkYS}k$H^ot1UN=k`uLKBC+)!JwxJ9@(s3O<4|t?O(}EM2CrsBORgj1q*j4Pgssu{apMcOE=9E9`em^vRg%m2<6VaZ`&VVdZ+L}dUeJr zD(&eir{G@jE#S?t?8oH#bwP@(8yo}Rw6%ghx?16)(z?g_<`#lh#WwgV@H*+zud37D z9WQ2TnQ$E2e6%IT&3NhZF~IWn0Q8jFGI5niqU2Lv%`hG!3-nh@5|FFn5*m)u;ZKC~ zC!dVZkFkWn+(r>Hr`eRqa1Vc<02RMPA8s6CRgh%t(E$mvID?~$P@tLiHDKfWGW4k? z-pNKSnb#?(JFoa2Xm6Rf+P~eBiDqIhL{>oDchxr=$_Wb4#$1h;w$Q8 z?q)8IE{s2YQ7sDb#6bFq&=nPsXFjmi%=FUuHG>N`-T?if@Ei@)YsCB+*fINcY3+yo zYGpxeRsrDl+ger6SZ$4OG-ck#{*kX7P&#oELI1;au@nBMG)7zDoqkz8G)W6!_tV2 zGXkO8$rsH8sQEiqIdMJsolj-xlgl6tSI<%4_RL5hgkMb^4tr0y*)qktWnD z_Es`4;;4f2yjF%;3ttRL!fGyWE;g7%I{fk{g@kC8ae8_Gzr;nqIADJjul$fd;j|He zwZ?V$DE|n2+bZA60QqYjhu*J&&42m&|9f5s<7d=k_#S8(y0axf4LIpb2UYTG1B@_e z22m^Xx|Bog`=?M(fD2=S`(Rq2j$YjboWHxeQa?^%;V(F7qZWeA!@bF5gHW54Zfn9g zN*#6j?72YkE>bIf7@`W1n8LTH)n3~tOa?w*!jVr9+x9c_yXX9=EnD2hUrjwtDT4Sn z>~f&``Z=8&JYloXW`uNN#cUiskhL0$+oQ?M+-yDlfDW#`xLtaUe?+ZX-CjEB!gHB0 zxvyU|hL~r=UurYkr_fA2it2d|v>rv)Cyk%ILyUFBE@G)&->MBCiM`;^qrDS{*3kcn z>Cl_=)~r_>ZlVtb4xXv@a&KTf@_ng%lA-$ev^kfYxa+v)Zj(ttQnu~pO{Wv4^-=~- z6;B<*N}SsZgYgf-^W3)#TSbKIoa{5<^2X(5iO*4ul`>gDgzjrq<`}%z2y)^3-t!Ow zoXyAJ8`*g30$h986?xjD6Z*9(VpqLpsHDw4D2dyN@JdxH;aG%v9oHQW=8tbvHx)1K zwtDRb`SJT48raU))Z!4HWVE?!-gx3Os~~SUhe)*_?uclKjN7><+IdZ}3a&;->`K8} z=EvHUHFBBB%V)S4;`Tt6yTbt}d+XDyDMjTbu9JAk8~gb(Ek;J)__ezoU3_pQWp>X8 zf^>(SqpvL`CN%&|kqsZUv}N|S=ADSZRAcooO4&JVhwtfp#~gkr?YJ(rThRC@Epi;gOgxr37hga%-3ThkdC|$)z?=qgj{Ps%;IW%`bC~hW%ksSBgRJa zBl*-G8Mg&9e9#x1npheZ;9E?tus=p>k6M-4jfp`KFC1vx1 z+qdQ`cT8liznk%zy-*+-Yq=#1>bMCCgOor;Oo9k26LyN#>#!YjljmrPyeg$PSwS*& z%pZklw zp=jx|?=mkic|mhxBJE26B|LQK(c_q*(p_o4g)TjyU56_174Qbmks$+83#ehT_H-u) z!DeU8uIC!xIgv2!Vu>-${)hK#v|>smK{uv0{Jtyk4z4Rndqk>uw;zph>I1R9?iHei`-ziEWNqL2033;YNdO)RqAug73X_3`NYZI&MsWX z<&QOI-~CHgum>doHg|6cQGlElwS68|mpciEIqosqf(d|(_-0V`3Do&s$m}D-AwP8z zxr#Cj9swE~3pXmB{x!eq$JhV6bZ5UvM?IUpAdL{>W(Dvr4?wcWd@N#jfy%ni#qUI2 z+k$4J0aL5}Lj28NowtAMET&O$o47>O$n!A7js%k}v(3I^&@0g_#RDm7ro%VC?tPNE z!Qi1UAIQZQb^u~=l8(LpHYX{tvI^=p*TEE668j?La=!ZCOdS6PiuA8P_urb`{+DF7 zq%7(&%yhCiP+KW&o_j?Z8C~D$Wtdpn_wh3=M_liAe18ApX;ej7LeY0HzhpGcp11)~ zaAur!`qe^XXyh>%lgE0$b$Lu9AuiI{t?Tn+KBg-zDx0nEFG%FQf2R2sCS1n_!Lv3@ zve_z$;8OCP(ul#D?{%$xpQFrYJh(}1g9{-$c5TDHG z)|PFZ)8+TbclkQ2-KJT_rrr^K>KZRlq&V^#x7He_ppPq_5qmv}wxGca1U)D$9OQXn z)%b?5Dy-uID6%_fQ9}5_LVJ>sjPoXPjh1BUF++&MAsfffwrFH^1M#H!yEucyutRRu zwOc#^T&5L#vE+8s)wX7Tvtl`(sEAww48Ry)`ami1E@!bDCzsj%%CS~kCMW5eWV)Rk zVZ32^{kPlj9UpQp1dyvcd7h48KGQCuh`a&;J3y}rZsHq!dDCz?JGe1lxWVv@OuoCd zQ`wT=w_+{6LZh~1OVi^o1CCogQ8}S;Z2`!|LlB!T6974|Py(p7YURP2A-1~2%WBPl zyJzT4F2JrREo(95oTFgYw`#?w!-U;?s$HGDc^kaQPQmZc&aS&<-JO-yKo_f4T~=xj z{LJ~t|Cpl!Q7)*RgECt8A|#(rEX&$@FC&GMnpb8F9@T_GG`Wws$N(`W|H%S<(iO$g6G z*KSTDBe`gZkFXcux_ztLlfh`q{*nrp?^YV0UN<|QTk7nYM{*L4y zGzIUeD@q!hl#|bS&lF^4T9}wFrqK1T3%r_+*dNfYw9QX=7jWsgm^rM%V31dnO+U3vbA!IUZmZIQ;&=P@Wq3civvXlRy!xt`fL~#JS1)UIiDqtInGz7$54-< z>sFAnzs9u|jTLB0W&F#XZZOGkZC@ts5hcc}(jkqIWXwal(6@EfQRc?xoYL*@s*Qfj zI!gB={v%7IaR~k&p5NaXe{36(@b)|^uyzUjvedUr`pxiqIh57p5g(7Q#Q5nAuBFP> z5EpTprKs`9V~fBFv>oP4l#kO>4e#r`TxK7|eQ#62^I1*@RS=H^%s~uWBSGY=xCm6% zBEieCaqY^IiCN`SiHw2U56geJMLg>UOjqOCaI!Cs43>Xf?gBqjk0v z|CJTr(^dk!6(<7zArksa|x z^pK$8F2Wvs)Ru9Wyg&l4!I?cj_c&ZwTUGfNjtaVYWB^sLp9}`RH((ICb(r^@d2FpeUhWwl zGIu*lJvF%kd4m!ROmDxQ$#U8HIAUzN9T!845lQX)nyZ#E&sWD%6;DgYT29ZXjS7yV zI~K>BUvfv@oMI#j1F$^w5K&eGMbR6TaiF*&4m`%#S% zBLFw~Td)wk9+9%f5dh)HR zsg#c-Fh?tVyov5uBPp$lYRC+7G8 zQukk?!9P)$|D3w!KZU|n;&hufh__tqm37L3rs{J&?=IibfZ4hq4&{(k5z1J^Bxr%h zFQl&ZzNcptfA#Sz-pDE>xcIrP#lGo|wj;7_z2Tw3x%8w@S($lzD8dM9S<;TYqH?R3 zLw26=a(I^cQapk5D8ige*c5V+=bYBN)4Z0S4$r31uH!Fv>^XY`PU|U&;GI3v_1Jp} zz?@0R`bZ3&UiA|VS(6qPoQCZ&Vm^H-E-a6;{0jN7slp`HWhPv5%I(|@%%)!J z$=+ra)UbkVj+xkJ@$F-xt1f$b7(~%c2TW?LY8|hu0KdTbYmn-_pq@h^v9XtPRrBJh zG(UJ~^V^uJh5^zte6x3DU6ECnSo>63(QWV1AiM5qb)Ec^O>Xf9Thy&?)}zOHu2!e@ z+_usa?=Dke+`Nw~ZwiGTQ-PmKw*RaQ%f5tx8jp#V&Q(XH(?vKlx80pHU_0{#WLefB zOa36u3^2Zj5&;tAWaofm@qm^W9ic`MJY-ARQG#!7jqDdrHsbHvlkaAE1dY3D%jy?4 z8T4i)d3-DhWAbTByKS`D{Gq0HNL7?uoHS5^r)$2fa5o)eD?1$TR;hQt1ZV@&3VY0$M{<1&AlYjrd)+JN7Dgc)unob7FEZjW065DK95D+5MvuZ|4aj_&;!WyDB3 zS78?Qo5`o-tVIJSv*oDPkJJ_2g!Gb>=@x~+d1cAgd8Qlsu;=w`%%3P>ELSs#pUVwu z1%N^yS?+cj;e!oKc9&=(<`GrE)mE(1H?-adm9@mfFQwCuD_}bda z@P*S}3L;ATDTuADGDN?8LM@-Na|Y2_+bIu&US!gAnJm^mQ4^nVF{*$kO5b=+jHSBl z;>oP1p$U{h9NCbZw)$7ZQeSj*{=rhv= zF|gEwu&;Y7^2LdE;vjh6aoi+j#}U{bO8n{(n}(&4BpU4lQ0BR9c*98&aJ=>@;{~X+ zr~?r9Nb9t3SmBPohmOW&Onj2|hM(a`*RBmo9h8$8pgmP7LXAnD^_Pbjf z?9bl$GF011Fc-Ve7@M_s_Z?hZX4Vgv+-q6{#H6y~W|Em3@1NJ5s^NaoR?z6F>mJES57_*z}Ee#2KDtQ20W3N!GH| zQ}~6)1+P=F8&sfiPz(n#_yA=29kngbj=55Q=Wgb;Pf71sn?*|uCd+&0tzR|iIXKzd zWDra@Fclr-Tf_})B+KX${YSDeVCx#RUP962AjIAiyf=4R#(wU0kVIdh_?_o6-FBzk7CLxm{dM*2uGS5wT{pa26>8`> zjd36MxY+;zEsC?)pzSICDVU!Mll0ECpH7JEc_GW| z$hYRt`#2t*700qQ(u6z#ygVR`H96Gk%z53H{Ou;8xe0m9c}{N1`nmm6e;S5kQzK=> zbiFDfge2i3UGjw$Xhh(eZ$u2w47tgBFYmUL=tU8|Ig{=Nd*Sz+bywyc(Yf`4Gvc8s z^h4E3QTg!^_M%LfI|-xrJUc}!M|I3WAzDw#>5HbW&n=zK8Z8ZfsOk97?q<=`iQi2L z8p>9|&KyH}$v9Fc4nU#|lN^iJ1sW$ubsMhgrY;o{QO%O27>iy9{z}s2M;D_7gM3gi ztGUHIZ@_b7Mv)A-o^O* zgqW%BtGwlX)dHUyt&imSpN?3})2!h8?s;q6@6iw=XY>wUL%KrW=94}zm|dk6L+LN3Ss3}$8dbmqEi~Y7NV%I5+1mQeLiAQvyQ1)W zV2rRuITUQG#4y05<;&6F^;G7WNgK_v^^m6AX!GEAq9gN)ckt~3!&F6|8#uap@Ok4! zDDJa@Y`*WuW^up1S=0J*muUWRlr_No%I$HU%woYu6z7=}1C45j#OFvVl9_tN`uepSVwiT^hzV~x@A4`Zz-Levz4fT{8GjmpJ~8c9eGrw&T^}T z4`O5AZ63S$g7GKAd}0Tw4o>fL7po1&%DyQTwWIcU3RF`2jd}FY_a8bj^QH$1eK|bm zF{7~IH)?XS%7dhVPkFy-W-}o&U|IcQ`4-6iwm$bA|7C@Ahsi6;3n|CA%FdNs?nyrJ z%<1I-EOEEeE6dl_1gRWUDyJ8gqp8s$QPcUE zlG*{Nxq>K<8^FHVbDZ*DVSgv-vso{>(U2Fq$-Ko^X?C*pOqL?1-$#53#pxqYq{r$J z?|;Nt5QCfUsAb!sXQa+_G8N@TsWQ2vCq-V-%-v9vSJsFME4DDXn)|q7cFK*1MO~Maqhcb4za$UO_uO`($r3( zcDdWwP06biM;9W#Ei;^7Et@-L)5+1{dOptz_Uz5uwfQ5MSLji>89GH_Ev$88jqH7D7>hVH^6xGMNw7<=Zi6)tZyR~WO2%uYUgS3&_wA^NCHPV zhhbH)uD!$r4U=gC8xK>bLn!q|IaS=Pd? zsJ1O#YU;|Z(Fl9u`RsIo?1Kk1;R0bT0{6mF)0Hf&@`sR5QsOI7Fo{ROY3qac9At|J zpyE;UfDELTW`zrcudT98T~xX_sBkr_l`}i1`^n~~UT!W`+k02u8;BjB;qY99^()b$ zf)s>FQpDUAuaQ8hNS1Ni%HDT{lb9y+sOFp_ObQNqw1Q6`jf_Y$u4&*0fOafRldQz+ zou->U*KjINhoO%HiaE;)6IeZOk>efQA6thxnSwz+;#tH2f;K)SJO?&B!SqhED7@*`X`o*H_dlNC{Do7T=W6k}=Rv6o{z!BJm* z#?omD95y*R;&(2xHQq#jeEb8N^J+pgzK=INB#?uN`NfPNnXPVF5z&B_ZP*x1x)a~r zJCo%2T8TU4IIH?VNq9~!HwR~1U;Cv3gP#t~f~wjKAAqLePinjXPwrBKn0)gLr*S(& zuUE6}$AEpjJo)=&-nSC1YyvAL_v}7gWw|VPT_Mp~PV}C8DP=alYNPP1&b>_baBm%l zIEo{)d*;#s@8?ipTSO z#p}2(kBEz}Nll(y-hVZW5Qz0Wk{?!7Q#=+mbe;sfXD5-j(Wt!{BE|{8dLct-6 zAusFg&BLd?9v0aArE9bYAyF*WH_x2+iNTA8(FNBVH$?PlE?W8benox+u(b+>~cTll$_SS_w{m!9zTPY>|7RoCR=;ElC6ngtD5^rX8zdc zDMvZua^{#m^QyHp9JL0U{HUS)jcvZIAzE>uh0jQQErsqeuYbMSAyvIF5_>nYtorVc zo$)r2emaAg{}E&C5#0DiBir`+bP1D|P)UEyMu0_?b zT*^E-dBkO4jaZN+CcwDLUb?z7WK8}Bl;D;*E&l*}p}8}TR`GTC2G~G2r0)+7-kVgV zd*_kcP_(#v`{J)MNtAFvq%`2a46{jq$vvI;Xw@e0}$n?f-Jz#kp+_<);fHwwtKIjHY{NAN}ua- zjE*dt3agmpR1vpgcjfkm=9lkX5NL9wSq3xsSbg?@=_R74sjZz`yv0v!B8bB`Uvy-p zN2EF@5+-Tk?crqQ1JIXM=>COppK%qJ;YQ7x>rNj^Lqi=fn^kMR;>7a4}eS zDorn76NP(_v81QGS32CBNCum>J1g#kD_LO#*E!>srR}|O-(eXAt7$M%tJ<;vhO#CJ z5R%EeDCyov=sM!J<0HH#aaJtixuc7vUv_%~kNQ z$up)Vg=NtrKb4n+^z@1G9KWhEw)&XnyLDIePY)>Hs;#AKFNNh8q-zR~MOIUxCrCSc zZ1+E>>ttYdQxJX|+j}XNP&dB;a4{rANz!Az(WK9DJJi(FS4Lh&YcEqxtf*twKk7>h z?*$TP2+q96P&_hBUf|7d0LVU#>9K($a$F zgs#^b_Ad!~(KVw+5zXMEKC<@tFvES7q5Nj_XpWJ#@K-m$Afu1f~(gc`FCWjM=<7k1>LYM@9Nn=hfRb&(pHK(baO9J^8T~NQ7QuOdWUP?~FOj zLrY9~5jK{)kCS+IBdYBmZG2ewZ6))gG4Q;~pc!`w%EwV&k}_iz?NQuL4DfaLdpbhnGALO7@Ji44yKJixy9(vATn72pY*e3`wMknOLZr-OOD~5& zlWxca{|MG*wzRTJ(4JSljrYZsOK%9}7vJ|C?~xM-_~uJLg<`TGy8|r{;HNySTc3M~ zw^A>J85MkpFEVb-zL9h2%lGE7yt_x+=wQbsLJIPfp#RzD7_Q+|(bQXN2-Hc=+h8p! z>vb6-xnL}evb2t{b?CCPcB889dT#5C%Tw~#xEwPTv~iKsD1RT>oD~ZpVkdtB3}!15 zmwl?jZNu~VXLHd(^+#;a^25$4Jj*I$Tm>|(yumL{>>%qb zjuws9ExAG}(vBjvTF4ac_P8s}P|w=iqlV3uovIT2`kqGnrUj2jKaHHYjxUX@b*|Wb zw0gBaO-NeM4()E1`y^##nBZNTYj2-b+&QFj?O|N}xSn?|Ts*O+O3Pa<$q?u*7P~~TyrhBI!3wm`8IBefjANl9sFHRyM6;6s}}wq+@nd~iqyBmg>V0n`kSmz7Pf zh^2iU??Ty>X()YbTyK|A+qmF?Zk?1HBSjLmO95!t*!5(~x)n*KNP`drcGD<=c&xMx zEA90xjE~-Zm}5xj2_%}?cXQ>-Pf&HxuBNc3Ji&D>h+?C!>xf1ORjnJ^Z%~uoy+gMq zNKzd0NN?ieCL$cC?Jq$Xv_EAM2+z&OMPI0J-u8(;ZhYwkCU}2><%{g|+F!wbIK&^^ z%ozM{kN3Kei{!DsSL|=+?>NDX@_7dQ$|eW2*ZPD!owJ4BHZ?o**Rrkela*k)_#bna z&zo^I6zIKr5(^=DAAtHba(m!dnPCjYYEYJ=B7W^$y8!yU?t~)eKyI{{F+wzLkvg*ecHPs)(rLqTwm%`8r6Kl9Es&4cy zwXw378sKU=0indkOb17hHF7=9wwS1pqwNgEvzO4JCC)}VRu9_TgqavZWyU*DLIw1Z ziPhdy8%>>StkX(S-Z{i{(uroDjnZYr16B#SE0w`fw_s*Hz27-cmKR9Q zvA86oG|Up9&xbi&QY@LpttIs0L{X$VYOu5y?X3LG6#*iv#55`imzSJ|DREN!5_>Kh z#;07H5&1vty?0!bTedzPD=I2BkRrq*AP53VmlhjM1QdnPBO+aThmeSX2vQUTq$>!h zlt`BvrAn9HOX!`18c6ZCnLB5$o^w3T+&g!^bMKEoFuwWldD&&{z1M!$v!2y8cye3N zQ0-@0-d}Dl!hW)4!Tx-*oPufmR&8!3tPl5&Tk+2$=vx;+Tq|SM`@Qa>H9Z^L$V%J4 zqgVZSUc}&>wds=kM5VwZ>|yE&7aDje!MC!2Geon4SNR~{-EqUW>=M-y!y4Cpw6>k( z9X%SG7`h}24!l3N##uAtkYV|7xEZINR%~IWRER}youOX}ll);?nVB#FB>}AdR|x0G z_@Q#yDoyiZszz8RMo>S>Q8g(BNT$HETyQ_TMX8JMU1Q~MPmX*qDc~gYFi=U&S1H#l z`ToJW{@|CGGlb)hlRGkAgjaZM4|?FXkB}|Z7_O%jrCl={L}oka^0wQu-S=^^tZ1%7 zMIQU)F^3&rH299eM~E@Xx_WSp)FPAq=EQx6ZamzSc^nh{8(HyNLgR`hy>inmjHIF? zCwBcVe)JQ%OIe8@y-oj?emm)0L$XUKoM2tfXE!a$$2-jCC-WfUC|w9`$9g)a%REBA_SiR0J%71!D?dn~+HruD}5BJPy=KPxe@UQsX zwn{@j>UdpZq1ru}(Nl(g=3F@7=8op=gPmZm!Ca-pAbGhy(RGn3spr~{&lUm@a&JO& zj-=}`KXf)pEV46eC zaAT~ocZa!3%38M8Os|kiw)=Buj5Pf^aU$s7EBKd!0MYMjacq{j|5n8R_j>)1^-Ya* zx}O#20A)CSs4pH@wK1Yx{AjvE>&u`y1Cb49!_t7DlLt}Fzl zE{}TfPF!ngMvA;6`d^N+^j?crVM3bpQw+#$(97;7-7di9SBG5Wu)y7~MF2_$ws41+3<1 zf-hw|Y|$7>~GD!1#H(`O4eqa#a@?6@^_q zF-SHq1^a=I*a+RmPV{I!jI0O6CzB1nLM{fABSBp2NeU%52Hk`qhxx9eXh0^@F%M24 z5iJe4dFw#L=CeJT@D7GcDTV^=4aE9EYpMuB^!pYC6K|nFdhttn>UF?HtZd$T-`4p3 zpSG7@xaMFu`pX&<_D*cNgXH`0D5M-EIYXpK>uip={w^z-=99Gf{qUH0`_`6X9F@+c zROGCKojghG@X>Xe3=4H|*OLrpzmXl)sQ=3Na={u~;*_p<@rZDk81s{7u+vzfKy%-IhHUkjijnzMd5I14P(*J7$!2e7V!ykiWH-C5r{zJci zyDgX7p-3aj_~UFz*T%l@ouA^A3jI^j+J$#@4lnPM*fz;qRlg*m<;ZVl!IdS6ceyZ} zVwA7Jc8YMUr@i$^SMbZ5U+6Ar=G;UC58H~^I_ha>%*8v)1#n-wOnVV9V4ipVnw<07 z&olT2&f=Q0D$PnPyX7xmIYV>up#-zhv2Am4BCW+Vpp2UYl1;Q@4!MmGRK}5$OYmtk znPu*~cJA3AJ+$a41QLrufj!^fm5tcr#F@jUW^{q=#&7(;Xy8R=!9y(ALUnrfU zX?_khpG-xUm%<40-iMNXhLsUl)tu>DF-iGME9;E*7uk*jvPmofOMN_8K}Y6Xz!KY` z_?kf$P>wZ_d=Z=-`Xr$F3kTHbFY$ocHJL;N#|BL&f@~K|G*$ISFRN`HPhK+^>V=C? z5p+2h5|Bv}#0WdU6~}#nDk4u7bglyBE!okBVE71N^dsua7_u-|C2Zr&=0Wsnr4#Tl z6RFHchvO;7u#D)T4M5Bcx+j|hO_JsbhIl^dXT-o%uz z5LtmLC{YG@RU^;0Ex~`+4sh=Nwy}t7Um@j}k+(n(B1Y)QP(3uE7KVEz1M(S~l?c96 zx(qCF41xp>)z*;xb$+*oY|F|Zfm;i6YcJc{{{J7Jm`xI}SrfvbZlR95wHH-5u*+xn z($x>SDjwSE>O1;Ictt20=Ev-PM5-R(E_oclI4=?%d3;eo*HB2I@*&1F&e2)x6@9se-pt^VDxs(`-c)K|7VvN2l;8<;MK#G{4y6KI3iZ+Z{Y8wVKEn$c zY9DMe$5!KJ;Gu( z_e)uXn7HH8*-bJJI(r6K@J^AqSQ!=_9nCO9y~I7|WW2~xfUDYls!Awj8m>v1=wY&- zeFFq4zBG6+AyRGT55}J5!C1S=SB}5%Ys^mZIOH&71N_g8*79F5oWJMu@N>bZAI~kH zDgcR0k}btXuNy3E&6v)LkDS;DzB137nvnHYg+2i%;!x*3ro1HE9Uspoj*p?z5;!{| z&Kn<&ZB{5}`LYbte@XJv6q%3DbqsK#o^Ca{vEy@AD%2no8y$r&BrBaOPvhrFVw{a9 zA6=H>gKGzvOLqb8#{}!8KSC|P7h3&aUiJ*0NCpJ!VBUBl-ICjqe{VDLmhG#L&AkCu zq>7=5og;77Ft0un9Bf=tG>Wpa5zofPh0X7BFW!PXOF#5qq9bY+2EX|VDTQx}q53>| zvk^=hLze*$n{uZPKu&m*dXOJ5jEx}3r!?yWAD#C2%@ybx(6IA?;xiqg;K)W|h&QS4 zjerC(@f@|T5-l(steQ|*!-{ z9`xhiw(Gn0&g@2z!6k!kwiv!hFt%Io}5-u8l(B@ zFE`(s-9_UrzN?J(lhOO9{w_w9 zX#W**G7>!itt~Dqf#I6S4}mk`g61J@qKfVjL{%Db>h=|hTJ8j_nvC$j+3rC(SC#yT7U<(s(^4h`)LRaR+JxrY_0jU4*wD`;a}5^HG_70eavQ&K8{-pkm1U?=iBBOt7~?s z*27RiJ?0mnsJI(*fRctaE0JG)Oem{1fv$>`&(S(YJSvv9+IPjw9LrOnzxZKWWU$o8 zOAPHxx?C78uXHECAJe`<#xH{~>xeMA+!DF>Do2d5ya!M7FCyRD|jNcH6 zCx3>6l5fVPya^9vK(g$k9^z3@UpD(IBy!(Z$X7@}Gr(DM@m$nEldlj#`pvJHF#eNU z?b{l^E&KZyt`FnE)hbHdisDYNTC+3WzA95WP!%y^@gx#5f4PqNEqkj-KM{=!E)VXZ zQ~gjxq#t2PzoPq)E6#d5@$Hdb_+s0=7ff^!GBid~h8YU<>z&#%tOSO)I99h!QtP~M ziFTRMhuq>^yO1lVVp7kr?h)R$ywaYwDt1dpx16)2p1-+n|2y?&&rcdOPcJc^Y*U|; z;UXBN%qigyR*y)DcI2VNo2^Egr7W$@qZx+fZmwG3OODs?urMTkIKk(V`$GwLM|5vE z0{;%kMv)hY0LifQz|?dNP8SD8=Nm%Z1589};c!X;I9&E&NYKWw5WnEn&K`1XAT{-K zcahWiwGUPHx=A)T!@4=?4h$C-A(GI#Q7~!9*)U5PoukiJCS?!?L+x~9EU9kf&P@VHh_O0>|2o9fuB$%z`c-&VZB>g z1ue5ulB+O5Ny%M>;nq0{%>lc^&z-wC?RIpkiAKK{Z?$niYzSVZ6dfqhtL_8K%-0$a zPCXV`Xd`&n0kyYj|AieFm}tCM)Ep+4ZaE>F^(1PzN~48R=olNF!aL9p?=Pk!lv;aS zb;?_(wbOlyw_8L%X^^&zI`QFpn4-}(!RElqM_M1NuaBq4R)pL2ryUVVQ{zxmIrLoK zrt(<+MFshj&RqkKN?=1Ne(9%)x%6H==)03~XCA5^9MGC#^2qF~I;9sVsZf4o-R_9y zGp`5owH_8Y%QV;lvNaxq>nLvSo!+5V-07IgQe&C?h^5mL_g>wR>%QmB6a4mtE}v_7 zj)#{@Xj)WO&GB2V_5!Qq=H8-T`aUnv5(zy}*CThZLBZ zmwzQ^;F2$=KSx zvmUe++KsPF2!^Znk7#FJ7%0z{&0TYtJEeXH=Q=_i`PJ!#-3^ zL`AQ!9~3^L*e@+i*24}_X~KvCLx{&xmiVO#eeUe6HXxlm`xSC0$4fZ`F$WVg4pKc+ zjo>xo%Mp83Y3O3|al>Q6XP&G$e88G?R3QkRshyNt*srhO2ML%uar$c6DT!=_dPtwY z7{kX^Rzs?6aL*HJc^-PhKI+3)2qU^unREdu9ij9UqKw$D`bNj%6u)+5h86u>{gXEK z2N!Kb=UMEF{A=TQautR9L!%Hlm3@dOt@@Z|-Y{m{Yjx@j6oe2W94m0EA(xM>#qw@P zYk9u2#B~3hCcA~ufzB88x34zyiVrC4-08eiaFK;4grv})N!)7HJ!5slUUf67^K6^++E(!;d?koDd2-) zSy-d{?T*p|gk8&P?|UcR!YVq1lG593wG|qyg|OkzK10^^;>Y&cDA`=Vyh6$*njep6 zfSFu)nOP8Z{7VjBmOQOse%P6i`-d)cc?+Q(6}Yy)Dk=W(9=|ZB$d|LI^SP%XM|Rlm zb>g&8Vurl2h7tP*4z>gKXw#ZEi%HJbRpz^~>WW1r7^3_O!oq$slpt3yQo>ud=EjCe z($iNwsyt!VvXGbOdezdd`6*ra>zK@wwgLVrBf-8B)enoEopG-Bty2nh^7FI$jR_?i zuIVT2WTBj1Ve3wzaSx(adwJ`g0Lffxon2oOXT_7Wz6v(@*~_OBx1SnaRad_u34sjV z#IL81P!eU%XZkCyh~#tzMbgJSlaO}jYWI-SWrh9pA32N^nlj(! zqIVO$%JE8~Z$YN?{d0|c_d*t16v9q(a~ux&Xi$5oS5;C$nm3am7A#CL!AYk)a=;!i zztLqDmEV)to-2LHTD!Nw?^CXvj!T8vFIP@~aW(B4T45Q?J1|z+Ik#h2JULD=F)yft z`-uG6Q&%im!fv1@`{uh?yW(DVdPvEdsRy2^YIrNQXq(rt&@gx<{PxRNXDSCe$kywc z1b?s>3qAeyY}ry`jr#7a{dHXa)t|hr)DwUec^a|iyNEgW?R~Yh+UF}|V2pb7QzPs_ ziAvTxbM5C6da24ncbxQRJ$5mNCmoD1Z@u2d8c_tjqIm6;D@ zyz$VR!4ojD&%FPms&c>m4xT||CXmHQoTwHmd%hukpEiGF;@;y6uJHW0>#55|j3T4z z(}f67h;B~$E5r^SJragf(7flCQ(;5=ul@QYsv~;b)AdzR zr53U&EB0T2tJ6)Y>EX4CQ-x#tCqW?4na$;|Bfc&5kK%sxE8seOESf5Z@kFmG<_J)j z91$mPZ2Ns#A`f+v2fCpE-OU7wvi9Aesm%e^^}hcSUYq;-GDu&3G*>ijh~IjB@vz?r z)o0&B&mW`EdDf!`j6rAIQ=&FwoAezns>Aty#k7`ZnGf_#m3gGv@)ao_i#VU5;8%NY zQY-W1_DeA|JG^R|bzj8rN$E<*>h#v+uCso)u6O-J|20K~<=rHrFm)-tvy{ihs}lZj zL5D%R;Y)zd`dYIvX4OWK0T=0~zB6>3ZeVojmx*&T&?6$jho+AXPUme{rFhupo-QoR z7gRdS1JP7s;DSJQVrSm(z9)WRoI8X5IWEyk-^hBQ4g_*i*`k}ytGcv;FsuV0E<>j$ z>@i3yg0FvCWpcg;Ted03fl&k#r}BeC?E4xo4;_)hk>*{WE=AcRZv)lO@p$KRS>ZFP zL6Yu@J*Nk)t(odI2%@tUZ(OyG9`OnuaBSj~Y+$4ft>JrYq zhJV@C=yiV$w0ksO)i1q&Zjr8gjeYxZo|JlMi6mU`#EHe*H!072+TDA;LQsftfw_A4 zA|T1_0{t6R$y*psc`S0ko@73$r8^^Y_k7zuzrasdt3Fpm=kxcc`gtyus#7LTGz>!n zWVi{=p_CGl()`hR1?m7s^s^3=kMo7DgYEUHq>)_vU#g{yj-l@v+)}nT%g6G;4pI9m z%?k`L6iGmK`yAVlQnkQnwsBoTFL&8#reFix^+|d^Ub0(*O9=$)h~OcQ4la z#`Lw7o+Bn|ckty}%2~Km)Ozn;@vzBgt=@P3p3jMbd;2Qhhbcr$t;gC|-BcxU(NY%3 z2lY^QL8s7sF!FI#kgX~SI|L?6{z-BC+*JAsmdj3lb;ULBa#uZXLE}fK3?sxKYii`d z3-tu9U=cKUF?{9(6tr{kaPBj{IzG-IXDMb*S-O47xk`DTzcAeA$v$y#d+3*&!|{7(;%GWEa#W9)_W1g)r0SKT zV&7@kSlS*OJ6JSg!(^A1CU{{#-Ia?>x4*0M`hCf~&C}vXKbt(5o!wydrH-UfLM)vD z46NOuZVonUQS_)e5p1IOqQQ!34$lqyAs_qy=Q&9mzN_*E6yLY|msTUiL6LzgRQhF3 zq$kh`8ipPuhFFSDt;#xGsZt!VVKi7_--#|-K_vb zLqZ5=FJbrSwDJlo*jZZG6#lV=cE#C|KCq}k=)UZU_^E5F?VgJhbN4^x&Yj%xdFd}D zB4(OV62w~Aabl05)u*}iZI1_UiQY>+5xE^))vcglHQ+aglK=|{t(*yu7`tb-Hq z#OBM-rVx$~bCqL#wb5m0e;D0;pVe1MQw^h9EaK#;_dqy;sklpR#KKjPJN%fO!66N_ zIuQr{2K(wmN;ujGO}t(z?1IM8t;&1xQEMoL@1b*aqE+SSi1EI1DyH`Oi1S8!qj-~# zOWm;VCu|pb)s?VN7VM+Xn@{{iI9~m}CYcyq@nyHNU`x#_M^$e29IHC|djEtA92J4Q z*M{Vt9-@079DACi-+q6&L9lk@W*f#>$wEg`AxbMHtcyqP@yl@IyO0}#iV!$_#QGuZ zFp7EVra6iqh?`0ACO4eR3tG}?&bW_ry_UVF{IfqTy}YD-%o*uGR4}y?y@%|KuU=(B z`yqBpv8NERBd}m=tFyOm7l+U~e_8Gt3qNve?#Q08io5~i=4|_>!;a4^%i`53@kmLM zCi!w_uJtxlo6L?@vJpPMqC?fv!_n38b;X87Le8^7zEEF}#y7?M%V?gf4vW1uG$Z*B zQEbH2VU1M&NE~$k3>#0|EAPGWI{@XkR^+AU8liCS3}<(XKG1dMQ{yTGdih-ZKXn4h-BTb#$X9JKG? z!Hk?52XQi2f?4>&KC@X2MG)t|ITA+z!%A>qnt^=bW>6ck*bd;HRT6;h~zHFsoRa;e|4R zV3~vX4YF;Elwdlp-%t-f8fBc#Fdlw2WY~0MH)BH7aD{i^QMYT|idSSDQOv0Bc*f#O z;BaduW)ieP+!Sg`SoHTHFoqt9`l+b-%!1`nzR#h;$@F7cB7R z^HhDQ=YX(jylGLJwdE{Q`HggD(3#~9g}E_-U2iT@b-6=$d|<^7MR_XjJV16LtcljR z1s~KQaBK=VVjlNYKXUNUsTw?tyhI6pX`$97>meFz9yB?P`tn*QQ%70;$VJ+5&4WX? z84G|EL-eXeyD+BrD?|-%9FA%Lydyg8+%{qN5;dF_>k3oZ=lQ#8HAnh$%OJO06h4)Y z3OPXW>U1ocQ`o~&G*$D%J6L8U>`A|HxC&V=w#(@Y zP5c1zdS)xyppK4K4^)#{%|E`xVgU5Z_PeM@0c<=?u0XlI(WR@1C%;(1_uk0IZpAV9u)uxU>U+{a8-4#pWj^| z=YB6xkh$q>IS^T8TVUU&uG8dO%F~KuF&Lh~?w?^OJ&JwNt2NWAc`aN_@ZnJPi7_Y1 z9mnFiIjD2kLW@-{9J&nF!?pU9Xgh-OiO*H_c35{vC2^JF*8(|0Ronx4)ox@~Fbven z_UF4Ru#A4zGIVly!9&K9q^IqXz)yOpPrgsI7S!nn?$Lp9)x%Q}%waiqStL)*InC_! zPa-e!t(*_v@gz){#OMtn>U@IHA=L@I>JiuR!H*n+>CJDHS>4NSKFe7gd20W=duNz4 z_c493suKL@OdtAsN~~u!)g;+09L^k+sFqiz486jDg0% z1%Pi^Q^n-J>#$4_n0Ky@5|32Kg(w_(h}_#0LJ#n3LnvVhvjfOLb-W^k>a-LED9jnXTJKz{O!*sP~5#CDK>O zZ6L^g6cnSL2P?PrCFa5JE{G4L-hpKJ1J--H%HI-G<+2M@1qXDHx@3o|=*_}S;7 z)x^s1b5n6V9rx!#>+`5NM}DfA7w2RW8qg53bmrb=UaveC4%4bVU8~1$5VX z0lX5cm)C0@|G5UxQa>z}{gLwLzx#LpOl8va;5{=07n2Hx9-pd6v$UR04IauvONS!{}u z{sHFV^Z{Brgj(_p@OX`VMum>MA#MR+;nF$MCgcq@KvfSOe+4d)oZu9Y=|XCJAPNz# zly5{25S7$&+c;VcIyB65(_>oCM!z~DP zP~r^k#RoQ(uMp5$?^gAQ+1^skQY~r|Q$Mdi2&K3)97`?E`VCrKz3J?sXSvc6aW37*Fz~&sfY`wKnj4X{WGNBv>4)~tIl-0Z; z3a)1eMe-yy?xr&n7)AT8`?gJj3zdzimrZ>Pj%IJ`R+5el3O{E9^Y}=a*g=yMu?QDqK$6_I%C zg8%-4S_|l(wTmneD>Z^HAEeDgH$y3h0yoeWR&)cb88izYpv6OXRzs-rMDz;}m0-%w z^7(i`boP)Xgi>$x0upSsWITm6tuqP9NmxxMnW5_94mpm{!bwmy9IQ{73+pzKF}M>PA8z#ICBnfw=qbq@U)k+m=B z#N&9_M~O9mzH~C{feF76P^0&@arpR3Psbhn>~5EPK?@dp+7fDuG{fCCyhhMZgt3p% zJE)wfHaApc3emkHo*o4yqN+x?;i7zmHRtnJ2EF5G6QQhEdMoQD z{}XfY`3**v;9QxCI7&oKs6HuUW(##Z-Rn@AnSbW2lPPY*D`W5eM8T)`3>G8U{g>Xg z2-?BTtLfcrllV22RT~g13gAr5j`{+=VdB{<`b$phP|g^Qh@9J@U%<4HLMOKW zBksbhqU=W-M~@Nw4sEQkjkF{ugu3ojtB$lxt=7Ifx8te89Z8b| z@wN;4Vh96N8w1$E=}evmWIbo6QmbIAh6uLKk?vJyM&0{~%331mVp4rxPO3p`_{^pr z%|!5xKeDOcxn*0p{SOz;58d5=Bwp}O#qIxSM*l0{ZS5-mgjD_+Xto&nc`(TdT)mp% z-MNH_*#;ob$xiLZuI8w(TB6d+Ve<%4q`ozkun26aGzb5W-Zkh>Qc|#^(f#O;=w%0W zLW4&jNfliqR`{1{=981DBT?iOKkQ%x5kBpap$aORqc>R%i}HDY6!E2BqrL@YZn;PR zh3Nx#{gg`x2z+oO1@Ovd0qkurPmSFLaa9Kb2h0OUGktFnGy+ZR;*3fvXU{7Xu=BKV zv$H?@G$;S$tU;@kdRlicSA?~-yYS5n#j>;jNX;l-vKc4I=m?`X?QlLbuG6Pqe(Xtz zVEU*#239864ZxHq@6of-k-Z?eb{5=*wq(o&>k<4Jn`?l{b$-Z5NJu65*%e6t&e(o*7tzI6KhkaD)| zkN7J8t?%d)af1h^F4SbJ{hJuClHT<}!>K0p>jiGr~M@g6%da$So#R2Sm(_p*5``*>!9t%{Ej;a?*w;aHS2Ze(p^Bibd3UFR$5ci={=$mOsM+7MK#!5FNloGB8)qy`-G@t zOD2`$Um*+7lfY4!QQg0Jgz&bYO<;SbWTc2SxH($A9FkL*<7%+PV7<$lWqw%a_+>_e zFjbmd*Ic*3*;Lovp@hM*{La>DlY4CA?DjUp;^lzpnfiecqIHqAhAp=|=y{^|yP?^2 zBMWPHp~U^6m|c7sSfS_nQG>$_nTbSqMSPVXjzqakWiic|OD=&42fpWB&#v8WHTC&+(a=CRQAp4$6AJE9}UH*LPIf8)?=qjruRg`$vt3It~@}JIjeOhhqsR zyQ@8n3{qw#Zs*koJ0FQ1D{rtLE8R!_q&XJUk)e2(^Pobj*^*gNSZpT(-#=rSX7%=r z{e@JWF~_MHqa`Wemmd>&3>&GNi?Swj!VIWjNA~02rx=~|xf{pCpwKfmsw-A^=xLUOcmLDe@#fl4RNZ+q z?&*!RQcy6-Kc;c|?B$T73x_{=#yFmYOP|#^ZSy2rF`uQ^Wq@2Wl~icmF`k`xP0;+z z6k0wvzKO~>iDINSIpv{G2&?WV)~+eE<&f%B^L4HmIZ7s{?)W6c@l@$Zz%J88=N#AG z#rd5ket6h}<#<@dz{z%CM&7|?D29hDPeNa3m*p>ApMI+IC`?VE`9ZB zOk}YR4qxTaO5?_!PVJz3MOpsydv`WhEMC^SR*FxXZWs#@JHyoLZP6JaoWzx8kP;#F zyk`cb=g?`*F0T@mrIdzUem)!z0Q2-F7^np=K<^P=cMTtw7x}J6qI&z}V!zUAU^kmq zkQt}3U9adYFZrTxUy_?v>8|Pcp5q%L$@vN9s56-l8eqQnO~RELYIi8@6MOzkxaKFz z=4y7a&qLec$C?fh^}j-Jm;k9W!>l)Y^vW&Mdj)$;*WM$VU}2|8O1pD z)r-zz@e{5xPP3N1+15<`F{=xD{PFnX70eL<#q78@7~ys-K_-+f(}cb5q`$cS1rFL@ zx}OsLK5ToWFwvTVj|&EJe-X3Y&bVma8CpFQ9YZ?VNg}L8EBdu)8SDGvq?>)`IWlG+ zTo`*U_IgsHG}MH2kxXBpY+N>T{XITSLbvC+(A_@Wq}vb^=M0NudUhGU;-)SKLb5c$@C zfMbd$4^tP?&cER2u33kiQ8)*(qz(K}7c0v8XTR+x``tq_r#^+@gV=mR;oPNiYW z-9eK3P(;A}+G#h9z!WoP%QgnPs?LY=J#e#^3}fEW4|eQ)bE^Pl{lYj&I}2mNcdBPL z{zDYDA$M_}Qzbejp~DHrolyXu)qI-{dBJG^aKyhRTo-)hCClX{GO!kA^d zxZnFM#@N-POLy-1J45$b1CR_dIUrElA^e0@2p%-qU4Ax;#gD_Yma#ZDASRRMz#0up zKP|WQEuv?d3zlSG*%RlPO1$l2p)Y1r?V8d%HN3dEmuhSNInyJp-Z?=qYZO*r0nxQX zAIdmYN~FU-tnIn_p*S~G^U?6Y=>r`6oeH%XiD8_skVSbBhfMm3+4a{Y6X}KSfjP^~ z{m8s~jbY+T-O|Sqx3Q;P>5tviCyf8W$X;QN1cN7=fG{_B}%(n>gNwPG^1&SMYX=9M!ZQRG!@k_m`xLuEEXkD0cAvN-zS%@P7Ujc|B zlT+9wwn3m%Fb%``p*95%TG8XuSb)g4*EU~dg_F+<0G$E}YjSlyfGgdCiFXk|?7(4g zJs4p3#1*@o8#L-5-lqi6*`R1Z`k&kU18j*@#t0yHz$!*H1g;KMS~q>GXwO~HL*SDbL(Ad5-QjXKR5N&s@F3c@;0w(jkGD0$^L|>> zMitl|{UjDte0$11b^ZRitNXm_yx0qa>|0MV6STRv>!iM2$Ve_Ih*EkI8T&fiOf$Ra zXh^*(M~I!`n>Rn+C%2&O|0)QTracYMJJ%;`;VO~?-z_N%A}3L=TGJ58X3Lx z{j1V>9EWfkVtSFyR}RBzZ>qoIV&Z?(98nR~HsBnYrjLz1^ia8lvdlC@TI{wib}m)y z>*ge!&J~Ltw>XZOxOy_w0qe2bMTVTGv%tC#;w)BZP&}9J`T96$p3-te>>r2oNuzY*i#-4~l3R+_}kO`@nt~}uyRXMZXyoaM-VDM5L z9hNVgRP8<*+Yo{{VsXoLz&O*5>Tr3ln9|x86R(9jqf)}aI+wkPgg-0`4_g|C*`Te) z(aVPgup89$Ze~GZsCIPYlE{{oPM%IkM-Vh_|Z+Fj9U4)f0e%HEcjX^cdu~ zKflE^k=wq{$2zuc>^4Y>v2anTVpXlw7KyEO4PQI{zVg&)K&ryafFOCAT(+~BzSjvF z*(Uen^h!!*o8=0)_GO*h!4>*(LEd}TppC4asMVJeX>IGiUyWa(HphR@=TRH?o5OXC z4o&nHqE0nqy}bhs$1Fl@QrRJbu2KhA${VPib@f!%LhDizxzyxU9ksflwv=yUF0U6! zl~evswDym{+pX_@oW}I+*lfwm_;c@QhZ*;J=M#gH8pU*;!uA@%J~NZ#uu@W7!%Rrt zVHQ5M!yi7b8&Mb87*QvqNQoayC0dJ35_S5u`_2YTOD?LSB%wEZu-90fYKY)N|z#Cjk_`;3;gi)rVIURYC+TAjq1wbI{@>Q8T zH&>tVLivq8(TrJEGgZ-Liqzh`Y9sE_)7;%}zSi1Qvon(zX|J!7D$M}6aoPWb=5q(p z(6MMsN~Y^?xUQcJhaKg&sB<()=tT&KI=XdM(9Om2TL=*4$S}k4T~O1k%*AotLnw_t z+n76~qjEp#UFR9u!yj=Y7V;*Jse`I8jw98>Mh&i3Y0Ekw&#MumP4uK>Cp8!WQrDpG zEb?RG9D|08Zrww=+TI|c0O(!QpH0pfcY^o{DNEDY`CRv@iP49eSe`>c8WzWbrv$$^=8;faT^DI{Xa=cW_;izOUa9{5 z>6M?@b>QZD`jhTusQI&dmREHIHO|0G<4_7)X8)gydduwpWKnOK{nl>3wcCem?e<$v z&X$w2<>YMn_CL6IZTa?pa&_7A?f>jXzICPj(S?2MO1pKX-9mD6Y~l7>xc#?Li7fzg3&7k0Ft-5Ae;`UrfL2JxA2z)?1?|?>h%}DaK4TSaWzc_8 ztpIkO#%n5W7r4*sG`~`%W4m_k^F;dN)W;FhaAzPtPhZgZYk+=J*i{h=gk6ts3cFqg z#M=n<#a;jJiXlTZ@_mc7Qe8BL8j=QT%vA?2)rz&N?#{A!hewnvJ6EgG&CcA{nK1hh z@r%&pxxHMIyl#h6dHil*#lpuOPp~sgTaG(wfN~!ZPv%DUFt=y+`N=On-4{w_Hu;+@ z)R+UqS4fr>=B&Z%_MMjfvhQJym&orB#Cx%~s1Jca#aS%bsWi!8sn@Jw4YMR=0_R&K zMK++zuM_{KGj#$;EPeYzEWSn}g#t3W7PZiu(o)|(!BQs%2S}akPkP2m5%w1_M6>w6 z2~9o!{;e4iR3@(5fM$iIDhU9^ETCrf-Q)E7+FI!f)nLwUP@o{DlPuiyH>s&w7%mz4 zH>s&0I8c__ANmgc1p%^8fm&4%$VB@7c?C%#4Z3}WoLeohj_7N&_^v}xe5=ggbh)Z| zlK^>Ju^l!E+7wdvS0S$No;ON8C<`U%7w)?Gb@L`7Kr>3{Z+cU9!Qb{c4Cr^2b4E4ib+GTA+Lsm4A`B>lCX6KpVrtZOtQWnpY2mFc5E4S4`pf4}b;4iFZ z+?U-y@r&JF3*dD)^?pzdH!&@z;4!SSuykm59yLPkp;6qOaun>#dqi$KWaT} zO&C4(1^)5(3D6hW)c;$#um5|>*8cPJe*eC{|C^=9vJC9P*SQo`ib~x193FJQFsO7m+6?#tbBdguP4jJ+x50p0EpLBHfrJoM2z5LnIffumVp7RuCq%-0vVK*Bi(*A~q z@@bC_Ee&;>ndszAVr)a)AJ(1uJBhK5Xj%vFPAQMX9;sFxy7Ng|cX~^-g-z7Nw#zIA zy=+cJsuAQq8GiOo8i`pi%u zLhvpZjQ7reaOkcr#xkpChO9nQvkkCxh|QRIhjJp*>1m{2*+FN-MStens-=D{gR(1v zAW@<-9N{lgnRC1_K8DZg$TW1>CF1_u*z_`>MeJ3{oL?z$%;JfufFn#?yN|OCHc8;` zz9p&S!&Ie8<3GloKJuVUt|O7&vZOsF`O%U3^C4IfGs%SoY0JS|sqLj_ToQG4F1f#5 zFYCbZzXGXBeonQKJ$>Abf-X`w|FnynVAnUV_B>n8#Ji*sT1s8&=wJD7HabCkKZm9H zd5zwFZ8y`cHgApdHwL|B8~?e@Y^}lXH@hv{*s_fu9fVu9v1J=uwz1{c{i6=_*1oZ| zZ*1)wTl>b=zOjWBY~dSQn9L@;w{`FSr`@{=N*c@)!6K5)W{!6`7qPbP$0K-#IiP|Q z0VC{P{$sqU#H7>%_SI3blR1T%N7fM^N}kk(*&d;bw6C&#HY;mzLWG&|9jYqIe=NL1 z&!E|vBGoYApZ>V)_G$;{wvV`e>0^2zbu6LM_Oe+`fib~ z$DOKJ(n+QP2(m2VL}%Av&Kfz?9Yds}2Kkp>z|^`#Q`XTwsFa@3uaNmcu?-NdLU6bn z{87~DdzA`${I1^wux`+V0jY~^?PR_dY#!M)S<549zPw=x-E!7was2w#iLv{C$p`N| zqlYN#=OtNJM;S%*^3O^QicwBgA^7iAsGu}H{UvSLF06bnI=2l@I^Q}WjY7YgRDsPp zj9KSOqi(d0ZLEVf>Q%@6${P5;{z>0XR%?G$Fw&s1tgWZ%hs5;hSB}+w@S~|O7!m)x zdaB^sH1&*mxh`Qm#f^_Y?P@7}Uf}NHnC?}taa}^pJ@>=9LWnts{?huD^>WqtNw-50 zBvysNxhtyASJwZ!0RJ`W#mv~>i_RhdC*Th_9}xPVYRp2AslZ5Sek(kSP)7|SmaGt~ za!61VDxZEa{fE_s-KxLW!$unYMw&L&rim2M5PuwqxD_KG`g3E_rOs`J&@hUW7&7~7 z;?fA0Zw{YR>s*g|XOGkj`us?L-T)jCxyRs4@CE4D)0q*`_Vv{(pda{RIE za?ZZlBOD=0S{0_cc&5iE_m4ic)fJz*CVnl;EBj_x$$bZ0NSF&(Zs)k2#*z;Ca)&UQ z&P;}}Sqg@JgDAJ8@6YK>8Gn|y3oYt;@%noXpZ-NcAEN{2k@jkOhD)e|lFLvDelBTj z{B>6S2OqvHPA1)X$p@G6FPuGidF;_b1>JtK+=raJ0)k4SEk=IVRO>5^&bw^`Ea5wI zE*&vrVq8ZC&=qc*(+?$>Z`6>FznzIvFG-)r5_Vhg>Z#N=T|dvtJl?N9pT3B2s}reB zoikeZwn7=^rUq%I98_reR*g2jt^cOlxV^GYZI7EOfrXwzrjKOg3RqaCO zpmE2R?onG83+KACO`^xBOErVzvlGTHX$>?u<@wwpd4hLO)w9>8w$t)TAv){#4u-5> zzId7Ae&fM0#)}O#oR?G2tpz^@rRpE$5)Kzz52ZHInYrn;%I?!QXK-^fck}q@TN^cC z6e48T%3mX+P~r3RL39>FabHh8HmkYix{8Q8VZ8kAZNG94?~HvOv-3M0ruSr+YZfkf z>%I=P63Zi$tcSKLISkf!IGm|cmX#KmT+LpOhV4h26zRZ%n7JMyjoe?GYkQ2P^rpYc zDvWJa_Z*50QQ-8G+n(bp*&{W#?z~;7f(ZTSrW!wNeaL(XT_%r%(Ox=GS<|A0(^*e; zRNyPW_Ljr6UdP>=)Mi$-zI)jpiEK;0<_o^1)E zse3N;#^^qMqYC77@gQzI%sydC<^s_+qe?hZN=YQvTf3#OuUiN4>6a);*L#n%9<1}! zr(M5imvSI~&oHl2lv;Ghxz@V4YnF~!{z8j)iy{thQ#siHW2NPmKMGFGml{-SODk4i z)#2kU)95iy<(N4^n^@;4&?9!w)%e2eu*kamz3(xE?NGb0DP!XCcW6_@WJlD1-&3ChX4MDRjjE(^It? zrPn6bT2y^{ot;f7i~YfiZg%z~<)**rV%`z0WvzEozeH76^w!PL#?#8a8PqMiKOdr0 z6q%uRi9Sku^jbdCi`|O!qU&}?E;32K2tZ`1c3qnZ%S~TTY7s*xW9=_Y-I$=Bnhu>Z z>cc~c7gy+ra40@%y<@N&(KFaZRT*C*FK{*X2NpS5j!0(5_0J@=QnwSm)CdvYND=z+ zsC+6{i($vvQP+EiBLxz@iuU!EjRA6|vX&Y?U0-{U|#hy<% z?z`YXk(g&uzOCI?!#-6dw~yoLp05yBM#FsM>5E;GVhY?-J*!1 zbNPMP?Agk`?EkO5?~ZG7%i4{iq97pBr9=fmnkZFjR0Kq%2m;a)6%mmpy%-V%0i_BE zNRcQ-q=w!h(v>1jy7b-?N(iKIU+24X@0>H^IdjgOGvA%>@&~`bCV8{p{qDW?UTZzi zvqnudW~iLlBNPrevRttMFa%4tFbuZ*xdaxRYwdzSF{ZM-OC&q{fmuY`;~1^>!OK=8L^QAD!Ex$+^fI8dU>+6O zdqNp_r!LW)&%_s*q#=#&(x|g?o@&n3&~;c;m`rc=5$h8wiG_E+ZiK+}IwsX!yug~J zfN+XV*qhfjhbQ=JKizZd*KT_nA@~h0Sk+CUN_MX%-tH1{ZiC7vTOQ5-WXBglefHj3 zuef79m&`XVduNe%fMAJeU+Ag6N~`pTB@~W;I^+62g9mHPT{U9ocuQM?1R3uUVTl8W zn-@zjiqs!GCkuNXT>ypC64cXbnA(tcoiYcY#*Ha0wvV^2e`XGpRl9S9rk`*BrHR7S zz-%e)IE@j{p`wD+Nl(*^v_cX^(u%wh0T7=HIQK#O*J=C4qn|28dJIgDSqA$~MW zvPG=etly*Ben%y^+Vu1D1X8x|U$lO{pW97Rk+y{O8~H?w;edER12^S%%XI7O7wygc ze^GVG(Jj3zhA$7?1wD|1&!XEm6pu8KLld&`Y3Sw?a189bCi{PARl46&2IsHuEyn~J z=k_Uhq>lt?WHO3H5rg_G%M2M$ZpSECa`4m}0;kyq(c9LE3SU=MQhT1qG?N>apr)D6 zU&31wC4$553Hw`ci>tkx1SVtty;YSRSZ;*`=T#kMzya*`P3d)c|VEcDLOOX#@JK_t~m)`EL&LCG~X1-yT zf(byOPCMagpjiA1SG-A%1rWY~ zoZ(BP-2>DH6Xd%{ajYfLL>BbObHPDgg=5-ExZ zpdbnufWY#6LrkJ~s;OJLpUw#tF(V(``L1R-1s;k`BOhqr1?@-97*Tq^V&((^XN?B~ zfO5kC1a6oe#G#K2qne)oxWSCHegxZK1_TBWzz?Pz3Ck=PCm4B3S4M@~)y;Mt+DZ-COa;m2*y$BGBRgM%^T zgJPJ;z9k554FJS0H?7F+f-=Y8RTp`DGHJb z|1*bsT0xUS!qj5)mK~8>_VHw3F`y$9bN|sAMq@U$w=X~j0w^jQZ;`7*4zSxbsjc^Q0Nw^9&o!mvyGW&72kH^Kkc+uO#fX|%=%Rh`d49Y z1JtkX9Q|vQRt}=Xy1)$GGz=8|` zO6iHSd>7p2cuQ{(xPTciuKupzowW;^x$<4YTM}7k3;(VLZUm@-`yqi!&kw1hlFHEp zTQnfzZ4KFei3Ut!8yGtT1C+pfk?W@b4;2>&ntqs*N#V2x6ueKgQ|=1`3f>ZGB&)NLoM1 zH1P|6qlQplIlMHIgi#+4)`ysj$RpO=zL(9s86%fbEEfpi<>$6P{-a&`$8A1qcuw{k z1)mtz(0WUXRx-A?c~pox-%^kamd_L9Ur_-?F_CyZ7}zim(J{)DgbU4zvk3OlkT)FW z6>N?HdGA{dP9UNl;RZ=hlYz&t%m+-1I0bjADDWZbVp|{2Cvp~5Xm+Y+e2d6D#Z7v({pr(1fdj{c*H`Nk&-B2} z(F-SL%08GrDzAPgVQK~)z6Lc)F^_0%N=FwXBrcQyb!ma>OKXL@AQtn$E07ne5lhsw zZE(RKmMi~U*f>DVV{GQpL}uk14t z=`3ynJ}bRm-hEr?lg zM^33_{gku$Qzoc~A~W)lIdXQ9A$=S$+dO$cz1UBwkW(8s$>|}0KbobK7C^b`+4K{3 z++eExWK#TAjDsVL&dDDU8T1YqG2jdnF0vA}<42fZvyjq`y57_4=saqGmRl z#yA`QzIf$vK0GB*L1lcP(B%C=C$LW4JD#K}c)5OMHgW{O~-oPlaUx;9ie% z0yQ*3NSAg&wNTZ?jh|EAX2ZYUO1( zeO5%DYx&FL6ueY}&QIYGEFDH9MVvwE*w8MB&Dh=Yb~*OVv)aLRsDG_tUh%6}`(*`a z^Vnm}x7De)g2>~SxX8?g`oM~RM!ATy^m7qonoFbuk}l&_GOa|{ytH|zc1!E&M!v|l z*kehys`Nw8YhP*~0-V?1QZ@Q--%HfPpV0eOY1wA?ePeZqCuE}0Mn^X~|@FM`l zAKBgmoIWCvpL(!jl+V(BKnUVo<`fN)ib8WOm86E{ze~xkW}XZ8UCB3{LKNZ1|CSs$ zU>bgyAOF4o`+FMmkLoyc|2h!l*U==V=VORwD#!wEC8xgG9iC^ClqM|$qF&!Loe~WF zJ#74cYvKNNT^%a%zpL@)-r*F^@B#gRygS0(knv+(yP(;pyP#^I!sj#Olp?V1&44(L zvN2wWtl>Xj>n{8mW&pRd6;xwPo-;?*o&uu9?Lhe#ueiVctW76Of5{3dL=0ma)Gh<| z)5HEiyj6jLjDH9$NM&F@Po$<0r3zGd8e`VbrHU!U*Q40yR>*arT+Zl&Fv3+y%=Q>^ zwZKI3=3g%3`yY6fSl4Qf?xk7vq~}@B9qA_xTtub0b$i~$I?BtqC?#cg8l=~pyHzL< zXIRzF10*sZblSaUY4uX3f94t3fY!n_mRZrI7g-p+|APF6-|363ICSrd-+>M8%(WZq z)B&~kM6Z~vRDd0#`!b<1tE|IMLV$eKO#AH(h7jahNCk{2EVv7L?;$*HOw62wk&^BD zD9z2t`NZo41MeS3GRZ(-+vhD}0L6~6M23}9`%`!Tfel77>tdbs&NCoo9PK8bW}R6& zu%$_x+uXqZ@#41U{RE1J;nEg~Sqz^~aKVBnRfFETSKz&{m$ibLe40{pm;3FhGf^lvaM71eK*QWTn5?hH=lWNWCkQBG~ z8QGsrd!@mI&-WCsJ<ou#(A1=>ce<6$_1NTTFz_~RZaI`9o_VtV=;;p+u)R#4*2R}z_$ zR$MopzpZm<%~wS}?x%KsvWa@S%JTQ+lW67VU^be9yC1(x0fw=uGyf2d`;&_}_$ zo%haJ;p4I}X>p>yuVFc|MpHpAl>{ju7!ohK+by={5^R&NxWw8_TFXBfzW&hsv|&+W zyUc@m(#N&?qsK~Frnp;kEkP~?ugObRoyO@FJhqOac9rH zDbaLcVhQz_df7SS?HtB)`wsw$f6CbLCa0-LCVVCM?)qtaF{?YD)LYfVfZ(!^F(K_17V=SSaI`+|OkaOdHW-+%ej)AA z`5qDt)*0%Y%a8SQo9Wq)Iea?peKA{xa(JD13Fa=fnciKyD&b{0GRB};Q%oRyZ{ zebU;i%l4pp{KJuoSS1@rR4#JKasnL&KEX5b#FnRBli)Q$cTSu6q0-sVTX7FVTK%o< zPu7md+h%?0Y{|Xv?U~?+$ro$H@C;D~Q1tMtBVxVhHiwb*C+tEpAF=h>yGXyYki^#T zF%_l;2Tl7?xw^gzi8&gmR!->}U5gdvr8Gf+xcuB3Id6H`P(0;G_(Xc815RQB?bH60 zB!OMj>V_2E>#$WAQcnu(t)Z(;VKni${sr6oks1_p;H7#K3)Y^ZGlUzWG|AhOxswf} zkTrlH$`nxvh*^CDl2)3oQ45$uyP#=03^!09uo%b+3`&83;#j8-m|2SpOKM>@r((g&Z0=UtaB;?>=b*8Y&n{a4bPcnuY~N&0 z5ArlCy9WV>cv{r!k$v*u0oGaR=UT zWBU3E$LYQx%vdav70!Yy`3O5&M5kOktBcE$$)7haltAVBvamc$yri^2PR5Ky8_(9;`ymf*XoChw5G>|}f81sVCt!UI>A5VF@idmcESV5EYWS5T^ zkON+U{1!X)5p|Fh&NG*4MvS4Z#aM+67&c+@1A?&W`V;d7zXPaC^Q%x&pU^4ItJp!`5kbA!53=l!>Qui z$~0XoW$|0Vw98%<#opAZl&?Gx99#V=fe%%~!04W7P}=7*Kr+6A(y2K0KK9OuLdF;y zi+;7^`>I#? z+w5wCd7=m31)tC555M%RP1X?4lFkqmf!l^kW2=jZ#_r%IBz>jXdu{U%1kEC0`NKEz zGaCD7g+}F*+2Nn!TLy27A9p%_hicvTci8+?_;c1%Jc76fWs@PEizYb!f)DP##^pn^3v#JnV`P|Y zb%LtZ&cxGXBnx=Ib!Ofd^^anKf7=Fogs8`?0f(d_F>*6z2c`%&{JSQQW8v>`CjQ5u zo4MIY%sj*Pm9#|JMO=ZT8xOsgjO&Pu@i&$`^d2WacXK%`HZ{6zi7gAJp-xb0c0u%; zAJpQ-eBg#&$zL!H%!VJ%Q6bBr=P`OPx_?XlC{2Q zTVJy92LP5Fk+sbgfJX=%Q$`_VPsq518Q@c%-36_pC{+&5Hz~Of!0iNTJd|x) ztNU-i6hIWv3awH+)OJBYOk;B~C@E~y_dEsp5vUD|X?8_n^K$@a_7!pqKmb9*{5uCrZtT8!_a|==MnDmm+?JQ)sZ8c_%bbMKq(W3Cq+e=BAFR)9yN+-hS zh>Xy-E+b($+1il8-6L8gD!yXPNwhq!>_Elhe7D2bI2w7ZQX`G*yR@@Rg4`*$9x^K^ zS$S_`7w&ar5F*qJ?V>Ee`aZ2BbMc0)PVtZ@;P=$-k^)n!BCX%Yt(;%%@x_8v2d zWOvUWoZ$>2a^LHTX6}v?Y>jBtOgOE6{92C@H{lm_f^nN8zLw{iV4Vx zLxJxXR<-kOS2`|`7mGU?y&H}?`d!Q8(}|Z5A|3o!Zb4$p0LqELY; z8apK#L=1wYNd{s;7BD}`KHQs8zxWB6`cYQyLoVGmc6Z#zb4w!xkFwQovnIj#uf^UE zff`&Yuz$9#%MRF!{_ZaXQ7kP!13Ma=Wxo+(T|Yt}BKgE3KW=h4*w%%;Ir(Z%MO5m( zuP^oP58H4R<8_7@S8A$EP*Zi?8k`*yP<>2 zZ!j(r=FUNLTAkZBfB6Y*R)|&Yf?_te6UyAy0UNk43{V~=o1~IQyGI9!HIRa^#^)q! zoP#aN-U)Zbo+i7NU_h(h#UXa0=WR)}u6ci#@yqwOe8w_@jyQ(u>Hv0a=|vKOrU@@d zh{Re?Lf@eYYD5!LGgp@`=lPX$baAPX$qjt2>y52v@?-A@A96mXU8dJ^50hZ_kMn@BydIYdCzIQJD-SlSQY=pR14!&Hd41ue1I!mLp+5;5l}9=o8i3xG3=$#lk4 zY^~Oh_Lt!GI~1rUpoijf)8<(H{Kh#B_0mRZ8}&E)V=YP1)G4TY8N5S>2vYGE^zG zNl%-Fggwvt#aFQUb)JKz(dl9D!Z0d@nV!CQ;Uk6C&*feGMY$Kd>vCwD;s2(j);nMah1w-eYA&DG^@|X3HkunDITe?_rQkLqCiSV2@-}?1k1786MZu{o}_%vH&@2H z9A}ulQi}_>Y{j1)&FA~5cGPvbV*JT3&Uw~fd{Sa2`NYv}BrLWi2B`obf7t! zY?!R3f%HKZmMpbkhiYM5CvnI+3^Pfh>r|0J*PXcOnPL<7agTfM*|UMSUYZ0%C?+~H zSj#1d=t__li4ek2J-7h8OoyYr)m_c@Xa`ke<|+TW2tqv)E-xJ*^5t&5t#Ff*(}64c z?gJ^O3~*d&t9;ro|D5OHx{8-2he*Ln9(B7{Ot|^E8J|O+dsghINq)mzW^NZO!oP0J zozI)0At5j@Gt$)J3WlJltduy&MU{$^kb~~jFf6Rri^{ZPv)d|N*z}vRQ9V|wd)(s9 zjD@@1o8*uwXU0z)hRrV8um6<(&yNz$Qu`I5gOEi5^+*nPjcb@5l8n@Q)DxD4AqA+7 z`rQM%HtPE;#1)tVE~Q3(dY!vpMtBa)Qn{=_Ig*U+9@oqcA&n?ui_7>cGOdIyWL9iO zG;jK*RKU|?ueMZQe3PgcX|KQbCs|f95gTNNoo&$eF1N1{8?>xR6zESV_85^bj0+SEerc5m6qmo1gwg9dQIFog6zm(gC zv@&o>vmIAC-R&CCN5Y-TZzd&|GbIz&RR#9D*s$ZG9&ve4GswV2_6 zW%ySvU!M!Ntk&Dld~KKf($&JtYH1!(zsc7vZ1LogN5u3DyaG5$-gx<=d?vaGau2pG zxeFSMp-jWbVu{tlf7kRoQ?9?p_66`;%td!|+}HK0SYr%M!-Tik@;n@KPG4R>=l(@p z@p%ph8eeWV`oNPko(7P64r`D@Q|$5Y(waR<7#Q!Xe;d1p!J5FEgbIQkslEU|N!9vQ zK_%&2X0ob>=!e^w#BlVx@XH5w1kqnIh}z@!VQ3{b_*Lvy;F2magdcZKp>neA(qmlY zT(glju?GmVmju)diTNS9&uwZmFi6z!NIZpWy#10qwRY}^Wk7mOsODmcENy|}L#o;9 z0A+=+olH(Jbqp9A4KP%iT;>2+!d@oCN2*d_KXAdJ($IW0nYuaWZ^5%Jg-w5S=*EFt)#5CIEX%P{dQ^`BY z31%|Ak}M)RQ(`SX<_1bYT@tq*3k3a<3Hx8WmhiH6e+)$vf(KH;WrhGDauyx9xFR-S zt`P&ocXDSN$ga2>=Ls$Ka#}CUOYgMyTCCi^Bmd#J`QyoxpTQTwmq z9e!1q<8d3ZsN0n&(Kkz{1Sl(9fi1c4B8%vhfQ0$ZHdpGuOT*bM%OQ#W>H`YRdxSVGZr_FfFNpidc&9qqhlY-2(j4O&EVYP z*Zz~bT?IaOD@txwvP{{7g3p=QsXj7T^(DDYKmvA9_yGT+Hsvc-jVG*W{hya^*rv_! zG@bTVx>Vi0Qdr?%Qdu0=Les6MJfL>N)m}#)pgAFQ;p3S*oH8U6TXaN!34nB z#x$tAlsE}j`Uf83yXf-2<;g~`+&OyE*e1%u+;<`TypqZW$!^?$Z2K`Zj zivZ0uRQHeJnf@&p^%s7Zhdjfu6k&W5#Y=F90_RWB+%3;5<$POJV#mW_NQerUdaQQ3 zq6O@?1FLHfOynk~D(xHiHbO8_t2PN^b*BL*?t)Z&F6mBPO(xqGsCL<&geP#_IhJ_J z3=A0G=ZI4Tvxy+>V+3=(`0G8Q?JXi|0noVxcbALP*G_g&hf(@R4`x%SNv^%lZD*p9 zM;>Cv< zLxA7r12z42n4ID9E%>aN|nVDB~RZ7$1f#FHk@w$n`~3M!6eWQeOPf>?HB ziKc@LM+p@*20})3Bbv$B7bqegcYjCeo}o19$`AoLH$?;t9p3y8VYzS7OBwsUI z)|Drl!*5Uz`>V=_=LHvEJnECb*r`NIx`P_mDszuVf{LkXXcC_jCPk@VOM?x240Bj55*Xy3Pj%A*DbnP37d zV({Kb@6?JkhnF{|@g=B6M`JLN9!uG|0zC~+#2QvPOX^X9P$8VGh|$9qarPu2a-WnM*9 zEd~Llb{z2|k^y7gKJciMa>A%O1V=SKT)EXtVT#k^OV$!OF)?_k(c%UDiBq3%*whB> zuZHG?jjx6kq5UZ0T_o*sVzO1n{MvT7jQ-tV@$)NLDe2rblKXH`ESp=)saUpaUnTny z@^Fd5p)vbo+9jr4cW$ES7eYdC=fSQV>?^8`;{9XdG~0)Mj9~wTbI%V^??3v?M%cjU zSSXsP3^(n7Gp6MFF6VE@#I#d#nmZ58r#W>TyyTFWb<5>+DV>C7MQ@R?8AQ7{4o_Lp z_Zb-+ru{4ud?iCDRO9$1kPAOXIU6o!OJsweD8;gb)a#N=abD%>6T~^1ye^vo$GH1; zau=w@8T%9)yFlWQhxX4;KmtkH?+M7-^YO5K?pHobD(*iz3uk=Xoww4J`|b9c>bLc{ zwYal?5f!5Ub(xcYLMw$`gPfCu83;wmE`HZ%0?tV0X~JIVi);QUK%WVS0sedBnSL`h z>PM-Ef2I9@65ZhRoP!z+K`c+NRv!KAwbQQoJ$C4PQ`f8^gnBjL%T?!LDQyCqv>H|bQr zukEg03BH1BO#o^%Lj5AhFpWe-jzOG6bPlF;y6auPz41hO7sSMHY(X3EC0*kX(bcLd zPAzXJ8tM?ZvsEV-P>1Q?(umO{=!qyv5F#D+1>7VAxiPF{i=W3?bxL0eecSA)ow;Ay z`!cp*+%AN8WKOxB=QL~F>@w8{lY4bH%nF7GTC!}h77CfeEDHNxmaWJlPk${E&NkO6 ztFA7MSi#Sz##z63UGQniu@%VFML20zSC{pO2~<{=Mz5^6Sy?2yom-QY6>0V0OPqQ8 ze^kln#ONQjyjygQSt+4^Sv(P4!at(Q&inA?{##sQlL^PgCE^Bp;40%!FnQ#lTJW8< z99^Sb(1fK(qO-Dm(iFU+bUT2TrTM05(fO|nxAeJJiz6b4T~>-aZ=7-Zg5Azh+0}VL z#CXl@a&Bnmgc$8GIcy1fj7S~j7y$rNm}Kv-Cvgn3@lFpnwaT(5>*Lt`Rwzw)vBO@z z&1LGAyPy{d`5v7|SAxRVRwie-f(->#9^^VFTgzIJw<$_^jD(SSM)TIqKH^J~;;@p* zn?L9~XsNGD7eu2*QIo6I>qqv!;)f4oZ=n9kS-Uq-djqv+qyFBS@2!iyb+NZD_SVJk zJ`U~~kUaykXF&E0$esb&^H~3x@WI}GvA19B?H7Cd#om6gw_p7E`$dM53=Tr#hn}tK zRcgaS3YW<3u^79rw}|~5#IpI3+z%OP&r+{ncc`$E%1YUAwRa_+7Mc|5^?jBVX*HmF zp@%>Evl|jnw`S>g`0s+u93L`mvvgo-s6-#Yop+xO3Cuq)d-U+su_t|nCChZFB(2Un zSRgILaHyZ8)it3lL)!YfqabatN%01~6n zFW8b7G1OO^HXJU2-!L1_rI92N05Vy18w&wM?Eu*X!ZaA$xdSG1&H~bPq|?a&O!?Km z?LHMmAhJ$v4!L2Eq5_DLfdKP1^d^8v2EPMFr5ervpg4pe6j|V+&U+W#8`J;bDb;mC zz~j&l`h*TGku%L-<@w z*C-+!+cNGSaPpx3#wv|6hmI=!5rI4@`XZtw$-Gw-(OfN#(kP&MWHK+^VU%UwdE;6Z zL=J>S1JY$RG8Dk@(O2M!60hOEz4g*3bGBR5A#0n`o&Jt#$nhyArlO2FU=* zf%>@iw+xzuH^eK1f(h5yLjl4@02V_!#VfMz#KH1`c`V5B?N!VZ?jTF^`Ad=yTDbr3Kj;%V*FEk(bIXi@7^A~cHF?~R)Nqmu|oZz z|Kt9#u{Z@WtX_S!PJ#NrR*BGj`s;k-{evx}^ zsv+6qd$HE&^#{PMv=TC$Cf4vks|J>IBt zas)IAh$wuG7-@W+MK3^ghU*5G$>2C38h*F-muPl-|NG;WrT^$L^(=XgnHnaE?Sk&I z?SeXTghqW_tgG0@1YYDUSw1mI#q<}b)t$9JrNvJtKB8y0xoYi|=tUOovj#hG>7O;!3%QydP_&9KlitK=u4rQ+W?$JR^b27&vB_WI zqeTI>BMyue{x+Mob+U_}H)ZMHjEgEa@c=!4mUgS6+x3w+Iesa_1Yr@0aNyji-EmR0 zrX9B{vls`;xWt7f%M2`yufsn}OPF7f3uR{d8rl;z(K06mVX>BpZl5tRg|Y^+7u+zHN(~P~p_>q7|~1 zZ{wih(Ir*M1U_O#p~lLP&d8aKq++zR z3%sHNm+EiYf8oUj<>-WiW!F;H0n3=*phRJiF8ghK}V06Ds!BqYA(64 zk>y|npEjh^NOV+hUaQU=_R=-z)BZSDGjl#fL?3!hrL^Jf&@f`HI>K(pnh=Ilt0yYI zg#^IQysr*O`qc2=72f`s{b(jv!qF*k?2CP>mzsO~YG~&-+Gz+oYXhW;_$PdE0w3j# z%oBWlYo^@Lr_h%P_7mA+m$2v%o7I)dpf{>5pNq6bhg$8=-3<1=G#!&8*ZZ1uK=6)$ z>NC#Dq>(lIk&vO`Dw(x4iI##BQBLfJ^_nWG;u;S>5F_$U&g6_BEM?xZ;bcN2U-ei3 zs`Se-xythG!V;fSd#;HlkVoYDV7S$KnZA*W72SMq8vNqwc}om!{etgqMSYP$;QSpr z_Cf9K9YnKmZAZh7cIG-qNDDQ8oI0j2$COELm^}`;%lU2XI=Bj&r zOADH_vm!B`I=P6Xf!n7*!<4=>_77j8mA)BR;VnC^T%Y~)Td`A|!ajEjCqa0k?LobV zad3?AqX*wU`kj_Ka3@%N`^#nSPhT7Y(-cq7y3zgf48(-eTqNr>S z_(l&E<+D6KOrw1NK1mcuF7X>7UhC!cAVD(3q8wS`&rh+O11TQ9XanyDg;n@Yx6?t3 zXnH2qKQud_c!xg>?zlyvZQG&j8O#@$&#z@9Bx~u+8mCORwO9_y6!oHBG`l0~J!AZe z7`;->s@`Fz>r57trSZ0_z^kL=VB7EH`MYT)!nu$!HwE-c$;&iNEl6 zDBSnWH<@9nX{n7;V_f}peO~n@+xuC7GMSPXXZnu2{w1_x=Y`tNv)J#@_Y*^XPSZ&us6R?ahI`Ij}be{=b_8;N5}$1u9?+ AZ~y=R literal 0 HcmV?d00001 diff --git a/documentation/design-docs/eventcounters.md b/documentation/design-docs/eventcounters.md new file mode 100644 index 0000000000..5ef0cd52d2 --- /dev/null +++ b/documentation/design-docs/eventcounters.md @@ -0,0 +1,326 @@ +# EventCounters in .NET Core 3.0 + +## Introduction +EventCounters are .NET Core APIs used for lightweight, cross-platform, and near real-time performance metric collection. EventCounters that were added as a cross-platform alternative to the "performance counters" on the .NET Framework on Windows. This documentation serves as a guide on what they are, how to implement them, and how to consume them. + +The .NET Core runtime (CoreCLR) and few .NET libraries publish basic diagnostics information using EventCounters starting in .NET Core 3.0. + +Apart from the EventCounters that are already provided by the .NET runtime or the rest of the framework (i.e. ASP.NET, gRPC, etc.), you may choose to implement your own EventCounters to keep track of various metrics for your service. + +EventCounters live as a part of an [EventSource](https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.tracing.eventsource?view=netcore-3.0). Like any other events on an `EventSource`, they can be consumed both in-proc and out-of-proc via [EventListener](https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.tracing.eventlistener?view=netcore-3.0) and EventPipe/ETW. + +![EventCounter](EventCounters.jpg) + +## Runtime Counters +The .NET runtime (CoreCLR) publishes the following list of counters: +* CPU usage +* Working Set Size +* GC Heap Size +* Gen 0 GC Rate +* Gen 1 GC Rate +* Gen 2 GC Rate +* % Time in GC +* Gen 0 Heap Size +* Gen 1 Heap Size +* Gen 2 Heap Size +* LOH Heap Size +* Allocation Rate +* Assembly Count +* Exception Rate +* ThreadPool Thread Count +* Monitor Lock Contention Rate +* ThreadPool Queue Length +* ThreadPool Completed Items Rate +* Active Timer Count + +ASP.NET Core also publishes the following counters: +* Requests per second +* Total Requests Count +* Current Requests Count +* Failed Requests Count + +## EventCounters API Overview +At a high level, there are two types of counters in terms of their *purpose* - counters for ever-increasing values (i.e. Total # of exceptions, Total # of GCs, Total # of requests, etc.) and "snapshot" values (heap usage, CPU usage, working set size, etc.). Within each of these categories of counters, there are also two types of counters for implementation details - polling counters and non-polling counters. That gives us a total of 4 different counters, and each of these can be implemented by `EventCounter`, `PollingCounter`, `IncrementingEventCounter`, and `IncrementingPollingCounter`. + +The runtime supports four different types of counters for different situations: + +1. `EventCounter` records a set of values. The `WriteMetric()` method adds a new value to the set. At the end of each time interval, summary statistics for the set are computed such as the min, max, and mean. dotnet-counters will always display the mean value. EventCounter is useful to describe a discrete set of operations such as the average size in bytes of recent IO operations or the average monetary value of a set of financial transactions. + +2. `IncrementingEventCounter` records a running total. The `Increment()` method increases this total. At the end of each time period the total value is reported and then it is reset to zero. dotnet-counters will display this as a rate, the recorded total / time. This counter is useful to measure how frequently an action is occurring such as the number of requests processed each second. + +3. `PollingCounter` is a customizable counter that doesn't have any state and uses a callback to determine the value that is reported. At the end of each time interval the user provided callback function is invoked and whatever value it returns is reported as the current value of the counter. This counter can be used to query a metric from an external source, for example getting the current free bytes on a disk. It can also be used to report custom statistics that can be computed on demand by an application such as 95th percentile of recent request latencies or the current hit/miss ratio of a cache. + +4. `IncrementingPollingCounter` is a customizable counter that has no state and uses a callback to determine the increment that is reported. At the end of each time interval the callback is invoked and then the difference between the current invocation and the last invocation is the reported value. `dotnet-counters` always displays this as a rate, the reported value / time. This is useful to measure the rate at which some action is occurring when it isn't feasible to call an API on each occurrence, but it is possible to query the total number of times it has occurred. For example you could report the number of bytes written to a file / sec even if there is no notification each time a byte is written. + + + +## Writing EventCounters + +Let's begin by looking at an implementation of sample `EventSource` that contains an `EventCounter`. +```cs + +using System; +using System.Diagnostics.Tracing; + +[EventSource(Name = "Samples-EventCounterDemos-Minimal")] +public sealed class MinimalEventCounterSource : EventSource +{ + // define the singleton instance of the event source + public static MinimalEventCounterSource Log = new MinimalEventCounterSource(); + public EventCounter RequestTimeCounter; + + private MinimalEventCounterSource() : base(EventSourceSettings.EtwSelfDescribingEventFormat) + { + this.RequestTimeCounter = new EventCounter("request-time", this) + { + DisplayName = "Request Processing Time", + DisplayUnits = "MSec" + }; + } + + public static void Main() + { + var rand = new Random(); + while(true) + { + MinimalEventCounterSource.Log.RequestTimeCounter.WriteMetric(rand.NextDouble()); + } + } +} +``` + +Create a new dotnet console app using the code above and run it. Then use `dotnet-counters` to see what process-id this is: + +```cmd +E:\>dotnet-counters ps + 1398652 dotnet C:\Program Files\dotnet\dotnet.exe + 1399072 dotnet C:\Program Files\dotnet\dotnet.exe + 1399112 dotnet C:\Program Files\dotnet\dotnet.exe + 1401880 dotnet C:\Program Files\dotnet\dotnet.exe + 1400180 sample-counters E:\sample-counters\bin\Debug\netcoreapp3.1\sample-counters.exe +``` + +You can start monitoring your counter with the following command: +```cmd +E:\>dotnet-counters monitor --process-id 1400180 --providers Samples-EventCounterDemos-Minimal +``` + +Then you will see the following screen in your console: +``` +Press p to pause, r to resume, q to quit. + Status: Running + +[Samples-EventCounterDemos-Minimal] + Request Processing Time (MSec) 0.5 +``` + +Let's take a look at a couple of sample EventCounter implementation in the .NET Core runtime (CoreCLR). Here is the runtime implementation for the counter that tracks the working set size of the application. + +```cs +PollingCounter workingSetCounter = new PollingCounter( + "working-set", + this, + () => (double)(Environment.WorkingSet / 1_000_000) +) +{ + DisplayName = "Working Set", + DisplayUnits = "MB" +}; +``` + +This counter reports the current working set of the app. It is a `PollingCounter`, since it captures a metric at a moment in time. The callback for polling the values is `() => (double)(Environment.WorkingSet / 1_000_000)` which is simply just a call to `Environment.WorkingSet` API. The `DisplayName` and `DisplayUnits` is an optional property that can be set to help the consumer side of the counter to display the value more easily/accurately. For example `dotnet-counters` uses these properties to display the more "pretty" version of the counter names. + +And that's it! For `PollingCounter` (or `IncrementingPollingCounter`), there is nothing else that needs to be done since they poll the values themselves at the interval requested by the consumer. + +Here is another example of runtime counter implemented using `IncrementingPollingCounter`. + +```cs +IncrementingPollingCounter monitorContentionCounter = new IncrementingPollingCounter( + "monitor-lock-contention-count", + this, + () => Monitor.LockContentionCount +) +{ + DisplayName = "Monitor Lock Contention Count", + DisplayRateTimeScale = new TimeSpan(0, 0, 1) +}; +``` + +This counter uses the [Monitor.LockContentionCount](https://docs.microsoft.com/en-us/dotnet/api/system.threading.monitor.lockcontentioncount?view=netcore-3.0) API to report the increment of the total lock contention count. The `DisplayRateTimeScale` property is an optional `TimeSpan` which can be set to provide a hint of what time interval this counter is best displayed at. For example, the lock contention count is best displayed as *count per second*, so its `DisplayRateTimeScale` is set to 1 second. This can be adjusted for different types of rate counters. + +There are more runtime counter implementation to use as a reference in the [CoreCLR](https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/src/System/Diagnostics/Eventing/RuntimeEventSource.cs) repo. + +## Concurrency +It is important to note that if the delegates passed to the `PollingCounter`/`IncrementingPollingCounter` instances are called by multiple threads at once, the EventCounters API does not guarantee thread safety. It is the author's responsibility to guarantee the thread-safety of the delegates being passed to the counter APIs. + +For example, suppose we have the following `EventSource` which keeps track of requests. + +```cs +public class RequestEventSource : EventSource +{ + // singleton instance of the eventsource. + public static RequestEventSource Log = new RequestEventSource(); + + public IncrementingEventCounter requestRateCounter; + private int _requestCnt; + + private RequestEventSource() : base(EventSourceSettings.EtwSelfDescribingEventFormat) + { + requestCnt = 0; + this.requestRateCounter = new IncrementingPollingCounter("request-rate", this, () => _requestCnt) + { + DisplayName = "Request Rate", + DisplayRateTimeScale = TimeSpan.FromSeconds(1); + } + } + + // Method being called from request handlers to log that a request happened + public void Request() + { + requestCnt += 1; + } +} +``` + +`RequestEventSource.Request()` can be called from a request handler, and `requestRateCounter` simply polls this value at the interval specified by the consumer of this counter. However, this method can be called by multiple threads at once, so `requestCnt` can be susceptible to race. + +Therefore, this method should be modified to the following to prevent the race. +```cs +public void Request() +{ + Interlocked.Increment(ref _requestCnt); +} +``` + +## Consuming EventCounters + +There are two main ways of consuming EventCounters: in-proc and out-of-proc. + +### Consuming in-proc + +You can consume the counter values via the `EventListener` API. `EventListener` is an in-proc way of consuming any Events written by all instances of EventSources in your application. For more details on how to use the EventListener API, refer to the [EventListener documentation](https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.tracing.eventlistener). + +First, the EventSource that produces the counter value needs to be enabled. To do this, you can override the `OnEventSourceCreated` method to get a notification when an EventSource is created, and if this is the correct EventSource with your EventCounters, then you can call Enable on it. Here is an example of such override: + +```cs +protected override void OnEventSourceCreated(EventSource source) +{ + if (source.Name.Equals("System.Runtime")) + { + Dictionary refreshInterval = new Dictionary() + { + { "EventCounterIntervalSec", "1" } + }; + EnableEvents(source, 1, 1, refreshInterval); + } +} +``` + +#### Sample Code + +This is a sample `EventListener` class that simply prints out all the counter names and values from a the .NET runtime's EventSource for publishing its internal counters (`System.Runtime`) at some interval. + +```cs +public class SimpleEventListener : EventListener +{ + private readonly EventLevel _level = EventLevel.Verbose; + + public int EventCount { get; private set; } = 0; + + private int _intervalSec; + + public SimpleEventListener(int intervalSec) + { + _intervalSec = intervalSec; + } + + + protected override void OnEventSourceCreated(EventSource source) + { + if (source.Name.Equals("System.Runtime")) + { + Dictionary refreshInterval = new Dictionary() + { + { "EventCounterIntervalSec", _intervalSec.ToString() } + }; + EnableEvents(source, _level, (EventKeywords)(-1), refreshInterval); + } + } + + private (string Name, string Value) GetRelevantMetric(IDictionary eventPayload) + { + string counterName = ""; + string counterValue = ""; + + foreach ( KeyValuePair payload in eventPayload ) + { + string key = payload.Key; + string val = payload.Value.ToString(); + + if (key.Equals("Name")) + { + counterName = val; + } + else if (key.Equals("Mean") || key.Equals("Increment")) + { + counterValue = val; + } + } + return (counterName, counterValue); + } + + protected override void OnEventWritten(EventWrittenEventArgs eventData) + { + if (eventData.EventName.Equals("EventCounters")) + { + for (int i = 0; i < eventData.Payload.Count; i++) + { + IDictionary eventPayload = eventData.Payload[i] as IDictionary; + + if (eventPayload != null) + { + var counterKV = GetRelevantMetric(eventPayload); + Console.WriteLine($"{counterKV.Name} : {counterKV.Value}"); + } + } + } + } +} +``` + +As shown above, you *must* make sure the `"EventCounterIntervalSec"` argument is set in the filterPayload argument when calling `EnableEvents`. Otherwise the counters will not be able to flush out values since it doesn't know at which interval it should be getting flushed out. + +### Consuming out-of-proc + +Consuming EventCounters out-of-proc is also possible. For those that are familiar with ETW (Event Tracing for Windows), you can use ETW to capture counter data as events and view them on your ETW trace viewer (PerfView, WPA, etc.). You may also use `dotnet-counters` to consume it cross-platform via EventPipe. You can also use TraceEvent to consume these. + +#### dotnet-counters + +dotnet-counters is a cross-platform dotnet CLI tool that can be used to monitor the counter values. To find out how to use `dotnet-counters` to monitor your counters, refer to the [dotnet-counters documentation](https://github.com/dotnet/diagnostics/blob/master/documentation/dotnet-counters-instructions.md). + + +#### ETW/PerfView + +Since EventCounter payloads are reported as `EventSource` events, you can use PerfView to collect/view these counter-data. + +Here is a command that can be passed to PerfView to collect an ETW trace with the counters. +``` +PerfView.exe /onlyProviders=*Samples-EventCounterDemos-Minimal:EventCounterIntervalSec=1 collect +``` + + +#### dotnet-trace + +Similar to how PerfView can be used to consume the counter data through ETW, dotnet-trace can be used to consume the counter data through EventPipe. + +Here is an example of using dotnet-trace to get the same counter data. +``` +dotnet-trace collect --process-id --providers Samples-EventCounterDemos-Minimal:0:0:EventCounterIntervalSec=1 +``` + +The official dotnet-trace documentation contains a [section](https://github.com/dotnet/diagnostics/blob/master/documentation/dotnet-trace-instructions.md#using-dotnet-trace-to-collect-counter-values-over-time) on how to do this in more detail. + + +#### TraceEvent + +TraceEvent is a managed library that makes it easy to consume ETW and EventPipe events. For more information, refer to the [TraceEvent Library Programmers Guide](https://github.com/Microsoft/perfview/blob/master/documentation/TraceEvent/TraceEventProgrammersGuide.md). \ No newline at end of file From 446d8c3800e3ee67fe7534d0e5e65c34d7ebf7b2 Mon Sep 17 00:00:00 2001 From: Paul Harrington Date: Wed, 27 Nov 2019 10:41:29 -0800 Subject: [PATCH 003/243] Avoid exceptions when console is not available (#644) * Do not manipulate cursor if Console not available * Use console.GetTerminal() to test for console --- .../CommandLine/Commands/CollectCommand.cs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs index fac9c13b1a..0776c50598 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs @@ -38,7 +38,12 @@ private static async Task Collect(CancellationToken ct, IConsole console, i { Debug.Assert(output != null); Debug.Assert(profile != null); - Console.Clear(); + + bool hasConsole = console.GetTerminal() != null; + + if (hasConsole) + Console.Clear(); + if (processId < 0) { Console.Error.WriteLine("Process ID should not be negative."); @@ -141,8 +146,13 @@ private static async Task Collect(CancellationToken ct, IConsole console, i if (nBytesRead <= 0) break; fs.Write(buffer, 0, nBytesRead); - lineToClear = Console.CursorTop-1; - ResetCurrentConsoleLine(vTermMode.IsEnabled); + + if (hasConsole) + { + lineToClear = Console.CursorTop - 1; + ResetCurrentConsoleLine(vTermMode.IsEnabled); + } + Console.Out.WriteLine($"[{stopwatch.Elapsed.ToString(@"dd\:hh\:mm\:ss")}]\tRecording trace {GetSize(fs.Length)}"); Console.Out.WriteLine("Press or to exit..."); Debug.WriteLine($"PACKET: {Convert.ToBase64String(buffer, 0, nBytesRead)} (bytes {nBytesRead})"); From b5d6ae917a837954e59bf8c8e5772396e5a925c4 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 28 Nov 2019 13:50:27 +0000 Subject: [PATCH 004/243] Update dependencies from https://github.com/aspnet/AspNetCore build 20191127.15 (#655) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha1.19577.15 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 9fa8c13938..03666d5fd3 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/core-setup c77948d92a2f950140f09384f057cb893ec3955a - + https://github.com/aspnet/AspNetCore - b81c1a7954445cb202e1d85d09cee09ffe18dc37 + eb929d5a0bafc0f8a15473265ac2acf6ea105e6a diff --git a/eng/Versions.props b/eng/Versions.props index baa575710e..2b64eb5829 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -7,7 +7,7 @@ true true 5.0.0-alpha.1.19564.1 - 5.0.0-alpha1.19575.10 + 5.0.0-alpha1.19577.15 From f49debf8caac53ff1b4431a8c5f47ff4d7a38468 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 29 Nov 2019 13:50:48 +0000 Subject: [PATCH 005/243] Update dependencies from https://github.com/aspnet/AspNetCore build 20191128.4 (#656) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha1.19578.4 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 03666d5fd3..0ae79fc0e7 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/core-setup c77948d92a2f950140f09384f057cb893ec3955a - + https://github.com/aspnet/AspNetCore - eb929d5a0bafc0f8a15473265ac2acf6ea105e6a + 310809997a06e946deafa3e339a9364c9721b432 diff --git a/eng/Versions.props b/eng/Versions.props index 2b64eb5829..1266388485 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -7,7 +7,7 @@ true true 5.0.0-alpha.1.19564.1 - 5.0.0-alpha1.19577.15 + 5.0.0-alpha1.19578.4 From 90c5cb42b4459ac21a6cf10770eda15a12d6744e Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2019 13:50:40 +0000 Subject: [PATCH 006/243] Update dependencies from https://github.com/aspnet/AspNetCore build 20191201.2 (#657) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha1.19601.2 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 0ae79fc0e7..8172ac62af 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/core-setup c77948d92a2f950140f09384f057cb893ec3955a - + https://github.com/aspnet/AspNetCore - 310809997a06e946deafa3e339a9364c9721b432 + 032625cd32d4666a2d973061616f6253c249e45a diff --git a/eng/Versions.props b/eng/Versions.props index 1266388485..8c92e7042b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -7,7 +7,7 @@ true true 5.0.0-alpha.1.19564.1 - 5.0.0-alpha1.19578.4 + 5.0.0-alpha1.19601.2 From c9108a70fbf3ed31d055df1ca4a866339770c7a0 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2019 13:50:56 +0000 Subject: [PATCH 007/243] Update dependencies from https://github.com/aspnet/AspNetCore build 20191202.2 (#660) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha1.19602.2 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 8172ac62af..259cadc1ba 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/core-setup c77948d92a2f950140f09384f057cb893ec3955a - + https://github.com/aspnet/AspNetCore - 032625cd32d4666a2d973061616f6253c249e45a + 576e19bb1bfb2489d23bff719489f18e6aa2ab94 diff --git a/eng/Versions.props b/eng/Versions.props index 8c92e7042b..7fdb022f61 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -7,7 +7,7 @@ true true 5.0.0-alpha.1.19564.1 - 5.0.0-alpha1.19601.2 + 5.0.0-alpha1.19602.2 From 288a82ff0e0192874ff254a8fc2e76cf47fb8609 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2019 13:51:20 +0000 Subject: [PATCH 008/243] Update dependencies from https://github.com/aspnet/AspNetCore build 20191203.5 (#665) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha1.19603.5 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 259cadc1ba..50d0713519 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/core-setup c77948d92a2f950140f09384f057cb893ec3955a - + https://github.com/aspnet/AspNetCore - 576e19bb1bfb2489d23bff719489f18e6aa2ab94 + 3b7cdc166aa3c9733fa60b56d91fc0fff9b11652 diff --git a/eng/Versions.props b/eng/Versions.props index 7fdb022f61..d53b79e3fb 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -7,7 +7,7 @@ true true 5.0.0-alpha.1.19564.1 - 5.0.0-alpha1.19602.2 + 5.0.0-alpha1.19603.5 From d42c43cd074a9b3f34fbe6795d0c516d33a350c2 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Wed, 4 Dec 2019 22:30:47 +0100 Subject: [PATCH 009/243] add missing README.md files for global tools (#662) * add missing README.md files for global tools * use relative link --- src/Tools/dotnet-counters/README.md | 2 +- src/Tools/dotnet-dump/README.md | 3 +++ src/Tools/dotnet-gcdump/README.md | 3 +++ src/Tools/dotnet-trace/README.md | 3 +++ 4 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/Tools/dotnet-dump/README.md create mode 100644 src/Tools/dotnet-gcdump/README.md create mode 100644 src/Tools/dotnet-trace/README.md diff --git a/src/Tools/dotnet-counters/README.md b/src/Tools/dotnet-counters/README.md index 18603dfa41..08e6727336 100644 --- a/src/Tools/dotnet-counters/README.md +++ b/src/Tools/dotnet-counters/README.md @@ -1,3 +1,3 @@ # dotnet-counters -Please refer to [dotnet-counters doc](https://github.com/dotnet/diagnostics/blob/master/documentation/dotnet-counters-instructions.md) for instructions on how to use this tool. \ No newline at end of file +Please refer to [dotnet-counters doc](../../../documentation/dotnet-counters-instructions.md) for instructions on how to use this tool. \ No newline at end of file diff --git a/src/Tools/dotnet-dump/README.md b/src/Tools/dotnet-dump/README.md new file mode 100644 index 0000000000..c2cee80a09 --- /dev/null +++ b/src/Tools/dotnet-dump/README.md @@ -0,0 +1,3 @@ +# dotnet-dump + +Please refer to [dotnet-dump doc](../../../documentation/dotnet-dump-instructions.md) for instructions on how to use this tool. \ No newline at end of file diff --git a/src/Tools/dotnet-gcdump/README.md b/src/Tools/dotnet-gcdump/README.md new file mode 100644 index 0000000000..1e1140cc27 --- /dev/null +++ b/src/Tools/dotnet-gcdump/README.md @@ -0,0 +1,3 @@ +# dotnet-gcdump + +Please refer to [dotnet-gcdump doc](../../../documentation/dotnet-gcdump-instructions.md) for instructions on how to use this tool. \ No newline at end of file diff --git a/src/Tools/dotnet-trace/README.md b/src/Tools/dotnet-trace/README.md new file mode 100644 index 0000000000..a406bbe96b --- /dev/null +++ b/src/Tools/dotnet-trace/README.md @@ -0,0 +1,3 @@ +# dotnet-trace + +Please refer to [dotnet-trace doc](../../../documentation/dotnet-trace-instructions.md) for instructions on how to use this tool. \ No newline at end of file From 42f505ef918f7aabccad7de4e4e7aab7318f5de1 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 5 Dec 2019 20:19:43 +0100 Subject: [PATCH 010/243] SpeedScope handles only CPU samples, events are not supported (#661) --- src/Tools/dotnet-trace/TraceFileFormatConverter.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Tools/dotnet-trace/TraceFileFormatConverter.cs b/src/Tools/dotnet-trace/TraceFileFormatConverter.cs index 056d56bc8e..6b4d13451a 100644 --- a/src/Tools/dotnet-trace/TraceFileFormatConverter.cs +++ b/src/Tools/dotnet-trace/TraceFileFormatConverter.cs @@ -72,7 +72,10 @@ private static void ConvertToSpeedscope(string fileToConvert, string outputFilen OnlyManagedCodeStacks = true // EventPipe currently only has managed code stacks. }; - var computer = new SampleProfilerThreadTimeComputer(eventLog, symbolReader); + var computer = new SampleProfilerThreadTimeComputer(eventLog, symbolReader) + { + IncludeEventSourceEvents = false // SpeedScope handles only CPU samples, events are not supported + }; computer.GenerateThreadTimeStacks(stackSource); SpeedScopeStackSourceWriter.WriteStackViewAsJson(stackSource, outputFilename); From cf73548eebfe23e48c583cc4a4fc3e6624251e03 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Thu, 5 Dec 2019 13:23:25 -0800 Subject: [PATCH 011/243] dotnet-counters JSON Exporter improvements (#666) * make timestamp non culture-sensitive, change 'counter type' to 'counterType' * Remove more spaces from the JSON --- src/Tools/dotnet-counters/Exporters/JSONExporter.cs | 8 ++++---- src/tests/dotnet-counters/JSONExporterTests.cs | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Tools/dotnet-counters/Exporters/JSONExporter.cs b/src/Tools/dotnet-counters/Exporters/JSONExporter.cs index ee18c0ab87..7d843112ae 100644 --- a/src/Tools/dotnet-counters/Exporters/JSONExporter.cs +++ b/src/Tools/dotnet-counters/Exporters/JSONExporter.cs @@ -36,8 +36,8 @@ public void Initialize() } builder = new StringBuilder(); - builder.Append($"{{ \"Target Process\": \"{_processName}\", "); - builder.Append($"\"Start Time\": \"{DateTime.Now.ToString()}\", "); + builder.Append($"{{ \"TargetProcess\": \"{_processName}\", "); + builder.Append($"\"StartTime\": \"{DateTime.Now.ToString()}\", "); builder.Append($"\"Events\": ["); } @@ -57,10 +57,10 @@ public void CounterPayloadReceived(string providerName, ICounterPayload payload, File.AppendAllText(_output, builder.ToString()); builder.Clear(); } - builder.Append($"{{ \"timestamp\": \"{DateTime.Now.ToString()}\", "); + builder.Append($"{{ \"timestamp\": \"{DateTime.Now.ToString("u")}\", "); builder.Append($" \"provider\": \"{providerName}\", "); builder.Append($" \"name\": \"{payload.GetDisplay()}\", "); - builder.Append($" \"counter type\": \"{payload.GetCounterType()}\", "); + builder.Append($" \"counterType\": \"{payload.GetCounterType()}\", "); builder.Append($" \"value\": {payload.GetValue()} }},"); } diff --git a/src/tests/dotnet-counters/JSONExporterTests.cs b/src/tests/dotnet-counters/JSONExporterTests.cs index 29ad426fb3..6817fb0d2e 100644 --- a/src/tests/dotnet-counters/JSONExporterTests.cs +++ b/src/tests/dotnet-counters/JSONExporterTests.cs @@ -149,7 +149,7 @@ class JSONCounterPayload [JsonProperty("name")] public string name { get; set; } - [JsonProperty("counter type")] + [JsonProperty("counterType")] public string counterType { get; set; } [JsonProperty("value")] @@ -158,10 +158,10 @@ class JSONCounterPayload class JSONCounterTrace { - [JsonProperty("Target Process")] + [JsonProperty("TargetProcess")] public string targetProcess { get; set; } - [JsonProperty("Start Time")] + [JsonProperty("StartTime")] public string startTime { get; set; } [JsonProperty("Events")] From 2e62169c60227fcce8238592fa7bfda4568c9eb1 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Thu, 5 Dec 2019 16:19:51 -0800 Subject: [PATCH 012/243] Microsoft.Diagnostics.NETCore.Client Implementation (#617) This is the initial implementation of Microsoft.Diagnostics.NETCore.Client library. This will be released with version 1.0.0-preview, and when I feel that enough customers have validated it that we can match it with the rest of the diagnostics OOB packages and bump up the version to 3.1. --- diagnostics.sln | 129 ++++++++++++++ .../BinaryWriterExtensions.cs | 25 +++ .../DiagnosticsClient/DiagnosticsClient.cs | 163 ++++++++++++++++++ .../DiagnosticsClientExceptions.cs | 31 ++++ .../DiagnosticsClient/DumpType.cs | 14 ++ .../DiagnosticsClient/EventPipeProvider.cs | 76 ++++++++ .../DiagnosticsClient/EventPipeSession.cs | 85 +++++++++ .../EventPipeSessionConfiguration.cs | 72 ++++++++ .../DiagnosticsIpc/IpcClient.cs | 126 ++++++++++++++ .../DiagnosticsIpc/IpcCommands.cs | 42 +++++ .../DiagnosticsIpc/IpcHeader.cs | 75 ++++++++ .../DiagnosticsIpc/IpcMessage.cs | 108 ++++++++++++ ...icrosoft.Diagnostics.NETCore.Client.csproj | 15 ++ src/Tools/Common/Commands/ProcessStatus.cs | 4 +- src/Tools/dotnet-counters/CounterMonitor.cs | 54 ++---- src/Tools/dotnet-counters/Program.cs | 2 +- .../dotnet-counters/dotnet-counters.csproj | 2 +- src/Tools/dotnet-dump/Dumper.cs | 14 +- src/Tools/dotnet-dump/Program.cs | 2 +- src/Tools/dotnet-dump/dotnet-dump.csproj | 2 +- .../CommandLine/CollectCommandHandler.cs | 1 - .../ProcessStatusCommandHandler.cs | 1 - .../EventPipeDotNetHeapDumper.cs | 39 ++--- src/Tools/dotnet-gcdump/dotnet-gcdump.csproj | 2 +- .../CommandLine/Commands/CollectCommand.cs | 34 ++-- .../CommandLine/Commands/ConvertCommand.cs | 2 +- .../Commands/ListProcessesCommandHandler.cs | 1 - .../Commands/ListProfilesCommandHandler.cs | 32 ++-- .../Commands/StopCommandHandler.cs | 48 ------ src/Tools/dotnet-trace/Extensions.cs | 64 ++++++- src/Tools/dotnet-trace/Profile.cs | 16 +- src/Tools/dotnet-trace/Program.cs | 3 - src/Tools/dotnet-trace/dotnet-trace.csproj | 2 +- .../CommonHelper.cs | 28 +++ .../EventPipeProviderTests.cs | 113 ++++++++++++ .../EventPipeSessionTests.cs | 115 ++++++++++++ .../GetPublishedProcessesTests.cs | 75 ++++++++ ...iagnostics.NETCore.Client.UnitTests.csproj | 13 ++ .../TestRunner.cs | 86 +++++++++ .../WriteDumpTests.cs | 124 +++++++++++++ src/tests/Tracee/Program.cs | 21 +++ src/tests/Tracee/Tracee.csproj | 7 + .../dotnet-trace/ProfileProviderMerging.cs | 8 +- src/tests/dotnet-trace/ProviderParsing.cs | 81 +++++---- 44 files changed, 1738 insertions(+), 219 deletions(-) create mode 100644 src/Microsoft.Diagnostics.NETCore.Client/BinaryWriterExtensions.cs create mode 100644 src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DiagnosticsClient.cs create mode 100644 src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DiagnosticsClientExceptions.cs create mode 100644 src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DumpType.cs create mode 100644 src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeProvider.cs create mode 100644 src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeSession.cs create mode 100644 src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeSessionConfiguration.cs create mode 100644 src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs create mode 100644 src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcCommands.cs create mode 100644 src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcHeader.cs create mode 100644 src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcMessage.cs create mode 100644 src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj delete mode 100644 src/Tools/dotnet-trace/CommandLine/Commands/StopCommandHandler.cs create mode 100644 src/tests/Microsoft.Diagnostics.NETCore.Client/CommonHelper.cs create mode 100644 src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeProviderTests.cs create mode 100644 src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs create mode 100644 src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs create mode 100644 src/tests/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj create mode 100644 src/tests/Microsoft.Diagnostics.NETCore.Client/TestRunner.cs create mode 100644 src/tests/Microsoft.Diagnostics.NETCore.Client/WriteDumpTests.cs create mode 100644 src/tests/Tracee/Program.cs create mode 100644 src/tests/Tracee/Tracee.csproj diff --git a/diagnostics.sln b/diagnostics.sln index 6796cda207..45df2c9e38 100644 --- a/diagnostics.sln +++ b/diagnostics.sln @@ -55,6 +55,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-gcdump", "src\Tools\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotnetCounters.UnitTests", "src\tests\dotnet-counters\DotnetCounters.UnitTests.csproj", "{E5A7DC6C-BF8D-418A-BCBD-094EB748FA82}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.NETCore.Client", "src\Microsoft.Diagnostics.NETCore.Client\Microsoft.Diagnostics.NETCore.Client.csproj", "{D8BE9C81-194E-43E5-82CF-2080892FBDE7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.NETCore.Client.UnitTests", "src\tests\Microsoft.Diagnostics.NETCore.Client\Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj", "{6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tracee", "src\tests\Tracee\Tracee.csproj", "{C79D6069-2C18-48CB-846E-71F7168C2F7D}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventPipe.UnitTests", "src\tests\eventpipe\EventPipe.UnitTests.csproj", "{CED9ABBA-861E-4C0A-9359-22351208EF27}" EndProject Global @@ -890,6 +896,126 @@ Global {E5A7DC6C-BF8D-418A-BCBD-094EB748FA82}.RelWithDebInfo|x64.Build.0 = Release|Any CPU {E5A7DC6C-BF8D-418A-BCBD-094EB748FA82}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU {E5A7DC6C-BF8D-418A-BCBD-094EB748FA82}.RelWithDebInfo|x86.Build.0 = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Checked|Any CPU.Build.0 = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Checked|ARM.ActiveCfg = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Checked|ARM.Build.0 = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Checked|ARM64.ActiveCfg = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Checked|ARM64.Build.0 = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Checked|x64.ActiveCfg = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Checked|x64.Build.0 = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Checked|x86.ActiveCfg = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Checked|x86.Build.0 = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Debug|ARM.ActiveCfg = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Debug|ARM.Build.0 = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Debug|ARM64.Build.0 = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Debug|x64.ActiveCfg = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Debug|x64.Build.0 = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Debug|x86.ActiveCfg = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Debug|x86.Build.0 = Debug|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Release|Any CPU.Build.0 = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Release|ARM.ActiveCfg = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Release|ARM.Build.0 = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Release|ARM64.ActiveCfg = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Release|ARM64.Build.0 = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Release|x64.ActiveCfg = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Release|x64.Build.0 = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Release|x86.ActiveCfg = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.Release|x86.Build.0 = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.RelWithDebInfo|x64.Build.0 = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU + {D8BE9C81-194E-43E5-82CF-2080892FBDE7}.RelWithDebInfo|x86.Build.0 = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Checked|Any CPU.Build.0 = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Checked|ARM.ActiveCfg = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Checked|ARM.Build.0 = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Checked|ARM64.ActiveCfg = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Checked|ARM64.Build.0 = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Checked|x64.ActiveCfg = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Checked|x64.Build.0 = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Checked|x86.ActiveCfg = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Checked|x86.Build.0 = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Debug|ARM.ActiveCfg = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Debug|ARM.Build.0 = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Debug|ARM64.Build.0 = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Debug|x64.ActiveCfg = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Debug|x64.Build.0 = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Debug|x86.ActiveCfg = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Debug|x86.Build.0 = Debug|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Release|Any CPU.Build.0 = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Release|ARM.ActiveCfg = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Release|ARM.Build.0 = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Release|ARM64.ActiveCfg = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Release|ARM64.Build.0 = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Release|x64.ActiveCfg = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Release|x64.Build.0 = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Release|x86.ActiveCfg = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.Release|x86.Build.0 = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.RelWithDebInfo|x64.Build.0 = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}.RelWithDebInfo|x86.Build.0 = Release|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Checked|Any CPU.Build.0 = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Checked|ARM.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Checked|ARM.Build.0 = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Checked|ARM64.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Checked|ARM64.Build.0 = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Checked|x64.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Checked|x64.Build.0 = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Checked|x86.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Checked|x86.Build.0 = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Debug|ARM.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Debug|ARM.Build.0 = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Debug|ARM64.Build.0 = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Debug|x64.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Debug|x64.Build.0 = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Debug|x86.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Debug|x86.Build.0 = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Release|Any CPU.Build.0 = Release|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Release|ARM.ActiveCfg = Release|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Release|ARM.Build.0 = Release|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Release|ARM64.ActiveCfg = Release|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Release|ARM64.Build.0 = Release|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Release|x64.ActiveCfg = Release|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Release|x64.Build.0 = Release|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Release|x86.ActiveCfg = Release|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.Release|x86.Build.0 = Release|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.RelWithDebInfo|Any CPU.Build.0 = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.RelWithDebInfo|ARM.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.RelWithDebInfo|ARM.Build.0 = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.RelWithDebInfo|ARM64.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.RelWithDebInfo|ARM64.Build.0 = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {C79D6069-2C18-48CB-846E-71F7168C2F7D}.RelWithDebInfo|x86.Build.0 = Debug|Any CPU {CED9ABBA-861E-4C0A-9359-22351208EF27}.Checked|Any CPU.ActiveCfg = Debug|Any CPU {CED9ABBA-861E-4C0A-9359-22351208EF27}.Checked|Any CPU.Build.0 = Debug|Any CPU {CED9ABBA-861E-4C0A-9359-22351208EF27}.Checked|ARM.ActiveCfg = Debug|Any CPU @@ -960,6 +1086,9 @@ Global {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22} = {03479E19-3F18-49A6-910A-F5041E27E7C0} {936678B3-3392-4F4F-943C-B6A4BFCBAADC} = {B62728C8-1267-4043-B46F-5537BBAEC692} {E5A7DC6C-BF8D-418A-BCBD-094EB748FA82} = {03479E19-3F18-49A6-910A-F5041E27E7C0} + {D8BE9C81-194E-43E5-82CF-2080892FBDE7} = {19FAB78C-3351-4911-8F0C-8C6056401740} + {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128} = {03479E19-3F18-49A6-910A-F5041E27E7C0} + {C79D6069-2C18-48CB-846E-71F7168C2F7D} = {03479E19-3F18-49A6-910A-F5041E27E7C0} {CED9ABBA-861E-4C0A-9359-22351208EF27} = {03479E19-3F18-49A6-910A-F5041E27E7C0} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution diff --git a/src/Microsoft.Diagnostics.NETCore.Client/BinaryWriterExtensions.cs b/src/Microsoft.Diagnostics.NETCore.Client/BinaryWriterExtensions.cs new file mode 100644 index 0000000000..c95b24d5e3 --- /dev/null +++ b/src/Microsoft.Diagnostics.NETCore.Client/BinaryWriterExtensions.cs @@ -0,0 +1,25 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + internal static class BinaryWriterExtensions + { + public static void WriteString(this BinaryWriter @this, string value) + { + if (@this == null) + throw new ArgumentNullException(nameof(@this)); + + @this.Write(value != null ? (value.Length + 1) : 0); + if (value != null) + @this.Write(Encoding.Unicode.GetBytes(value + '\0')); + } + + } +} diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DiagnosticsClient.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DiagnosticsClient.cs new file mode 100644 index 0000000000..5d558c4ff9 --- /dev/null +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DiagnosticsClient.cs @@ -0,0 +1,163 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Globalization; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + /// + /// This is a top-level class that contains methods to send various diagnostics command to the runtime. + /// + public sealed class DiagnosticsClient + { + private int _processId; + + public DiagnosticsClient(int processId) + { + _processId = processId; + } + + /// + /// Start tracing the application and return an EventPipeSession object + /// + /// An IEnumerable containing the list of Providers to turn on. + /// If true, request rundown events from the runtime + /// The size of the runtime's buffer for collecting events in MB + /// + /// An EventPipeSession object representing the EventPipe session that just started. + /// + public EventPipeSession StartEventPipeSession(IEnumerable providers, bool requestRundown=true, int circularBufferMB=256) + { + return new EventPipeSession(_processId, providers, requestRundown, circularBufferMB); + } + + /// + /// Trigger a core dump generation. + /// + /// Type of the dump to be generated + /// Full path to the dump to be generated. By default it is /tmp/coredump.{pid} + /// When set to true, display the dump generation debug log to the console. + public void WriteDump(DumpType dumpType, string dumpPath, bool logDumpGeneration=false) + { + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + throw new PlatformNotSupportedException($"Unsupported operating system: {RuntimeInformation.OSDescription}"); + + if (string.IsNullOrEmpty(dumpPath)) + throw new ArgumentNullException($"{nameof(dumpPath)} required"); + + var payload = SerializeCoreDump(dumpPath, dumpType, logDumpGeneration); + var message = new IpcMessage(DiagnosticsServerCommandSet.Dump, (byte)DumpCommandId.GenerateCoreDump, payload); + var response = IpcClient.SendMessage(_processId, message); + var hr = 0; + switch ((DiagnosticsServerCommandId)response.Header.CommandId) + { + case DiagnosticsServerCommandId.Error: + hr = BitConverter.ToInt32(response.Payload, 0); + throw new ServerErrorException($"Writing dump failed (HRESULT: 0x{hr:X8})"); + case DiagnosticsServerCommandId.OK: + return; + default: + throw new ServerErrorException($"Writing dump failed - server responded with unknown command"); + } + } + + /// + /// Attach a profiler. + /// + /// Timeout for attaching the profiler + /// Guid for the profiler to be attached + /// Path to the profiler to be attached + /// Additional data to be passed to the profiler + public void AttachProfiler(TimeSpan attachTimeout, Guid profilerGuid, string profilerPath, byte[] additionalData=null) + { + if (profilerGuid == null || profilerGuid == Guid.Empty) + { + throw new ArgumentException($"{nameof(profilerGuid)} must be a valid Guid"); + } + + if (String.IsNullOrEmpty(profilerPath)) + { + throw new ArgumentException($"{nameof(profilerPath)} must be non-null"); + } + + byte[] serializedConfiguration = SerializeProfilerAttach((uint)attachTimeout.TotalSeconds, profilerGuid, profilerPath, additionalData); + var message = new IpcMessage(DiagnosticsServerCommandSet.Profiler, (byte)ProfilerCommandId.AttachProfiler, serializedConfiguration); + var response = IpcClient.SendMessage(_processId, message); + switch ((DiagnosticsServerCommandId)response.Header.CommandId) + { + case DiagnosticsServerCommandId.Error: + var hr = BitConverter.ToInt32(response.Payload, 0); + throw new ServerErrorException($"Profiler attach failed (HRESULT: 0x{hr:X8})"); + case DiagnosticsServerCommandId.OK: + return; + default: + throw new ServerErrorException($"Profiler attach failed - server responded with unknown command"); + } + + // The call to set up the pipe and send the message operates on a different timeout than attachTimeout, which is for the runtime. + // We should eventually have a configurable timeout for the message passing, potentially either separately from the + // runtime timeout or respect attachTimeout as one total duration. + } + + /// + /// Get all the active processes that can be attached to. + /// + /// + /// IEnumerable of all the active process IDs. + /// + public static IEnumerable GetPublishedProcesses() + { + return Directory.GetFiles(IpcClient.IpcRootPath) + .Select(namedPipe => (new FileInfo(namedPipe)).Name) + .Where(input => Regex.IsMatch(input, IpcClient.DiagnosticsPortPattern)) + .Select(input => int.Parse(Regex.Match(input, IpcClient.DiagnosticsPortPattern).Groups[1].Value, NumberStyles.Integer)) + .Distinct(); + } + + private static byte[] SerializeCoreDump(string dumpName, DumpType dumpType, bool diagnostics) + { + using (var stream = new MemoryStream()) + using (var writer = new BinaryWriter(stream)) + { + writer.WriteString(dumpName); + writer.Write((uint)dumpType); + writer.Write((uint)(diagnostics ? 1 : 0)); + + writer.Flush(); + return stream.ToArray(); + } + } + + private static byte[] SerializeProfilerAttach(uint attachTimeout, Guid profilerGuid, string profilerPath, byte[] additionalData) + { + using (var stream = new MemoryStream()) + using (var writer = new BinaryWriter(stream)) + { + writer.Write(attachTimeout); + writer.Write(profilerGuid.ToByteArray()); + writer.WriteString(profilerPath); + + if (additionalData == null) + { + writer.Write(0); + } + else + { + writer.Write(additionalData.Length); + writer.Write(additionalData); + } + + writer.Flush(); + return stream.ToArray(); + } + } + } +} diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DiagnosticsClientExceptions.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DiagnosticsClientExceptions.cs new file mode 100644 index 0000000000..a313e3c533 --- /dev/null +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DiagnosticsClientExceptions.cs @@ -0,0 +1,31 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + public class DiagnosticsClientException : Exception + { + public DiagnosticsClientException(string msg) : base(msg) {} + } + + // When a certian command is not supported by either the library or the target process' runtime + public class UnsupportedProtocolException : DiagnosticsClientException + { + public UnsupportedProtocolException(string msg) : base(msg) {} + } + + // When the runtime is no longer availble for attaching. + public class ServerNotAvailableException : DiagnosticsClientException + { + public ServerNotAvailableException(string msg) : base(msg) {} + } + + // When the runtime responded with an error + public class ServerErrorException : DiagnosticsClientException + { + public ServerErrorException(string msg): base(msg) {} + } +} \ No newline at end of file diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DumpType.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DumpType.cs new file mode 100644 index 0000000000..2200e84fb2 --- /dev/null +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DumpType.cs @@ -0,0 +1,14 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace Microsoft.Diagnostics.NETCore.Client +{ + public enum DumpType + { + Normal = 1, + WithHeap = 2, + Triage = 3, + Full = 4 + } +} \ No newline at end of file diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeProvider.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeProvider.cs new file mode 100644 index 0000000000..332ecd20a3 --- /dev/null +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeProvider.cs @@ -0,0 +1,76 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Tracing; +using System.Linq; +using System.Text; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + public sealed class EventPipeProvider + { + public EventPipeProvider(string name, EventLevel eventLevel, long keywords = 0, IDictionary arguments = null) + { + Name = name; + EventLevel = eventLevel; + Keywords = keywords; + Arguments = arguments; + } + + public long Keywords { get; } + + public EventLevel EventLevel { get; } + + public string Name { get; } + + public IDictionary Arguments { get; } + + public override string ToString() + { + return $"{Name}:0x{Keywords:X16}:{(uint)EventLevel}{(Arguments == null ? "" : $":{GetArgumentString()}")}"; + } + + public override bool Equals(object obj) + { + if (obj == null || GetType() != obj.GetType()) + { + return false; + } + + return this == (EventPipeProvider)obj; + } + + public override int GetHashCode() + { + int hash = 0; + hash ^= this.Name.GetHashCode(); + hash ^= this.Keywords.GetHashCode(); + hash ^= this.EventLevel.GetHashCode(); + hash ^= GetArgumentString().GetHashCode(); + return hash; + } + + public static bool operator ==(EventPipeProvider left, EventPipeProvider right) + { + return left.ToString() == right.ToString(); + } + + public static bool operator !=(EventPipeProvider left, EventPipeProvider right) + { + return !(left == right); + } + + internal string GetArgumentString() + { + if (Arguments == null) + { + return ""; + } + return string.Join(";", Arguments.Select(a => $"{a.Key}={a.Value}")); + } + + } +} \ No newline at end of file diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeSession.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeSession.cs new file mode 100644 index 0000000000..fc6fa847d4 --- /dev/null +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeSession.cs @@ -0,0 +1,85 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + public class EventPipeSession : IDisposable + { + private IEnumerable _providers; + private bool _requestRundown; + private int _circularBufferMB; + private long _sessionId; + private int _processId; + private bool disposedValue = false; // To detect redundant calls + + internal EventPipeSession(int processId, IEnumerable providers, bool requestRundown, int circularBufferMB) + { + _processId = processId; + _providers = providers; + _requestRundown = requestRundown; + _circularBufferMB = circularBufferMB; + + var config = new EventPipeSessionConfiguration(circularBufferMB, EventPipeSerializationFormat.NetTrace, providers, requestRundown); + var message = new IpcMessage(DiagnosticsServerCommandSet.EventPipe, (byte)EventPipeCommandId.CollectTracing2, config.SerializeV2()); + EventStream = IpcClient.SendMessage(processId, message, out var response); + switch ((DiagnosticsServerCommandId)response.Header.CommandId) + { + case DiagnosticsServerCommandId.OK: + _sessionId = BitConverter.ToInt64(response.Payload, 0); + break; + case DiagnosticsServerCommandId.Error: + var hr = BitConverter.ToInt32(response.Payload, 0); + throw new ServerErrorException($"EventPipe session start failed (HRESULT: 0x{hr:X8})"); + default: + throw new ServerErrorException($"EventPipe session start failed - Server responded with unknown command"); + } + } + + public Stream EventStream { get; } + + /// + /// Stops the given session + /// + public void Stop() + { + Debug.Assert(_sessionId > 0); + + byte[] payload = BitConverter.GetBytes(_sessionId); + var response = IpcClient.SendMessage(_processId, new IpcMessage(DiagnosticsServerCommandSet.EventPipe, (byte)EventPipeCommandId.StopTracing, payload)); + + switch ((DiagnosticsServerCommandId)response.Header.CommandId) + { + case DiagnosticsServerCommandId.OK: + return; + case DiagnosticsServerCommandId.Error: + var hr = BitConverter.ToInt32(response.Payload, 0); + throw new ServerErrorException($"EventPipe session stop failed (HRESULT: 0x{hr:X8})"); + default: + throw new ServerErrorException($"EventPipe session stop failed - Server responded with unknown command"); + } + } + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + EventStream?.Dispose(); + } + disposedValue = true; + } + } + + public void Dispose() + { + Dispose(true); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeSessionConfiguration.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeSessionConfiguration.cs new file mode 100644 index 0000000000..abda64566a --- /dev/null +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeSessionConfiguration.cs @@ -0,0 +1,72 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + internal enum EventPipeSerializationFormat + { + NetPerf, + NetTrace + } + + internal class EventPipeSessionConfiguration + { + public EventPipeSessionConfiguration(int circularBufferSizeMB, EventPipeSerializationFormat format, IEnumerable providers, bool requestRundown=true) + { + if (circularBufferSizeMB == 0) + throw new ArgumentException($"Buffer size cannot be zero."); + if (format != EventPipeSerializationFormat.NetPerf && format != EventPipeSerializationFormat.NetTrace) + throw new ArgumentException("Unrecognized format"); + if (providers == null) + throw new ArgumentNullException(nameof(providers)); + + CircularBufferSizeInMB = circularBufferSizeMB; + Format = format; + RequestRundown = requestRundown; + _providers = new List(providers); + } + + public bool RequestRundown { get; } + public int CircularBufferSizeInMB { get; } + public EventPipeSerializationFormat Format { get; } + + public IReadOnlyCollection Providers => _providers.AsReadOnly(); + + private readonly List _providers; + + public byte[] SerializeV2() + { + byte[] serializedData = null; + using (var stream = new MemoryStream()) + using (var writer = new BinaryWriter(stream)) + { + writer.Write(CircularBufferSizeInMB); + writer.Write((uint)Format); + writer.Write(RequestRundown); + + writer.Write(Providers.Count()); + foreach (var provider in Providers) + { + writer.Write(provider.Keywords); + writer.Write((uint)provider.EventLevel); + + writer.WriteString(provider.Name); + writer.WriteString(provider.GetArgumentString()); + } + + writer.Flush(); + serializedData = stream.ToArray(); + } + + return serializedData; + } + + + } +} diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs new file mode 100644 index 0000000000..7d309b670d --- /dev/null +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs @@ -0,0 +1,126 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Diagnostics; +using System.Collections.Generic; +using System.IO; +using System.IO.Pipes; +using System.Linq; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Security.Principal; +using System.Text; +using System.Text.RegularExpressions; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + internal class IpcClient + { + public static string IpcRootPath { get; } = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? @"\\.\pipe\" : Path.GetTempPath(); + public static string DiagnosticsPortPattern { get; } = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? @"^dotnet-diagnostic-(\d+)$" : @"^dotnet-diagnostic-(\d+)-(\d+)-socket$"; + + private static double ConnectTimeoutMilliseconds { get; } = TimeSpan.FromSeconds(3).TotalMilliseconds; + + /// + /// Get the OS Transport to be used for communicating with a dotnet process. + /// + /// The PID of the dotnet process to get the transport for + /// A System.IO.Stream wrapper around the transport + private static Stream GetTransport(int processId) + { + try + { + var process = Process.GetProcessById(processId); + } + catch (System.ArgumentException) + { + throw new ServerNotAvailableException($"Process {processId} is not running."); + } + catch (System.InvalidOperationException) + { + throw new ServerNotAvailableException($"Process {processId} seems to be elevated."); + } + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + string pipeName = $"dotnet-diagnostic-{processId}"; + var namedPipe = new NamedPipeClientStream( + ".", pipeName, PipeDirection.InOut, PipeOptions.None, TokenImpersonationLevel.Impersonation); + namedPipe.Connect((int)ConnectTimeoutMilliseconds); + return namedPipe; + } + else + { + string ipcPort; + try + { + ipcPort = Directory.GetFiles(IpcRootPath, $"dotnet-diagnostic-{processId}-*-socket") // Try best match. + .OrderByDescending(f => new FileInfo(f).LastWriteTime) + .FirstOrDefault(); + if (ipcPort == null) + { + throw new ServerNotAvailableException($"Process {processId} not running compatible .NET Core runtime."); + } + } + catch (InvalidOperationException) + { + throw new ServerNotAvailableException($"Process {processId} not running compatible .NET Core runtime."); + } + string path = Path.Combine(IpcRootPath, ipcPort); + var remoteEP = new UnixDomainSocketEndPoint(path); + + var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified); + socket.Connect(remoteEP); + return new NetworkStream(socket); + } + } + + /// + /// Sends a single DiagnosticsIpc Message to the dotnet process with PID processId. + /// + /// The PID of the dotnet process + /// The DiagnosticsIpc Message to be sent + /// The response DiagnosticsIpc Message from the dotnet process + public static IpcMessage SendMessage(int processId, IpcMessage message) + { + using (var stream = GetTransport(processId)) + { + Write(stream, message); + return Read(stream); + } + } + + /// + /// Sends a single DiagnosticsIpc Message to the dotnet process with PID processId + /// and returns the Stream for reuse in Optional Continuations. + /// + /// The PID of the dotnet process + /// The DiagnosticsIpc Message to be sent + /// out var for response message + /// The response DiagnosticsIpc Message from the dotnet process + public static Stream SendMessage(int processId, IpcMessage message, out IpcMessage response) + { + var stream = GetTransport(processId); + Write(stream, message); + response = Read(stream); + return stream; + } + + private static void Write(Stream stream, byte[] buffer) + { + stream.Write(buffer, 0, buffer.Length); + } + + private static void Write(Stream stream, IpcMessage message) + { + Write(stream, message.Serialize()); + } + + private static IpcMessage Read(Stream stream) + { + return IpcMessage.Parse(stream); + } + } +} diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcCommands.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcCommands.cs new file mode 100644 index 0000000000..7c870e3c1f --- /dev/null +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcCommands.cs @@ -0,0 +1,42 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Text; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + internal enum DiagnosticsServerCommandSet : byte + { + Dump = 0x01, + EventPipe = 0x02, + Profiler = 0x03, + + Server = 0xFF, + } + + internal enum DiagnosticsServerCommandId : byte + { + OK = 0x00, + Error = 0xFF, + } + + internal enum EventPipeCommandId : byte + { + StopTracing = 0x01, + CollectTracing = 0x02, + CollectTracing2 = 0x03, + } + + internal enum DumpCommandId : byte + { + GenerateCoreDump = 0x01, + } + + internal enum ProfilerCommandId : byte + { + AttachProfiler = 0x01, + } +} diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcHeader.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcHeader.cs new file mode 100644 index 0000000000..3a8fe59287 --- /dev/null +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcHeader.cs @@ -0,0 +1,75 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Text; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + internal class IpcHeader + { + IpcHeader() { } + + public IpcHeader(DiagnosticsServerCommandSet commandSet, byte commandId) + { + CommandSet = (byte)commandSet; + CommandId = commandId; + } + + // the number of bytes for the DiagnosticsIpc::IpcHeader type in native code + public static readonly UInt16 HeaderSizeInBytes = 20; + private static readonly UInt16 MagicSizeInBytes = 14; + + public byte[] Magic = DotnetIpcV1; // byte[14] in native code + public UInt16 Size = HeaderSizeInBytes; + public byte CommandSet; + public byte CommandId; + public UInt16 Reserved = 0x0000; + + + // Helper expression to quickly get V1 magic string for comparison + // should be 14 bytes long + public static byte[] DotnetIpcV1 => Encoding.ASCII.GetBytes("DOTNET_IPC_V1" + '\0'); + + public byte[] Serialize() + { + using (var stream = new MemoryStream()) + using (var writer = new BinaryWriter(stream)) + { + writer.Write(Magic); + Debug.Assert(Magic.Length == MagicSizeInBytes); + writer.Write(Size); + writer.Write(CommandSet); + writer.Write(CommandId); + writer.Write((UInt16)0x0000); + writer.Flush(); + return stream.ToArray(); + } + } + + public static IpcHeader TryParse(BinaryReader reader) + { + IpcHeader header = new IpcHeader + { + Magic = reader.ReadBytes(14), + Size = reader.ReadUInt16(), + CommandSet = reader.ReadByte(), + CommandId = reader.ReadByte(), + Reserved = reader.ReadUInt16() + }; + + return header; + } + + override public string ToString() + { + return $"{{ Magic={Magic}; Size={Size}; CommandSet={CommandSet}; CommandId={CommandId}; Reserved={Reserved} }}"; + } + } +} diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcMessage.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcMessage.cs new file mode 100644 index 0000000000..06cd79df25 --- /dev/null +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcMessage.cs @@ -0,0 +1,108 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Runtime.InteropServices; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + /// + /// Different diagnostic message types that are handled by the runtime. + /// + internal enum DiagnosticsMessageType : uint + { + /// + /// Initiates core dump generation + /// + GenerateCoreDump = 1, + /// + /// Starts an EventPipe session that writes events to a file when the session is stopped or the application exits. + /// + StartEventPipeTracing = 1024, + /// + /// Stops an EventPipe session. + /// + StopEventPipeTracing = 1025, + /// + /// Starts an EventPipe session that sends events out-of-proc through IPC. + /// + CollectEventPipeTracing = 1026, + /// + /// Attaches a profiler to an existing process + /// + AttachProfiler = 2048, + } + + + /// + /// Message header used to send commands to the .NET Core runtime through IPC. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct MessageHeader + { + /// + /// Request type. + /// + public DiagnosticsMessageType RequestType; + + /// + /// Remote process Id. + /// + public uint Pid; + } + + + internal class IpcMessage + { + public IpcMessage() + { } + + public IpcMessage(IpcHeader header, byte[] payload) + { + Payload = payload; + Header = header; + } + + public IpcMessage(DiagnosticsServerCommandSet commandSet, byte commandId, byte[] payload = null) + : this(new IpcHeader(commandSet, commandId), payload) + { + } + + public byte[] Payload { get; private set; } = null; + public IpcHeader Header { get; private set; } = default; + + public byte[] Serialize() + { + byte[] serializedData = null; + // Verify things will fit in the size capacity + Header.Size = checked((UInt16)(IpcHeader.HeaderSizeInBytes + Payload.Length)); ; + byte[] headerBytes = Header.Serialize(); + + using (var stream = new MemoryStream()) + using (var writer = new BinaryWriter(stream)) + { + writer.Write(headerBytes); + writer.Write(Payload); + writer.Flush(); + serializedData = stream.ToArray(); + } + + return serializedData; + } + + public static IpcMessage Parse(Stream stream) + { + IpcMessage message = new IpcMessage(); + using (var reader = new BinaryReader(stream, Encoding.UTF8, true)) + { + message.Header = IpcHeader.TryParse(reader); + message.Payload = reader.ReadBytes(message.Header.Size - IpcHeader.HeaderSizeInBytes); + return message; + } + } + } +} diff --git a/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj b/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj new file mode 100644 index 0000000000..dcb33ec0f8 --- /dev/null +++ b/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj @@ -0,0 +1,15 @@ + + + Library + netcoreapp2.1 + Microsoft.Diagnostics.NETCore.Client + .NET Core Diagnostics Client Library + 0.1.0 + true + Diagnostic + $(Description) + true + true + true + + diff --git a/src/Tools/Common/Commands/ProcessStatus.cs b/src/Tools/Common/Commands/ProcessStatus.cs index cdf2111fbd..8fc3ce68a8 100644 --- a/src/Tools/Common/Commands/ProcessStatus.cs +++ b/src/Tools/Common/Commands/ProcessStatus.cs @@ -8,7 +8,7 @@ using System.Linq; using System.Text; -using Microsoft.Diagnostics.Tools.RuntimeClient; +using Microsoft.Diagnostics.NETCore.Client; namespace Microsoft.Internal.Common.Commands { @@ -22,7 +22,7 @@ public static void PrintProcessStatus(IConsole console) try { StringBuilder sb = new StringBuilder(); - var processes = EventPipeClient.ListAvailablePorts() + var processes = DiagnosticsClient.GetPublishedProcesses() .Select(GetProcessById) .Where(process => process != null) .OrderBy(process => process.ProcessName) diff --git a/src/Tools/dotnet-counters/CounterMonitor.cs b/src/Tools/dotnet-counters/CounterMonitor.cs index d4097ecb22..835ee6f7a7 100644 --- a/src/Tools/dotnet-counters/CounterMonitor.cs +++ b/src/Tools/dotnet-counters/CounterMonitor.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Diagnostics.Tools.RuntimeClient; +using Microsoft.Diagnostics.NETCore.Client; using System; using System.Collections.Generic; using System.CommandLine; @@ -26,9 +26,10 @@ public class CounterMonitor private IConsole _console; private ICounterRenderer _renderer; private CounterFilter filter; - private ulong _sessionId; private string _output; private bool pauseCmdSet; + private DiagnosticsClient _diagnosticsClient; + private EventPipeSession _session; public CounterMonitor() { @@ -59,7 +60,7 @@ private void StopMonitor() { try { - EventPipeClient.StopTracing(_processId, _sessionId); + _session.Stop(); } catch (EndOfStreamException ex) { @@ -91,6 +92,7 @@ public async Task Monitor(CancellationToken ct, List counter_list, _processId = processId; _interval = refreshInterval; _renderer = new ConsoleWriter(); + _diagnosticsClient = new DiagnosticsClient(processId); return await Start(); } @@ -99,7 +101,7 @@ public async Task Monitor(CancellationToken ct, List counter_list, { try { - EventPipeClient.StopTracing(_processId, _sessionId); + _session.Stop(); } catch (Exception) {} // Swallow all exceptions for now. @@ -118,6 +120,7 @@ public async Task Collect(CancellationToken ct, List counter_list, _processId = processId; _interval = refreshInterval; _output = output; + _diagnosticsClient = new DiagnosticsClient(processId); if (_output.Length == 0) { @@ -154,30 +157,6 @@ public async Task Collect(CancellationToken ct, List counter_list, return 1; } - - // Use EventPipe CollectTracing2 command to start monitoring. This may throw. - private EventPipeEventSource RequestTracingV2(string providerString) - { - var configuration = new SessionConfigurationV2( - circularBufferSizeMB: 1000, - format: EventPipeSerializationFormat.NetTrace, - requestRundown: false, - providers: Trace.Extensions.ToProviders(providerString)); - var binaryReader = EventPipeClient.CollectTracing2(_processId, configuration, out _sessionId); - return new EventPipeEventSource(binaryReader); - } - - // Use EventPipe CollectTracing command to start monitoring. This may throw. - private EventPipeEventSource RequestTracingV1(string providerString) - { - var configuration = new SessionConfiguration( - circularBufferSizeMB: 1000, - format: EventPipeSerializationFormat.NetTrace, - providers: Trace.Extensions.ToProviders(providerString)); - var binaryReader = EventPipeClient.CollectTracing(_processId, configuration, out _sessionId); - return new EventPipeEventSource(binaryReader); - } - private string BuildProviderString() { string providerString; @@ -257,23 +236,16 @@ private async Task Start() Task monitorTask = new Task(() => { try { - EventPipeEventSource source = null; - - try - { - source = RequestTracingV2(providerString); - } - catch (EventPipeUnknownCommandException) - { - // If unknown command exception is thrown, it's likely the app being monitored is - // running an older version of runtime that doesn't support CollectTracingV2. Try again with V1. - source = RequestTracingV1(providerString); - } - + _session = _diagnosticsClient.StartEventPipeSession(Trace.Extensions.ToProviders(providerString), false); + var source = new EventPipeEventSource(_session.EventStream); source.Dynamic.All += DynamicAllMonitor; _renderer.EventPipeSourceConnected(); source.Process(); } + catch (DiagnosticsClientException ex) + { + Console.WriteLine($"Failed to start the counter session: {ex.ToString()}"); + } catch (Exception ex) { Debug.WriteLine($"[ERROR] {ex.ToString()}"); diff --git a/src/Tools/dotnet-counters/Program.cs b/src/Tools/dotnet-counters/Program.cs index 318d40fba9..ca6d20b9f9 100644 --- a/src/Tools/dotnet-counters/Program.cs +++ b/src/Tools/dotnet-counters/Program.cs @@ -11,7 +11,7 @@ using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; -using Microsoft.Diagnostics.Tools.RuntimeClient; +using Microsoft.Diagnostics.NETCore.Client; using Microsoft.Internal.Common.Commands; namespace Microsoft.Diagnostics.Tools.Counters diff --git a/src/Tools/dotnet-counters/dotnet-counters.csproj b/src/Tools/dotnet-counters/dotnet-counters.csproj index b8418707eb..4dc5bed68d 100644 --- a/src/Tools/dotnet-counters/dotnet-counters.csproj +++ b/src/Tools/dotnet-counters/dotnet-counters.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/Tools/dotnet-dump/Dumper.cs b/src/Tools/dotnet-dump/Dumper.cs index 5d94f515d0..3f1c37d50e 100644 --- a/src/Tools/dotnet-dump/Dumper.cs +++ b/src/Tools/dotnet-dump/Dumper.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Diagnostics.Tools.RuntimeClient; +using Microsoft.Diagnostics.NETCore.Client; using System; using System.CommandLine; using System.Diagnostics; @@ -61,14 +61,11 @@ public async Task Collect(IConsole console, int processId, string output, b } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { - DiagnosticsHelpers.DumpType dumpType = type == DumpTypeOption.Heap ? DiagnosticsHelpers.DumpType.WithHeap : DiagnosticsHelpers.DumpType.Normal; + var client = new DiagnosticsClient(processId); + DumpType dumpType = type == DumpTypeOption.Heap ? DumpType.WithHeap : DumpType.Normal; // Send the command to the runtime to initiate the core dump - var hr = DiagnosticsHelpers.GenerateCoreDump(processId, output, dumpType, diag); - if (hr != 0) - { - throw new InvalidOperationException($"Core dump generation FAILED 0x{hr:X8}"); - } + client.WriteDump(dumpType, output, diag); } else { throw new PlatformNotSupportedException($"Unsupported operating system: {RuntimeInformation.OSDescription}"); @@ -81,7 +78,8 @@ ex is UnauthorizedAccessException || ex is PlatformNotSupportedException || ex is InvalidDataException || ex is InvalidOperationException || - ex is NotSupportedException) + ex is NotSupportedException || + ex is DiagnosticsClientException) { console.Error.WriteLine($"{ex.Message}"); return 1; diff --git a/src/Tools/dotnet-dump/Program.cs b/src/Tools/dotnet-dump/Program.cs index 2f2d9aa041..c206bd3365 100644 --- a/src/Tools/dotnet-dump/Program.cs +++ b/src/Tools/dotnet-dump/Program.cs @@ -7,7 +7,7 @@ using System.CommandLine.Invocation; using System.IO; using System.Threading.Tasks; -using Microsoft.Diagnostics.Tools.RuntimeClient; +using Microsoft.Diagnostics.NETCore.Client; using Microsoft.Internal.Common.Commands; namespace Microsoft.Diagnostics.Tools.Dump diff --git a/src/Tools/dotnet-dump/dotnet-dump.csproj b/src/Tools/dotnet-dump/dotnet-dump.csproj index c6ba3724d2..d93281273e 100644 --- a/src/Tools/dotnet-dump/dotnet-dump.csproj +++ b/src/Tools/dotnet-dump/dotnet-dump.csproj @@ -23,7 +23,7 @@ - + diff --git a/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs b/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs index 5ad9bd9245..4be21afb8e 100644 --- a/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs +++ b/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Diagnostics.Tools.RuntimeClient; using System; using System.Collections.Generic; using System.CommandLine; diff --git a/src/Tools/dotnet-gcdump/CommandLine/ProcessStatusCommandHandler.cs b/src/Tools/dotnet-gcdump/CommandLine/ProcessStatusCommandHandler.cs index 056be27294..4e15083f0c 100644 --- a/src/Tools/dotnet-gcdump/CommandLine/ProcessStatusCommandHandler.cs +++ b/src/Tools/dotnet-gcdump/CommandLine/ProcessStatusCommandHandler.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Diagnostics.Tools.RuntimeClient; using Microsoft.Internal.Common.Commands; using System; using System.CommandLine; diff --git a/src/Tools/dotnet-gcdump/DotNetHeapDump/EventPipeDotNetHeapDumper.cs b/src/Tools/dotnet-gcdump/DotNetHeapDump/EventPipeDotNetHeapDumper.cs index 440a2b2e51..511bb448f2 100644 --- a/src/Tools/dotnet-gcdump/DotNetHeapDump/EventPipeDotNetHeapDumper.cs +++ b/src/Tools/dotnet-gcdump/DotNetHeapDump/EventPipeDotNetHeapDumper.cs @@ -3,13 +3,14 @@ // See the LICENSE file in the project root for more information. using Graphs; -using Microsoft.Diagnostics.Tools.RuntimeClient; +using Microsoft.Diagnostics.NETCore.Client; using Microsoft.Diagnostics.Tracing; using Microsoft.Diagnostics.Tracing.Parsers; using Microsoft.Diagnostics.Tracing.Parsers.Clr; using System; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.Tracing; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -48,7 +49,9 @@ public static bool DumpFromEventPipe(CancellationToken ct, int processID, Memory bool fDone = false; log.WriteLine("{0,5:n1}s: Creating type table flushing task", getElapsed().TotalSeconds); - using (EventPipeSession typeFlushSession = new EventPipeSession(processID, new List { new Provider("Microsoft-DotNETCore-SampleProfiler") }, false)) + using (EventPipeSessionController typeFlushSession = new EventPipeSessionController(processID, new List { + new EventPipeProvider("Microsoft-DotNETCore-SampleProfiler", EventLevel.Informational) + }, false)) { log.WriteLine("{0,5:n1}s: Flushing the type table", getElapsed().TotalSeconds); typeFlushSession.Source.AllEvents += (traceEvent) => { @@ -68,7 +71,9 @@ public static bool DumpFromEventPipe(CancellationToken ct, int processID, Memory // Start the providers and trigger the GCs. log.WriteLine("{0,5:n1}s: Requesting a .NET Heap Dump", getElapsed().TotalSeconds); - using EventPipeSession gcDumpSession = new EventPipeSession(processID, new List { new Provider("Microsoft-Windows-DotNETRuntime", (ulong)(ClrTraceEventParser.Keywords.GCHeapSnapshot)) }); + using EventPipeSessionController gcDumpSession = new EventPipeSessionController(processID, new List { + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Verbose, (long)(ClrTraceEventParser.Keywords.GCHeapSnapshot)) + }); log.WriteLine("{0,5:n1}s: gcdump EventPipe Session started", getElapsed().TotalSeconds); int gcNum = -1; @@ -211,35 +216,29 @@ public static bool DumpFromEventPipe(CancellationToken ct, int processID, Memory } } - internal class EventPipeSession : IDisposable + internal class EventPipeSessionController : IDisposable { - private List _providers; - private Stream _eventPipeStream; + private List _providers; + private DiagnosticsClient _client; + private EventPipeSession _session; private EventPipeEventSource _source; - private ulong _sessionId; private int _pid; - public ulong SessionId => _sessionId; - public IReadOnlyList Providers => _providers.AsReadOnly(); + public IReadOnlyList Providers => _providers.AsReadOnly(); public EventPipeEventSource Source => _source; - public EventPipeSession(int pid, List providers, bool requestRundown = true) + public EventPipeSessionController(int pid, List providers, bool requestRundown = true) { _pid = pid; _providers = providers; - var config = new SessionConfigurationV2( - circularBufferSizeMB: 1024, - format: EventPipeSerializationFormat.NetTrace, - requestRundown: requestRundown, - providers - ); - _eventPipeStream = EventPipeClient.CollectTracing2(pid, config, out _sessionId); - _source = new EventPipeEventSource(_eventPipeStream); + _client = new DiagnosticsClient(pid); + _session = _client.StartEventPipeSession(providers, requestRundown, 1024); + _source = new EventPipeEventSource(_session.EventStream); } public void EndSession() { - EventPipeClient.StopTracing(_pid, _sessionId); + _session.Stop(); } #region IDisposable Support @@ -251,7 +250,7 @@ protected virtual void Dispose(bool disposing) { if (disposing) { - _eventPipeStream?.Dispose(); + _session?.Dispose(); _source?.Dispose(); } disposedValue = true; diff --git a/src/Tools/dotnet-gcdump/dotnet-gcdump.csproj b/src/Tools/dotnet-gcdump/dotnet-gcdump.csproj index 6c09dc9963..11d02c0a2a 100644 --- a/src/Tools/dotnet-gcdump/dotnet-gcdump.csproj +++ b/src/Tools/dotnet-gcdump/dotnet-gcdump.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs index 0776c50598..41014bc5d2 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Diagnostics.Tools.RuntimeClient; +using Microsoft.Diagnostics.NETCore.Client; using System; using System.Collections.Generic; using System.CommandLine; @@ -64,7 +64,7 @@ private static async Task Collect(CancellationToken ct, IConsole console, i Dictionary enabledBy = new Dictionary(); var providerCollection = Extensions.ToProviders(providers); - foreach (Provider providerCollectionProvider in providerCollection) + foreach (EventPipeProvider providerCollectionProvider in providerCollection) { enabledBy[providerCollectionProvider.Name] = "--providers "; } @@ -92,11 +92,6 @@ private static async Task Collect(CancellationToken ct, IConsole console, i PrintProviders(providerCollection, enabledBy); var process = Process.GetProcessById(processId); - var configuration = new SessionConfiguration( - circularBufferSizeMB: buffersize, - format: EventPipeSerializationFormat.NetTrace, - providers: providerCollection); - var shouldExit = new ManualResetEvent(false); var shouldStopAfterDuration = duration != default(TimeSpan); var failed = false; @@ -105,11 +100,20 @@ private static async Task Collect(CancellationToken ct, IConsole console, i ct.Register(() => shouldExit.Set()); - ulong sessionId = 0; - using (Stream stream = EventPipeClient.CollectTracing(processId, configuration, out sessionId)) + var diagnosticsClient = new DiagnosticsClient(processId); using (VirtualTerminalMode vTermMode = VirtualTerminalMode.TryEnable()) { - if (sessionId == 0) + EventPipeSession session = null; + try + { + session = diagnosticsClient.StartEventPipeSession(providerCollection, true); + } + catch (DiagnosticsClientException e) + { + Console.Error.WriteLine($"Unable to start a tracing session: {e.ToString()}"); + } + + if (session == null) { Console.Error.WriteLine("Unable to create session."); return ErrorCodes.SessionCreationError; @@ -142,7 +146,7 @@ private static async Task Collect(CancellationToken ct, IConsole console, i while (true) { - int nBytesRead = stream.Read(buffer, 0, buffer.Length); + int nBytesRead = session.EventStream.Read(buffer, 0, buffer.Length); if (nBytesRead <= 0) break; fs.Write(buffer, 0, nBytesRead); @@ -180,7 +184,7 @@ private static async Task Collect(CancellationToken ct, IConsole console, i if (!terminated) { durationTimer?.Stop(); - EventPipeClient.StopTracing(processId, sessionId); + session.Stop(); } await collectingTask; } @@ -200,7 +204,7 @@ private static async Task Collect(CancellationToken ct, IConsole console, i } } - private static void PrintProviders(IReadOnlyList providers, Dictionary enabledBy) + private static void PrintProviders(IReadOnlyList providers, Dictionary enabledBy) { Console.Out.WriteLine(""); Console.Out.Write(String.Format("{0, -40}","Provider Name")); // +4 is for the tab @@ -209,10 +213,12 @@ private static void PrintProviders(IReadOnlyList providers, Dictionary Console.Out.Write("Enabled By\n"); foreach (var provider in providers) { - Console.Out.WriteLine(String.Format("{0, -80}", $"{provider.ToDisplayString()}") + $"{enabledBy[provider.Name]}"); + Console.Out.WriteLine(String.Format("{0, -80}", $"{GetProviderDisplayString(provider)}") + $"{enabledBy[provider.Name]}"); } Console.Out.WriteLine(); } + private static string GetProviderDisplayString(EventPipeProvider provider) => + String.Format("{0, -40}", provider.Name) + String.Format("0x{0, -18}", $"{provider.Keywords:X16}") + String.Format("{0, -8}", provider.EventLevel.ToString() + $"({(int)provider.EventLevel})"); private static int prevBufferWidth = 0; private static string clearLineString = ""; diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs index cddfb89089..ced5842d4b 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Diagnostics.Tools.RuntimeClient; +using Microsoft.Diagnostics.NETCore.Client; using System; using System.IO; using System.CommandLine; diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/ListProcessesCommandHandler.cs b/src/Tools/dotnet-trace/CommandLine/Commands/ListProcessesCommandHandler.cs index c8afc5695d..c30ec69404 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/ListProcessesCommandHandler.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/ListProcessesCommandHandler.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Diagnostics.Tools.RuntimeClient; using Microsoft.Internal.Common.Commands; using System; using System.CommandLine; diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs b/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs index f8ec9089fd..a182ae3f4a 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Diagnostics.Tools.RuntimeClient; +using Microsoft.Diagnostics.NETCore.Client; using Microsoft.Diagnostics.Tracing.Parsers; using System; using System.Collections.Generic; @@ -39,35 +39,35 @@ public static Command ListProfilesCommand() => handler: CommandHandler.Create(GetProfiles), isHidden: false); - // FIXME: Read from a config file! internal static IEnumerable DotNETRuntimeProfiles { get; } = new[] { new Profile( "cpu-sampling", - new Provider[] { - new Provider("Microsoft-DotNETCore-SampleProfiler"), - new Provider("Microsoft-Windows-DotNETRuntime", (ulong)ClrTraceEventParser.Keywords.Default, EventLevel.Informational), + new EventPipeProvider[] { + new EventPipeProvider("Microsoft-DotNETCore-SampleProfiler", EventLevel.Informational), + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Informational, (long)ClrTraceEventParser.Keywords.Default) }, "Useful for tracking CPU usage and general .NET runtime information. This is the default option if no profile or providers are specified."), new Profile( "gc-verbose", - new Provider[] { - new Provider( + new EventPipeProvider[] { + new EventPipeProvider( name: "Microsoft-Windows-DotNETRuntime", - keywords: (ulong)ClrTraceEventParser.Keywords.GC | - (ulong)ClrTraceEventParser.Keywords.GCHandle | - (ulong)ClrTraceEventParser.Keywords.Exception, - eventLevel: EventLevel.Verbose + eventLevel: EventLevel.Verbose, + keywords: (long)ClrTraceEventParser.Keywords.GC | + (long)ClrTraceEventParser.Keywords.GCHandle | + (long)ClrTraceEventParser.Keywords.Exception ), }, "Tracks GC collections and samples object allocations."), new Profile( "gc-collect", - new Provider[] { - new Provider( + new EventPipeProvider[] { + new EventPipeProvider( name: "Microsoft-Windows-DotNETRuntime", - keywords: (ulong)ClrTraceEventParser.Keywords.GC | - (ulong)ClrTraceEventParser.Keywords.Exception, - eventLevel: EventLevel.Informational), + eventLevel: EventLevel.Informational, + keywords: (long)ClrTraceEventParser.Keywords.GC | + (long)ClrTraceEventParser.Keywords.Exception + ) }, "Tracks GC collections only at very low overhead."), }; diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/StopCommandHandler.cs b/src/Tools/dotnet-trace/CommandLine/Commands/StopCommandHandler.cs deleted file mode 100644 index 073ffb4058..0000000000 --- a/src/Tools/dotnet-trace/CommandLine/Commands/StopCommandHandler.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using Microsoft.Diagnostics.Tools.RuntimeClient; -using System; -using System.CommandLine; -using System.CommandLine.Invocation; -using System.Threading.Tasks; - -namespace Microsoft.Diagnostics.Tools.Trace -{ - internal static class StopCommandHandler - { - public static async Task Stop(IConsole console, int processId, ulong sessionId) - { - try - { - EventPipeClient.StopTracing(processId, sessionId); - - await Task.FromResult(0); - return sessionId != 0 ? 0 : 1; - } - catch (Exception ex) - { - Console.Error.WriteLine($"[ERROR] {ex.ToString()}"); - return 1; - } - } - - public static Command StopCommand() => - new Command( - name: "stop", - description: "Stops an EventPipe session.", - symbols: new Option[] { - CommonOptions.ProcessIdOption(), - SessionIdOption(), - }, - handler: CommandHandler.Create(Stop), - isHidden: true); - - private static Option SessionIdOption() => - new Option( - new[] { "--session-id" }, - @"Session Id being recorded.", - new Argument { Name = "SessionId" }); - } -} diff --git a/src/Tools/dotnet-trace/Extensions.cs b/src/Tools/dotnet-trace/Extensions.cs index a1055eeeb3..59b54664ec 100644 --- a/src/Tools/dotnet-trace/Extensions.cs +++ b/src/Tools/dotnet-trace/Extensions.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Diagnostics.Tools.RuntimeClient; +using Microsoft.Diagnostics.NETCore.Client; using System; using System.Collections.Generic; using System.Diagnostics.Tracing; @@ -14,12 +14,12 @@ internal static class Extensions { private static EventLevel defaultEventLevel = EventLevel.Verbose; - public static List ToProviders(string providers) + public static List ToProviders(string providers) { if (providers == null) throw new ArgumentNullException(nameof(providers)); return string.IsNullOrWhiteSpace(providers) ? - new List() : providers.Split(',').Select(ToProvider).ToList(); + new List() : providers.Split(',').Select(ToProvider).ToList(); } private static EventLevel GetEventLevel(string token) @@ -51,7 +51,7 @@ private static EventLevel GetEventLevel(string token) } } - private static Provider ToProvider(string provider) + private static EventPipeProvider ToProvider(string provider) { if (string.IsNullOrWhiteSpace(provider)) throw new ArgumentNullException(nameof(provider)); @@ -71,8 +71,8 @@ private static Provider ToProvider(string provider) throw new ArgumentException("Provider name was not specified."); // Keywords - ulong keywords = tokens.Length > 1 && !string.IsNullOrWhiteSpace(tokens[1]) ? - Convert.ToUInt64(tokens[1], 16) : ulong.MaxValue; + long keywords = tokens.Length > 1 && !string.IsNullOrWhiteSpace(tokens[1]) ? + Convert.ToInt64(tokens[1], 16) : -1; // Level EventLevel eventLevel = tokens.Length > 2 && !string.IsNullOrWhiteSpace(tokens[2]) ? @@ -80,9 +80,57 @@ private static Provider ToProvider(string provider) // Event counters string filterData = tokens.Length > 3 ? tokens[3] : null; - filterData = string.IsNullOrWhiteSpace(filterData) ? null : filterData; + var argument = string.IsNullOrWhiteSpace(filterData) ? null : ParseArgumentString(filterData); + return new EventPipeProvider(providerName, eventLevel, keywords, argument); + } + + private static Dictionary ParseArgumentString(string argument) + { + if (argument == "") + { + return null; + } + var argumentDict = new Dictionary(); - return new Provider(providerName, keywords, eventLevel, filterData); + int keyStart = 0; + int keyEnd = 0; + int valStart = 0; + int valEnd = 0; + int curIdx = 0; + bool inQuote = false; + foreach (var c in argument) + { + if (inQuote) + { + if (c == '\"') + { + inQuote = false; + } + } + else + { + if (c == '=') + { + keyEnd = curIdx; + valStart = curIdx+1; + } + else if (c == ';') + { + valEnd = curIdx; + argumentDict.Add(argument.Substring(keyStart, keyEnd-keyStart), argument.Substring(valStart, valEnd-valStart)); + keyStart = curIdx+1; // new key starts + } + else if (c == '\"') + { + inQuote = true; + } + } + curIdx += 1; + } + string key = argument.Substring(keyStart, keyEnd - keyStart); + string val = argument.Substring(valStart); + argumentDict.Add(key, val); + return argumentDict; } } } diff --git a/src/Tools/dotnet-trace/Profile.cs b/src/Tools/dotnet-trace/Profile.cs index 7bc28c0887..078ef9d854 100644 --- a/src/Tools/dotnet-trace/Profile.cs +++ b/src/Tools/dotnet-trace/Profile.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Diagnostics.Tools.RuntimeClient; +using Microsoft.Diagnostics.NETCore.Client; using System.Collections.Generic; using System.Linq; @@ -10,32 +10,32 @@ namespace Microsoft.Diagnostics.Tools.Trace { internal sealed class Profile { - public Profile(string name, IEnumerable providers, string description) + public Profile(string name, IEnumerable providers, string description) { Name = name; - Providers = providers == null ? Enumerable.Empty() : new List(providers).AsReadOnly(); + Providers = providers == null ? Enumerable.Empty() : new List(providers).AsReadOnly(); Description = description; } public string Name { get; } - public IEnumerable Providers { get; } + public IEnumerable Providers { get; } public string Description { get; } - public static void MergeProfileAndProviders(Profile selectedProfile, List providerCollection, Dictionary enabledBy) + public static void MergeProfileAndProviders(Profile selectedProfile, List providerCollection, Dictionary enabledBy) { - var profileProviders = new List(); + var profileProviders = new List(); // If user defined a different key/level on the same provider via --providers option that was specified via --profile option, // --providers option takes precedence. Go through the list of providers specified and only add it if it wasn't specified // via --providers options. if (selectedProfile.Providers != null) { - foreach (Provider selectedProfileProvider in selectedProfile.Providers) + foreach (EventPipeProvider selectedProfileProvider in selectedProfile.Providers) { bool shouldAdd = true; - foreach (Provider providerCollectionProvider in providerCollection) + foreach (EventPipeProvider providerCollectionProvider in providerCollection) { if (providerCollectionProvider.Name.Equals(selectedProfileProvider.Name)) { diff --git a/src/Tools/dotnet-trace/Program.cs b/src/Tools/dotnet-trace/Program.cs index 48d00fb327..606f7ae62c 100644 --- a/src/Tools/dotnet-trace/Program.cs +++ b/src/Tools/dotnet-trace/Program.cs @@ -13,9 +13,6 @@ class Program public static Task Main(string[] args) { var parser = new CommandLineBuilder() -#if DEBUG - .AddCommand(StopCommandHandler.StopCommand()) -#endif .AddCommand(CollectCommandHandler.CollectCommand()) .AddCommand(ListProcessesCommandHandler.ListProcessesCommand()) .AddCommand(ListProfilesCommandHandler.ListProfilesCommand()) diff --git a/src/Tools/dotnet-trace/dotnet-trace.csproj b/src/Tools/dotnet-trace/dotnet-trace.csproj index 43dfc2dc2a..2f7e371333 100644 --- a/src/Tools/dotnet-trace/dotnet-trace.csproj +++ b/src/Tools/dotnet-trace/dotnet-trace.csproj @@ -16,7 +16,7 @@ - + diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/CommonHelper.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/CommonHelper.cs new file mode 100644 index 0000000000..d1109110fb --- /dev/null +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/CommonHelper.cs @@ -0,0 +1,28 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; + +using Microsoft.Diagnostics.TestHelpers; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + public class CommonHelper + { + public static string HostExe = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? + "..\\..\\..\\..\\..\\.dotnet\\dotnet.exe" : "../../../../../.dotnet/dotnet"; + + public static string GetTraceePath() + { + var curPath = Directory.GetCurrentDirectory(); +; + var traceePath = curPath.Replace("Microsoft.Diagnostics.NETCore.Client.UnitTests", "Tracee"); + + return Path.Combine(traceePath, "Tracee.dll"); + } + } +} \ No newline at end of file diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeProviderTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeProviderTests.cs new file mode 100644 index 0000000000..5f66f28e32 --- /dev/null +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeProviderTests.cs @@ -0,0 +1,113 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Diagnostics.NETCore.Client; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.Tracing; +using Xunit; + + +namespace Microsoft.Diagnostics.NETCore.Client +{ + + /// + /// Suite of tests that test top-level commands + /// + public class EventPipeProviderTests + { + [Fact] + public void EqualTest1() + { + EventPipeProvider provider1 = new EventPipeProvider("myProvider", EventLevel.Informational); + EventPipeProvider provider2 = new EventPipeProvider("myProvider", EventLevel.Informational); + Assert.True(provider1 == provider2); + } + + [Fact] + public void EqualTest2() + { + EventPipeProvider provider1 = new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Verbose, (long)(-1)); + EventPipeProvider provider2 = new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Verbose, (long)(-1)); + Assert.True(provider1 == provider2); + } + + [Fact] + public void EqualTest3() + { + EventPipeProvider provider1 = new EventPipeProvider( + "System.Runtime", + EventLevel.Verbose, + (long)(-1), + new Dictionary() { + { "EventCounterIntervalSec", "1" } + }); + EventPipeProvider provider2 = new EventPipeProvider( + "System.Runtime", + EventLevel.Verbose, + (long)(-1), + new Dictionary() { + { "EventCounterIntervalSec", "1" } + }); + Assert.True(provider1 == provider2); + } + + [Fact] + public void InEqualityTest() + { + var providers = new EventPipeProvider[5]; + providers[0] = new EventPipeProvider("myProvider", EventLevel.Informational); + providers[1] = new EventPipeProvider("myProvider", EventLevel.Informational, (long)(-1)); + providers[2] = new EventPipeProvider("myProvider", EventLevel.Verbose, (long)(-1)); + providers[3] = new EventPipeProvider( + "myProvider", + EventLevel.Verbose, + (long)(-1), + new Dictionary() { + { "EventCounterIntervalSec", "1" } + }); + providers[4] = new EventPipeProvider( + "myProvider", + EventLevel.Verbose, + (long)(-1), + new Dictionary() { + { "EventCounterIntervalSec", "2" } + }); + + for (var i = 0; i < providers.Length-1; i++) + { + for (var j = i+1; j < providers.Length; j++) + { + Assert.True(providers[i] != providers[j]); + } + } + } + + [Fact] + public void ToStringTest1() + { + var provider = new EventPipeProvider("MyProvider", EventLevel.Verbose, (long)(0xdeadbeef)); + Assert.Equal("MyProvider:0x00000000DEADBEEF:5", provider.ToString()); + } + + [Fact] + public void ToStringTest2() + { + var provider1 = new EventPipeProvider("MyProvider", EventLevel.Verbose, (long)(0xdeadbeef), + new Dictionary() + { + { "key1", "value1" }, + }); + var provider2 = new EventPipeProvider("MyProvider", EventLevel.Verbose, (long)(0xdeadbeef), + new Dictionary() + { + { "key1", "value1" }, + { "key2", "value2" } + }); + Assert.Equal("MyProvider:0x00000000DEADBEEF:5:key1=value1", provider1.ToString()); + Assert.Equal("MyProvider:0x00000000DEADBEEF:5:key1=value1;key2=value2", provider2.ToString()); + } + } +} diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs new file mode 100644 index 0000000000..6344f47491 --- /dev/null +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs @@ -0,0 +1,115 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.Tracing; +using System.IO; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using Xunit; +using Xunit.Abstractions; + +using Microsoft.Diagnostics.Tracing; +using Microsoft.Diagnostics.TestHelpers; +using Microsoft.Diagnostics.NETCore.Client; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + public class EventPipeSessionTests + { + private readonly ITestOutputHelper output; + + public EventPipeSessionTests(ITestOutputHelper outputHelper) + { + output = outputHelper; + } + + /// + /// A simple test that checks if we can create an EventPipeSession on a child process + /// + [Fact] + public void BasicEventPipeSessionTest() + { + TestRunner runner = new TestRunner(CommonHelper.GetTraceePath(), output); + runner.Start(3000); + DiagnosticsClient client = new DiagnosticsClient(runner.Pid); + using (var session = client.StartEventPipeSession(new List() + { + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Informational) + })) + { + Assert.True(session.EventStream != null); + } + runner.Stop(); + } + + /// + /// Checks if we can create an EventPipeSession and can get some expected events out of it. + /// + [Fact] + public void EventPipeSessionStreamTest() + { + TestRunner runner = new TestRunner(CommonHelper.GetTraceePath(), output); + runner.Start(5000); + DiagnosticsClient client = new DiagnosticsClient(runner.Pid); + runner.PrintStatus(); + output.WriteLine($"[{DateTime.Now.ToString()}] Trying to start an EventPipe session on process {runner.Pid}"); + using (var session = client.StartEventPipeSession(new List() + { + new EventPipeProvider("System.Runtime", EventLevel.Informational, 0, new Dictionary() { + { "EventCounterIntervalSec", "1" } + }) + })) + { + var evntCnt = 0; + + Task streamTask = Task.Run(() => { + var source = new EventPipeEventSource(session.EventStream); + source.Dynamic.All += (TraceEvent obj) => { + output.WriteLine("Got an event"); + evntCnt += 1; + }; + try + { + source.Process(); + } + catch (Exception e) + { + Console.WriteLine("Error encountered while processing events"); + Assert.Equal("", e.ToString()); + } + finally + { + runner.Stop(); + } + }); + output.WriteLine("Waiting for stream Task"); + streamTask.Wait(10000); + output.WriteLine("Done waiting for stream Task"); + Assert.True(evntCnt > 0); + } + } + + /// + /// Tries to start an EventPipe session on a non-existent process + /// + [Fact] + public void EventPipeSessionUnavailableTest() + { + List pids = new List(DiagnosticsClient.GetPublishedProcesses()); + int arbitraryPid = 1; + + DiagnosticsClient client = new DiagnosticsClient(arbitraryPid); + + Assert.Throws(() => client.StartEventPipeSession(new List() + { + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Informational) + })); + } + } +} diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs new file mode 100644 index 0000000000..7ecc0e8281 --- /dev/null +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs @@ -0,0 +1,75 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Threading; +using System.Runtime.InteropServices; +using Xunit; +using Xunit.Abstractions; + +using Microsoft.Diagnostics.TestHelpers; +using Microsoft.Diagnostics.NETCore.Client; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + + /// + /// Suite of tests that test top-level commands + /// + public class GetPublishedProcessesTest + { + private readonly ITestOutputHelper output; + + public GetPublishedProcessesTest(ITestOutputHelper outputHelper) + { + output = outputHelper; + } + + [Fact] + public void PublishedProcessTest1() + { + TestRunner runner = new TestRunner(CommonHelper.GetTraceePath(), output); + runner.Start(3000); + List publishedProcesses = new List(DiagnosticsClient.GetPublishedProcesses()); + foreach(int p in publishedProcesses) + { + output.WriteLine($"[{DateTime.Now.ToString()}] Saw published process {p}"); + } + Assert.Contains(publishedProcesses, p => p == runner.Pid); + runner.Stop(); + } + + [Fact] + public void MultiplePublishedProcessTest() + { + TestRunner[] runner = new TestRunner[3]; + int[] pids = new int[3]; + + for (var i = 0; i < 3; i++) + { + runner[i] = new TestRunner(CommonHelper.GetTraceePath(), output); + runner[i].Start(500); + pids[i] = runner[i].Pid; + } + List publishedProcesses = new List(DiagnosticsClient.GetPublishedProcesses()); + foreach(int p in publishedProcesses) + { + output.WriteLine($"[{DateTime.Now.ToString()}] Saw published process {p}"); + } + + for (var i = 0; i < 3; i++) + { + Assert.Contains(publishedProcesses, p => p == pids[i]); + } + + for (var i = 0 ; i < 3; i++) + { + runner[i].Stop(); + } + } + } +} diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj b/src/tests/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj new file mode 100644 index 0000000000..772f23d5a6 --- /dev/null +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj @@ -0,0 +1,13 @@ + + + + netcoreapp3.0 + + + + + + + + + diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/TestRunner.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/TestRunner.cs new file mode 100644 index 0000000000..420bde839b --- /dev/null +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/TestRunner.cs @@ -0,0 +1,86 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; +using Xunit; +using Xunit.Abstractions; + +using Microsoft.Diagnostics.TestHelpers; + +using Microsoft.Diagnostics.NETCore.Client; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + public class TestRunner + { + private Process testProcess; + private ProcessStartInfo startInfo; + private ITestOutputHelper outputHelper; + + public TestRunner(string testExePath, ITestOutputHelper _outputHelper=null) + { + startInfo = new ProcessStartInfo(CommonHelper.HostExe, testExePath); + startInfo.UseShellExecute = false; + startInfo.RedirectStandardOutput = true; + outputHelper = _outputHelper; + } + + public void AddEnvVar(string key, string value) + { + startInfo.EnvironmentVariables[key] = value; + } + + public void Start(int timeoutInMS=0) + { + if (outputHelper != null) + outputHelper.WriteLine("$[{DateTime.Now.ToString()}] Launching test: " + startInfo.FileName); + + testProcess = Process.Start(startInfo); + + if (testProcess == null) + { + outputHelper.WriteLine($"Could not start process: " + startInfo.FileName); + } + + if (testProcess.HasExited) + { + outputHelper.WriteLine($"Process " + startInfo.FileName + " came back as exited"); + } + + if (outputHelper != null) + { + outputHelper.WriteLine($"[{DateTime.Now.ToString()}] Successfuly started process {testProcess.Id}"); + outputHelper.WriteLine($"Have total {testProcess.Modules.Count} modules loaded"); + } + + outputHelper.WriteLine($"[{DateTime.Now.ToString()}] Sleeping for {timeoutInMS} ms."); + Thread.Sleep(timeoutInMS); + outputHelper.WriteLine($"[{DateTime.Now.ToString()}] Done sleeping. Ready to test."); + } + + public void Stop() + { + testProcess.Kill(); + } + + public int Pid { + get { return testProcess.Id; } + } + + public void PrintStatus() + { + if (testProcess.HasExited) + { + outputHelper.WriteLine($"Process {testProcess.Id} status: Exited"); + } + else + { + outputHelper.WriteLine($"Process {testProcess.Id} status: Running"); + } + } + } +} diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/WriteDumpTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/WriteDumpTests.cs new file mode 100644 index 0000000000..f438f882c1 --- /dev/null +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/WriteDumpTests.cs @@ -0,0 +1,124 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.Tracing; +using System.IO; +using System.Runtime.InteropServices; +using Xunit; +using Xunit.Abstractions; + +using Microsoft.Diagnostics.Tracing; +using Microsoft.Diagnostics.TestHelpers; +using Microsoft.Diagnostics.NETCore.Client; + +namespace Microsoft.Diagnostics.NETCore.Client +{ + public class WriteDumpTests + { + private readonly ITestOutputHelper output; + + public WriteDumpTests(ITestOutputHelper outputHelper) + { + output = outputHelper; + } + + /// + /// A simple test that writes a single dump file + /// + [Fact] + public void BasicWriteDumpTest() + { + var dumpPath = "./myDump.dmp"; + TestRunner runner = new TestRunner(CommonHelper.GetTraceePath(), output); + runner.Start(3000); + DiagnosticsClient client = new DiagnosticsClient(runner.Pid); + + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + Assert.Throws(() => client.WriteDump(DumpType.Normal, dumpPath)); + } + else + { + output.WriteLine($"Requesting dump at {DateTime.Now.ToString()}"); + client.WriteDump(DumpType.Normal, dumpPath); + Assert.True(File.Exists(dumpPath)); + File.Delete(dumpPath); + } + runner.Stop(); + } + + /// + /// A test that writes all the different types of dump file + /// + [Fact] + public void WriteAllDumpTypesTest() + { + var normalDumpPath = "./myDump-normal.dmp"; + var heapDumpPath = "./myDump-heap.dmp"; + var triageDumpPath = "./myDump-triage.dmp"; + var fullDumpPath = "./myDump-full.dmp"; + TestRunner runner = new TestRunner(CommonHelper.GetTraceePath(), output); + runner.Start(3000); + DiagnosticsClient client = new DiagnosticsClient(runner.Pid); + + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + Assert.Throws(() => client.WriteDump(DumpType.Normal, normalDumpPath)); + Assert.Throws(() => client.WriteDump(DumpType.WithHeap, heapDumpPath)); + Assert.Throws(() => client.WriteDump(DumpType.Triage, triageDumpPath)); + Assert.Throws(() => client.WriteDump(DumpType.Full, fullDumpPath)); + } + else + { + // Write each type of dump + output.WriteLine($"Requesting dump at {DateTime.Now.ToString()}"); + client.WriteDump(DumpType.Normal, normalDumpPath); + client.WriteDump(DumpType.WithHeap, heapDumpPath); + client.WriteDump(DumpType.Triage, triageDumpPath); + client.WriteDump(DumpType.Full, fullDumpPath); + + // Check they were all created + Assert.True(File.Exists(normalDumpPath)); + Assert.True(File.Exists(heapDumpPath)); + Assert.True(File.Exists(triageDumpPath)); + Assert.True(File.Exists(fullDumpPath)); + + // Remove them + File.Delete(normalDumpPath); + File.Delete(heapDumpPath); + File.Delete(triageDumpPath); + File.Delete(fullDumpPath); + } + runner.Stop(); + } + + /// + /// A test that tries to write a dump of a non-existent process + /// + [Fact] + public void WriteDumpFailTest() + { + List pids = new List(DiagnosticsClient.GetPublishedProcesses()); + int arbitraryPid = 1; + string dumpPath = "./myDump.dmp"; + while (pids.Contains(arbitraryPid)) + { + arbitraryPid += 1; + } + + var client = new DiagnosticsClient(arbitraryPid); + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + Assert.Throws(() => client.WriteDump(DumpType.Normal, dumpPath)); + } + else + { + Assert.Throws(() => client.WriteDump(DumpType.Normal, "./myDump.dmp")); + } + } + } +} diff --git a/src/tests/Tracee/Program.cs b/src/tests/Tracee/Program.cs new file mode 100644 index 0000000000..c6143cf4d1 --- /dev/null +++ b/src/tests/Tracee/Program.cs @@ -0,0 +1,21 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Threading; + +namespace Tracee +{ + class Program + { + static void Main(string[] args) + { + // Runs for max of 30 sec + for(var i = 0; i < 30; i++) + { + Thread.Sleep(1000); + } + } + } +} diff --git a/src/tests/Tracee/Tracee.csproj b/src/tests/Tracee/Tracee.csproj new file mode 100644 index 0000000000..58b042cb66 --- /dev/null +++ b/src/tests/Tracee/Tracee.csproj @@ -0,0 +1,7 @@ + + + Exe + $(BuildProjectFramework) + netcoreapp3.0; + + diff --git a/src/tests/dotnet-trace/ProfileProviderMerging.cs b/src/tests/dotnet-trace/ProfileProviderMerging.cs index 6cf17b120b..c438728da3 100644 --- a/src/tests/dotnet-trace/ProfileProviderMerging.cs +++ b/src/tests/dotnet-trace/ProfileProviderMerging.cs @@ -1,10 +1,9 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. - +using Microsoft.Diagnostics.NETCore.Client; using System; using Xunit; -using Microsoft.Diagnostics.Tools.RuntimeClient; using System.Collections.Generic; using System.Linq; using System.Diagnostics.Tracing; @@ -21,7 +20,7 @@ public void DuplicateProvider_CorrectlyOverrides(string profileName, string prov { Dictionary enabledBy = new Dictionary(); - List parsedProviders = Extensions.ToProviders(providerToParse); + List parsedProviders = Extensions.ToProviders(providerToParse); foreach (var provider in parsedProviders) { @@ -35,10 +34,9 @@ public void DuplicateProvider_CorrectlyOverrides(string profileName, string prov Profile.MergeProfileAndProviders(selectedProfile, parsedProviders, enabledBy); var enabledProvider = parsedProviders.SingleOrDefault(p => p.Name == "Microsoft-Windows-DotNETRuntime"); - Assert.True(enabledProvider != default(Provider)); // Assert that our specified provider overrides the version in the profile - Assert.True(enabledProvider.Keywords == UInt64.MaxValue); + Assert.True(enabledProvider.Keywords == (long)(-1)); Assert.True(enabledProvider.EventLevel == EventLevel.Verbose); Assert.True(enabledBy[enabledProvider.Name] == "--providers"); } diff --git a/src/tests/dotnet-trace/ProviderParsing.cs b/src/tests/dotnet-trace/ProviderParsing.cs index 8d1930d4b9..a311a57466 100644 --- a/src/tests/dotnet-trace/ProviderParsing.cs +++ b/src/tests/dotnet-trace/ProviderParsing.cs @@ -2,9 +2,9 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using Microsoft.Diagnostics.NETCore.Client; using System; using Xunit; -using Microsoft.Diagnostics.Tools.RuntimeClient; using System.Collections.Generic; using System.Linq; @@ -17,26 +17,28 @@ public class ProviderParsingTests [InlineData("VeryCoolProvider:1:5:FilterAndPayloadSpecs=\"QuotedValue\"")] public void ValidProvider_CorrectlyParses(string providerToParse) { - List parsedProviders = Extensions.ToProviders(providerToParse); + List parsedProviders = Extensions.ToProviders(providerToParse); Assert.True(parsedProviders.Count == 1); - Provider provider = parsedProviders.First(); + EventPipeProvider provider = parsedProviders.First(); Assert.True(provider.Name == "VeryCoolProvider"); Assert.True(provider.Keywords == 1); Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); - Assert.True(provider.FilterData == "FilterAndPayloadSpecs=\"QuotedValue\""); + Assert.True(provider.Arguments.Count == 1); + Assert.True(provider.Arguments["FilterAndPayloadSpecs"] == "\"QuotedValue\""); } [Theory] [InlineData("VeryCoolProvider:0x1:5:FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value\"")] public void ValidProviderFilter_CorrectlyParses(string providerToParse) { - List parsedProviders = Extensions.ToProviders(providerToParse); + List parsedProviders = Extensions.ToProviders(providerToParse); Assert.True(parsedProviders.Count == 1); - Provider provider = parsedProviders.First(); + EventPipeProvider provider = parsedProviders.First(); Assert.True(provider.Name == "VeryCoolProvider"); Assert.True(provider.Keywords == 1); Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); - Assert.True(provider.FilterData == "FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value\""); + Assert.True(provider.Arguments.Count == 1); + Assert.True(provider.Arguments["FilterAndPayloadSpecs"] == "\"QuotedValue:-\r\nQuoted/Value\""); } [Theory] @@ -57,16 +59,16 @@ public void InvalidProvider_CorrectlyThrows(string providerToParse) [Theory] [InlineData("VeryCoolProvider:0xFFFFFFFFFFFFFFFF:5:FilterAndPayloadSpecs=\"QuotedValue\"")] - [InlineData("VeryCoolProvider::5:FilterAndPayloadSpecs=\"QuotedValue\"")] public void ValidProviderKeyword_CorrectlyParses(string providerToParse) { - List parsedProviders = Extensions.ToProviders(providerToParse); + List parsedProviders = Extensions.ToProviders(providerToParse); Assert.True(parsedProviders.Count == 1); - Provider provider = parsedProviders.First(); + EventPipeProvider provider = parsedProviders.First(); Assert.True(provider.Name == "VeryCoolProvider"); - Assert.True(provider.Keywords == ulong.MaxValue); + Assert.True(provider.Keywords == (long)(-1)); Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); - Assert.True(provider.FilterData == "FilterAndPayloadSpecs=\"QuotedValue\""); + Assert.True(provider.Arguments.Count == 1); + Assert.True(provider.Arguments["FilterAndPayloadSpecs"] == "\"QuotedValue\""); } [Theory] @@ -74,13 +76,14 @@ public void ValidProviderKeyword_CorrectlyParses(string providerToParse) [InlineData("VeryCoolProvider:::FilterAndPayloadSpecs=\"QuotedValue\"")] public void ValidProviderEventLevel_CorrectlyParses(string providerToParse) { - List parsedProviders = Extensions.ToProviders(providerToParse); + List parsedProviders = Extensions.ToProviders(providerToParse); Assert.True(parsedProviders.Count == 1); - Provider provider = parsedProviders.First(); + EventPipeProvider provider = parsedProviders.First(); Assert.True(provider.Name == "VeryCoolProvider"); - Assert.True(provider.Keywords == ulong.MaxValue); + Assert.True(provider.Keywords == (long)(-1)); Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); - Assert.True(provider.FilterData == "FilterAndPayloadSpecs=\"QuotedValue\""); + Assert.True(provider.Arguments.Count == 1); + Assert.True(provider.Arguments["FilterAndPayloadSpecs"] == "\"QuotedValue\""); } [Theory] @@ -104,26 +107,29 @@ public void Invalidkeyword_CorrectlyThrows(string providerToParse) [InlineData("ProviderOne:1:1:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:0x2:2:key=value,ProviderThree:0x3:3:key=value")] public void MultipleValidProviders_CorrectlyParses(string providersToParse) { - List parsedProviders = Extensions.ToProviders(providersToParse); + List parsedProviders = Extensions.ToProviders(providersToParse); Assert.True(parsedProviders.Count == 3); - Provider providerOne = parsedProviders[0]; - Provider providerTwo = parsedProviders[1]; - Provider providerThree = parsedProviders[2]; + EventPipeProvider providerOne = parsedProviders[0]; + EventPipeProvider providerTwo = parsedProviders[1]; + EventPipeProvider providerThree = parsedProviders[2]; Assert.True(providerOne.Name == "ProviderOne"); Assert.True(providerOne.Keywords == 1); Assert.True(providerOne.EventLevel == System.Diagnostics.Tracing.EventLevel.Critical); - Assert.True(providerOne.FilterData == "FilterAndPayloadSpecs=\"QuotedValue\""); + Assert.True(providerOne.Arguments.Count == 1); + Assert.True(providerOne.Arguments["FilterAndPayloadSpecs"] == "\"QuotedValue\""); Assert.True(providerTwo.Name == "ProviderTwo"); Assert.True(providerTwo.Keywords == 2); Assert.True(providerTwo.EventLevel == System.Diagnostics.Tracing.EventLevel.Error); - Assert.True(providerTwo.FilterData == "key=value"); + Assert.True(providerTwo.Arguments.Count == 1); + Assert.True(providerTwo.Arguments["key"] == "value"); Assert.True(providerThree.Name == "ProviderThree"); Assert.True(providerThree.Keywords == 3); Assert.True(providerThree.EventLevel == System.Diagnostics.Tracing.EventLevel.Warning); - Assert.True(providerThree.FilterData == "key=value"); + Assert.True(providerThree.Arguments.Count == 1); + Assert.True(providerThree.Arguments["key"] == "value"); } [Theory] @@ -157,26 +163,29 @@ public void MultipleValidProvidersWithOneInvalidKeyword_CorrectlyThrows(string p [InlineData("ProviderOne:0x1:1:FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value:-A=B;C=D;\",ProviderTwo:2:2:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value:-A=B;C=D;\"")] public void MultipleProvidersWithComplexFilters_CorrectlyParse(string providersToParse) { - List parsedProviders = Extensions.ToProviders(providersToParse); + List parsedProviders = Extensions.ToProviders(providersToParse); Assert.True(parsedProviders.Count == 3); - Provider providerOne = parsedProviders[0]; - Provider providerTwo = parsedProviders[1]; - Provider providerThree = parsedProviders[2]; + EventPipeProvider providerOne = parsedProviders[0]; + EventPipeProvider providerTwo = parsedProviders[1]; + EventPipeProvider providerThree = parsedProviders[2]; Assert.True(providerOne.Name == "ProviderOne"); Assert.True(providerOne.Keywords == 1); Assert.True(providerOne.EventLevel == System.Diagnostics.Tracing.EventLevel.Critical); - Assert.True(providerOne.FilterData == "FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value:-A=B;C=D;\""); + Assert.True(providerOne.Arguments.Count == 1); + Assert.True(providerOne.Arguments["FilterAndPayloadSpecs"] == "\"QuotedValue:-\r\nQuoted/Value:-A=B;C=D;\""); Assert.True(providerTwo.Name == "ProviderTwo"); Assert.True(providerTwo.Keywords == 2); Assert.True(providerTwo.EventLevel == System.Diagnostics.Tracing.EventLevel.Error); - Assert.True(providerTwo.FilterData == "FilterAndPayloadSpecs=\"QuotedValue\""); + Assert.True(providerTwo.Arguments.Count == 1); + Assert.True(providerTwo.Arguments["FilterAndPayloadSpecs"]== "\"QuotedValue\""); Assert.True(providerThree.Name == "ProviderThree"); Assert.True(providerThree.Keywords == 3); Assert.True(providerThree.EventLevel == System.Diagnostics.Tracing.EventLevel.Warning); - Assert.True(providerThree.FilterData == "FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value:-A=B;C=D;\""); + Assert.True(providerThree.Arguments.Count == 1); + Assert.True(providerThree.Arguments["FilterAndPayloadSpecs"] == "\"QuotedValue:-\r\nQuoted/Value:-A=B;C=D;\""); } [Theory] @@ -184,7 +193,7 @@ public void MultipleProvidersWithComplexFilters_CorrectlyParse(string providersT [InlineData("ProviderOne:0x1:verbose")] public void TextLevelProviderSpecVerbose_CorrectlyParse(string providerToParse) { - List parsedProviders = Extensions.ToProviders(providerToParse); + List parsedProviders = Extensions.ToProviders(providerToParse); Assert.True(parsedProviders.Count == 1); Assert.True(parsedProviders[0].Name == "ProviderOne"); Assert.True(parsedProviders[0].Keywords == 1); @@ -196,7 +205,7 @@ public void TextLevelProviderSpecVerbose_CorrectlyParse(string providerToParse) [InlineData("ProviderOne:0x1:INFORMATIONAL")] public void TextLevelProviderSpecInformational_CorrectlyParse(string providerToParse) { - List parsedProviders = Extensions.ToProviders(providerToParse); + List parsedProviders = Extensions.ToProviders(providerToParse); Assert.True(parsedProviders.Count == 1); Assert.True(parsedProviders[0].Name == "ProviderOne"); Assert.True(parsedProviders[0].Keywords == 1); @@ -208,7 +217,7 @@ public void TextLevelProviderSpecInformational_CorrectlyParse(string providerToP [InlineData("ProviderOne:0x1:LogAlwayS")] public void TextLevelProviderSpecLogAlways_CorrectlyParse(string providerToParse) { - List parsedProviders = Extensions.ToProviders(providerToParse); + List parsedProviders = Extensions.ToProviders(providerToParse); Assert.True(parsedProviders.Count == 1); Assert.True(parsedProviders[0].Name == "ProviderOne"); Assert.True(parsedProviders[0].Keywords == 1); @@ -220,7 +229,7 @@ public void TextLevelProviderSpecLogAlways_CorrectlyParse(string providerToParse [InlineData("ProviderOne:0x1:ERRor")] public void TextLevelProviderSpecError_CorrectlyParse(string providerToParse) { - List parsedProviders = Extensions.ToProviders(providerToParse); + List parsedProviders = Extensions.ToProviders(providerToParse); Assert.True(parsedProviders.Count == 1); Assert.True(parsedProviders[0].Name == "ProviderOne"); Assert.True(parsedProviders[0].Keywords == 1); @@ -232,7 +241,7 @@ public void TextLevelProviderSpecError_CorrectlyParse(string providerToParse) [InlineData("ProviderOne:0x1:CRITICAL")] public void TextLevelProviderSpecCritical_CorrectlyParse(string providerToParse) { - List parsedProviders = Extensions.ToProviders(providerToParse); + List parsedProviders = Extensions.ToProviders(providerToParse); Assert.True(parsedProviders.Count == 1); Assert.True(parsedProviders[0].Name == "ProviderOne"); Assert.True(parsedProviders[0].Keywords == 1); @@ -244,7 +253,7 @@ public void TextLevelProviderSpecCritical_CorrectlyParse(string providerToParse) [InlineData("ProviderOne:0x1:warning")] public void TextLevelProviderSpecWarning_CorrectlyParse(string providerToParse) { - List parsedProviders = Extensions.ToProviders(providerToParse); + List parsedProviders = Extensions.ToProviders(providerToParse); Assert.True(parsedProviders.Count == 1); Assert.True(parsedProviders[0].Name == "ProviderOne"); Assert.True(parsedProviders[0].Keywords == 1); From 7df57cc8b9a42d0d7e13e00e69c62ddc5b95bb33 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2019 13:49:39 +0000 Subject: [PATCH 013/243] Update dependencies from https://github.com/aspnet/AspNetCore build 20191205.16 (#672) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha1.19605.16 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 50d0713519..7d7c1f7fdc 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/core-setup c77948d92a2f950140f09384f057cb893ec3955a - + https://github.com/aspnet/AspNetCore - 3b7cdc166aa3c9733fa60b56d91fc0fff9b11652 + 0fd9f27d60f727ad9b769f72de5dfae8f840a456 diff --git a/eng/Versions.props b/eng/Versions.props index d53b79e3fb..186c6fa88f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -7,7 +7,7 @@ true true 5.0.0-alpha.1.19564.1 - 5.0.0-alpha1.19603.5 + 5.0.0-alpha1.19605.16 From 125ea40662c36fa49e1d742e44154fd9a5b0a4d1 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Fri, 6 Dec 2019 15:13:16 -0800 Subject: [PATCH 014/243] Upgrade to latest System.CommandLine version (#668) Upgrade to latest System.CommandLine version Use collection initializers --- diagnostics.sln | 12 +++ eng/Versions.props | 4 +- .../Command/CommandProcessor.cs | 42 ++++---- src/Tools/Common/CommandExtensions.cs | 20 ++++ src/Tools/Common/CommandLineException.cs | 28 ----- src/Tools/Common/Commands/ProcessStatus.cs | 12 ++- src/Tools/Common/ConsoleCancellation.cs | 45 -------- src/Tools/Common/DebugUtil.cs | 25 ----- src/Tools/dotnet-counters/Program.cs | 96 +++++++++-------- .../dotnet-counters/dotnet-counters.csproj | 1 + src/Tools/dotnet-dump/Analyzer.cs | 3 +- src/Tools/dotnet-dump/Commands/SOSCommand.cs | 2 +- src/Tools/dotnet-dump/Program.cs | 100 ++++++++++-------- src/Tools/dotnet-dump/dotnet-dump.csproj | 1 + .../CommandLine/CollectCommandHandler.cs | 48 ++++----- .../ProcessStatusCommandHandler.cs | 28 ----- src/Tools/dotnet-gcdump/Program.cs | 3 +- src/Tools/dotnet-gcdump/dotnet-gcdump.csproj | 1 + src/Tools/dotnet-sos/Program.cs | 31 +++--- src/Tools/dotnet-sos/dotnet-sos.csproj | 3 + .../CommandLine/Commands/CollectCommand.cs | 61 ++++++----- .../CommandLine/Commands/ConvertCommand.cs | 46 ++++---- .../Commands/ListProcessesCommandHandler.cs | 28 ----- .../Commands/ListProfilesCommandHandler.cs | 7 +- .../CommandLine/Options/CommonOptions.cs | 27 ++--- src/Tools/dotnet-trace/Program.cs | 3 +- src/Tools/dotnet-trace/dotnet-trace.csproj | 1 + 27 files changed, 302 insertions(+), 376 deletions(-) create mode 100644 src/Tools/Common/CommandExtensions.cs delete mode 100644 src/Tools/Common/CommandLineException.cs delete mode 100644 src/Tools/Common/ConsoleCancellation.cs delete mode 100644 src/Tools/Common/DebugUtil.cs delete mode 100644 src/Tools/dotnet-gcdump/CommandLine/ProcessStatusCommandHandler.cs delete mode 100644 src/Tools/dotnet-trace/CommandLine/Commands/ListProcessesCommandHandler.cs diff --git a/diagnostics.sln b/diagnostics.sln index 45df2c9e38..1ba3fc9c4d 100644 --- a/diagnostics.sln +++ b/diagnostics.sln @@ -63,6 +63,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tracee", "src\tests\Tracee\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventPipe.UnitTests", "src\tests\eventpipe\EventPipe.UnitTests.csproj", "{CED9ABBA-861E-4C0A-9359-22351208EF27}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{298AE119-6625-4604-BDE5-0765DC34C856}" + ProjectSection(SolutionItems) = preProject + src\Tools\Common\CommandExtensions.cs = src\Tools\Common\CommandExtensions.cs + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Commands", "Commands", "{C457CBCD-3A8D-4402-9A2B-693A0390D3F9}" + ProjectSection(SolutionItems) = preProject + src\Tools\Common\Commands\ProcessStatus.cs = src\Tools\Common\Commands\ProcessStatus.cs + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Checked|Any CPU = Checked|Any CPU @@ -1090,6 +1100,8 @@ Global {6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128} = {03479E19-3F18-49A6-910A-F5041E27E7C0} {C79D6069-2C18-48CB-846E-71F7168C2F7D} = {03479E19-3F18-49A6-910A-F5041E27E7C0} {CED9ABBA-861E-4C0A-9359-22351208EF27} = {03479E19-3F18-49A6-910A-F5041E27E7C0} + {298AE119-6625-4604-BDE5-0765DC34C856} = {B62728C8-1267-4043-B46F-5537BBAEC692} + {C457CBCD-3A8D-4402-9A2B-693A0390D3F9} = {298AE119-6625-4604-BDE5-0765DC34C856} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {46465737-C938-44FC-BE1A-4CE139EBB5E0} diff --git a/eng/Versions.props b/eng/Versions.props index 186c6fa88f..886f4afbc8 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -25,8 +25,8 @@ 1.1.46104 1.7.0 2.0.44 - 0.2.0-alpha.19254.1 - 0.2.0-alpha.19254.1 + 0.3.0-alpha.19602.1 + 0.3.0-alpha.19602.1 4.5.3 2.4.1 2.0.3 diff --git a/src/Microsoft.Diagnostics.Repl/Command/CommandProcessor.cs b/src/Microsoft.Diagnostics.Repl/Command/CommandProcessor.cs index 745bca2a54..4a2791e17d 100644 --- a/src/Microsoft.Diagnostics.Repl/Command/CommandProcessor.cs +++ b/src/Microsoft.Diagnostics.Repl/Command/CommandProcessor.cs @@ -118,32 +118,32 @@ private void BuildCommands(CommandLineBuilder rootBuilder, Type type) { command = new Command(commandAttribute.Name, commandAttribute.Help); var properties = new List<(PropertyInfo, Option)>(); - PropertyInfo argument = null; + var arguments = new List<(PropertyInfo, Argument)>(); foreach (PropertyInfo property in type.GetProperties().Where(p => p.CanWrite)) { var argumentAttribute = (ArgumentAttribute)property.GetCustomAttributes(typeof(ArgumentAttribute), inherit: false).SingleOrDefault(); if (argumentAttribute != null) { - if (argument != null) { - throw new ArgumentException($"More than one ArgumentAttribute in command class: {type.Name}"); - } IArgumentArity arity = property.PropertyType.IsArray ? ArgumentArity.ZeroOrMore : ArgumentArity.ZeroOrOne; - command.Argument = new Argument { + var argument = new Argument { Name = argumentAttribute.Name ?? property.Name.ToLowerInvariant(), Description = argumentAttribute.Help, ArgumentType = property.PropertyType, Arity = arity }; - argument = property; + command.AddArgument(argument); + arguments.Add((property, argument)); } else { var optionAttribute = (OptionAttribute)property.GetCustomAttributes(typeof(OptionAttribute), inherit: false).SingleOrDefault(); if (optionAttribute != null) { - var option = new Option(optionAttribute.Name ?? BuildAlias(property.Name), optionAttribute.Help, new Argument { ArgumentType = property.PropertyType }); + var option = new Option(optionAttribute.Name ?? BuildAlias(property.Name), optionAttribute.Help) { + Argument = new Argument { ArgumentType = property.PropertyType } + }; command.AddOption(option); properties.Add((property, option)); @@ -160,7 +160,7 @@ private void BuildCommands(CommandLineBuilder rootBuilder, Type type) } } - var handler = new Handler(this, commandAttribute.AliasExpansion, argument, properties, type); + var handler = new Handler(this, commandAttribute.AliasExpansion, arguments, properties, type); _commandHandlers.Add(command.Name, handler); command.Handler = handler; @@ -201,18 +201,18 @@ class Handler : ICommandHandler { private readonly CommandProcessor _commandProcessor; private readonly string _aliasExpansion; - private readonly PropertyInfo _argument; + private readonly IEnumerable<(PropertyInfo Property, Argument Argument)> _arguments; private readonly IEnumerable<(PropertyInfo Property, Option Option)> _properties; private readonly ConstructorInfo _constructor; private readonly MethodInfo _methodInfo; private readonly MethodInfo _methodInfoHelp; - public Handler(CommandProcessor commandProcessor, string aliasExpansion, PropertyInfo argument, IEnumerable<(PropertyInfo, Option)> properties, Type type) + public Handler(CommandProcessor commandProcessor, string aliasExpansion, IEnumerable<(PropertyInfo, Argument)> arguments, IEnumerable<(PropertyInfo, Option)> properties, Type type) { _commandProcessor = commandProcessor; _aliasExpansion = aliasExpansion; - _argument = argument; + _arguments = arguments; _properties = properties; _constructor = type.GetConstructors().SingleOrDefault((info) => info.GetParameters().Length == 0) ?? @@ -303,19 +303,19 @@ private void SetProperties(InvocationContext context, object instance) property.Property.SetValue(instance, value); } - if (context != null && _argument != null) + if (context != null) { - object value = null; - ArgumentResult result = context.ParseResult.CommandResult.ArgumentResult; - switch (result) + IEnumerable argumentResults = context.ParseResult.CommandResult.Children.OfType(); + + foreach ((PropertyInfo Property, Argument Argument) argument in _arguments) { - case SuccessfulArgumentResult successful: - value = successful.Value; - break; - case FailedArgumentResult failed: - throw new InvalidOperationException(failed.ErrorMessage); + ArgumentResult argumentResult = argumentResults.Where((result) => result.Argument == argument.Argument).SingleOrDefault(); + if (argumentResult != null) + { + object value = argumentResult.GetValueOrDefault(); + argument.Property.SetValue(instance, value); + } } - _argument.SetValue(instance, value); } } diff --git a/src/Tools/Common/CommandExtensions.cs b/src/Tools/Common/CommandExtensions.cs new file mode 100644 index 0000000000..cde9a19e7d --- /dev/null +++ b/src/Tools/Common/CommandExtensions.cs @@ -0,0 +1,20 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.CommandLine; +using System.CommandLine.Invocation; + +namespace Microsoft.Tools.Common +{ + public static class CommandExtenions + { + /// + /// Allows the command handler to be included in the collection initializer. + /// + public static void Add(this Command command, ICommandHandler handler) + { + command.Handler = handler; + } + } +} diff --git a/src/Tools/Common/CommandLineException.cs b/src/Tools/Common/CommandLineException.cs deleted file mode 100644 index 03b07766e9..0000000000 --- a/src/Tools/Common/CommandLineException.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Runtime.Serialization; - -namespace Microsoft.Internal.Utilities -{ - public class CommandLineException : Exception - { - public CommandLineException() - { - } - - public CommandLineException(string message) : base(message) - { - } - - public CommandLineException(string message, Exception innerException) : base(message, innerException) - { - } - - protected CommandLineException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } - } -} diff --git a/src/Tools/Common/Commands/ProcessStatus.cs b/src/Tools/Common/Commands/ProcessStatus.cs index 8fc3ce68a8..34c3227b02 100644 --- a/src/Tools/Common/Commands/ProcessStatus.cs +++ b/src/Tools/Common/Commands/ProcessStatus.cs @@ -2,18 +2,24 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using Microsoft.Diagnostics.NETCore.Client; using System; using System.CommandLine; -using System.Diagnostics; +using System.CommandLine.Invocation; using System.Linq; using System.Text; - -using Microsoft.Diagnostics.NETCore.Client; +using Process = System.Diagnostics.Process; namespace Microsoft.Internal.Common.Commands { public class ProcessStatusCommandHandler { + public static Command ProcessStatusCommand(string description) => + new Command(name: "ps", description) + { + Handler = CommandHandler.Create(PrintProcessStatus) + }; + /// /// Print the current list of available .NET core processes for diagnosis and their statuses /// diff --git a/src/Tools/Common/ConsoleCancellation.cs b/src/Tools/Common/ConsoleCancellation.cs deleted file mode 100644 index 28fecac7e9..0000000000 --- a/src/Tools/Common/ConsoleCancellation.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Threading; -using System.Threading.Tasks; -using McMaster.Extensions.CommandLineUtils; - -namespace Microsoft.Internal.Utilities -{ - public static class ConsoleCancellationExtensions - { - public static CancellationToken GetCtrlCToken(this IConsole console) - { - var cts = new CancellationTokenSource(); - console.CancelKeyPress += (sender, args) => - { - if (cts.IsCancellationRequested) - { - // Terminate forcibly, the user pressed Ctrl-C a second time - args.Cancel = false; - } - else - { - // Don't terminate, just trip the token - args.Cancel = true; - cts.Cancel(); - } - }; - return cts.Token; - } - - public static Task WaitForCtrlCAsync(this IConsole console) - { - var tcs = new TaskCompletionSource(); - console.CancelKeyPress += (sender, args) => - { - // Don't terminate, just trip the task - args.Cancel = true; - tcs.TrySetResult(null); - }; - return tcs.Task; - } - } -} diff --git a/src/Tools/Common/DebugUtil.cs b/src/Tools/Common/DebugUtil.cs deleted file mode 100644 index d3dcc6dfab..0000000000 --- a/src/Tools/Common/DebugUtil.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Diagnostics; -using System.Linq; - -namespace Microsoft.Internal.Utilities -{ - internal static class DebugUtil - { - [Conditional("DEBUG")] - public static void WaitForDebuggerIfRequested(ref string[] args) - { - if (args.Any(a => a == "--debug")) - { - args = args.Where(a => a != "--debug").ToArray(); - Console.WriteLine($"Ready for debugger to attach. Process ID: {Process.GetCurrentProcess().Id}."); - Console.WriteLine("Press ENTER to continue."); - Console.ReadLine(); - } - } - } -} diff --git a/src/Tools/dotnet-counters/Program.cs b/src/Tools/dotnet-counters/Program.cs index ca6d20b9f9..6fc086d215 100644 --- a/src/Tools/dotnet-counters/Program.cs +++ b/src/Tools/dotnet-counters/Program.cs @@ -2,7 +2,11 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Internal.Common.Commands; +using Microsoft.Tools.Common; using System; +using System.Collections.Generic; using System.CommandLine; using System.CommandLine.Binding; using System.CommandLine.Builder; @@ -10,9 +14,6 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; -using System.Collections.Generic; -using Microsoft.Diagnostics.NETCore.Client; -using Microsoft.Internal.Common.Commands; namespace Microsoft.Diagnostics.Tools.Counters { @@ -24,67 +25,72 @@ internal class Program private static Command MonitorCommand() => new Command( - "monitor", - "Start monitoring a .NET application", - new Option[] { ProcessIdOption(), RefreshIntervalOption() }, - argument: CounterList(), - handler: CommandHandler.Create, IConsole, int, int>(new CounterMonitor().Monitor)); + name: "monitor", + description: "Start monitoring a .NET application") + { + // Handler + CommandHandler.Create, IConsole, int, int>(new CounterMonitor().Monitor), + // Arguments and Options + CounterList(), ProcessIdOption(), RefreshIntervalOption() + }; private static Command CollectCommand() => new Command( - "collect", - "Monitor counters in a .NET application and export the result into a file", - new Option[] { ProcessIdOption(), RefreshIntervalOption(), ExportFormatOption(), ExportFileNameOption() }, - argument: CounterList(), - handler: HandlerDescriptor.FromDelegate((ExportDelegate)new CounterMonitor().Collect).GetCommandHandler()); + name: "collect", + description: "Monitor counters in a .NET application and export the result into a file") + { + // Handler + HandlerDescriptor.FromDelegate((ExportDelegate)new CounterMonitor().Collect).GetCommandHandler(), + // Arguments and Options + CounterList(), ProcessIdOption(), RefreshIntervalOption(), ExportFormatOption(), ExportFileNameOption() + }; private static Option ProcessIdOption() => new Option( - new[] { "-p", "--process-id" }, - "The ID of the process that will be monitored.", - new Argument { Name = "pid" }); + aliases: new[] { "-p", "--process-id" }, + description: "The process id that will be monitored.") + { + Argument = new Argument(name: "pid") + }; private static Option RefreshIntervalOption() => new Option( - new[] { "--refresh-interval" }, - "The number of seconds to delay between updating the displayed counters.", - new Argument(defaultValue: 1) { Name = "refresh-interval" }); + alias: "--refresh-interval", + description: "The number of seconds to delay between updating the displayed counters.") + { + Argument = new Argument(name: "refresh-interval", defaultValue: 1) + }; - private static Option ExportFormatOption() => + private static Option ExportFormatOption() => new Option( - new[] { "--format" }, - "The format of exported counter data.", - new Argument(defaultValue: CountersExportFormat.csv) { Name = "format" }); + alias: "--format", + description: "The format of exported counter data.") + { + Argument = new Argument(name: "format", defaultValue: CountersExportFormat.csv) + }; - private static Option ExportFileNameOption() => + private static Option ExportFileNameOption() => new Option( - new[] { "-o", "--output" }, - "The output file name.", - new Argument(defaultValue: "counter") { Name = "output" }); + aliases: new[] { "-o", "--output" }, + description: "The output file name.") + { + Argument = new Argument(name: "output", defaultValue: "counter") + }; private static Argument CounterList() => - new Argument> { - Name = "counter_list", - Description = @"A space separated list of counters. Counters can be specified provider_name[:counter_name]. - If the provider_name is used without a qualifying counter_name then all counters will be shown. To discover - provider and counter names, use the list command. - .", + new Argument>(name: "counter_list", defaultValue: new List()) + { + Description = @"A space separated list of counters. Counters can be specified provider_name[:counter_name]. If the provider_name is used without a qualifying counter_name then all counters will be shown. To discover provider and counter names, use the list command.", Arity = ArgumentArity.ZeroOrMore }; private static Command ListCommand() => new Command( - "list", - "Display a list of counter names and descriptions, grouped by provider.", - new Option[] { }, - handler: CommandHandler.Create(List)); - - private static Command ProcessStatusCommand() => - new Command( - "ps", - "Display a list of dotnet processes that can be monitored.", - new Option[] { }, - handler: CommandHandler.Create(ProcessStatusCommandHandler.PrintProcessStatus)); + name: "list", + description: "Display a list of counter names and descriptions, grouped by provider.") + { + Handler = CommandHandler.Create(List) + }; public static int List(IConsole console) { @@ -111,7 +117,7 @@ private static Task Main(string[] args) .AddCommand(MonitorCommand()) .AddCommand(CollectCommand()) .AddCommand(ListCommand()) - .AddCommand(ProcessStatusCommand()) + .AddCommand(ProcessStatusCommandHandler.ProcessStatusCommand("Lists the dotnet processes that can be monitored")) .UseDefaults() .Build(); return parser.InvokeAsync(args); diff --git a/src/Tools/dotnet-counters/dotnet-counters.csproj b/src/Tools/dotnet-counters/dotnet-counters.csproj index 4dc5bed68d..7e9887f6bc 100644 --- a/src/Tools/dotnet-counters/dotnet-counters.csproj +++ b/src/Tools/dotnet-counters/dotnet-counters.csproj @@ -12,6 +12,7 @@ + diff --git a/src/Tools/dotnet-dump/Analyzer.cs b/src/Tools/dotnet-dump/Analyzer.cs index f560082ab5..28209858d8 100644 --- a/src/Tools/dotnet-dump/Analyzer.cs +++ b/src/Tools/dotnet-dump/Analyzer.cs @@ -76,7 +76,8 @@ public async Task Analyze(FileInfo dump_path, string[] command) // Run the commands from the dotnet-dump command line if (command != null) { - foreach (string cmd in command) { + foreach (string cmd in command) + { await _commandProcessor.Parse(cmd); } } diff --git a/src/Tools/dotnet-dump/Commands/SOSCommand.cs b/src/Tools/dotnet-dump/Commands/SOSCommand.cs index bc258de370..7845d601f4 100644 --- a/src/Tools/dotnet-dump/Commands/SOSCommand.cs +++ b/src/Tools/dotnet-dump/Commands/SOSCommand.cs @@ -59,7 +59,7 @@ public override void Invoke() { try { string arguments = null; - if (Arguments.Length > 0) { + if (Arguments != null && Arguments.Length > 0) { arguments = string.Concat(Arguments.Select((arg) => arg + " ")); } SOSHost.ExecuteCommand(AliasExpansion, arguments); diff --git a/src/Tools/dotnet-dump/Program.cs b/src/Tools/dotnet-dump/Program.cs index c206bd3365..117c73327c 100644 --- a/src/Tools/dotnet-dump/Program.cs +++ b/src/Tools/dotnet-dump/Program.cs @@ -2,13 +2,14 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Internal.Common.Commands; +using Microsoft.Tools.Common; using System.CommandLine; using System.CommandLine.Builder; using System.CommandLine.Invocation; using System.IO; using System.Threading.Tasks; -using Microsoft.Diagnostics.NETCore.Client; -using Microsoft.Internal.Common.Commands; namespace Microsoft.Diagnostics.Tools.Dump { @@ -19,7 +20,7 @@ public static Task Main(string[] args) var parser = new CommandLineBuilder() .AddCommand(CollectCommand()) .AddCommand(AnalyzeCommand()) - .AddCommand(ProcessStatusCommand()) + .AddCommand(ProcessStatusCommandHandler.ProcessStatusCommand("Lists the dotnet processes that dumps can be collected")) .UseDefaults() .Build(); @@ -27,67 +28,74 @@ public static Task Main(string[] args) } private static Command CollectCommand() => - new Command( - "collect", - "Capture dumps from a process", - new Option[] { ProcessIdOption(), OutputOption(), DiagnosticLoggingOption(), TypeOption() }, - handler: CommandHandler.Create(new Dumper().Collect)); + new Command( name: "collect", description: "Capture dumps from a process") + { + // Handler + CommandHandler.Create(new Dumper().Collect), + // Options + ProcessIdOption(), OutputOption(), DiagnosticLoggingOption(), TypeOption() + }; private static Option ProcessIdOption() => new Option( - new[] { "-p", "--process-id" }, - "The process to collect a memory dump from.", - new Argument { Name = "pid" }); + aliases: new[] { "-p", "--process-id" }, + description: "The process id to collect a memory dump.") + { + Argument = new Argument(name: "pid") + }; private static Option OutputOption() => - new Option( - new[] { "-o", "--output" }, - @"The path where collected dumps should be written. Defaults to '.\dump_YYYYMMDD_HHMMSS.dmp' on Windows and -'./core_YYYYMMDD_HHMMSS' on Linux where YYYYMMDD is Year/Month/Day and HHMMSS is Hour/Minute/Second. Otherwise, it is the full -path and file name of the dump.", - new Argument() { Name = "output_dump_path" }); + new Option( + aliases: new[] { "-o", "--output" }, + description: @"The path where collected dumps should be written. Defaults to '.\dump_YYYYMMDD_HHMMSS.dmp' on Windows and './core_YYYYMMDD_HHMMSS' +on Linux where YYYYMMDD is Year/Month/Day and HHMMSS is Hour/Minute/Second. Otherwise, it is the full path and file name of the dump.") + { + Argument = new Argument(name: "output_dump_path") + }; private static Option DiagnosticLoggingOption() => new Option( - new[] { "--diag" }, - "Enable dump collection diagnostic logging.", - new Argument { Name = "diag" }); + alias: "--diag", + description: "Enable dump collection diagnostic logging.") + { + Argument = new Argument(name: "diag") + }; private static Option TypeOption() => new Option( - "--type", - @"The dump type determines the kinds of information that are collected from the process. There are two types: - -heap - A large and relatively comprehensive dump containing module lists, thread lists, all stacks, - exception information, handle information, and all memory except for mapped images. -mini - A small dump containing module lists, thread lists, exception information and all stacks. - -If not specified 'heap' is the default.", - new Argument(Dumper.DumpTypeOption.Heap) { Name = "dump_type" }); + alias: "--type", + description: @"The dump type determines the kinds of information that are collected from the process. There are two types: heap - A large and +relatively comprehensive dump containing module lists, thread lists, all stacks, exception information, handle information, and all memory except for mapped +images. mini - A small dump containing module lists, thread lists, exception information and all stacks. If not specified 'heap' is the default.") + { + Argument = new Argument(name: "dump_type", defaultValue: Dumper.DumpTypeOption.Heap) + }; private static Command AnalyzeCommand() => new Command( - "analyze", - "Starts an interactive shell with debugging commands to explore a dump", - new Option[] { RunCommand() }, argument: DumpPath(), - handler: CommandHandler.Create(new Analyzer().Analyze)); + name: "analyze", + description: "Starts an interactive shell with debugging commands to explore a dump") + { + // Handler + CommandHandler.Create(new Analyzer().Analyze), + // Arguments and Options + DumpPath(), + RunCommand() + }; private static Argument DumpPath() => - new Argument { - Name = "dump_path", - Description = "Name of the dump file to analyze." }.ExistingOnly(); + new Argument( + name: "dump_path") + { + Description = "Name of the dump file to analyze." + }.ExistingOnly(); private static Option RunCommand() => new Option( - new[] { "-c", "--command" }, - "Run the command on start.", - new Argument() { Name = "command", Arity = ArgumentArity.ZeroOrMore }); - - private static Command ProcessStatusCommand() => - new Command( - "ps", - "Display a list of dotnet processes to create dump from", - new Option[] { }, - handler: CommandHandler.Create(ProcessStatusCommandHandler.PrintProcessStatus)); + aliases: new[] { "-c", "--command" }, + description: "Run the command on start.") + { + Argument = new Argument(name: "command", defaultValue: new string[0]) { Arity = ArgumentArity.ZeroOrMore } + }; } } diff --git a/src/Tools/dotnet-dump/dotnet-dump.csproj b/src/Tools/dotnet-dump/dotnet-dump.csproj index d93281273e..831bca3e4a 100644 --- a/src/Tools/dotnet-dump/dotnet-dump.csproj +++ b/src/Tools/dotnet-dump/dotnet-dump.csproj @@ -18,6 +18,7 @@ + diff --git a/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs b/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs index 4be21afb8e..67d01a66ad 100644 --- a/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs +++ b/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs @@ -2,14 +2,11 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using Microsoft.Tools.Common; using System; -using System.Collections.Generic; using System.CommandLine; using System.CommandLine.Binding; -using System.CommandLine.Rendering; -using System.Diagnostics; using System.IO; -using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -100,42 +97,45 @@ private static async Task Collect(CancellationToken ct, IConsole console, i public static Command CollectCommand() => new Command( name: "collect", - description: "Collects a diagnostic trace from a currently running process", - symbols: new Option[] { - ProcessIdOption(), - OutputPathOption(), - VerboseOption(), - TimeoutOption() - }, - handler: HandlerDescriptor.FromDelegate((CollectDelegate)Collect).GetCommandHandler()); + description: "Collects a diagnostic trace from a currently running process") + { + // Handler + HandlerDescriptor.FromDelegate((CollectDelegate)Collect).GetCommandHandler(), + // Options + ProcessIdOption(), OutputPathOption(), VerboseOption(), TimeoutOption() + }; public static Option ProcessIdOption() => new Option( aliases: new[] { "-p", "--process-id" }, - description: "The process to collect the trace from", - argument: new Argument(defaultValue: 0) { Name = "pid" }, - isHidden: false); + description: "The process id to collect the trace.") + { + Argument = new Argument(name: "pid", defaultValue: 0), + }; private static Option OutputPathOption() => new Option( aliases: new[] { "-o", "--output" }, - description: $@"The path where collected gcdumps should be written. Defaults to '.\YYYYMMDD_HHMMSS_.gcdump' where YYYYMMDD is Year/Month/Day and HHMMSS is Hour/Minute/Second. Otherwise, it is the full path and file name of the dump.", - argument: new Argument(defaultValue: "") { Name = "gcdump-file-path" }, - isHidden: false); + description: $@"The path where collected gcdumps should be written. Defaults to '.\YYYYMMDD_HHMMSS_.gcdump' where YYYYMMDD is Year/Month/Day and HHMMSS is Hour/Minute/Second. Otherwise, it is the full path and file name of the dump.") + { + Argument = new Argument(name: "gcdump-file-path", defaultValue: "") + }; private static Option VerboseOption() => new Option( aliases: new[] { "-v", "--verbose" }, - description: $"Output the log while collecting the gcdump", - argument: new Argument(defaultValue: false) { Name = "verbose" }, - isHidden: false); + description: $"Output the log while collecting the gcdump.") + { + Argument = new Argument(name: "verbose", defaultValue: false) + }; private static int DefaultTimeout = 30; private static Option TimeoutOption() => new Option( aliases: new[] { "-t", "--timeout" }, - description: $"Give up on collecting the gcdump if it takes longer than this many seconds. The default value is {DefaultTimeout}s", - argument: new Argument(defaultValue: DefaultTimeout) { Name = "timeout" }, - isHidden: false); + description: $"Give up on collecting the gcdump if it takes longer than this many seconds. The default value is {DefaultTimeout}s.") + { + Argument = new Argument(name: "timeout", defaultValue: DefaultTimeout) + }; } } diff --git a/src/Tools/dotnet-gcdump/CommandLine/ProcessStatusCommandHandler.cs b/src/Tools/dotnet-gcdump/CommandLine/ProcessStatusCommandHandler.cs deleted file mode 100644 index 4e15083f0c..0000000000 --- a/src/Tools/dotnet-gcdump/CommandLine/ProcessStatusCommandHandler.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using Microsoft.Internal.Common.Commands; -using System; -using System.CommandLine; -using System.Threading.Tasks; - -namespace Microsoft.Diagnostics.Tools.GCDump -{ - internal static class ListProcessesCommandHandler - { - public static async Task GetActivePorts(IConsole console) - { - ProcessStatusCommandHandler.PrintProcessStatus(console); - await Task.FromResult(0); - return 0; - } - - public static Command ProcessStatusCommand() => - new Command( - name: "ps", - description: "Lists dotnet processes that can be attached to.", - handler: System.CommandLine.Invocation.CommandHandler.Create(GetActivePorts), - isHidden: false); - } -} diff --git a/src/Tools/dotnet-gcdump/Program.cs b/src/Tools/dotnet-gcdump/Program.cs index 7bbba2fced..d2acd82bbe 100644 --- a/src/Tools/dotnet-gcdump/Program.cs +++ b/src/Tools/dotnet-gcdump/Program.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using Microsoft.Internal.Common.Commands; using System.CommandLine.Builder; using System.CommandLine.Invocation; using System.Threading.Tasks; @@ -14,7 +15,7 @@ public static Task Main(string[] args) { var parser = new CommandLineBuilder() .AddCommand(CollectCommandHandler.CollectCommand()) - .AddCommand(ListProcessesCommandHandler.ProcessStatusCommand()) + .AddCommand(ProcessStatusCommandHandler.ProcessStatusCommand("Lists the dotnet processes that gcdumps can be collected")) .UseDefaults() .Build(); diff --git a/src/Tools/dotnet-gcdump/dotnet-gcdump.csproj b/src/Tools/dotnet-gcdump/dotnet-gcdump.csproj index 11d02c0a2a..020f94233c 100644 --- a/src/Tools/dotnet-gcdump/dotnet-gcdump.csproj +++ b/src/Tools/dotnet-gcdump/dotnet-gcdump.csproj @@ -21,6 +21,7 @@ + diff --git a/src/Tools/dotnet-sos/Program.cs b/src/Tools/dotnet-sos/Program.cs index fa745dbe9c..c3d5f4917e 100644 --- a/src/Tools/dotnet-sos/Program.cs +++ b/src/Tools/dotnet-sos/Program.cs @@ -2,12 +2,11 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using Microsoft.Tools.Common; using SOS; -using System; using System.CommandLine; using System.CommandLine.Builder; using System.CommandLine.Invocation; -using System.Reflection; using System.Runtime.InteropServices; using System.Threading.Tasks; @@ -28,22 +27,30 @@ public static Task Main(string[] args) private static Command InstallCommand() => new Command( - "install", - "Installs SOS and configures LLDB to load it on startup.", - new Option[] { ArchitectureOption() }, - handler: CommandHandler.Create((console, architecture) => InvokeAsync(console, architecture, install: true))); + name: "install", + description: "Installs SOS and configures LLDB to load it on startup.") + { + // Handler + CommandHandler.Create((console, architecture) => InvokeAsync(console, architecture, install: true)), + // Options + ArchitectureOption() + }; private static Option ArchitectureOption() => new Option( - new[] { "--architecture" }, - "The process to collect a memory dump from.", - new Argument() { Name = "architecture" }); + alias: "--architecture", + description: "The processor architecture to install.") + { + Argument = new Argument(name: "architecture") + }; private static Command UninstallCommand() => new Command( - "uninstall", - "Uninstalls SOS and reverts any configuration changes to LLDB.", - handler: CommandHandler.Create((console) => InvokeAsync(console, architecture: null, install: false))); + name: "uninstall", + description: "Uninstalls SOS and reverts any configuration changes to LLDB.") + { + Handler = CommandHandler.Create((console) => InvokeAsync(console, architecture: null, install: false)) + }; private static Task InvokeAsync(IConsole console, Architecture? architecture, bool install) { diff --git a/src/Tools/dotnet-sos/dotnet-sos.csproj b/src/Tools/dotnet-sos/dotnet-sos.csproj index d38943b816..da59d34788 100644 --- a/src/Tools/dotnet-sos/dotnet-sos.csproj +++ b/src/Tools/dotnet-sos/dotnet-sos.csproj @@ -9,6 +9,9 @@ $(Description) tools/$(TargetFramework)/any + + + diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs index 41014bc5d2..298bc68244 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Tools.Common; using System; using System.Collections.Generic; using System.CommandLine; @@ -261,55 +262,63 @@ private static string GetSize(long length) public static Command CollectCommand() => new Command( name: "collect", - description: "Collects a diagnostic trace from a currently running process", - symbols: new Option[] { - CommonOptions.ProcessIdOption(), - CircularBufferOption(), - OutputPathOption(), - ProvidersOption(), - ProfileOption(), - CommonOptions.FormatOption(), - DurationOption() - }, - handler: HandlerDescriptor.FromDelegate((CollectDelegate)Collect).GetCommandHandler()); + description: "Collects a diagnostic trace from a currently running process") + { + // Handler + HandlerDescriptor.FromDelegate((CollectDelegate)Collect).GetCommandHandler(), + // Options + CommonOptions.ProcessIdOption(), + CircularBufferOption(), + OutputPathOption(), + ProvidersOption(), + ProfileOption(), + CommonOptions.FormatOption(), + DurationOption() + }; private static uint DefaultCircularBufferSizeInMB => 256; private static Option CircularBufferOption() => new Option( alias: "--buffersize", - description: $"Sets the size of the in-memory circular buffer in megabytes. Default {DefaultCircularBufferSizeInMB} MB.", - argument: new Argument(defaultValue: DefaultCircularBufferSizeInMB) { Name = "size" }, - isHidden: false); + description: $"Sets the size of the in-memory circular buffer in megabytes. Default {DefaultCircularBufferSizeInMB} MB.") + { + Argument = new Argument(name: "size", defaultValue: DefaultCircularBufferSizeInMB) + }; public static string DefaultTraceName => "trace.nettrace"; private static Option OutputPathOption() => new Option( aliases: new[] { "-o", "--output" }, - description: $"The output path for the collected trace data. If not specified it defaults to '{DefaultTraceName}'", - argument: new Argument(defaultValue: new FileInfo(DefaultTraceName)) { Name = "trace-file-path" }, - isHidden: false); + description: $"The output path for the collected trace data. If not specified it defaults to '{DefaultTraceName}'.") + { + Argument = new Argument(name: "trace-file-path", defaultValue: new FileInfo(DefaultTraceName)) + }; private static Option ProvidersOption() => new Option( alias: "--providers", - description: @"A list of EventPipe providers to be enabled. This is in the form 'Provider[,Provider]', where Provider is in the form: 'KnownProviderName[:Flags[:Level][:KeyValueArgs]]', and KeyValueArgs is in the form: '[key1=value1][;key2=value2]'. These providers are in addition to any providers implied by the --profile argument. If there is any discrepancy for a particular provider, the configuration here takes precedence over the implicit configuration from the profile.", - argument: new Argument(defaultValue: "") { Name = "list-of-comma-separated-providers" }, // TODO: Can we specify an actual type? - isHidden: false); + description: @"A list of EventPipe providers to be enabled. This is in the form 'Provider[,Provider]', where Provider is in the form: 'KnownProviderName[:Flags[:Level][:KeyValueArgs]]', and KeyValueArgs is in the form: '[key1=value1][;key2=value2]'. These providers are in addition to any providers implied by the --profile argument. If there is any discrepancy for a particular provider, the configuration here takes precedence over the implicit configuration from the profile.") + { + Argument = new Argument(name: "list-of-comma-separated-providers", defaultValue: "") // TODO: Can we specify an actual type? + }; private static Option ProfileOption() => new Option( alias: "--profile", - description: @"A named pre-defined set of provider configurations that allows common tracing scenarios to be specified succinctly.", - argument: new Argument(defaultValue: "") { Name = "profile-name" }, - isHidden: false); + description: @"A named pre-defined set of provider configurations that allows common tracing scenarios to be specified succinctly.") + { + Argument = new Argument(name: "profile-name", defaultValue: "") + }; private static Option DurationOption() => new Option( alias: "--duration", - description: @"When specified, will trace for the given timespan and then automatically stop the trace. Provided in the form of dd:hh:mm:ss.", - argument: new Argument(defaultValue: default(TimeSpan)) { Name = "duration-timespan" }, - isHidden: true); + description: @"When specified, will trace for the given timespan and then automatically stop the trace. Provided in the form of dd:hh:mm:ss.") + { + Argument = new Argument(name: "duration-timespan", defaultValue: default), + IsHidden = true + }; } } diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs index ced5842d4b..640ccb9f66 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs @@ -2,14 +2,11 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Tools.Common; using System; -using System.IO; using System.CommandLine; using System.CommandLine.Builder; -using System.Diagnostics; -using System.Linq; -using System.Threading.Tasks; +using System.IO; namespace Microsoft.Diagnostics.Tools.Trace { @@ -45,25 +42,28 @@ public static int ConvertFile(IConsole console, FileInfo inputFilename, TraceFil public static Command ConvertCommand() => new Command( name: "convert", - description: "Converts traces to alternate formats for use with alternate trace analysis tools. Can only convert from the nettrace format.", - argument: (new Argument(defaultValue: new FileInfo(CollectCommandHandler.DefaultTraceName)) { - Name = "input-filename", - Description = $"Input trace file to be converted. Defaults to '{CollectCommandHandler.DefaultTraceName}'." - }).ExistingOnly(), - symbols: new Option[] { - CommonOptions.ConvertFormatOption(), - OutputOption() - }, - handler: System.CommandLine.Invocation.CommandHandler.Create(ConvertFile), - isHidden: false - ); + description: "Converts traces to alternate formats for use with alternate trace analysis tools. Can only convert from the nettrace format") + { + // Handler + System.CommandLine.Invocation.CommandHandler.Create(ConvertFile), + // Arguments and Options + InputFileArgument(), + CommonOptions.ConvertFormatOption(), + OutputOption(), + }; - public static Option OutputOption() => + private static Argument InputFileArgument() => + new Argument(name: "input-filename", defaultValue: new FileInfo(CollectCommandHandler.DefaultTraceName)) + { + Description = $"Input trace file to be converted. Defaults to '{CollectCommandHandler.DefaultTraceName}'." + }.ExistingOnly(); + + private static Option OutputOption() => new Option( - aliases: new [] { "-o", "--output" }, - description: "Output filename. Extension of target format will be added.", - argument: new Argument() { Name = "output-filename" }, - isHidden: false - ); + aliases: new[] { "-o", "--output" }, + description: "Output filename. Extension of target format will be added.") + { + Argument = new Argument(name: "output-filename") + }; } } diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/ListProcessesCommandHandler.cs b/src/Tools/dotnet-trace/CommandLine/Commands/ListProcessesCommandHandler.cs deleted file mode 100644 index c30ec69404..0000000000 --- a/src/Tools/dotnet-trace/CommandLine/Commands/ListProcessesCommandHandler.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using Microsoft.Internal.Common.Commands; -using System; -using System.CommandLine; -using System.Threading.Tasks; - -namespace Microsoft.Diagnostics.Tools.Trace -{ - internal static class ListProcessesCommandHandler - { - public static async Task GetActivePorts(IConsole console) - { - ProcessStatusCommandHandler.PrintProcessStatus(console); - await Task.FromResult(0); - return 0; - } - - public static Command ListProcessesCommand() => - new Command( - name: "ps", - description: "Lists dotnet processes that can be attached to.", - handler: System.CommandLine.Invocation.CommandHandler.Create(GetActivePorts), - isHidden: false); - } -} diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs b/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs index a182ae3f4a..fd91811078 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs @@ -35,9 +35,10 @@ public static async Task GetProfiles(IConsole console) public static Command ListProfilesCommand() => new Command( name: "list-profiles", - description: "Lists pre-built tracing profiles with a description of what providers and filters are in each profile.", - handler: CommandHandler.Create(GetProfiles), - isHidden: false); + description: "Lists pre-built tracing profiles with a description of what providers and filters are in each profile") + { + Handler = CommandHandler.Create(GetProfiles), + }; internal static IEnumerable DotNETRuntimeProfiles { get; } = new[] { new Profile( diff --git a/src/Tools/dotnet-trace/CommandLine/Options/CommonOptions.cs b/src/Tools/dotnet-trace/CommandLine/Options/CommonOptions.cs index 0584883938..54715f21b6 100644 --- a/src/Tools/dotnet-trace/CommandLine/Options/CommonOptions.cs +++ b/src/Tools/dotnet-trace/CommandLine/Options/CommonOptions.cs @@ -3,8 +3,6 @@ // See the LICENSE file in the project root for more information. using System.CommandLine; -using System.IO; -using System.Runtime.InteropServices; namespace Microsoft.Diagnostics.Tools.Trace { @@ -13,24 +11,27 @@ internal static class CommonOptions public static Option ProcessIdOption() => new Option( aliases: new[] { "-p", "--process-id" }, - description: "The process to collect the trace from", - argument: new Argument { Name = "pid" }, - isHidden: false); + description: "The process id to collect the trace.") + { + Argument = new Argument(name: "pid") + }; public static TraceFileFormat DefaultTraceFileFormat => TraceFileFormat.NetTrace; public static Option FormatOption() => new Option( - aliases: new[] { "--format" }, - description: $"Sets the output format for the trace file. Default is {DefaultTraceFileFormat}", - argument: new Argument(defaultValue: DefaultTraceFileFormat) { Name = "trace-file-format" }, - isHidden: false); + alias: "--format", + description: $"Sets the output format for the trace file. Default is {DefaultTraceFileFormat}.") + { + Argument = new Argument(name: "trace-file-format", defaultValue: DefaultTraceFileFormat) + }; public static Option ConvertFormatOption() => new Option( - aliases: new[] { "--format" }, - description: $"Sets the output format for the trace file conversion.", - argument: new Argument { Name = "trace-file-format" }, - isHidden: false); + alias: "--format", + description: $"Sets the output format for the trace file conversion.") + { + Argument = new Argument(name: "trace-file-format") + }; } } diff --git a/src/Tools/dotnet-trace/Program.cs b/src/Tools/dotnet-trace/Program.cs index 606f7ae62c..ed01c52ea7 100644 --- a/src/Tools/dotnet-trace/Program.cs +++ b/src/Tools/dotnet-trace/Program.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using Microsoft.Internal.Common.Commands; using System.CommandLine.Builder; using System.CommandLine.Invocation; using System.Threading.Tasks; @@ -14,7 +15,7 @@ public static Task Main(string[] args) { var parser = new CommandLineBuilder() .AddCommand(CollectCommandHandler.CollectCommand()) - .AddCommand(ListProcessesCommandHandler.ListProcessesCommand()) + .AddCommand(ProcessStatusCommandHandler.ProcessStatusCommand("Lists the dotnet processes that traces can be collected")) .AddCommand(ListProfilesCommandHandler.ListProfilesCommand()) .AddCommand(ConvertCommandHandler.ConvertCommand()) .UseDefaults() diff --git a/src/Tools/dotnet-trace/dotnet-trace.csproj b/src/Tools/dotnet-trace/dotnet-trace.csproj index 2f7e371333..0739bc1ba9 100644 --- a/src/Tools/dotnet-trace/dotnet-trace.csproj +++ b/src/Tools/dotnet-trace/dotnet-trace.csproj @@ -20,6 +20,7 @@ + From 10339ed7aaaad635913700e0883da9f7312abd16 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Mon, 9 Dec 2019 21:46:15 -0800 Subject: [PATCH 015/243] Prepare SOS for single file support and add desktop CLR support (#658) Prepare SOS for single file support and add desktop CLR support Add defines and functions for the runtime, dac and dbi modules/dlls names. Also supports desktop CLR Add minidump retry for ERROR_PARTIAL_COPY --- src/SOS/SOS.Hosting/SOSHost.cs | 5 + .../Unix/Debugger.Tests.Config.txt | 1 + .../Windows/Debugger.Tests.Config.txt | 6 +- .../Debuggees/DivZero/DivZero.csproj | 2 +- .../Debuggees/GCWhere/GCWhere.csproj | 2 +- .../NestedExceptionTest.csproj | 2 +- .../Debuggees/Overflow/Overflow.csproj | 2 +- .../ReflectionTest/ReflectionTest.csproj | 2 +- .../Debuggees/SimpleThrow/SimpleThrow.csproj | 2 +- .../SymbolTestApp/SymbolTestApp.csproj | 2 +- .../SymbolTestDll/SymbolTestDll.csproj | 2 +- .../RandomUserLibrary.csproj | 2 +- .../TaskNestedException.csproj | 2 +- src/SOS/SOS.UnitTests/SOS.cs | 4 +- src/SOS/SOS.UnitTests/SOSRunner.cs | 41 ++++-- src/SOS/SOS.UnitTests/Scripts/DivZero.script | 2 +- src/SOS/SOS.UnitTests/Scripts/GCTests.script | 18 +-- .../Scripts/NestedExceptionTest.script | 19 ++- .../Scripts/OtherCommands.script | 30 +++- .../SOS.UnitTests/Scripts/Reflection.script | 8 +- .../SOS.UnitTests/Scripts/SimpleThrow.script | 5 - .../Scripts/StackAndOtherTests.script | 61 ++++---- .../SOS.UnitTests/Scripts/StackTests.script | 18 +-- .../Scripts/TaskNestedException.script | 4 +- src/SOS/Strike/EventCallbacks.cpp | 36 +++-- src/SOS/Strike/exts.h | 18 +-- src/SOS/Strike/hostcoreclr.cpp | 100 +++++++------ src/SOS/Strike/hostcoreclr.h | 4 +- src/SOS/Strike/sos.def | 2 +- src/SOS/Strike/strike.cpp | 73 ++++++--- src/SOS/Strike/strike.h | 3 - src/SOS/Strike/util.cpp | 138 ++++++++++++++---- src/SOS/Strike/util.h | 94 +++++++++++- .../TestDebuggee/TestDebuggee.csproj | 2 +- src/Tools/dotnet-dump/Dumper.Windows.cs | 25 +++- src/inc/cor.h | 12 +- 36 files changed, 487 insertions(+), 262 deletions(-) diff --git a/src/SOS/SOS.Hosting/SOSHost.cs b/src/SOS/SOS.Hosting/SOSHost.cs index 7035afafb1..b6792a4ea8 100644 --- a/src/SOS/SOS.Hosting/SOSHost.cs +++ b/src/SOS/SOS.Hosting/SOSHost.cs @@ -157,6 +157,8 @@ struct SOSNetCoreCallbacks internal readonly IDataReader DataReader; + const string DesktopRuntimeModuleName = "clr"; + private static readonly string s_coreclrModuleName; private readonly AnalyzeContext _analyzeContext; @@ -1109,6 +1111,9 @@ internal int GetRegister( internal static bool IsRuntimeModule(ModuleInfo module) { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && IsModuleEqual(module, DesktopRuntimeModuleName)) { + return true; + } return IsModuleEqual(module, s_coreclrModuleName); } diff --git a/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt b/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt index 843a14276e..d6d38e4297 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt +++ b/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt @@ -117,6 +117,7 @@ From 6206c626b43cf77a576c0ed49f48954a5f3092d2 Mon Sep 17 00:00:00 2001 From: Sean-Driscoll <42188295+Sean-Driscoll@users.noreply.github.com> Date: Thu, 12 Dec 2019 09:28:49 -0500 Subject: [PATCH 019/243] Incorrect tool referenced (#687) --- documentation/dotnet-gcdump-instructions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/dotnet-gcdump-instructions.md b/documentation/dotnet-gcdump-instructions.md index e144e4ce70..8b31a3d9ec 100644 --- a/documentation/dotnet-gcdump-instructions.md +++ b/documentation/dotnet-gcdump-instructions.md @@ -1,6 +1,6 @@ # Heap Analysis Tool (dotnet-gcdump) -The dotnet-trace tool is a cross-platform CLI tool that collects gcdumps of live .NET processes. It is built using the EventPipe technology which is a cross-platform alternative to ETW on Windows. Gcdumps are created by triggering a GC +The dotnet-gcdump tool is a cross-platform CLI tool that collects gcdumps of live .NET processes. It is built using the EventPipe technology which is a cross-platform alternative to ETW on Windows. Gcdumps are created by triggering a GC in the target process, turning on special events, and regenerating the graph of object roots from the event stream. This allows for gcdumps to be collected while the process is running with minimal overhead. These dumps are useful for several scenarios: From b2660b8fd100f9d3a3a296e018dbf675e07703a1 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Thu, 12 Dec 2019 15:16:18 -0800 Subject: [PATCH 020/243] Fix GCEvent test being flakey (#689) * Fix GCEvent test being flakey * Fix build --- src/tests/eventpipe/GCEvents.cs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/tests/eventpipe/GCEvents.cs b/src/tests/eventpipe/GCEvents.cs index 990d9d6fb5..67147c8f70 100644 --- a/src/tests/eventpipe/GCEvents.cs +++ b/src/tests/eventpipe/GCEvents.cs @@ -229,13 +229,7 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => bool GCAllocationTickResult = GCAllocationTickEvents > 0; Logger.logger.Log("GCAllocationTickResult: " + GCAllocationTickResult); - Logger.logger.Log("GCCreateConcurrentThreadEvents: " + GCCreateConcurrentThreadEvents); - //GCTerminateConcurrentThreadEvents not stable, ignore the verification - Logger.logger.Log("GCTerminateConcurrentThreadEvents: " + GCTerminateConcurrentThreadEvents); - bool GCConcurrentResult = GCCreateConcurrentThreadEvents > 0 && GCTerminateConcurrentThreadEvents >= 0; - Logger.logger.Log("GCConcurrentResult: " + GCConcurrentResult); - - bool GCCollectResults = GCSegmentResult && GCAllocationTickResult && GCConcurrentResult; + bool GCCollectResults = GCSegmentResult && GCAllocationTickResult; Logger.logger.Log("GCCollectResults: " + GCCollectResults); return GCCollectResults ? 100 : -1; From 648c6fdfe083feb13bc2e7044c4c63dd4e9c87c5 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:03:42 +0000 Subject: [PATCH 021/243] [master] Update dependencies from aspnet/AspNetCore (#688) * Update dependencies from https://github.com/aspnet/AspNetCore build 20191211.17 - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha1.19611.17 * Update dependencies from https://github.com/aspnet/AspNetCore build 20191212.8 - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha1.19612.8 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index f613ad37af..ed0a35226d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/core-setup c77948d92a2f950140f09384f057cb893ec3955a - + https://github.com/aspnet/AspNetCore - 0792e9a4f56de47580c4490c27ca453934552246 + fde783911b0b671dc4307ef5bcb2a9bc5e4a51bf diff --git a/eng/Versions.props b/eng/Versions.props index c52e48ab10..95b35475b3 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -7,7 +7,7 @@ true true 5.0.0-alpha.1.19564.1 - 5.0.0-alpha1.19610.3 + 5.0.0-alpha1.19612.8 From 9ddf812c6d253818b4e0f3ef540b0561fa6ff65c Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Fri, 13 Dec 2019 14:47:52 -0800 Subject: [PATCH 022/243] Use darc runtime subscription versions for testing (#682) Use darc runtime subscription versions for testing Update arcade to version 5.0.0-beta.19608.1 Replace install scripts with InstallRuntimes.proj (thanks to Juan). Add build.ps1 on Windows. Build-Native.cmd just builds the native bits now. Combine build.sh and build-native.sh scripts. Remove -publish from scripts Add running sosstatus command on SOSRunner errors. Always set the host runtime (SOSHostRuntime) in test configs Fix RuntimeFrameworkVersion config property usage Sign, package and publish only if build legs successful Issues: https://github.com/dotnet/diagnostics/issues/423 https://github.com/dotnet/diagnostics/issues/480 --- .vsts-dotnet.yml | 2 +- Build.cmd | 2 +- CMakeLists.txt | 5 +- NuGet.config | 1 + Restore.cmd | 2 +- Test.cmd | 2 +- build.sh | 2 +- eng/Build-Native.cmd | 55 +- eng/Build.cmd | 17 - eng/CIBuild.cmd | 2 +- eng/InstallRuntimes.proj | 109 ++++ eng/Version.Details.xml | 4 +- eng/Versions.props | 13 +- eng/build-native.sh | 485 ----------------- eng/build.ps1 | 77 +++ eng/build.sh | 503 +++++++++++++++++- eng/cibuild.sh | 2 +- eng/citest.sh | 2 +- eng/common/CheckSymbols.ps1 | 53 +- eng/common/PSScriptAnalyzerSettings.psd1 | 11 + eng/common/PublishToSymbolServers.proj | 6 +- eng/common/SetupNugetSources.ps1 | 141 +++++ eng/common/SetupNugetSources.sh | 149 ++++++ eng/common/SigningValidation.proj | 2 +- eng/common/SourceLinkValidation.ps1 | 269 +++++----- eng/common/build.ps1 | 103 ++-- eng/common/build.sh | 24 +- eng/common/cross/build-rootfs.sh | 3 +- eng/common/cross/toolchain.cmake | 49 +- eng/common/darc-init.ps1 | 26 +- eng/common/darc-init.sh | 34 +- eng/common/dotnet-install.ps1 | 23 +- eng/common/dotnet-install.sh | 50 +- eng/common/enable-cross-org-publishing.ps1 | 8 + eng/common/generate-graph-files.ps1 | 49 +- eng/common/init-tools-native.ps1 | 47 +- eng/common/init-tools-native.sh | 9 +- eng/common/internal-feed-operations.ps1 | 133 +++++ eng/common/internal-feed-operations.sh | 142 +++++ eng/common/msbuild.ps1 | 5 +- eng/common/native/CommonLibrary.psm1 | 37 +- eng/common/native/common-library.sh | 10 +- eng/common/native/install-cmake-test.sh | 117 ++++ eng/common/native/install-cmake.sh | 6 +- eng/common/native/install-tool.ps1 | 12 +- eng/common/performance/perfhelixpublish.proj | 102 ++++ eng/common/performance/performance-setup.ps1 | 106 ++++ eng/common/performance/performance-setup.sh | 216 ++++++++ ...ons.ps1 => pipeline-logging-functions.ps1} | 98 +++- eng/common/pipeline-logging-functions.sh | 179 +++++++ eng/common/post-build/darc-gather-drop.ps1 | 44 ++ eng/common/post-build/nuget-validation.ps1 | 24 + eng/common/post-build/post-build-utils.ps1 | 91 ++++ eng/common/post-build/promote-build.ps1 | 48 ++ .../post-build/sourcelink-validation.ps1 | 257 +++++++++ eng/common/post-build/symbols-validation.ps1 | 188 +++++++ .../post-build/trigger-subscriptions.ps1 | 64 +++ eng/common/sdk-task.ps1 | 19 +- eng/common/sdl/execute-all-sdl-tools.ps1 | 173 +++--- eng/common/sdl/extract-artifact-packages.ps1 | 80 +++ eng/common/sdl/init-sdl.ps1 | 45 +- eng/common/sdl/packages.config | 4 +- eng/common/sdl/push-gdn.ps1 | 94 ++-- eng/common/sdl/run-sdl.ps1 | 94 ++-- eng/common/templates/job/execute-sdl.yml | 73 +++ eng/common/templates/job/job.yml | 141 ++--- eng/common/templates/job/performance.yml | 95 ++++ .../templates/job/publish-build-assets.yml | 21 + eng/common/templates/jobs/jobs.yml | 74 +-- .../channels/generic-internal-channel.yml | 159 ++++++ .../channels/generic-public-channel.yml | 159 ++++++ .../templates/post-build/common-variables.yml | 92 ++++ .../templates/post-build/darc-gather-drop.yml | 23 + .../templates/post-build/post-build.yml | 223 ++++++++ .../templates/post-build/promote-build.yml | 25 + .../post-build/setup-maestro-vars.yml | 40 ++ .../post-build/trigger-subscription.yml | 13 + .../templates/steps/perf-send-to-helix.yml | 66 +++ eng/common/templates/steps/promote-build.yml | 13 + eng/common/templates/steps/publish-logs.yml | 23 + eng/common/templates/steps/send-to-helix.yml | 3 + eng/common/tools.ps1 | 284 +++++----- eng/common/tools.sh | 182 +++---- eng/install-test-runtimes.ps1 | 99 ---- eng/install-test-runtimes.sh | 129 ----- global.json | 2 +- restore.sh | 2 +- .../BaseDebuggeeCompiler.cs | 1 - .../CliDebuggeeCompiler.cs | 6 +- .../Unix/Debugger.Tests.Config.txt | 39 +- .../Windows/Debugger.Tests.Config.txt | 42 +- src/SOS/SOS.UnitTests/SOS.UnitTests.csproj | 4 + src/SOS/SOS.UnitTests/SOSRunner.cs | 23 +- .../CommonHelper.cs | 9 +- .../GetPublishedProcessesTests.cs | 9 +- test.sh | 2 +- 96 files changed, 5022 insertions(+), 1783 deletions(-) delete mode 100644 eng/Build.cmd create mode 100644 eng/InstallRuntimes.proj delete mode 100755 eng/build-native.sh create mode 100644 eng/build.ps1 create mode 100644 eng/common/PSScriptAnalyzerSettings.psd1 create mode 100644 eng/common/SetupNugetSources.ps1 create mode 100644 eng/common/SetupNugetSources.sh create mode 100644 eng/common/enable-cross-org-publishing.ps1 create mode 100644 eng/common/internal-feed-operations.ps1 create mode 100644 eng/common/internal-feed-operations.sh create mode 100644 eng/common/native/install-cmake-test.sh create mode 100644 eng/common/performance/perfhelixpublish.proj create mode 100644 eng/common/performance/performance-setup.ps1 create mode 100644 eng/common/performance/performance-setup.sh rename eng/common/{LoggingCommandFunctions.ps1 => pipeline-logging-functions.ps1} (64%) create mode 100644 eng/common/pipeline-logging-functions.sh create mode 100644 eng/common/post-build/darc-gather-drop.ps1 create mode 100644 eng/common/post-build/nuget-validation.ps1 create mode 100644 eng/common/post-build/post-build-utils.ps1 create mode 100644 eng/common/post-build/promote-build.ps1 create mode 100644 eng/common/post-build/sourcelink-validation.ps1 create mode 100644 eng/common/post-build/symbols-validation.ps1 create mode 100644 eng/common/post-build/trigger-subscriptions.ps1 create mode 100644 eng/common/sdl/extract-artifact-packages.ps1 create mode 100644 eng/common/templates/job/execute-sdl.yml create mode 100644 eng/common/templates/job/performance.yml create mode 100644 eng/common/templates/post-build/channels/generic-internal-channel.yml create mode 100644 eng/common/templates/post-build/channels/generic-public-channel.yml create mode 100644 eng/common/templates/post-build/common-variables.yml create mode 100644 eng/common/templates/post-build/darc-gather-drop.yml create mode 100644 eng/common/templates/post-build/post-build.yml create mode 100644 eng/common/templates/post-build/promote-build.yml create mode 100644 eng/common/templates/post-build/setup-maestro-vars.yml create mode 100644 eng/common/templates/post-build/trigger-subscription.yml create mode 100644 eng/common/templates/steps/perf-send-to-helix.yml create mode 100644 eng/common/templates/steps/promote-build.yml create mode 100644 eng/common/templates/steps/publish-logs.yml delete mode 100644 eng/install-test-runtimes.ps1 delete mode 100755 eng/install-test-runtimes.sh diff --git a/.vsts-dotnet.yml b/.vsts-dotnet.yml index 87e6655f1f..4b75893fa2 100644 --- a/.vsts-dotnet.yml +++ b/.vsts-dotnet.yml @@ -212,7 +212,7 @@ jobs: - MacOS - Linux_cross - Linux_cross64 - condition: ne(variables['Build.Reason'], 'Schedule') + condition: and(succeeded(), ne(variables['Build.Reason'], 'Schedule')) pool: name: NetCoreInternal-Pool queue: BuildPool.Windows.10.Amd64.VS2017 diff --git a/Build.cmd b/Build.cmd index 2b5bba51f4..3de9ae405f 100644 --- a/Build.cmd +++ b/Build.cmd @@ -1,3 +1,3 @@ @echo off -call %~dp0eng\Build.cmd -restore -build -build-native %* +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0eng\build.ps1""" -restore %*" exit /b %ErrorLevel% diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a9adc4dc4..df05370f0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -455,10 +455,7 @@ endif(WIN32) # CLR_ADDITIONAL_LINKER_FLAGS - used for passing additional arguments to linker # CLR_ADDITIONAL_COMPILER_OPTIONS - used for passing additional arguments to compiler -# -# For example: -# ./build-native.sh cmakeargs "-DCLR_ADDITIONAL_COMPILER_OPTIONS=<...>" cmakeargs "-DCLR_ADDITIONAL_LINKER_FLAGS=<...>" -# + if(CLR_CMAKE_PLATFORM_UNIX) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CLR_ADDITIONAL_LINKER_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CLR_ADDITIONAL_LINKER_FLAGS}" ) diff --git a/NuGet.config b/NuGet.config index 04240c3996..ce7270fafd 100644 --- a/NuGet.config +++ b/NuGet.config @@ -6,6 +6,7 @@ + diff --git a/Restore.cmd b/Restore.cmd index cb0cb90b11..c6386d7670 100644 --- a/Restore.cmd +++ b/Restore.cmd @@ -1,3 +1,3 @@ @echo off -call %~dp0eng\Build.cmd -restore %* +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0eng\build.ps1""" -restore -skipmanaged -skipnative %*" exit /b %ErrorLevel% diff --git a/Test.cmd b/Test.cmd index ef857c81d3..d6aa6b1ddc 100644 --- a/Test.cmd +++ b/Test.cmd @@ -1,3 +1,3 @@ @echo off -call %~dp0eng\Build.cmd -test %* +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0eng\build.ps1""" -test -skipmanaged -skipnative %*" exit /b %ErrorLevel% diff --git a/build.sh b/build.sh index 3bbc31edfb..58a2abb50f 100755 --- a/build.sh +++ b/build.sh @@ -13,4 +13,4 @@ while [[ -h $source ]]; do done scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" -"$scriptroot/eng/build.sh" --restore --build --build-native $@ +"$scriptroot/eng/build.sh" --restore $@ diff --git a/eng/Build-Native.cmd b/eng/Build-Native.cmd index 52f620f1d4..e8f4082386 100644 --- a/eng/Build-Native.cmd +++ b/eng/Build-Native.cmd @@ -22,24 +22,6 @@ if defined VS160COMNTOOLS ( set __VSVersion=vs2017 ) -:: Work around Jenkins CI + msbuild problem: Jenkins sometimes creates very large environment -:: variables, and msbuild can't handle environment blocks with such large variables. So clear -:: out the variables that might be too large. -set ghprbCommentBody= - -:: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set: -:: __BuildArch -- default: x64 -:: __BuildType -- default: Debug -:: __BuildOS -- default: Windows_NT -:: __ProjectDir -- default: directory of the dir.props file -:: __SourceDir -- default: %__ProjectDir%\src\ -:: __RootBinDir -- default: %__ProjectDir%\artifacts\ -:: __IntermediatesDir -- default: %__RootBinDir%\obj\%__BuildOS%.%__BuildArch.%__BuildType%\ -:: __BinDir -- default: %__RootBinDir%\bin\%__BuildOS%.%__BuildArch.%__BuildType%\ -:: __LogDir -- default: %__RootBinDir%\log\%__BuildOS%.%__BuildArch.%__BuildType%\ -:: -:: Thus, these variables are not simply internal to this script! - :: Set the default arguments for build set __BuildArch=x64 @@ -47,12 +29,9 @@ if /i "%PROCESSOR_ARCHITECTURE%" == "amd64" set __BuildArch=x64 if /i "%PROCESSOR_ARCHITECTURE%" == "x86" set __BuildArch=x86 set __BuildType=Debug set __BuildOS=Windows_NT -set __Build=0 -set __Test=0 +set __Build=1 set __CI=0 -set __DailyTest= set __Verbosity=minimal -set __TestArgs= set __BuildCrossArch=0 set __CrossArch= @@ -63,7 +42,7 @@ if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%" set "__ProjectDir=%__ProjectDir%\.." set "__SourceDir=%__ProjectDir%\src" -:: __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64) +:: __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:OfficialBuildId=xxxxxx) set "__args=%*" set processedArgs= set __UnprocessedBuildArgs= @@ -76,18 +55,16 @@ if /i "%1" == "-h" goto Usage if /i "%1" == "-help" goto Usage if /i "%1" == "--help" goto Usage -if /i "%1" == "-build-native" (set __Build=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop) -if /i "%1" == "-test" (set __Test=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop) -if /i "%1" == "-daily-test" (set __DailyTest=-DailyTest&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop) if /i "%1" == "-configuration" (set __BuildType=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop) if /i "%1" == "-architecture" (set __BuildArch=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop) if /i "%1" == "-verbosity" (set __Verbosity=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop) -:: These options are passed on to the common build script when testing -if /i "%1" == "-ci" (set __CI=1&set __TestArgs=!__TestArgs! %1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop) -if /i "%1" == "-solution" (set __TestArgs=!__TestArgs! %1 %2&set processedArgs=!processedArgs! %1&shift&shift&goto Arg_Loop) +if /i "%1" == "-ci" (set __CI=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop) + :: These options are ignored for a native build +if /i "%1" == "-clean" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop) if /i "%1" == "-build" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop) if /i "%1" == "-rebuild" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop) +if /i "%1" == "-test" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop) if /i "%1" == "-sign" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop) if /i "%1" == "-restore" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop) if /i "%1" == "-pack" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop) @@ -332,8 +309,8 @@ REM Copy the native SOS binaries to where these tools expect for testing set "__dotnet_sos=%__RootBinDir%\bin\dotnet-sos\%__BuildType%\netcoreapp2.1\publish\win-%__BuildArch%" set "__dotnet_dump=%__RootBinDir%\bin\dotnet-dump\%__BuildType%\netcoreapp2.1\publish\win-%__BuildArch%" -xcopy /y /q /i /s %__BinDir% %__dotnet_sos% -xcopy /y /q /i /s %__BinDir% %__dotnet_dump% +xcopy /y /q /i %__BinDir% %__dotnet_sos% +xcopy /y /q /i %__BinDir% %__dotnet_dump% REM ========================================================================================= REM === @@ -344,19 +321,6 @@ REM ============================================================================ echo %__MsgPrefix%Repo successfully built. Finished at %TIME% echo %__MsgPrefix%Product binaries are available at !__BinDir! -if /i %__BuildCrossArch% EQU 1 goto Done - -:: Test components -if %__Test% EQU 1 ( - :: Install the other versions of .NET Core runtime we are going to test on - powershell -ExecutionPolicy ByPass -NoProfile -command "& """%__ProjectDir%\eng\install-test-runtimes.ps1""" -DotNetDir %__ProjectDir%\.dotnet -TempDir %__IntermediatesDir% -BuildArch %__BuildArch%" %__DailyTest% - - :: Run the xunit tests - powershell -ExecutionPolicy ByPass -NoProfile -command "& """%__ProjectDir%\eng\common\Build.ps1""" -test -configuration %__BuildType% -verbosity %__Verbosity% %__TestArgs%" - exit /b !ERRORLEVEL! -) - -:Done exit /b 0 REM ========================================================================================= @@ -375,9 +339,6 @@ echo. echo All arguments are optional. The options are: echo. echo.-? -h -help --help: view this message. -echo -build-native - build native components -echo -test - test components -echo -daily-test - test components for daily build job echo -architecture echo -configuration echo -verbosity diff --git a/eng/Build.cmd b/eng/Build.cmd deleted file mode 100644 index ae3e464daa..0000000000 --- a/eng/Build.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@echo off -setlocal - -:: remove the -test and -build-native options and pass it to build-native.cmd -set __args="%*" -set __args=%__args:-build-native=% -set __args=%__args:-daily-test=% -set __args=%__args:-test=% -if %__args% == "" set __args= - -:: build managed components -powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0common\Build.ps1""" %__args%" -if NOT '%ERRORLEVEL%' == '0' (exit /b %ERRORLEVEL%) - -:: build native componments and test managed/native -call %~dp0build-native.cmd %* -exit /b %ERRORLEVEL% diff --git a/eng/CIBuild.cmd b/eng/CIBuild.cmd index 6ed2ac8415..b0cd6a7758 100644 --- a/eng/CIBuild.cmd +++ b/eng/CIBuild.cmd @@ -1,3 +1,3 @@ @echo off -call %~dp0Build.cmd -restore -build -build-native -test -publish -ci %* +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0build.ps1""" -restore -test -ci %*" exit /b %ErrorLevel% diff --git a/eng/InstallRuntimes.proj b/eng/InstallRuntimes.proj new file mode 100644 index 0000000000..06cda8c6db --- /dev/null +++ b/eng/InstallRuntimes.proj @@ -0,0 +1,109 @@ + + + + + false + $(Platform) + x64 + -architecture $(BuildArch) + $(DotNetRoot)Debugger.Tests.Versions.txt + $(DotNetRoot)x86\Debugger.Tests.Versions.txt + + + + + + powershell -NonInteractive -ExecutionPolicy ByPass -NoProfile -command + '$(RepositoryEngineeringDir)common\dotnet-install.ps1' + + + + + $(RepositoryEngineeringDir)common/dotnet-install.sh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(DailyTest) + $(MicrosoftNETCoreApp21Version) + $(MicrosoftAspNetCoreApp21Version) + $(MicrosoftNETCoreApp30Version) + $(MicrosoftAspNetCoreApp30Version) + $(MicrosoftNETCoreApp31Version) + $(MicrosoftAspNetCoreApp31Version) + $(MicrosoftNETCoreAppVersion) + $(MicrosoftAspNetCoreAppRefVersion) + +]]> + + + + + + + + + + + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ed0a35226d..1220311255 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -10,9 +10,9 @@ - + https://github.com/dotnet/arcade - 4953cdf6c956adf69a0050c4df503048aed6b271 + 71ce4c736b882e6112b395a0e92313be5dcb4328 https://github.com/dotnet/core-setup diff --git a/eng/Versions.props b/eng/Versions.props index 95b35475b3..f575764f7c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -6,11 +6,22 @@ 3.0.0 true true + + + + 3.0.100 + + 2.1.12 + $(MicrosoftNETCoreApp21Version) + 3.0.0 + $(MicrosoftNETCoreApp30Version) + 3.1.0 + $(MicrosoftNETCoreApp31Version) 5.0.0-alpha.1.19564.1 5.0.0-alpha1.19612.8 - + false true true diff --git a/eng/build-native.sh b/eng/build-native.sh deleted file mode 100755 index 5035a8ef7d..0000000000 --- a/eng/build-native.sh +++ /dev/null @@ -1,485 +0,0 @@ -#!/usr/bin/env bash -# Copyright (c) .NET Foundation and contributors. All rights reserved. -# Licensed under the MIT license. See LICENSE file in the project root for full license information. - -# Obtain the location of the bash script to figure out where the root of the repo is. -source="${BASH_SOURCE[0]}" - -# Resolve $source until the file is no longer a symlink -while [[ -h "$source" ]]; do - scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" - source="$(readlink "$source")" - # if $source was a relative symlink, we need to resolve it relative to the path where the - # symlink file was located - [[ $source != /* ]] && source="$scriptroot/$source" -done -__ProjectRoot="$( cd -P "$( dirname "$source" )/.." && pwd )" - -__BuildOS=Linux -__HostOS=Linux -__BuildArch=x64 -__HostArch=x64 -__BuildType=Debug -__PortableBuild=1 -__ExtraCmakeArgs="" -__ClangMajorVersion=0 -__ClangMinorVersion=0 -__CrossBuild=false -__NumProc=1 -__Build=false -__Test=false -__DailyTest= -__CI=false -__Verbosity=minimal -__TestArgs= -__UnprocessedBuildArgs= -__Alpine=false - -usage() -{ - echo "Usage: $0 [options]" - echo "--build-native - build native components" - echo "--test - test native components" - echo "--daily-test - test native components for daily build job" - echo "--architecture " - echo "--configuration " - echo "--rootfs " - echo "--stripsymbols - strip symbols into .dbg files" - echo "--clangx.y - optional argument to build using clang version x.y" - echo "--ci - CI lab build" - echo "--verbosity " - echo "--help - this help message" - exit 1 -} - -# args: -# input - $1 -to_lowercase() { - #eval $invocation - - echo "$1" | tr '[:upper:]' '[:lower:]' - return 0 -} - -# Argument types supported by this script: -# -# Build architecture - valid values are: x64, x86, arm, armel, arm64 -# Build Type - valid values are: debug, release -# -# Set the default arguments for build - -# Use uname to determine what the CPU is. -CPUName=$(uname -p) -# Some Linux platforms report unknown for platform, but the arch for machine. -if [ "$CPUName" == "unknown" ]; then - CPUName=$(uname -m) -fi - -case $CPUName in - i686) - echo "Unsupported CPU $CPUName detected, build might not succeed!" - __BuildArch=x86 - __HostArch=x86 - ;; - - x86_64) - __BuildArch=x64 - __HostArch=x64 - ;; - - armv7l) - echo "Unsupported CPU $CPUName detected, build might not succeed!" - __BuildArch=arm - __HostArch=arm - ;; - - aarch64) - __BuildArch=arm64 - __HostArch=arm64 - ;; - - *) - echo "Unknown CPU $CPUName detected, configuring as if for x64" - __BuildArch=x64 - __HostArch=x64 - ;; -esac - -# Use uname to determine what the OS is. -OSName=$(uname -s) -case $OSName in - Linux) - __BuildOS=Linux - __HostOS=Linux - ;; - - Darwin) - __BuildOS=OSX - __HostOS=OSX - ;; - - FreeBSD) - __BuildOS=FreeBSD - __HostOS=FreeBSD - ;; - - OpenBSD) - __BuildOS=OpenBSD - __HostOS=OpenBSD - ;; - - NetBSD) - __BuildOS=NetBSD - __HostOS=NetBSD - ;; - - SunOS) - __BuildOS=SunOS - __HostOS=SunOS - ;; - - *) - echo "Unsupported OS $OSName detected, configuring as if for Linux" - __BuildOS=Linux - __HostOS=Linux - ;; -esac - -while :; do - if [ $# -le 0 ]; then - break - fi - - lowerI="$(to_lowercase "$1")" - case $lowerI in - -\?|-h|--help) - usage - exit 1 - ;; - - --build-native) - __Build=true - ;; - - # Passed to common build script when testing - --test) - __Test=true - ;; - - --daily-test) - __DailyTest="--daily-test" - ;; - - --ci) - __CI=true - __TestArgs="$__TestArgs $1" - ;; - - --projects) - __TestArgs="$__TestArgs $1 $2" - shift - ;; - - --verbosity) - __Verbosity=$2 - __TestArgs="$__TestArgs $1 $2" - shift - ;; - - --configuration) - __BuildType="$(to_lowercase "$2")" - shift - ;; - - --architecture) - __BuildArch="$(to_lowercase "$2")" - shift - ;; - - --rootfs) - export ROOTFS_DIR="$2" - shift - ;; - - --portablebuild=false) - __PortableBuild=0 - ;; - - --stripsymbols) - __ExtraCmakeArgs="$__ExtraCmakeArgs -DSTRIP_SYMBOLS=true" - ;; - - --clang3.5) - __ClangMajorVersion=3 - __ClangMinorVersion=5 - ;; - - --clang3.6) - __ClangMajorVersion=3 - __ClangMinorVersion=6 - ;; - - --clang3.7) - __ClangMajorVersion=3 - __ClangMinorVersion=7 - ;; - - --clang3.8) - __ClangMajorVersion=3 - __ClangMinorVersion=8 - ;; - - --clang3.9) - __ClangMajorVersion=3 - __ClangMinorVersion=9 - ;; - - --clang4.0) - __ClangMajorVersion=4 - __ClangMinorVersion=0 - ;; - - --clang5.0) - __ClangMajorVersion=5 - __ClangMinorVersion=0 - ;; - - # Ignored for a native build - --build|--rebuild|--sign|--restore|--pack|--publish|--preparemachine) - ;; - - *) - __UnprocessedBuildArgs="$__UnprocessedBuildArgs $1" - ;; - esac - - shift -done - -if [ "$__BuildType" == "release" ]; then - __BuildType=Release -fi -if [ "$__BuildType" == "debug" ]; then - __BuildType=Debug -fi - -# Needs to be set for generate version source file/msbuild -if [[ -z $NUGET_PACKAGES ]]; then - if [[ $__CI == true ]]; then - export NUGET_PACKAGES="$__ProjectRoot/.packages" - else - export NUGET_PACKAGES="$HOME/.nuget/packages" - fi -fi - -echo $NUGET_PACKAGES - -__RootBinDir=$__ProjectRoot/artifacts -__BinDir=$__RootBinDir/bin/$__BuildOS.$__BuildArch.$__BuildType -__LogDir=$__RootBinDir/log/$__BuildOS.$__BuildArch.$__BuildType -__IntermediatesDir=$__RootBinDir/obj/$__BuildOS.$__BuildArch.$__BuildType -__ResultsDir=$__RootBinDir/TestResults/$__BuildType -__PackagesBinDir=$__RootBinDir/packages/$__BuildType/Shipping -__ExtraCmakeArgs="$__ExtraCmakeArgs -DCLR_MANAGED_BINARY_DIR=$__RootBinDir/bin -DCLR_BUILD_TYPE=$__BuildType" -__DotNetCli=$__ProjectRoot/.dotnet/dotnet - -if [ ! -e $__DotNetCli ]; then - echo "dotnet cli not installed $__DotNetCli" - exit 1 -fi - -# Specify path to be set for CMAKE_INSTALL_PREFIX. -# This is where all built native libraries will copied to. -export __CMakeBinDir="$__BinDir" - -# Set default clang version -if [[ $__ClangMajorVersion == 0 && $__ClangMinorVersion == 0 ]]; then - if [[ "$__BuildArch" == "arm" || "$__BuildArch" == "armel" ]]; then - __ClangMajorVersion=5 - __ClangMinorVersion=0 - else - __ClangMajorVersion=3 - __ClangMinorVersion=9 - fi -fi - -if [[ "$__BuildArch" == "armel" ]]; then - # Armel cross build is Tizen specific and does not support Portable RID build - __PortableBuild=0 -fi - -# Configure environment if we are doing a cross compile. -if [ "${__BuildArch}" != "${__HostArch}" ]; then - __CrossBuild=true - export CROSSCOMPILE=1 - if ! [[ -n "$ROOTFS_DIR" ]]; then - echo "ERROR: ROOTFS_DIR not set for cross build" - exit 1 - fi - echo "ROOTFS_DIR: $ROOTFS_DIR" -fi - -mkdir -p "$__IntermediatesDir" -mkdir -p "$__LogDir" -mkdir -p "$__CMakeBinDir" - -build_native() -{ - platformArch="$1" - intermediatesForBuild="$2" - extraCmakeArguments="$3" - - # All set to commence the build - echo "Commencing $__DistroRid build for $__BuildOS.$__BuildArch.$__BuildType in $intermediatesForBuild" - - generator="" - buildFile="Makefile" - buildTool="make" - scriptDir="$__ProjectRoot/eng" - - pushd "$intermediatesForBuild" - echo "Invoking \"$scriptDir/gen-buildsys-clang.sh\" \"$__ProjectRoot\" $__ClangMajorVersion \"$__ClangMinorVersion\" $platformArch "$scriptDir" $__BuildType $generator $extraCmakeArguments" - "$scriptDir/gen-buildsys-clang.sh" "$__ProjectRoot" $__ClangMajorVersion "$__ClangMinorVersion" $platformArch "$scriptDir" $__BuildType $generator "$extraCmakeArguments" - popd - - if [ ! -f "$intermediatesForBuild/$buildFile" ]; then - echo "Failed to generate build project!" - exit 1 - fi - - # Check that the makefiles were created. - pushd "$intermediatesForBuild" - - echo "Executing $buildTool install -j $__NumProc" - - $buildTool install -j $__NumProc | tee $__LogDir/make.log - if [ $? != 0 ]; then - echo "Failed to build." - exit 1 - fi - - popd -} - -initTargetDistroRid() -{ - source "$__ProjectRoot/eng/init-distro-rid.sh" - - local passedRootfsDir="" - - # Only pass ROOTFS_DIR if cross is specified. - if [ $__CrossBuild == true ]; then - passedRootfsDir=${ROOTFS_DIR} - fi - - initDistroRidGlobal ${__BuildOS} ${__BuildArch} ${__PortableBuild} ${passedRootfsDir} -} - -# Init the target distro name -initTargetDistroRid - - -echo "RID: $__DistroRid" - -if [ "$__HostOS" == "OSX" ]; then - export LLDB_H=$__ProjectRoot/src/SOS/lldbplugin/swift-4.0 - export LLDB_LIB=/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/LLDB - export LLDB_PATH=/Applications/Xcode.app/Contents/Developer/usr/bin/lldb - - export MACOSX_DEPLOYMENT_TARGET=10.12 - - # If Xcode 9.2 exists (like on the CI/build machines), use that. Xcode 9.3 or - # greater (swift 4.1 lldb) doesn't work that well (seg faults on exit). - if [ -f "/Applications/Xcode_9.2.app/Contents/Developer/usr/bin/lldb" ]; then - if [ -f "/Applications/Xcode_9.2.app/Contents/SharedFrameworks/LLDB.framework/LLDB" ]; then - export LLDB_PATH=/Applications/Xcode_9.2.app/Contents/Developer/usr/bin/lldb - export LLDB_LIB=/Applications/Xcode_9.2.app/Contents/SharedFrameworks/LLDB.framework/LLDB - fi - fi - - if [ ! -f $LLDB_LIB ]; then - echo "Cannot find the lldb library. Try installing Xcode." - exit 1 - fi - - # Workaround bad python version in /usr/local/bin/python2.7 on lab machines - export PATH=/usr/bin:$PATH - which python - python --version -fi - -# Build native components -if [ $__Build == true ]; then - if [[ $__CI == true ]]; then - echo "Generating Version Source File" - __GenerateVersionRestoreLog="$__LogDir/GenerateVersionRestore.binlog" - $__DotNetCli msbuild $__ProjectRoot/eng/CreateVersionFile.csproj /v:$__Verbosity /bl:$__GenerateVersionRestoreLog /t:Restore /p:Configuration="$__BuildType" /p:Platform="$__BuildArch" $__UnprocessedBuildArgs - - __GenerateVersionLog="$__LogDir/GenerateVersion.binlog" - $__DotNetCli msbuild $__ProjectRoot/eng/CreateVersionFile.csproj /v:$__Verbosity /bl:$__GenerateVersionLog /t:GenerateVersionFiles /p:GenerateVersionSourceFile=true /p:NativeVersionSourceFile="$__IntermediatesDir/version.cpp" /p:Configuration="$__BuildType" /p:Platform="$__BuildArch" $__UnprocessedBuildArgs - if [ $? != 0 ]; then - echo "Generating Version Source File FAILED" - exit 1 - fi - else - echo "Generating Empty Version Source File" - echo "" > "$__IntermediatesDir/version.cpp" - fi - - build_native "$__BuildArch" "$__IntermediatesDir" "$__ExtraCmakeArgs" -fi - -if [[ $__Build == true || $__Test == true ]]; then - # Copy the native SOS binaries to where these tools expect for testing - __dotnet_sos=$__RootBinDir/bin/dotnet-sos/$__BuildType/netcoreapp2.1/publish/$__DistroRid - __dotnet_dump=$__RootBinDir/bin/dotnet-dump/$__BuildType/netcoreapp2.1/publish/$__DistroRid - - mkdir -p "$__dotnet_sos" - mkdir -p "$__dotnet_dump" - - cp "$__BinDir"/* "$__dotnet_sos" - echo "Copied SOS to $__dotnet_sos" - - cp "$__BinDir"/* "$__dotnet_dump" - echo "Copied SOS to $__dotnet_dump" -fi - -# Run SOS/lldbplugin tests -if [ $__Test == true ]; then - if [ $__CrossBuild != true ]; then - - # Install the other versions of .NET Core runtime we are going to test on - "$__ProjectRoot/eng/install-test-runtimes.sh" --dotnet-directory "$__ProjectRoot/.dotnet" --temp-directory "$__IntermediatesDir" --architecture "$__BuildArch" $__DailyTest - - if [ "$LLDB_PATH" == "" ]; then - export LLDB_PATH="$(which lldb-3.9.1 2> /dev/null)" - if [ "$LLDB_PATH" == "" ]; then - export LLDB_PATH="$(which lldb-3.9 2> /dev/null)" - if [ "$LLDB_PATH" == "" ]; then - export LLDB_PATH="$(which lldb-4.0 2> /dev/null)" - if [ "$LLDB_PATH" == "" ]; then - export LLDB_PATH="$(which lldb-5.0 2> /dev/null)" - if [ "$LLDB_PATH" == "" ]; then - export LLDB_PATH="$(which lldb 2> /dev/null)" - fi - fi - fi - fi - fi - - if [ "$GDB_PATH" == "" ]; then - export GDB_PATH="$(which gdb 2> /dev/null)" - fi - - echo "lldb: '$LLDB_PATH' gdb: '$GDB_PATH'" - - # Run xunit SOS tests - "$__ProjectRoot/eng/common/build.sh" --test --configuration "$__BuildType" $__TestArgs - if [ $? != 0 ]; then - exit 1 - fi - fi -fi - -echo "BUILD: Repo sucessfully built." -echo "BUILD: Product binaries are available at $__CMakeBinDir" diff --git a/eng/build.ps1 b/eng/build.ps1 new file mode 100644 index 0000000000..7521165a17 --- /dev/null +++ b/eng/build.ps1 @@ -0,0 +1,77 @@ +[CmdletBinding(PositionalBinding=$false)] +Param( + [string][Alias('c')] $configuration = "Debug", + [string] $architecture = "", + [string][Alias('v')] $verbosity = "minimal", + [switch][Alias('t')] $test, + [switch] $ci, + [switch] $skipmanaged, + [switch] $skipnative, + [switch] $dailytest, + [Parameter(ValueFromRemainingArguments=$true)][String[]] $remainingargs +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" + +function Get-Architecture([string]$arch) { + switch ($arch.ToLower()) { + { $_ -eq "" } { return Get-Architecture($env:PROCESSOR_ARCHITECTURE) } + { ($_ -eq "amd64") -or ($_ -eq "x64") } { return "x64" } + { $_ -eq "x86" } { return "x86" } + { $_ -eq "arm" } { return "arm" } + { $_ -eq "arm64" } { return "arm64" } + default { throw "Architecture not supported." } + } +} + +$architecture = Get-Architecture($architecture) + +$crossbuild = $false +if (($architecture -eq "arm") -or ($architecture -eq "arm64")) { + $processor = Get-Architecture($env:PROCESSOR_ARCHITECTURE) + if ($architecture -ne $processor) { + $crossbuild = $true + } +} + +switch ($configuration.ToLower()) { + { $_ -eq "debug" } { $configuration = "Debug" } + { $_ -eq "release" } { $configuration = "Release" } +} + +$reporoot = Join-Path $PSScriptRoot ".." +$engroot = Join-Path $reporoot "eng" +$artifactsdir = Join-Path $reporoot "artifacts" +$logdir = Join-Path $artifactsdir "log" +$logdir = Join-Path $logdir Windows_NT.$architecture.$configuration + +if ($ci) { + $remainingargs = "-ci " + $remainingargs +} + +# Install sdk for building, restore and build managed components. +if (-not $skipmanaged) { + Invoke-Expression "& `"$engroot\common\build.ps1`" -build -configuration $configuration -verbosity $verbosity /p:TestArchitectures=$architecture $remainingargs" + if ($lastExitCode -ne 0) { + exit $lastExitCode + } +} + +# Build native components +if (-not $skipnative) { + Invoke-Expression "& `"$engroot\Build-Native.cmd`" -architecture $architecture -configuration $configuration -verbosity $verbosity $remainingargs" + if ($lastExitCode -ne 0) { + exit $lastExitCode + } +} + +# Run the xunit tests +if ($test -or $dailytest) { + if (-not $crossbuild) { + & "$engroot\common\build.ps1" -test -configuration $configuration -verbosity $verbosity -ci:$ci /bl:$logdir\Test.binlog /p:TestArchitectures=$architecture /p:BuildArch=$architecture /p:DailyTest=$dailyTest + if ($lastExitCode -ne 0) { + exit $lastExitCode + } + } +} diff --git a/eng/build.sh b/eng/build.sh index bb87448d67..c79122f93c 100755 --- a/eng/build.sh +++ b/eng/build.sh @@ -2,63 +2,516 @@ # Copyright (c) .NET Foundation and contributors. All rights reserved. # Licensed under the MIT license. See LICENSE file in the project root for full license information. +# Obtain the location of the bash script to figure out where the root of the repo is. source="${BASH_SOURCE[0]}" -# resolve $SOURCE until the file is no longer a symlink -while [[ -h $source ]]; do +# Resolve $source until the file is no longer a symlink +while [[ -h "$source" ]]; do scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" source="$(readlink "$source")" - # if $source was a relative symlink, we need to resolve it relative to the path where the # symlink file was located [[ $source != /* ]] && source="$scriptroot/$source" done +__ProjectRoot="$( cd -P "$( dirname "$source" )/.." && pwd )" + +__BuildOS=Linux +__HostOS=Linux +__BuildArch=x64 +__HostArch=x64 +__BuildType=Debug +__PortableBuild=1 +__ExtraCmakeArgs="" +__ClangMajorVersion=0 +__ClangMinorVersion=0 +__NumProc=1 +__ManagedBuild=true +__NativeBuild=true +__CrossBuild=false +__Test=false +__DailyTest=false +__CI=false +__Verbosity=minimal +__ManagedBuildArgs= +__TestArgs= +__UnprocessedBuildArgs= + +usage() +{ + echo "Usage: $0 [options]" + echo "--skipmanaged- Skip building managed components" + echo "--skipnative - Skip building native components" + echo "--test - run xunit tests" + echo "--dailytest - test components for daily build job" + echo "--architecture " + echo "--configuration " + echo "--rootfs " + echo "--stripsymbols - strip symbols into .dbg files" + echo "--clangx.y - optional argument to build using clang version x.y" + echo "--ci - CI lab build" + echo "--verbosity " + echo "--help - this help message" + exit 1 +} -scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" +to_lowercase() { + #eval $invocation -# args: -# input - $1 -function ToLowerCase() { echo "$1" | tr '[:upper:]' '[:lower:]' return 0 } -buildargs= -buildnativeargs=$@ +# Argument types supported by this script: +# +# Build architecture - valid values are: x64, x86, arm, armel, arm64 +# Build Type - valid values are: debug, release +# +# Set the default arguments for build + +# Use uname to determine what the CPU is. +CPUName=$(uname -p) +# Some Linux platforms report unknown for platform, but the arch for machine. +if [ "$CPUName" == "unknown" ]; then + CPUName=$(uname -m) +fi + +case $CPUName in + i686) + echo "Unsupported CPU $CPUName detected, build might not succeed!" + __BuildArch=x86 + __HostArch=x86 + ;; + + x86_64) + __BuildArch=x64 + __HostArch=x64 + ;; + + armv7l) + echo "Unsupported CPU $CPUName detected, build might not succeed!" + __BuildArch=arm + __HostArch=arm + ;; + + aarch64) + __BuildArch=arm64 + __HostArch=arm64 + ;; + + *) + echo "Unknown CPU $CPUName detected, configuring as if for x64" + __BuildArch=x64 + __HostArch=x64 + ;; +esac + +# Use uname to determine what the OS is. +OSName=$(uname -s) +case $OSName in + Linux) + __BuildOS=Linux + __HostOS=Linux + ;; + + Darwin) + __BuildOS=OSX + __HostOS=OSX + ;; + + FreeBSD) + __BuildOS=FreeBSD + __HostOS=FreeBSD + ;; + + OpenBSD) + __BuildOS=OpenBSD + __HostOS=OpenBSD + ;; + + NetBSD) + __BuildOS=NetBSD + __HostOS=NetBSD + ;; + + SunOS) + __BuildOS=SunOS + __HostOS=SunOS + ;; + + *) + echo "Unsupported OS $OSName detected, configuring as if for Linux" + __BuildOS=Linux + __HostOS=Linux + ;; +esac -# Parse command line options while :; do if [ $# -le 0 ]; then break fi - lowerI="$(ToLowerCase "$1")" - case $lowerI in - --architecture) + # support both "--" and "-" options + opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')" + case $opt in + -\?|-h|-help) + usage + exit 1 + ;; + + -skipmanaged) + __ManagedBuild=false + ;; + + -skipnative) + __NativeBuild=false + ;; + + -build|-b) + __ManagedBuild=true + ;; + + -test|-t) + __Test=true + ;; + + -dailytest) + __DailyTest=true + ;; + + -ci) + __CI=true + __ManagedBuildArgs="$__ManagedBuildArgs $1" + __TestArgs="$__TestArgs $1" + ;; + + -projects) + __ManagedBuildArgs="$__ManagedBuildArgs $1 $2" + __TestArgs="$__TestArgs $1 $2" shift ;; - --rootfs) + + -verbosity) + __Verbosity=$2 shift ;; - --build-native|--test|--daily-test|--stripsymbols) + + -configuration|-c) + __BuildType="$(to_lowercase "$2")" + shift + ;; + + -architecture) + __BuildArch="$(to_lowercase "$2")" + shift ;; - --clang3.5|--clang3.6|--clang3.7|--clang3.8|--clang3.9|--clang4.0|--clang5.0) + + -rootfs) + export ROOTFS_DIR="$2" + shift + ;; + + -portablebuild=false) + __PortableBuild=0 + ;; + + -stripsymbols) + __ExtraCmakeArgs="$__ExtraCmakeArgs -DSTRIP_SYMBOLS=true" + ;; + + -clang3.5) + __ClangMajorVersion=3 + __ClangMinorVersion=5 + ;; + + -clang3.6) + __ClangMajorVersion=3 + __ClangMinorVersion=6 + ;; + + -clang3.7) + __ClangMajorVersion=3 + __ClangMinorVersion=7 ;; + + -clang3.8) + __ClangMajorVersion=3 + __ClangMinorVersion=8 + ;; + + -clang3.9) + __ClangMajorVersion=3 + __ClangMinorVersion=9 + ;; + + -clang4.0) + __ClangMajorVersion=4 + __ClangMinorVersion=0 + ;; + + -clang5.0) + __ClangMajorVersion=5 + __ClangMinorVersion=0 + ;; + + -clean|-binarylog|-bl|-pipelineslog|-pl|-restore|-r|-rebuild|-pack|-integrationtest|-performancetest|-sign|-publish|-preparemachine) + __ManagedBuildArgs="$__ManagedBuildArgs $1" + ;; + + -warnaserror|-nodereuse) + __ManagedBuildArgs="$__ManagedBuildArgs $1 $2" + ;; + *) - buildargs="$buildargs $1" + __UnprocessedBuildArgs="$__UnprocessedBuildArgs $1" ;; esac shift done -# build managed components -"$scriptroot/common/build.sh" $buildargs -if [[ $? != 0 ]]; then - exit 1 +if [ "$__BuildType" == "release" ]; then + __BuildType=Release +fi +if [ "$__BuildType" == "debug" ]; then + __BuildType=Debug fi -# build native components and test both -"$scriptroot/build-native.sh" $buildnativeargs -if [[ $? != 0 ]]; then - exit 1 +# Needs to be set for generate version source file/msbuild +if [[ -z $NUGET_PACKAGES ]]; then + if [[ $__CI == true ]]; then + export NUGET_PACKAGES="$__ProjectRoot/.packages" + else + export NUGET_PACKAGES="$HOME/.nuget/packages" + fi +fi + +echo $NUGET_PACKAGES + +__RootBinDir=$__ProjectRoot/artifacts +__BinDir=$__RootBinDir/bin/$__BuildOS.$__BuildArch.$__BuildType +__LogDir=$__RootBinDir/log/$__BuildOS.$__BuildArch.$__BuildType +__IntermediatesDir=$__RootBinDir/obj/$__BuildOS.$__BuildArch.$__BuildType +__ExtraCmakeArgs="$__ExtraCmakeArgs -DCLR_MANAGED_BINARY_DIR=$__RootBinDir/bin -DCLR_BUILD_TYPE=$__BuildType" +__DotNetCli=$__ProjectRoot/.dotnet/dotnet + +# Specify path to be set for CMAKE_INSTALL_PREFIX. +# This is where all built native libraries will copied to. +export __CMakeBinDir="$__BinDir" + +# Set default clang version +if [[ $__ClangMajorVersion == 0 && $__ClangMinorVersion == 0 ]]; then + if [[ "$__BuildArch" == "arm" || "$__BuildArch" == "armel" ]]; then + __ClangMajorVersion=5 + __ClangMinorVersion=0 + else + __ClangMajorVersion=3 + __ClangMinorVersion=9 + fi +fi + +if [[ "$__BuildArch" == "armel" ]]; then + # Armel cross build is Tizen specific and does not support Portable RID build + __PortableBuild=0 +fi + +# Configure environment if we are doing a cross compile. +if [ "${__BuildArch}" != "${__HostArch}" ]; then + __CrossBuild=true + export CROSSCOMPILE=1 + if ! [[ -n "$ROOTFS_DIR" ]]; then + echo "ERROR: ROOTFS_DIR not set for cross build" + exit 1 + fi + echo "ROOTFS_DIR: $ROOTFS_DIR" +fi + +mkdir -p "$__IntermediatesDir" +mkdir -p "$__LogDir" +mkdir -p "$__CMakeBinDir" + +build_native() +{ + platformArch="$1" + intermediatesForBuild="$2" + extraCmakeArguments="$3" + + # All set to commence the build + echo "Commencing $__DistroRid build for $__BuildOS.$__BuildArch.$__BuildType in $intermediatesForBuild" + + generator="" + buildFile="Makefile" + buildTool="make" + scriptDir="$__ProjectRoot/eng" + + pushd "$intermediatesForBuild" + echo "Invoking \"$scriptDir/gen-buildsys-clang.sh\" \"$__ProjectRoot\" $__ClangMajorVersion \"$__ClangMinorVersion\" $platformArch "$scriptDir" $__BuildType $generator $extraCmakeArguments" + "$scriptDir/gen-buildsys-clang.sh" "$__ProjectRoot" $__ClangMajorVersion "$__ClangMinorVersion" $platformArch "$scriptDir" $__BuildType $generator "$extraCmakeArguments" + popd + + if [ ! -f "$intermediatesForBuild/$buildFile" ]; then + echo "Failed to generate build project!" + exit 1 + fi + + # Check that the makefiles were created. + pushd "$intermediatesForBuild" + + echo "Executing $buildTool install -j $__NumProc" + + $buildTool install -j $__NumProc | tee $__LogDir/make.log + if [ $? != 0 ]; then + echo "Failed to build." + exit 1 + fi + + popd +} + +initTargetDistroRid() +{ + source "$__ProjectRoot/eng/init-distro-rid.sh" + + local passedRootfsDir="" + + # Only pass ROOTFS_DIR if cross is specified. + if [ $__CrossBuild == true ]; then + passedRootfsDir=${ROOTFS_DIR} + fi + + initDistroRidGlobal ${__BuildOS} ${__BuildArch} ${__PortableBuild} ${passedRootfsDir} +} + +# +# Managed build +# + +if [ $__ManagedBuild == true ]; then + echo "Commencing managed build for $__BuildType in $__RootBinDir/bin" + "$__ProjectRoot/eng/common/build.sh" --build --configuration "$__BuildType" --verbosity "$__Verbosity" $__ManagedBuildArgs $__UnprocessedBuildArgs + if [ $? != 0 ]; then + exit 1 + fi fi + +# +# Initialize the target distro name +# + +initTargetDistroRid + +echo "RID: $__DistroRid" + +# +# Setup LLDB paths for native build +# + +if [ "$__HostOS" == "OSX" ]; then + export LLDB_H=$__ProjectRoot/src/SOS/lldbplugin/swift-4.0 + export LLDB_LIB=/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/LLDB + export LLDB_PATH=/Applications/Xcode.app/Contents/Developer/usr/bin/lldb + + export MACOSX_DEPLOYMENT_TARGET=10.12 + + # If Xcode 9.2 exists (like on the CI/build machines), use that. Xcode 9.3 or + # greater (swift 4.1 lldb) doesn't work that well (seg faults on exit). + if [ -f "/Applications/Xcode_9.2.app/Contents/Developer/usr/bin/lldb" ]; then + if [ -f "/Applications/Xcode_9.2.app/Contents/SharedFrameworks/LLDB.framework/LLDB" ]; then + export LLDB_PATH=/Applications/Xcode_9.2.app/Contents/Developer/usr/bin/lldb + export LLDB_LIB=/Applications/Xcode_9.2.app/Contents/SharedFrameworks/LLDB.framework/LLDB + fi + fi + + if [ ! -f $LLDB_LIB ]; then + echo "Cannot find the lldb library. Try installing Xcode." + exit 1 + fi + + # Workaround bad python version in /usr/local/bin/python2.7 on lab machines + export PATH=/usr/bin:$PATH + which python + python --version +fi + +# +# Build native components +# + +if [ ! -e $__DotNetCli ]; then + echo "dotnet cli not installed $__DotNetCli" + exit 1 +fi + +if [ $__NativeBuild == true ]; then + if [[ $__CI == true ]]; then + echo "Generating Version Source File" + __GenerateVersionRestoreLog="$__LogDir/GenerateVersionRestore.binlog" + $__DotNetCli msbuild $__ProjectRoot/eng/CreateVersionFile.csproj /v:$__Verbosity /bl:$__GenerateVersionRestoreLog /t:Restore /p:Configuration="$__BuildType" /p:Platform="$__BuildArch" $__UnprocessedBuildArgs + + __GenerateVersionLog="$__LogDir/GenerateVersion.binlog" + $__DotNetCli msbuild $__ProjectRoot/eng/CreateVersionFile.csproj /v:$__Verbosity /bl:$__GenerateVersionLog /t:GenerateVersionFiles /p:GenerateVersionSourceFile=true /p:NativeVersionSourceFile="$__IntermediatesDir/version.cpp" /p:Configuration="$__BuildType" /p:Platform="$__BuildArch" $__UnprocessedBuildArgs + if [ $? != 0 ]; then + echo "Generating Version Source File FAILED" + exit 1 + fi + else + echo "Generating Empty Version Source File" + echo "" > "$__IntermediatesDir/version.cpp" + fi + + build_native "$__BuildArch" "$__IntermediatesDir" "$__ExtraCmakeArgs" +fi + +# +# Copy the native SOS binaries to where these tools expect for testing +# + +if [[ $__NativeBuild == true || $__Test == true ]]; then + __dotnet_sos=$__RootBinDir/bin/dotnet-sos/$__BuildType/netcoreapp2.1/publish/$__DistroRid + __dotnet_dump=$__RootBinDir/bin/dotnet-dump/$__BuildType/netcoreapp2.1/publish/$__DistroRid + + mkdir -p "$__dotnet_sos" + mkdir -p "$__dotnet_dump" + + cp "$__BinDir"/* "$__dotnet_sos" + echo "Copied SOS to $__dotnet_sos" + + cp "$__BinDir"/* "$__dotnet_dump" + echo "Copied SOS to $__dotnet_dump" +fi + +# +# Run xunit tests +# + +if [ $__Test == true ]; then + if [ $__CrossBuild != true ]; then + if [ "$LLDB_PATH" == "" ]; then + export LLDB_PATH="$(which lldb-3.9.1 2> /dev/null)" + if [ "$LLDB_PATH" == "" ]; then + export LLDB_PATH="$(which lldb-3.9 2> /dev/null)" + if [ "$LLDB_PATH" == "" ]; then + export LLDB_PATH="$(which lldb-4.0 2> /dev/null)" + if [ "$LLDB_PATH" == "" ]; then + export LLDB_PATH="$(which lldb-5.0 2> /dev/null)" + if [ "$LLDB_PATH" == "" ]; then + export LLDB_PATH="$(which lldb 2> /dev/null)" + fi + fi + fi + fi + fi + + if [ "$GDB_PATH" == "" ]; then + export GDB_PATH="$(which gdb 2> /dev/null)" + fi + + echo "lldb: '$LLDB_PATH' gdb: '$GDB_PATH'" + + "$__ProjectRoot/eng/common/build.sh" --test --configuration "$__BuildType" --verbosity "$__Verbosity" /bl:$__LogDir/Test.binlog /p:BuildArch=$__BuildArch /p:DailyTest=$__DailyTest $__TestArgs + if [ $? != 0 ]; then + exit 1 + fi + fi +fi + +echo "BUILD: Repo sucessfully built." +echo "BUILD: Product binaries are available at $__CMakeBinDir" diff --git a/eng/cibuild.sh b/eng/cibuild.sh index 0ded39d345..a64b629d21 100755 --- a/eng/cibuild.sh +++ b/eng/cibuild.sh @@ -37,7 +37,7 @@ if [ "$__osname" == "Linux" ]; then fi fi -"$scriptroot/build.sh" --restore --build --build-native --test --publish --ci --stripsymbols $@ +"$scriptroot/build.sh" --restore --test --ci --stripsymbols $@ if [[ $? != 0 ]]; then exit 1 fi diff --git a/eng/citest.sh b/eng/citest.sh index 4057516d2e..13c49a361e 100755 --- a/eng/citest.sh +++ b/eng/citest.sh @@ -38,7 +38,7 @@ if [ "$__osname" == "Linux" ]; then fi # Restore and build just the managed components (test infrastructure) -"$scriptroot/build.sh" --restore --build --test --ci $@ +"$scriptroot/build.sh" --restore --skipnative --test --ci $@ if [[ $? != 0 ]]; then exit 1 fi diff --git a/eng/common/CheckSymbols.ps1 b/eng/common/CheckSymbols.ps1 index b8d84607b8..5442eff386 100644 --- a/eng/common/CheckSymbols.ps1 +++ b/eng/common/CheckSymbols.ps1 @@ -5,11 +5,12 @@ param( ) Add-Type -AssemblyName System.IO.Compression.FileSystem +. $PSScriptRoot\pipeline-logging-functions.ps1 function FirstMatchingSymbolDescriptionOrDefault { param( [string] $FullPath, # Full path to the module that has to be checked - [string] $TargetServerParam, # Parameter to pass to `Symbol Tool` indicating the server to lookup for symbols + [string] $TargetServerParameter, # Parameter to pass to `Symbol Tool` indicating the server to lookup for symbols [string] $SymbolsPath ) @@ -21,36 +22,36 @@ function FirstMatchingSymbolDescriptionOrDefault { # checking and which type of file was uploaded. # The file itself is returned - $SymbolPath = $SymbolsPath + "\" + $FileName + $SymbolPath = $SymbolsPath + '\' + $FileName # PDB file for the module - $PdbPath = $SymbolPath.Replace($Extension, ".pdb") + $PdbPath = $SymbolPath.Replace($Extension, '.pdb') # PDB file for R2R module (created by crossgen) - $NGenPdb = $SymbolPath.Replace($Extension, ".ni.pdb") + $NGenPdb = $SymbolPath.Replace($Extension, '.ni.pdb') # DBG file for a .so library - $SODbg = $SymbolPath.Replace($Extension, ".so.dbg") + $SODbg = $SymbolPath.Replace($Extension, '.so.dbg') # DWARF file for a .dylib - $DylibDwarf = $SymbolPath.Replace($Extension, ".dylib.dwarf") + $DylibDwarf = $SymbolPath.Replace($Extension, '.dylib.dwarf') - .\dotnet-symbol.exe --symbols --modules --windows-pdbs $TargetServerParam $FullPath -o $SymbolsPath | Out-Null + .\dotnet-symbol.exe --symbols --modules --windows-pdbs $TargetServerParameter $FullPath -o $SymbolsPath | Out-Null if (Test-Path $PdbPath) { - return "PDB" + return 'PDB' } elseif (Test-Path $NGenPdb) { - return "NGen PDB" + return 'NGen PDB' } elseif (Test-Path $SODbg) { - return "DBG for SO" + return 'DBG for SO' } elseif (Test-Path $DylibDwarf) { - return "Dwarf for Dylib" + return 'Dwarf for Dylib' } elseif (Test-Path $SymbolPath) { - return "Module" + return 'Module' } else { return $null @@ -68,7 +69,7 @@ function CountMissingSymbols { } # Extensions for which we'll look for symbols - $RelevantExtensions = @(".dll", ".exe", ".so", ".dylib") + $RelevantExtensions = @('.dll', '.exe', '.so', '.dylib') # How many files are missing symbol information $MissingSymbols = 0 @@ -76,7 +77,7 @@ function CountMissingSymbols { $PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath) $PackageGuid = New-Guid $ExtractPath = Join-Path -Path $ExtractPath -ChildPath $PackageGuid - $SymbolsPath = Join-Path -Path $ExtractPath -ChildPath "Symbols" + $SymbolsPath = Join-Path -Path $ExtractPath -ChildPath 'Symbols' [System.IO.Compression.ZipFile]::ExtractToDirectory($PackagePath, $ExtractPath) @@ -86,31 +87,31 @@ function CountMissingSymbols { Get-ChildItem -Recurse $ExtractPath | Where-Object {$RelevantExtensions -contains $_.Extension} | ForEach-Object { - if ($_.FullName -Match "\\ref\\") { + if ($_.FullName -Match '\\ref\\') { Write-Host "`t Ignoring reference assembly file" $_.FullName return } - $SymbolsOnMSDL = FirstMatchingSymbolDescriptionOrDefault $_.FullName "--microsoft-symbol-server" $SymbolsPath - $SymbolsOnSymWeb = FirstMatchingSymbolDescriptionOrDefault $_.FullName "--internal-server" $SymbolsPath + $SymbolsOnMSDL = FirstMatchingSymbolDescriptionOrDefault -FullPath $_.FullName -TargetServerParameter '--microsoft-symbol-server' -SymbolsPath $SymbolsPath + $SymbolsOnSymWeb = FirstMatchingSymbolDescriptionOrDefault -FullPath $_.FullName -TargetServerParameter '--internal-server' -SymbolsPath $SymbolsPath Write-Host -NoNewLine "`t Checking file" $_.FullName "... " if ($SymbolsOnMSDL -ne $null -and $SymbolsOnSymWeb -ne $null) { - Write-Host "Symbols found on MSDL (" $SymbolsOnMSDL ") and SymWeb (" $SymbolsOnSymWeb ")" + Write-Host "Symbols found on MSDL (${$SymbolsOnMSDL}) and SymWeb (${$SymbolsOnSymWeb})" } else { $MissingSymbols++ if ($SymbolsOnMSDL -eq $null -and $SymbolsOnSymWeb -eq $null) { - Write-Host "No symbols found on MSDL or SymWeb!" + Write-Host 'No symbols found on MSDL or SymWeb!' } else { if ($SymbolsOnMSDL -eq $null) { - Write-Host "No symbols found on MSDL!" + Write-Host 'No symbols found on MSDL!' } else { - Write-Host "No symbols found on SymWeb!" + Write-Host 'No symbols found on SymWeb!' } } } @@ -129,26 +130,26 @@ function CheckSymbolsAvailable { Get-ChildItem "$InputPath\*.nupkg" | ForEach-Object { $FileName = $_.Name - + # These packages from Arcade-Services include some native libraries that # our current symbol uploader can't handle. Below is a workaround until # we get issue: https://github.com/dotnet/arcade/issues/2457 sorted. - if ($FileName -Match "Microsoft\.DotNet\.Darc\.") { + if ($FileName -Match 'Microsoft\.DotNet\.Darc\.') { Write-Host "Ignoring Arcade-services file: $FileName" Write-Host return } - elseif ($FileName -Match "Microsoft\.DotNet\.Maestro\.Tasks\.") { + elseif ($FileName -Match 'Microsoft\.DotNet\.Maestro\.Tasks\.') { Write-Host "Ignoring Arcade-services file: $FileName" Write-Host return } - + Write-Host "Validating $FileName " $Status = CountMissingSymbols "$InputPath\$FileName" if ($Status -ne 0) { - Write-Error "Missing symbols for $Status modules in the package $FileName" + Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "Missing symbols for $Status modules in the package $FileName" } Write-Host diff --git a/eng/common/PSScriptAnalyzerSettings.psd1 b/eng/common/PSScriptAnalyzerSettings.psd1 new file mode 100644 index 0000000000..4c1ea7c98e --- /dev/null +++ b/eng/common/PSScriptAnalyzerSettings.psd1 @@ -0,0 +1,11 @@ +@{ + IncludeRules=@('PSAvoidUsingCmdletAliases', + 'PSAvoidUsingWMICmdlet', + 'PSAvoidUsingPositionalParameters', + 'PSAvoidUsingInvokeExpression', + 'PSUseDeclaredVarsMoreThanAssignments', + 'PSUseCmdletCorrectly', + 'PSStandardDSCFunctionsInResource', + 'PSUseIdenticalMandatoryParametersForDSC', + 'PSUseIdenticalParametersForDSC') +} \ No newline at end of file diff --git a/eng/common/PublishToSymbolServers.proj b/eng/common/PublishToSymbolServers.proj index 5d55e312b0..311e2bbe0f 100644 --- a/eng/common/PublishToSymbolServers.proj +++ b/eng/common/PublishToSymbolServers.proj @@ -37,6 +37,8 @@ 3650 true + true + true false @@ -56,7 +58,7 @@ DryRun="false" ConvertPortablePdbsToWindowsPdbs="false" PdbConversionTreatAsWarning="" - Condition="$(PublishToSymbolServer)"/> + Condition="$(PublishToSymbolServer) and $(PublishToMSDL)"/> + + + $(WorkItemDirectory) + $(WorkItemCommand) --bdn-artifacts $(BaselineArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(BaselineCoreRunArgument) --partition-count $(PartitionCount) --partition-index %(HelixWorkItem.Index)" + $(WorkItemCommand) --bdn-artifacts $(ArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(CoreRunArgument) --partition-count $(PartitionCount) --partition-index %(HelixWorkItem.Index)" + $(DotnetExe) run -f $(_Framework) -p $(ResultsComparer) --base $(BaselineArtifactsDirectory) --diff $(ArtifactsDirectory) --threshold 2$(Percent) --xml $(XMLResults);$(FinalCommand) + 4:00 + + + + + + $(WorkItemDirectory) + $(WorkItemCommand) --bdn-artifacts $(BaselineArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(BaselineCoreRunArgument)" + $(WorkItemCommand) --bdn-artifacts $(ArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(CoreRunArgument)" + $(DotnetExe) run -f $(_Framework) -p $(ResultsComparer) --base $(BaselineArtifactsDirectory) --diff $(ArtifactsDirectory) --threshold 2$(Percent) --xml $(XMLResults) + 4:00 + + + \ No newline at end of file diff --git a/eng/common/performance/performance-setup.ps1 b/eng/common/performance/performance-setup.ps1 new file mode 100644 index 0000000000..ec41965fc8 --- /dev/null +++ b/eng/common/performance/performance-setup.ps1 @@ -0,0 +1,106 @@ +Param( + [string] $SourceDirectory=$env:BUILD_SOURCESDIRECTORY, + [string] $CoreRootDirectory, + [string] $BaselineCoreRootDirectory, + [string] $Architecture="x64", + [string] $Framework="netcoreapp5.0", + [string] $CompilationMode="Tiered", + [string] $Repository=$env:BUILD_REPOSITORY_NAME, + [string] $Branch=$env:BUILD_SOURCEBRANCH, + [string] $CommitSha=$env:BUILD_SOURCEVERSION, + [string] $BuildNumber=$env:BUILD_BUILDNUMBER, + [string] $RunCategories="coreclr corefx", + [string] $Csproj="src\benchmarks\micro\MicroBenchmarks.csproj", + [string] $Kind="micro", + [switch] $Internal, + [switch] $Compare, + [string] $Configurations="CompilationMode=$CompilationMode" +) + +$RunFromPerformanceRepo = ($Repository -eq "dotnet/performance") -or ($Repository -eq "dotnet-performance") +$UseCoreRun = ($CoreRootDirectory -ne [string]::Empty) +$UseBaselineCoreRun = ($BaselineCoreRootDirectory -ne [string]::Empty) + +$PayloadDirectory = (Join-Path $SourceDirectory "Payload") +$PerformanceDirectory = (Join-Path $PayloadDirectory "performance") +$WorkItemDirectory = (Join-Path $SourceDirectory "workitem") +$ExtraBenchmarkDotNetArguments = "--iterationCount 1 --warmupCount 0 --invocationCount 1 --unrollFactor 1 --strategy ColdStart --stopOnFirstError true" +$Creator = $env:BUILD_DEFINITIONNAME +$PerfLabArguments = "" +$HelixSourcePrefix = "pr" + +$Queue = "Windows.10.Amd64.ClientRS4.DevEx.15.8.Open" + +if ($Framework.StartsWith("netcoreapp")) { + $Queue = "Windows.10.Amd64.ClientRS5.Open" +} + +if ($Compare) { + $Queue = "Windows.10.Amd64.19H1.Tiger.Perf.Open" + $PerfLabArguments = "" + $ExtraBenchmarkDotNetArguments = "" +} + +if ($Internal) { + $Queue = "Windows.10.Amd64.19H1.Tiger.Perf" + $PerfLabArguments = "--upload-to-perflab-container" + $ExtraBenchmarkDotNetArguments = "" + $Creator = "" + $HelixSourcePrefix = "official" +} + +$CommonSetupArguments="--frameworks $Framework --queue $Queue --build-number $BuildNumber --build-configs $Configurations" +$SetupArguments = "--repository https://github.com/$Repository --branch $Branch --get-perf-hash --commit-sha $CommitSha $CommonSetupArguments" + +if ($RunFromPerformanceRepo) { + $SetupArguments = "--perf-hash $CommitSha $CommonSetupArguments" + + robocopy $SourceDirectory $PerformanceDirectory /E /XD $PayloadDirectory $SourceDirectory\artifacts $SourceDirectory\.git +} +else { + git clone --branch master --depth 1 --quiet https://github.com/dotnet/performance $PerformanceDirectory +} + +if ($UseCoreRun) { + $NewCoreRoot = (Join-Path $PayloadDirectory "Core_Root") + Move-Item -Path $CoreRootDirectory -Destination $NewCoreRoot +} +if ($UseBaselineCoreRun) { + $NewBaselineCoreRoot = (Join-Path $PayloadDirectory "Baseline_Core_Root") + Move-Item -Path $BaselineCoreRootDirectory -Destination $NewBaselineCoreRoot +} + +$DocsDir = (Join-Path $PerformanceDirectory "docs") +robocopy $DocsDir $WorkItemDirectory + +# Set variables that we will need to have in future steps +$ci = $true + +. "$PSScriptRoot\..\pipeline-logging-functions.ps1" + +# Directories +Write-PipelineSetVariable -Name 'PayloadDirectory' -Value "$PayloadDirectory" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'PerformanceDirectory' -Value "$PerformanceDirectory" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'WorkItemDirectory' -Value "$WorkItemDirectory" -IsMultiJobVariable $false + +# Script Arguments +Write-PipelineSetVariable -Name 'Python' -Value "py -3" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'ExtraBenchmarkDotNetArguments' -Value "$ExtraBenchmarkDotNetArguments" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'SetupArguments' -Value "$SetupArguments" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'PerfLabArguments' -Value "$PerfLabArguments" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'BDNCategories' -Value "$RunCategories" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'TargetCsproj' -Value "$Csproj" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'Kind' -Value "$Kind" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'Architecture' -Value "$Architecture" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'UseCoreRun' -Value "$UseCoreRun" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'UseBaselineCoreRun' -Value "$UseBaselineCoreRun" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'RunFromPerfRepo' -Value "$RunFromPerformanceRepo" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'Compare' -Value "$Compare" -IsMultiJobVariable $false + +# Helix Arguments +Write-PipelineSetVariable -Name 'Creator' -Value "$Creator" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'Queue' -Value "$Queue" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'HelixSourcePrefix' -Value "$HelixSourcePrefix" -IsMultiJobVariable $false +Write-PipelineSetVariable -Name '_BuildConfig' -Value "$Architecture.$Kind.$Framework" -IsMultiJobVariable $false + +exit 0 \ No newline at end of file diff --git a/eng/common/performance/performance-setup.sh b/eng/common/performance/performance-setup.sh new file mode 100644 index 0000000000..2f2092166e --- /dev/null +++ b/eng/common/performance/performance-setup.sh @@ -0,0 +1,216 @@ +#!/usr/bin/env bash + +source_directory=$BUILD_SOURCESDIRECTORY +core_root_directory= +baseline_core_root_directory= +architecture=x64 +framework=netcoreapp5.0 +compilation_mode=tiered +repository=$BUILD_REPOSITORY_NAME +branch=$BUILD_SOURCEBRANCH +commit_sha=$BUILD_SOURCEVERSION +build_number=$BUILD_BUILDNUMBER +internal=false +compare=false +kind="micro" +run_categories="coreclr corefx" +csproj="src\benchmarks\micro\MicroBenchmarks.csproj" +configurations= +run_from_perf_repo=false +use_core_run=true +use_baseline_core_run=true + +while (($# > 0)); do + lowerI="$(echo $1 | awk '{print tolower($0)}')" + case $lowerI in + --sourcedirectory) + source_directory=$2 + shift 2 + ;; + --corerootdirectory) + core_root_directory=$2 + shift 2 + ;; + --baselinecorerootdirectory) + baseline_core_root_directory=$2 + shift 2 + ;; + --architecture) + architecture=$2 + shift 2 + ;; + --framework) + framework=$2 + shift 2 + ;; + --compilationmode) + compilation_mode=$2 + shift 2 + ;; + --repository) + repository=$2 + shift 2 + ;; + --branch) + branch=$2 + shift 2 + ;; + --commitsha) + commit_sha=$2 + shift 2 + ;; + --buildnumber) + build_number=$2 + shift 2 + ;; + --kind) + kind=$2 + shift 2 + ;; + --runcategories) + run_categories=$2 + shift 2 + ;; + --csproj) + csproj=$2 + shift 2 + ;; + --internal) + internal=true + shift 1 + ;; + --compare) + compare=true + shift 1 + ;; + --configurations) + configurations=$2 + shift 2 + ;; + --help) + echo "Common settings:" + echo " --corerootdirectory Directory where Core_Root exists, if running perf testing with --corerun" + echo " --architecture Architecture of the testing being run" + echo " --configurations List of key=value pairs that will be passed to perf testing infrastructure." + echo " ex: --configurations \"CompilationMode=Tiered OptimzationLevel=PGO\"" + echo " --help Print help and exit" + echo "" + echo "Advanced settings:" + echo " --framework The framework to run, if not running in master" + echo " --compliationmode The compilation mode if not passing --configurations" + echo " --sourcedirectory The directory of the sources. Defaults to env:BUILD_SOURCESDIRECTORY" + echo " --repository The name of the repository in the / format. Defaults to env:BUILD_REPOSITORY_NAME" + echo " --branch The name of the branch. Defaults to env:BUILD_SOURCEBRANCH" + echo " --commitsha The commit sha1 to run against. Defaults to env:BUILD_SOURCEVERSION" + echo " --buildnumber The build number currently running. Defaults to env:BUILD_BUILDNUMBER" + echo " --csproj The relative path to the benchmark csproj whose tests should be run. Defaults to src\benchmarks\micro\MicroBenchmarks.csproj" + echo " --kind Related to csproj. The kind of benchmarks that should be run. Defaults to micro" + echo " --runcategories Related to csproj. Categories of benchmarks to run. Defaults to \"coreclr corefx\"" + echo " --internal If the benchmarks are running as an official job." + echo "" + exit 0 + ;; + esac +done + +if [ "$repository" == "dotnet/performance" ] || [ "$repository" == "dotnet-performance" ]; then + run_from_perf_repo=true +fi + +if [ -z "$configurations" ]; then + configurations="CompliationMode=$compilation_mode" +fi + +if [ -z "$core_root_directory" ]; then + use_core_run=false +fi + +if [ -z "$baseline_core_root_directory" ]; then + use_baseline_core_run=false +fi + +payload_directory=$source_directory/Payload +performance_directory=$payload_directory/performance +workitem_directory=$source_directory/workitem +extra_benchmark_dotnet_arguments="--iterationCount 1 --warmupCount 0 --invocationCount 1 --unrollFactor 1 --strategy ColdStart --stopOnFirstError true" +perflab_arguments= +queue=Ubuntu.1804.Amd64.Open +creator=$BUILD_DEFINITIONNAME +helix_source_prefix="pr" + +if [[ "$compare" == true ]]; then + extra_benchmark_dotnet_arguments= + perflab_arguments= + + # No open queues for arm64 + if [[ "$architecture" = "arm64" ]]; then + echo "Compare not available for arm64" + exit 1 + fi + + queue=Ubuntu.1804.Amd64.Tiger.Perf.Open +fi + +if [[ "$internal" == true ]]; then + perflab_arguments="--upload-to-perflab-container" + helix_source_prefix="official" + creator= + extra_benchmark_dotnet_arguments= + + if [[ "$architecture" = "arm64" ]]; then + queue=Ubuntu.1804.Arm64.Perf + else + queue=Ubuntu.1804.Amd64.Tiger.Perf + fi +fi + +common_setup_arguments="--frameworks $framework --queue $queue --build-number $build_number --build-configs $configurations" +setup_arguments="--repository https://github.com/$repository --branch $branch --get-perf-hash --commit-sha $commit_sha $common_setup_arguments" + +if [[ "$run_from_perf_repo" = true ]]; then + payload_directory= + workitem_directory=$source_directory + performance_directory=$workitem_directory + setup_arguments="--perf-hash $commit_sha $common_setup_arguments" +else + git clone --branch master --depth 1 --quiet https://github.com/dotnet/performance $performance_directory + + docs_directory=$performance_directory/docs + mv $docs_directory $workitem_directory +fi + +if [[ "$use_core_run" = true ]]; then + new_core_root=$payload_directory/Core_Root + mv $core_root_directory $new_core_root +fi + +if [[ "$use_baseline_core_run" = true ]]; then + new_baseline_core_root=$payload_directory/Baseline_Core_Root + mv $baseline_core_root_directory $new_baseline_core_root +fi + +ci=true + +_script_dir=$(pwd)/eng/common +. "$_script_dir/pipeline-logging-functions.sh" + +# Make sure all of our variables are available for future steps +Write-PipelineSetVariable -name "UseCoreRun" -value "$use_core_run" -is_multi_job_variable false +Write-PipelineSetVariable -name "UseBaselineCoreRun" -value "$use_baseline_core_run" -is_multi_job_variable false +Write-PipelineSetVariable -name "Architecture" -value "$architecture" -is_multi_job_variable false +Write-PipelineSetVariable -name "PayloadDirectory" -value "$payload_directory" -is_multi_job_variable false +Write-PipelineSetVariable -name "PerformanceDirectory" -value "$performance_directory" -is_multi_job_variable false +Write-PipelineSetVariable -name "WorkItemDirectory" -value "$workitem_directory" -is_multi_job_variable false +Write-PipelineSetVariable -name "Queue" -value "$queue" -is_multi_job_variable false +Write-PipelineSetVariable -name "SetupArguments" -value "$setup_arguments" -is_multi_job_variable false +Write-PipelineSetVariable -name "Python" -value "$python3" -is_multi_job_variable false +Write-PipelineSetVariable -name "PerfLabArguments" -value "$perflab_arguments" -is_multi_job_variable false +Write-PipelineSetVariable -name "ExtraBenchmarkDotNetArguments" -value "$extra_benchmark_dotnet_arguments" -is_multi_job_variable false +Write-PipelineSetVariable -name "BDNCategories" -value "$run_categories" -is_multi_job_variable false +Write-PipelineSetVariable -name "TargetCsproj" -value "$csproj" -is_multi_job_variable false +Write-PipelineSetVariable -name "RunFromPerfRepo" -value "$run_from_perf_repo" -is_multi_job_variable false +Write-PipelineSetVariable -name "Creator" -value "$creator" -is_multi_job_variable false +Write-PipelineSetVariable -name "HelixSourcePrefix" -value "$helix_source_prefix" -is_multi_job_variable false +Write-PipelineSetVariable -name "Kind" -value "$kind" -is_multi_job_variable false +Write-PipelineSetVariable -name "_BuildConfig" -value "$architecture.$kind.$framework" -is_multi_job_variable false +Write-PipelineSetVariable -name "Compare" -value "$compare" -is_multi_job_variable false diff --git a/eng/common/LoggingCommandFunctions.ps1 b/eng/common/pipeline-logging-functions.ps1 similarity index 64% rename from eng/common/LoggingCommandFunctions.ps1 rename to eng/common/pipeline-logging-functions.ps1 index c225eaecbf..a3e1317ad4 100644 --- a/eng/common/LoggingCommandFunctions.ps1 +++ b/eng/common/pipeline-logging-functions.ps1 @@ -1,4 +1,4 @@ -# Source for this file was taken from https://github.com/microsoft/azure-pipelines-task-lib/blob/11c9439d4af17e6475d9fe058e6b2e03914d17e6/powershell/VstsTaskSdk/LoggingCommandFunctions.ps1 +# Source for this file was taken from https://github.com/microsoft/azure-pipelines-task-lib/blob/11c9439d4af17e6475d9fe058e6b2e03914d17e6/powershell/VstsTaskSdk/LoggingCommandFunctions.ps1 and modified. # NOTE: You should not be calling these method directly as they are likely to change. Instead you should be calling the Write-Pipeline* functions defined in tools.ps1 @@ -12,6 +12,100 @@ $script:loggingCommandEscapeMappings = @( # TODO: WHAT ABOUT "="? WHAT ABOUT "%" # TODO: BUG: Escape % ??? # TODO: Add test to verify don't need to escape "=". +# Specify "-Force" to force pipeline formatted output even if "$ci" is false or not set +function Write-PipelineTelemetryError { + [CmdletBinding()] + param( + [Parameter(Mandatory = $true)] + [string]$Category, + [Parameter(Mandatory = $true)] + [string]$Message, + [Parameter(Mandatory = $false)] + [string]$Type = 'error', + [string]$ErrCode, + [string]$SourcePath, + [string]$LineNumber, + [string]$ColumnNumber, + [switch]$AsOutput, + [switch]$Force) + + $PSBoundParameters.Remove('Category') | Out-Null + + $Message = "(NETCORE_ENGINEERING_TELEMETRY=$Category) $Message" + $PSBoundParameters.Remove('Message') | Out-Null + $PSBoundParameters.Add('Message', $Message) + Write-PipelineTaskError @PSBoundParameters +} + +# Specify "-Force" to force pipeline formatted output even if "$ci" is false or not set +function Write-PipelineTaskError { + [CmdletBinding()] + param( + [Parameter(Mandatory = $true)] + [string]$Message, + [Parameter(Mandatory = $false)] + [string]$Type = 'error', + [string]$ErrCode, + [string]$SourcePath, + [string]$LineNumber, + [string]$ColumnNumber, + [switch]$AsOutput, + [switch]$Force + ) + + if(!$Force -And (-Not (Test-Path variable:ci) -Or !$ci)) { + if($Type -eq 'error') { + Write-Host $Message -ForegroundColor Red + return + } + elseif ($Type -eq 'warning') { + Write-Host $Message -ForegroundColor Yellow + return + } + } + + if(($Type -ne 'error') -and ($Type -ne 'warning')) { + Write-Host $Message + return + } + $PSBoundParameters.Remove('Force') | Out-Null + if(-not $PSBoundParameters.ContainsKey('Type')) { + $PSBoundParameters.Add('Type', 'error') + } + Write-LogIssue @PSBoundParameters + } + + function Write-PipelineSetVariable { + [CmdletBinding()] + param( + [Parameter(Mandatory = $true)] + [string]$Name, + [string]$Value, + [switch]$Secret, + [switch]$AsOutput, + [bool]$IsMultiJobVariable=$true) + + if((Test-Path variable:ci) -And $ci) { + Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data $Value -Properties @{ + 'variable' = $Name + 'isSecret' = $Secret + 'isOutput' = $IsMultiJobVariable + } -AsOutput:$AsOutput + } + } + + function Write-PipelinePrependPath { + [CmdletBinding()] + param( + [Parameter(Mandatory=$true)] + [string]$Path, + [switch]$AsOutput) + + if((Test-Path variable:ci) -And $ci) { + Write-LoggingCommand -Area 'task' -Event 'prependpath' -Data $Path -AsOutput:$AsOutput + } + } + <######################################## # Private functions. ########################################> @@ -143,4 +237,4 @@ function Write-LogIssue { } Write-Host $command -ForegroundColor $foregroundColor -BackgroundColor $backgroundColor -} \ No newline at end of file +} diff --git a/eng/common/pipeline-logging-functions.sh b/eng/common/pipeline-logging-functions.sh new file mode 100644 index 0000000000..33c3f0d807 --- /dev/null +++ b/eng/common/pipeline-logging-functions.sh @@ -0,0 +1,179 @@ +#!/usr/bin/env bash + +function Write-PipelineTelemetryError { + local telemetry_category='' + local force=false + local function_args=() + local message='' + while [[ $# -gt 0 ]]; do + opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')" + case "$opt" in + -category|-c) + telemetry_category=$2 + shift + ;; + -force|-f) + force=true + ;; + -*) + function_args+=("$1 $2") + shift + ;; + *) + message=$* + ;; + esac + shift + done + + if [[ $force != true ]] && [[ "$ci" != true ]]; then + echo "$message" >&2 + return + fi + + message="(NETCORE_ENGINEERING_TELEMETRY=$telemetry_category) $message" + function_args+=("$message") + if [[ $force == true ]]; then + function_args+=("-force") + fi + + Write-PipelineTaskError $function_args +} + +function Write-PipelineTaskError { + if [[ $force != true ]] && [[ "$ci" != true ]]; then + echo "$@" >&2 + return + fi + + local message_type="error" + local sourcepath='' + local linenumber='' + local columnnumber='' + local error_code='' + + while [[ $# -gt 0 ]]; do + opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')" + case "$opt" in + -type|-t) + message_type=$2 + shift + ;; + -sourcepath|-s) + sourcepath=$2 + shift + ;; + -linenumber|-ln) + linenumber=$2 + shift + ;; + -columnnumber|-cn) + columnnumber=$2 + shift + ;; + -errcode|-e) + error_code=$2 + shift + ;; + *) + break + ;; + esac + + shift + done + + local message="##vso[task.logissue" + + message="$message type=$message_type" + + if [ -n "$sourcepath" ]; then + message="$message;sourcepath=$sourcepath" + fi + + if [ -n "$linenumber" ]; then + message="$message;linenumber=$linenumber" + fi + + if [ -n "$columnnumber" ]; then + message="$message;columnnumber=$columnnumber" + fi + + if [ -n "$error_code" ]; then + message="$message;code=$error_code" + fi + + message="$message]$*" + echo "$message" +} + +function Write-PipelineSetVariable { + if [[ "$ci" != true ]]; then + return + fi + + local name='' + local value='' + local secret=false + local as_output=false + local is_multi_job_variable=true + + while [[ $# -gt 0 ]]; do + opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')" + case "$opt" in + -name|-n) + name=$2 + shift + ;; + -value|-v) + value=$2 + shift + ;; + -secret|-s) + secret=true + ;; + -as_output|-a) + as_output=true + ;; + -is_multi_job_variable|-i) + is_multi_job_variable=$2 + shift + ;; + esac + shift + done + + value=${value/;/%3B} + value=${value/\\r/%0D} + value=${value/\\n/%0A} + value=${value/]/%5D} + + local message="##vso[task.setvariable variable=$name;isSecret=$secret;isOutput=$is_multi_job_variable]$value" + + if [[ "$as_output" == true ]]; then + $message + else + echo "$message" + fi +} + +function Write-PipelinePrependPath { + local prepend_path='' + + while [[ $# -gt 0 ]]; do + opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')" + case "$opt" in + -path|-p) + prepend_path=$2 + shift + ;; + esac + shift + done + + export PATH="$prepend_path:$PATH" + + if [[ "$ci" == true ]]; then + echo "##vso[task.prependpath]$prepend_path" + fi +} \ No newline at end of file diff --git a/eng/common/post-build/darc-gather-drop.ps1 b/eng/common/post-build/darc-gather-drop.ps1 new file mode 100644 index 0000000000..81ff2a4377 --- /dev/null +++ b/eng/common/post-build/darc-gather-drop.ps1 @@ -0,0 +1,44 @@ +param( + [Parameter(Mandatory=$true)][int] $BarBuildId, # ID of the build which assets should be downloaded + [Parameter(Mandatory=$true)][string] $DropLocation, # Where the assets should be downloaded to + [Parameter(Mandatory=$true)][string] $MaestroApiAccessToken, # Token used to access Maestro API + [Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro-prod.westus2.cloudapp.azure.com', # Maestro API URL + [Parameter(Mandatory=$false)][string] $MaestroApiVersion = '2019-01-16' # Version of Maestro API to use +) + +try { + . $PSScriptRoot\post-build-utils.ps1 + + Write-Host 'Installing DARC ...' + + . $PSScriptRoot\..\darc-init.ps1 + $exitCode = $LASTEXITCODE + + if ($exitCode -ne 0) { + Write-PipelineTelemetryError -Category "Darc" -Message "Something failed while running 'darc-init.ps1'. Check for errors above. Exiting now..." + ExitWithExitCode $exitCode + } + + # For now, only use a dry run. + # Ideally we would change darc to enable a quick request that + # would check whether the file exists that you can download it, + # and that it won't conflict with other files. + # https://github.com/dotnet/arcade/issues/3674 + # Right now we can't remove continue-on-error because we ocassionally will have + # dependencies that have no associated builds (e.g. an old dependency). + # We need to add an option to baseline specific dependencies away, or add them manually + # to the BAR. + darc gather-drop --non-shipping ` + --dry-run ` + --continue-on-error ` + --id $BarBuildId ` + --output-dir $DropLocation ` + --bar-uri $MaestroApiEndpoint ` + --password $MaestroApiAccessToken ` + --latest-location +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category "Darc" -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/post-build/nuget-validation.ps1 b/eng/common/post-build/nuget-validation.ps1 new file mode 100644 index 0000000000..3d6129d72b --- /dev/null +++ b/eng/common/post-build/nuget-validation.ps1 @@ -0,0 +1,24 @@ +# This script validates NuGet package metadata information using this +# tool: https://github.com/NuGet/NuGetGallery/tree/jver-verify/src/VerifyMicrosoftPackage + +param( + [Parameter(Mandatory=$true)][string] $PackagesPath, # Path to where the packages to be validated are + [Parameter(Mandatory=$true)][string] $ToolDestinationPath # Where the validation tool should be downloaded to +) + +try { + . $PSScriptRoot\post-build-utils.ps1 + + $url = 'https://raw.githubusercontent.com/NuGet/NuGetGallery/jver-verify/src/VerifyMicrosoftPackage/verify.ps1' + + New-Item -ItemType 'directory' -Path ${ToolDestinationPath} -Force + + Invoke-WebRequest $url -OutFile ${ToolDestinationPath}\verify.ps1 + + & ${ToolDestinationPath}\verify.ps1 ${PackagesPath}\*.nupkg +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'NuGetValidation' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/post-build/post-build-utils.ps1 b/eng/common/post-build/post-build-utils.ps1 new file mode 100644 index 0000000000..7d49744795 --- /dev/null +++ b/eng/common/post-build/post-build-utils.ps1 @@ -0,0 +1,91 @@ +# Most of the functions in this file require the variables `MaestroApiEndPoint`, +# `MaestroApiVersion` and `MaestroApiAccessToken` to be globally available. + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version 2.0 + +# `tools.ps1` checks $ci to perform some actions. Since the post-build +# scripts don't necessarily execute in the same agent that run the +# build.ps1/sh script this variable isn't automatically set. +$ci = $true +$disableConfigureToolsetImport = $true +. $PSScriptRoot\..\tools.ps1 + +function Create-MaestroApiRequestHeaders([string]$ContentType = 'application/json') { + Validate-MaestroVars + + $headers = New-Object 'System.Collections.Generic.Dictionary[[String],[String]]' + $headers.Add('Accept', $ContentType) + $headers.Add('Authorization',"Bearer $MaestroApiAccessToken") + return $headers +} + +function Get-MaestroChannel([int]$ChannelId) { + Validate-MaestroVars + + $apiHeaders = Create-MaestroApiRequestHeaders + $apiEndpoint = "$MaestroApiEndPoint/api/channels/${ChannelId}?api-version=$MaestroApiVersion" + + $result = try { Invoke-WebRequest -Method Get -Uri $apiEndpoint -Headers $apiHeaders | ConvertFrom-Json } catch { Write-Host "Error: $_" } + return $result +} + +function Get-MaestroBuild([int]$BuildId) { + Validate-MaestroVars + + $apiHeaders = Create-MaestroApiRequestHeaders -AuthToken $MaestroApiAccessToken + $apiEndpoint = "$MaestroApiEndPoint/api/builds/${BuildId}?api-version=$MaestroApiVersion" + + $result = try { return Invoke-WebRequest -Method Get -Uri $apiEndpoint -Headers $apiHeaders | ConvertFrom-Json } catch { Write-Host "Error: $_" } + return $result +} + +function Get-MaestroSubscriptions([string]$SourceRepository, [int]$ChannelId) { + Validate-MaestroVars + + $SourceRepository = [System.Web.HttpUtility]::UrlEncode($SourceRepository) + $apiHeaders = Create-MaestroApiRequestHeaders -AuthToken $MaestroApiAccessToken + $apiEndpoint = "$MaestroApiEndPoint/api/subscriptions?sourceRepository=$SourceRepository&channelId=$ChannelId&api-version=$MaestroApiVersion" + + $result = try { Invoke-WebRequest -Method Get -Uri $apiEndpoint -Headers $apiHeaders | ConvertFrom-Json } catch { Write-Host "Error: $_" } + return $result +} + +function Assign-BuildToChannel([int]$BuildId, [int]$ChannelId) { + Validate-MaestroVars + + $apiHeaders = Create-MaestroApiRequestHeaders -AuthToken $MaestroApiAccessToken + $apiEndpoint = "$MaestroApiEndPoint/api/channels/${ChannelId}/builds/${BuildId}?api-version=$MaestroApiVersion" + Invoke-WebRequest -Method Post -Uri $apiEndpoint -Headers $apiHeaders | Out-Null +} + +function Trigger-Subscription([string]$SubscriptionId) { + Validate-MaestroVars + + $apiHeaders = Create-MaestroApiRequestHeaders -AuthToken $MaestroApiAccessToken + $apiEndpoint = "$MaestroApiEndPoint/api/subscriptions/$SubscriptionId/trigger?api-version=$MaestroApiVersion" + Invoke-WebRequest -Uri $apiEndpoint -Headers $apiHeaders -Method Post | Out-Null +} + +function Validate-MaestroVars { + try { + Get-Variable MaestroApiEndPoint -Scope Global | Out-Null + Get-Variable MaestroApiVersion -Scope Global | Out-Null + Get-Variable MaestroApiAccessToken -Scope Global | Out-Null + + if (!($MaestroApiEndPoint -Match '^http[s]?://maestro-(int|prod).westus2.cloudapp.azure.com$')) { + Write-PipelineTelemetryError -Category 'MaestroVars' -Message "MaestroApiEndPoint is not a valid Maestro URL. '$MaestroApiEndPoint'" + ExitWithExitCode 1 + } + + if (!($MaestroApiVersion -Match '^[0-9]{4}-[0-9]{2}-[0-9]{2}$')) { + Write-PipelineTelemetryError -Category 'MaestroVars' -Message "MaestroApiVersion does not match a version string in the format yyyy-MM-DD. '$MaestroApiVersion'" + ExitWithExitCode 1 + } + } + catch { + Write-PipelineTelemetryError -Category 'MaestroVars' -Message 'Error: Variables `MaestroApiEndPoint`, `MaestroApiVersion` and `MaestroApiAccessToken` are required while using this script.' + Write-Host $_ + ExitWithExitCode 1 + } +} diff --git a/eng/common/post-build/promote-build.ps1 b/eng/common/post-build/promote-build.ps1 new file mode 100644 index 0000000000..ce45635fbd --- /dev/null +++ b/eng/common/post-build/promote-build.ps1 @@ -0,0 +1,48 @@ +param( + [Parameter(Mandatory=$true)][int] $BuildId, + [Parameter(Mandatory=$true)][int] $ChannelId, + [Parameter(Mandatory=$true)][string] $MaestroApiAccessToken, + [Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro-prod.westus2.cloudapp.azure.com', + [Parameter(Mandatory=$false)][string] $MaestroApiVersion = '2019-01-16' +) + +try { + . $PSScriptRoot\post-build-utils.ps1 + + # Check that the channel we are going to promote the build to exist + $channelInfo = Get-MaestroChannel -ChannelId $ChannelId + + if (!$channelInfo) { + Write-PipelineTelemetryCategory -Category 'PromoteBuild' -Message "Channel with BAR ID $ChannelId was not found in BAR!" + ExitWithExitCode 1 + } + + # Get info about which channels the build has already been promoted to + $buildInfo = Get-MaestroBuild -BuildId $BuildId + + if (!$buildInfo) { + Write-PipelineTelemetryError -Category 'PromoteBuild' -Message "Build with BAR ID $BuildId was not found in BAR!" + ExitWithExitCode 1 + } + + # Find whether the build is already assigned to the channel or not + if ($buildInfo.channels) { + foreach ($channel in $buildInfo.channels) { + if ($channel.Id -eq $ChannelId) { + Write-Host "The build with BAR ID $BuildId is already on channel $ChannelId!" + ExitWithExitCode 0 + } + } + } + + Write-Host "Promoting build '$BuildId' to channel '$ChannelId'." + + Assign-BuildToChannel -BuildId $BuildId -ChannelId $ChannelId + + Write-Host 'done.' +} +catch { + Write-Host $_ + Write-PipelineTelemetryError -Category 'PromoteBuild' -Message "There was an error while trying to promote build '$BuildId' to channel '$ChannelId'" + ExitWithExitCode 1 +} diff --git a/eng/common/post-build/sourcelink-validation.ps1 b/eng/common/post-build/sourcelink-validation.ps1 new file mode 100644 index 0000000000..cc9d059d04 --- /dev/null +++ b/eng/common/post-build/sourcelink-validation.ps1 @@ -0,0 +1,257 @@ +param( + [Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where Symbols.NuGet packages to be checked are stored + [Parameter(Mandatory=$true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation + [Parameter(Mandatory=$false)][string] $GHRepoName, # GitHub name of the repo including the Org. E.g., dotnet/arcade + [Parameter(Mandatory=$false)][string] $GHCommit, # GitHub commit SHA used to build the packages + [Parameter(Mandatory=$true)][string] $SourcelinkCliVersion # Version of SourceLink CLI to use +) + +. $PSScriptRoot\post-build-utils.ps1 + +# Cache/HashMap (File -> Exist flag) used to consult whether a file exist +# in the repository at a specific commit point. This is populated by inserting +# all files present in the repo at a specific commit point. +$global:RepoFiles = @{} + +# Maximum number of jobs to run in parallel +$MaxParallelJobs = 6 + +# Wait time between check for system load +$SecondsBetweenLoadChecks = 10 + +$ValidatePackage = { + param( + [string] $PackagePath # Full path to a Symbols.NuGet package + ) + + . $using:PSScriptRoot\..\tools.ps1 + + # Ensure input file exist + if (!(Test-Path $PackagePath)) { + Write-Host "Input file does not exist: $PackagePath" + return 1 + } + + # Extensions for which we'll look for SourceLink information + # For now we'll only care about Portable & Embedded PDBs + $RelevantExtensions = @('.dll', '.exe', '.pdb') + + Write-Host -NoNewLine 'Validating ' ([System.IO.Path]::GetFileName($PackagePath)) '...' + + $PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath) + $ExtractPath = Join-Path -Path $using:ExtractPath -ChildPath $PackageId + $FailedFiles = 0 + + Add-Type -AssemblyName System.IO.Compression.FileSystem + + [System.IO.Directory]::CreateDirectory($ExtractPath) | Out-Null + + try { + $zip = [System.IO.Compression.ZipFile]::OpenRead($PackagePath) + + $zip.Entries | + Where-Object {$RelevantExtensions -contains [System.IO.Path]::GetExtension($_.Name)} | + ForEach-Object { + $FileName = $_.FullName + $Extension = [System.IO.Path]::GetExtension($_.Name) + $FakeName = -Join((New-Guid), $Extension) + $TargetFile = Join-Path -Path $ExtractPath -ChildPath $FakeName + + # We ignore resource DLLs + if ($FileName.EndsWith('.resources.dll')) { + return + } + + [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_, $TargetFile, $true) + + $ValidateFile = { + param( + [string] $FullPath, # Full path to the module that has to be checked + [string] $RealPath, + [ref] $FailedFiles + ) + + $sourcelinkExe = "$env:USERPROFILE\.dotnet\tools" + $sourcelinkExe = Resolve-Path "$sourcelinkExe\sourcelink.exe" + $SourceLinkInfos = & $sourcelinkExe print-urls $FullPath | Out-String + + if ($LASTEXITCODE -eq 0 -and -not ([string]::IsNullOrEmpty($SourceLinkInfos))) { + $NumFailedLinks = 0 + + # We only care about Http addresses + $Matches = (Select-String '(http[s]?)(:\/\/)([^\s,]+)' -Input $SourceLinkInfos -AllMatches).Matches + + if ($Matches.Count -ne 0) { + $Matches.Value | + ForEach-Object { + $Link = $_ + $CommitUrl = "https://raw.githubusercontent.com/${using:GHRepoName}/${using:GHCommit}/" + + $FilePath = $Link.Replace($CommitUrl, "") + $Status = 200 + $Cache = $using:RepoFiles + + if ( !($Cache.ContainsKey($FilePath)) ) { + try { + $Uri = $Link -as [System.URI] + + # Only GitHub links are valid + if ($Uri.AbsoluteURI -ne $null -and ($Uri.Host -match 'github' -or $Uri.Host -match 'githubusercontent')) { + $Status = (Invoke-WebRequest -Uri $Link -UseBasicParsing -Method HEAD -TimeoutSec 5).StatusCode + } + else { + $Status = 0 + } + } + catch { + write-host $_ + $Status = 0 + } + } + + if ($Status -ne 200) { + if ($NumFailedLinks -eq 0) { + if ($FailedFiles.Value -eq 0) { + Write-Host + } + + Write-Host "`tFile $RealPath has broken links:" + } + + Write-Host "`t`tFailed to retrieve $Link" + + $NumFailedLinks++ + } + } + } + + if ($NumFailedLinks -ne 0) { + $FailedFiles.value++ + $global:LASTEXITCODE = 1 + } + } + } + + &$ValidateFile $TargetFile $FileName ([ref]$FailedFiles) + } + } + catch { + + } + finally { + $zip.Dispose() + } + + if ($FailedFiles -eq 0) { + Write-Host 'Passed.' + return 0 + } + else { + Write-PipelineTelemetryError -Category 'SourceLink' -Message "$PackagePath has broken SourceLink links." + return 1 + } +} + +function ValidateSourceLinkLinks { + if ($GHRepoName -ne '' -and !($GHRepoName -Match '^[^\s\/]+/[^\s\/]+$')) { + if (!($GHRepoName -Match '^[^\s-]+-[^\s]+$')) { + Write-PipelineTelemetryError -Category 'SourceLink' -Message "GHRepoName should be in the format / or -. '$GHRepoName'" + ExitWithExitCode 1 + } + else { + $GHRepoName = $GHRepoName -replace '^([^\s-]+)-([^\s]+)$', '$1/$2'; + } + } + + if ($GHCommit -ne '' -and !($GHCommit -Match '^[0-9a-fA-F]{40}$')) { + Write-PipelineTelemetryError -Category 'SourceLink' -Message "GHCommit should be a 40 chars hexadecimal string. '$GHCommit'" + ExitWithExitCode 1 + } + + if ($GHRepoName -ne '' -and $GHCommit -ne '') { + $RepoTreeURL = -Join('http://api.github.com/repos/', $GHRepoName, '/git/trees/', $GHCommit, '?recursive=1') + $CodeExtensions = @('.cs', '.vb', '.fs', '.fsi', '.fsx', '.fsscript') + + try { + # Retrieve the list of files in the repo at that particular commit point and store them in the RepoFiles hash + $Data = Invoke-WebRequest $RepoTreeURL -UseBasicParsing | ConvertFrom-Json | Select-Object -ExpandProperty tree + + foreach ($file in $Data) { + $Extension = [System.IO.Path]::GetExtension($file.path) + + if ($CodeExtensions.Contains($Extension)) { + $RepoFiles[$file.path] = 1 + } + } + } + catch { + Write-Host "Problems downloading the list of files from the repo. Url used: $RepoTreeURL . Execution will proceed without caching." + } + } + elseif ($GHRepoName -ne '' -or $GHCommit -ne '') { + Write-Host 'For using the http caching mechanism both GHRepoName and GHCommit should be informed.' + } + + if (Test-Path $ExtractPath) { + Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue + } + + # Process each NuGet package in parallel + Get-ChildItem "$InputPath\*.symbols.nupkg" | + ForEach-Object { + Start-Job -ScriptBlock $ValidatePackage -ArgumentList $_.FullName | Out-Null + $NumJobs = @(Get-Job -State 'Running').Count + + while ($NumJobs -ge $MaxParallelJobs) { + Write-Host "There are $NumJobs validation jobs running right now. Waiting $SecondsBetweenLoadChecks seconds to check again." + sleep $SecondsBetweenLoadChecks + $NumJobs = @(Get-Job -State 'Running').Count + } + + foreach ($Job in @(Get-Job -State 'Completed')) { + Receive-Job -Id $Job.Id + Remove-Job -Id $Job.Id + } + } + + $ValidationFailures = 0 + foreach ($Job in @(Get-Job)) { + $jobResult = Wait-Job -Id $Job.Id | Receive-Job + if ($jobResult -ne '0') { + $ValidationFailures++ + } + } + if ($ValidationFailures -gt 0) { + Write-PipelineTelemetryError -Category 'SourceLink' -Message "$ValidationFailures package(s) failed validation." + ExitWithExitCode 1 + } +} + +function InstallSourcelinkCli { + $sourcelinkCliPackageName = 'sourcelink' + + $dotnetRoot = InitializeDotNetCli -install:$true + $dotnet = "$dotnetRoot\dotnet.exe" + $toolList = & "$dotnet" tool list --global + + if (($toolList -like "*$sourcelinkCliPackageName*") -and ($toolList -like "*$sourcelinkCliVersion*")) { + Write-Host "SourceLink CLI version $sourcelinkCliVersion is already installed." + } + else { + Write-Host "Installing SourceLink CLI version $sourcelinkCliVersion..." + Write-Host 'You may need to restart your command window if this is the first dotnet tool you have installed.' + & "$dotnet" tool install $sourcelinkCliPackageName --version $sourcelinkCliVersion --verbosity "minimal" --global + } +} + +try { + InstallSourcelinkCli + + ValidateSourceLinkLinks +} +catch { + Write-Host $_.Exception + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'SourceLink' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/post-build/symbols-validation.ps1 b/eng/common/post-build/symbols-validation.ps1 new file mode 100644 index 0000000000..f7cfe986dd --- /dev/null +++ b/eng/common/post-build/symbols-validation.ps1 @@ -0,0 +1,188 @@ +param( + [Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where NuGet packages to be checked are stored + [Parameter(Mandatory=$true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation + [Parameter(Mandatory=$true)][string] $DotnetSymbolVersion # Version of dotnet symbol to use +) + +function FirstMatchingSymbolDescriptionOrDefault { + param( + [string] $FullPath, # Full path to the module that has to be checked + [string] $TargetServerParam, # Parameter to pass to `Symbol Tool` indicating the server to lookup for symbols + [string] $SymbolsPath + ) + + $FileName = [System.IO.Path]::GetFileName($FullPath) + $Extension = [System.IO.Path]::GetExtension($FullPath) + + # Those below are potential symbol files that the `dotnet symbol` might + # return. Which one will be returned depend on the type of file we are + # checking and which type of file was uploaded. + + # The file itself is returned + $SymbolPath = $SymbolsPath + '\' + $FileName + + # PDB file for the module + $PdbPath = $SymbolPath.Replace($Extension, '.pdb') + + # PDB file for R2R module (created by crossgen) + $NGenPdb = $SymbolPath.Replace($Extension, '.ni.pdb') + + # DBG file for a .so library + $SODbg = $SymbolPath.Replace($Extension, '.so.dbg') + + # DWARF file for a .dylib + $DylibDwarf = $SymbolPath.Replace($Extension, '.dylib.dwarf') + + $dotnetSymbolExe = "$env:USERPROFILE\.dotnet\tools" + $dotnetSymbolExe = Resolve-Path "$dotnetSymbolExe\dotnet-symbol.exe" + + & $dotnetSymbolExe --symbols --modules --windows-pdbs $TargetServerParam $FullPath -o $SymbolsPath | Out-Null + + if (Test-Path $PdbPath) { + return 'PDB' + } + elseif (Test-Path $NGenPdb) { + return 'NGen PDB' + } + elseif (Test-Path $SODbg) { + return 'DBG for SO' + } + elseif (Test-Path $DylibDwarf) { + return 'Dwarf for Dylib' + } + elseif (Test-Path $SymbolPath) { + return 'Module' + } + else { + return $null + } +} + +function CountMissingSymbols { + param( + [string] $PackagePath # Path to a NuGet package + ) + + # Ensure input file exist + if (!(Test-Path $PackagePath)) { + Write-PipelineTaskError "Input file does not exist: $PackagePath" + ExitWithExitCode 1 + } + + # Extensions for which we'll look for symbols + $RelevantExtensions = @('.dll', '.exe', '.so', '.dylib') + + # How many files are missing symbol information + $MissingSymbols = 0 + + $PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath) + $PackageGuid = New-Guid + $ExtractPath = Join-Path -Path $ExtractPath -ChildPath $PackageGuid + $SymbolsPath = Join-Path -Path $ExtractPath -ChildPath 'Symbols' + + [System.IO.Compression.ZipFile]::ExtractToDirectory($PackagePath, $ExtractPath) + + Get-ChildItem -Recurse $ExtractPath | + Where-Object {$RelevantExtensions -contains $_.Extension} | + ForEach-Object { + if ($_.FullName -Match '\\ref\\') { + Write-Host "`t Ignoring reference assembly file " $_.FullName + return + } + + $SymbolsOnMSDL = FirstMatchingSymbolDescriptionOrDefault $_.FullName '--microsoft-symbol-server' $SymbolsPath + $SymbolsOnSymWeb = FirstMatchingSymbolDescriptionOrDefault $_.FullName '--internal-server' $SymbolsPath + + Write-Host -NoNewLine "`t Checking file " $_.FullName "... " + + if ($SymbolsOnMSDL -ne $null -and $SymbolsOnSymWeb -ne $null) { + Write-Host "Symbols found on MSDL ($SymbolsOnMSDL) and SymWeb ($SymbolsOnSymWeb)" + } + else { + $MissingSymbols++ + + if ($SymbolsOnMSDL -eq $null -and $SymbolsOnSymWeb -eq $null) { + Write-Host 'No symbols found on MSDL or SymWeb!' + } + else { + if ($SymbolsOnMSDL -eq $null) { + Write-Host 'No symbols found on MSDL!' + } + else { + Write-Host 'No symbols found on SymWeb!' + } + } + } + } + + Pop-Location + + return $MissingSymbols +} + +function CheckSymbolsAvailable { + if (Test-Path $ExtractPath) { + Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue + } + + Get-ChildItem "$InputPath\*.nupkg" | + ForEach-Object { + $FileName = $_.Name + + # These packages from Arcade-Services include some native libraries that + # our current symbol uploader can't handle. Below is a workaround until + # we get issue: https://github.com/dotnet/arcade/issues/2457 sorted. + if ($FileName -Match 'Microsoft\.DotNet\.Darc\.') { + Write-Host "Ignoring Arcade-services file: $FileName" + Write-Host + return + } + elseif ($FileName -Match 'Microsoft\.DotNet\.Maestro\.Tasks\.') { + Write-Host "Ignoring Arcade-services file: $FileName" + Write-Host + return + } + + Write-Host "Validating $FileName " + $Status = CountMissingSymbols "$InputPath\$FileName" + + if ($Status -ne 0) { + Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "Missing symbols for $Status modules in the package $FileName" + ExitWithExitCode $exitCode + } + + Write-Host + } +} + +function InstallDotnetSymbol { + $dotnetSymbolPackageName = 'dotnet-symbol' + + $dotnetRoot = InitializeDotNetCli -install:$true + $dotnet = "$dotnetRoot\dotnet.exe" + $toolList = & "$dotnet" tool list --global + + if (($toolList -like "*$dotnetSymbolPackageName*") -and ($toolList -like "*$dotnetSymbolVersion*")) { + Write-Host "dotnet-symbol version $dotnetSymbolVersion is already installed." + } + else { + Write-Host "Installing dotnet-symbol version $dotnetSymbolVersion..." + Write-Host 'You may need to restart your command window if this is the first dotnet tool you have installed.' + & "$dotnet" tool install $dotnetSymbolPackageName --version $dotnetSymbolVersion --verbosity "minimal" --global + } +} + +try { + . $PSScriptRoot\post-build-utils.ps1 + + Add-Type -AssemblyName System.IO.Compression.FileSystem + + InstallDotnetSymbol + + CheckSymbolsAvailable +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'CheckSymbols' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/post-build/trigger-subscriptions.ps1 b/eng/common/post-build/trigger-subscriptions.ps1 new file mode 100644 index 0000000000..55dea518ac --- /dev/null +++ b/eng/common/post-build/trigger-subscriptions.ps1 @@ -0,0 +1,64 @@ +param( + [Parameter(Mandatory=$true)][string] $SourceRepo, + [Parameter(Mandatory=$true)][int] $ChannelId, + [Parameter(Mandatory=$true)][string] $MaestroApiAccessToken, + [Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro-prod.westus2.cloudapp.azure.com', + [Parameter(Mandatory=$false)][string] $MaestroApiVersion = '2019-01-16' +) + +try { + . $PSScriptRoot\post-build-utils.ps1 + + # Get all the $SourceRepo subscriptions + $normalizedSourceRepo = $SourceRepo.Replace('dnceng@', '') + $subscriptions = Get-MaestroSubscriptions -SourceRepository $normalizedSourceRepo -ChannelId $ChannelId + + if (!$subscriptions) { + Write-PipelineTelemetryError -Category 'TriggerSubscriptions' -Message "No subscriptions found for source repo '$normalizedSourceRepo' in channel '$ChannelId'" + ExitWithExitCode 0 + } + + $subscriptionsToTrigger = New-Object System.Collections.Generic.List[string] + $failedTriggeredSubscription = $false + + # Get all enabled subscriptions that need dependency flow on 'everyBuild' + foreach ($subscription in $subscriptions) { + if ($subscription.enabled -and $subscription.policy.updateFrequency -like 'everyBuild' -and $subscription.channel.id -eq $ChannelId) { + Write-Host "Should trigger this subscription: ${$subscription.id}" + [void]$subscriptionsToTrigger.Add($subscription.id) + } + } + + foreach ($subscriptionToTrigger in $subscriptionsToTrigger) { + try { + Write-Host "Triggering subscription '$subscriptionToTrigger'." + + Trigger-Subscription -SubscriptionId $subscriptionToTrigger + + Write-Host 'done.' + } + catch + { + Write-Host "There was an error while triggering subscription '$subscriptionToTrigger'" + Write-Host $_ + Write-Host $_.ScriptStackTrace + $failedTriggeredSubscription = $true + } + } + + if ($subscriptionsToTrigger.Count -eq 0) { + Write-Host "No subscription matched source repo '$normalizedSourceRepo' and channel ID '$ChannelId'." + } + elseif ($failedTriggeredSubscription) { + Write-PipelineTelemetryError -Category 'TriggerSubscriptions' -Message 'At least one subscription failed to be triggered...' + ExitWithExitCode 1 + } + else { + Write-Host 'All subscriptions were triggered successfully!' + } +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'TriggerSubscriptions' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1 index d0eec5163e..3872af59b9 100644 --- a/eng/common/sdk-task.ps1 +++ b/eng/common/sdk-task.ps1 @@ -1,8 +1,8 @@ [CmdletBinding(PositionalBinding=$false)] Param( - [string] $configuration = "Debug", + [string] $configuration = 'Debug', [string] $task, - [string] $verbosity = "minimal", + [string] $verbosity = 'minimal', [string] $msbuildEngine = $null, [switch] $restore, [switch] $prepareMachine, @@ -32,7 +32,7 @@ function Print-Usage() { } function Build([string]$target) { - $logSuffix = if ($target -eq "Execute") { "" } else { ".$target" } + $logSuffix = if ($target -eq 'Execute') { '' } else { ".$target" } $log = Join-Path $LogDir "$task$logSuffix.binlog" $outputPath = Join-Path $ToolsetDir "$task\\" @@ -46,33 +46,32 @@ function Build([string]$target) { } try { - if ($help -or (($null -ne $properties) -and ($properties.Contains("/help") -or $properties.Contains("/?")))) { + if ($help -or (($null -ne $properties) -and ($properties.Contains('/help') -or $properties.Contains('/?')))) { Print-Usage exit 0 } if ($task -eq "") { - Write-Host "Missing required parameter '-task '" -ForegroundColor Red + Write-PipelineTelemetryError -Category 'Build' -Message "Missing required parameter '-task '" -ForegroundColor Red Print-Usage ExitWithExitCode 1 } $taskProject = GetSdkTaskProject $task if (!(Test-Path $taskProject)) { - Write-Host "Unknown task: $task" -ForegroundColor Red + Write-PipelineTelemetryError -Category 'Build' -Message "Unknown task: $task" -ForegroundColor Red ExitWithExitCode 1 } if ($restore) { - Build "Restore" + Build 'Restore' } - Build "Execute" + Build 'Execute' } catch { - Write-Host $_ - Write-Host $_.Exception Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'Build' -Message $_ ExitWithExitCode 1 } diff --git a/eng/common/sdl/execute-all-sdl-tools.ps1 b/eng/common/sdl/execute-all-sdl-tools.ps1 index 74080f22d1..9db582f279 100644 --- a/eng/common/sdl/execute-all-sdl-tools.ps1 +++ b/eng/common/sdl/execute-all-sdl-tools.ps1 @@ -1,97 +1,110 @@ Param( - [string] $GuardianPackageName, # Required: the name of guardian CLI pacakge (not needed if GuardianCliLocation is specified) - [string] $NugetPackageDirectory, # Required: directory where NuGet packages are installed (not needed if GuardianCliLocation is specified) - [string] $GuardianCliLocation, # Optional: Direct location of Guardian CLI executable if GuardianPackageName & NugetPackageDirectory are not specified - [string] $Repository, # Required: the name of the repository (e.g. dotnet/arcade) - [string] $BranchName="master", # Optional: name of branch or version of gdn settings; defaults to master - [string] $SourceDirectory, # Required: the directory where source files are located - [string] $ArtifactsDirectory, # Required: the directory where build artifacts are located - [string] $DncEngAccessToken, # Required: access token for dnceng; should be provided via KeyVault - [string[]] $SourceToolsList, # Optional: list of SDL tools to run on source code - [string[]] $ArtifactToolsList, # Optional: list of SDL tools to run on built artifacts - [bool] $TsaPublish=$False, # Optional: true will publish results to TSA; only set to true after onboarding to TSA; TSA is the automated framework used to upload test results as bugs. - [string] $TsaBranchName=$env:BUILD_SOURCEBRANCHNAME, # Optional: required for TSA publish; defaults to $(Build.SourceBranchName); TSA is the automated framework used to upload test results as bugs. - [string] $TsaRepositoryName, # Optional: TSA repository name; will be generated automatically if not submitted; TSA is the automated framework used to upload test results as bugs. - [string] $BuildNumber=$env:BUILD_BUILDNUMBER, # Optional: required for TSA publish; defaults to $(Build.BuildNumber) - [bool] $UpdateBaseline=$False, # Optional: if true, will update the baseline in the repository; should only be run after fixing any issues which need to be fixed - [bool] $TsaOnboard=$False, # Optional: if true, will onboard the repository to TSA; should only be run once; TSA is the automated framework used to upload test results as bugs. - [string] $TsaInstanceUrl, # Optional: only needed if TsaOnboard or TsaPublish is true; the instance-url registered with TSA; TSA is the automated framework used to upload test results as bugs. - [string] $TsaCodebaseName, # Optional: only needed if TsaOnboard or TsaPublish is true; the name of the codebase registered with TSA; TSA is the automated framework used to upload test results as bugs. - [string] $TsaProjectName, # Optional: only needed if TsaOnboard or TsaPublish is true; the name of the project registered with TSA; TSA is the automated framework used to upload test results as bugs. - [string] $TsaNotificationEmail, # Optional: only needed if TsaOnboard is true; the email(s) which will receive notifications of TSA bug filings (e.g. alias@microsoft.com); TSA is the automated framework used to upload test results as bugs. - [string] $TsaCodebaseAdmin, # Optional: only needed if TsaOnboard is true; the aliases which are admins of the TSA codebase (e.g. DOMAIN\alias); TSA is the automated framework used to upload test results as bugs. - [string] $TsaBugAreaPath, # Optional: only needed if TsaOnboard is true; the area path where TSA will file bugs in AzDO; TSA is the automated framework used to upload test results as bugs. - [string] $TsaIterationPath, # Optional: only needed if TsaOnboard is true; the iteration path where TSA will file bugs in AzDO; TSA is the automated framework used to upload test results as bugs. - [string] $GuardianLoggerLevel="Standard" # Optional: the logger level for the Guardian CLI; options are Trace, Verbose, Standard, Warning, and Error + [string] $GuardianPackageName, # Required: the name of guardian CLI package (not needed if GuardianCliLocation is specified) + [string] $NugetPackageDirectory, # Required: directory where NuGet packages are installed (not needed if GuardianCliLocation is specified) + [string] $GuardianCliLocation, # Optional: Direct location of Guardian CLI executable if GuardianPackageName & NugetPackageDirectory are not specified + [string] $Repository=$env:BUILD_REPOSITORY_NAME, # Required: the name of the repository (e.g. dotnet/arcade) + [string] $BranchName=$env:BUILD_SOURCEBRANCH, # Optional: name of branch or version of gdn settings; defaults to master + [string] $SourceDirectory=$env:BUILD_SOURCESDIRECTORY, # Required: the directory where source files are located + [string] $ArtifactsDirectory = (Join-Path $env:BUILD_ARTIFACTSTAGINGDIRECTORY ('artifacts')), # Required: the directory where build artifacts are located + [string] $AzureDevOpsAccessToken, # Required: access token for dnceng; should be provided via KeyVault + [string[]] $SourceToolsList, # Optional: list of SDL tools to run on source code + [string[]] $ArtifactToolsList, # Optional: list of SDL tools to run on built artifacts + [bool] $TsaPublish=$False, # Optional: true will publish results to TSA; only set to true after onboarding to TSA; TSA is the automated framework used to upload test results as bugs. + [string] $TsaBranchName=$env:BUILD_SOURCEBRANCH, # Optional: required for TSA publish; defaults to $(Build.SourceBranchName); TSA is the automated framework used to upload test results as bugs. + [string] $TsaRepositoryName=$env:BUILD_REPOSITORY_NAME, # Optional: TSA repository name; will be generated automatically if not submitted; TSA is the automated framework used to upload test results as bugs. + [string] $BuildNumber=$env:BUILD_BUILDNUMBER, # Optional: required for TSA publish; defaults to $(Build.BuildNumber) + [bool] $UpdateBaseline=$False, # Optional: if true, will update the baseline in the repository; should only be run after fixing any issues which need to be fixed + [bool] $TsaOnboard=$False, # Optional: if true, will onboard the repository to TSA; should only be run once; TSA is the automated framework used to upload test results as bugs. + [string] $TsaInstanceUrl, # Optional: only needed if TsaOnboard or TsaPublish is true; the instance-url registered with TSA; TSA is the automated framework used to upload test results as bugs. + [string] $TsaCodebaseName, # Optional: only needed if TsaOnboard or TsaPublish is true; the name of the codebase registered with TSA; TSA is the automated framework used to upload test results as bugs. + [string] $TsaProjectName, # Optional: only needed if TsaOnboard or TsaPublish is true; the name of the project registered with TSA; TSA is the automated framework used to upload test results as bugs. + [string] $TsaNotificationEmail, # Optional: only needed if TsaOnboard is true; the email(s) which will receive notifications of TSA bug filings (e.g. alias@microsoft.com); TSA is the automated framework used to upload test results as bugs. + [string] $TsaCodebaseAdmin, # Optional: only needed if TsaOnboard is true; the aliases which are admins of the TSA codebase (e.g. DOMAIN\alias); TSA is the automated framework used to upload test results as bugs. + [string] $TsaBugAreaPath, # Optional: only needed if TsaOnboard is true; the area path where TSA will file bugs in AzDO; TSA is the automated framework used to upload test results as bugs. + [string] $TsaIterationPath, # Optional: only needed if TsaOnboard is true; the iteration path where TSA will file bugs in AzDO; TSA is the automated framework used to upload test results as bugs. + [string] $GuardianLoggerLevel='Standard', # Optional: the logger level for the Guardian CLI; options are Trace, Verbose, Standard, Warning, and Error + [string[]] $CrScanAdditionalRunConfigParams, # Optional: Additional Params to custom build a CredScan run config in the format @("xyz:abc","sdf:1") + [string[]] $PoliCheckAdditionalRunConfigParams # Optional: Additional Params to custom build a Policheck run config in the format @("xyz:abc","sdf:1") ) -$ErrorActionPreference = "Stop" -Set-StrictMode -Version 2.0 -$LASTEXITCODE = 0 +try { + $ErrorActionPreference = 'Stop' + Set-StrictMode -Version 2.0 + $disableConfigureToolsetImport = $true + $LASTEXITCODE = 0 -#Replace repo names to the format of org/repo -if (!($Repository.contains('/'))) { - $RepoName = $Repository -replace '(.*?)-(.*)', '$1/$2'; -} -else{ - $RepoName = $Repository; -} + . $PSScriptRoot\..\tools.ps1 -if ($GuardianPackageName) { - $guardianCliLocation = Join-Path $NugetPackageDirectory (Join-Path $GuardianPackageName (Join-Path "tools" "guardian.cmd")) -} else { - $guardianCliLocation = $GuardianCliLocation -} + #Replace repo names to the format of org/repo + if (!($Repository.contains('/'))) { + $RepoName = $Repository -replace '(.*?)-(.*)', '$1/$2'; + } + else{ + $RepoName = $Repository; + } + + if ($GuardianPackageName) { + $guardianCliLocation = Join-Path $NugetPackageDirectory (Join-Path $GuardianPackageName (Join-Path 'tools' 'guardian.cmd')) + } else { + $guardianCliLocation = $GuardianCliLocation + } -$ValidPath = Test-Path $guardianCliLocation + $workingDirectory = (Split-Path $SourceDirectory -Parent) + $ValidPath = Test-Path $guardianCliLocation -if ($ValidPath -eq $False) -{ - Write-Host "Invalid Guardian CLI Location." - exit 1 -} + if ($ValidPath -eq $False) + { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message 'Invalid Guardian CLI Location.' + ExitWithExitCode 1 + } -& $(Join-Path $PSScriptRoot "init-sdl.ps1") -GuardianCliLocation $guardianCliLocation -Repository $RepoName -BranchName $BranchName -WorkingDirectory $ArtifactsDirectory -DncEngAccessToken $DncEngAccessToken -GuardianLoggerLevel $GuardianLoggerLevel -$gdnFolder = Join-Path $ArtifactsDirectory ".gdn" + & $(Join-Path $PSScriptRoot 'init-sdl.ps1') -GuardianCliLocation $guardianCliLocation -Repository $RepoName -BranchName $BranchName -WorkingDirectory $workingDirectory -AzureDevOpsAccessToken $AzureDevOpsAccessToken -GuardianLoggerLevel $GuardianLoggerLevel + $gdnFolder = Join-Path $workingDirectory '.gdn' -if ($TsaOnboard) { - if ($TsaCodebaseName -and $TsaNotificationEmail -and $TsaCodebaseAdmin -and $TsaBugAreaPath) { - Write-Host "$guardianCliLocation tsa-onboard --codebase-name `"$TsaCodebaseName`" --notification-alias `"$TsaNotificationEmail`" --codebase-admin `"$TsaCodebaseAdmin`" --instance-url `"$TsaInstanceUrl`" --project-name `"$TsaProjectName`" --area-path `"$TsaBugAreaPath`" --iteration-path `"$TsaIterationPath`" --working-directory $ArtifactsDirectory --logger-level $GuardianLoggerLevel" - & $guardianCliLocation tsa-onboard --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $ArtifactsDirectory --logger-level $GuardianLoggerLevel - if ($LASTEXITCODE -ne 0) { - Write-Host "Guardian tsa-onboard failed with exit code $LASTEXITCODE." - exit $LASTEXITCODE + if ($TsaOnboard) { + if ($TsaCodebaseName -and $TsaNotificationEmail -and $TsaCodebaseAdmin -and $TsaBugAreaPath) { + Write-Host "$guardianCliLocation tsa-onboard --codebase-name `"$TsaCodebaseName`" --notification-alias `"$TsaNotificationEmail`" --codebase-admin `"$TsaCodebaseAdmin`" --instance-url `"$TsaInstanceUrl`" --project-name `"$TsaProjectName`" --area-path `"$TsaBugAreaPath`" --iteration-path `"$TsaIterationPath`" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel" + & $guardianCliLocation tsa-onboard --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel + if ($LASTEXITCODE -ne 0) { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Guardian tsa-onboard failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE + } + } else { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message 'Could not onboard to TSA -- not all required values ($TsaCodebaseName, $TsaNotificationEmail, $TsaCodebaseAdmin, $TsaBugAreaPath) were specified.' + ExitWithExitCode 1 } - } else { - Write-Host "Could not onboard to TSA -- not all required values ($$TsaCodebaseName, $$TsaNotificationEmail, $$TsaCodebaseAdmin, $$TsaBugAreaPath) were specified." - exit 1 } -} -if ($ArtifactToolsList -and $ArtifactToolsList.Count -gt 0) { - & $(Join-Path $PSScriptRoot "run-sdl.ps1") -GuardianCliLocation $guardianCliLocation -WorkingDirectory $ArtifactsDirectory -TargetDirectory $ArtifactsDirectory -GdnFolder $gdnFolder -ToolsList $ArtifactToolsList -DncEngAccessToken $DncEngAccessToken -UpdateBaseline $UpdateBaseline -GuardianLoggerLevel $GuardianLoggerLevel -} -if ($SourceToolsList -and $SourceToolsList.Count -gt 0) { - & $(Join-Path $PSScriptRoot "run-sdl.ps1") -GuardianCliLocation $guardianCliLocation -WorkingDirectory $ArtifactsDirectory -TargetDirectory $SourceDirectory -GdnFolder $gdnFolder -ToolsList $SourceToolsList -DncEngAccessToken $DncEngAccessToken -UpdateBaseline $UpdateBaseline -GuardianLoggerLevel $GuardianLoggerLevel -} + if ($ArtifactToolsList -and $ArtifactToolsList.Count -gt 0) { + & $(Join-Path $PSScriptRoot 'run-sdl.ps1') -GuardianCliLocation $guardianCliLocation -WorkingDirectory $workingDirectory -TargetDirectory $ArtifactsDirectory -GdnFolder $gdnFolder -ToolsList $ArtifactToolsList -AzureDevOpsAccessToken $AzureDevOpsAccessToken -UpdateBaseline $UpdateBaseline -GuardianLoggerLevel $GuardianLoggerLevel -CrScanAdditionalRunConfigParams $CrScanAdditionalRunConfigParams -PoliCheckAdditionalRunConfigParams $PoliCheckAdditionalRunConfigParams + } + if ($SourceToolsList -and $SourceToolsList.Count -gt 0) { + & $(Join-Path $PSScriptRoot 'run-sdl.ps1') -GuardianCliLocation $guardianCliLocation -WorkingDirectory $workingDirectory -TargetDirectory $SourceDirectory -GdnFolder $gdnFolder -ToolsList $SourceToolsList -AzureDevOpsAccessToken $AzureDevOpsAccessToken -UpdateBaseline $UpdateBaseline -GuardianLoggerLevel $GuardianLoggerLevel -CrScanAdditionalRunConfigParams $CrScanAdditionalRunConfigParams -PoliCheckAdditionalRunConfigParams $PoliCheckAdditionalRunConfigParams + } -if ($UpdateBaseline) { - & (Join-Path $PSScriptRoot "push-gdn.ps1") -Repository $RepoName -BranchName $BranchName -GdnFolder $GdnFolder -DncEngAccessToken $DncEngAccessToken -PushReason "Update baseline" -} + if ($UpdateBaseline) { + & (Join-Path $PSScriptRoot 'push-gdn.ps1') -Repository $RepoName -BranchName $BranchName -GdnFolder $GdnFolder -AzureDevOpsAccessToken $AzureDevOpsAccessToken -PushReason 'Update baseline' + } -if ($TsaPublish) { - if ($TsaBranchName -and $BuildNumber) { - if (-not $TsaRepositoryName) { - $TsaRepositoryName = "$($Repository)-$($BranchName)" - } - Write-Host "$guardianCliLocation tsa-publish --all-tools --repository-name `"$TsaRepositoryName`" --branch-name `"$TsaBranchName`" --build-number `"$BuildNumber`" --codebase-name `"$TsaCodebaseName`" --notification-alias `"$TsaNotificationEmail`" --codebase-admin `"$TsaCodebaseAdmin`" --instance-url `"$TsaInstanceUrl`" --project-name `"$TsaProjectName`" --area-path `"$TsaBugAreaPath`" --iteration-path `"$TsaIterationPath`" --working-directory $SourceDirectory --logger-level $GuardianLoggerLevel" - & $guardianCliLocation tsa-publish --all-tools --repository-name "$TsaRepositoryName" --branch-name "$TsaBranchName" --build-number "$BuildNumber" --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $ArtifactsDirectory --logger-level $GuardianLoggerLevel - if ($LASTEXITCODE -ne 0) { - Write-Host "Guardian tsa-publish failed with exit code $LASTEXITCODE." - exit $LASTEXITCODE + if ($TsaPublish) { + if ($TsaBranchName -and $BuildNumber) { + if (-not $TsaRepositoryName) { + $TsaRepositoryName = "$($Repository)-$($BranchName)" + } + Write-Host "$guardianCliLocation tsa-publish --all-tools --repository-name `"$TsaRepositoryName`" --branch-name `"$TsaBranchName`" --build-number `"$BuildNumber`" --codebase-name `"$TsaCodebaseName`" --notification-alias `"$TsaNotificationEmail`" --codebase-admin `"$TsaCodebaseAdmin`" --instance-url `"$TsaInstanceUrl`" --project-name `"$TsaProjectName`" --area-path `"$TsaBugAreaPath`" --iteration-path `"$TsaIterationPath`" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel" + & $guardianCliLocation tsa-publish --all-tools --repository-name "$TsaRepositoryName" --branch-name "$TsaBranchName" --build-number "$BuildNumber" --onboard $True --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $workingDirectory --logger-level $GuardianLoggerLevel + if ($LASTEXITCODE -ne 0) { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Guardian tsa-publish failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE + } + } else { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message 'Could not publish to TSA -- not all required values ($TsaBranchName, $BuildNumber) were specified.' + ExitWithExitCode 1 } - } else { - Write-Host "Could not publish to TSA -- not all required values ($$TsaBranchName, $$BuildNumber) were specified." - exit 1 } } +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ + exit 1 +} diff --git a/eng/common/sdl/extract-artifact-packages.ps1 b/eng/common/sdl/extract-artifact-packages.ps1 new file mode 100644 index 0000000000..3c9bf10678 --- /dev/null +++ b/eng/common/sdl/extract-artifact-packages.ps1 @@ -0,0 +1,80 @@ +param( + [Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where artifact packages are stored + [Parameter(Mandatory=$true)][string] $ExtractPath # Full path to directory where the packages will be extracted +) + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version 2.0 + +# `tools.ps1` checks $ci to perform some actions. Since the post-build +# scripts don't necessarily execute in the same agent that run the +# build.ps1/sh script this variable isn't automatically set. +$ci = $true +$disableConfigureToolsetImport = $true + +function ExtractArtifacts { + if (!(Test-Path $InputPath)) { + Write-Host "Input Path does not exist: $InputPath" + ExitWithExitCode 0 + } + $Jobs = @() + Get-ChildItem "$InputPath\*.nupkg" | + ForEach-Object { + $Jobs += Start-Job -ScriptBlock $ExtractPackage -ArgumentList $_.FullName + } + + foreach ($Job in $Jobs) { + Wait-Job -Id $Job.Id | Receive-Job + } +} + +try { + . $PSScriptRoot\..\tools.ps1 + + $ExtractPackage = { + param( + [string] $PackagePath # Full path to a NuGet package + ) + + if (!(Test-Path $PackagePath)) { + Write-PipelineTelemetryError -Category 'Build' -Message "Input file does not exist: $PackagePath" + ExitWithExitCode 1 + } + + $RelevantExtensions = @('.dll', '.exe', '.pdb') + Write-Host -NoNewLine 'Extracting ' ([System.IO.Path]::GetFileName($PackagePath)) '...' + + $PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath) + $ExtractPath = Join-Path -Path $using:ExtractPath -ChildPath $PackageId + + Add-Type -AssemblyName System.IO.Compression.FileSystem + + [System.IO.Directory]::CreateDirectory($ExtractPath); + + try { + $zip = [System.IO.Compression.ZipFile]::OpenRead($PackagePath) + + $zip.Entries | + Where-Object {$RelevantExtensions -contains [System.IO.Path]::GetExtension($_.Name)} | + ForEach-Object { + $TargetFile = Join-Path -Path $ExtractPath -ChildPath $_.Name + + [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_, $TargetFile, $true) + } + } + catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ + ExitWithExitCode 1 + } + finally { + $zip.Dispose() + } + } + Measure-Command { ExtractArtifacts } +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/sdl/init-sdl.ps1 b/eng/common/sdl/init-sdl.ps1 index cbf5c36a8f..285f1ccdb0 100644 --- a/eng/common/sdl/init-sdl.ps1 +++ b/eng/common/sdl/init-sdl.ps1 @@ -1,28 +1,33 @@ Param( [string] $GuardianCliLocation, [string] $Repository, - [string] $BranchName="master", + [string] $BranchName='master', [string] $WorkingDirectory, - [string] $DncEngAccessToken, - [string] $GuardianLoggerLevel="Standard" + [string] $AzureDevOpsAccessToken, + [string] $GuardianLoggerLevel='Standard' ) -$ErrorActionPreference = "Stop" +$ErrorActionPreference = 'Stop' Set-StrictMode -Version 2.0 +$disableConfigureToolsetImport = $true $LASTEXITCODE = 0 +. $PSScriptRoot\..\tools.ps1 + +# Don't display the console progress UI - it's a huge perf hit +$ProgressPreference = 'SilentlyContinue' + # Construct basic auth from AzDO access token; construct URI to the repository's gdn folder stored in that repository; construct location of zip file -$encodedPat = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$DncEngAccessToken")) +$encodedPat = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$AzureDevOpsAccessToken")) $escapedRepository = [Uri]::EscapeDataString("/$Repository/$BranchName/.gdn") $uri = "https://dev.azure.com/dnceng/internal/_apis/git/repositories/sdl-tool-cfg/Items?path=$escapedRepository&versionDescriptor[versionOptions]=0&`$format=zip&api-version=5.0-preview.1" $zipFile = "$WorkingDirectory/gdn.zip" Add-Type -AssemblyName System.IO.Compression.FileSystem -$gdnFolder = (Join-Path $WorkingDirectory ".gdn") -Try -{ +$gdnFolder = (Join-Path $WorkingDirectory '.gdn') +try { # We try to download the zip; if the request fails (e.g. the file doesn't exist), we catch it and init guardian instead - Write-Host "Downloading gdn folder from internal config repostiory..." + Write-Host 'Downloading gdn folder from internal config repostiory...' Invoke-WebRequest -Headers @{ "Accept"="application/zip"; "Authorization"="Basic $encodedPat" } -Uri $uri -OutFile $zipFile if (Test-Path $gdnFolder) { # Remove the gdn folder if it exists (it shouldn't unless there's too much caching; this is just in case) @@ -30,19 +35,29 @@ Try } [System.IO.Compression.ZipFile]::ExtractToDirectory($zipFile, $WorkingDirectory) Write-Host $gdnFolder -} Catch [System.Net.WebException] { + ExitWithExitCode 0 +} catch [System.Net.WebException] { } # Catch and ignore webexception +try { # if the folder does not exist, we'll do a guardian init and push it to the remote repository - Write-Host "Initializing Guardian..." + Write-Host 'Initializing Guardian...' Write-Host "$GuardianCliLocation init --working-directory $WorkingDirectory --logger-level $GuardianLoggerLevel" & $GuardianCliLocation init --working-directory $WorkingDirectory --logger-level $GuardianLoggerLevel if ($LASTEXITCODE -ne 0) { - Write-Error "Guardian init failed with exit code $LASTEXITCODE." + Write-PipelineTelemetryError -Force -Category 'Build' -Message "Guardian init failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE } # We create the mainbaseline so it can be edited later Write-Host "$GuardianCliLocation baseline --working-directory $WorkingDirectory --name mainbaseline" & $GuardianCliLocation baseline --working-directory $WorkingDirectory --name mainbaseline if ($LASTEXITCODE -ne 0) { - Write-Error "Guardian baseline failed with exit code $LASTEXITCODE." + Write-PipelineTelemetryError -Force -Category 'Build' -Message "Guardian baseline failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE } - & $(Join-Path $PSScriptRoot "push-gdn.ps1") -Repository $Repository -BranchName $BranchName -GdnFolder $gdnFolder -DncEngAccessToken $DncEngAccessToken -PushReason "Initialize gdn folder" -} \ No newline at end of file + & $(Join-Path $PSScriptRoot 'push-gdn.ps1') -Repository $Repository -BranchName $BranchName -GdnFolder $gdnFolder -AzureDevOpsAccessToken $AzureDevOpsAccessToken -PushReason 'Initialize gdn folder' + ExitWithExitCode 0 +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'Sdl' -Message $_ + ExitWithExitCode 1 +} diff --git a/eng/common/sdl/packages.config b/eng/common/sdl/packages.config index b054737df1..256ffbfb93 100644 --- a/eng/common/sdl/packages.config +++ b/eng/common/sdl/packages.config @@ -1,4 +1,4 @@ - + - + diff --git a/eng/common/sdl/push-gdn.ps1 b/eng/common/sdl/push-gdn.ps1 index cacaf8e912..79d3d355c7 100644 --- a/eng/common/sdl/push-gdn.ps1 +++ b/eng/common/sdl/push-gdn.ps1 @@ -1,51 +1,65 @@ Param( [string] $Repository, - [string] $BranchName="master", + [string] $BranchName='master', [string] $GdnFolder, - [string] $DncEngAccessToken, + [string] $AzureDevOpsAccessToken, [string] $PushReason ) -$ErrorActionPreference = "Stop" +$ErrorActionPreference = 'Stop' Set-StrictMode -Version 2.0 +$disableConfigureToolsetImport = $true $LASTEXITCODE = 0 -# We create the temp directory where we'll store the sdl-config repository -$sdlDir = Join-Path $env:TEMP "sdl" -if (Test-Path $sdlDir) { - Remove-Item -Force -Recurse $sdlDir -} +try { + . $PSScriptRoot\..\tools.ps1 -Write-Host "git clone https://dnceng:`$DncEngAccessToken@dev.azure.com/dnceng/internal/_git/sdl-tool-cfg $sdlDir" -git clone https://dnceng:$DncEngAccessToken@dev.azure.com/dnceng/internal/_git/sdl-tool-cfg $sdlDir -if ($LASTEXITCODE -ne 0) { - Write-Error "Git clone failed with exit code $LASTEXITCODE." -} -# We copy the .gdn folder from our local run into the git repository so it can be committed -$sdlRepositoryFolder = Join-Path (Join-Path (Join-Path $sdlDir $Repository) $BranchName) ".gdn" -if (Get-Command Robocopy) { - Robocopy /S $GdnFolder $sdlRepositoryFolder -} else { - rsync -r $GdnFolder $sdlRepositoryFolder -} -# cd to the sdl-config directory so we can run git there -Push-Location $sdlDir -# git add . --> git commit --> git push -Write-Host "git add ." -git add . -if ($LASTEXITCODE -ne 0) { - Write-Error "Git add failed with exit code $LASTEXITCODE." -} -Write-Host "git -c user.email=`"dn-bot@microsoft.com`" -c user.name=`"Dotnet Bot`" commit -m `"$PushReason for $Repository/$BranchName`"" -git -c user.email="dn-bot@microsoft.com" -c user.name="Dotnet Bot" commit -m "$PushReason for $Repository/$BranchName" -if ($LASTEXITCODE -ne 0) { - Write-Error "Git commit failed with exit code $LASTEXITCODE." -} -Write-Host "git push" -git push -if ($LASTEXITCODE -ne 0) { - Write-Error "Git push failed with exit code $LASTEXITCODE." -} + # We create the temp directory where we'll store the sdl-config repository + $sdlDir = Join-Path $env:TEMP 'sdl' + if (Test-Path $sdlDir) { + Remove-Item -Force -Recurse $sdlDir + } -# Return to the original directory -Pop-Location \ No newline at end of file + Write-Host "git clone https://dnceng:`$AzureDevOpsAccessToken@dev.azure.com/dnceng/internal/_git/sdl-tool-cfg $sdlDir" + git clone https://dnceng:$AzureDevOpsAccessToken@dev.azure.com/dnceng/internal/_git/sdl-tool-cfg $sdlDir + if ($LASTEXITCODE -ne 0) { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Git clone failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE + } + # We copy the .gdn folder from our local run into the git repository so it can be committed + $sdlRepositoryFolder = Join-Path (Join-Path (Join-Path $sdlDir $Repository) $BranchName) '.gdn' + if (Get-Command Robocopy) { + Robocopy /S $GdnFolder $sdlRepositoryFolder + } else { + rsync -r $GdnFolder $sdlRepositoryFolder + } + # cd to the sdl-config directory so we can run git there + Push-Location $sdlDir + # git add . --> git commit --> git push + Write-Host 'git add .' + git add . + if ($LASTEXITCODE -ne 0) { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Git add failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE + } + Write-Host "git -c user.email=`"dn-bot@microsoft.com`" -c user.name=`"Dotnet Bot`" commit -m `"$PushReason for $Repository/$BranchName`"" + git -c user.email="dn-bot@microsoft.com" -c user.name="Dotnet Bot" commit -m "$PushReason for $Repository/$BranchName" + if ($LASTEXITCODE -ne 0) { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Git commit failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE + } + Write-Host 'git push' + git push + if ($LASTEXITCODE -ne 0) { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Git push failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE + } + + # Return to the original directory + Pop-Location +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'Sdl' -Message $_ + ExitWithExitCode 1 +} \ No newline at end of file diff --git a/eng/common/sdl/run-sdl.ps1 b/eng/common/sdl/run-sdl.ps1 index e6a86d03a2..40a084f796 100644 --- a/eng/common/sdl/run-sdl.ps1 +++ b/eng/common/sdl/run-sdl.ps1 @@ -5,61 +5,65 @@ Param( [string] $GdnFolder, [string[]] $ToolsList, [string] $UpdateBaseline, - [string] $GuardianLoggerLevel="Standard" + [string] $GuardianLoggerLevel='Standard', + [string[]] $CrScanAdditionalRunConfigParams, + [string[]] $PoliCheckAdditionalRunConfigParams ) -$ErrorActionPreference = "Stop" +$ErrorActionPreference = 'Stop' Set-StrictMode -Version 2.0 +$disableConfigureToolsetImport = $true $LASTEXITCODE = 0 -# We store config files in the r directory of .gdn -Write-Host $ToolsList -$gdnConfigPath = Join-Path $GdnFolder "r" -$ValidPath = Test-Path $GuardianCliLocation +try { + . $PSScriptRoot\..\tools.ps1 -if ($ValidPath -eq $False) -{ - Write-Host "Invalid Guardian CLI Location." - exit 1 -} + # We store config files in the r directory of .gdn + Write-Host $ToolsList + $gdnConfigPath = Join-Path $GdnFolder 'r' + $ValidPath = Test-Path $GuardianCliLocation -foreach ($tool in $ToolsList) { - $gdnConfigFile = Join-Path $gdnConfigPath "$tool-configure.gdnconfig" - $config = $False - Write-Host $tool - # We have to manually configure tools that run on source to look at the source directory only - if ($tool -eq "credscan") { - Write-Host "$GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args `" TargetDirectory : $TargetDirectory `"" - & $GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args " TargetDirectory : $TargetDirectory " - if ($LASTEXITCODE -ne 0) { - Write-Host "Guardian configure for $tool failed with exit code $LASTEXITCODE." - exit $LASTEXITCODE - } - $config = $True - } - if ($tool -eq "policheck") { - Write-Host "$GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args `" Target : $TargetDirectory `"" - & $GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args " Target : $TargetDirectory " - if ($LASTEXITCODE -ne 0) { - Write-Host "Guardian configure for $tool failed with exit code $LASTEXITCODE." - exit $LASTEXITCODE - } - $config = $True + if ($ValidPath -eq $False) + { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Invalid Guardian CLI Location." + ExitWithExitCode 1 } - Write-Host "$GuardianCliLocation run --working-directory $WorkingDirectory --tool $tool --baseline mainbaseline --update-baseline $UpdateBaseline --logger-level $GuardianLoggerLevel --config $gdnConfigFile $config" - if ($config) { - & $GuardianCliLocation run --working-directory $WorkingDirectory --tool $tool --baseline mainbaseline --update-baseline $UpdateBaseline --logger-level $GuardianLoggerLevel --config $gdnConfigFile - if ($LASTEXITCODE -ne 0) { - Write-Host "Guardian run for $tool using $gdnConfigFile failed with exit code $LASTEXITCODE." - exit $LASTEXITCODE + $configParam = @('--config') + + foreach ($tool in $ToolsList) { + $gdnConfigFile = Join-Path $gdnConfigPath "$tool-configure.gdnconfig" + Write-Host $tool + # We have to manually configure tools that run on source to look at the source directory only + if ($tool -eq 'credscan') { + Write-Host "$GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args `" TargetDirectory < $TargetDirectory `" `" OutputType < pre `" $(If ($CrScanAdditionalRunConfigParams) {$CrScanAdditionalRunConfigParams})" + & $GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args " TargetDirectory < $TargetDirectory " "OutputType < pre" $(If ($CrScanAdditionalRunConfigParams) {$CrScanAdditionalRunConfigParams}) + if ($LASTEXITCODE -ne 0) { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Guardian configure for $tool failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE + } } - } else { - & $GuardianCliLocation run --working-directory $WorkingDirectory --tool $tool --baseline mainbaseline --update-baseline $UpdateBaseline --logger-level $GuardianLoggerLevel - if ($LASTEXITCODE -ne 0) { - Write-Host "Guardian run for $tool failed with exit code $LASTEXITCODE." - exit $LASTEXITCODE + if ($tool -eq 'policheck') { + Write-Host "$GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args `" Target < $TargetDirectory `" $(If ($PoliCheckAdditionalRunConfigParams) {$PoliCheckAdditionalRunConfigParams})" + & $GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args " Target < $TargetDirectory " $(If ($PoliCheckAdditionalRunConfigParams) {$PoliCheckAdditionalRunConfigParams}) + if ($LASTEXITCODE -ne 0) { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Guardian configure for $tool failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE + } } + + $configParam+=$gdnConfigFile } -} + Write-Host "$GuardianCliLocation run --working-directory $WorkingDirectory --baseline mainbaseline --update-baseline $UpdateBaseline --logger-level $GuardianLoggerLevel $configParam" + & $GuardianCliLocation run --working-directory $WorkingDirectory --tool $tool --baseline mainbaseline --update-baseline $UpdateBaseline --logger-level $GuardianLoggerLevel $configParam + if ($LASTEXITCODE -ne 0) { + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message "Guardian run for $ToolsList using $configParam failed with exit code $LASTEXITCODE." + ExitWithExitCode $LASTEXITCODE + } +} +catch { + Write-Host $_.ScriptStackTrace + Write-PipelineTelemetryError -Category 'Sdl' -Message $_ + ExitWithExitCode 1 +} \ No newline at end of file diff --git a/eng/common/templates/job/execute-sdl.yml b/eng/common/templates/job/execute-sdl.yml new file mode 100644 index 0000000000..2973bcaf3a --- /dev/null +++ b/eng/common/templates/job/execute-sdl.yml @@ -0,0 +1,73 @@ +parameters: + overrideParameters: '' # Optional: to override values for parameters. + additionalParameters: '' # Optional: parameters that need user specific values eg: '-SourceToolsList @("abc","def") -ArtifactToolsList @("ghi","jkl")' + # There is some sort of bug (has been reported) in Azure DevOps where if this parameter is named + # 'continueOnError', the parameter value is not correctly picked up. + # This can also be remedied by the caller (post-build.yml) if it does not use a nested parameter + sdlContinueOnError: false # optional: determines whether to continue the build if the step errors; + dependsOn: '' # Optional: dependencies of the job + artifactNames: '' # Optional: patterns supplied to DownloadBuildArtifacts + # Usage: + # artifactNames: + # - 'BlobArtifacts' + # - 'Artifacts_Windows_NT_Release' + +jobs: +- job: Run_SDL + dependsOn: ${{ parameters.dependsOn }} + displayName: Run SDL tool + variables: + - group: DotNet-VSTS-Bot + pool: + name: Hosted VS2017 + steps: + - checkout: self + clean: true + - ${{ if ne(parameters.artifactNames, '') }}: + - ${{ each artifactName in parameters.artifactNames }}: + - task: DownloadBuildArtifacts@0 + displayName: Download Build Artifacts + inputs: + buildType: current + artifactName: ${{ artifactName }} + downloadPath: $(Build.ArtifactStagingDirectory)\artifacts + - ${{ if eq(parameters.artifactNames, '') }}: + - task: DownloadBuildArtifacts@0 + displayName: Download Build Artifacts + inputs: + buildType: current + downloadType: specific files + itemPattern: "**" + downloadPath: $(Build.ArtifactStagingDirectory)\artifacts + - powershell: eng/common/sdl/extract-artifact-packages.ps1 + -InputPath $(Build.ArtifactStagingDirectory)\artifacts\BlobArtifacts + -ExtractPath $(Build.ArtifactStagingDirectory)\artifacts\BlobArtifacts + displayName: Extract Blob Artifacts + continueOnError: ${{ parameters.sdlContinueOnError }} + - powershell: eng/common/sdl/extract-artifact-packages.ps1 + -InputPath $(Build.ArtifactStagingDirectory)\artifacts\PackageArtifacts + -ExtractPath $(Build.ArtifactStagingDirectory)\artifacts\PackageArtifacts + displayName: Extract Package Artifacts + continueOnError: ${{ parameters.sdlContinueOnError }} + - task: NuGetToolInstaller@1 + displayName: 'Install NuGet.exe' + - task: NuGetCommand@2 + displayName: 'Install Guardian' + inputs: + restoreSolution: $(Build.SourcesDirectory)\eng\common\sdl\packages.config + feedsToUse: config + nugetConfigPath: $(Build.SourcesDirectory)\eng\common\sdl\NuGet.config + externalFeedCredentials: GuardianConnect + restoreDirectory: $(Build.SourcesDirectory)\.packages + - ${{ if ne(parameters.overrideParameters, '') }}: + - powershell: eng/common/sdl/execute-all-sdl-tools.ps1 ${{ parameters.overrideParameters }} + displayName: Execute SDL + continueOnError: ${{ parameters.sdlContinueOnError }} + - ${{ if eq(parameters.overrideParameters, '') }}: + - powershell: eng/common/sdl/execute-all-sdl-tools.ps1 + -GuardianPackageName Microsoft.Guardian.Cli.0.7.2 + -NugetPackageDirectory $(Build.SourcesDirectory)\.packages + -AzureDevOpsAccessToken $(dn-bot-dotnet-build-rw-code-rw) + ${{ parameters.additionalParameters }} + displayName: Execute SDL + continueOnError: ${{ parameters.sdlContinueOnError }} diff --git a/eng/common/templates/job/job.yml b/eng/common/templates/job/job.yml index 1814e0ab61..ecebd0f03e 100644 --- a/eng/common/templates/job/job.yml +++ b/eng/common/templates/job/job.yml @@ -1,64 +1,33 @@ +# Internal resources (telemetry, microbuild) can only be accessed from non-public projects, +# and some (Microbuild) should only be applied to non-PR cases for internal builds. + parameters: # Job schema parameters - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job cancelTimeoutInMinutes: '' - condition: '' - - continueOnError: false - container: '' - + continueOnError: false dependsOn: '' - displayName: '' - - steps: [] - pool: '' - + steps: [] strategy: '' - timeoutInMinutes: '' - variables: [] - workspace: '' # Job base template specific parameters - # Optional: Enable installing Microbuild plugin - # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix - # _TeamName - the name of your team - # _SignType - 'test' or 'real' + # See schema documentation - https://github.com/dotnet/arcade/blob/master/Documentation/AzureDevOps/TemplateSchema.md + artifacts: '' enableMicrobuild: false - - # Optional: Include PublishBuildArtifacts task enablePublishBuildArtifacts: false - - # Optional: Enable publishing to the build asset registry enablePublishBuildAssets: false - - # Optional: Include PublishTestResults task enablePublishTestResults: false - - # Optional: enable sending telemetry - enableTelemetry: false - - # Optional: define the helix repo for telemetry (example: 'dotnet/arcade') - helixRepo: '' - - # Optional: define the helix type for telemetry (example: 'build/product/') - helixType: '' - - # Required: name of the job + enablePublishUsingPipelines: false name: '' - - # Optional: should run as a public build even in the internal project - # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects. + preSteps: [] runAsPublic: false -# Internal resources (telemetry, microbuild) can only be accessed from non-public projects, -# and some (Microbuild) should only be applied to non-PR cases for internal builds. - jobs: - job: ${{ parameters.name }} @@ -90,7 +59,7 @@ jobs: timeoutInMinutes: ${{ parameters.timeoutInMinutes }} variables: - - ${{ if eq(parameters.enableTelemetry, 'true') }}: + - ${{ if ne(parameters.enableTelemetry, 'false') }}: - name: DOTNET_CLI_TELEMETRY_PROFILE value: '$(Build.Repository.Uri)' - ${{ each variable in parameters.variables }}: @@ -122,21 +91,12 @@ jobs: workspace: ${{ parameters.workspace }} steps: - - ${{ if eq(parameters.enableTelemetry, 'true') }}: - # Telemetry tasks are built from https://github.com/dotnet/arcade-extensions - - task: sendStartTelemetry@0 - displayName: 'Send Helix Start Telemetry' - inputs: - helixRepo: ${{ parameters.helixRepo }} - ${{ if ne(parameters.helixType, '') }}: - helixType: ${{ parameters.helixType }} - buildConfig: $(_BuildConfig) - runAsPublic: ${{ parameters.runAsPublic }} - continueOnError: ${{ parameters.continueOnError }} - condition: always() + - ${{ if ne(parameters.preSteps, '') }}: + - ${{ each preStep in parameters.preSteps }}: + - ${{ preStep }} - - ${{ if eq(parameters.enableMicrobuild, 'true') }}: - - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - ${{ if eq(parameters.enableMicrobuild, 'true') }}: - task: MicroBuildSigningPlugin@2 displayName: Install MicroBuild plugin inputs: @@ -148,6 +108,16 @@ jobs: continueOnError: ${{ parameters.continueOnError }} condition: and(succeeded(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) + - task: NuGetAuthenticate@0 + + - ${{ if or(eq(parameters.artifacts.download, 'true'), ne(parameters.artifacts.download, '')) }}: + - task: DownloadPipelineArtifact@2 + inputs: + buildType: current + artifactName: ${{ coalesce(parameters.artifacts.download.name, 'Artifacts_$(Agent.OS)_$(_BuildConfig)') }} + targetPath: ${{ coalesce(parameters.artifacts.download.path, 'artifacts') }} + itemPattern: ${{ coalesce(parameters.artifacts.download.pattern, '**') }} + - ${{ each step in parameters.steps }}: - ${{ step }} @@ -160,20 +130,60 @@ jobs: env: TeamName: $(_TeamName) - - ${{ if eq(parameters.enableTelemetry, 'true') }}: - # Telemetry tasks are built from https://github.com/dotnet/arcade-extensions - - task: sendEndTelemetry@0 - displayName: 'Send Helix End Telemetry' - continueOnError: ${{ parameters.continueOnError }} - condition: always() - - - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}: + - ${{ if ne(parameters.artifacts.publish, '') }}: + - ${{ if or(eq(parameters.artifacts.publish.artifacts, 'true'), ne(parameters.artifacts.publish.artifacts, '')) }}: + - task: CopyFiles@2 + displayName: Gather binaries for publish to artifacts + inputs: + SourceFolder: 'artifacts/bin' + Contents: '**' + TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/bin' + - task: CopyFiles@2 + displayName: Gather packages for publish to artifacts + inputs: + SourceFolder: 'artifacts/packages' + Contents: '**' + TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/packages' + - task: PublishBuildArtifacts@1 + displayName: Publish pipeline artifacts + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts' + PublishLocation: Container + ArtifactName: ${{ coalesce(parameters.artifacts.publish.artifacts.name , 'Artifacts_$(Agent.Os)_$(_BuildConfig)') }} + continueOnError: true + condition: always() + - ${{ if or(eq(parameters.artifacts.publish.logs, 'true'), ne(parameters.artifacts.publish.logs, '')) }}: + - publish: artifacts/log + artifact: ${{ coalesce(parameters.artifacts.publish.logs.name, 'Logs_Build_$(Agent.Os)_$(_BuildConfig)') }} + displayName: Publish logs + continueOnError: true + condition: always() + - ${{ if or(eq(parameters.artifacts.publish.manifests, 'true'), ne(parameters.artifacts.publish.manifests, '')) }}: + - ${{ if and(ne(parameters.enablePublishUsingPipelines, 'true'), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: CopyFiles@2 + displayName: Gather Asset Manifests + inputs: + SourceFolder: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/AssetManifest' + TargetFolder: '$(Build.ArtifactStagingDirectory)/AssetManifests' + continueOnError: ${{ parameters.continueOnError }} + condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) + + - task: PublishBuildArtifacts@1 + displayName: Push Asset Manifests + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)/AssetManifests' + PublishLocation: Container + ArtifactName: AssetManifests + continueOnError: ${{ parameters.continueOnError }} + condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) + + - ${{ if ne(parameters.enablePublishBuildArtifacts, 'false') }}: - task: PublishBuildArtifacts@1 displayName: Publish Logs inputs: PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)' PublishLocation: Container - ArtifactName: $(Agent.Os)_$(Agent.JobName) + ArtifactName: ${{ coalesce(parameters.enablePublishBuildArtifacts.artifactName, '$(Agent.Os)_$(Agent.JobName)' ) }} continueOnError: true condition: always() @@ -187,7 +197,7 @@ jobs: continueOnError: true condition: always() - - ${{ if and(eq(parameters.enablePublishBuildAssets, true), ne(variables['_PublishUsingPipelines'], 'true'), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - ${{ if and(eq(parameters.enablePublishBuildAssets, true), ne(parameters.enablePublishUsingPipelines, 'true'), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - task: CopyFiles@2 displayName: Gather Asset Manifests inputs: @@ -195,6 +205,7 @@ jobs: TargetFolder: '$(Build.StagingDirectory)/AssetManifests' continueOnError: ${{ parameters.continueOnError }} condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) + - task: PublishBuildArtifacts@1 displayName: Push Asset Manifests inputs: diff --git a/eng/common/templates/job/performance.yml b/eng/common/templates/job/performance.yml new file mode 100644 index 0000000000..f877fd7a89 --- /dev/null +++ b/eng/common/templates/job/performance.yml @@ -0,0 +1,95 @@ +parameters: + steps: [] # optional -- any additional steps that need to happen before pulling down the performance repo and sending the performance benchmarks to helix (ie building your repo) + variables: [] # optional -- list of additional variables to send to the template + jobName: '' # required -- job name + displayName: '' # optional -- display name for the job. Will use jobName if not passed + pool: '' # required -- name of the Build pool + container: '' # required -- name of the container + osGroup: '' # required -- operating system for the job + extraSetupParameters: '' # optional -- extra arguments to pass to the setup script + frameworks: ['netcoreapp3.0'] # optional -- list of frameworks to run against + continueOnError: 'false' # optional -- determines whether to continue the build if the step errors + dependsOn: '' # optional -- dependencies of the job + timeoutInMinutes: 320 # optional -- timeout for the job + enableTelemetry: false # optional -- enable for telemetry + +jobs: +- template: ../jobs/jobs.yml + parameters: + dependsOn: ${{ parameters.dependsOn }} + enableTelemetry: ${{ parameters.enableTelemetry }} + enablePublishBuildArtifacts: true + continueOnError: ${{ parameters.continueOnError }} + + jobs: + - job: '${{ parameters.jobName }}' + + ${{ if ne(parameters.displayName, '') }}: + displayName: '${{ parameters.displayName }}' + ${{ if eq(parameters.displayName, '') }}: + displayName: '${{ parameters.jobName }}' + + timeoutInMinutes: ${{ parameters.timeoutInMinutes }} + + variables: + + - ${{ each variable in parameters.variables }}: + - ${{ if ne(variable.name, '') }}: + - name: ${{ variable.name }} + value: ${{ variable.value }} + - ${{ if ne(variable.group, '') }}: + - group: ${{ variable.group }} + + - IsInternal: '' + - HelixApiAccessToken: '' + - HelixPreCommand: '' + + - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - ${{ if eq( parameters.osGroup, 'Windows_NT') }}: + - HelixPreCommand: 'set "PERFLAB_UPLOAD_TOKEN=$(PerfCommandUploadToken)"' + - IsInternal: -Internal + - ${{ if ne(parameters.osGroup, 'Windows_NT') }}: + - HelixPreCommand: 'export PERFLAB_UPLOAD_TOKEN="$(PerfCommandUploadTokenLinux)"' + - IsInternal: --internal + + - group: DotNet-HelixApi-Access + - group: dotnet-benchview + + workspace: + clean: all + pool: + ${{ parameters.pool }} + container: ${{ parameters.container }} + strategy: + matrix: + ${{ each framework in parameters.frameworks }}: + ${{ framework }}: + _Framework: ${{ framework }} + steps: + - checkout: self + clean: true + # Run all of the steps to setup repo + - ${{ each step in parameters.steps }}: + - ${{ step }} + - powershell: $(Build.SourcesDirectory)\eng\common\performance\performance-setup.ps1 $(IsInternal) -Framework $(_Framework) ${{ parameters.extraSetupParameters }} + displayName: Performance Setup (Windows) + condition: and(succeeded(), eq(variables['Agent.Os'], 'Windows_NT')) + continueOnError: ${{ parameters.continueOnError }} + - script: $(Build.SourcesDirectory)/eng/common/performance/performance-setup.sh $(IsInternal) --framework $(_Framework) ${{ parameters.extraSetupParameters }} + displayName: Performance Setup (Unix) + condition: and(succeeded(), ne(variables['Agent.Os'], 'Windows_NT')) + continueOnError: ${{ parameters.continueOnError }} + - script: $(Python) $(PerformanceDirectory)/scripts/ci_setup.py $(SetupArguments) + displayName: Run ci setup script + # Run perf testing in helix + - template: /eng/common/templates/steps/perf-send-to-helix.yml + parameters: + HelixSource: '$(HelixSourcePrefix)/$(Build.Repository.Name)/$(Build.SourceBranch)' # sources must start with pr/, official/, prodcon/, or agent/ + HelixType: 'test/performance/$(Kind)/$(_Framework)/$(Architecture)' + HelixAccessToken: $(HelixApiAccessToken) + HelixTargetQueues: $(Queue) + HelixPreCommands: $(HelixPreCommand) + Creator: $(Creator) + WorkItemTimeout: 4:00 # 4 hours + WorkItemDirectory: '$(WorkItemDirectory)' # WorkItemDirectory can not be empty, so we send it some docs to keep it happy + CorrelationPayloadDirectory: '$(PayloadDirectory)' # it gets checked out to a folder with shorter path than WorkItemDirectory so we can avoid file name too long exceptions \ No newline at end of file diff --git a/eng/common/templates/job/publish-build-assets.yml b/eng/common/templates/job/publish-build-assets.yml index 620bd3c62e..b722975f9c 100644 --- a/eng/common/templates/job/publish-build-assets.yml +++ b/eng/common/templates/job/publish-build-assets.yml @@ -47,6 +47,10 @@ jobs: downloadPath: '$(Build.StagingDirectory)/Download' condition: ${{ parameters.condition }} continueOnError: ${{ parameters.continueOnError }} + + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: NuGetAuthenticate@0 + - task: PowerShell@2 displayName: Publish Build Assets inputs: @@ -59,6 +63,23 @@ jobs: /p:Configuration=$(_BuildConfig) condition: ${{ parameters.condition }} continueOnError: ${{ parameters.continueOnError }} + + - task: powershell@2 + displayName: Create ReleaseConfigs Artifact + inputs: + targetType: inline + script: | + Add-Content -Path "$(Build.StagingDirectory)/ReleaseConfigs.txt" -Value $(BARBuildId) + Add-Content -Path "$(Build.StagingDirectory)/ReleaseConfigs.txt" -Value "$(DefaultChannels)" + Add-Content -Path "$(Build.StagingDirectory)/ReleaseConfigs.txt" -Value $(IsStableBuild) + + - task: PublishBuildArtifacts@1 + displayName: Publish ReleaseConfigs Artifact + inputs: + PathtoPublish: '$(Build.StagingDirectory)/ReleaseConfigs.txt' + PublishLocation: Container + ArtifactName: ReleaseConfigs + - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}: - task: PublishBuildArtifacts@1 displayName: Publish Logs to VSTS diff --git a/eng/common/templates/jobs/jobs.yml b/eng/common/templates/jobs/jobs.yml index 6a2f98c036..c08225a9a9 100644 --- a/eng/common/templates/jobs/jobs.yml +++ b/eng/common/templates/jobs/jobs.yml @@ -1,19 +1,10 @@ parameters: - # Optional: 'true' if failures in job.yml job should not fail the job + # See schema documentation in /Documentation/AzureDevOps/TemplateSchema.md continueOnError: false - # Optional: Enable installing Microbuild plugin - # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix - # _TeamName - the name of your team - # _SignType - 'test' or 'real' - enableMicrobuild: false - # Optional: Include PublishBuildArtifacts task enablePublishBuildArtifacts: false - # Optional: Enable publishing to the build asset registry - enablePublishBuildAssets: false - # Optional: Enable publishing using release pipelines enablePublishUsingPipelines: false @@ -23,19 +14,9 @@ parameters: # Optional: Include toolset dependencies in the generated graph files includeToolset: false - # Optional: Include PublishTestResults task - enablePublishTestResults: false - - # Optional: enable sending telemetry - # if enabled then the 'helixRepo' parameter should also be specified - enableTelemetry: false - # Required: A collection of jobs to run - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job jobs: [] - # Optional: define the helix repo for telemetry (example: 'dotnet/arcade') - helixRepo: '' - # Optional: Override automatically derived dependsOn value for "publish build assets" job publishBuildAssetsDependsOn: '' @@ -62,29 +43,30 @@ jobs: name: ${{ job.job }} -- ${{ if and(eq(parameters.enablePublishBuildAssets, true), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - - template: ../job/publish-build-assets.yml - parameters: - continueOnError: ${{ parameters.continueOnError }} - dependsOn: - - ${{ if ne(parameters.publishBuildAssetsDependsOn, '') }}: - - ${{ each job in parameters.publishBuildAssetsDependsOn }}: - - ${{ job.job }} - - ${{ if eq(parameters.publishBuildAssetsDependsOn, '') }}: - - ${{ each job in parameters.jobs }}: - - ${{ job.job }} - pool: - vmImage: vs2017-win2016 - runAsPublic: ${{ parameters.runAsPublic }} - publishUsingPipelines: ${{ parameters.enablePublishUsingPipelines }} - enablePublishBuildArtifacts: ${{ parameters.enablePublishBuildArtifacts }} - -- ${{ if and(eq(parameters.graphFileGeneration.enabled, true), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - - template: ../job/generate-graph-files.yml - parameters: - continueOnError: ${{ parameters.continueOnError }} - includeToolset: ${{ parameters.graphFileGeneration.includeToolset }} - dependsOn: - - Asset_Registry_Publish - pool: - vmImage: vs2017-win2016 +- ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - ${{ if or(eq(parameters.enablePublishBuildAssets, true), eq(parameters.artifacts.publish.manifests, 'true'), ne(parameters.artifacts.publish.manifests, '')) }}: + - template: ../job/publish-build-assets.yml + parameters: + continueOnError: ${{ parameters.continueOnError }} + dependsOn: + - ${{ if ne(parameters.publishBuildAssetsDependsOn, '') }}: + - ${{ each job in parameters.publishBuildAssetsDependsOn }}: + - ${{ job.job }} + - ${{ if eq(parameters.publishBuildAssetsDependsOn, '') }}: + - ${{ each job in parameters.jobs }}: + - ${{ job.job }} + pool: + vmImage: vs2017-win2016 + runAsPublic: ${{ parameters.runAsPublic }} + publishUsingPipelines: ${{ parameters.enablePublishUsingPipelines }} + enablePublishBuildArtifacts: ${{ parameters.enablePublishBuildArtifacts }} + + - ${{ if eq(parameters.graphFileGeneration.enabled, true) }}: + - template: ../job/generate-graph-files.yml + parameters: + continueOnError: ${{ parameters.continueOnError }} + includeToolset: ${{ parameters.graphFileGeneration.includeToolset }} + dependsOn: + - Asset_Registry_Publish + pool: + vmImage: vs2017-win2016 diff --git a/eng/common/templates/post-build/channels/generic-internal-channel.yml b/eng/common/templates/post-build/channels/generic-internal-channel.yml new file mode 100644 index 0000000000..3a8755fbbb --- /dev/null +++ b/eng/common/templates/post-build/channels/generic-internal-channel.yml @@ -0,0 +1,159 @@ +parameters: + artifactsPublishingAdditionalParameters: '' + dependsOn: + - Validate + publishInstallersAndChecksums: false + symbolPublishingAdditionalParameters: '' + stageName: '' + channelName: '' + channelId: '' + transportFeed: '' + shippingFeed: '' + symbolsFeed: '' + +stages: +- stage: ${{ parameters.stageName }} + dependsOn: ${{ parameters.dependsOn }} + variables: + - template: ../common-variables.yml + displayName: ${{ parameters.channelName }} Publishing + jobs: + - template: ../setup-maestro-vars.yml + + - job: publish_symbols + displayName: Symbol Publishing + dependsOn: setupMaestroVars + condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.channelId }} )) + variables: + - group: DotNet-Symbol-Server-Pats + pool: + vmImage: 'windows-2019' + steps: + - task: DownloadBuildArtifacts@0 + displayName: Download Blob Artifacts + inputs: + artifactName: 'BlobArtifacts' + continueOnError: true + + - task: DownloadBuildArtifacts@0 + displayName: Download PDB Artifacts + inputs: + artifactName: 'PDBArtifacts' + continueOnError: true + + # This is necessary whenever we want to publish/restore to an AzDO private feed + # Since sdk-task.ps1 tries to restore packages we need to do this authentication here + # otherwise it'll complain about accessing a private feed. + - task: NuGetAuthenticate@0 + displayName: 'Authenticate to AzDO Feeds' + + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + + - task: PowerShell@2 + displayName: Publish + inputs: + filePath: eng\common\sdk-task.ps1 + arguments: -task PublishToSymbolServers -restore -msbuildEngine dotnet + /p:DotNetSymbolServerTokenMsdl=$(microsoft-symbol-server-pat) + /p:DotNetSymbolServerTokenSymWeb=$(symweb-symbol-server-pat) + /p:PDBArtifactsDirectory='$(Build.ArtifactStagingDirectory)/PDBArtifacts/' + /p:BlobBasePath='$(Build.ArtifactStagingDirectory)/BlobArtifacts/' + /p:SymbolPublishingExclusionsFile='$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt' + /p:Configuration=Release + /p:PublishToMSDL=false + ${{ parameters.symbolPublishingAdditionalParameters }} + + - template: ../../steps/publish-logs.yml + parameters: + StageLabel: '${{ parameters.stageName }}' + JobLabel: 'SymbolPublishing' + + - job: publish_assets + displayName: Publish Assets + dependsOn: setupMaestroVars + variables: + - name: BARBuildId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ] + - name: IsStableBuild + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.IsStableBuild'] ] + condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.channelId }})) + pool: + vmImage: 'windows-2019' + steps: + - task: DownloadBuildArtifacts@0 + displayName: Download Package Artifacts + inputs: + buildType: current + artifactName: PackageArtifacts + continueOnError: true + + - task: DownloadBuildArtifacts@0 + displayName: Download Blob Artifacts + inputs: + buildType: current + artifactName: BlobArtifacts + continueOnError: true + - task: DownloadBuildArtifacts@0 + displayName: Download Asset Manifests + inputs: + buildType: current + artifactName: AssetManifests + + - task: NuGetToolInstaller@1 + displayName: 'Install NuGet.exe' + + # This is necessary whenever we want to publish/restore to an AzDO private feed + - task: NuGetAuthenticate@0 + displayName: 'Authenticate to AzDO Feeds' + + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + + - task: PowerShell@2 + displayName: Publish Assets + inputs: + filePath: eng\common\sdk-task.ps1 + arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet + /p:IsStableBuild=$(IsStableBuild) + /p:IsInternalBuild=$(IsInternalBuild) + /p:RepositoryName=$(Build.Repository.Name) + /p:CommitSha=$(Build.SourceVersion) + /p:NugetPath=$(NuGetExeToolPath) + /p:AzdoTargetFeedPAT='$(dn-bot-dnceng-universal-packages-rw)' + /p:AzureStorageTargetFeedPAT='$(dotnetfeed-storage-access-key-1)' + /p:BARBuildId=$(BARBuildId) + /p:MaestroApiEndpoint='$(MaestroApiEndPoint)' + /p:BuildAssetRegistryToken='$(MaestroApiAccessToken)' + /p:ManifestsBasePath='$(Build.ArtifactStagingDirectory)/AssetManifests/' + /p:BlobBasePath='$(Build.ArtifactStagingDirectory)/BlobArtifacts/' + /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts/' + /p:Configuration=Release + /p:PublishInstallersAndChecksums=true + /p:ChecksumsTargetStaticFeed=$(InternalChecksumsBlobFeedUrl) + /p:ChecksumsAzureAccountKey=$(InternalChecksumsBlobFeedKey) + /p:InstallersTargetStaticFeed=$(InternalInstallersBlobFeedUrl) + /p:InstallersAzureAccountKey=$(InternalInstallersBlobFeedKey) + /p:AzureDevOpsStaticShippingFeed='${{ parameters.shippingFeed }}' + /p:AzureDevOpsStaticShippingFeedKey='$(dn-bot-dnceng-artifact-feeds-rw)' + /p:AzureDevOpsStaticTransportFeed='${{ parameters.transportFeed }}' + /p:AzureDevOpsStaticTransportFeedKey='$(dn-bot-dnceng-artifact-feeds-rw)' + /p:AzureDevOpsStaticSymbolsFeed='${{ parameters.symbolsFeed }}' + /p:AzureDevOpsStaticSymbolsFeedKey='$(dn-bot-dnceng-artifact-feeds-rw)' + /p:PublishToMSDL=false + ${{ parameters.artifactsPublishingAdditionalParameters }} + + - template: ../../steps/publish-logs.yml + parameters: + StageLabel: '${{ parameters.stageName }}' + JobLabel: 'AssetsPublishing' + + - template: ../../steps/promote-build.yml + parameters: + ChannelId: ${{ parameters.channelId }} diff --git a/eng/common/templates/post-build/channels/generic-public-channel.yml b/eng/common/templates/post-build/channels/generic-public-channel.yml new file mode 100644 index 0000000000..3f572f8b12 --- /dev/null +++ b/eng/common/templates/post-build/channels/generic-public-channel.yml @@ -0,0 +1,159 @@ +parameters: + artifactsPublishingAdditionalParameters: '' + dependsOn: + - Validate + publishInstallersAndChecksums: false + symbolPublishingAdditionalParameters: '' + stageName: '' + channelName: '' + channelId: '' + transportFeed: '' + shippingFeed: '' + symbolsFeed: '' + +stages: +- stage: ${{ parameters.stageName }} + dependsOn: ${{ parameters.dependsOn }} + variables: + - template: ../common-variables.yml + displayName: ${{ parameters.channelName }} Publishing + jobs: + - template: ../setup-maestro-vars.yml + + - job: publish_symbols + displayName: Symbol Publishing + dependsOn: setupMaestroVars + condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.channelId }} )) + variables: + - group: DotNet-Symbol-Server-Pats + pool: + vmImage: 'windows-2019' + steps: + - task: DownloadBuildArtifacts@0 + displayName: Download Blob Artifacts + inputs: + artifactName: 'BlobArtifacts' + continueOnError: true + + - task: DownloadBuildArtifacts@0 + displayName: Download PDB Artifacts + inputs: + artifactName: 'PDBArtifacts' + continueOnError: true + + # This is necessary whenever we want to publish/restore to an AzDO private feed + # Since sdk-task.ps1 tries to restore packages we need to do this authentication here + # otherwise it'll complain about accessing a private feed. + - task: NuGetAuthenticate@0 + displayName: 'Authenticate to AzDO Feeds' + + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + + - task: PowerShell@2 + displayName: Publish + inputs: + filePath: eng\common\sdk-task.ps1 + arguments: -task PublishToSymbolServers -restore -msbuildEngine dotnet + /p:DotNetSymbolServerTokenMsdl=$(microsoft-symbol-server-pat) + /p:DotNetSymbolServerTokenSymWeb=$(symweb-symbol-server-pat) + /p:PDBArtifactsDirectory='$(Build.ArtifactStagingDirectory)/PDBArtifacts/' + /p:BlobBasePath='$(Build.ArtifactStagingDirectory)/BlobArtifacts/' + /p:SymbolPublishingExclusionsFile='$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt' + /p:Configuration=Release + ${{ parameters.symbolPublishingAdditionalParameters }} + + - template: ../../steps/publish-logs.yml + parameters: + StageLabel: '${{ parameters.stageName }}' + JobLabel: 'SymbolPublishing' + + - job: publish_assets + displayName: Publish Assets + dependsOn: setupMaestroVars + variables: + - name: BARBuildId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ] + - name: IsStableBuild + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.IsStableBuild'] ] + condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.channelId }})) + pool: + vmImage: 'windows-2019' + steps: + - task: DownloadBuildArtifacts@0 + displayName: Download Package Artifacts + inputs: + buildType: current + artifactName: PackageArtifacts + continueOnError: true + + - task: DownloadBuildArtifacts@0 + displayName: Download Blob Artifacts + inputs: + buildType: current + artifactName: BlobArtifacts + continueOnError: true + + - task: DownloadBuildArtifacts@0 + displayName: Download Asset Manifests + inputs: + buildType: current + artifactName: AssetManifests + + - task: NuGetToolInstaller@1 + displayName: 'Install NuGet.exe' + + # This is necessary whenever we want to publish/restore to an AzDO private feed + - task: NuGetAuthenticate@0 + displayName: 'Authenticate to AzDO Feeds' + + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + + - task: PowerShell@2 + displayName: Publish Assets + inputs: + filePath: eng\common\sdk-task.ps1 + arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet + /p:ArtifactsCategory=$(_DotNetArtifactsCategory) + /p:IsStableBuild=$(IsStableBuild) + /p:IsInternalBuild=$(IsInternalBuild) + /p:RepositoryName=$(Build.Repository.Name) + /p:CommitSha=$(Build.SourceVersion) + /p:NugetPath=$(NuGetExeToolPath) + /p:AzdoTargetFeedPAT='$(dn-bot-dnceng-universal-packages-rw)' + /p:AzureStorageTargetFeedPAT='$(dotnetfeed-storage-access-key-1)' + /p:BARBuildId=$(BARBuildId) + /p:MaestroApiEndpoint='$(MaestroApiEndPoint)' + /p:BuildAssetRegistryToken='$(MaestroApiAccessToken)' + /p:ManifestsBasePath='$(Build.ArtifactStagingDirectory)/AssetManifests/' + /p:BlobBasePath='$(Build.ArtifactStagingDirectory)/BlobArtifacts/' + /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts/' + /p:Configuration=Release + /p:PublishInstallersAndChecksums=${{ parameters.publishInstallersAndChecksums }} + /p:InstallersTargetStaticFeed=$(InstallersBlobFeedUrl) + /p:InstallersAzureAccountKey=$(dotnetcli-storage-key) + /p:ChecksumsTargetStaticFeed=$(ChecksumsBlobFeedUrl) + /p:ChecksumsAzureAccountKey=$(dotnetclichecksums-storage-key) + /p:AzureDevOpsStaticShippingFeed='${{ parameters.shippingFeed }}' + /p:AzureDevOpsStaticShippingFeedKey='$(dn-bot-dnceng-artifact-feeds-rw)' + /p:AzureDevOpsStaticTransportFeed='${{ parameters.transportFeed }}' + /p:AzureDevOpsStaticTransportFeedKey='$(dn-bot-dnceng-artifact-feeds-rw)' + /p:AzureDevOpsStaticSymbolsFeed='${{ parameters.symbolsFeed }}' + /p:AzureDevOpsStaticSymbolsFeedKey='$(dn-bot-dnceng-artifact-feeds-rw)' + ${{ parameters.artifactsPublishingAdditionalParameters }} + + - template: ../../steps/publish-logs.yml + parameters: + StageLabel: '${{ parameters.stageName }}' + JobLabel: 'AssetsPublishing' + + - template: ../../steps/promote-build.yml + parameters: + ChannelId: ${{ parameters.channelId }} diff --git a/eng/common/templates/post-build/common-variables.yml b/eng/common/templates/post-build/common-variables.yml new file mode 100644 index 0000000000..9505cf170f --- /dev/null +++ b/eng/common/templates/post-build/common-variables.yml @@ -0,0 +1,92 @@ +variables: + - group: AzureDevOps-Artifact-Feeds-Pats + - group: DotNet-Blob-Feed + - group: DotNet-DotNetCli-Storage + - group: DotNet-MSRC-Storage + - group: Publish-Build-Assets + + # .NET Core 3.1 Dev + - name: PublicDevRelease_31_Channel_Id + value: 128 + + # .NET Core 5 Dev + - name: NetCore_5_Dev_Channel_Id + value: 131 + + # .NET Eng - Validation + - name: Net_Eng_Validation_Channel_Id + value: 9 + + # .NET Eng - Latest + - name: Net_Eng_Latest_Channel_Id + value: 2 + + # .NET 3 Eng - Validation + - name: NET_3_Eng_Validation_Channel_Id + value: 390 + + # .NET 3 Eng + - name: NetCore_3_Tools_Channel_Id + value: 344 + + # .NET Core 3.0 Internal Servicing + - name: InternalServicing_30_Channel_Id + value: 184 + + # .NET Core 3.0 Release + - name: PublicRelease_30_Channel_Id + value: 19 + + # .NET Core 3.1 Release + - name: PublicRelease_31_Channel_Id + value: 129 + + # General Testing + - name: GeneralTesting_Channel_Id + value: 529 + + # .NET Core 3.1 Blazor Features + - name: NetCore_31_Blazor_Features_Channel_Id + value: 531 + + # .NET Core Experimental + - name: NetCore_Experimental_Channel_Id + value: 562 + + # Whether the build is internal or not + - name: IsInternalBuild + value: ${{ and(ne(variables['System.TeamProject'], 'public'), contains(variables['Build.SourceBranch'], 'internal')) }} + + # Default Maestro++ API Endpoint and API Version + - name: MaestroApiEndPoint + value: "https://maestro-prod.westus2.cloudapp.azure.com" + - name: MaestroApiAccessToken + value: $(MaestroAccessToken) + - name: MaestroApiVersion + value: "2019-01-16" + + - name: SourceLinkCLIVersion + value: 3.0.0 + - name: SymbolToolVersion + value: 1.0.1 + + # Feed Configurations + # These should include the suffix "/index.json" + + # Default locations for Installers and checksums + # Public Locations + - name: ChecksumsBlobFeedUrl + value: https://dotnetclichecksums.blob.core.windows.net/dotnet/index.json + - name: InstallersBlobFeedUrl + value: https://dotnetcli.blob.core.windows.net/dotnet/index.json + + # Private Locations + - name: InternalChecksumsBlobFeedUrl + value: https://dotnetclichecksumsmsrc.blob.core.windows.net/dotnet/index.json + - name: InternalChecksumsBlobFeedKey + value: $(dotnetclichecksumsmsrc-storage-key) + + - name: InternalInstallersBlobFeedUrl + value: https://dotnetclimsrc.blob.core.windows.net/dotnet/index.json + - name: InternalInstallersBlobFeedKey + value: $(dotnetclimsrc-access-key) diff --git a/eng/common/templates/post-build/darc-gather-drop.yml b/eng/common/templates/post-build/darc-gather-drop.yml new file mode 100644 index 0000000000..3268ccaa55 --- /dev/null +++ b/eng/common/templates/post-build/darc-gather-drop.yml @@ -0,0 +1,23 @@ +parameters: + ChannelId: 0 + +jobs: +- job: gatherDrop + displayName: Gather Drop + dependsOn: setupMaestroVars + condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.ChannelId }})) + variables: + - name: BARBuildId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ] + pool: + vmImage: 'windows-2019' + steps: + - task: PowerShell@2 + displayName: Darc gather-drop + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/post-build/darc-gather-drop.ps1 + arguments: -BarBuildId $(BARBuildId) + -DropLocation $(Agent.BuildDirectory)/Temp/Drop/ + -MaestroApiAccessToken $(MaestroApiAccessToken) + -MaestroApiEndPoint $(MaestroApiEndPoint) + -MaestroApiVersion $(MaestroApiVersion) diff --git a/eng/common/templates/post-build/post-build.yml b/eng/common/templates/post-build/post-build.yml new file mode 100644 index 0000000000..8a8d84f202 --- /dev/null +++ b/eng/common/templates/post-build/post-build.yml @@ -0,0 +1,223 @@ +parameters: + enableSourceLinkValidation: false + enableSigningValidation: true + enableSymbolValidation: false + enableNugetValidation: true + publishInstallersAndChecksums: false + SDLValidationParameters: + enable: false + continueOnError: false + params: '' + artifactNames: '' + + # These parameters let the user customize the call to sdk-task.ps1 for publishing + # symbols & general artifacts as well as for signing validation + symbolPublishingAdditionalParameters: '' + artifactsPublishingAdditionalParameters: '' + signingValidationAdditionalParameters: '' + + # Which stages should finish execution before post-build stages start + validateDependsOn: + - build + publishDependsOn: + - Validate + +stages: +- stage: Validate + dependsOn: ${{ parameters.validateDependsOn }} + displayName: Validate + jobs: + - ${{ if eq(parameters.enableNugetValidation, 'true') }}: + - job: + displayName: NuGet Validation + pool: + vmImage: 'windows-2019' + steps: + - task: DownloadBuildArtifacts@0 + displayName: Download Package Artifacts + inputs: + buildType: current + artifactName: PackageArtifacts + + - task: PowerShell@2 + displayName: Validate + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/post-build/nuget-validation.ps1 + arguments: -PackagesPath $(Build.ArtifactStagingDirectory)/PackageArtifacts/ + -ToolDestinationPath $(Agent.BuildDirectory)/Extract/ + + - ${{ if eq(parameters.enableSigningValidation, 'true') }}: + - job: + displayName: Signing Validation + variables: + - template: common-variables.yml + pool: + vmImage: 'windows-2019' + steps: + - task: DownloadBuildArtifacts@0 + displayName: Download Package Artifacts + inputs: + buildType: current + artifactName: PackageArtifacts + + # This is necessary whenever we want to publish/restore to an AzDO private feed + # Since sdk-task.ps1 tries to restore packages we need to do this authentication here + # otherwise it'll complain about accessing a private feed. + - task: NuGetAuthenticate@0 + displayName: 'Authenticate to AzDO Feeds' + + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + + - task: PowerShell@2 + displayName: Validate + inputs: + filePath: eng\common\sdk-task.ps1 + arguments: -task SigningValidation -restore -msbuildEngine dotnet + /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts' + /p:SignCheckExclusionsFile='$(Build.SourcesDirectory)/eng/SignCheckExclusionsFile.txt' + ${{ parameters.signingValidationAdditionalParameters }} + + - template: ../steps/publish-logs.yml + parameters: + StageLabel: 'Validation' + JobLabel: 'Signing' + + - ${{ if eq(parameters.enableSourceLinkValidation, 'true') }}: + - job: + displayName: SourceLink Validation + variables: + - template: common-variables.yml + pool: + vmImage: 'windows-2019' + steps: + - task: DownloadBuildArtifacts@0 + displayName: Download Blob Artifacts + inputs: + buildType: current + artifactName: BlobArtifacts + + - task: PowerShell@2 + displayName: Validate + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/post-build/sourcelink-validation.ps1 + arguments: -InputPath $(Build.ArtifactStagingDirectory)/BlobArtifacts/ + -ExtractPath $(Agent.BuildDirectory)/Extract/ + -GHRepoName $(Build.Repository.Name) + -GHCommit $(Build.SourceVersion) + -SourcelinkCliVersion $(SourceLinkCLIVersion) + continueOnError: true + + - ${{ if eq(parameters.SDLValidationParameters.enable, 'true') }}: + - template: /eng/common/templates/job/execute-sdl.yml + parameters: + additionalParameters: ${{ parameters.SDLValidationParameters.params }} + continueOnError: ${{ parameters.SDLValidationParameters.continueOnError }} + artifactNames: ${{ parameters.SDLValidationParameters.artifactNames }} + +- template: \eng\common\templates\post-build\channels\generic-public-channel.yml + parameters: + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + dependsOn: ${{ parameters.publishDependsOn }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + stageName: 'NetCore_Dev5_Publish' + channelName: '.NET Core 5 Dev' + channelId: 131 + transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json' + shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json' + symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json' + +- template: \eng\common\templates\post-build\channels\generic-public-channel.yml + parameters: + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + dependsOn: ${{ parameters.publishDependsOn }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + stageName: 'Net_Eng_Latest_Publish' + channelName: '.NET Eng - Latest' + channelId: 2 + transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' + shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' + symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng-symbols/nuget/v3/index.json' + +- template: \eng\common\templates\post-build\channels\generic-public-channel.yml + parameters: + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + dependsOn: ${{ parameters.publishDependsOn }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + stageName: 'Net_Eng_Validation_Publish' + channelName: '.NET Eng - Validation' + channelId: 9 + transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' + shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' + symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng-symbols/nuget/v3/index.json' + +- template: \eng\common\templates\post-build\channels\generic-public-channel.yml + parameters: + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + dependsOn: ${{ parameters.publishDependsOn }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + stageName: 'General_Testing_Publish' + channelName: 'General Testing' + channelId: 529 + transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/general-testing/nuget/v3/index.json' + shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/general-testing/nuget/v3/index.json' + symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/general-testing-symbols/nuget/v3/index.json' + +- template: \eng\common\templates\post-build\channels\generic-public-channel.yml + parameters: + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + dependsOn: ${{ parameters.publishDependsOn }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + stageName: 'NETCore_Tooling_Dev_Publishing' + channelName: '.NET Core Tooling Dev' + channelId: 548 + transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json' + shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json' + symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools-symbols/nuget/v3/index.json' + +- template: \eng\common\templates\post-build\channels\generic-public-channel.yml + parameters: + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + dependsOn: ${{ parameters.publishDependsOn }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + stageName: 'NETCore_Tooling_Release_Publishing' + channelName: '.NET Core Tooling Release' + channelId: 549 + transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json' + shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json' + symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools-symbols/nuget/v3/index.json' + +- template: \eng\common\templates\post-build\channels\generic-internal-channel.yml + parameters: + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + dependsOn: ${{ parameters.publishDependsOn }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + stageName: 'NET_Internal_Tooling_Publishing' + channelName: '.NET Internal Tooling' + channelId: 551 + transportFeed: 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-tools-internal/nuget/v3/index.json' + shippingFeed: 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-tools-internal/nuget/v3/index.json' + symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-tools-internal-symbols/nuget/v3/index.json' + +- template: \eng\common\templates\post-build\channels\generic-public-channel.yml + parameters: + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + dependsOn: ${{ parameters.publishDependsOn }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + stageName: 'NETCore_Experimental_Publishing' + channelName: '.NET Core Experimental' + channelId: 562 + transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental/nuget/v3/index.json' + shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental/nuget/v3/index.json' + symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental-symbols/nuget/v3/index.json' diff --git a/eng/common/templates/post-build/promote-build.yml b/eng/common/templates/post-build/promote-build.yml new file mode 100644 index 0000000000..6b479c3b82 --- /dev/null +++ b/eng/common/templates/post-build/promote-build.yml @@ -0,0 +1,25 @@ +parameters: + ChannelId: 0 + +jobs: +- job: + displayName: Promote Build + dependsOn: setupMaestroVars + condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.ChannelId }})) + variables: + - name: BARBuildId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ] + - name: ChannelId + value: ${{ parameters.ChannelId }} + pool: + vmImage: 'windows-2019' + steps: + - task: PowerShell@2 + displayName: Add Build to Channel + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/post-build/promote-build.ps1 + arguments: -BuildId $(BARBuildId) + -ChannelId $(ChannelId) + -MaestroApiAccessToken $(MaestroApiAccessToken) + -MaestroApiEndPoint $(MaestroApiEndPoint) + -MaestroApiVersion $(MaestroApiVersion) diff --git a/eng/common/templates/post-build/setup-maestro-vars.yml b/eng/common/templates/post-build/setup-maestro-vars.yml new file mode 100644 index 0000000000..716b53f740 --- /dev/null +++ b/eng/common/templates/post-build/setup-maestro-vars.yml @@ -0,0 +1,40 @@ +jobs: +- job: setupMaestroVars + displayName: Setup Maestro Vars + pool: + vmImage: 'windows-2019' + steps: + - checkout: none + + - task: DownloadBuildArtifacts@0 + displayName: Download Release Configs + inputs: + buildType: current + artifactName: ReleaseConfigs + + - task: PowerShell@2 + name: setReleaseVars + displayName: Set Release Configs Vars + inputs: + targetType: inline + script: | + try { + $Content = Get-Content $(Build.StagingDirectory)/ReleaseConfigs/ReleaseConfigs.txt + + $BarId = $Content | Select -Index 0 + + $Channels = "" + $Content | Select -Index 1 | ForEach-Object { $Channels += "$_ ," } + + $IsStableBuild = $Content | Select -Index 2 + + Write-Host "##vso[task.setvariable variable=BARBuildId;isOutput=true]$BarId" + Write-Host "##vso[task.setvariable variable=InitialChannels;isOutput=true]$Channels" + Write-Host "##vso[task.setvariable variable=IsStableBuild;isOutput=true]$IsStableBuild" + } + catch { + Write-Host $_ + Write-Host $_.Exception + Write-Host $_.ScriptStackTrace + exit 1 + } diff --git a/eng/common/templates/post-build/trigger-subscription.yml b/eng/common/templates/post-build/trigger-subscription.yml new file mode 100644 index 0000000000..da669030da --- /dev/null +++ b/eng/common/templates/post-build/trigger-subscription.yml @@ -0,0 +1,13 @@ +parameters: + ChannelId: 0 + +steps: +- task: PowerShell@2 + displayName: Triggering subscriptions + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/post-build/trigger-subscriptions.ps1 + arguments: -SourceRepo $(Build.Repository.Uri) + -ChannelId ${{ parameters.ChannelId }} + -MaestroApiAccessToken $(MaestroAccessToken) + -MaestroApiEndPoint $(MaestroApiEndPoint) + -MaestroApiVersion $(MaestroApiVersion) diff --git a/eng/common/templates/steps/perf-send-to-helix.yml b/eng/common/templates/steps/perf-send-to-helix.yml new file mode 100644 index 0000000000..b3ea9acf1f --- /dev/null +++ b/eng/common/templates/steps/perf-send-to-helix.yml @@ -0,0 +1,66 @@ +# Please remember to update the documentation if you make changes to these parameters! +parameters: + HelixSource: 'pr/default' # required -- sources must start with pr/, official/, prodcon/, or agent/ + HelixType: 'tests/default/' # required -- Helix telemetry which identifies what type of data this is; should include "test" for clarity and must end in '/' + HelixBuild: $(Build.BuildNumber) # required -- the build number Helix will use to identify this -- automatically set to the AzDO build number + HelixTargetQueues: '' # required -- semicolon delimited list of Helix queues to test on; see https://helix.dot.net/ for a list of queues + HelixAccessToken: '' # required -- access token to make Helix API requests; should be provided by the appropriate variable group + HelixPreCommands: '' # optional -- commands to run before Helix work item execution + HelixPostCommands: '' # optional -- commands to run after Helix work item execution + WorkItemDirectory: '' # optional -- a payload directory to zip up and send to Helix; requires WorkItemCommand; incompatible with XUnitProjects + CorrelationPayloadDirectory: '' # optional -- a directory to zip up and send to Helix as a correlation payload + IncludeDotNetCli: false # optional -- true will download a version of the .NET CLI onto the Helix machine as a correlation payload; requires DotNetCliPackageType and DotNetCliVersion + DotNetCliPackageType: '' # optional -- either 'sdk' or 'runtime'; determines whether the sdk or runtime will be sent to Helix; see https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases.json + DotNetCliVersion: '' # optional -- version of the CLI to send to Helix; based on this: https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases.json + EnableXUnitReporter: false # optional -- true enables XUnit result reporting to Mission Control + WaitForWorkItemCompletion: true # optional -- true will make the task wait until work items have been completed and fail the build if work items fail. False is "fire and forget." + Creator: '' # optional -- if the build is external, use this to specify who is sending the job + DisplayNamePrefix: 'Send job to Helix' # optional -- rename the beginning of the displayName of the steps in AzDO + condition: succeeded() # optional -- condition for step to execute; defaults to succeeded() + continueOnError: false # optional -- determines whether to continue the build if the step errors; defaults to false + +steps: + - powershell: $(Build.SourcesDirectory)\eng\common\msbuild.ps1 $(Build.SourcesDirectory)\eng\common\performance\perfhelixpublish.proj /restore /t:Test /bl:$(Build.SourcesDirectory)\artifacts\log\$env:BuildConfig\SendToHelix.binlog + displayName: ${{ parameters.DisplayNamePrefix }} (Windows) + env: + BuildConfig: $(_BuildConfig) + HelixSource: ${{ parameters.HelixSource }} + HelixType: ${{ parameters.HelixType }} + HelixBuild: ${{ parameters.HelixBuild }} + HelixTargetQueues: ${{ parameters.HelixTargetQueues }} + HelixAccessToken: ${{ parameters.HelixAccessToken }} + HelixPreCommands: ${{ parameters.HelixPreCommands }} + HelixPostCommands: ${{ parameters.HelixPostCommands }} + WorkItemDirectory: ${{ parameters.WorkItemDirectory }} + CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }} + IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }} + DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }} + DotNetCliVersion: ${{ parameters.DotNetCliVersion }} + EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }} + WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} + Creator: ${{ parameters.Creator }} + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT')) + continueOnError: ${{ parameters.continueOnError }} + - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/eng/common/performance/perfhelixpublish.proj /restore /t:Test /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog + displayName: ${{ parameters.DisplayNamePrefix }} (Unix) + env: + BuildConfig: $(_BuildConfig) + HelixSource: ${{ parameters.HelixSource }} + HelixType: ${{ parameters.HelixType }} + HelixBuild: ${{ parameters.HelixBuild }} + HelixTargetQueues: ${{ parameters.HelixTargetQueues }} + HelixAccessToken: ${{ parameters.HelixAccessToken }} + HelixPreCommands: ${{ parameters.HelixPreCommands }} + HelixPostCommands: ${{ parameters.HelixPostCommands }} + WorkItemDirectory: ${{ parameters.WorkItemDirectory }} + CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }} + IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }} + DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }} + DotNetCliVersion: ${{ parameters.DotNetCliVersion }} + EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }} + WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} + Creator: ${{ parameters.Creator }} + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + condition: and(${{ parameters.condition }}, ne(variables['Agent.Os'], 'Windows_NT')) + continueOnError: ${{ parameters.continueOnError }} diff --git a/eng/common/templates/steps/promote-build.yml b/eng/common/templates/steps/promote-build.yml new file mode 100644 index 0000000000..b90404435d --- /dev/null +++ b/eng/common/templates/steps/promote-build.yml @@ -0,0 +1,13 @@ +parameters: + ChannelId: 0 + +steps: +- task: PowerShell@2 + displayName: Add Build to Channel + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/post-build/promote-build.ps1 + arguments: -BuildId $(BARBuildId) + -ChannelId ${{ parameters.ChannelId }} + -MaestroApiAccessToken $(MaestroApiAccessToken) + -MaestroApiEndPoint $(MaestroApiEndPoint) + -MaestroApiVersion $(MaestroApiVersion) diff --git a/eng/common/templates/steps/publish-logs.yml b/eng/common/templates/steps/publish-logs.yml new file mode 100644 index 0000000000..8903ba57c0 --- /dev/null +++ b/eng/common/templates/steps/publish-logs.yml @@ -0,0 +1,23 @@ +parameters: + StageLabel: '' + JobLabel: '' + +steps: +- task: Powershell@2 + displayName: Prepare Binlogs to Upload + inputs: + targetType: inline + script: | + New-Item -ItemType Directory $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/ + Move-Item -Path $(Build.SourcesDirectory)/artifacts/log/Debug/* $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/ + continueOnError: true + condition: always() + +- task: PublishBuildArtifacts@1 + displayName: Publish Logs + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/PostBuildLogs' + PublishLocation: Container + ArtifactName: PostBuilLogs + continueOnError: true + condition: always() diff --git a/eng/common/templates/steps/send-to-helix.yml b/eng/common/templates/steps/send-to-helix.yml index 05df886f55..30becf01ea 100644 --- a/eng/common/templates/steps/send-to-helix.yml +++ b/eng/common/templates/steps/send-to-helix.yml @@ -23,6 +23,7 @@ parameters: EnableXUnitReporter: false # optional -- true enables XUnit result reporting to Mission Control WaitForWorkItemCompletion: true # optional -- true will make the task wait until work items have been completed and fail the build if work items fail. False is "fire and forget." IsExternal: false # [DEPRECATED] -- doesn't do anything, jobs are external if HelixAccessToken is empty and Creator is set + HelixBaseUri: 'https://helix.dot.net/' # optional -- sets the Helix API base URI (allows targeting int) Creator: '' # optional -- if the build is external, use this to specify who is sending the job DisplayNamePrefix: 'Run Tests' # optional -- rename the beginning of the displayName of the steps in AzDO condition: succeeded() # optional -- condition for step to execute; defaults to succeeded() @@ -55,6 +56,7 @@ steps: DotNetCliVersion: ${{ parameters.DotNetCliVersion }} EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }} WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} + HelixBaseUri: ${{ parameters.HelixBaseUri }} Creator: ${{ parameters.Creator }} SYSTEM_ACCESSTOKEN: $(System.AccessToken) condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT')) @@ -85,6 +87,7 @@ steps: DotNetCliVersion: ${{ parameters.DotNetCliVersion }} EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }} WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} + HelixBaseUri: ${{ parameters.HelixBaseUri }} Creator: ${{ parameters.Creator }} SYSTEM_ACCESSTOKEN: $(System.AccessToken) condition: and(${{ parameters.condition }}, ne(variables['Agent.Os'], 'Windows_NT')) diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index e3b5fe2dfd..d762c9f044 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -1,13 +1,11 @@ # Initialize variables if they aren't already defined. # These may be defined as parameters of the importing script, or set after importing this script. -[string]$architecture = if (Test-Path variable:architecture) { $architecture } else { "" } - # CI mode - set to true on CI server for PR validation build or official build. [bool]$ci = if (Test-Path variable:ci) { $ci } else { $false } # Build configuration. Common values include 'Debug' and 'Release', but the repository may use other names. -[string]$configuration = if (Test-Path variable:configuration) { $configuration } else { "Debug" } +[string]$configuration = if (Test-Path variable:configuration) { $configuration } else { 'Debug' } # Set to true to output binary log from msbuild. Note that emitting binary log slows down the build. # Binary log must be enabled on CI. @@ -26,7 +24,7 @@ [bool]$restore = if (Test-Path variable:restore) { $restore } else { $true } # Adjusts msbuild verbosity level. -[string]$verbosity = if (Test-Path variable:verbosity) { $verbosity } else { "minimal" } +[string]$verbosity = if (Test-Path variable:verbosity) { $verbosity } else { 'minimal' } # Set to true to reuse msbuild nodes. Recommended to not reuse on CI. [bool]$nodeReuse = if (Test-Path variable:nodeReuse) { $nodeReuse } else { !$ci } @@ -41,19 +39,25 @@ # installed on the machine instead of downloading one. [bool]$useInstalledDotNetCli = if (Test-Path variable:useInstalledDotNetCli) { $useInstalledDotNetCli } else { $true } +# Enable repos to use a particular version of the on-line dotnet-install scripts. +# default URL: https://dot.net/v1/dotnet-install.ps1 +[string]$dotnetInstallScriptVersion = if (Test-Path variable:dotnetInstallScriptVersion) { $dotnetInstallScriptVersion } else { 'v1' } + # True to use global NuGet cache instead of restoring packages to repository-local directory. [bool]$useGlobalNuGetCache = if (Test-Path variable:useGlobalNuGetCache) { $useGlobalNuGetCache } else { !$ci } # An array of names of processes to stop on script exit if prepareMachine is true. -$processesToStopOnExit = if (Test-Path variable:processesToStopOnExit) { $processesToStopOnExit } else { @("msbuild", "dotnet", "vbcscompiler") } +$processesToStopOnExit = if (Test-Path variable:processesToStopOnExit) { $processesToStopOnExit } else { @('msbuild', 'dotnet', 'vbcscompiler') } + +$disableConfigureToolsetImport = if (Test-Path variable:disableConfigureToolsetImport) { $disableConfigureToolsetImport } else { $null } set-strictmode -version 2.0 -$ErrorActionPreference = "Stop" +$ErrorActionPreference = 'Stop' [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 function Create-Directory([string[]] $path) { if (!(Test-Path $path)) { - New-Item -path $path -force -itemType "Directory" | Out-Null + New-Item -path $path -force -itemType 'Directory' | Out-Null } } @@ -86,7 +90,7 @@ function Exec-Process([string]$command, [string]$commandArgs) { return $global:LASTEXITCODE = $process.ExitCode } finally { - # If we didn't finish then an error occured or the user hit ctrl-c. Either + # If we didn't finish then an error occurred or the user hit ctrl-c. Either # way kill the process if (-not $finished) { $process.Kill() @@ -94,68 +98,6 @@ function Exec-Process([string]$command, [string]$commandArgs) { } } -function Write-PipelineTaskError { - [CmdletBinding()] - param( - [Parameter(Mandatory = $true)] - [string]$Message, - [Parameter(Mandatory = $false)] - [string]$Type = 'error', - [string]$ErrCode, - [string]$SourcePath, - [string]$LineNumber, - [string]$ColumnNumber, - [switch]$AsOutput) - - if(!$ci) { - if($Type -eq 'error') { - Write-Host $Message -ForegroundColor Red - return - } - elseif ($Type -eq 'warning') { - Write-Host $Message -ForegroundColor Yellow - return - } - } - - if(($Type -ne 'error') -and ($Type -ne 'warning')) { - Write-Host $Message - return - } - if(-not $PSBoundParameters.ContainsKey('Type')) { - $PSBoundParameters.Add('Type', 'error') - } - Write-LogIssue @PSBoundParameters -} - -function Write-PipelineSetVariable { - [CmdletBinding()] - param( - [Parameter(Mandatory = $true)] - [string]$Name, - [string]$Value, - [switch]$Secret, - [switch]$AsOutput) - - if($ci) { - Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data $Value -Properties @{ - 'variable' = $Name - 'issecret' = $Secret - } -AsOutput:$AsOutput - } -} - -function Write-PipelinePrependPath { - [CmdletBinding()] - param( - [Parameter(Mandatory=$true)] - [string]$Path, - [switch]$AsOutput) - if($ci) { - Write-LoggingCommand -Area 'task' -Event 'prependpath' -Data $Path -AsOutput:$AsOutput - } -} - function InitializeDotNetCli([bool]$install) { if (Test-Path variable:global:_DotNetInstallDir) { return $global:_DotNetInstallDir @@ -179,7 +121,7 @@ function InitializeDotNetCli([bool]$install) { # Find the first path on %PATH% that contains the dotnet.exe if ($useInstalledDotNetCli -and (-not $globalJsonHasRuntimes) -and ($env:DOTNET_INSTALL_DIR -eq $null)) { - $dotnetCmd = Get-Command "dotnet.exe" -ErrorAction SilentlyContinue + $dotnetCmd = Get-Command 'dotnet.exe' -ErrorAction SilentlyContinue if ($dotnetCmd -ne $null) { $env:DOTNET_INSTALL_DIR = Split-Path $dotnetCmd.Path -Parent } @@ -192,13 +134,13 @@ function InitializeDotNetCli([bool]$install) { if ((-not $globalJsonHasRuntimes) -and ($env:DOTNET_INSTALL_DIR -ne $null) -and (Test-Path(Join-Path $env:DOTNET_INSTALL_DIR "sdk\$dotnetSdkVersion"))) { $dotnetRoot = $env:DOTNET_INSTALL_DIR } else { - $dotnetRoot = Join-Path $RepoRoot ".dotnet" + $dotnetRoot = Join-Path $RepoRoot '.dotnet' if (-not (Test-Path(Join-Path $dotnetRoot "sdk\$dotnetSdkVersion"))) { if ($install) { - InstallDotNetSdk $dotnetRoot $dotnetSdkVersion $architecture + InstallDotNetSdk $dotnetRoot $dotnetSdkVersion } else { - Write-PipelineTaskError "Unable to find dotnet with SDK version '$dotnetSdkVersion'" + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Unable to find dotnet with SDK version '$dotnetSdkVersion'" ExitWithExitCode 1 } } @@ -211,8 +153,9 @@ function InitializeDotNetCli([bool]$install) { # It also ensures that VS msbuild will use the downloaded sdk targets. $env:PATH = "$dotnetRoot;$env:PATH" - # Make Sure that our bootstrapped dotnet cli is avaliable in future steps of the Azure Pipelines build + # Make Sure that our bootstrapped dotnet cli is available in future steps of the Azure Pipelines build Write-PipelinePrependPath -Path $dotnetRoot + Write-PipelineSetVariable -Name 'DOTNET_MULTILEVEL_LOOKUP' -Value '0' Write-PipelineSetVariable -Name 'DOTNET_SKIP_FIRST_TIME_EXPERIENCE' -Value '1' @@ -220,44 +163,61 @@ function InitializeDotNetCli([bool]$install) { } function GetDotNetInstallScript([string] $dotnetRoot) { - $installScript = Join-Path $dotnetRoot "dotnet-install.ps1" + $installScript = Join-Path $dotnetRoot 'dotnet-install.ps1' if (!(Test-Path $installScript)) { Create-Directory $dotnetRoot - Invoke-WebRequest "https://dot.net/v1/dotnet-install.ps1" -OutFile $installScript + $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit + Invoke-WebRequest "https://dot.net/$dotnetInstallScriptVersion/dotnet-install.ps1" -OutFile $installScript } return $installScript } -function InstallDotNetSdk([string] $dotnetRoot, [string] $version, [string] $architecture = "") { +function InstallDotNetSdk([string] $dotnetRoot, [string] $version, [string] $architecture = '') { InstallDotNet $dotnetRoot $version $architecture } -function InstallDotNet([string] $dotnetRoot, [string] $version, [string] $architecture = "", [string] $runtime = "", [bool] $skipNonVersionedFiles = $false) { $installScript = GetDotNetInstallScript $dotnetRoot +function InstallDotNet([string] $dotnetRoot, + [string] $version, + [string] $architecture = '', + [string] $runtime = '', + [bool] $skipNonVersionedFiles = $false, + [string] $runtimeSourceFeed = '', + [string] $runtimeSourceFeedKey = '') { + $installScript = GetDotNetInstallScript $dotnetRoot $installParameters = @{ Version = $version InstallDir = $dotnetRoot } - if ($architecture) { - if ($architecture -eq "arm") { - $architecture="x86" - } - if ($architecture -eq "arm64") { - $architecture="x64" - } - $installParameters.Architecture = $architecture + if ($architecture) { $installParameters.Architecture = $architecture } + if ($runtime) { $installParameters.Runtime = $runtime } + if ($skipNonVersionedFiles) { $installParameters.SkipNonVersionedFiles = $skipNonVersionedFiles } + + try { + & $installScript @installParameters } + catch { + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Failed to install dotnet runtime '$runtime' from public location." + # Only the runtime can be installed from a custom [private] location. + if ($runtime -and ($runtimeSourceFeed -or $runtimeSourceFeedKey)) { + if ($runtimeSourceFeed) { $installParameters.AzureFeed = $runtimeSourceFeed } - if ($runtime) { $installParameters.Runtime = $runtime } - if ($skipNonVersionedFiles) { $installParameters.SkipNonVersionedFiles = $skipNonVersionedFiles } + if ($runtimeSourceFeedKey) { + $decodedBytes = [System.Convert]::FromBase64String($runtimeSourceFeedKey) + $decodedString = [System.Text.Encoding]::UTF8.GetString($decodedBytes) + $installParameters.FeedCredential = $decodedString + } - & $installScript @installParameters - if ($lastExitCode -ne 0) { - Write-PipelineTaskError -Message "Failed to install dotnet cli (exit code '$lastExitCode')." - ExitWithExitCode $lastExitCode + try { + & $installScript @installParameters + } + catch { + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Failed to install dotnet runtime '$runtime' from custom location '$runtimeSourceFeed'." + } + } } } @@ -278,16 +238,16 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = } if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs } - $vsMinVersionStr = if ($vsRequirements.version) { $vsRequirements.version } else { "15.9" } + $vsMinVersionStr = if ($vsRequirements.version) { $vsRequirements.version } else { '15.9' } $vsMinVersion = [Version]::new($vsMinVersionStr) # Try msbuild command available in the environment. if ($env:VSINSTALLDIR -ne $null) { - $msbuildCmd = Get-Command "msbuild.exe" -ErrorAction SilentlyContinue + $msbuildCmd = Get-Command 'msbuild.exe' -ErrorAction SilentlyContinue if ($msbuildCmd -ne $null) { # Workaround for https://github.com/dotnet/roslyn/issues/35793 # Due to this issue $msbuildCmd.Version returns 0.0.0.0 for msbuild.exe 16.2+ - $msbuildVersion = [Version]::new((Get-Item $msbuildCmd.Path).VersionInfo.ProductVersion.Split(@('-', '+'))[0]) + $msbuildVersion = [Version]::new((Get-Item $msbuildCmd.Path).VersionInfo.ProductVersion.Split([char[]]@('-', '+'))[0]) if ($msbuildVersion -ge $vsMinVersion) { return $global:_MSBuildExe = $msbuildCmd.Path @@ -307,7 +267,7 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = InitializeVisualStudioEnvironmentVariables $vsInstallDir $vsMajorVersion } else { - if (Get-Member -InputObject $GlobalJson.tools -Name "xcopy-msbuild") { + if (Get-Member -InputObject $GlobalJson.tools -Name 'xcopy-msbuild') { $xcopyMSBuildVersion = $GlobalJson.tools.'xcopy-msbuild' $vsMajorVersion = $xcopyMSBuildVersion.Split('.')[0] } else { @@ -317,7 +277,7 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = $vsInstallDir = InitializeXCopyMSBuild $xcopyMSBuildVersion $install if ($vsInstallDir -eq $null) { - throw "Unable to find Visual Studio that has required version and components installed" + throw 'Unable to find Visual Studio that has required version and components installed' } } @@ -341,7 +301,7 @@ function InstallXCopyMSBuild([string]$packageVersion) { } function InitializeXCopyMSBuild([string]$packageVersion, [bool]$install) { - $packageName = "RoslynTools.MSBuild" + $packageName = 'RoslynTools.MSBuild' $packageDir = Join-Path $ToolsDir "msbuild\$packageVersion" $packagePath = Join-Path $packageDir "$packageName.$packageVersion.nupkg" @@ -352,11 +312,12 @@ function InitializeXCopyMSBuild([string]$packageVersion, [bool]$install) { Create-Directory $packageDir Write-Host "Downloading $packageName $packageVersion" + $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit Invoke-WebRequest "https://dotnet.myget.org/F/roslyn-tools/api/v2/package/$packageName/$packageVersion/" -OutFile $packagePath Unzip $packagePath $packageDir } - return Join-Path $packageDir "tools" + return Join-Path $packageDir 'tools' } # @@ -373,32 +334,32 @@ function InitializeXCopyMSBuild([string]$packageVersion, [bool]$install) { # or $null if no instance meeting the requirements is found on the machine. # function LocateVisualStudio([object]$vsRequirements = $null){ - if (Get-Member -InputObject $GlobalJson.tools -Name "vswhere") { + if (Get-Member -InputObject $GlobalJson.tools -Name 'vswhere') { $vswhereVersion = $GlobalJson.tools.vswhere } else { - $vswhereVersion = "2.5.2" + $vswhereVersion = '2.5.2' } $vsWhereDir = Join-Path $ToolsDir "vswhere\$vswhereVersion" - $vsWhereExe = Join-Path $vsWhereDir "vswhere.exe" + $vsWhereExe = Join-Path $vsWhereDir 'vswhere.exe' if (!(Test-Path $vsWhereExe)) { Create-Directory $vsWhereDir - Write-Host "Downloading vswhere" + Write-Host 'Downloading vswhere' Invoke-WebRequest "https://github.com/Microsoft/vswhere/releases/download/$vswhereVersion/vswhere.exe" -OutFile $vswhereExe } if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs } - $args = @("-latest", "-prerelease", "-format", "json", "-requires", "Microsoft.Component.MSBuild") + $args = @('-latest', '-prerelease', '-format', 'json', '-requires', 'Microsoft.Component.MSBuild', '-products', '*') - if (Get-Member -InputObject $vsRequirements -Name "version") { - $args += "-version" + if (Get-Member -InputObject $vsRequirements -Name 'version') { + $args += '-version' $args += $vsRequirements.version } - if (Get-Member -InputObject $vsRequirements -Name "components") { + if (Get-Member -InputObject $vsRequirements -Name 'components') { foreach ($component in $vsRequirements.components) { - $args += "-requires" + $args += '-requires' $args += $component } } @@ -424,28 +385,27 @@ function InitializeBuildTool() { # Initialize dotnet cli if listed in 'tools' $dotnetRoot = $null - if (Get-Member -InputObject $GlobalJson.tools -Name "dotnet") { + if (Get-Member -InputObject $GlobalJson.tools -Name 'dotnet') { $dotnetRoot = InitializeDotNetCli -install:$restore } - if ($msbuildEngine -eq "dotnet") { + if ($msbuildEngine -eq 'dotnet') { if (!$dotnetRoot) { - Write-PipelineTaskError "/global.json must specify 'tools.dotnet'." + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "/global.json must specify 'tools.dotnet'." ExitWithExitCode 1 } - - $buildTool = @{ Path = Join-Path $dotnetRoot "dotnet.exe"; Command = "msbuild"; Tool = "dotnet"; Framework = "netcoreapp2.1" } + $buildTool = @{ Path = Join-Path $dotnetRoot 'dotnet.exe'; Command = 'msbuild'; Tool = 'dotnet'; Framework = 'netcoreapp2.1' } } elseif ($msbuildEngine -eq "vs") { try { $msbuildPath = InitializeVisualStudioMSBuild -install:$restore } catch { - Write-PipelineTaskError $_ + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message $_ ExitWithExitCode 1 } $buildTool = @{ Path = $msbuildPath; Command = ""; Tool = "vs"; Framework = "net472" } } else { - Write-PipelineTaskError "Unexpected value of -msbuildEngine: '$msbuildEngine'." + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Unexpected value of -msbuildEngine: '$msbuildEngine'." ExitWithExitCode 1 } @@ -454,15 +414,15 @@ function InitializeBuildTool() { function GetDefaultMSBuildEngine() { # Presence of tools.vs indicates the repo needs to build using VS msbuild on Windows. - if (Get-Member -InputObject $GlobalJson.tools -Name "vs") { - return "vs" + if (Get-Member -InputObject $GlobalJson.tools -Name 'vs') { + return 'vs' } - if (Get-Member -InputObject $GlobalJson.tools -Name "dotnet") { - return "dotnet" + if (Get-Member -InputObject $GlobalJson.tools -Name 'dotnet') { + return 'dotnet' } - Write-PipelineTaskError "-msbuildEngine must be specified, or /global.json must specify 'tools.dotnet' or 'tools.vs'." + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "-msbuildEngine must be specified, or /global.json must specify 'tools.dotnet' or 'tools.vs'." ExitWithExitCode 1 } @@ -471,9 +431,9 @@ function GetNuGetPackageCachePath() { # Use local cache on CI to ensure deterministic build, # use global cache in dev builds to avoid cost of downloading packages. if ($useGlobalNuGetCache) { - $env:NUGET_PACKAGES = Join-Path $env:UserProfile ".nuget\packages" + $env:NUGET_PACKAGES = Join-Path $env:UserProfile '.nuget\packages' } else { - $env:NUGET_PACKAGES = Join-Path $RepoRoot ".packages" + $env:NUGET_PACKAGES = Join-Path $RepoRoot '.packages' } } @@ -486,7 +446,7 @@ function GetSdkTaskProject([string]$taskName) { } function InitializeNativeTools() { - if (Get-Member -InputObject $GlobalJson -Name "native-tools") { + if (-Not (Test-Path variable:DisableNativeToolsetInstalls) -And (Get-Member -InputObject $GlobalJson -Name "native-tools")) { $nativeArgs= @{} if ($ci) { $nativeArgs = @{ @@ -515,14 +475,14 @@ function InitializeToolset() { } if (-not $restore) { - Write-PipelineTaskError "Toolset version $toolsetVersion has not been restored." + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Toolset version $toolsetVersion has not been restored." ExitWithExitCode 1 } $buildTool = InitializeBuildTool - $proj = Join-Path $ToolsetDir "restore.proj" - $bl = if ($binaryLog) { "/bl:" + (Join-Path $LogDir "ToolsetRestore.binlog") } else { "" } + $proj = Join-Path $ToolsetDir 'restore.proj' + $bl = if ($binaryLog) { '/bl:' + (Join-Path $LogDir 'ToolsetRestore.binlog') } else { '' } '' | Set-Content $proj @@ -544,7 +504,7 @@ function ExitWithExitCode([int] $exitCode) { } function Stop-Processes() { - Write-Host "Killing running build processes..." + Write-Host 'Killing running build processes...' foreach ($processName in $processesToStopOnExit) { Get-Process -Name $processName -ErrorAction SilentlyContinue | Stop-Process } @@ -558,9 +518,21 @@ function Stop-Processes() { function MSBuild() { if ($pipelinesLog) { $buildTool = InitializeBuildTool + + # Work around issues with Azure Artifacts credential provider + # https://github.com/dotnet/arcade/issues/3932 + if ($ci -and $buildTool.Tool -eq 'dotnet') { + dotnet nuget locals http-cache -c + + $env:NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS = 20 + $env:NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS = 20 + Write-PipelineSetVariable -Name 'NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS' -Value '20' + Write-PipelineSetVariable -Name 'NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS' -Value '20' + } + $toolsetBuildProject = InitializeToolset $path = Split-Path -parent $toolsetBuildProject - $path = Join-Path $path (Join-Path $buildTool.Framework "Microsoft.DotNet.Arcade.Sdk.dll") + $path = Join-Path $path (Join-Path $buildTool.Framework 'Microsoft.DotNet.Arcade.Sdk.dll') $args += "/logger:$path" } @@ -575,11 +547,13 @@ function MSBuild() { function MSBuild-Core() { if ($ci) { if (!$binaryLog) { - throw "Binary log must be enabled in CI build." + Write-PipelineTelemetryError -Category 'Build' -Message 'Binary log must be enabled in CI build.' + ExitWithExitCode 1 } if ($nodeReuse) { - throw "Node reuse must be disabled in CI build." + Write-PipelineTelemetryError -Category 'Build' -Message 'Node reuse must be disabled in CI build.' + ExitWithExitCode 1 } } @@ -588,7 +562,10 @@ function MSBuild-Core() { $cmdArgs = "$($buildTool.Command) /m /nologo /clp:Summary /v:$verbosity /nr:$nodeReuse /p:ContinuousIntegrationBuild=$ci" if ($warnAsError) { - $cmdArgs += " /warnaserror /p:TreatWarningsAsErrors=true" + $cmdArgs += ' /warnaserror /p:TreatWarningsAsErrors=true' + } + else { + $cmdArgs += ' /p:TreatWarningsAsErrors=false' } foreach ($arg in $args) { @@ -600,7 +577,7 @@ function MSBuild-Core() { $exitCode = Exec-Process $buildTool.Path $cmdArgs if ($exitCode -ne 0) { - Write-PipelineTaskError "Build failed." + Write-PipelineTelemetryError Category 'Build' -Message 'Build failed.' $buildLog = GetMSBuildBinaryLogCommandLineArgument $args if ($buildLog -ne $null) { @@ -615,12 +592,12 @@ function GetMSBuildBinaryLogCommandLineArgument($arguments) { foreach ($argument in $arguments) { if ($argument -ne $null) { $arg = $argument.Trim() - if ($arg.StartsWith("/bl:", "OrdinalIgnoreCase")) { - return $arg.Substring("/bl:".Length) + if ($arg.StartsWith('/bl:', "OrdinalIgnoreCase")) { + return $arg.Substring('/bl:'.Length) } - if ($arg.StartsWith("/binaryLogger:", "OrdinalIgnoreCase")) { - return $arg.Substring("/binaryLogger:".Length) + if ($arg.StartsWith('/binaryLogger:', 'OrdinalIgnoreCase')) { + return $arg.Substring('/binaryLogger:'.Length) } } } @@ -628,16 +605,16 @@ function GetMSBuildBinaryLogCommandLineArgument($arguments) { return $null } -. $PSScriptRoot\LoggingCommandFunctions.ps1 +. $PSScriptRoot\pipeline-logging-functions.ps1 -$RepoRoot = Resolve-Path (Join-Path $PSScriptRoot "..\..") -$EngRoot = Resolve-Path (Join-Path $PSScriptRoot "..") -$ArtifactsDir = Join-Path $RepoRoot "artifacts" -$ToolsetDir = Join-Path $ArtifactsDir "toolset" -$ToolsDir = Join-Path $RepoRoot ".tools" -$LogDir = Join-Path (Join-Path $ArtifactsDir "log") $configuration -$TempDir = Join-Path (Join-Path $ArtifactsDir "tmp") $configuration -$GlobalJson = Get-Content -Raw -Path (Join-Path $RepoRoot "global.json") | ConvertFrom-Json +$RepoRoot = Resolve-Path (Join-Path $PSScriptRoot '..\..') +$EngRoot = Resolve-Path (Join-Path $PSScriptRoot '..') +$ArtifactsDir = Join-Path $RepoRoot 'artifacts' +$ToolsetDir = Join-Path $ArtifactsDir 'toolset' +$ToolsDir = Join-Path $RepoRoot '.tools' +$LogDir = Join-Path (Join-Path $ArtifactsDir 'log') $configuration +$TempDir = Join-Path (Join-Path $ArtifactsDir 'tmp') $configuration +$GlobalJson = Get-Content -Raw -Path (Join-Path $RepoRoot 'global.json') | ConvertFrom-Json # true if global.json contains a "runtimes" section $globalJsonHasRuntimes = if ($GlobalJson.tools.PSObject.Properties.Name -Match 'runtimes') { $true } else { $false } @@ -650,3 +627,18 @@ Write-PipelineSetVariable -Name 'Artifacts.Toolset' -Value $ToolsetDir Write-PipelineSetVariable -Name 'Artifacts.Log' -Value $LogDir Write-PipelineSetVariable -Name 'TEMP' -Value $TempDir Write-PipelineSetVariable -Name 'TMP' -Value $TempDir + +# Import custom tools configuration, if present in the repo. +# Note: Import in global scope so that the script set top-level variables without qualification. +if (!$disableConfigureToolsetImport) { + $configureToolsetScript = Join-Path $EngRoot 'configure-toolset.ps1' + if (Test-Path $configureToolsetScript) { + . $configureToolsetScript + if ((Test-Path variable:failOnConfigureToolsetError) -And $failOnConfigureToolsetError) { + if ((Test-Path variable:LastExitCode) -And ($LastExitCode -ne 0)) { + Write-PipelineTelemetryError -Category 'Build' -Message 'configure-toolset.ps1 returned a non-zero exit code' + ExitWithExitCode $LastExitCode + } + } + } +} diff --git a/eng/common/tools.sh b/eng/common/tools.sh index a8dffd3452..f58db5e25d 100644 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -45,6 +45,10 @@ warn_as_error=${warn_as_error:-true} # installed on the machine instead of downloading one. use_installed_dotnet_cli=${use_installed_dotnet_cli:-true} +# Enable repos to use a particular version of the on-line dotnet-install scripts. +# default URL: https://dot.net/v1/dotnet-install.sh +dotnetInstallScriptVersion=${dotnetInstallScriptVersion:-'v1'} + # True to use global NuGet cache instead of restoring packages to repository-local directory. if [[ "$ci" == true ]]; then use_global_nuget_cache=${use_global_nuget_cache:-false} @@ -52,78 +56,6 @@ else use_global_nuget_cache=${use_global_nuget_cache:-true} fi -function EmitError { - if [[ "$ci" != true ]]; then - echo "$@" >&2 - return - fi - - message_type="error" - sourcepath='' - linenumber='' - columnnumber='' - error_code='' - - while [[ $# -gt 0 ]]; do - opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')" - case "$opt" in - -type|-t) - message_type=$2 - shift - ;; - -sourcepath|-s) - sourcepath=$2 - shift - ;; - -linenumber|-l) - linenumber=$2 - shift - ;; - -columnnumber|-col) - columnnumber=$2 - shift - ;; - -code|-c) - error_code=$2 - shift - ;; - *) - break - ;; - esac - - shift - done - - message='##vso[task.logissue' - - message="$message type=$message_type" - - if [ -n "$sourcepath" ]; then - message="$message;sourcepath=$sourcepath" - else - message="$message;sourcepath=${BASH_SOURCE[1]}" - fi - - if [ -n "$linenumber" ]; then - message="$message;linenumber=$linenumber" - else - message="$message;linenumber=${BASH_LINENO[0]}" - fi - - if [ -n "$columnnumber" ]; then - message="$message;columnnumber=$columnnumber" - fi - - if [ -n "$error_code" ]; then - message="$message;code=$error_code" - fi - - message="$message]$*" - - echo "$message" -} - # Resolve any symlinks in the given path. function ResolvePath { local path=$1 @@ -149,7 +81,7 @@ function ReadGlobalVersion { local pattern="\"$key\" *: *\"(.*)\"" if [[ ! $line =~ $pattern ]]; then - EmitError "Error: Cannot find \"$key\" in $global_json_file" + Write-PipelineTelemetryError -category 'Build' "Error: Cannot find \"$key\" in $global_json_file" ExitWithExitCode 1 fi @@ -210,7 +142,7 @@ function InitializeDotNetCli { if [[ "$install" == true ]]; then InstallDotNetSdk "$dotnet_root" "$dotnet_sdk_version" else - EmitError "Unable to find dotnet with SDK version '$dotnet_sdk_version'" + Write-PipelineTelemetryError -category 'InitializeToolset' "Unable to find dotnet with SDK version '$dotnet_sdk_version'" ExitWithExitCode 1 fi fi @@ -218,14 +150,10 @@ function InitializeDotNetCli { # Add dotnet to PATH. This prevents any bare invocation of dotnet in custom # build steps from using anything other than what we've downloaded. - export PATH="$dotnet_root:$PATH" + Write-PipelinePrependPath -path "$dotnet_root" - if [[ $ci == true ]]; then - # Make Sure that our bootstrapped dotnet cli is available in future steps of the Azure Pipelines build - echo "##vso[task.prependpath]$dotnet_root" - echo "##vso[task.setvariable variable=DOTNET_MULTILEVEL_LOOKUP]0" - echo "##vso[task.setvariable variable=DOTNET_SKIP_FIRST_TIME_EXPERIENCE]1" - fi + Write-PipelineSetVariable -name "DOTNET_MULTILEVEL_LOOKUP" -value "0" + Write-PipelineSetVariable -name "DOTNET_SKIP_FIRST_TIME_EXPERIENCE" -value "1" # return value _InitializeDotNetCli="$dotnet_root" @@ -263,15 +191,35 @@ function InstallDotNet { fi bash "$install_script" --version $version --install-dir "$root" $archArg $runtimeArg $skipNonVersionedFilesArg || { local exit_code=$? - EmitError "Failed to install dotnet SDK (exit code '$exit_code')." - ExitWithExitCode $exit_code + Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to install dotnet SDK from public location (exit code '$exit_code')." + + if [[ -n "$runtimeArg" ]]; then + local runtimeSourceFeed='' + if [[ -n "${6:-}" ]]; then + runtimeSourceFeed="--azure-feed $6" + fi + + local runtimeSourceFeedKey='' + if [[ -n "${7:-}" ]]; then + decodedFeedKey=`echo $7 | base64 --decode` + runtimeSourceFeedKey="--feed-credential $decodedFeedKey" + fi + + if [[ -n "$runtimeSourceFeed" || -n "$runtimeSourceFeedKey" ]]; then + bash "$install_script" --version $version --install-dir "$root" $archArg $runtimeArg $skipNonVersionedFilesArg $runtimeSourceFeed $runtimeSourceFeedKey || { + local exit_code=$? + Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to install dotnet SDK from custom location '$runtimeSourceFeed' (exit code '$exit_code')." + ExitWithExitCode $exit_code + } + fi + fi } } function GetDotNetInstallScript { local root=$1 local install_script="$root/dotnet-install.sh" - local install_script_url="https://dot.net/v1/dotnet-install.sh" + local install_script_url="https://dot.net/$dotnetInstallScriptVersion/dotnet-install.sh" if [[ ! -a "$install_script" ]]; then mkdir -p "$root" @@ -280,12 +228,19 @@ function GetDotNetInstallScript { # Use curl if available, otherwise use wget if command -v curl > /dev/null; then - curl "$install_script_url" -sSL --retry 10 --create-dirs -o "$install_script" - else - wget -q -O "$install_script" "$install_script_url" + curl "$install_script_url" -sSL --retry 10 --create-dirs -o "$install_script" || { + local exit_code=$? + Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to acquire dotnet install script (exit code '$exit_code')." + ExitWithExitCode $exit_code + } + else + wget -q -O "$install_script" "$install_script_url" || { + local exit_code=$? + Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to acquire dotnet install script (exit code '$exit_code')." + ExitWithExitCode $exit_code + } fi fi - # return value _GetDotNetInstallScript="$install_script" } @@ -317,11 +272,14 @@ function GetNuGetPackageCachePath { } function InitializeNativeTools() { + if [[ -n "${DisableNativeToolsetInstalls:-}" ]]; then + return + fi if grep -Fq "native-tools" $global_json_file then local nativeArgs="" if [[ "$ci" == true ]]; then - nativeArgs="-InstallDirectory $tools_dir" + nativeArgs="--installDirectory $tools_dir" fi "$_script_dir/init-tools-native.sh" $nativeArgs fi @@ -349,7 +307,7 @@ function InitializeToolset { fi if [[ "$restore" != true ]]; then - EmitError "Toolset version $toolsetVersion has not been restored." + Write-PipelineTelemetryError -category 'InitializeToolset' "Toolset version $toolset_version has not been restored." ExitWithExitCode 2 fi @@ -366,7 +324,7 @@ function InitializeToolset { local toolset_build_proj=`cat "$toolset_location_file"` if [[ ! -a "$toolset_build_proj" ]]; then - EmitError "Invalid toolset path: $toolset_build_proj" + Write-PipelineTelemetryError -category 'Build' "Invalid toolset path: $toolset_build_proj" ExitWithExitCode 3 fi @@ -393,6 +351,18 @@ function MSBuild { if [[ "$pipelines_log" == true ]]; then InitializeBuildTool InitializeToolset + + # Work around issues with Azure Artifacts credential provider + # https://github.com/dotnet/arcade/issues/3932 + if [[ "$ci" == true ]]; then + "$_InitializeBuildTool" nuget locals http-cache -c + + export NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS=20 + export NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS=20 + Write-PipelineSetVariable -name "NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS" -value "20" + Write-PipelineSetVariable -name "NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS" -value "20" + fi + local toolset_dir="${_InitializeToolset%/*}" local logger_path="$toolset_dir/$_InitializeBuildToolFramework/Microsoft.DotNet.Arcade.Sdk.dll" args=( "${args[@]}" "-logger:$logger_path" ) @@ -404,12 +374,12 @@ function MSBuild { function MSBuild-Core { if [[ "$ci" == true ]]; then if [[ "$binary_log" != true ]]; then - EmitError "Binary log must be enabled in CI build." + Write-PipelineTelemetryError -category 'Build' "Binary log must be enabled in CI build." ExitWithExitCode 1 fi if [[ "$node_reuse" == true ]]; then - EmitError "Node reuse must be disabled in CI build." + Write-PipelineTelemetryError -category 'Build' "Node reuse must be disabled in CI build." ExitWithExitCode 1 fi fi @@ -423,7 +393,7 @@ function MSBuild-Core { "$_InitializeBuildTool" "$_InitializeBuildToolCommand" /m /nologo /clp:Summary /v:$verbosity /nr:$node_reuse $warnaserror_switch /p:TreatWarningsAsErrors=$warn_as_error /p:ContinuousIntegrationBuild=$ci "$@" || { local exit_code=$? - EmitError "Build failed (exit code '$exit_code')." + Write-PipelineTelemetryError -category 'Build' "Build failed (exit code '$exit_code')." ExitWithExitCode $exit_code } } @@ -431,6 +401,8 @@ function MSBuild-Core { ResolvePath "${BASH_SOURCE[0]}" _script_dir=`dirname "$_ResolvePath"` +. "$_script_dir/pipeline-logging-functions.sh" + eng_root=`cd -P "$_script_dir/.." && pwd` repo_root=`cd -P "$_script_dir/../.." && pwd` artifacts_dir="$repo_root/artifacts" @@ -457,7 +429,23 @@ mkdir -p "$toolset_dir" mkdir -p "$temp_dir" mkdir -p "$log_dir" -if [[ $ci == true ]]; then - export TEMP="$temp_dir" - export TMP="$temp_dir" +Write-PipelineSetVariable -name "Artifacts" -value "$artifacts_dir" +Write-PipelineSetVariable -name "Artifacts.Toolset" -value "$toolset_dir" +Write-PipelineSetVariable -name "Artifacts.Log" -value "$log_dir" +Write-PipelineSetVariable -name "Temp" -value "$temp_dir" +Write-PipelineSetVariable -name "TMP" -value "$temp_dir" + +# Import custom tools configuration, if present in the repo. +if [ -z "${disable_configure_toolset_import:-}" ]; then + configure_toolset_script="$eng_root/configure-toolset.sh" + if [[ -a "$configure_toolset_script" ]]; then + . "$configure_toolset_script" + fi +fi + +# TODO: https://github.com/dotnet/arcade/issues/1468 +# Temporary workaround to avoid breaking change. +# Remove once repos are updated. +if [[ -n "${useInstalledDotNetCli:-}" ]]; then + use_installed_dotnet_cli="$useInstalledDotNetCli" fi diff --git a/eng/install-test-runtimes.ps1 b/eng/install-test-runtimes.ps1 deleted file mode 100644 index ecde1064ab..0000000000 --- a/eng/install-test-runtimes.ps1 +++ /dev/null @@ -1,99 +0,0 @@ -[cmdletbinding()] -param( - [string]$DotNetDir, - [string]$TempDir, - [string]$BuildArch, - [switch]$DailyTest, - [string]$Branch="master", - [string]$UncachedFeed="https://dotnetcli.blob.core.windows.net/dotnet" -) - -Set-StrictMode -Version Latest -$ErrorActionPreference="Stop" - -function Get-Latest-Version([string]$channel, [string]$runtime = "", [bool]$coherent = $false) { - - $VersionFileUrl = $null - if ($runtime -eq "dotnet") { - $VersionFileUrl = "$UncachedFeed/Runtime/$channel/latest.version" - } - elseif ($runtime -eq "aspnetcore") { - $VersionFileUrl = "$UncachedFeed/aspnetcore/Runtime/$channel/latest.version" - } - elseif ($runtime -eq "") { - if ($coherent) { - $VersionFileUrl = "$UncachedFeed/Sdk/$Channel/latest.coherent.version" - } - else { - $VersionFileUrl = "$UncachedFeed/Sdk/$Channel/latest.version" - } - } - else { - throw "Invalid value for $runtime" - } - - $VersionFile = Join-Path -Path $TempDir latest.version - - try { - Invoke-WebRequest $VersionFileUrl -OutFile $VersionFile - } - catch { - return "" - } - - if (Test-Path $VersionFile) { - $VersionText = cat $VersionFile - $Data = @($VersionText.Split([char[]]@(), [StringSplitOptions]::RemoveEmptyEntries)); - return $Data[1].Trim() - } - - return "" -} - -$ConfigFile = Join-Path -Path $DotNetDir Debugger.Tests.Versions.txt - -$RuntimeVersion21="2.1.12" -$AspNetCoreVersion21="2.1.12" -$RuntimeVersion30="3.0.0" -$AspNetCoreVersion30="3.0.0" -$RuntimeVersion31="3.1.0" -$AspNetCoreVersion31="3.1.0" -$RuntimeVersionLatest="" -$AspNetCoreVersionLatest="" - -$DailyTestText="true" -if (!$DailyTest) { - $DailyTestText="false" -} - -# Get the latest runtime versions for master and create a config file containing it -try { - $RuntimeVersionLatest = Get-Latest-Version $Branch dotnet - $AspNetCoreVersionLatest = Get-Latest-Version $Branch aspnetcore - Write-Host "Latest $Branch runtime: $RuntimeVersionLatest aspnetcore: $AspNetCoreVersionLatest" -} -catch { - Write-Host "Could not download latest $Branch runtime version" -} - -# Install the other versions of .NET Core runtime we are going to test. 2.1.x, 3.0.x, 3.1.x and latest. -. $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersion21 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime dotnet -InstallDir $DotNetDir -. $DotNetDir\dotnet-install.ps1 -Version $AspNetCoreVersion21 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime aspnetcore -InstallDir $DotNetDir - -. $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersion31 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime dotnet -InstallDir $DotNetDir -. $DotNetDir\dotnet-install.ps1 -Version $AspNetCoreVersion31 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime aspnetcore -InstallDir $DotNetDir - -. $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersionLatest -Architecture $BuildArch -SkipNonVersionedFiles -Runtime dotnet -InstallDir $DotNetDir -. $DotNetDir\dotnet-install.ps1 -Version $AspNetCoreVersionLatest -Architecture $BuildArch -SkipNonVersionedFiles -Runtime aspnetcore -InstallDir $DotNetDir - -' - ' + $DailyTestText +' - ' + $RuntimeVersion21 + ' - ' + $AspNetCoreVersion21 + ' - ' + $RuntimeVersion30 + ' - ' + $AspNetCoreVersion30 + ' - ' + $RuntimeVersion31 + ' - ' + $AspNetCoreVersion31 + ' - ' + $RuntimeVersionLatest + ' - ' + $AspNetCoreVersionLatest + ' -' | Set-Content $ConfigFile diff --git a/eng/install-test-runtimes.sh b/eng/install-test-runtimes.sh deleted file mode 100755 index 6073b47035..0000000000 --- a/eng/install-test-runtimes.sh +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/env bash -# Copyright (c) .NET Foundation and contributors. All rights reserved. -# Licensed under the MIT license. See LICENSE file in the project root for full license information. - -dotnet_dir= -temp_dir= -build_arch= -daily_test=0 -branch="master" -uncached_feed="https://dotnetcli.blob.core.windows.net/dotnet" - -# args: -# channel - $1 -# runtime - $2 (dotnet, aspnetcore, "") -# coherent - $3 -get_latest_version_info() { - eval $invocation - - local channel="$1" - local runtime="$2" - local coherent="$3" - - local version_file="$temp_dir/latest.version" - local version_file_url=null - local version_latest="" - - if [[ "$runtime" == "dotnet" ]]; then - version_file_url="$uncached_feed/Runtime/$channel/latest.version" - elif [[ "$runtime" == "aspnetcore" ]]; then - version_file_url="$uncached_feed/aspnetcore/Runtime/$channel/latest.version" - elif [ -z "$runtime" ]; then - if [ "$coherent" = true ]; then - version_file_url="$uncached_feed/Sdk/$channel/latest.coherent.version" - else - version_file_url="$uncached_feed/Sdk/$channel/latest.version" - fi - else - echo "Invalid value for $runtime" - return 1 - fi - - # Use curl if available, otherwise use wget - if command -v curl > /dev/null; then - curl "$version_file_url" -sSL --retry 10 --create-dirs -o "$version_file" - else - wget -q -O "$version_file" "$version_file_url" - fi - - if [ -f "$version_file" ]; then - version_latest="$(cat $version_file | tail -n 1 | tr -d "\r")" - else - echo "Could not download latest runtime version file" - return 1 - fi - - echo "$version_latest" - return 0 -} - -while [ $# -ne 0 ]; do - name=$1 - case $name in - --dotnet-directory) - shift - dotnet_dir=$1 - ;; - --temp-directory) - shift - temp_dir=$1 - ;; - --architecture) - shift - build_arch=$1 - ;; - --branch) - shift - branch=$1 - ;; - --daily-test) - daily_test=1 - ;; - *) - args="$args $1" - ;; - esac - shift -done - -runtime_version_21="2.1.14" -aspnetcore_version_21="2.1.14" -runtime_version_30="3.0.0" -aspnetcore_version_30="3.0.0" -runtime_version_31="3.1.0" -aspnetcore_version_31="3.1.0" -runtime_version_latest="" -aspnetcore_version_latest="" - -config_file="$dotnet_dir/Debugger.Tests.Versions.txt" - -daily_test_text="true" -if [ $daily_test == 0 ]; then - daily_test_text="false" -fi - -runtime_version_latest="$(get_latest_version_info $branch dotnet false)" -aspnetcore_version_latest="$(get_latest_version_info $branch aspnetcore false)" -echo "Latest $branch runtime: $runtime_version_latest aspnetcore: $aspnetcore_version_latest" - -# Install the other versions of .NET Core runtime we are going to test. 2.1.x, 3.0.x, 3.1.x and latest. -bash "$dotnet_dir/dotnet-install.sh" --version "$runtime_version_21" --architecture "$build_arch" --skip-non-versioned-files --runtime dotnet --install-dir "$dotnet_dir" -bash "$dotnet_dir/dotnet-install.sh" --version "$aspnetcore_version_21" --architecture "$build_arch" --skip-non-versioned-files --runtime aspnetcore --install-dir "$dotnet_dir" - -bash "$dotnet_dir/dotnet-install.sh" --version "$runtime_version_31" --architecture "$build_arch" --skip-non-versioned-files --runtime dotnet --install-dir "$dotnet_dir" -bash "$dotnet_dir/dotnet-install.sh" --version "$aspnetcore_version_31" --architecture "$build_arch" --skip-non-versioned-files --runtime aspnetcore --install-dir "$dotnet_dir" - -bash "$dotnet_dir/dotnet-install.sh" --version "$runtime_version_latest" --architecture "$build_arch" --skip-non-versioned-files --runtime dotnet --install-dir "$dotnet_dir" -bash "$dotnet_dir/dotnet-install.sh" --version "$aspnetcore_version_latest" --architecture "$build_arch" --skip-non-versioned-files --runtime aspnetcore --install-dir "$dotnet_dir" - -echo " - $daily_test_text - $runtime_version_21 - $aspnetcore_version_21 - $runtime_version_30 - $aspnetcore_version_30 - $runtime_version_31 - $aspnetcore_version_31 - $runtime_version_latest - $aspnetcore_version_latest -" > $config_file diff --git a/global.json b/global.json index add2e1c509..43d26258cb 100644 --- a/global.json +++ b/global.json @@ -6,6 +6,6 @@ "dotnet": "3.0.100" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19309.1" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.19608.1" } } diff --git a/restore.sh b/restore.sh index 58a2abb50f..515c96906e 100755 --- a/restore.sh +++ b/restore.sh @@ -13,4 +13,4 @@ while [[ -h $source ]]; do done scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" -"$scriptroot/eng/build.sh" --restore $@ +"$scriptroot/eng/build.sh" --restore --skipmanaged --skipnative $@ diff --git a/src/Microsoft.Diagnostics.TestHelpers/BaseDebuggeeCompiler.cs b/src/Microsoft.Diagnostics.TestHelpers/BaseDebuggeeCompiler.cs index 0ab6285dd1..64ec40158c 100644 --- a/src/Microsoft.Diagnostics.TestHelpers/BaseDebuggeeCompiler.cs +++ b/src/Microsoft.Diagnostics.TestHelpers/BaseDebuggeeCompiler.cs @@ -175,7 +175,6 @@ protected static string GetDebuggeeBinaryExePath(string debuggeeBinaryDirPath, s protected static string GetLogPath(TestConfiguration config, string framework, string runtime, string debuggeeName) { - string version = config.BuildProjectMicrosoftNetCoreAppVersion; return Path.Combine(GetDotNetRootBuildDirPath(config), $"{framework}-{runtime ?? "any"}-{debuggeeName}.txt"); } diff --git a/src/Microsoft.Diagnostics.TestHelpers/CliDebuggeeCompiler.cs b/src/Microsoft.Diagnostics.TestHelpers/CliDebuggeeCompiler.cs index c843ac17ad..e33ebdacb4 100644 --- a/src/Microsoft.Diagnostics.TestHelpers/CliDebuggeeCompiler.cs +++ b/src/Microsoft.Diagnostics.TestHelpers/CliDebuggeeCompiler.cs @@ -23,7 +23,11 @@ public CliDebuggeeCompiler(TestConfiguration config, string debuggeeName) : base private static Dictionary GetBuildProperties(TestConfiguration config, string runtimeIdentifier) { Dictionary buildProperties = new Dictionary(); - buildProperties.Add("RuntimeFrameworkVersion", config.BuildProjectMicrosoftNetCoreAppVersion); + string buildProjectMicrosoftNetCoreAppVersion = config.BuildProjectMicrosoftNetCoreAppVersion; + if (!string.IsNullOrEmpty(buildProjectMicrosoftNetCoreAppVersion)) + { + buildProperties.Add("RuntimeFrameworkVersion", buildProjectMicrosoftNetCoreAppVersion); + } buildProperties.Add("BuildProjectFramework", config.BuildProjectFramework); if (runtimeIdentifier != null) { diff --git a/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt b/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt index d6d38e4297..1a57d4fd46 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt +++ b/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt @@ -1,7 +1,7 @@ netcoreapp3.0 $(RuntimeVersion31) @@ -65,7 +67,7 @@ $(RuntimeVersion30) $(RuntimeVersionLatest) - - --> - - $(RepoRootDir)/.dotnet/dotnet - --fx-version $(RuntimeFrameworkVersion) - $(RepoRootDir)/.dotnet/shared/Microsoft.NETCore.App/$(RuntimeFrameworkVersion) + $(RuntimeFrameworkVersion) + $(DotNetRoot)/shared/Microsoft.NETCore.App/$(RuntimeFrameworkVersion) + $(DotNetRoot)/shared/Microsoft.NETCore.App/$(RuntimeFrameworkVersion) $(ScriptRootDir)/lldbhelper.py + $(DotNetRoot)/dotnet + --fx-version $(FrameworkVersion) diff --git a/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt b/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt index 570ce77ea6..a6221d512b 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt +++ b/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt @@ -1,7 +1,7 @@ $(RepoRootDir)\.dotnet\dotnet.exe @@ -46,7 +49,7 @@ netcoreapp3.0 $(RuntimeVersionLatest) - - - netcoreapp3.0 - $(AspNetCoreVersionLatest) + $(RuntimeVersionLatest) + $(AspNetCoreVersionLatest) - --> - - $(RepoRootDir)\.dotnet\dotnet.exe - --fx-version $(RuntimeFrameworkVersion) - $(RepoRootDir)\.dotnet\shared\Microsoft.NETCore.App\$(RuntimeFrameworkVersion) + $(RuntimeFrameworkVersion) + $(DotNetRoot)\shared\Microsoft.NETCore.App\$(RuntimeFrameworkVersion) + $(DotNetRoot)\shared\Microsoft.NETCore.App\$(RuntimeFrameworkVersion) + $(DotNetRoot)\dotnet.exe + --fx-version $(FrameworkVersion) + + + netcoreapp2.0 false @@ -36,4 +39,5 @@ + diff --git a/src/SOS/SOS.UnitTests/SOSRunner.cs b/src/SOS/SOS.UnitTests/SOSRunner.cs index f2b245db53..a86eb1c950 100644 --- a/src/SOS/SOS.UnitTests/SOSRunner.cs +++ b/src/SOS/SOS.UnitTests/SOSRunner.cs @@ -702,6 +702,14 @@ public async Task RunScript(string scriptRelativePath) { WriteLine((j + 1).ToString().PadLeft(5) + " " + scriptLines[j]); } + try + { + await RunSosCommand("sosstatus"); + } + catch (Exception ex) + { + WriteLine("Exception executing sosstatus {0}", ex.ToString()); + } throw; } } @@ -734,16 +742,6 @@ public async Task LoadSosExtension() { commands.Add($"!SetHostRuntime {sosHostRuntime}"); } - // Because Windows triage dumps don't have the target coreclr.dll module path the - // fallback of using this target runtime for hosting SOS's managed doesn't work. - if (_dumpType.HasValue && _dumpType.Value == DumpType.Triage) - { - string hostRuntimeDir = _config.HostRuntimeDir(); - if (hostRuntimeDir != null) - { - commands.Add($"!SetHostRuntime {hostRuntimeDir}"); - } - } break; case NativeDebugger.Lldb: commands.Add($"plugin load {sosPath}"); @@ -1380,11 +1378,6 @@ public static string SOSHostRuntime(this TestConfiguration config) return TestConfiguration.MakeCanonicalPath(config.GetValue("SOSHostRuntime")); } - public static string HostRuntimeDir(this TestConfiguration config) - { - return TestConfiguration.MakeCanonicalPath(config.GetValue("HostRuntimeDir")); - } - public static bool GenerateDumpWithLLDB(this TestConfiguration config) { return config.GetValue("GenerateDumpWithLLDB")?.ToLowerInvariant() == "true"; diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/CommonHelper.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/CommonHelper.cs index d1109110fb..86f0ec197d 100644 --- a/src/tests/Microsoft.Diagnostics.NETCore.Client/CommonHelper.cs +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/CommonHelper.cs @@ -2,19 +2,18 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System; using System.IO; -using System.Reflection; using System.Runtime.InteropServices; -using Microsoft.Diagnostics.TestHelpers; - namespace Microsoft.Diagnostics.NETCore.Client { public class CommonHelper { public static string HostExe = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? - "..\\..\\..\\..\\..\\.dotnet\\dotnet.exe" : "../../../../../.dotnet/dotnet"; + (RuntimeInformation.ProcessArchitecture == Architecture.X86 ? + "..\\..\\..\\..\\..\\.dotnet\\x86\\dotnet.exe" : + "..\\..\\..\\..\\..\\.dotnet\\dotnet.exe") : + "../../../../../.dotnet/dotnet"; public static string GetTraceePath() { diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs index 7ecc0e8281..bb31623b62 100644 --- a/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs @@ -4,19 +4,12 @@ using System; using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Threading; -using System.Runtime.InteropServices; using Xunit; using Xunit.Abstractions; -using Microsoft.Diagnostics.TestHelpers; -using Microsoft.Diagnostics.NETCore.Client; - namespace Microsoft.Diagnostics.NETCore.Client { - + /// /// Suite of tests that test top-level commands /// diff --git a/test.sh b/test.sh index a33835164c..9855b2666c 100755 --- a/test.sh +++ b/test.sh @@ -13,5 +13,5 @@ while [[ -h $source ]]; do done scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" -"$scriptroot/eng/build.sh" --test $@ +"$scriptroot/eng/build.sh" --test --skipmanaged --skipnative $@ From d890cecf0bafa8ad0b99ece21f5a22bc60957849 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 14 Dec 2019 13:39:36 +0000 Subject: [PATCH 023/243] Update dependencies from https://github.com/aspnet/AspNetCore build 20191213.21 (#695) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha1.19613.21 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1220311255..1a7b99b5a5 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/core-setup c77948d92a2f950140f09384f057cb893ec3955a - + https://github.com/aspnet/AspNetCore - fde783911b0b671dc4307ef5bcb2a9bc5e4a51bf + 19d2f6124f5d04859e350d1f5a01e994e14ef1ce diff --git a/eng/Versions.props b/eng/Versions.props index f575764f7c..fbf10ae24e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) 5.0.0-alpha.1.19564.1 - 5.0.0-alpha1.19612.8 + 5.0.0-alpha1.19613.21 From 49ff7a20915ed09002b795972d47cb18423830d0 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 14 Dec 2019 18:40:26 +0000 Subject: [PATCH 024/243] Update dependencies from https://github.com/dotnet/arcade build 20191213.1 (#694) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.19613.1 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.19613.1 --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 2 +- eng/common/tools.ps1 | 28 +++++++++++++++++++++++++--- eng/common/tools.sh | 2 ++ global.json | 6 +++--- 5 files changed, 35 insertions(+), 11 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1a7b99b5a5..e5c086eb81 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,15 +4,15 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - 993af9410c505680b9a260f3bfd79515c936de12 + acd18a717ab18e484addef602e2af2b2bc4c4bd1 - + https://github.com/dotnet/arcade - 71ce4c736b882e6112b395a0e92313be5dcb4328 + acd18a717ab18e484addef602e2af2b2bc4c4bd1 https://github.com/dotnet/core-setup diff --git a/eng/Versions.props b/eng/Versions.props index fbf10ae24e..2134ee4093 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -41,7 +41,7 @@ 4.5.3 2.4.1 2.0.3 - 5.0.0-beta.19562.5 + 5.0.0-beta.19613.1 10.0.18362 diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index d762c9f044..09c3a3325e 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -98,7 +98,7 @@ function Exec-Process([string]$command, [string]$commandArgs) { } } -function InitializeDotNetCli([bool]$install) { +function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { if (Test-Path variable:global:_DotNetInstallDir) { return $global:_DotNetInstallDir } @@ -146,6 +146,22 @@ function InitializeDotNetCli([bool]$install) { } $env:DOTNET_INSTALL_DIR = $dotnetRoot + + if ($createSdkLocationFile) { + # Create a temporary file under the toolset dir and rename it to sdk.txt to avoid races. + do { + $sdkCacheFileTemp = Join-Path $ToolsetDir $([System.IO.Path]::GetRandomFileName()) + } + until (!(Test-Path $sdkCacheFileTemp)) + Set-Content -Path $sdkCacheFileTemp -Value $dotnetRoot + + try { + Rename-Item -Force -Path $sdkCacheFileTemp 'sdk.txt' + } catch { + # Somebody beat us + Remove-Item -Path $sdkCacheFileTemp + } + } } # Add dotnet to PATH. This prevents any bare invocation of dotnet in custom @@ -216,7 +232,10 @@ function InstallDotNet([string] $dotnetRoot, } catch { Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Failed to install dotnet runtime '$runtime' from custom location '$runtimeSourceFeed'." + ExitWithExitCode 1 } + } else { + ExitWithExitCode 1 } } } @@ -274,8 +293,11 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = $vsMajorVersion = $vsMinVersion.Major $xcopyMSBuildVersion = "$vsMajorVersion.$($vsMinVersion.Minor).0-alpha" } - - $vsInstallDir = InitializeXCopyMSBuild $xcopyMSBuildVersion $install + + $vsInstallDir = $null + if ($xcopyMSBuildVersion.Trim() -ine "none") { + $vsInstallDir = InitializeXCopyMSBuild $xcopyMSBuildVersion $install + } if ($vsInstallDir -eq $null) { throw 'Unable to find Visual Studio that has required version and components installed' } diff --git a/eng/common/tools.sh b/eng/common/tools.sh index f58db5e25d..e071af4ee4 100644 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -211,6 +211,8 @@ function InstallDotNet { Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to install dotnet SDK from custom location '$runtimeSourceFeed' (exit code '$exit_code')." ExitWithExitCode $exit_code } + else + ExitWithExitCode $exit_code fi fi } diff --git a/global.json b/global.json index 43d26258cb..02300a96d3 100644 --- a/global.json +++ b/global.json @@ -1,11 +1,11 @@ { "sdk": { - "version": "3.0.100" + "version": "3.0.101" }, "tools": { - "dotnet": "3.0.100" + "dotnet": "3.0.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.19608.1" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.19613.1" } } From 19eb4436659d024631fc66d323de673bbd223afe Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Sat, 14 Dec 2019 15:29:42 -0800 Subject: [PATCH 025/243] Fix various issues (#690) Issue: https://github.com/dotnet/diagnostics/issues/673 SymbolReader doesn't support UNC symbol paths. Issue: https://github.com/dotnet/diagnostics/issues/674 Add -all gcroot option to docs. Issue: https://github.com/dotnet/diagnostics/issues/632 Better doc clrstack -all and other options. Issue: https://github.com/dotnet/diagnostics/issues/576 Doc RHEL lldb install. Issue: https://github.com/dotnet/diagnostics/issues/483 Add setclrpath command to dotnet-dump on linux. Mentioned in https://github.com/dotnet/diagnostics/issues/624 Issue: https://github.com/dotnet/diagnostics/issues/590 Add -timeout option to SetSymbolServer command. Issue: https://github.com/dotnet/diagnostics/issues/602 Use CommandPlatform on Windows specific commands Don't use the desktop clr to host SOS managed code. Don't allow dumplog on desktop clr target. Cleanup SOSHost "is runtime" checks. Removed unneeded install of the x86 SDK in InstallRuntimes.proj Fix SOS on Windows where it needs to download the DAC but the symbol server store was never initialized from the .sympath. This is even more important when both coreclr and desktop clr are loaded in the process/minidump. Update to 3.0.1 runtime version --- documentation/lldb/linux-instructions.md | 2 +- .../sos-debugging-extension-windows.md | 4 +- documentation/sos-debugging-extension.md | 4 +- eng/InstallRuntimes.proj | 4 - eng/Versions.props | 6 +- .../AnalyzeContext.cs | 5 ++ .../Command/Attributes.cs | 29 ++++++- .../Command/CommandProcessor.cs | 31 +++++++- src/SOS/SOS.Hosting/LLDBServices.cs | 14 ++-- src/SOS/SOS.Hosting/SOSHost.cs | 38 +++++----- src/SOS/SOS.NETCore/SymbolReader.cs | 76 +++++++++++++------ src/SOS/Strike/hostcoreclr.cpp | 65 ++++++++++------ src/SOS/Strike/hostcoreclr.h | 15 +++- src/SOS/Strike/sosdocs.txt | 8 +- src/SOS/Strike/sosdocsunix.txt | 10 ++- src/SOS/Strike/strike.cpp | 12 ++- src/SOS/lldbplugin.tests/t_cmd_pe.py | 2 +- src/Tools/dotnet-dump/Analyzer.cs | 14 +++- src/Tools/dotnet-dump/Commands/SOSCommand.cs | 16 +++- .../Commands/SOSCommandForWindows.cs | 27 ------- .../dotnet-dump/Commands/SetClrPathCommand.cs | 32 ++++++++ src/inc/palclr.h | 4 +- 22 files changed, 282 insertions(+), 136 deletions(-) delete mode 100644 src/Tools/dotnet-dump/Commands/SOSCommandForWindows.cs create mode 100644 src/Tools/dotnet-dump/Commands/SetClrPathCommand.cs diff --git a/documentation/lldb/linux-instructions.md b/documentation/lldb/linux-instructions.md index 7f03c52e62..42abe78783 100644 --- a/documentation/lldb/linux-instructions.md +++ b/documentation/lldb/linux-instructions.md @@ -193,7 +193,7 @@ To launch lldb: #### RHEL 7.5 #### -[TBD] +See [LLDB](https://access.redhat.com/documentation/en-us/red_hat_developer_tools/2018.2/html/using_clang_and_llvm_toolset/chap-lldb) on RedHat's web site. #### SLES #### diff --git a/documentation/sos-debugging-extension-windows.md b/documentation/sos-debugging-extension-windows.md index 57100dff28..bf9e38427f 100644 --- a/documentation/sos-debugging-extension-windows.md +++ b/documentation/sos-debugging-extension-windows.md @@ -71,7 +71,7 @@ Type `!help ` for detailed info on that function. |-------------|-----------------| |**AnalyzeOOM** (**ao**)|Displays the information for the last out of memory (OOM) that occurred on an allocation request to the garbage collection heap. (In server garbage collection, it displays OOM, if any, on each garbage collection heap.)| |**BPMD** (**bpmd**) [**-nofuturemodule**] [\<*module name*> \<*method name*>] [**-md** <`MethodDesc`>] **-list** **-clear** \<*pending breakpoint number*> **-clearall**|Creates a breakpoint at the specified method in the specified module.

If the specified module and method have not been loaded, this command waits for a notification that the module was loaded and just-in-time (JIT) compiled before creating a breakpoint.

You can manage the list of pending breakpoints by using the **-list**, **-clear**, and **-clearall** options:

The **-list** option generates a list of all the pending breakpoints. If a pending breakpoint has a non-zero module ID, that breakpoint is specific to a function in that particular loaded module. If the pending breakpoint has a zero module ID, that breakpoint applies to modules that have not yet been loaded.

Use the **-clear** or **-clearall** option to remove pending breakpoints from the list.| -|**CLRStack** [**-a**] [**-l**] [**-p**] [**-n**]|Provides a stack trace of managed code only.

The **-p** option shows arguments to the managed function.

The **-l** option shows information on local variables in a frame. The SOS Debugging Extension cannot retrieve local names, so the output for local names is in the format \<*local address*> **=** \<*value*>.

The **-a**(all) option is a shortcut for **-l** and **-p** combined.

The **-n** option disables the display of source file names and line numbers. If the debugger has the option SYMOPT_LOAD_LINES specified, SOS will look up the symbols for every managed frame and if successful will display the corresponding source file name and line number. The **-n** (No line numbers) parameter can be specified to disable this behavior.

The SOS Debugging Extension does not display transition frames on x64 and IA-64-based platforms.| +|**CLRStack** [**-a**] [**-l**] [**-p**] [**-n**] [**-f**] [**-r**] [**-all**]|Provides a stack trace of managed code only.

The **-p** option shows arguments to the managed function.

The **-l** option shows information on local variables in a frame. The SOS Debugging Extension cannot retrieve local names, so the output for local names is in the format \<*local address*> **=** \<*value*>.

The **-a** option is a shortcut for **-l** and **-p** combined.

The **-n** option disables the display of source file names and line numbers. If the debugger has the option SYMOPT_LOAD_LINES specified, SOS will look up the symbols for every managed frame and if successful will display the corresponding source file name and line number. The **-n** (No line numbers) parameter can be specified to disable this behavior.

The **-f** option (full mode) displays the native frames intermixing them with the managed frames and the assembly name and function offset for the managed frames.

The **-r** option dumps the registers for each stack frame.

The **-all** option dumps all the managed threads' stacks.| |**COMState**|Lists the COM apartment model for each thread and a `Context` pointer, if available.| |**DumpArray** [**-start** \<*startIndex*>] [**-length** \<*length*>] [**-details**] [**-nofields**] \<*array object address*>

-or-

**DA** [**-start** \<*startIndex*>] [**-length** \<*length*>] [**-detail**] [**-nofields**] *array object address*>|Examines elements of an array object.

The **-start** option specifies the starting index at which to display elements.

The **-length** option specifies how many elements to show.

The **-details** option displays details of the element using the **DumpObj** and **DumpVC** formats.

The **-nofields** option prevents arrays from displaying. This option is available only when the **-detail** option is specified.| |**DumpAssembly** \<*assembly address*>|Displays information about an assembly.

The **DumpAssembly** command lists multiple modules, if they exist.

You can get an assembly address by using the **DumpDomain** command.| @@ -101,7 +101,7 @@ Type `!help ` for detailed info on that function. |**GCHandles** [**-perdomain**]|Displays statistics about garbage collector handles in the process.

The **-perdomain** option arranges the statistics by application domain.

Use the **GCHandles** command to find memory leaks caused by garbage collector handle leaks. For example, a memory leak occurs when code retains a large array because a strong garbage collector handle still points to it, and the handle is discarded without freeing it.| |**GCHandleLeaks**|Searches memory for any references to strong and pinned garbage collector handles in the process and displays the results. If a handle is found, the **GCHandleLeaks** command displays the address of the reference. If a handle is not found in memory, this command displays a notification.| |**GCInfo** \<*MethodDesc address*>\<*Code address*>|Displays data that indicates when registers or stack locations contain managed objects. If a garbage collection occurs, the collector must know the locations of references to objects so it can update them with new object pointer values.| -|**GCRoot** [**-nostacks**] \<*Object address*>|Displays information about references (or roots) to an object at the specified address.

The **GCRoot** command examines the entire managed heap and the handle table for handles within other objects and handles on the stack. Each stack is then searched for pointers to objects, and the finalizer queue is also searched.

This command does not determine whether a stack root is valid or is discarded. Use the **CLRStack** and **U** commands to disassemble the frame that the local or argument value belongs to in order to determine if the stack root is still in use.

The **-nostacks** option restricts the search to garbage collector handles and freachable objects.| +|**GCRoot** [**-nostacks**] [**-all**] \<*Object address*>|Displays information about references (or roots) to an object at the specified address.

The **GCRoot** command examines the entire managed heap and the handle table for handles within other objects and handles on the stack. Each stack is then searched for pointers to objects, and the finalizer queue is also searched.

This command does not determine whether a stack root is valid or is discarded. Use the **CLRStack** and **U** commands to disassemble the frame that the local or argument value belongs to in order to determine if the stack root is still in use.

The **-nostacks** option restricts the search to garbage collector handles and reachable objects.

The **-all** option forces all roots to be displayed instead of just the unique roots.| |**GCWhere** *\*|Displays the location and size in the garbage collection heap of the argument passed in. When the argument lies in the managed heap but is not a valid object address, the size is displayed as 0 (zero).| |**Help** (**soshelp**) [\<*command*>] [`faq`]|Displays all available commands when no parameter is specified, or displays detailed help information about the specified command.

The `faq` parameter displays answers to frequently asked questions.| |**HeapStat** [**-inclUnrooted** | **-iu**]|Displays the generation sizes for each heap and the total free space in each generation on each heap. If the -**inclUnrooted** option is specified, the report includes information about the managed objects from the garbage collection heap that is no longer rooted.| diff --git a/documentation/sos-debugging-extension.md b/documentation/sos-debugging-extension.md index d47bb99d65..28f1b75b1b 100644 --- a/documentation/sos-debugging-extension.md +++ b/documentation/sos-debugging-extension.md @@ -72,7 +72,7 @@ importance. Shortcut names for popular functions are listed in parenthesis. Type |Command|Description| |-------------|-----------------| |**bpmd** [**-nofuturemodule**] [\<*module name*> \<*method name*>] [**-md** <`MethodDesc`>] **-list** **-clear** \<*pending breakpoint number*> **-clearall**|Creates a breakpoint at the specified method in the specified module.

If the specified module and method have not been loaded, this command waits for a notification that the module was loaded and just-in-time (JIT) compiled before creating a breakpoint.

You can manage the list of pending breakpoints by using the **-list**, **-clear**, and **-clearall** options:

The **-list** option generates a list of all the pending breakpoints. If a pending breakpoint has a non-zero module ID, that breakpoint is specific to a function in that particular loaded module. If the pending breakpoint has a zero module ID, that breakpoint applies to modules that have not yet been loaded.

Use the **-clear** or **-clearall** option to remove pending breakpoints from the list.| -|**ClrStack** (**clrstack**) [**-a**] [**-l**] [**-p**] [**-n**]|Provides a stack trace of managed code only.

The **-p** option shows arguments to the managed function.

The **-l** option shows information on local variables in a frame. The SOS Debugging Extension cannot retrieve local names, so the output for local names is in the format \<*local address*> **=** \<*value*>.

The **-a**(all) option is a shortcut for **-l** and **-p** combined.

The **-n** option disables the display of source file names and line numbers. If the debugger has the option SYMOPT_LOAD_LINES specified, SOS will look up the symbols for every managed frame and if successful will display the corresponding source file name and line number. The **-n** (No line numbers) parameter can be specified to disable this behavior.

The SOS Debugging Extension does not display transition frames on x64 and IA-64-based platforms.| +|**CLRStack** [**-a**] [**-l**] [**-p**] [**-n**] [**-f**] [**-r**] [**-all**]|Provides a stack trace of managed code only.

The **-p** option shows arguments to the managed function.

The **-l** option shows information on local variables in a frame. The SOS Debugging Extension cannot retrieve local names, so the output for local names is in the format \<*local address*> **=** \<*value*>.

The **-a** option is a shortcut for **-l** and **-p** combined.

The **-n** option disables the display of source file names and line numbers. If the debugger has the option SYMOPT_LOAD_LINES specified, SOS will look up the symbols for every managed frame and if successful will display the corresponding source file name and line number. The **-n** (No line numbers) parameter can be specified to disable this behavior.

The **-f** option (full mode) displays the native frames intermixing them with the managed frames and the assembly name and function offset for the managed frames.

The **-r** option dumps the registers for each stack frame.

The **-all** option dumps all the managed threads' stacks.| |**DumpArray** [**-start** \<*startIndex*>] [**-length** \<*length*>] [**-details**] [**-nofields**] \<*array object address*>

-or-

**DA** [**-start** \<*startIndex*>] [**-length** \<*length*>] [**-detail**] [**-nofields**] *array object address*>|Examines elements of an array object.

The **-start** option specifies the starting index at which to display elements.

The **-length** option specifies how many elements to show.

The **-details** option displays details of the element using the **DumpObj** and **DumpVC** formats.

The **-nofields** option prevents arrays from displaying. This option is available only when the **-detail** option is specified.| |**DumpAsync** (**dumpasync**) [**-mt** \<*MethodTable address*>] [**-type** \<*partial type name*>] [**-waiting**] [**-roots**]|DumpAsync traverses the garbage collected heap, looking for objects representing async state machines as created when an async method's state is transferred to the heap. This command recognizes async state machines defined as `async void`, `async Task`, `async Task`, `async ValueTask`, and `async ValueTask`.

The output includes a block of details for each async state machine object found. These details include:
- a line for the type of the async state machine object, including its MethodTable address, its object address, its size, and its type name.
- a line for the state machine type name as contained in the object.
- a listing of each field on the state machine.
- a line for a continuation from this state machine object, if one or more has been registered.
- discovered GC roots for this async state machine object.
| |**DumpAssembly** \<*assembly address*>|Displays information about an assembly.

The **DumpAssembly** command lists multiple modules, if they exist.

You can get an assembly address by using the **DumpDomain** command.| @@ -97,7 +97,7 @@ importance. Shortcut names for popular functions are listed in parenthesis. Type |**FAQ**|Displays frequently asked questions.| |**FindAppDomain** \<*Object address*>|Determines the application domain of an object at the specified address.| |**GCInfo** \<*MethodDesc address*>\<*Code address*>|Displays data that indicates when registers or stack locations contain managed objects. If a garbage collection occurs, the collector must know the locations of references to objects so it can update them with new object pointer values.| -|**GCRoot** [**-nostacks**] \<*Object address*>|Displays information about references (or roots) to an object at the specified address.

The **GCRoot** command examines the entire managed heap and the handle table for handles within other objects and handles on the stack. Each stack is then searched for pointers to objects, and the finalizer queue is also searched.

This command does not determine whether a stack root is valid or is discarded. Use the **clrstack** and **U** commands to disassemble the frame that the local or argument value belongs to in order to determine if the stack root is still in use.

The **-nostacks** option restricts the search to garbage collector handles and freachable objects.| +|**GCRoot** [**-nostacks**] [**-all**] \<*Object address*>|Displays information about references (or roots) to an object at the specified address.

The **GCRoot** command examines the entire managed heap and the handle table for handles within other objects and handles on the stack. Each stack is then searched for pointers to objects, and the finalizer queue is also searched.

This command does not determine whether a stack root is valid or is discarded. Use the **clrstack** and **U** commands to disassemble the frame that the local or argument value belongs to in order to determine if the stack root is still in use.

The **-nostacks** option restricts the search to garbage collector handles and reachable objects.

The **-all** option forces all roots to be displayed instead of just the unique roots.| |**GCWhere** *\*|Displays the location and size in the garbage collection heap of the argument passed in. When the argument lies in the managed heap but is not a valid object address, the size is displayed as 0 (zero).| |**Help** (**soshelp**) [\<*command*>] [`faq`]|Displays all available commands when no parameter is specified, or displays detailed help information about the specified command.

The `faq` parameter displays answers to frequently asked questions.| |**HistClear**|Releases any resources used by the family of `Hist` commands.

Generally, you do not have to explicitly call `HistClear`, because each `HistInit` cleans up the previous resources.| diff --git a/eng/InstallRuntimes.proj b/eng/InstallRuntimes.proj index 06cda8c6db..0e86ebdb38 100644 --- a/eng/InstallRuntimes.proj +++ b/eng/InstallRuntimes.proj @@ -56,10 +56,6 @@ Condition="$([MSBuild]::IsOsPlatform(Windows))" Inputs="$(VersionsPropsPath)" Outputs="$(TestConfigFileName)"> - - - diff --git a/eng/Versions.props b/eng/Versions.props index 2134ee4093..a26afed09e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -8,12 +8,10 @@ true - - 3.0.100 2.1.12 $(MicrosoftNETCoreApp21Version) - 3.0.0 + 3.0.1 $(MicrosoftNETCoreApp30Version) 3.1.0 $(MicrosoftNETCoreApp31Version) @@ -33,7 +31,7 @@ 4.3.0 1.0.55801 - 1.1.46104 + 1.1.57004 1.7.0 2.0.44 0.3.0-alpha.19602.1 diff --git a/src/Microsoft.Diagnostics.DebugServices/AnalyzeContext.cs b/src/Microsoft.Diagnostics.DebugServices/AnalyzeContext.cs index e1f4e27b80..80f7b15bf2 100644 --- a/src/Microsoft.Diagnostics.DebugServices/AnalyzeContext.cs +++ b/src/Microsoft.Diagnostics.DebugServices/AnalyzeContext.cs @@ -24,5 +24,10 @@ public AnalyzeContext() /// Cancellation token for current command /// public CancellationToken CancellationToken { get; set; } + + /// + /// Directory of the runtime module (coreclr.dll, libcoreclr.so, etc.) + /// + public string RuntimeModuleDirectory { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.Diagnostics.Repl/Command/Attributes.cs b/src/Microsoft.Diagnostics.Repl/Command/Attributes.cs index 2264e6241d..5690cb2e6c 100644 --- a/src/Microsoft.Diagnostics.Repl/Command/Attributes.cs +++ b/src/Microsoft.Diagnostics.Repl/Command/Attributes.cs @@ -7,7 +7,19 @@ namespace Microsoft.Diagnostics.Repl { /// - /// Base command option attribute. + /// OS Platforms to add command + /// + [Flags] + public enum CommandPlatform : byte + { + All = 0x00, + Windows = 0x01, + Linux = 0x02, + OSX = 0x04, + } + + /// + /// Base command, option and argument class. /// public class BaseAttribute : Attribute { @@ -22,11 +34,22 @@ public class BaseAttribute : Attribute public string Help; } + /// + /// Base command and command alias class. + /// + public class CommandBaseAttribute : BaseAttribute + { + /// + /// Optional OS platform for the command + /// + public CommandPlatform Platform = CommandPlatform.All; + } + /// /// Marks the class as a Command. /// [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] - public class CommandAttribute : BaseAttribute + public class CommandAttribute : CommandBaseAttribute { /// /// Sets the value of the CommandBase.AliasExpansion when the command is executed. @@ -38,7 +61,7 @@ public class CommandAttribute : BaseAttribute /// Adds an alias to the previous command attribute /// [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] - public class CommandAliasAttribute : BaseAttribute + public class CommandAliasAttribute : CommandBaseAttribute { } diff --git a/src/Microsoft.Diagnostics.Repl/Command/CommandProcessor.cs b/src/Microsoft.Diagnostics.Repl/Command/CommandProcessor.cs index 4a2791e17d..d66fe92411 100644 --- a/src/Microsoft.Diagnostics.Repl/Command/CommandProcessor.cs +++ b/src/Microsoft.Diagnostics.Repl/Command/CommandProcessor.cs @@ -10,6 +10,7 @@ using System.Diagnostics; using System.Linq; using System.Reflection; +using System.Runtime.InteropServices; using System.Threading.Tasks; namespace Microsoft.Diagnostics.Repl @@ -114,7 +115,7 @@ private void BuildCommands(CommandLineBuilder rootBuilder, Type type) var baseAttributes = (BaseAttribute[])type.GetCustomAttributes(typeof(BaseAttribute), inherit: false); foreach (BaseAttribute baseAttribute in baseAttributes) { - if (baseAttribute is CommandAttribute commandAttribute) + if (baseAttribute is CommandAttribute commandAttribute && IsValidPlatform(commandAttribute)) { command = new Command(commandAttribute.Name, commandAttribute.Help); var properties = new List<(PropertyInfo, Option)>(); @@ -167,9 +168,10 @@ private void BuildCommands(CommandLineBuilder rootBuilder, Type type) rootBuilder.AddCommand(command); } - if (baseAttribute is CommandAliasAttribute commandAliasAttribute) + if (baseAttribute is CommandAliasAttribute commandAliasAttribute && IsValidPlatform(commandAliasAttribute)) { - if (command == null) { + if (command == null) + { throw new ArgumentException($"No previous CommandAttribute for this CommandAliasAttribute: {type.Name}"); } command.AddAlias(commandAliasAttribute.Name); @@ -189,6 +191,29 @@ private T GetService() return service; } + /// + /// Returns true if the command should be added. + /// + private static bool IsValidPlatform(CommandBaseAttribute attribute) + { + if (attribute.Platform != CommandPlatform.All) + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return (attribute.Platform & CommandPlatform.Windows) != 0; + } + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + return (attribute.Platform & CommandPlatform.Linux) != 0; + } + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + return (attribute.Platform & CommandPlatform.OSX) != 0; + } + } + return true; + } + private static string BuildAlias(string parameterName) { if (string.IsNullOrWhiteSpace(parameterName)) { diff --git a/src/SOS/SOS.Hosting/LLDBServices.cs b/src/SOS/SOS.Hosting/LLDBServices.cs index 554b43b3fb..8a3361f938 100644 --- a/src/SOS/SOS.Hosting/LLDBServices.cs +++ b/src/SOS/SOS.Hosting/LLDBServices.cs @@ -92,13 +92,17 @@ public LLDBServices(SOSHost soshost) string GetCoreClrDirectory( IntPtr self) { - foreach (ModuleInfo module in _soshost.DataReader.EnumerateModules()) + if (_soshost.AnalyzeContext.RuntimeModuleDirectory == null) { - if (SOSHost.IsRuntimeModule(module)) { - return Path.GetDirectoryName(module.FileName) + Path.DirectorySeparatorChar; + foreach (ModuleInfo module in _soshost.DataReader.EnumerateModules()) + { + if (SOSHost.IsCoreClrRuntimeModule(module)) + { + _soshost.AnalyzeContext.RuntimeModuleDirectory = Path.GetDirectoryName(module.FileName) + Path.DirectorySeparatorChar; + } } } - return null; + return _soshost.AnalyzeContext.RuntimeModuleDirectory; } int VirtualUnwind( @@ -175,7 +179,7 @@ int LoadNativeSymbols2( { if (runtimeOnly) { - if (SOSHost.IsRuntimeModule(module)) + if (SOSHost.IsCoreClrRuntimeModule(module)) { callback(IntPtr.Zero, module.FileName, module.ImageBase, unchecked((int)module.FileSize)); break; diff --git a/src/SOS/SOS.Hosting/SOSHost.cs b/src/SOS/SOS.Hosting/SOSHost.cs index b6792a4ea8..f30e710e27 100644 --- a/src/SOS/SOS.Hosting/SOSHost.cs +++ b/src/SOS/SOS.Hosting/SOSHost.cs @@ -6,17 +6,12 @@ using Microsoft.Diagnostics.Runtime; using Microsoft.Diagnostics.Runtime.Interop; using Microsoft.Diagnostics.Runtime.Utilities; -using Microsoft.SymbolStore; -using Microsoft.SymbolStore.KeyGenerators; using System; -using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; -using System.Reflection.Metadata; -using System.Reflection.PortableExecutable; using System.Runtime.InteropServices; using System.Text; @@ -61,6 +56,7 @@ private delegate bool InitializeSymbolStoreDelegate( bool symweb, string tempDirectory, string symbolServerPath, + int timeoutInMintues, string symbolCachePath, string symbolDirectoryPath, string windowsSymbolPath); @@ -155,13 +151,13 @@ struct SOSNetCoreCallbacks GetExpressionDelegate = SOSHost.GetExpression, }; - internal readonly IDataReader DataReader; - const string DesktopRuntimeModuleName = "clr"; private static readonly string s_coreclrModuleName; - private readonly AnalyzeContext _analyzeContext; + internal readonly IDataReader DataReader; + internal readonly AnalyzeContext AnalyzeContext; + private readonly RegisterService _registerService; private readonly MemoryService _memoryService; private readonly IConsoleService _console; @@ -203,7 +199,7 @@ public SOSHost(IServiceProvider serviceProvider) DataTarget dataTarget = serviceProvider.GetService(); DataReader = dataTarget.DataReader; _console = serviceProvider.GetService(); - _analyzeContext = serviceProvider.GetService(); + AnalyzeContext = serviceProvider.GetService(); _memoryService = serviceProvider.GetService(); _registerService = serviceProvider.GetService(); _versionCache = new ReadVirtualCache(_memoryService); @@ -343,7 +339,7 @@ internal static UIntPtr GetExpression( internal int GetInterrupt( IntPtr self) { - return _analyzeContext.CancellationToken.IsCancellationRequested ? S_OK : E_FAIL; + return AnalyzeContext.CancellationToken.IsCancellationRequested ? S_OK : E_FAIL; } internal int OutputVaList( @@ -877,7 +873,7 @@ internal int GetThreadContext( IntPtr context, uint contextSize) { - uint threadId = (uint)_analyzeContext.CurrentThreadId; + uint threadId = (uint)AnalyzeContext.CurrentThreadId; byte[] registerContext = _registerService.GetThreadContext(threadId); if (registerContext == null) { return E_FAIL; @@ -934,7 +930,7 @@ internal int GetCurrentThreadId( IntPtr self, out uint id) { - return GetThreadIdBySystemId(self, (uint)_analyzeContext.CurrentThreadId, out id); + return GetThreadIdBySystemId(self, (uint)AnalyzeContext.CurrentThreadId, out id); } internal int SetCurrentThreadId( @@ -944,7 +940,7 @@ internal int SetCurrentThreadId( try { unchecked { - _analyzeContext.CurrentThreadId = (int)DataReader.EnumerateAllThreads().ElementAt((int)id); + AnalyzeContext.CurrentThreadId = (int)DataReader.EnumerateAllThreads().ElementAt((int)id); } } catch (ArgumentOutOfRangeException) @@ -958,7 +954,7 @@ internal int GetCurrentThreadSystemId( IntPtr self, out uint sysId) { - sysId = (uint)_analyzeContext.CurrentThreadId; + sysId = (uint)AnalyzeContext.CurrentThreadId; return S_OK; } @@ -1014,7 +1010,7 @@ internal unsafe int GetCurrentThreadTeb( IntPtr self, ulong* offset) { - uint threadId = (uint)_analyzeContext.CurrentThreadId; + uint threadId = (uint)AnalyzeContext.CurrentThreadId; ulong teb = DataReader.GetThreadTeb(threadId); Write(offset, teb); return S_OK; @@ -1102,21 +1098,23 @@ internal int GetRegister( int index, out ulong value) { - uint threadId = (uint)_analyzeContext.CurrentThreadId; + uint threadId = (uint)AnalyzeContext.CurrentThreadId; if (!_registerService.GetRegisterValue(threadId, index, out value)) { return E_FAIL; } return S_OK; } - internal static bool IsRuntimeModule(ModuleInfo module) + internal static bool IsCoreClrRuntimeModule(ModuleInfo module) { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && IsModuleEqual(module, DesktopRuntimeModuleName)) { - return true; - } return IsModuleEqual(module, s_coreclrModuleName); } + internal static bool IsDesktopRuntimeModule(ModuleInfo module) + { + return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && IsModuleEqual(module, DesktopRuntimeModuleName); + } + internal static bool IsModuleEqual(ModuleInfo module, string moduleName) { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { diff --git a/src/SOS/SOS.NETCore/SymbolReader.cs b/src/SOS/SOS.NETCore/SymbolReader.cs index dde3a65838..a345efbce2 100644 --- a/src/SOS/SOS.NETCore/SymbolReader.cs +++ b/src/SOS/SOS.NETCore/SymbolReader.cs @@ -172,15 +172,25 @@ public override void Write(byte[] buffer, int offset, int count) /// symbol servers. This API can be called more than once to add more servers to search. /// /// if true, enable logging diagnostics to console - /// if true, use the public microsoft server + /// if true, use the public Microsoft server /// if true, use symweb internal server and protocol (file.ptr) /// temp directory unique to this instance of SOS /// symbol server url (optional) + /// symbol server timeout in minutes (optional) /// symbol cache directory path (optional) /// symbol directory path to search (optional) /// windows symbol path (optional) /// if false, failure - public static bool InitializeSymbolStore(bool logging, bool msdl, bool symweb, string tempDirectory, string symbolServerPath, string symbolCachePath, string symbolDirectoryPath, string windowsSymbolPath) + public static bool InitializeSymbolStore( + bool logging, + bool msdl, + bool symweb, + string tempDirectory, + string symbolServerPath, + int timeoutInMinutes, + string symbolCachePath, + string symbolDirectoryPath, + string windowsSymbolPath) { if (logging) { // Uses the standard console to do the logging instead of sending it to the hosting debugger console @@ -209,7 +219,7 @@ public static bool InitializeSymbolStore(bool logging, bool msdl, bool symweb, s } } // Build the symbol stores using the other parameters - if (!GetServerSymbolStore(ref store, msdl, symweb, symbolServerPath, symbolCachePath, symbolDirectoryPath)) { + if (!GetServerSymbolStore(ref store, msdl, symweb, symbolServerPath, timeoutInMinutes, symbolCachePath, symbolDirectoryPath)) { return false; } } @@ -1075,7 +1085,7 @@ private static bool ParseSymbolPath(ref SymbolStore store, string symbolPath) } // Add the symbol stores to the chain - if (!GetServerSymbolStore(ref store, msdl, false, symbolServerPath, symbolCachePath, symbolDirectoryPath)) + if (!GetServerSymbolStore(ref store, msdl, false, symbolServerPath, timeoutInMinutes: 0, symbolCachePath, symbolDirectoryPath)) { return false; } @@ -1085,7 +1095,7 @@ private static bool ParseSymbolPath(ref SymbolStore store, string symbolPath) return true; } - private static bool GetServerSymbolStore(ref SymbolStore store, bool msdl, bool symweb, string symbolServerPath, string symbolCachePath, string symbolDirectoryPath) + private static bool GetServerSymbolStore(ref SymbolStore store, bool msdl, bool symweb, string symbolServerPath, int timeoutInMinutes, string symbolCachePath, string symbolDirectoryPath) { bool internalServer = false; @@ -1106,43 +1116,47 @@ private static bool GetServerSymbolStore(ref SymbolStore store, bool msdl, bool { // Use the internal symbol store for symweb internalServer = symbolServerPath.Contains("symweb"); - - // Make sure the server Uri ends with "/" - symbolServerPath = symbolServerPath.TrimEnd('/') + '/'; } if (symbolServerPath != null) { // Validate symbol server path - if (!Uri.TryCreate(symbolServerPath, UriKind.Absolute, out Uri uri) || uri.IsFile) + if (!Uri.TryCreate(symbolServerPath.TrimEnd('/') + '/', UriKind.Absolute, out Uri uri)) { return false; } - if (!IsDuplicateSymbolStore(store, (httpSymbolStore) => uri.Equals(httpSymbolStore.Uri))) + // Add a cache symbol store if file or UNC path + if (uri.IsFile || uri.IsUnc) { - // Create symbol server store - if (internalServer) - { - store = new SymwebHttpSymbolStore(s_tracer, store, uri); - } - else + AddCachePath(ref store, symbolServerPath); + } + else + { + if (!IsDuplicateSymbolStore(store, (httpSymbolStore) => uri.Equals(httpSymbolStore.Uri))) { - store = new HttpSymbolStore(s_tracer, store, uri); + // Create http symbol server store + HttpSymbolStore httpSymbolStore; + if (internalServer) + { + httpSymbolStore = new SymwebHttpSymbolStore(s_tracer, store, uri); + } + else + { + httpSymbolStore = new HttpSymbolStore(s_tracer, store, uri); + } + if (timeoutInMinutes != 0) + { + httpSymbolStore.Timeout = TimeSpan.FromMinutes(timeoutInMinutes); + } + store = httpSymbolStore; } } } if (symbolCachePath != null) { - symbolCachePath = Path.GetFullPath(symbolCachePath); - - // Check only the first symbol store for duplication. The same cache directory can be - // added more than once but just not more than once in a row. - if (!(store is CacheSymbolStore cacheSymbolStore && IsPathEqual(symbolCachePath, cacheSymbolStore.CacheDirectory))) - { - store = new CacheSymbolStore(s_tracer, store, symbolCachePath); - } + AddCachePath(ref store, symbolCachePath); } if (symbolDirectoryPath != null) @@ -1158,6 +1172,18 @@ private static bool GetServerSymbolStore(ref SymbolStore store, bool msdl, bool return true; } + private static void AddCachePath(ref SymbolStore store, string symbolCachePath) + { + symbolCachePath = Path.GetFullPath(symbolCachePath); + + // Check only the first symbol store for duplication. The same cache directory can be + // added more than once but just not more than once in a row. + if (!(store is CacheSymbolStore cacheSymbolStore && IsPathEqual(symbolCachePath, cacheSymbolStore.CacheDirectory))) + { + store = new CacheSymbolStore(s_tracer, store, symbolCachePath); + } + } + private static bool IsDuplicateSymbolStore(SymbolStore symbolStore, Func match) where T : SymbolStore { diff --git a/src/SOS/Strike/hostcoreclr.cpp b/src/SOS/Strike/hostcoreclr.cpp index 34f6e03604..f56c7706ed 100644 --- a/src/SOS/Strike/hostcoreclr.cpp +++ b/src/SOS/Strike/hostcoreclr.cpp @@ -235,7 +235,7 @@ HRESULT GetRuntimeDirectory(std::string& runtimeDirectory) LPCSTR directory = g_ExtServices->GetCoreClrDirectory(); if (directory == NULL) { - ExtErr("Error: Runtime module (%s) not loaded yet\n", NETCORE_RUNTIME_DLL_NAME_A); + ExtErr("Error: Runtime module (%s) not loaded yet\n", GetRuntimeDllName()); return E_FAIL; } if (!GetAbsolutePath(directory, runtimeDirectory)) @@ -408,6 +408,11 @@ static HRESULT GetHostRuntime(std::string& coreClrPath, std::string& hostRuntime // Find highest 3.1.x version if (!FindDotNetVersion(3, 1, hostRuntimeDirectory)) { + // Don't use the desktop runtime to host + if (g_isDesktopRuntime) + { + return E_FAIL; + } // If an installed runtime can not be found, use the target coreclr version HRESULT hr = GetRuntimeDirectory(hostRuntimeDirectory); if (FAILED(hr)) @@ -766,13 +771,21 @@ static int ReadMemoryForSymbols(ULONG64 address, uint8_t *buffer, int cb) /**********************************************************************\ * Setup and initialize the symbol server support. \**********************************************************************/ -HRESULT InitializeSymbolStore(BOOL logging, BOOL msdl, BOOL symweb, const char* symbolServer, const char* cacheDirectory, const char* searchDirectory, const char* windowsSymbolPath) +HRESULT InitializeSymbolStore( + BOOL logging, + BOOL msdl, + BOOL symweb, + const char* symbolServer, + int timeoutInMinutes, + const char* cacheDirectory, + const char* searchDirectory, + const char* windowsSymbolPath) { HRESULT Status = S_OK; IfFailRet(InitializeHosting()); _ASSERTE(g_SOSNetCoreCallbacks.InitializeSymbolStoreDelegate != nullptr); - if (!g_SOSNetCoreCallbacks.InitializeSymbolStoreDelegate(logging, msdl, symweb, GetTempDirectory(), symbolServer, cacheDirectory, searchDirectory, windowsSymbolPath)) + if (!g_SOSNetCoreCallbacks.InitializeSymbolStoreDelegate(logging, msdl, symweb, GetTempDirectory(), symbolServer, timeoutInMinutes, cacheDirectory, searchDirectory, windowsSymbolPath)) { ExtErr("Error initializing symbol server support\n"); return E_FAIL; @@ -807,17 +820,21 @@ void InitializeSymbolStoreFromSymPath() { if (g_SOSNetCoreCallbacks.InitializeSymbolStoreDelegate != nullptr) { - ArrayHolder symbolPath = new char[MAX_LONGPATH]; - if (SUCCEEDED(g_ExtSymbols->GetSymbolPath(symbolPath, MAX_LONGPATH, nullptr))) + ULONG cchLength = 0; + if (SUCCEEDED(g_ExtSymbols->GetSymbolPath(nullptr, 0, &cchLength))) { - if (strlen(symbolPath) > 0) - { - if (!g_SOSNetCoreCallbacks.InitializeSymbolStoreDelegate(false, false, false, GetTempDirectory(), nullptr, nullptr, nullptr, symbolPath)) + ArrayHolder symbolPath = new char[cchLength]; + if (SUCCEEDED(g_ExtSymbols->GetSymbolPath(symbolPath, cchLength, nullptr))) + { + if (strlen(symbolPath) > 0) { - ExtErr("Windows symbol path parsing FAILED\n"); - return; + if (!g_SOSNetCoreCallbacks.InitializeSymbolStoreDelegate(false, false, false, GetTempDirectory(), nullptr, 0, nullptr, nullptr, symbolPath)) + { + ExtErr("Windows symbol path parsing FAILED\n"); + return; + } + g_symbolStoreInitialized = true; } - g_symbolStoreInitialized = true; } } } @@ -870,33 +887,37 @@ static void LoadNativeSymbolsCallback(void* param, const char* moduleFilePath, U HRESULT LoadNativeSymbols(bool runtimeOnly) { HRESULT hr = S_OK; +#ifdef FEATURE_PAL if (g_symbolStoreInitialized) { -#ifdef FEATURE_PAL hr = g_ExtServices2 ? g_ExtServices2->LoadNativeSymbols(runtimeOnly, LoadNativeSymbolsCallback) : E_NOINTERFACE; + } #else - if (runtimeOnly) + if (runtimeOnly) + { + ULONG index; + ULONG64 moduleAddress; + HRESULT hr = GetRuntimeModuleInfo(&index, &moduleAddress); + if (SUCCEEDED(hr)) { - ULONG index; - ULONG64 moduleAddress; - HRESULT hr = GetRuntimeModuleInfo(&index, &moduleAddress); + ArrayHolder moduleFilePath = new char[MAX_LONGPATH + 1]; + hr = g_ExtSymbols->GetModuleNames(index, 0, moduleFilePath, MAX_LONGPATH, NULL, NULL, 0, NULL, NULL, 0, NULL); if (SUCCEEDED(hr)) { - ArrayHolder moduleFilePath = new char[MAX_LONGPATH + 1]; - hr = g_ExtSymbols->GetModuleNames(index, 0, moduleFilePath, MAX_LONGPATH, NULL, NULL, 0, NULL, NULL, 0, NULL); + DEBUG_MODULE_PARAMETERS moduleParams; + hr = g_ExtSymbols->GetModuleParameters(1, &moduleAddress, 0, &moduleParams); if (SUCCEEDED(hr)) { - DEBUG_MODULE_PARAMETERS moduleParams; - hr = g_ExtSymbols->GetModuleParameters(1, &moduleAddress, 0, &moduleParams); - if (SUCCEEDED(hr)) + hr = InitializeSymbolStore(); + if (SUCCEEDED(hr) && g_symbolStoreInitialized) { LoadNativeSymbolsCallback(nullptr, moduleFilePath, moduleAddress, moduleParams.Size); } } } } -#endif } +#endif return hr; } diff --git a/src/SOS/Strike/hostcoreclr.h b/src/SOS/Strike/hostcoreclr.h index 5f7f06edea..390dccd257 100644 --- a/src/SOS/Strike/hostcoreclr.h +++ b/src/SOS/Strike/hostcoreclr.h @@ -16,7 +16,7 @@ typedef void (*WriteLineDelegate)(const char*); typedef int (*ReadMemoryDelegate)(ULONG64, uint8_t*, int); typedef void (*SymbolFileCallbackDelegate)(void*, const char* moduleFileName, const char* symbolFilePath); -typedef BOOL (*InitializeSymbolStoreDelegate)(BOOL, BOOL, BOOL, const char*, const char*, const char*, const char*, const char*); +typedef BOOL (*InitializeSymbolStoreDelegate)(BOOL, BOOL, BOOL, const char*, const char*, int, const char*, const char*, const char*); typedef void (*DisplaySymbolStoreDelegate)(WriteLineDelegate); typedef void (*DisableSymbolStoreDelegate)(); typedef void (*LoadNativeSymbolsDelegate)(SymbolFileCallbackDelegate, void*, const char*, ULONG64, int, ReadMemoryDelegate); @@ -71,10 +71,21 @@ extern LPCSTR GetDacFilePath(); extern LPCSTR GetDbiFilePath(); extern BOOL IsHostingInitialized(); extern HRESULT InitializeHosting(); -extern HRESULT InitializeSymbolStore(BOOL logging, BOOL msdl, BOOL symweb, const char* symbolServer, const char* cacheDirectory, const char* searchDirectory, const char* windowsSymbolPath); + +extern HRESULT InitializeSymbolStore( + BOOL logging, + BOOL msdl, + BOOL symweb, + const char* symbolServer, + int timeoutInMinutes, + const char* cacheDirectory, + const char* searchDirectory, + const char* windowsSymbolPath); + #ifndef FEATURE_PAL extern void InitializeSymbolStoreFromSymPath(); #endif + extern HRESULT LoadNativeSymbols(bool runtimeOnly = false); extern void DisplaySymbolStore(); extern void DisableSymbolStore(); diff --git a/src/SOS/Strike/sosdocs.txt b/src/SOS/Strike/sosdocs.txt index 8c5662b2d8..0e86fdc2c6 100644 --- a/src/SOS/Strike/sosdocs.txt +++ b/src/SOS/Strike/sosdocs.txt @@ -554,7 +554,7 @@ of value classes, while others do not. \\ COMMAND: gcroot. -!GCRoot [-nostacks] +!GCRoot [-nostacks] [-all] !GCRoot looks for references (or roots) to an object. These can exist in four places: @@ -565,14 +565,16 @@ places: 4. As a member of an object found in 1, 2 or 3 above. First, all stacks will be searched for roots, then handle tables, and finally -the freachable queue of the finalizer. Some caution about the stack roots: +the reachable queue of the finalizer. Some caution about the stack roots: !GCRoot doesn't attempt to determine if a stack root it encountered is valid or is old (discarded) data. You would have to use !CLRStack and !U to disassemble the frame that the local or argument value belongs to in order to determine if it is still in use. -Because people often want to restrict the search to gc handles and freachable +Because people often want to restrict the search to gc handles and reachable objects, there is a -nostacks option. + +The -all option forces all roots to be displayed instead of just the unique roots. \\ COMMAND: objsize. diff --git a/src/SOS/Strike/sosdocsunix.txt b/src/SOS/Strike/sosdocsunix.txt index 0727edb352..ca1000a67f 100644 --- a/src/SOS/Strike/sosdocsunix.txt +++ b/src/SOS/Strike/sosdocsunix.txt @@ -456,7 +456,7 @@ all objects in the finalizable and "ready for finalization" queues. \\ COMMAND: gcroot. -GCRoot [-nostacks] +GCRoot [-nostacks] [-all] GCRoot looks for references (or roots) to an object. These can exist in four places: @@ -467,14 +467,16 @@ places: 4. As a member of an object found in 1, 2 or 3 above. First, all stacks will be searched for roots, then handle tables, and finally -the freachable queue of the finalizer. Some caution about the stack roots: +the reachable queue of the finalizer. Some caution about the stack roots: GCRoot doesn't attempt to determine if a stack root it encountered is valid or is old (discarded) data. You would have to use CLRStack and U to disassemble the frame that the local or argument value belongs to in order to determine if it is still in use. -Because people often want to restrict the search to gc handles and freachable +Because people often want to restrict the search to gc handles and reachable objects, there is a -nostacks option. + +The -all option forces all roots to be displayed instead of just the unique roots. \\ COMMAND: pe. @@ -615,7 +617,7 @@ exceptions by switching to the thread in question, and running \\ COMMAND: clrstack. -CLRStack [-a] [-l] [-p] [-n] [-f] +CLRStack [-a] [-l] [-p] [-n] [-f] [-r] [-all] CLRStack [-a] [-l] [-p] [-i] [variable name] [frame] CLRStack attempts to provide a true stack trace for managed code only. It is diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index cffdc56c04..05e399a914 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -9830,8 +9830,14 @@ DECLARE_API(DumpLog) MINIDUMP_NOT_SUPPORTED(); + // Not supported on desktop runtime + if (g_isDesktopRuntime) + { + ExtErr("DumpLog not supported on desktop runtime\n"); + return E_FAIL; + } + const char* fileName = "StressLog.txt"; - CLRDATA_ADDRESS StressLogAddress = NULL; StringHolder sFileName, sLogAddr; @@ -15906,6 +15912,7 @@ DECLARE_API(SetSymbolServer) StringHolder symbolCache; StringHolder searchDirectory; StringHolder windowsSymbolPath; + size_t timeoutInMinutes = 0; BOOL disable = FALSE; BOOL loadNative = FALSE; BOOL msdl = FALSE; @@ -15916,6 +15923,7 @@ DECLARE_API(SetSymbolServer) {"-disable", &disable, COBOOL, FALSE}, {"-cache", &symbolCache.data, COSTRING, TRUE}, {"-directory", &searchDirectory.data, COSTRING, TRUE}, + {"-timeout", &timeoutInMinutes, COSIZE_T, TRUE}, {"-ms", &msdl, COBOOL, FALSE}, {"-log", &logging, COBOOL, FALSE}, {"-loadsymbols", &loadNative, COBOOL, FALSE}, @@ -15954,7 +15962,7 @@ DECLARE_API(SetSymbolServer) if (msdl || symweb || symbolServer.data != nullptr || symbolCache.data != nullptr || searchDirectory.data != nullptr || windowsSymbolPath.data != nullptr) { - Status = InitializeSymbolStore(logging, msdl, symweb, symbolServer.data, symbolCache.data, searchDirectory.data, windowsSymbolPath.data); + Status = InitializeSymbolStore(logging, msdl, symweb, symbolServer.data, (int)timeoutInMinutes, symbolCache.data, searchDirectory.data, windowsSymbolPath.data); if (FAILED(Status)) { return Status; diff --git a/src/SOS/lldbplugin.tests/t_cmd_pe.py b/src/SOS/lldbplugin.tests/t_cmd_pe.py index 0a87014934..30dd443075 100644 --- a/src/SOS/lldbplugin.tests/t_cmd_pe.py +++ b/src/SOS/lldbplugin.tests/t_cmd_pe.py @@ -12,7 +12,7 @@ def runScenario(assembly, debugger, target): # set breakpoint at Test.Main and stop there test.stop_in_main(debugger, assembly) - ci.HandleCommand("dso", res) + ci.HandleCommand("pe", res) print(res.GetOutput()) print(res.GetError()) # Interpreter must have this command and able to run it diff --git a/src/Tools/dotnet-dump/Analyzer.cs b/src/Tools/dotnet-dump/Analyzer.cs index 28209858d8..77c33c3414 100644 --- a/src/Tools/dotnet-dump/Analyzer.cs +++ b/src/Tools/dotnet-dump/Analyzer.cs @@ -41,8 +41,7 @@ public Analyzer() { _serviceProvider = new ServiceProvider(); _consoleProvider = new ConsoleProvider(); - Type type = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? typeof(SOSCommandForWindows) : typeof(SOSCommand); - _commandProcessor = new CommandProcessor(_serviceProvider, _consoleProvider, new Assembly[] { typeof(Analyzer).Assembly }, new Type[] { type }); + _commandProcessor = new CommandProcessor(_serviceProvider, _consoleProvider, new Assembly[] { typeof(Analyzer).Assembly }); } public async Task Analyze(FileInfo dump_path, string[] command) @@ -71,7 +70,16 @@ public async Task Analyze(FileInfo dump_path, string[] command) AddServices(target); // Automatically enable symbol server support - SymbolReader.InitializeSymbolStore(logging: false, msdl: true, symweb: false, tempDirectory: null, symbolServerPath: null, symbolCachePath: null, symbolDirectoryPath: null, windowsSymbolPath: null); + SymbolReader.InitializeSymbolStore( + logging: false, + msdl: true, + symweb: false, + tempDirectory: null, + symbolServerPath: null, + timeoutInMinutes: 0, + symbolCachePath: null, + symbolDirectoryPath: null, + windowsSymbolPath: null); // Run the commands from the dotnet-dump command line if (command != null) diff --git a/src/Tools/dotnet-dump/Commands/SOSCommand.cs b/src/Tools/dotnet-dump/Commands/SOSCommand.cs index 7845d601f4..639693eb5d 100644 --- a/src/Tools/dotnet-dump/Commands/SOSCommand.cs +++ b/src/Tools/dotnet-dump/Commands/SOSCommand.cs @@ -48,7 +48,21 @@ namespace Microsoft.Diagnostics.Tools.Dump [Command(Name = "histobjfind", AliasExpansion = "HistObjFind", Help = "Displays all the log entries that reference an object at the specified address.")] [Command(Name = "histroot", AliasExpansion = "HistRoot", Help = "Displays information related to both promotions and relocations of the specified root.")] [Command(Name = "setsymbolserver", AliasExpansion = "SetSymbolServer", Help = "Enables the symbol server support ")] - internal class SOSCommand : CommandBase + [Command(Name = "dumprcw", AliasExpansion = "DumpRCW", Platform = CommandPlatform.Windows, Help = "Displays information about a Runtime Callable Wrapper.")] + [Command(Name = "dumpccw", AliasExpansion = "DumpCCW", Platform = CommandPlatform.Windows, Help = "Displays information about a COM Callable Wrapper.")] + [Command(Name = "dumppermissionset",AliasExpansion = "DumpPermissionSet", Platform = CommandPlatform.Windows, Help = "Displays a PermissionSet object (debug build only).")] + [Command(Name = "traverseheap", AliasExpansion = "TraverseHeap", Platform = CommandPlatform.Windows, Help = "Writes out a file in a format understood by the CLR Profiler.")] + [Command(Name = "analyzeoom", AliasExpansion = "AnalyzeOOM", Platform = CommandPlatform.Windows, Help = "Displays the info of the last OOM occurred on an allocation request to the GC heap.")] + [Command(Name = "verifyobj", AliasExpansion = "VerifyObj", Platform = CommandPlatform.Windows, Help = "Checks the object for signs of corruption.")] + [Command(Name = "listnearobj", AliasExpansion = "ListNearObj", Platform = CommandPlatform.Windows, Help = "Displays the object preceding and succeeding the address specified.")] + [Command(Name = "gcheapstat", AliasExpansion = "GCHeapStat", Platform = CommandPlatform.Windows, Help = "Display various GC heap stats.")] + [Command(Name = "watsonbuckets", AliasExpansion = "WatsonBuckets", Platform = CommandPlatform.Windows, Help = "Displays the Watson buckets.")] + [Command(Name = "threadpool", AliasExpansion = "ThreadPool", Platform = CommandPlatform.Windows, Help = "Lists basic information about the thread pool.")] + [Command(Name = "comstate", AliasExpansion = "COMState", Platform = CommandPlatform.Windows, Help = "Lists the COM apartment model for each thread.")] + [Command(Name = "gchandles", AliasExpansion = "GCHandles", Platform = CommandPlatform.Windows, Help = "Provides statistics about GCHandles in the process.")] + [Command(Name = "objsize", AliasExpansion = "ObjSize", Platform = CommandPlatform.Windows, Help = "Lists the sizes of the all the objects found on managed threads.")] + [Command(Name = "gchandleleaks", AliasExpansion = "GCHandleLeaks", Platform = CommandPlatform.Windows, Help = "Helps in tracking down GCHandle leaks")] + public class SOSCommand : CommandBase { [Argument(Name = "arguments", Help = "Arguments to SOS command.")] public string[] Arguments { get; set; } diff --git a/src/Tools/dotnet-dump/Commands/SOSCommandForWindows.cs b/src/Tools/dotnet-dump/Commands/SOSCommandForWindows.cs deleted file mode 100644 index 36acf694e9..0000000000 --- a/src/Tools/dotnet-dump/Commands/SOSCommandForWindows.cs +++ /dev/null @@ -1,27 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using Microsoft.Diagnostics.Repl; -using System.CommandLine; - -namespace Microsoft.Diagnostics.Tools.Dump -{ - [Command(Name = "dumprcw", AliasExpansion = "DumpRCW", Help = "Displays information about a Runtime Callable Wrapper.")] - [Command(Name = "dumpccw", AliasExpansion = "DumpCCW", Help = "Displays information about a COM Callable Wrapper.")] - [Command(Name = "dumppermissionset", AliasExpansion = "DumpPermissionSet", Help = "Displays a PermissionSet object (debug build only).")] - [Command(Name = "traverseheap", AliasExpansion = "TraverseHeap", Help = "Writes out a file in a format understood by the CLR Profiler.")] - [Command(Name = "analyzeoom", AliasExpansion = "AnalyzeOOM", Help = "Displays the info of the last OOM occurred on an allocation request to the GC heap.")] - [Command(Name = "verifyobj", AliasExpansion = "VerifyObj", Help = "Checks the object for signs of corruption.")] - [Command(Name = "listnearobj", AliasExpansion = "ListNearObj", Help = "Displays the object preceding and succeeding the address specified.")] - [Command(Name = "gcheapstat", AliasExpansion = "GCHeapStat", Help = "Display various GC heap stats.")] - [Command(Name = "watsonbuckets", AliasExpansion = "WatsonBuckets", Help = "Displays the Watson buckets.")] - [Command(Name = "threadpool", AliasExpansion = "ThreadPool", Help = "Lists basic information about the thread pool.")] - [Command(Name = "comstate", AliasExpansion = "COMState", Help = "Lists the COM apartment model for each thread.")] - [Command(Name = "gchandles", AliasExpansion = "GCHandles", Help = "Provides statistics about GCHandles in the process.")] - [Command(Name = "objsize", AliasExpansion = "ObjSize", Help = "Lists the sizes of the all the objects found on managed threads.")] - [Command(Name = "gchandleleaks", AliasExpansion = "GCHandleLeaks", Help = "Helps in tracking down GCHandle leaks")] - internal class SOSCommandForWindows : SOSCommand - { - } -} diff --git a/src/Tools/dotnet-dump/Commands/SetClrPathCommand.cs b/src/Tools/dotnet-dump/Commands/SetClrPathCommand.cs new file mode 100644 index 0000000000..e59fd3bef8 --- /dev/null +++ b/src/Tools/dotnet-dump/Commands/SetClrPathCommand.cs @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Diagnostics.DebugServices; +using Microsoft.Diagnostics.Repl; +using System.CommandLine; + +namespace Microsoft.Diagnostics.Tools.Dump +{ + [Command(Name = "setclrpath", Platform = CommandPlatform.Linux | CommandPlatform.OSX, Help = "Set the path to load coreclr DAC/DBI files.")] + public class SetClrPath: CommandBase + { + public AnalyzeContext AnalyzeContext { get; set; } + + [Argument(Name = "clrpath", Help = "Runtime directory path.")] + public string Argument { get; set; } + + public override void Invoke() + { + if (Argument == null) + { + WriteLine("Load path for DAC/DBI: '{0}'", AnalyzeContext.RuntimeModuleDirectory ?? ""); + } + else + { + AnalyzeContext.RuntimeModuleDirectory = Argument; + WriteLine("Set load path for DAC/DBI to '{0}'", AnalyzeContext.RuntimeModuleDirectory); + } + } + } +} diff --git a/src/inc/palclr.h b/src/inc/palclr.h index bba278b776..fb3e25a187 100644 --- a/src/inc/palclr.h +++ b/src/inc/palclr.h @@ -613,10 +613,10 @@ #endif #if !defined(MAX_LONGPATH) -#define MAX_LONGPATH 260 /* max. length of full pathname */ +#define MAX_LONGPATH 1024 /* max. length of full pathname */ #endif #if !defined(MAX_PATH_FNAME) -#define MAX_PATH_FNAME MAX_PATH /* max. length of full pathname */ +#define MAX_PATH_FNAME MAX_PATH /* max. length of full pathname */ #endif #define __clr_reserved __reserved From fd2d3d30b91930d85009b9893a6053a7ee68d880 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Sat, 14 Dec 2019 15:33:57 -0800 Subject: [PATCH 026/243] Fix scheduled build (#696) --- eng/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/build.yml b/eng/build.yml index f7924466b7..efffa3cb70 100644 --- a/eng/build.yml +++ b/eng/build.yml @@ -99,9 +99,9 @@ jobs: - ${{ if eq(variables['Build.Reason'], 'Schedule') }}: - ${{ if eq(parameters.osGroup, 'Windows_NT') }}: - - _DailyTest: -daily-test + - _DailyTest: -dailytest - ${{ if ne(parameters.osGroup, 'Windows_NT') }}: - - _DailyTest: --daily-test + - _DailyTest: --dailytest - ${{ if ne(variables['Build.Reason'], 'Schedule') }}: - _DailyTest: '' @@ -216,4 +216,4 @@ jobs: mergeTestResults: true buildConfiguration: ${{ parameters.name }} continueOnError: true - condition: always() \ No newline at end of file + condition: always() From 7f61b4932b9bed5ae73d1771bdd9b8890e3fb2bd Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Sat, 14 Dec 2019 16:50:53 -0800 Subject: [PATCH 027/243] Revert back to 3.0.100 SDK version (#697) --- global.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global.json b/global.json index 02300a96d3..221926c8a5 100644 --- a/global.json +++ b/global.json @@ -1,9 +1,9 @@ { "sdk": { - "version": "3.0.101" + "version": "3.0.100" }, "tools": { - "dotnet": "3.0.101" + "dotnet": "3.0.100" }, "msbuild-sdks": { "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.19613.1" From e94ff157fdf6f8de0d0b2f34532c04a5057ce683 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sun, 15 Dec 2019 13:40:31 +0000 Subject: [PATCH 028/243] Update dependencies from https://github.com/aspnet/AspNetCore build 20191214.22 (#698) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.19614.22 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e5c086eb81..250616e3d2 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/core-setup c77948d92a2f950140f09384f057cb893ec3955a - + https://github.com/aspnet/AspNetCore - 19d2f6124f5d04859e350d1f5a01e994e14ef1ce + b028b51e3df7b7bbc78a65d0e1a385c6d81b6325 diff --git a/eng/Versions.props b/eng/Versions.props index a26afed09e..90e40ce54d 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) 5.0.0-alpha.1.19564.1 - 5.0.0-alpha1.19613.21 + 5.0.0-alpha.1.19614.22 From 8d47a6b6540f7260565ace9106aed63d26d412d2 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2019 13:47:32 +0000 Subject: [PATCH 029/243] Update dependencies from https://github.com/dotnet/arcade build 20191215.1 (#699) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.19615.1 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.19615.1 --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 2 +- global.json | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 250616e3d2..b161f1e555 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,15 +4,15 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - acd18a717ab18e484addef602e2af2b2bc4c4bd1 + 77698ebba1ab096ad9580a5d9ebefe0499ba00ce - + https://github.com/dotnet/arcade - acd18a717ab18e484addef602e2af2b2bc4c4bd1 + 77698ebba1ab096ad9580a5d9ebefe0499ba00ce https://github.com/dotnet/core-setup diff --git a/eng/Versions.props b/eng/Versions.props index 90e40ce54d..0bd0cfa5bd 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -39,7 +39,7 @@ 4.5.3 2.4.1 2.0.3 - 5.0.0-beta.19613.1 + 5.0.0-beta.19615.1 10.0.18362 diff --git a/global.json b/global.json index 221926c8a5..7b22eff36b 100644 --- a/global.json +++ b/global.json @@ -1,11 +1,11 @@ { "sdk": { - "version": "3.0.100" + "version": "3.0.101" }, "tools": { - "dotnet": "3.0.100" + "dotnet": "3.0.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.19613.1" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.19615.1" } } From 95368227750a8c66f55f2e064409bab028b2f6e8 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Tue, 17 Dec 2019 00:59:19 +0100 Subject: [PATCH 030/243] add .NET Standard 2.0 for diagnostics client library (#700) --- .../DiagnosticsIpc/IpcClient.cs | 18 ++++++++++++++---- ...Microsoft.Diagnostics.NETCore.Client.csproj | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs index 7d309b670d..1ab6409ea6 100644 --- a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs @@ -4,15 +4,13 @@ using System; using System.Diagnostics; -using System.Collections.Generic; using System.IO; using System.IO.Pipes; using System.Linq; +using System.Net; using System.Net.Sockets; using System.Runtime.InteropServices; using System.Security.Principal; -using System.Text; -using System.Text.RegularExpressions; namespace Microsoft.Diagnostics.NETCore.Client { @@ -69,7 +67,7 @@ private static Stream GetTransport(int processId) throw new ServerNotAvailableException($"Process {processId} not running compatible .NET Core runtime."); } string path = Path.Combine(IpcRootPath, ipcPort); - var remoteEP = new UnixDomainSocketEndPoint(path); + var remoteEP = CreateUnixDomainSocketEndPoint(path); var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified); socket.Connect(remoteEP); @@ -122,5 +120,17 @@ private static IpcMessage Read(Stream stream) { return IpcMessage.Parse(stream); } + + private static EndPoint CreateUnixDomainSocketEndPoint(string path) + { +#if NETCOREAPP + return new UnixDomainSocketEndPoint(path); +#elif NETSTANDARD2_0 + // UnixDomainSocketEndPoint is not part of .NET Standard 2.0 + var type = typeof(Socket).Assembly.GetType("System.Net.Sockets.UnixDomainSocketEndPoint"); + var ctor = type.GetConstructor(new[] { typeof(string) }); + return (EndPoint)ctor.Invoke(new object[] { path }); +#endif + } } } diff --git a/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj b/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj index dcb33ec0f8..b30d9e8f60 100644 --- a/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj +++ b/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj @@ -1,7 +1,7 @@  Library - netcoreapp2.1 + netstandard2.0;netcoreapp2.1 Microsoft.Diagnostics.NETCore.Client .NET Core Diagnostics Client Library 0.1.0 From 653f155a3e458d4e7b4fe4e4c4bc4157bd7f1f91 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Mon, 16 Dec 2019 17:20:05 -0800 Subject: [PATCH 031/243] Update windows-instructions.md --- .../building/windows-instructions.md | 51 ++++++------------- 1 file changed, 15 insertions(+), 36 deletions(-) diff --git a/documentation/building/windows-instructions.md b/documentation/building/windows-instructions.md index 7bcb83a942..09587a36e3 100644 --- a/documentation/building/windows-instructions.md +++ b/documentation/building/windows-instructions.md @@ -10,47 +10,26 @@ You must install several components to build. These instructions were tested on ## Visual Studio -Visual Studio must be installed. Supported versions: -- [Visual Studio 2017](https://www.visualstudio.com/downloads/) (Community, Professional, Enterprise). The community version is completely free. -- [Visual Studio 2019 Preview](https://visualstudio.microsoft.com/vs/preview/) (Community, Professional, Enterprise). The community version is completely free. - -For Visual Studio 2017: -* When doing a 'Workloads' based install, the following are the minimum requirements: - * .NET Desktop Development - * All Required Components - * .NET Framework 4-4.6 Development Tools - * Desktop Development with C++ - * All Required Components - * VC++ 2017 v141 Toolset (x86, x64) - * Windows 8.1 SDK and UCRT SDK - * VC++ 2015.3 v140 Toolset (x86, x64) -* When doing an 'Individual Components' based install, the following are the minimum requirements: - * Under ".NET": - * .NET Framework 4.6 targeting pack - * .NET Portable Library targeting pack - * Under "Code tools": - * Static analysis tools - * Under "Compilers, build tools, and runtimes": - * C# and Visual Basic Roslyn Compilers - * MSBuild - * VC++ 2015.3 v140 toolset (x86, x64) - * VC++ 2017 v141 toolset (x86, x64) - * Windows Universal CRT SDK - * Under "Development activities": - * Visual Studio C++ core features - * Under "SDKs, libraries, and frameworks": - * Windows 10 SDK or Windows 8.1 SDK -* To build for Arm32, Make sure that you have the Windows 10 SDK installed (or selected to be installed as part of VS installation). To explicitly install Windows SDK, download it from here: [Windows SDK for Windows 10](https://developer.microsoft.com/en-us/windows/downloads). - * In addition, ensure you install the ARM tools. In the "Individual components" window, in the "Compilers, build tools, and runtimes" section, check the box for "Visual C++ compilers and libraries for ARM". -* **Important:** You must have the `msdia120.dll` COM Library registered in order to build the repository. - * This binary is registered by default when installing the "VC++ Tools" with Visual Studio 2015 - * You can also manually register the binary by launching the "Developer Command Prompt for VS2017" with Administrative privileges and running `regsvr32.exe "%VSINSTALLDIR%\Common7\IDE\msdia120.dll"` +- Install [Visual Studio 2019](https://visualstudio.microsoft.com/downloads/). The Community version is completely free. + +Visual Studio 2019 installation process: +* It's recommended to use 'Workloads' installation approach. The following are the minimum requirements: + * .NET Desktop Development with all default components. + * Desktop Development with C++ with all default components. +* To build for Arm32 or Arm64, Make sure that you have the Windows 10 SDK installed (or selected to be installed as part of VS installation). To explicitly install Windows SDK, download it from here: [Windows SDK for Windows 10](https://developer.microsoft.com/en-us/windows/downloads). + * In addition, ensure you install the ARM tools. In the "Individual components" window, in the "Compilers, build tools, and runtimes" section, check the box for "MSVC v142 - VS 2019 C++ ARM build tools (v14.23)". + * Also, ensure you install the ARM64 tools. In the "Individual components" window, in the "Compilers, build tools, and runtimes" section, check the box for "MSVC v142 - VS 2019 C++ ARM64 build tools (v14.23)". +* To build the tests, you will need some additional components: + * Windows 10 SDK component version 10.0.18362 or newer. This component is installed by default as a part of 'Desktop Development with C++' workload. + * C++/CLI support for v142 build tools (14.23) + +The dotnet/diagnostics repository requires at least Visual Studio 2019 16.3. Visual Studio Express is not supported. ## CMake -This repo build has been validated using CMake 3.9.3. +This repo build has been validated using CMake 3.15.5 - Install [CMake](http://www.cmake.org/download) for Windows. - Add its location (e.g. C:\Program Files (x86)\CMake\bin) to the PATH environment variable. From 4d2a8a4c6c684c4c1d9993490a43798290c6fa02 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Mon, 16 Dec 2019 22:32:32 -0800 Subject: [PATCH 032/243] Make MultiplePublishedProcessTest more stable (#701) * Make MultiplePublishedProcessTest more stable --- .../GetPublishedProcessesTests.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs index bb31623b62..e2945f73a3 100644 --- a/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs @@ -28,7 +28,7 @@ public void PublishedProcessTest1() TestRunner runner = new TestRunner(CommonHelper.GetTraceePath(), output); runner.Start(3000); List publishedProcesses = new List(DiagnosticsClient.GetPublishedProcesses()); - foreach(int p in publishedProcesses) + foreach (int p in publishedProcesses) { output.WriteLine($"[{DateTime.Now.ToString()}] Saw published process {p}"); } @@ -45,11 +45,12 @@ public void MultiplePublishedProcessTest() for (var i = 0; i < 3; i++) { runner[i] = new TestRunner(CommonHelper.GetTraceePath(), output); - runner[i].Start(500); + runner[i].Start(); pids[i] = runner[i].Pid; } + System.Threading.Thread.Sleep(2000); List publishedProcesses = new List(DiagnosticsClient.GetPublishedProcesses()); - foreach(int p in publishedProcesses) + foreach (int p in publishedProcesses) { output.WriteLine($"[{DateTime.Now.ToString()}] Saw published process {p}"); } From 676d9c6a90f81ea8e35bbb6457cde70915ec70c4 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Mon, 16 Dec 2019 22:41:59 -0800 Subject: [PATCH 033/243] Make scheduled builds full official builds (#703) Publish all the artifacts to the blob feeds for the scheduled builds so the vendors don't have to do thier error prone builds. Some minor cleanup to remove some pipeline warnings. Change ClrStack casing in help docs to be consistent Remove SDK entry in global.json so VS works Update version prefix to 5.0.0 --- .vsts-dotnet.yml | 7 ++++++- eng/Versions.props | 3 +-- eng/build.yml | 19 +++++-------------- global.json | 3 --- src/SOS/Strike/sosdocs.txt | 34 +++++++++++++++++----------------- src/SOS/Strike/sosdocsunix.txt | 18 +++++++++--------- 6 files changed, 38 insertions(+), 46 deletions(-) diff --git a/.vsts-dotnet.yml b/.vsts-dotnet.yml index 4b75893fa2..87b5ae13df 100644 --- a/.vsts-dotnet.yml +++ b/.vsts-dotnet.yml @@ -25,6 +25,7 @@ jobs: _BuildArch: x86 _PublishArtifacts: bin/Windows_NT.x86.Release Build_Release_arm: + _BuildOnly: true _BuildConfig: Release _BuildArch: arm _PublishArtifacts: bin/Windows_NT.arm.Release @@ -54,6 +55,7 @@ jobs: strategy: matrix: Build_Release: + _BuildOnly: true _BuildConfig: Release _BuildArch: arm _PublishArtifacts: bin/Linux.arm.Release @@ -67,6 +69,7 @@ jobs: strategy: matrix: Build_Release: + _BuildOnly: true _BuildConfig: Release _BuildArch: arm64 _PublishArtifacts: bin/Linux.arm64.Release @@ -212,7 +215,7 @@ jobs: - MacOS - Linux_cross - Linux_cross64 - condition: and(succeeded(), ne(variables['Build.Reason'], 'Schedule')) + condition: succeeded() pool: name: NetCoreInternal-Pool queue: BuildPool.Windows.10.Amd64.VS2017 @@ -318,12 +321,14 @@ jobs: inputs: filePath: eng\common\sdk-task.ps1 arguments: -task PublishToSymbolServers -restore -msbuildEngine dotnet -configuration Release -verbosity normal + /p:UsingToolSymbolUploader=true /p:DotNetSymbolServerTokenMsdl=$(microsoft-symbol-server-pat) /p:DotNetSymbolServerTokenSymWeb=$(symweb-symbol-server-pat) /p:PDBArtifactsDirectory='$(Build.SourcesDirectory)/artifacts/SymStore/**' /p:BlobBasePath='$(Build.SourcesDirectory)/artifacts/packages/Release/**' continueOnError: true condition: and(succeeded(), eq(variables['PublishSymbols'], 'true')) + # Publish package and log build artifacts - task: PublishBuildArtifacts@1 diff --git a/eng/Versions.props b/eng/Versions.props index 0bd0cfa5bd..21794eb1d7 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -3,7 +3,7 @@ https://github.com/dotnet/diagnostics preview - 3.0.0 + 5.0.0 true true @@ -22,7 +22,6 @@ false true - true 3.0.0 diff --git a/eng/build.yml b/eng/build.yml index efffa3cb70..1eefec5a2b 100644 --- a/eng/build.yml +++ b/eng/build.yml @@ -84,7 +84,6 @@ jobs: - _PhaseName : ${{ parameters.name }} - _HelixType: build/product - _HelixBuildConfig: $(_BuildConfig) - - _Pipeline_StreamDumpDir: $(Build.SourcesDirectory)/artifacts/tmp/$(_BuildConfig)/streams # Only enable publishing in non-public, non PR scenarios. - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: @@ -97,14 +96,6 @@ jobs: - ${{ if ne(parameters.testOnly, 'true') }}: - _LinuxScript: $(Build.SourcesDirectory)/eng/cibuild.sh - - ${{ if eq(variables['Build.Reason'], 'Schedule') }}: - - ${{ if eq(parameters.osGroup, 'Windows_NT') }}: - - _DailyTest: -dailytest - - ${{ if ne(parameters.osGroup, 'Windows_NT') }}: - - _DailyTest: --dailytest - - ${{ if ne(variables['Build.Reason'], 'Schedule') }}: - - _DailyTest: '' - # This is only required for cross builds. - ${{ if eq(parameters.crossrootfsDir, '') }}: - _RootFs: '' @@ -113,7 +104,7 @@ jobs: steps: - ${{ if eq(parameters.osGroup, 'Windows_NT') }}: - - script: $(Build.SourcesDirectory)\eng\cibuild.cmd $(_DailyTest) + - script: $(Build.SourcesDirectory)\eng\cibuild.cmd -configuration $(_BuildConfig) -architecture $(_BuildArch) -prepareMachine @@ -134,7 +125,7 @@ jobs: --docker-image $(_DockerImageName) --source-directory $(Build.SourcesDirectory) --container-name diagnostics-$(Build.BuildId) - $(_LinuxScript) $(_DailyTest) $(_RootFs) + $(_LinuxScript) $(_RootFs) --configuration $(_BuildConfig) --architecture $(_BuildArch) --prepareMachine @@ -144,7 +135,7 @@ jobs: condition: succeeded() - ${{ if eq(parameters.osGroup, 'MacOS') }}: - - script: $(Build.SourcesDirectory)/eng/cibuild.sh $(_DailyTest) + - script: $(Build.SourcesDirectory)/eng/cibuild.sh --configuration $(_BuildConfig) --architecture $(_BuildArch) --prepareMachine @@ -180,7 +171,7 @@ jobs: - task: PublishBuildArtifacts@1 displayName: Publish Stream Artifacts on failure inputs: - PathtoPublish: $(_Pipeline_StreamDumpDir) + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/tmp/$(_BuildConfig)/streams' PublishLocation: Container ArtifactName: Streams_$(_PhaseName)_$(_BuildArch)_$(_BuildConfig) continueOnError: true @@ -216,4 +207,4 @@ jobs: mergeTestResults: true buildConfiguration: ${{ parameters.name }} continueOnError: true - condition: always() + condition: ne(variables['_BuildOnly'], 'true') diff --git a/global.json b/global.json index 7b22eff36b..bc3abbd6dc 100644 --- a/global.json +++ b/global.json @@ -1,7 +1,4 @@ { - "sdk": { - "version": "3.0.101" - }, "tools": { "dotnet": "3.0.101" }, diff --git a/src/SOS/Strike/sosdocs.txt b/src/SOS/Strike/sosdocs.txt index 0e86fdc2c6..655b39094e 100644 --- a/src/SOS/Strike/sosdocs.txt +++ b/src/SOS/Strike/sosdocs.txt @@ -29,7 +29,7 @@ DumpAsync IP2MD DumpDelegate U DumpStackObjects (dso) DumpStack DumpHeap EEStack -DumpVC CLRStack +DumpVC ClrStack GCRoot GCInfo ObjSize EHInfo FinalizeQueue BPMD (bpmd) @@ -116,7 +116,7 @@ dump creation time to bring those structures into the minidump, and allow a minimum set of SOS debugging commands to work. At this time, those commands that can provide full or partial output are: -CLRStack +ClrStack Threads Help PrintException @@ -345,7 +345,7 @@ COMMAND: dumpstackobjects. This command will display any managed objects it finds within the bounds of the current stack. Combined with the stack tracing commands like K and -!CLRStack, it is a good aid to determining the values of locals and +!ClrStack, it is a good aid to determining the values of locals and parameters. If you use the -verify option, each non-static CLASS field of an object @@ -567,7 +567,7 @@ places: First, all stacks will be searched for roots, then handle tables, and finally the reachable queue of the finalizer. Some caution about the stack roots: !GCRoot doesn't attempt to determine if a stack root it encountered is valid -or is old (discarded) data. You would have to use !CLRStack and !U to +or is old (discarded) data. You would have to use !ClrStack and !U to disassemble the frame that the local or argument value belongs to in order to determine if it is still in use. @@ -854,10 +854,10 @@ exceptions by switching to the thread in question, and running \\ COMMAND: clrstack. -!CLRStack [-a] [-l] [-p] [-n] [-f] [-r] [-all] -!CLRStack [-a] [-l] [-p] [-i] [variable name] [frame] +!ClrStack [-a] [-l] [-p] [-n] [-f] [-r] [-all] +!ClrStack [-a] [-l] [-p] [-i] [variable name] [frame] -CLRStack attempts to provide a true stack trace for managed code only. It is +ClrStack attempts to provide a true stack trace for managed code only. It is handy for clean, simple traces when debugging straightforward managed programs. The -p parameter will show arguments to the managed function. The -l parameter can be used to show information on local variables in a frame. @@ -893,27 +893,27 @@ in myapp.ini and re-run: GenerateTrackingInfo=1 AllowOptimize=0 -The -i option is a new EXPERIMENTAL addition to CLRStack and will use the ICorDebug +The -i option is a new EXPERIMENTAL addition to ClrStack and will use the ICorDebug interfaces to display the managed stack and variables. With this option you can also view and expand arrays and fields for managed variables. If a stack frame number is -specified in the command line, CLRStack will show you the parameters and/or locals +specified in the command line, ClrStack will show you the parameters and/or locals only for that frame (provided you specify -l or -p or -a of course). If a variable -name and a stack frame number are specified in the command line, CLRStack will show +name and a stack frame number are specified in the command line, ClrStack will show you the parameters and/or locals for that frame, and will also show you the fields for that variable name you specified. Here are some examples: - !CLRStack -i -a : This will show you all parameters and locals for all frames - !CLRStack -i -a 3 : This will show you all parameters and locals, for frame 3 - !CLRStack -i var1 0 : This will show you the fields of 'var1' for frame 0 - !CLRStack -i var1.abc 2 : This will show you the fields of 'var1', and expand + !ClrStack -i -a : This will show you all parameters and locals for all frames + !ClrStack -i -a 3 : This will show you all parameters and locals, for frame 3 + !ClrStack -i var1 0 : This will show you the fields of 'var1' for frame 0 + !ClrStack -i var1.abc 2 : This will show you the fields of 'var1', and expand 'var1.abc' to show you the fields of the 'abc' field, for frame 2. - !CLRStack -i var1.[basetype] 0 : This will show you the fields of 'var1', and + !ClrStack -i var1.[basetype] 0 : This will show you the fields of 'var1', and expand the base type of 'var1' to show you its fields. - !CLRStack -i var1.[6] 0 : If 'var1' is an array, this will show you the element + !ClrStack -i var1.[6] 0 : If 'var1' is an array, this will show you the element at index 6 in the array, along with its fields The -i options uses DML output for a better debugging experience, so typically you -should only need to execute "!CLRStack -i", and from there, click on the DML +should only need to execute "!ClrStack -i", and from there, click on the DML hyperlinks to inspect the different managed stack frames and managed variables. \\ diff --git a/src/SOS/Strike/sosdocsunix.txt b/src/SOS/Strike/sosdocsunix.txt index ca1000a67f..3aa6df27b7 100644 --- a/src/SOS/Strike/sosdocsunix.txt +++ b/src/SOS/Strike/sosdocsunix.txt @@ -29,7 +29,7 @@ DumpAsync (dumpasync) IP2MD (ip2md) DumpDelegate (dumpdelegate) u (clru) DumpStackObjects (dso) DumpStack (dumpstack) DumpHeap (dumpheap) EEStack (eestack) -DumpVC CLRStack (clrstack) +DumpVC ClrStack (clrstack) FinalizeQueue (finalizequeue) GCInfo GCRoot (gcroot) EHInfo PrintException (pe) bpmd (bpmd) @@ -226,7 +226,7 @@ DumpStackObjects [-verify] [top stack [bottom stack]] This command will display any managed objects it finds within the bounds of the current stack. Combined with the stack tracing commands like K and -CLRStack, it is a good aid to determining the values of locals and +ClrStack, it is a good aid to determining the values of locals and parameters. If you use the -verify option, each non-static CLASS field of an object @@ -469,7 +469,7 @@ places: First, all stacks will be searched for roots, then handle tables, and finally the reachable queue of the finalizer. Some caution about the stack roots: GCRoot doesn't attempt to determine if a stack root it encountered is valid -or is old (discarded) data. You would have to use CLRStack and U to +or is old (discarded) data. You would have to use ClrStack and U to disassemble the frame that the local or argument value belongs to in order to determine if it is still in use. @@ -617,10 +617,10 @@ exceptions by switching to the thread in question, and running \\ COMMAND: clrstack. -CLRStack [-a] [-l] [-p] [-n] [-f] [-r] [-all] -CLRStack [-a] [-l] [-p] [-i] [variable name] [frame] +ClrStack [-a] [-l] [-p] [-n] [-f] [-r] [-all] +ClrStack [-a] [-l] [-p] [-i] [variable name] [frame] -CLRStack attempts to provide a true stack trace for managed code only. It is +ClrStack attempts to provide a true stack trace for managed code only. It is handy for clean, simple traces when debugging straightforward managed programs. The -p parameter will show arguments to the managed function. The -l parameter can be used to show information on local variables in a frame. @@ -656,12 +656,12 @@ in myapp.ini and re-run: GenerateTrackingInfo=1 AllowOptimize=0 -The -i option is a new EXPERIMENTAL addition to CLRStack and will use the ICorDebug +The -i option is a new EXPERIMENTAL addition to ClrStack and will use the ICorDebug interfaces to display the managed stack and variables. With this option you can also view and expand arrays and fields for managed variables. If a stack frame number is -specified in the command line, CLRStack will show you the parameters and/or locals +specified in the command line, ClrStack will show you the parameters and/or locals only for that frame (provided you specify -l or -p or -a of course). If a variable -name and a stack frame number are specified in the command line, CLRStack will show +name and a stack frame number are specified in the command line, ClrStack will show you the parameters and/or locals for that frame, and will also show you the fields for that variable name you specified. Here are some examples: clrstack -i -a : This will show you all parameters and locals for all frames From 69849b67ef0f2d07c29bfb73ade6c40c163e8a60 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Mon, 16 Dec 2019 23:54:48 -0800 Subject: [PATCH 034/243] Bump up DiagnosticsClient library version to 0.2.0 (#704) --- .../Microsoft.Diagnostics.NETCore.Client.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj b/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj index b30d9e8f60..7e530dc181 100644 --- a/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj +++ b/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj @@ -4,7 +4,7 @@ netstandard2.0;netcoreapp2.1 Microsoft.Diagnostics.NETCore.Client .NET Core Diagnostics Client Library - 0.1.0 + 0.2.0 true Diagnostic $(Description) From 7ed205d0b30086206e339c1c5084d70050118f70 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Tue, 17 Dec 2019 10:08:37 -0800 Subject: [PATCH 035/243] Revert _Pipeline_StreamDumpDir removal (#707) --- eng/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/eng/build.yml b/eng/build.yml index 1eefec5a2b..1ec2226a31 100644 --- a/eng/build.yml +++ b/eng/build.yml @@ -84,6 +84,7 @@ jobs: - _PhaseName : ${{ parameters.name }} - _HelixType: build/product - _HelixBuildConfig: $(_BuildConfig) + - _Pipeline_StreamDumpDir: $(Build.SourcesDirectory)/artifacts/tmp/$(_BuildConfig)/streams # Only enable publishing in non-public, non PR scenarios. - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: @@ -171,7 +172,7 @@ jobs: - task: PublishBuildArtifacts@1 displayName: Publish Stream Artifacts on failure inputs: - PathtoPublish: '$(Build.SourcesDirectory)/artifacts/tmp/$(_BuildConfig)/streams' + PathtoPublish: $(_Pipeline_StreamDumpDir) PublishLocation: Container ArtifactName: Streams_$(_PhaseName)_$(_BuildArch)_$(_BuildConfig) continueOnError: true From d20f9fe06e41963710a7d2f74d4357e7a3b03f6a Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Wed, 18 Dec 2019 10:46:43 -0800 Subject: [PATCH 036/243] Reduce predeftlsslot.h to the set that SOS actually depends on (#709) --- src/inc/predeftlsslot.h | 47 ++++------------------------------------- 1 file changed, 4 insertions(+), 43 deletions(-) diff --git a/src/inc/predeftlsslot.h b/src/inc/predeftlsslot.h index b2a3f6b49b..8a4b641bfd 100644 --- a/src/inc/predeftlsslot.h +++ b/src/inc/predeftlsslot.h @@ -8,8 +8,9 @@ #define __PREDEFTLSSLOT_H__ // ****************************************************************************** -// WARNING!!!: This header is also used by the coreclr repo. -// See: https://github.com/dotnet/coreclr/blob/master/src/inc/predeftlsslot.h +// WARNING!!!: This header is subset of +// https://github.com/dotnet/runtime/blob/master/src/coreclr/src/inc/predeftlsslot.h +// that SOS depends on. // ****************************************************************************** // And here are the predefined slots for accessing TLS from various DLLs of the CLR. @@ -18,45 +19,7 @@ // them. enum PredefinedTlsSlots { - TlsIdx_StrongName, - TlsIdx_JitPerf, - TlsIdx_JitX86Perf, - TlsIdx_JitLogEnv, - TlsIdx_AssertDlgStatus, // Whether the thread is displaying an assert dialog - TlsIdx_StressLog, - TlsIdx_CantStopCount, // Can't-stop counter for any thread - TlsIdx_Check, - TlsIdx_ForbidGCLoaderUseCount, - TlsIdx_ClrDebugState, // Pointer to ClrDebugState* structure - TlsIdx_StressThread, - - // Add more indices here. - TlsIdx_ThreadType, // bit flags to indicate special thread's type - TlsIdx_OwnedCrstsChain, // slot to store the Crsts owned by this thread - TlsIdx_CantAllocCount, //Can't allocate memory on heap in this thread - - // A transient thread value that indicates this thread is currently walking its stack - // or the stack of another thread. This value is useful to help short-circuit - // some problematic checks in the loader, guarantee that types & assemblies - // encountered during the walk must already be loaded, and provide information to control - // assembly loading behavior during stack walks. - // - // This value is set around the main portions of the stack walk (as those portions may - // enter the type & assembly loaders). This is also explicitly cleared while the - // walking thread calls the stackwalker callback or needs to execute managed code, as - // such calls may execute arbitrary code unrelated to the actual stack walking, and - // may never return, in the case of exception stackwalk callbacks. - TlsIdx_StackWalkerWalkingThread, // Thread* that the stack walker is currently walking. - - // Save the last exception info. Sometimes we need this info in our EX_CATCH, such as for SO. - // It will be better if VC can supply this in catch(...) block. - // !!! These data may become stale. Use it only inside exception handling code. - // !!! Please access these fields through GetCurrentExceptionPointers which validates the data to some level. - TlsIdx_EXCEPTION_CODE, - TlsIdx_PEXCEPTION_RECORD, - TlsIdx_PCONTEXT, - - MAX_PREDEFINED_TLS_SLOT + TlsIdx_ThreadType = 11 // bit flags to indicate special thread's type }; enum TlsThreadTypeFlag // flag used for thread type in Tls data @@ -76,8 +39,6 @@ enum TlsThreadTypeFlag // flag used for thread type in Tls data ThreadType_ProfAPI_Attach = 0x00004000, ThreadType_ProfAPI_Detach = 0x00008000, ThreadType_ETWRundownThread = 0x00010000, - ThreadType_GenericInstantiationCompare= 0x00020000, // Used to indicate that the thread is determining if a generic instantiation in an ngen image matches a lookup. }; #endif - From 4dc8e35b685b7ae7a1f33ed1b38dde9f99ff8657 Mon Sep 17 00:00:00 2001 From: Andrew Au Date: Wed, 18 Dec 2019 13:58:31 -0800 Subject: [PATCH 037/243] Avoid NullReferenceException in case the code path is run under an incompatible runtime (#711) --- .../DiagnosticsIpc/IpcClient.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs index 1ab6409ea6..079699c16a 100644 --- a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs @@ -128,6 +128,10 @@ private static EndPoint CreateUnixDomainSocketEndPoint(string path) #elif NETSTANDARD2_0 // UnixDomainSocketEndPoint is not part of .NET Standard 2.0 var type = typeof(Socket).Assembly.GetType("System.Net.Sockets.UnixDomainSocketEndPoint"); + if (type == null) + { + throw new PlatformNotSupportedException("Current process is not running a compatible .NET Core runtime."); + } var ctor = type.GetConstructor(new[] { typeof(string) }); return (EndPoint)ctor.Invoke(new object[] { path }); #endif From 2162a20a1b425b819d8e0ac33289c3755f45ed5b Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Wed, 18 Dec 2019 16:53:10 -0800 Subject: [PATCH 038/243] Add verbose info to clrmodules command. (#712) Add version info to modules command. --- src/SOS/Strike/strike.cpp | 1 + .../dotnet-dump/Commands/ClrModulesCommand.cs | 22 ++++++++++++++++++- .../dotnet-dump/Commands/ModulesCommand.cs | 4 +++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 05e399a914..acd6d3d636 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -6030,6 +6030,7 @@ DECLARE_API(DumpModule) ExtOut("PEFile: %p\n", SOS_PTR(module.File)); ExtOut("ModuleId: %p\n", SOS_PTR(module.dwModuleID)); + ExtOut("ModuleIndex: %p\n", SOS_PTR(module.dwModuleIndex)); ExtOut("LoaderHeap: %p\n", SOS_PTR(module.pLookupTableHeap)); ExtOut("TypeDefToMethodTableMap: %p\n", SOS_PTR(module.TypeDefToMethodTableMap)); ExtOut("TypeRefToMethodTableMap: %p\n", SOS_PTR(module.TypeRefToMethodTableMap)); diff --git a/src/Tools/dotnet-dump/Commands/ClrModulesCommand.cs b/src/Tools/dotnet-dump/Commands/ClrModulesCommand.cs index fe44d534dc..04b711883b 100644 --- a/src/Tools/dotnet-dump/Commands/ClrModulesCommand.cs +++ b/src/Tools/dotnet-dump/Commands/ClrModulesCommand.cs @@ -14,11 +14,31 @@ public class ClrModulesCommand : CommandBase { public ClrRuntime Runtime { get; set; } + [Option(Name = "--verbose", Help = "Displays detailed information about the modules.")] + [OptionAlias(Name = "-v")] + public bool Verbose { get; set; } + public override void Invoke() { foreach (ClrModule module in Runtime.Modules) { - WriteLine("{0:X16} {1}", module.Address, module.FileName); + if (Verbose) + { + WriteLine("{0}", module.FileName); + WriteLine(" Name: {0}", module.Name); + WriteLine(" ImageBase: {0:X16}", module.ImageBase); + WriteLine(" Size: {0:X8}", module.Size); + WriteLine(" Address: {0:X16}", module.Address); + WriteLine(" IsFile: {0}", module.IsFile); + WriteLine(" IsDynamic: {0}", module.IsDynamic); + WriteLine(" MetadataAddress: {0:X16}", module.MetadataAddress); + WriteLine(" MetadataSize: {0:X16}", module.MetadataLength); + WriteLine(" PdbInfo: {0}", module.Pdb?.ToString() ?? ""); + } + else + { + WriteLine("{0:X16} {1:X8} {2}", module.ImageBase, module.Size, module.FileName); + } } } } diff --git a/src/Tools/dotnet-dump/Commands/ModulesCommand.cs b/src/Tools/dotnet-dump/Commands/ModulesCommand.cs index ecf97ff198..1613ecf98d 100644 --- a/src/Tools/dotnet-dump/Commands/ModulesCommand.cs +++ b/src/Tools/dotnet-dump/Commands/ModulesCommand.cs @@ -28,12 +28,14 @@ public override void Invoke() { WriteLine("{0}", module.FileName); WriteLine(" Address: {0:X16}", module.ImageBase); + WriteLine(" IsManaged: {0}", module.IsManaged); WriteLine(" FileSize: {0:X8}", module.FileSize); WriteLine(" TimeStamp: {0:X8}", module.TimeStamp); + WriteLine(" Version: {0}", module.Version); + WriteLine(" PdbInfo: {0}", module.Pdb?.ToString() ?? ""); if (module.BuildId != null) { WriteLine(" BuildId: {0}", string.Concat(module.BuildId.Select((b) => b.ToString("x2")))); } - WriteLine(" IsManaged: {0}", module.IsManaged); } else { From bb275cfd076f91d0b1061344b0349f8253a154a0 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 19 Dec 2019 13:41:15 +0000 Subject: [PATCH 039/243] [master] Update dependencies from aspnet/AspNetCore (#706) * Update dependencies from https://github.com/aspnet/AspNetCore build 20191216.1 - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.19616.1 * Update dependencies from https://github.com/aspnet/AspNetCore build 20191218.3 - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.19618.3 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index b161f1e555..9a54641c48 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/core-setup c77948d92a2f950140f09384f057cb893ec3955a - + https://github.com/aspnet/AspNetCore - b028b51e3df7b7bbc78a65d0e1a385c6d81b6325 + 3af94f18cb841a27cc9e607f45b880df64201f70 diff --git a/eng/Versions.props b/eng/Versions.props index 21794eb1d7..17dc5c113b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) 5.0.0-alpha.1.19564.1 - 5.0.0-alpha.1.19614.22 + 5.0.0-alpha.1.19618.3 From eb0172fb64f7dc915151b6947ded1e032fa5ab62 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Thu, 19 Dec 2019 17:02:02 -0800 Subject: [PATCH 040/243] Update clrmd to version 1.1.61812 (module size and version info fixes) (#715) --- eng/Versions.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/Versions.props b/eng/Versions.props index 17dc5c113b..12de12ff7b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -30,7 +30,7 @@ 4.3.0 1.0.55801 - 1.1.57004 + 1.1.61812 1.7.0 2.0.44 0.3.0-alpha.19602.1 From 1c574a836603e8f6b401fe386ef49bdd1531785b Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2019 14:01:32 +0000 Subject: [PATCH 041/243] Update dependencies from https://github.com/aspnet/AspNetCore build 20191219.2 (#716) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.19619.2 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 9a54641c48..89a3fb9bb0 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/core-setup c77948d92a2f950140f09384f057cb893ec3955a - + https://github.com/aspnet/AspNetCore - 3af94f18cb841a27cc9e607f45b880df64201f70 + b3a7e54c8922602b574d668389346e83815d97ad diff --git a/eng/Versions.props b/eng/Versions.props index 12de12ff7b..adecca1a91 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) 5.0.0-alpha.1.19564.1 - 5.0.0-alpha.1.19618.3 + 5.0.0-alpha.1.19619.2 From b1989250174e52ebddc85f303f861a3521b772bf Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Sun, 22 Dec 2019 11:56:14 -0800 Subject: [PATCH 042/243] Initial commit (#714) --- src/tests/Grape/Grape.csproj | 14 +++ src/tests/Grape/Program.cs | 114 ++++++++++++++++++ src/tests/Grape/TestRunner.cs | 65 ++++++++++ .../Grape/TraceGeneratorConfiguration.cs | 21 ++++ .../TraceGenerators/EtwTraceGenerator.cs | 62 ++++++++++ .../EventPipeTraceGenerator.cs | 60 +++++++++ src/tests/Grape/config.json | 19 +++ 7 files changed, 355 insertions(+) create mode 100644 src/tests/Grape/Grape.csproj create mode 100644 src/tests/Grape/Program.cs create mode 100644 src/tests/Grape/TestRunner.cs create mode 100644 src/tests/Grape/TraceGeneratorConfiguration.cs create mode 100644 src/tests/Grape/TraceGenerators/EtwTraceGenerator.cs create mode 100644 src/tests/Grape/TraceGenerators/EventPipeTraceGenerator.cs create mode 100644 src/tests/Grape/config.json diff --git a/src/tests/Grape/Grape.csproj b/src/tests/Grape/Grape.csproj new file mode 100644 index 0000000000..14f528326b --- /dev/null +++ b/src/tests/Grape/Grape.csproj @@ -0,0 +1,14 @@ + + + + Exe + netcoreapp3.0 + + + + + + + + + diff --git a/src/tests/Grape/Program.cs b/src/tests/Grape/Program.cs new file mode 100644 index 0000000000..dcc2d833d6 --- /dev/null +++ b/src/tests/Grape/Program.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Tracing; +using System.IO; +using System.Runtime.InteropServices; +using System.Text.Json; +using Microsoft.Diagnostics.NETCore.Client; + +namespace Microsoft.Diagnostics.Grape +{ + class Program + { + static void Main(string[] args) + { + if (args.Length < 1) + { + return; + } + + var pathToExe = args[0]; + var pathToConfig = args[1]; + TraceGeneratorConfiguration traceConfig; + + try + { + traceConfig = JsonSerializer.Deserialize(File.ReadAllText(pathToConfig)); + var providers = new List(); + + foreach (var configProvider in traceConfig.eventProviders) + { + providers.Add(ToEventPipeProvider(configProvider)); + } + var eventpipeTracer = new EventPipeTraceGenerator(pathToExe, $"{traceConfig.traceName}.nettrace", providers); + Console.WriteLine("Collecting EventPipe trace"); + eventpipeTracer.Collect(traceConfig.duration); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + var etwTracer = new EtwTraceGenerator(pathToExe, $"{traceConfig.traceName}.etl", providers); + Console.WriteLine("Collecting ETW trace"); + etwTracer.Collect(traceConfig.duration); + } + + // TODO: Add Linux/LTTng trace generation here once I figure out how to make perfcollect more friendly... + Console.WriteLine("Done!"); + } + catch (Exception e) + { + Console.WriteLine($"Failed to parse the trace configuration file {pathToConfig}"); + Console.WriteLine(e.ToString()); + } + } + + private static EventPipeProvider ToEventPipeProvider(EventProvider configProvider) + { + return new EventPipeProvider( + configProvider.Name, + (EventLevel)configProvider.Level, + configProvider.Keywords.Length > 2 && configProvider.Keywords.StartsWith("0x") ? Convert.ToInt64(configProvider.Keywords.Substring(2), 16) : Convert.ToInt64(configProvider.Keywords, 10), + ParseArgumentString(configProvider.Arguments) + ); + } + + + private static Dictionary ParseArgumentString(string argument) + { + if (argument == "") + { + return null; + } + var argumentDict = new Dictionary(); + + int keyStart = 0; + int keyEnd = 0; + int valStart = 0; + int valEnd = 0; + int curIdx = 0; + bool inQuote = false; + foreach (var c in argument) + { + if (inQuote) + { + if (c == '\"') + { + inQuote = false; + } + } + else + { + if (c == '=') + { + keyEnd = curIdx; + valStart = curIdx + 1; + } + else if (c == ';') + { + valEnd = curIdx; + argumentDict.Add(argument.Substring(keyStart, keyEnd - keyStart), argument.Substring(valStart, valEnd - valStart)); + keyStart = curIdx + 1; // new key starts + } + else if (c == '\"') + { + inQuote = true; + } + } + curIdx += 1; + } + string key = argument.Substring(keyStart, keyEnd - keyStart); + string val = argument.Substring(valStart); + argumentDict.Add(key, val); + return argumentDict; + } + } +} diff --git a/src/tests/Grape/TestRunner.cs b/src/tests/Grape/TestRunner.cs new file mode 100644 index 0000000000..7218b2eafb --- /dev/null +++ b/src/tests/Grape/TestRunner.cs @@ -0,0 +1,65 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; + + +using Microsoft.Diagnostics.NETCore.Client; + +namespace Microsoft.Diagnostics.Grape +{ + public class TestRunner + { + private Process testProcess; + private ProcessStartInfo startInfo; + + public TestRunner(string testExePath, string argument=null) + { + startInfo = new ProcessStartInfo(testExePath, argument); + startInfo.UseShellExecute = false; + startInfo.RedirectStandardOutput = true; + } + + public void AddEnvVar(string key, string value) + { + startInfo.EnvironmentVariables[key] = value; + } + + public void Start(int timeoutInMS=0) + { + Debug.WriteLine("$[{DateTime.Now.ToString()}] Launching test: " + startInfo.FileName); + testProcess = Process.Start(startInfo); + + if (testProcess == null) + { + Debug.WriteLine($"Could not start process: " + startInfo.FileName); + } + + if (testProcess.HasExited) + { + Debug.WriteLine($"Process " + startInfo.FileName + " came back as exited"); + } + + Debug.WriteLine($"[{DateTime.Now.ToString()}] Successfuly started process {testProcess.Id}"); + Debug.WriteLine($"Have total {testProcess.Modules.Count} modules loaded"); + + Debug.WriteLine($"[{DateTime.Now.ToString()}] Sleeping for {timeoutInMS} ms."); + Thread.Sleep(timeoutInMS); + Debug.WriteLine($"[{DateTime.Now.ToString()}] Done sleeping. Ready to test."); + } + + public void Stop() + { + testProcess.Kill(); + } + + public int Pid { + get { return testProcess.Id; } + } + + } +} diff --git a/src/tests/Grape/TraceGeneratorConfiguration.cs b/src/tests/Grape/TraceGeneratorConfiguration.cs new file mode 100644 index 0000000000..99277c8022 --- /dev/null +++ b/src/tests/Grape/TraceGeneratorConfiguration.cs @@ -0,0 +1,21 @@ + +using System; +using System.Collections.Generic; + +namespace Microsoft.Diagnostics.Grape +{ + public class TraceGeneratorConfiguration + { + public int duration { get; set; } + public IList eventProviders { get; set; } + public string traceName { get; set; } + } + + public class EventProvider + { + public string Name { get; set; } + public int Level { get; set; } + public string Keywords { get; set; } // Essentially this should be a string representation of a hex number + public string Arguments { get; set; } + } +} diff --git a/src/tests/Grape/TraceGenerators/EtwTraceGenerator.cs b/src/tests/Grape/TraceGenerators/EtwTraceGenerator.cs new file mode 100644 index 0000000000..bb70ab2159 --- /dev/null +++ b/src/tests/Grape/TraceGenerators/EtwTraceGenerator.cs @@ -0,0 +1,62 @@ +using System; +using System.Diagnostics.Tracing; +using System.Collections.Generic; +using System.Threading.Tasks; +using System.IO; +using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Diagnostics.Tracing; +using Microsoft.Diagnostics.Tracing.Parsers; +using Microsoft.Diagnostics.Tracing.Parsers.Kernel; +using Microsoft.Diagnostics.Tracing.Session; + + + +namespace Microsoft.Diagnostics.Grape +{ + public class EtwTraceGenerator + { + TestRunner _runner; + string _pathToExe; + string _traceName; + List _providers; + + public EtwTraceGenerator(string pathToExe, string traceName, List providers) + { + _pathToExe = pathToExe; + _traceName = traceName; + _providers = providers; + } + + public void Collect(int duration) + { + var pid = LaunchProcess(_pathToExe); + TraceProcessForDuration(duration, _traceName); + } + + private int LaunchProcess(string pathToExe) + { + _runner = new TestRunner(pathToExe); + // Technically this doesn't have to sleep but I'm keeping it here to keep it consistent with EventPipe until we have EventPipe startup tracing. + _runner.Start(2000); + return _runner.Pid; + } + + public void TraceProcessForDuration(int duration, string traceName) + { + var tracesession = new TraceEventSession("testname", _traceName); + + foreach (var provider in _providers) + { + tracesession.EnableProvider(provider.Name, (TraceEventLevel)provider.EventLevel, (ulong)provider.Keywords); + } + + tracesession.EnableProvider("My-Test-EventSource"); + + System.Threading.Thread.Sleep(duration * 1000); + tracesession.Flush(); + + tracesession.DisableProvider("My-Test-EventSource"); + tracesession.Dispose(); + } + } +} diff --git a/src/tests/Grape/TraceGenerators/EventPipeTraceGenerator.cs b/src/tests/Grape/TraceGenerators/EventPipeTraceGenerator.cs new file mode 100644 index 0000000000..60f2f30b1b --- /dev/null +++ b/src/tests/Grape/TraceGenerators/EventPipeTraceGenerator.cs @@ -0,0 +1,60 @@ +using System; +using System.Diagnostics.Tracing; +using System.Collections.Generic; +using System.Threading.Tasks; +using System.IO; +using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Diagnostics.Tracing; +using Microsoft.Diagnostics.Tracing.Parsers; +using Microsoft.Diagnostics.Tracing.Parsers.Kernel; + + + +namespace Microsoft.Diagnostics.Grape +{ + public class EventPipeTraceGenerator + { + TestRunner _runner; + string _pathToExe; + string _traceName; + List _providers; + + public EventPipeTraceGenerator(string pathToExe, string traceName, List providers) + { + _pathToExe = pathToExe; + _traceName = traceName; + _providers = providers; + } + + public void Collect(int duration) + { + var pid = LaunchProcess(_pathToExe); + TraceProcessForDuration(pid, duration, _traceName); + } + + private int LaunchProcess(string pathToExe) + { + _runner = new TestRunner(pathToExe); + // Sleep for some time until diagnostics server pipe gets created + _runner.Start(2000); + return _runner.Pid; + } + + public void TraceProcessForDuration(int processId, int duration, string traceName) + { + var client = new DiagnosticsClient(processId); + using (var traceSession = client.StartEventPipeSession(_providers)) + { + Task copyTask = Task.Run(async () => + { + using (FileStream fs = new FileStream(traceName, FileMode.Create, FileAccess.Write)) + { + await traceSession.EventStream.CopyToAsync(fs); + } + }); + copyTask.Wait(duration * 1000); + traceSession.Stop(); + } + } + } +} diff --git a/src/tests/Grape/config.json b/src/tests/Grape/config.json new file mode 100644 index 0000000000..6f312ff66d --- /dev/null +++ b/src/tests/Grape/config.json @@ -0,0 +1,19 @@ +{ + "traceName": "test", + "duration": 60, + "eventProviders": + [ + { + "Name" : "Microsoft-Windows-DotNETRuntime", + "Level": 4, + "Keywords": "0xffffffffffffffff", + "Arguments": "" + }, + { + "Name" : "System.Runtime", + "Level": 4, + "Keywords": "0xffffffffffffffff", + "Arguments": "EventCounterIntervalSec=1" + } + ] +} \ No newline at end of file From 76c0af21d1eecc55cff9976b620fc4ee8ca5c5e5 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Mon, 23 Dec 2019 17:33:59 -0800 Subject: [PATCH 043/243] Fix EventPipe tests to use the new DiagnosticsClient library (#720) * Change all the EventPipe tests to use DiagnosticsClient library * Specify keyword for SentinelEventSource * Fix MethodEvents * Specify keywords for MyEventSource --- src/tests/eventpipe/ContentionEvents.cs | 14 ++-- .../eventpipe/EventPipe.UnitTests.csproj | 2 +- src/tests/eventpipe/GCEvents.cs | 44 +++++------ src/tests/eventpipe/LoaderEvents.cs | 16 ++-- src/tests/eventpipe/MethodEvents.cs | 16 ++-- src/tests/eventpipe/ThreadPoolEvents.cs | 15 ++-- src/tests/eventpipe/common/IpcTraceTest.cs | 75 +++++++++---------- src/tests/eventpipe/providers.cs | 13 ++-- 8 files changed, 85 insertions(+), 110 deletions(-) diff --git a/src/tests/eventpipe/ContentionEvents.cs b/src/tests/eventpipe/ContentionEvents.cs index e823598a6a..55d7f91f72 100644 --- a/src/tests/eventpipe/ContentionEvents.cs +++ b/src/tests/eventpipe/ContentionEvents.cs @@ -6,10 +6,10 @@ using Xunit; using Xunit.Abstractions; using System.Threading; -using Microsoft.Diagnostics.Tools.RuntimeClient; using System.Collections.Generic; using System.Diagnostics.Tracing; using EventPipe.UnitTests.Common; +using Microsoft.Diagnostics.NETCore.Client; using Microsoft.Diagnostics.Tracing; namespace EventPipe.UnitTests.ContentionValidation @@ -26,11 +26,11 @@ public void DoSomething(TestClass obj) } } } - public class ProviderTests + public class ContentionEventsTests { private readonly ITestOutputHelper output; - public ProviderTests(ITestOutputHelper outputHelper) + public ContentionEventsTests(ITestOutputHelper outputHelper) { output = outputHelper; } @@ -45,10 +45,10 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => { "Microsoft-Windows-DotNETRuntimeRundown", -1 } }; - var providers = new List() + var providers = new List() { //ContentionKeyword (0x4000): 0b100_0000_0000_0000 - new Provider("Microsoft-Windows-DotNETRuntime", 0b100_0000_0000_0000, EventLevel.Informational) + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Informational, 0b100_0000_0000_0000) }; Action _eventGeneratingAction = () => @@ -80,9 +80,7 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => return ContentionStartEvents > 0 && ContentionStopEvents > 0 ? 100 : -1; }; }; - var config = new SessionConfiguration(circularBufferSizeMB: (uint)Math.Pow(2, 10), format: EventPipeSerializationFormat.NetTrace, providers: providers); - - var ret = IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, config, _DoesTraceContainEvents); + var ret = IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, providers, 1024, _DoesTraceContainEvents); Assert.Equal(100, ret); }, output); } diff --git a/src/tests/eventpipe/EventPipe.UnitTests.csproj b/src/tests/eventpipe/EventPipe.UnitTests.csproj index 1f9850728d..b2b95fdf4d 100644 --- a/src/tests/eventpipe/EventPipe.UnitTests.csproj +++ b/src/tests/eventpipe/EventPipe.UnitTests.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/tests/eventpipe/GCEvents.cs b/src/tests/eventpipe/GCEvents.cs index 67147c8f70..ad36377fa2 100644 --- a/src/tests/eventpipe/GCEvents.cs +++ b/src/tests/eventpipe/GCEvents.cs @@ -5,12 +5,11 @@ using System; using Xunit; using Xunit.Abstractions; -using Microsoft.Diagnostics.Tools.RuntimeClient; using System.Collections.Generic; using System.Diagnostics.Tracing; using EventPipe.UnitTests.Common; +using Microsoft.Diagnostics.NETCore.Client; using Microsoft.Diagnostics.Tracing; -using System.Threading; namespace EventPipe.UnitTests.GCEventsValidation { @@ -26,11 +25,11 @@ public TestClass() b = ""; } } - public class ProviderTests + public class GCEventsTests { private readonly ITestOutputHelper output; - public ProviderTests(ITestOutputHelper outputHelper) + public GCEventsTests(ITestOutputHelper outputHelper) { output = outputHelper; } @@ -47,11 +46,11 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => { "Microsoft-DotNETCore-SampleProfiler", -1 } }; - var providers = new List() + var GCProviders = new List() { - new Provider("Microsoft-DotNETCore-SampleProfiler"), + new EventPipeProvider("Microsoft-DotNETCore-SampleProfiler", EventLevel.Informational), //GCKeyword (0x1): 0b1 - new Provider("Microsoft-Windows-DotNETRuntime", 0b1, EventLevel.Informational) + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Verbose, 0x1) }; Action _eventGeneratingAction = () => @@ -91,7 +90,7 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => Logger.logger.Log("GCStartEvents: " + GCStartEvents); Logger.logger.Log("GCEndEvents: " + GCEndEvents); - bool GCStartStopResult = GCStartEvents >= 50 && GCEndEvents >= 50 && Math.Abs(GCStartEvents - GCEndEvents) <=2; + bool GCStartStopResult = GCStartEvents >= 50 && GCEndEvents >= 50 && Math.Abs(GCStartEvents - GCEndEvents) <= 2; Logger.logger.Log("GCStartStopResult check: " + GCStartStopResult); Logger.logger.Log("GCRestartEEStartEvents: " + GCRestartEEStartEvents); @@ -112,9 +111,7 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => }; }; - var config = new SessionConfiguration(circularBufferSizeMB: (uint)Math.Pow(2, 10), format: EventPipeSerializationFormat.NetTrace, providers: providers); - - var ret = IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, config, _DoesTraceContainEvents); + var ret = IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, GCProviders, 1024, _DoesTraceContainEvents); Assert.Equal(100, ret); }, output); } @@ -130,12 +127,12 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => { "Microsoft-Windows-DotNETRuntimeRundown", -1 }, { "Microsoft-DotNETCore-SampleProfiler", -1 } }; - - var providers = new List() + + var GCProviders = new List() { - new Provider("Microsoft-DotNETCore-SampleProfiler"), + new EventPipeProvider("Microsoft-DotNETCore-SampleProfiler", EventLevel.Informational), //GCKeyword (0x1): 0b1 - new Provider("Microsoft-Windows-DotNETRuntime", 0b1, EventLevel.Informational) + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Verbose, 0x1) }; Action _eventGeneratingAction = () => @@ -164,10 +161,7 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => return GCFinalizersEndEvents >= 50 && GCFinalizersStartEvents >= 50 ? 100 : -1; }; }; - - var config = new SessionConfiguration(circularBufferSizeMB: (uint)Math.Pow(2, 10), format: EventPipeSerializationFormat.NetTrace, providers: providers); - - var ret = IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, config, _DoesTraceContainEvents); + var ret = IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, GCProviders, 1024, _DoesTraceContainEvents); Assert.Equal(100, ret); }, output); } @@ -183,12 +177,12 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => { "Microsoft-Windows-DotNETRuntimeRundown", -1 }, { "Microsoft-DotNETCore-SampleProfiler", -1 } }; - - var providers = new List() + + var GCProviders = new List() { - new Provider("Microsoft-DotNETCore-SampleProfiler"), + new EventPipeProvider("Microsoft-DotNETCore-SampleProfiler", EventLevel.Informational), //GCKeyword (0x1): 0b1 - new Provider("Microsoft-Windows-DotNETRuntime", 0b1, EventLevel.Verbose) + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Verbose, 0x1) }; Action _eventGeneratingAction = () => @@ -236,9 +230,7 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => }; }; - var config = new SessionConfiguration(circularBufferSizeMB: (uint)Math.Pow(2, 10), format: EventPipeSerializationFormat.NetTrace, providers: providers); - - var ret = IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, config, _DoesTraceContainEvents); + var ret = IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, GCProviders, 1024, _DoesTraceContainEvents); Assert.Equal(100, ret); }, output); } diff --git a/src/tests/eventpipe/LoaderEvents.cs b/src/tests/eventpipe/LoaderEvents.cs index a654fdd687..6f68063aa7 100644 --- a/src/tests/eventpipe/LoaderEvents.cs +++ b/src/tests/eventpipe/LoaderEvents.cs @@ -6,13 +6,12 @@ using Xunit; using System.IO; using System.Runtime.Loader; -using System.Threading; using System.Reflection; using Xunit.Abstractions; -using Microsoft.Diagnostics.Tools.RuntimeClient; using System.Collections.Generic; using System.Diagnostics.Tracing; using EventPipe.UnitTests.Common; +using Microsoft.Diagnostics.NETCore.Client; using Microsoft.Diagnostics.Tracing; namespace EventPipe.UnitTests.LoaderEventsValidation @@ -23,11 +22,11 @@ public AssemblyLoad() : base(true) { } } - public class ProviderTests + public class LoaderEventsTests { private readonly ITestOutputHelper output; - public ProviderTests(ITestOutputHelper outputHelper) + public LoaderEventsTests(ITestOutputHelper outputHelper) { output = outputHelper; } @@ -43,10 +42,10 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => { "Microsoft-Windows-DotNETRuntimeRundown", -1 } }; - var providers = new List() + var providers = new List() { //LoaderKeyword (0x8): 0b1000 - new Provider("Microsoft-Windows-DotNETRuntime", 0b1000, EventLevel.Informational) + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Informational, 0b1000) }; string assemblyPath=null; @@ -106,10 +105,7 @@ void GetAssemblyPath() return LoaderAssemblyResult && LoaderModuleResult ? 100 : -1; }; }; - - var config = new SessionConfiguration(circularBufferSizeMB: (uint)Math.Pow(2, 10), format: EventPipeSerializationFormat.NetTrace, providers: providers); - - var ret = IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, config, _DoesTraceContainEvents); + var ret = IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, providers, 1024, _DoesTraceContainEvents); Assert.Equal(100, ret); }, output); } diff --git a/src/tests/eventpipe/MethodEvents.cs b/src/tests/eventpipe/MethodEvents.cs index f1b5833c53..3b0d7728f3 100644 --- a/src/tests/eventpipe/MethodEvents.cs +++ b/src/tests/eventpipe/MethodEvents.cs @@ -6,10 +6,10 @@ using Xunit; using System.ComponentModel; using Xunit.Abstractions; -using Microsoft.Diagnostics.Tools.RuntimeClient; using System.Collections.Generic; using System.Diagnostics.Tracing; using EventPipe.UnitTests.Common; +using Microsoft.Diagnostics.NETCore.Client; using Microsoft.Diagnostics.Tracing; namespace EventPipe.UnitTests.MethodEventsValidation @@ -25,11 +25,11 @@ public void Dispose() GC.SuppressFinalize(this); } } - public class ProviderTests + public class MethodEventsTests { private readonly ITestOutputHelper output; - public ProviderTests(ITestOutputHelper outputHelper) + public MethodEventsTests(ITestOutputHelper outputHelper) { output = outputHelper; } @@ -46,11 +46,11 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => { "Microsoft-DotNETCore-SampleProfiler", -1 } }; - var providers = new List() + var providers = new List() { - new Provider("Microsoft-DotNETCore-SampleProfiler"), + new EventPipeProvider("Microsoft-DotNETCore-SampleProfiler", EventLevel.Informational), //MethodVerboseKeyword (0x10): 0b10000 - new Provider("Microsoft-Windows-DotNETRuntime", 0b10000, EventLevel.Verbose) + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Verbose, 0b10000) }; Action _eventGeneratingAction = () => @@ -93,9 +93,7 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => }; }; - var config = new SessionConfiguration(circularBufferSizeMB: (uint)Math.Pow(2, 10), format: EventPipeSerializationFormat.NetTrace, providers: providers); - - var ret = IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, config, _DoesTraceContainEvents); + var ret = IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, providers, 1024, _DoesTraceContainEvents); Assert.Equal(100, ret); }, output); } diff --git a/src/tests/eventpipe/ThreadPoolEvents.cs b/src/tests/eventpipe/ThreadPoolEvents.cs index 94cc391ec7..92cfb1b9f3 100644 --- a/src/tests/eventpipe/ThreadPoolEvents.cs +++ b/src/tests/eventpipe/ThreadPoolEvents.cs @@ -8,19 +8,19 @@ using System.Threading; using System.Threading.Tasks; using Xunit.Abstractions; -using Microsoft.Diagnostics.Tools.RuntimeClient; using System.Collections.Generic; using System.Diagnostics.Tracing; using EventPipe.UnitTests.Common; +using Microsoft.Diagnostics.NETCore.Client; using Microsoft.Diagnostics.Tracing; namespace EventPipe.UnitTests.ThreadPoolValidation { - public class ProviderTests + public class ThreadPoolEventsTests { private readonly ITestOutputHelper output; - public ProviderTests(ITestOutputHelper outputHelper) + public ThreadPoolEventsTests(ITestOutputHelper outputHelper) { output = outputHelper; } @@ -36,10 +36,10 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => { "Microsoft-Windows-DotNETRuntimeRundown", -1 } }; - var providers = new List() + var providers = new List() { //ThreadingKeyword (0x10000): 0b10000_0000_0000_0000 - new Provider("Microsoft-Windows-DotNETRuntime", 0b10000_0000_0000_0000, EventLevel.Informational) + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Informational, 0b10000_0000_0000_0000) }; Action _eventGeneratingAction = () => @@ -84,10 +84,7 @@ void TestTask() return ThreadStartStopResult && ThreadAdjustmentResult ? 100 : -1; }; }; - - var config = new SessionConfiguration(circularBufferSizeMB: (uint)Math.Pow(2, 10), format: EventPipeSerializationFormat.NetTrace, providers: providers); - - var ret = IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, config, _DoesTraceContainEvents); + var ret = IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, providers, 1024, _DoesTraceContainEvents); Assert.Equal(100, ret); }, output); } diff --git a/src/tests/eventpipe/common/IpcTraceTest.cs b/src/tests/eventpipe/common/IpcTraceTest.cs index 6d5b908462..9165557d39 100644 --- a/src/tests/eventpipe/common/IpcTraceTest.cs +++ b/src/tests/eventpipe/common/IpcTraceTest.cs @@ -10,10 +10,10 @@ using System.Threading.Tasks; using System.Collections.Generic; using Microsoft.Diagnostics.Tracing; -using Microsoft.Diagnostics.Tools.RuntimeClient; using System.Runtime.InteropServices; using System.Linq; using System.Text.RegularExpressions; +using Microsoft.Diagnostics.NETCore.Client; namespace EventPipe.UnitTests.Common { @@ -91,16 +91,6 @@ private SentinelEventSource() {} public void SentinelEvent() { WriteEvent(1, "SentinelEvent"); } } - public static class SessionConfigurationExtensions - { - public static SessionConfiguration InjectSentinel(this SessionConfiguration sessionConfiguration) - { - var newProviderList = new List(sessionConfiguration.Providers); - newProviderList.Add(new Provider("SentinelEventSource")); - return new SessionConfiguration(sessionConfiguration.CircularBufferSizeInMB, sessionConfiguration.Format, newProviderList.AsReadOnly()); - } - } - public class IpcTraceTest { // This Action is executed while the trace is being collected. @@ -112,7 +102,6 @@ public class IpcTraceTest private Dictionary _expectedEventCounts; private Dictionary _actualEventCounts = new Dictionary(); private int _droppedEvents = 0; - private SessionConfiguration _sessionConfiguration; // A function to be called with the EventPipeEventSource _before_ // the call to `source.Process()`. The function should return another @@ -120,21 +109,34 @@ public class IpcTraceTest // Example in situ: providervalidation.cs private Func> _optionalTraceValidator; + /// + /// This is list of the EventPipe providers to turn on for the test execution + /// + private List _testProviders; + + /// + /// This represents the current EventPipeSession + /// + private EventPipeSession _eventPipeSession; + + /// + /// This is the list of EventPipe providers for the sentinel EventSource that indicates that the process is ready + /// + private List _sentinelProviders = new List() + { + new EventPipeProvider("SentinelEventSource", EventLevel.Verbose, -1) + }; + IpcTraceTest( Dictionary expectedEventCounts, Action eventGeneratingAction, - SessionConfiguration sessionConfiguration = null, + List providers, + int circularBufferMB, Func> optionalTraceValidator = null) { _eventGeneratingAction = eventGeneratingAction; _expectedEventCounts = expectedEventCounts; - _sessionConfiguration = sessionConfiguration?.InjectSentinel() ?? new SessionConfiguration( - circularBufferSizeMB: 1000, - format: EventPipeSerializationFormat.NetTrace, - providers: new List { - new Provider("Microsoft-Windows-DotNETRuntime"), - new Provider("SentinelEventSource") - }); + _testProviders = providers; _optionalTraceValidator = optionalTraceValidator; } @@ -144,12 +146,7 @@ private int Fail(string message = "") Logger.logger.Log(message); Logger.logger.Log("Configuration:"); Logger.logger.Log("{"); - Logger.logger.Log($"\tbufferSize: {_sessionConfiguration.CircularBufferSizeInMB},"); Logger.logger.Log("\tproviders: ["); - foreach (var provider in _sessionConfiguration.Providers) - { - Logger.logger.Log($"\t\t{provider.ToString()},"); - } Logger.logger.Log("\t]"); Logger.logger.Log("}\n"); Logger.logger.Log("Expected:"); @@ -192,25 +189,24 @@ private int Validate() sentinelTask.Start(); int processId = Process.GetCurrentProcess().Id; - object threadSync = new object(); // for locking eventpipeSessionId access - ulong eventpipeSessionId = 0; + object threadSync = new object(); // for locking eventpipeSession access Func optionalTraceValidationCallback = null; + DiagnosticsClient client = new DiagnosticsClient(processId); var readerTask = new Task(() => { Logger.logger.Log("Connecting to EventPipe..."); - using var eventPipeStream = new StreamProxy(EventPipeClient.CollectTracing(processId, _sessionConfiguration, out var sessionId)); - if (sessionId == 0) + try { - Logger.logger.Log("Failed to connect to EventPipe!"); - throw new ApplicationException("Failed to connect to EventPipe"); + _eventPipeSession = client.StartEventPipeSession(_testProviders.Concat(_sentinelProviders)); } - Logger.logger.Log($"Connected to EventPipe with sessionID '0x{sessionId:x}'"); - - lock (threadSync) + catch(DiagnosticsClientException ex) { - eventpipeSessionId = sessionId; + Logger.logger.Log("Failed to connect to EventPipe!"); + Logger.logger.Log(ex.ToString()); + throw new ApplicationException("Failed to connect to EventPipe"); } + using var eventPipeStream = new StreamProxy(_eventPipeSession.EventStream); Logger.logger.Log("Creating EventPipeEventSource..."); using EventPipeEventSource source = new EventPipeEventSource(eventPipeStream); Logger.logger.Log("EventPipeEventSource created"); @@ -293,9 +289,9 @@ private int Validate() var stopTask = Task.Run(() => { Logger.logger.Log("Sending StopTracing command..."); - lock (threadSync) // eventpipeSessionId + lock (threadSync) // eventpipeSession { - EventPipeClient.StopTracing(processId, eventpipeSessionId); + _eventPipeSession.Stop(); } Logger.logger.Log("Finished StopTracing command"); }, ct); @@ -408,11 +404,12 @@ private bool EnsureCleanEnvironment() public static int RunAndValidateEventCounts( Dictionary expectedEventCounts, Action eventGeneratingAction, - SessionConfiguration sessionConfiguration = null, + List providers, + int circularBufferMB=1024, Func> optionalTraceValidator = null) { Logger.logger.Log("==TEST STARTING=="); - var test = new IpcTraceTest(expectedEventCounts, eventGeneratingAction, sessionConfiguration, optionalTraceValidator); + var test = new IpcTraceTest(expectedEventCounts, eventGeneratingAction, providers, circularBufferMB, optionalTraceValidator); var ret = test.Validate(); if (ret == 100) Logger.logger.Log("==TEST FINISHED: PASSED!=="); diff --git a/src/tests/eventpipe/providers.cs b/src/tests/eventpipe/providers.cs index 75a96ca4b2..313079ff47 100644 --- a/src/tests/eventpipe/providers.cs +++ b/src/tests/eventpipe/providers.cs @@ -5,10 +5,10 @@ using System; using Xunit; using Xunit.Abstractions; -using Microsoft.Diagnostics.Tools.RuntimeClient; using System.Collections.Generic; using System.Diagnostics.Tracing; using EventPipe.UnitTests.Common; +using Microsoft.Diagnostics.NETCore.Client; // Use this test as an example of how to write tests for EventPipe in // the dotnet/diagnostics repo @@ -43,10 +43,10 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => { "Microsoft-DotNETCore-SampleProfiler", -1 } }; - var providers = new List() + var providers = new List() { - new Provider("MyEventSource"), - new Provider("Microsoft-DotNETCore-SampleProfiler") + new EventPipeProvider("MyEventSource", EventLevel.Verbose, -1), + new EventPipeProvider("Microsoft-DotNETCore-SampleProfiler", EventLevel.Informational) }; Action eventGeneratingAction = () => @@ -58,10 +58,7 @@ await RemoteTestExecutorHelper.RunTestCaseAsync(() => MyEventSource.Log.MyEvent(); } }; - - var config = new SessionConfiguration(circularBufferSizeMB: (uint)Math.Pow(2, 10), format: EventPipeSerializationFormat.NetTrace, providers: providers); - - var ret = IpcTraceTest.RunAndValidateEventCounts(expectedEventCounts, eventGeneratingAction, config); + var ret = IpcTraceTest.RunAndValidateEventCounts(expectedEventCounts, eventGeneratingAction, providers, 1024, null); Assert.Equal(100, ret); }, output); } From 1590aaa59d3c940d536fbab77981fbabcae5ce8d Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Mon, 23 Dec 2019 19:46:28 -0800 Subject: [PATCH 044/243] Display rundown information when stopping trace (#721) --- .../CommandLine/Commands/CollectCommand.cs | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs index 298bc68244..8cc33b7ffb 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs @@ -97,6 +97,7 @@ private static async Task Collect(CancellationToken ct, IConsole console, i var shouldStopAfterDuration = duration != default(TimeSpan); var failed = false; var terminated = false; + var rundownRequested = false; System.Timers.Timer durationTimer = null; ct.Register(() => shouldExit.Set()); @@ -152,15 +153,18 @@ private static async Task Collect(CancellationToken ct, IConsole console, i break; fs.Write(buffer, 0, nBytesRead); - if (hasConsole) + if (!rundownRequested) { - lineToClear = Console.CursorTop - 1; - ResetCurrentConsoleLine(vTermMode.IsEnabled); + if (hasConsole) + { + lineToClear = Console.CursorTop - 1; + ResetCurrentConsoleLine(vTermMode.IsEnabled); + } + + Console.Out.WriteLine($"[{stopwatch.Elapsed.ToString(@"dd\:hh\:mm\:ss")}]\tRecording trace {GetSize(fs.Length)}"); + Console.Out.WriteLine("Press or to exit..."); + Debug.WriteLine($"PACKET: {Convert.ToBase64String(buffer, 0, nBytesRead)} (bytes {nBytesRead})"); } - - Console.Out.WriteLine($"[{stopwatch.Elapsed.ToString(@"dd\:hh\:mm\:ss")}]\tRecording trace {GetSize(fs.Length)}"); - Console.Out.WriteLine("Press or to exit..."); - Debug.WriteLine($"PACKET: {Convert.ToBase64String(buffer, 0, nBytesRead)} (bytes {nBytesRead})"); } } } @@ -185,6 +189,13 @@ private static async Task Collect(CancellationToken ct, IConsole console, i if (!terminated) { durationTimer?.Stop(); + if (hasConsole) + { + lineToClear = Console.CursorTop; + ResetCurrentConsoleLine(vTermMode.IsEnabled); + } + Console.Out.WriteLine("Stopping the trace. This may take up to minutes depending on the application being traced."); + rundownRequested = true; session.Stop(); } await collectingTask; From 0b3c2c6bc3f6b6960c9c8bfd9cd75af766d6ca2f Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Thu, 26 Dec 2019 12:15:43 -0800 Subject: [PATCH 045/243] Remove legacy RuntimeClient library (#722) --- diagnostics.sln | 45 +-- .../DiagnosticsHelpers.cs | 149 -------- .../DiagnosticsIpc/IpcClient.cs | 112 ------ .../DiagnosticsIpc/IpcCommands.cs | 42 -- .../DiagnosticsIpc/IpcHeader.cs | 77 ---- .../DiagnosticsIpc/IpcMessage.cs | 62 --- .../Eventing/DiagnosticsMessageType.cs | 33 -- .../Eventing/EventPipeClient.cs | 167 -------- .../Eventing/EventPipeSessionType.cs | 27 -- .../Eventing/MessageHeader.cs | 25 -- .../Eventing/Provider.cs | 75 ---- .../Eventing/SessionConfiguration.cs | 107 ------ .../Extensions.cs | 53 --- ...oft.Diagnostics.Tools.RuntimeClient.csproj | 14 - .../Assert.cs | 53 --- .../Program.cs | 359 ------------------ .../TestProvider.cs | 19 - .../TestSessionConfiguration.cs | 17 - .../Workload.cs | 57 --- .../eventpipetests.csproj | 17 - 20 files changed, 1 insertion(+), 1509 deletions(-) delete mode 100644 src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsHelpers.cs delete mode 100644 src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcClient.cs delete mode 100644 src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcCommands.cs delete mode 100644 src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcHeader.cs delete mode 100644 src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcMessage.cs delete mode 100644 src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/DiagnosticsMessageType.cs delete mode 100644 src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/EventPipeClient.cs delete mode 100644 src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/EventPipeSessionType.cs delete mode 100644 src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/MessageHeader.cs delete mode 100644 src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/Provider.cs delete mode 100644 src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/SessionConfiguration.cs delete mode 100644 src/Microsoft.Diagnostics.Tools.RuntimeClient/Extensions.cs delete mode 100644 src/Microsoft.Diagnostics.Tools.RuntimeClient/Microsoft.Diagnostics.Tools.RuntimeClient.csproj delete mode 100644 src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/Assert.cs delete mode 100644 src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/Program.cs delete mode 100644 src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/TestProvider.cs delete mode 100644 src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/TestSessionConfiguration.cs delete mode 100644 src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/Workload.cs delete mode 100644 src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/eventpipetests.csproj diff --git a/diagnostics.sln b/diagnostics.sln index 1ba3fc9c4d..5f400e0e97 100644 --- a/diagnostics.sln +++ b/diagnostics.sln @@ -39,8 +39,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.Repl" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-counters", "src\Tools\dotnet-counters\dotnet-counters.csproj", "{2A9B5988-982F-4E26-9E44-D38AC5978C30}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.Tools.RuntimeClient", "src\Microsoft.Diagnostics.Tools.RuntimeClient\Microsoft.Diagnostics.Tools.RuntimeClient.csproj", "{54C240C5-7932-4421-A5FB-75205DE0B824}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SOS.Package", "src\SOS\SOS.Package\SOS.Package.csproj", "{234416E9-EA5F-4018-AC34-67682C5D3E04}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.DebugServices", "src\Microsoft.Diagnostics.DebugServices\Microsoft.Diagnostics.DebugServices.csproj", "{A1CE682A-12C4-4FF9-B864-A9A15A8726D2}" @@ -59,7 +57,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.NETCo EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.NETCore.Client.UnitTests", "src\tests\Microsoft.Diagnostics.NETCore.Client\Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj", "{6F4DD2F8-1C7B-4A87-B7E5-1BEE9F5AC128}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tracee", "src\tests\Tracee\Tracee.csproj", "{C79D6069-2C18-48CB-846E-71F7168C2F7D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tracee", "src\tests\Tracee\Tracee.csproj", "{C79D6069-2C18-48CB-846E-71F7168C2F7D}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventPipe.UnitTests", "src\tests\eventpipe\EventPipe.UnitTests.csproj", "{CED9ABBA-861E-4C0A-9359-22351208EF27}" EndProject @@ -626,46 +624,6 @@ Global {2A9B5988-982F-4E26-9E44-D38AC5978C30}.RelWithDebInfo|x64.Build.0 = Release|Any CPU {2A9B5988-982F-4E26-9E44-D38AC5978C30}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU {2A9B5988-982F-4E26-9E44-D38AC5978C30}.RelWithDebInfo|x86.Build.0 = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Checked|Any CPU.Build.0 = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Checked|ARM.ActiveCfg = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Checked|ARM.Build.0 = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Checked|ARM64.ActiveCfg = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Checked|ARM64.Build.0 = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Checked|x64.ActiveCfg = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Checked|x64.Build.0 = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Checked|x86.ActiveCfg = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Checked|x86.Build.0 = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Debug|Any CPU.Build.0 = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Debug|ARM.ActiveCfg = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Debug|ARM.Build.0 = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Debug|ARM64.Build.0 = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Debug|x64.ActiveCfg = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Debug|x64.Build.0 = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Debug|x86.ActiveCfg = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Debug|x86.Build.0 = Debug|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Release|Any CPU.ActiveCfg = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Release|Any CPU.Build.0 = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Release|ARM.ActiveCfg = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Release|ARM.Build.0 = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Release|ARM64.ActiveCfg = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Release|ARM64.Build.0 = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Release|x64.ActiveCfg = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Release|x64.Build.0 = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Release|x86.ActiveCfg = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.Release|x86.Build.0 = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.RelWithDebInfo|x64.Build.0 = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU - {54C240C5-7932-4421-A5FB-75205DE0B824}.RelWithDebInfo|x86.Build.0 = Release|Any CPU {234416E9-EA5F-4018-AC34-67682C5D3E04}.Checked|Any CPU.ActiveCfg = Debug|Any CPU {234416E9-EA5F-4018-AC34-67682C5D3E04}.Checked|Any CPU.Build.0 = Debug|Any CPU {234416E9-EA5F-4018-AC34-67682C5D3E04}.Checked|ARM.ActiveCfg = Debug|Any CPU @@ -1088,7 +1046,6 @@ Global {ED27F39F-DF5C-4E22-87E0-EC5B5873B503} = {41638A4C-0DAF-47ED-A774-ECBBAC0315D7} {90CF2633-58F0-44EE-943B-D70207455F20} = {19FAB78C-3351-4911-8F0C-8C6056401740} {2A9B5988-982F-4E26-9E44-D38AC5978C30} = {B62728C8-1267-4043-B46F-5537BBAEC692} - {54C240C5-7932-4421-A5FB-75205DE0B824} = {19FAB78C-3351-4911-8F0C-8C6056401740} {234416E9-EA5F-4018-AC34-67682C5D3E04} = {41638A4C-0DAF-47ED-A774-ECBBAC0315D7} {A1CE682A-12C4-4FF9-B864-A9A15A8726D2} = {19FAB78C-3351-4911-8F0C-8C6056401740} {410394E0-7F4F-42D5-B5FA-30956F44ACBC} = {41638A4C-0DAF-47ED-A774-ECBBAC0315D7} diff --git a/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsHelpers.cs b/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsHelpers.cs deleted file mode 100644 index 70c6c0187e..0000000000 --- a/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsHelpers.cs +++ /dev/null @@ -1,149 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using Microsoft.Diagnostics.Tools.RuntimeClient.DiagnosticsIpc; -using System; -using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; - -namespace Microsoft.Diagnostics.Tools.RuntimeClient -{ - public static class DiagnosticsHelpers - { - /// - /// Controls the contents of the dump - /// - public enum DumpType : uint - { - Normal = 1, - WithHeap = 2, - Triage = 3, - Full = 4 - } - - /// - /// Initiate a core dump in the target process runtime. - /// - /// .NET Core process id - /// Path and file name of core dump - /// Type of dump - /// If true, log to console the dump generation diagnostics - /// DiagnosticsServerErrorCode - public static int GenerateCoreDump(int processId, string dumpName, DumpType dumpType, bool diagnostics) - { - if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - throw new PlatformNotSupportedException($"Unsupported operating system: {RuntimeInformation.OSDescription}"); - - if (string.IsNullOrEmpty(dumpName)) - throw new ArgumentNullException($"{nameof(dumpName)} required"); - - - var payload = SerializeCoreDump(dumpName, dumpType, diagnostics); - var message = new IpcMessage(DiagnosticsServerCommandSet.Dump, (byte)DumpCommandId.GenerateCoreDump, payload); - - var response = IpcClient.SendMessage(processId, message); - - var hr = 0; - switch ((DiagnosticsServerCommandId)response.Header.CommandId) - { - case DiagnosticsServerCommandId.Error: - case DiagnosticsServerCommandId.OK: - hr = BitConverter.ToInt32(response.Payload, 0); - break; - default: - return -1; - } - - return hr; - } - - /// - /// Attach a profiler to the target process runtime. - /// - /// .NET Core process id - /// The timeout (in ms) for the runtime to wait while attempting to attach. - /// CLSID of the profiler to load - /// Path to the profiler library on disk - /// additional data to pass to the profiler on attach - /// HRESULT - public static int AttachProfiler(int processId, uint attachTimeout, Guid profilerGuid, string profilerPath, byte[] additionalData) - { - if (profilerGuid == null || profilerGuid == Guid.Empty) - { - throw new ArgumentException($"{nameof(profilerGuid)} must be a valid Guid"); - } - - if (String.IsNullOrEmpty(profilerPath)) - { - throw new ArgumentException($"{nameof(profilerPath)} must be non-null"); - } - - var header = new MessageHeader { - RequestType = DiagnosticsMessageType.AttachProfiler, - Pid = (uint)Process.GetCurrentProcess().Id, - }; - - byte[] serializedConfiguration = SerializeProfilerAttach(attachTimeout, profilerGuid, profilerPath, additionalData); - var message = new IpcMessage(DiagnosticsServerCommandSet.Profiler, (byte)ProfilerCommandId.AttachProfiler, serializedConfiguration); - - var response = IpcClient.SendMessage(processId, message); - - var hr = 0; - switch ((DiagnosticsServerCommandId)response.Header.CommandId) - { - case DiagnosticsServerCommandId.Error: - case DiagnosticsServerCommandId.OK: - hr = BitConverter.ToInt32(response.Payload, 0); - break; - default: - hr = -1; - break; - } - - // TODO: the call to set up the pipe and send the message operates on a different timeout than attachTimeout, which is for the runtime. - // We should eventually have a configurable timeout for the message passing, potentially either separately from the - // runtime timeout or respect attachTimeout as one total duration. - return hr; - } - - private static byte[] SerializeProfilerAttach(uint attachTimeout, Guid profilerGuid, string profilerPath, byte[] additionalData) - { - using (var stream = new MemoryStream()) - using (var writer = new BinaryWriter(stream)) - { - writer.Write(attachTimeout); - writer.Write(profilerGuid.ToByteArray()); - writer.WriteString(profilerPath); - - if (additionalData == null) - { - writer.Write(0); - } - else - { - writer.Write(additionalData.Length); - writer.Write(additionalData); - } - - writer.Flush(); - return stream.ToArray(); - } - } - - private static byte[] SerializeCoreDump(string dumpName, DumpType dumpType, bool diagnostics) - { - using (var stream = new MemoryStream()) - using (var writer = new BinaryWriter(stream)) - { - writer.WriteString(dumpName); - writer.Write((uint)dumpType); - writer.Write((uint)(diagnostics ? 1 : 0)); - - writer.Flush(); - return stream.ToArray(); - } - } - } -} diff --git a/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcClient.cs b/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcClient.cs deleted file mode 100644 index 7897f0539a..0000000000 --- a/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcClient.cs +++ /dev/null @@ -1,112 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Pipes; -using System.Linq; -using System.Net.Sockets; -using System.Runtime.InteropServices; -using System.Security.Principal; -using System.Text; -using System.Text.RegularExpressions; - -namespace Microsoft.Diagnostics.Tools.RuntimeClient.DiagnosticsIpc -{ - public class IpcClient - { - private static string DiagnosticsPortPattern { get; } = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? @"^dotnet-diagnostic-(\d+)$" : @"^dotnet-diagnostic-(\d+)-(\d+)-socket$"; - - private static string IpcRootPath { get; } = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? @"\\.\pipe\" : Path.GetTempPath(); - - private static double ConnectTimeoutMilliseconds { get; } = TimeSpan.FromSeconds(3).TotalMilliseconds; - - /// - /// Get the OS Transport to be used for communicating with a dotnet process. - /// - /// The PID of the dotnet process to get the transport for - /// A System.IO.Stream wrapper around the transport - private static Stream GetTransport(int processId) - { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - string pipeName = $"dotnet-diagnostic-{processId}"; - var namedPipe = new NamedPipeClientStream( - ".", pipeName, PipeDirection.InOut, PipeOptions.None, TokenImpersonationLevel.Impersonation); - namedPipe.Connect((int)ConnectTimeoutMilliseconds); - return namedPipe; - } - else - { - string ipcPort = Directory.GetFiles(IpcRootPath) // Try best match. - .Select(namedPipe => (new FileInfo(namedPipe)).Name) - .SingleOrDefault(input => Regex.IsMatch(input, $"^dotnet-diagnostic-{processId}-(\\d+)-socket$")); - if (ipcPort == null) - { - throw new PlatformNotSupportedException($"Process {processId} not running compatible .NET Core runtime"); - } - string path = Path.Combine(Path.GetTempPath(), ipcPort); - var remoteEP = new UnixDomainSocketEndPoint(path); - - var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified); - socket.Connect(remoteEP); - return new NetworkStream(socket); - } - } - - /// - /// Sends a single DiagnosticsIpc Message to the dotnet process with PID processId. - /// - /// The PID of the dotnet process - /// The DiagnosticsIpc Message to be sent - /// The response DiagnosticsIpc Message from the dotnet process - public static IpcMessage SendMessage(int processId, IpcMessage message) - { - using (var stream = GetTransport(processId)) - { - Write(stream, message); - return Read(stream); - } - } - - /// - /// Sends a single DiagnosticsIpc Message to the dotnet process with PID processId - /// and returns the Stream for reuse in Optional Continuations. - /// - /// The PID of the dotnet process - /// The DiagnosticsIpc Message to be sent - /// out var for response message - /// The response DiagnosticsIpc Message from the dotnet process - public static Stream SendMessage(int processId, IpcMessage message, out IpcMessage response) - { - var stream = GetTransport(processId); - Write(stream, message); - response = Read(stream); - return stream; - } - - private static void Write(Stream stream, byte[] buffer) - { - using (var writer = new BinaryWriter(stream, Encoding.UTF8, true)) - { - writer.Write(buffer); - } - } - - private static void Write(Stream stream, IpcMessage message) - { - using (var writer = new BinaryWriter(stream, Encoding.UTF8, true)) - { - writer.Write(message.Serialize()); - } - } - - - private static IpcMessage Read(Stream stream) - { - return IpcMessage.Parse(stream); - } - } -} diff --git a/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcCommands.cs b/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcCommands.cs deleted file mode 100644 index 8be8f0a3ba..0000000000 --- a/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcCommands.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Microsoft.Diagnostics.Tools.RuntimeClient.DiagnosticsIpc -{ - public enum DiagnosticsServerCommandSet : byte - { - Dump = 0x01, - EventPipe = 0x02, - Profiler = 0x03, - - Server = 0xFF, - } - - public enum DiagnosticsServerCommandId : byte - { - OK = 0x00, - Error = 0xFF, - } - - public enum EventPipeCommandId : byte - { - StopTracing = 0x01, - CollectTracing = 0x02, - CollectTracing2 = 0x03, - } - - public enum DumpCommandId : byte - { - GenerateCoreDump = 0x01, - } - - public enum ProfilerCommandId : byte - { - AttachProfiler = 0x01, - } -} diff --git a/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcHeader.cs b/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcHeader.cs deleted file mode 100644 index 641c0e95df..0000000000 --- a/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcHeader.cs +++ /dev/null @@ -1,77 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Net.Sockets; -using System.Runtime.InteropServices; -using System.Text; - -namespace Microsoft.Diagnostics.Tools.RuntimeClient.DiagnosticsIpc -{ - public class IpcHeader - { - IpcHeader() { } - - public IpcHeader(DiagnosticsServerCommandSet commandSet, byte commandId) - { - CommandSet = (byte)commandSet; - CommandId = commandId; - } - - // the number of bytes for the DiagnosticsIpc::IpcHeader type in native code - public static readonly UInt16 HeaderSizeInBytes = 20; - private static readonly UInt16 MagicSizeInBytes = 14; - - public byte[] Magic = ASCIIEncoding.ASCII.GetBytes("DOTNET_IPC_V1" + '\0'); // byte[14] in native code - public UInt16 Size = HeaderSizeInBytes; - public byte CommandSet; - public byte CommandId; - public UInt16 Reserved = 0x0000; - - - // Helper expression to quickly get V1 magic string for comparison - // should be 14 bytes long - public static byte[] DOTNET_IPC_V1 => ASCIIEncoding.ASCII.GetBytes("DOTNET_IPC_V1" + '\0'); - - public byte[] Serialize() - { - using (var stream = new MemoryStream()) - using (var writer = new BinaryWriter(stream)) - { - writer.Write(Magic); - Debug.Assert(Magic.Length == MagicSizeInBytes); - writer.Write(Size); - writer.Write(CommandSet); - writer.Write(CommandId); - writer.Write((UInt16)0x0000); - writer.Flush(); - return stream.ToArray(); - } - } - - public static IpcHeader TryParse(BinaryReader reader) - { - IpcHeader header = new IpcHeader - { - Magic = reader.ReadBytes(14), - Size = reader.ReadUInt16(), - CommandSet = reader.ReadByte(), - CommandId = reader.ReadByte(), - Reserved = reader.ReadUInt16() - }; - - // TODO: Validate it is correct! - - return header; - } - - override public string ToString() - { - return $"{{ Magic={Magic}; Size={Size}; CommandSet={CommandSet}; CommandId={CommandId}; Reserved={Reserved} }}"; - } - } -} diff --git a/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcMessage.cs b/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcMessage.cs deleted file mode 100644 index dc73a5a228..0000000000 --- a/src/Microsoft.Diagnostics.Tools.RuntimeClient/DiagnosticsIpc/IpcMessage.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace Microsoft.Diagnostics.Tools.RuntimeClient.DiagnosticsIpc -{ - public class IpcMessage - { - public IpcMessage() - { } - - public IpcMessage(IpcHeader header, byte[] payload) - { - Payload = payload; - Header = header; - } - - internal IpcMessage(DiagnosticsServerCommandSet commandSet, byte commandId, byte[] payload = null) - { - Header = new IpcHeader(commandSet, commandId); - Payload = payload; - } - - public byte[] Payload { get; private set; } = null; - public IpcHeader Header { get; private set; } = default; - - public byte[] Serialize() - { - byte[] serializedData = null; - // Verify things will fit in the size capacity - Header.Size = checked((UInt16)(IpcHeader.HeaderSizeInBytes + Payload.Length)); ; - byte[] headerBytes = Header.Serialize(); - - using (var stream = new MemoryStream()) - using (var writer = new BinaryWriter(stream)) - { - writer.Write(headerBytes); - writer.Write(Payload); - writer.Flush(); - serializedData = stream.ToArray(); - } - - return serializedData; - } - - public static IpcMessage Parse(Stream stream) - { - IpcMessage message = new IpcMessage(); - using (var reader = new BinaryReader(stream, Encoding.UTF8, true)) - { - message.Header = IpcHeader.TryParse(reader); - message.Payload = reader.ReadBytes(message.Header.Size - IpcHeader.HeaderSizeInBytes); - return message; - } - } - } -} diff --git a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/DiagnosticsMessageType.cs b/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/DiagnosticsMessageType.cs deleted file mode 100644 index 883ea21184..0000000000 --- a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/DiagnosticsMessageType.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -namespace Microsoft.Diagnostics.Tools.RuntimeClient -{ - /// - /// Different diagnostic message types that are handled by the runtime. - /// - public enum DiagnosticsMessageType : uint - { - /// - /// Initiates core dump generation - /// - GenerateCoreDump = 1, - /// - /// Starts an EventPipe session that writes events to a file when the session is stopped or the application exits. - /// - StartEventPipeTracing = 1024, - /// - /// Stops an EventPipe session. - /// - StopEventPipeTracing, - /// - /// Starts an EventPipe session that sends events out-of-proc through IPC. - /// - CollectEventPipeTracing, - /// - /// Attaches a profiler to an existing process - /// - AttachProfiler = 2048, - } -} diff --git a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/EventPipeClient.cs b/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/EventPipeClient.cs deleted file mode 100644 index 4c46c9bcd7..0000000000 --- a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/EventPipeClient.cs +++ /dev/null @@ -1,167 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using Microsoft.Diagnostics.Tools.RuntimeClient.DiagnosticsIpc; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.IO.Pipes; -using System.Linq; -using System.Net.Sockets; -using System.Runtime.InteropServices; -using System.Security.Principal; -using System.Text; -using System.Text.RegularExpressions; - -namespace Microsoft.Diagnostics.Tools.RuntimeClient -{ - public enum EventPipeErrorCode : uint - { - BAD_ENCODING = 0x80131384, - UNKNOWN_COMMAND = 0x80131385, - UNKNOWN_MAGIC = 0x80131386, - UNKNOWN_ERROR = 0x80131387 - } - - public class EventPipeBadEncodingException : Exception - { - public EventPipeBadEncodingException(string msg) : base(msg) {} - } - public class EventPipeUnknownCommandException : Exception - { - public EventPipeUnknownCommandException(string msg) : base(msg) {} - } - - public class EventPipeUnknownMagicException : Exception - { - public EventPipeUnknownMagicException(string msg) : base(msg) {} - } - - public class EventPipeUnknownErrorException : Exception - { - public EventPipeUnknownErrorException(string msg) : base(msg) {} - } - - public static class EventPipeClient - { - private static string DiagnosticsPortPattern { get; } = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? @"^dotnet-diagnostic-(\d+)$" : @"^dotnet-diagnostic-(\d+)-(\d+)-socket$"; - - private static string IpcRootPath { get; } = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? @"\\.\pipe\" : Path.GetTempPath(); - - /// - /// Get the files associated with the opened IPC Ports for DotNet Core applications. - /// - /// - /// A collection of process identifiers associated with the list of opened files (IPC ports). - /// These process Ids might have expired and not properly cleaned up. - /// - public static IEnumerable ListAvailablePorts() - { - return Directory.GetFiles(IpcRootPath) - .Select(namedPipe => (new FileInfo(namedPipe)).Name) - .Where(input => Regex.IsMatch(input, DiagnosticsPortPattern)) - .Select(input => int.Parse(Regex.Match(input, DiagnosticsPortPattern).Groups[1].Value, NumberStyles.Integer)); - } - - /// - /// Start trace collection. - /// - /// Runtime process to trace - /// buffer size and provider configuration - /// session id - /// Stream - public static Stream CollectTracing(int processId, SessionConfiguration configuration, out ulong sessionId) - { - sessionId = 0; - var message = new IpcMessage(DiagnosticsServerCommandSet.EventPipe, (byte)EventPipeCommandId.CollectTracing, configuration.Serialize()); - var stream = IpcClient.SendMessage(processId, message, out var response); - - switch ((DiagnosticsServerCommandId)response.Header.CommandId) - { - case DiagnosticsServerCommandId.OK: - sessionId = BitConverter.ToUInt64(response.Payload, 0); - break; - case DiagnosticsServerCommandId.Error: - // bad... - var hr = BitConverter.ToInt32(response.Payload, 0); - throw new Exception($"Session start FAILED 0x{hr:X8}"); - default: - break; - } - - return stream; - } - - public static Stream CollectTracing2(int processId, SessionConfigurationV2 configuration, out ulong sessionId) - { - sessionId = 0; - var message = new IpcMessage(DiagnosticsServerCommandSet.EventPipe, (byte)EventPipeCommandId.CollectTracing2, configuration.Serialize()); - var stream = IpcClient.SendMessage(processId, message, out var response); - - switch ((DiagnosticsServerCommandId)response.Header.CommandId) - { - case DiagnosticsServerCommandId.OK: - sessionId = BitConverter.ToUInt64(response.Payload, 0); - break; - case DiagnosticsServerCommandId.Error: - // bad... - uint hr = BitConverter.ToUInt32(response.Payload, 0); - Exception ex = ConvertHRToException(hr, $"Session start FAILED 0x{hr:X8}"); - throw ex; - default: - break; - } - - return stream; - } - - /// - /// Turn off EventPipe logging session for the specified process Id. - /// - /// Process Id to turn off logging session. - /// EventPipe session Id to turn off. - /// It returns sessionId if success, otherwise 0. - public static ulong StopTracing(int processId, ulong sessionId) - { - if (sessionId == 0) - return sessionId; // TODO: Throw here instead? - - byte[] payload = BitConverter.GetBytes(sessionId); - - var response = IpcClient.SendMessage(processId, new IpcMessage(DiagnosticsServerCommandSet.EventPipe, (byte)EventPipeCommandId.StopTracing, payload)); - - switch ((DiagnosticsServerCommandId)response.Header.CommandId) - { - case DiagnosticsServerCommandId.OK: - return BitConverter.ToUInt64(response.Payload, 0); - case DiagnosticsServerCommandId.Error: - return 0; - default: - return 0; - } - } - - private static Exception ConvertHRToException(uint hr, string msg) - { - if (hr == (uint)EventPipeErrorCode.BAD_ENCODING) - { - return new EventPipeBadEncodingException(msg); - } - else if (hr == (uint)EventPipeErrorCode.UNKNOWN_COMMAND) - { - return new EventPipeUnknownCommandException(msg); - } - else if (hr == (uint)EventPipeErrorCode.UNKNOWN_MAGIC) - { - return new EventPipeUnknownMagicException(msg); - } - else - { - return new EventPipeUnknownErrorException(msg); - } - } - } -} diff --git a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/EventPipeSessionType.cs b/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/EventPipeSessionType.cs deleted file mode 100644 index 453408a34e..0000000000 --- a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/EventPipeSessionType.cs +++ /dev/null @@ -1,27 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -namespace Microsoft.Diagnostics.Tools.RuntimeClient -{ - /// - /// Defines constants for EventPipe logging sessions. - /// - public enum EventPipeSessionType : uint - { - /// - /// The events will be written to file at the end of the session. - /// - TraceToFile, - - /// - /// Events will be passed to the EventListener. - /// - CallbackListener, - - /// - /// Events will be sent out-of-proc by writing them to the underlying IPC stream implementation. - /// - TraceToStream - } -} diff --git a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/MessageHeader.cs b/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/MessageHeader.cs deleted file mode 100644 index 49b931cab3..0000000000 --- a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/MessageHeader.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Runtime.InteropServices; - -namespace Microsoft.Diagnostics.Tools.RuntimeClient -{ - /// - /// Message header used to send commands to the .NET Core runtime through IPC. - /// - [StructLayout(LayoutKind.Sequential)] - public struct MessageHeader - { - /// - /// Request type. - /// - public DiagnosticsMessageType RequestType; - - /// - /// Remote process Id. - /// - public uint Pid; - } -} diff --git a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/Provider.cs b/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/Provider.cs deleted file mode 100644 index 16f3ead9c1..0000000000 --- a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/Provider.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Diagnostics.Tracing; -using System.Text.RegularExpressions; - -namespace Microsoft.Diagnostics.Tools.RuntimeClient -{ - public struct Provider - { - public Provider( - string name, - ulong keywords = ulong.MaxValue, - EventLevel eventLevel = EventLevel.Verbose, - string filterData = null) - { - if (string.IsNullOrWhiteSpace(name)) - throw new ArgumentNullException(nameof(name)); - Name = name; - Keywords = keywords; - EventLevel = eventLevel; - FilterData = string.IsNullOrWhiteSpace(filterData) ? null : Regex.Unescape(filterData); - } - - public ulong Keywords { get; } - - public EventLevel EventLevel { get; } - - public string Name { get; } - - public string FilterData { get; } - - public override string ToString() => - $"{Name}:0x{Keywords:X16}:{(uint)EventLevel}{(FilterData == null ? "" : $":{FilterData}")}"; - - public string ToDisplayString() => - String.Format("{0, -40}", Name) + String.Format("0x{0, -18}", $"{Keywords:X16}") + String.Format("{0, -8}", EventLevel.ToString() + $"({(int)EventLevel})"); - - public static bool operator ==(Provider left, Provider right) - { - return left.Name == right.Name && - left.Keywords == right.Keywords && - left.EventLevel == right.EventLevel && - left.FilterData == right.FilterData; - } - - public static bool operator !=(Provider left, Provider right) - { - return !(left == right); - } - - public override bool Equals(object obj) - { - - if (obj == null || GetType() != obj.GetType()) - { - return false; - } - - return this == (Provider)obj; - } - - public override int GetHashCode() - { - int hash = 0; - hash ^= this.Name.GetHashCode(); - hash ^= this.Keywords.GetHashCode(); - hash ^= this.EventLevel.GetHashCode(); - hash ^= this.FilterData.GetHashCode(); - return hash; - } - } -} diff --git a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/SessionConfiguration.cs b/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/SessionConfiguration.cs deleted file mode 100644 index 1fcf12a9d8..0000000000 --- a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Eventing/SessionConfiguration.cs +++ /dev/null @@ -1,107 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace Microsoft.Diagnostics.Tools.RuntimeClient -{ - public enum EventPipeSerializationFormat - { - NetPerf, - NetTrace - } - - public class SessionConfiguration - { - public SessionConfiguration(uint circularBufferSizeMB, EventPipeSerializationFormat format, IReadOnlyCollection providers) - { - if (circularBufferSizeMB == 0) - throw new ArgumentException($"Buffer size cannot be zero."); - if (format != EventPipeSerializationFormat.NetPerf && format != EventPipeSerializationFormat.NetTrace) - throw new ArgumentException("Unrecognized format"); - if (providers == null) - throw new ArgumentNullException(nameof(providers)); - if (providers.Count() <= 0) - throw new ArgumentException($"Specified providers collection is empty."); - - CircularBufferSizeInMB = circularBufferSizeMB; - Format = format; - string extension = format == EventPipeSerializationFormat.NetPerf ? ".netperf" : ".nettrace"; - _providers = new List(providers); - } - - public uint CircularBufferSizeInMB { get; } - public EventPipeSerializationFormat Format { get; } - - public IReadOnlyCollection Providers => _providers.AsReadOnly(); - - private readonly List _providers; - - public virtual byte[] Serialize() - { - byte[] serializedData = null; - using (var stream = new MemoryStream()) - using (var writer = new BinaryWriter(stream)) - { - writer.Write(CircularBufferSizeInMB); - writer.Write((uint)Format); - - writer.Write(Providers.Count()); - foreach (var provider in Providers) - { - writer.Write(provider.Keywords); - writer.Write((uint)provider.EventLevel); - - writer.WriteString(provider.Name); - writer.WriteString(provider.FilterData); - } - - writer.Flush(); - serializedData = stream.ToArray(); - } - - return serializedData; - } - } - - public class SessionConfigurationV2 : SessionConfiguration - { - public SessionConfigurationV2(uint circularBufferSizeMB, EventPipeSerializationFormat format, bool requestRundown, IReadOnlyCollection providers) : base(circularBufferSizeMB, format, providers) - { - RequestRundown = requestRundown; - } - - public bool RequestRundown { get; } - - public override byte[] Serialize() - { - byte[] serializedData = null; - using (var stream = new MemoryStream()) - using (var writer = new BinaryWriter(stream)) - { - writer.Write(CircularBufferSizeInMB); - writer.Write((uint)Format); - writer.Write(RequestRundown); - - writer.Write(Providers.Count()); - foreach (var provider in Providers) - { - writer.Write(provider.Keywords); - writer.Write((uint)provider.EventLevel); - - writer.WriteString(provider.Name); - writer.WriteString(provider.FilterData); - } - - writer.Flush(); - serializedData = stream.ToArray(); - } - - return serializedData; - } - } -} diff --git a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Extensions.cs b/src/Microsoft.Diagnostics.Tools.RuntimeClient/Extensions.cs deleted file mode 100644 index 7de46bd5b0..0000000000 --- a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Extensions.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; - -namespace Microsoft.Diagnostics.Tools.RuntimeClient -{ - public static class Extensions - { - public static void WriteString(this BinaryWriter @this, string value) - { - if (@this == null) - throw new ArgumentNullException(nameof(@this)); - - @this.Write(value != null ? (value.Length + 1) : 0); - if (value != null) - @this.Write(Encoding.Unicode.GetBytes(value + '\0')); - } - -#if DEBUG - private static int GetByteCount(this string @this) - { - if (@this == null) - throw new ArgumentNullException(nameof(@this)); - - var strLength = @this == null ? 0 : Encoding.Unicode.GetByteCount(@this + '\0'); - return Marshal.SizeOf(typeof(int)) + strLength; - } - - public static int GetByteCount(this SessionConfiguration @this) - { - int size = 0; - - size += Marshal.SizeOf(@this.CircularBufferSizeInMB.GetType()); - size += Marshal.SizeOf(typeof(int)); - - foreach (var provider in @this.Providers) - { - size += Marshal.SizeOf(provider.Keywords.GetType()); - size += Marshal.SizeOf(typeof(uint)); // provider.EventLevel.GetType() - size += provider.Name.GetByteCount(); - size += provider.FilterData.GetByteCount(); - } - - return size; - } -#endif // DEBUG - } -} diff --git a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Microsoft.Diagnostics.Tools.RuntimeClient.csproj b/src/Microsoft.Diagnostics.Tools.RuntimeClient/Microsoft.Diagnostics.Tools.RuntimeClient.csproj deleted file mode 100644 index 0294b5336c..0000000000 --- a/src/Microsoft.Diagnostics.Tools.RuntimeClient/Microsoft.Diagnostics.Tools.RuntimeClient.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - Library - netcoreapp2.1 - Microsoft.Diagnostics.Tools.RuntimeClient - .NET Core Diagnostics Runtime Client - true - Diagnostic - $(Description) - true - true - true - - diff --git a/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/Assert.cs b/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/Assert.cs deleted file mode 100644 index 2bd5a2c9a7..0000000000 --- a/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/Assert.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; - -namespace Tracing.Tests.Common -{ - public static class Assert - { - public static void True(string name, bool condition) - { - if (!condition) - { - throw new Exception( - string.Format("Condition '{0}' is not true", name)); - } - } - - public static void Equal(string name, T left, T right) where T : IEquatable - { - if (left == null && right != null) - { - throw new Exception( - string.Format("Values for '{0}' are not equal! Left=NULL Right='{1}'", name, right)); - } - else if (left != null && right == null) - { - throw new Exception( - string.Format("Values for '{0}' are not equal! Left='{1}' Right=NULL", name, left)); - } - else if (!left.Equals(right)) - { - throw new Exception( - string.Format("Values for '{0}' are not equal! Left='{1}' Right='{2}'", name, left, right)); - } - } - - public static void NotEqual(string name, T left, T right) where T : IEquatable - { - if (left == null && right == null) - { - throw new Exception( - string.Format("Values for '{0}' are equal! Left=NULL Right=NULL", name)); - } - else if (left != null && left.Equals(right)) - { - throw new Exception( - string.Format("Values for '{0}' are equal! Left='{1}' Right='{2}'", name, left, right)); - } - } - } -} diff --git a/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/Program.cs b/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/Program.cs deleted file mode 100644 index 492f1441d6..0000000000 --- a/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/Program.cs +++ /dev/null @@ -1,359 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using Microsoft.Diagnostics.Tracing; -using Microsoft.Diagnostics.Tracing.Etlx; -using System; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Tracing.Tests.Common; - -namespace Microsoft.Diagnostics.Tools.RuntimeClient.Tests -{ - class Program - { - static int Main(string[] args) - { - SendSmallerHeaderCommand(); - SendInvalidDiagnosticsMessageTypeCommand(); - SendInvalidInputData(); - TestCollectEventPipeTracing(); - return 100; - } - - private static Process ThisProcess { get; } = Process.GetCurrentProcess(); - - private static void SendSmallerHeaderCommand() - { - Console.WriteLine("Send a small payload as header."); - - ulong sessionId = 0; - - try - { - byte[] bytes; - using (var stream = new MemoryStream()) - { - using (var bw = new BinaryWriter(stream)) - { - bw.Write((uint)DiagnosticsMessageType.StartEventPipeTracing); - bw.Flush(); - stream.Position = 0; - - bytes = new byte[stream.Length]; - stream.Read(bytes, 0, bytes.Length); - } - } - - sessionId = EventPipeClient.SendCommand(ThisProcess.Id, bytes); - } - catch (EndOfStreamException) - { - Assert.Equal("EventPipe Session Id", sessionId, (ulong)0); - } - catch - { - Assert.True("Send command threw unexpected exception", false); - } - } - - private static void SendInvalidDiagnosticsMessageTypeCommand() - { - Console.WriteLine("Send a wrong message type as the diagnostic header header."); - ulong sessionId = 0; - - try - { - byte[] bytes; - using (var stream = new MemoryStream()) - { - using (var bw = new BinaryWriter(stream)) - { - bw.Write(uint.MaxValue); - bw.Write(ThisProcess.Id); - bw.Flush(); - stream.Position = 0; - - bytes = new byte[stream.Length]; - stream.Read(bytes, 0, bytes.Length); - } - } - - sessionId = EventPipeClient.SendCommand(ThisProcess.Id, bytes); - } - catch (EndOfStreamException) - { - Assert.Equal("EventPipe Session Id", sessionId, (ulong)0); - } - catch - { - Assert.True("Send command threw unexpected exception", false); - } - } - - private static byte[] Serialize(MessageHeader header, TestSessionConfiguration configuration, Stream stream) - { - using (var bw = new BinaryWriter(stream)) - { - bw.Write((uint)header.RequestType); - bw.Write(header.Pid); - - bw.Write(configuration.CircularBufferSizeInMB); - - bw.WriteString(null); - - if (configuration.Providers == null) - { - bw.Write(0); - } - else - { - bw.Write(configuration.Providers.Count()); - foreach (var provider in configuration.Providers) - { - bw.Write(provider.Keywords); - bw.Write((uint)provider.EventLevel); - - bw.WriteString(provider.Name); - bw.WriteString(provider.FilterData); - } - } - - bw.Flush(); - stream.Position = 0; - - var bytes = new byte[stream.Length]; - stream.Read(bytes, 0, bytes.Length); - return bytes; - } - - } - - private static void SendInvalidInputData() - { - var configs = new TestSessionConfiguration[] { - new TestSessionConfiguration { - CircularBufferSizeInMB = 0, - TestName = "0 size circular buffer", - Providers = new TestProvider[] { - new TestProvider{ - Name = "Microsoft-Windows-DotNETRuntime" - }, - }, - }, - new TestSessionConfiguration { - CircularBufferSizeInMB = 64, - TestName = "null providers", - Providers = null, - }, - new TestSessionConfiguration { - CircularBufferSizeInMB = 64, - TestName = "no providers", - Providers = new TestProvider[]{ }, - }, - new TestSessionConfiguration { - CircularBufferSizeInMB = 64, - TestName = "null provider name", - Providers = new TestProvider[]{ new TestProvider { Name = null, }, }, - }, - new TestSessionConfiguration { - CircularBufferSizeInMB = 64, - TestName = "empty provider name", - Providers = new TestProvider[]{ new TestProvider { Name = string.Empty, }, }, - }, - new TestSessionConfiguration { - CircularBufferSizeInMB = 64, - TestName = "white space provider name", - Providers = new TestProvider[]{ new TestProvider { Name = " ", }, }, - }, - }; - - foreach (var config in configs) - { - ulong sessionId = 0; - - try - { - var header = new MessageHeader { - RequestType = DiagnosticsMessageType.CollectEventPipeTracing, - Pid = (uint)Process.GetCurrentProcess().Id, - }; - - byte[] bytes; - using (var stream = new MemoryStream()) - bytes = Serialize(header, config, stream); - - Console.WriteLine($"Test: {config.TestName}"); - sessionId = EventPipeClient.SendCommand(ThisProcess.Id, bytes); - - // Check that a session was created. - Assert.Equal("EventPipe Session Id", sessionId, (ulong)0); - } - catch (EndOfStreamException) - { - Assert.Equal("EventPipe Session Id", sessionId, (ulong)0); - } - catch - { - Assert.True("Send command threw unexpected exception", false); - } - } - } - - private static void SendInvalidPayloadToCollectCommand() - { - Console.WriteLine("Send Invalid Payload To Collect Command."); - - ulong sessionId = 0; - - try - { - uint circularBufferSizeMB = 64; - var filePath = Path.Combine( - Directory.GetCurrentDirectory(), - $"dotnetcore-eventpipe-{ThisProcess.Id}.nettrace"); - var providers = new[] { - new Provider(name: "Microsoft-Windows-DotNETRuntime"), - }; - - var configuration = new SessionConfiguration(circularBufferSizeMB, filePath, providers); - - // Start session #1. - sessionId = EventPipeClient.StartTracingToFile( - processId: ThisProcess.Id, - configuration: configuration); - - // Check that a session was created. - Assert.Equal("EventPipe Session Id", sessionId, (ulong)0); - } - finally - { - if (sessionId != 0) - EventPipeClient.StopTracing(ThisProcess.Id, sessionId); - } - } - - private static void TestCollectEventPipeTracing() - { - ulong sessionId = 0; - - try - { - uint circularBufferSizeMB = 64; - var filePath = Path.Combine( - Directory.GetCurrentDirectory(), - $"dotnetcore-eventpipe-{ThisProcess.Id}.nettrace"); - var providers = new[] { - new Provider(name: "Microsoft-Windows-DotNETRuntime"), - }; - - var configuration = new SessionConfiguration(circularBufferSizeMB, filePath, providers); - - Console.WriteLine("Start collecting."); - using (Stream stream = EventPipeClient.CollectTracing( - processId: ThisProcess.Id, - configuration: configuration, - sessionId: out sessionId)) - { - // Check that a session was created. - Assert.NotEqual("EventPipe Session Id", sessionId, (ulong)0); - - var collectingTask = new Task(() => { - using (var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)) - { - while (true) - { - var buffer = new byte[16 * 1024]; - int nBytesRead = stream.Read(buffer, 0, buffer.Length); - if (nBytesRead <= 0) - break; - fs.Write(buffer, 0, nBytesRead); - } - } - }); - collectingTask.Start(); - - { // Attempt to create another session, and verify that is not possible. - Console.WriteLine("Attempt to create another session."); - - ulong sessionId2 = 0; - try - { - using (var stream2 = EventPipeClient.CollectTracing( - processId: ThisProcess.Id, - configuration: configuration, - sessionId: out sessionId2)) - { - var buffer = new byte[16 * 1024]; - int nBytesRead = stream.Read(buffer, 0, buffer.Length); - } - } - catch (EndOfStreamException) - { - } - catch - { - Assert.True("EventPipeClient.CollectTracing threw unexpected exception", false); - } - - Assert.Equal("EventPipe Session Id", sessionId2, (ulong)0); - } - - Console.WriteLine("Doing some work."); - Workload.DoWork(10); - - var ret = EventPipeClient.StopTracing(ThisProcess.Id, sessionId); - Assert.Equal("Expect return value to be the disabled session Id", sessionId, ret); - collectingTask.Wait(); - - sessionId = 0; // Reset session Id, we do not need to disable it later. - - Assert.Equal("EventPipe output file", File.Exists(filePath), true); - - // Check file is valid. - Console.WriteLine("Validating nettrace file."); - ValidateNetTrace(filePath); - } - } - finally - { - if (sessionId != 0) - EventPipeClient.StopTracing(ThisProcess.Id, sessionId); - } - } - - private static void ValidateNetTrace(string filePath) - { - var nEventPipeResults = 0; - using (var trace = new TraceLog(TraceLog.CreateFromEventPipeDataFile(filePath)).Events.GetSource()) - { - trace.Dynamic.All += (TraceEvent data) => { - ++nEventPipeResults; - }; - trace.Process(); - } - - // Assert there were events in the file. - Assert.NotEqual("Found events in trace file", nEventPipeResults, 0); - } - - [Conditional("DEBUG")] - private static void DumpNetTrace(string filePath) - { - using (var trace = new TraceLog(TraceLog.CreateFromEventPipeDataFile(filePath)).Events.GetSource()) - { - trace.Dynamic.All += (TraceEvent e) => { - if (!string.IsNullOrWhiteSpace(e.ProviderName) && !string.IsNullOrWhiteSpace(e.EventName)) - { - Debug.WriteLine($"Event Provider: {e.ProviderName}"); - Debug.WriteLine($" Event Name: {e.EventName}"); - } - }; - trace.Process(); - } - } - } -} diff --git a/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/TestProvider.cs b/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/TestProvider.cs deleted file mode 100644 index 992a32b324..0000000000 --- a/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/TestProvider.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Diagnostics.Tracing; - -namespace Microsoft.Diagnostics.Tools.RuntimeClient.Tests -{ - internal sealed class TestProvider - { - public ulong Keywords { get; set; } - - public EventLevel EventLevel { get; set; } - - public string Name { get; set; } - - public string FilterData { get; set; } - } -} diff --git a/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/TestSessionConfiguration.cs b/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/TestSessionConfiguration.cs deleted file mode 100644 index 016937e5a1..0000000000 --- a/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/TestSessionConfiguration.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Collections.Generic; - -namespace Microsoft.Diagnostics.Tools.RuntimeClient.Tests -{ - internal sealed class TestSessionConfiguration - { - public uint CircularBufferSizeInMB { get; set; } - - public string TestName { get; set; } - - public IEnumerable Providers { get; set; } - } -} diff --git a/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/Workload.cs b/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/Workload.cs deleted file mode 100644 index a44095c30f..0000000000 --- a/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/Workload.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; - -namespace Microsoft.Diagnostics.Tools.RuntimeClient.Tests -{ - internal static class Workload - { - [MethodImpl(MethodImplOptions.NoInlining)] - public static void DoWork(int nIterations) - { - for (int i = 0; i < nIterations; ++i) - { - MemoryAccessPerformance(); - BranchPredictionPerformance(seed: i); - } - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static double MemoryAccessPerformance() - { - var doubles = new double[8 * 1024 * 1024]; - for (int i = 0; i < doubles.Length; i += 100) - doubles[i] = 2.0; - for (int i = 0; i < doubles.Length; i += 200) - doubles[i] *= 3.0; - for (int i = 0; i < doubles.Length; i += 400) - doubles[i] *= 5.0; - for (int i = 0; i < doubles.Length; i += 800) - doubles[i] *= 7.0; - for (int i = 0; i < doubles.Length; i += 1600) - doubles[i] *= 11.0; - return doubles.Average(); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static IEnumerable BranchPredictionPerformance(int seed) - { - const int nCards = 52; - var deck = new List(Enumerable.Range(0, nCards)); - var rnd = new Random((int)DateTime.Now.Ticks + seed); - - for (int i = 0; i < deck.Count(); ++i) - { - var pos = rnd.Next(nCards); - if (pos % 3 != 0) - pos = rnd.Next(nCards); - var temp = deck[i]; - deck[i] = deck[pos]; - deck[pos] = temp; - } - - return deck; - } - } -} diff --git a/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/eventpipetests.csproj b/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/eventpipetests.csproj deleted file mode 100644 index 058b4977d0..0000000000 --- a/src/tests/Microsoft.Diagnostics.Tools.RuntimeClient/eventpipetests.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - Exe - netcoreapp3.0 - Microsoft.Diagnostics.Tools.RuntimeClient.Tests - false - - - - false - false - - - - - - From 56af681a04e4ca90b34f97ba3516a3693600fad4 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 28 Dec 2019 13:50:02 +0000 Subject: [PATCH 046/243] [master] Update dependencies from aspnet/AspNetCore (#718) * Update dependencies from https://github.com/aspnet/AspNetCore build 20191220.1 - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.19620.1 * Update dependencies from https://github.com/aspnet/AspNetCore build 20191223.2 - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.19623.2 * Update dependencies from https://github.com/aspnet/AspNetCore build 20191226.3 - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.19626.3 * Update dependencies from https://github.com/aspnet/AspNetCore build 20191227.1 - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.19627.1 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 89a3fb9bb0..68e941403a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/core-setup c77948d92a2f950140f09384f057cb893ec3955a - + https://github.com/aspnet/AspNetCore - b3a7e54c8922602b574d668389346e83815d97ad + af9f99299cd4a059cf30483d4f7f551ff38c5a28 diff --git a/eng/Versions.props b/eng/Versions.props index adecca1a91..3fba42b946 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) 5.0.0-alpha.1.19564.1 - 5.0.0-alpha.1.19619.2 + 5.0.0-alpha.1.19627.1 From 827bbe94c8e23b84a0c3774e44710c58e87788cf Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 30 Dec 2019 20:00:58 +0000 Subject: [PATCH 047/243] [master] Update dependencies from dotnet/arcade (#719) * Update dependencies from https://github.com/dotnet/arcade build 20191222.1 - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.19622.1 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.19622.1 * Update dependencies from https://github.com/dotnet/arcade build 20191229.1 - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.19629.1 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.19629.1 --- eng/Version.Details.xml | 8 ++--- eng/Versions.props | 2 +- eng/common/templates/steps/publish-logs.yml | 2 +- eng/common/tools.ps1 | 33 ++++++++++++--------- global.json | 2 +- 5 files changed, 26 insertions(+), 21 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 68e941403a..2a9fc634ed 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,15 +4,15 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - 77698ebba1ab096ad9580a5d9ebefe0499ba00ce + f40849c5bbdfd1f1b99801f5a40343f8d4a192c9 - + https://github.com/dotnet/arcade - 77698ebba1ab096ad9580a5d9ebefe0499ba00ce + f40849c5bbdfd1f1b99801f5a40343f8d4a192c9 https://github.com/dotnet/core-setup diff --git a/eng/Versions.props b/eng/Versions.props index 3fba42b946..41c92569ea 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -38,7 +38,7 @@ 4.5.3 2.4.1 2.0.3 - 5.0.0-beta.19615.1 + 5.0.0-beta.19629.1 10.0.18362 diff --git a/eng/common/templates/steps/publish-logs.yml b/eng/common/templates/steps/publish-logs.yml index 8903ba57c0..f91751fe78 100644 --- a/eng/common/templates/steps/publish-logs.yml +++ b/eng/common/templates/steps/publish-logs.yml @@ -18,6 +18,6 @@ steps: inputs: PathtoPublish: '$(Build.SourcesDirectory)/PostBuildLogs' PublishLocation: Container - ArtifactName: PostBuilLogs + ArtifactName: PostBuildLogs continueOnError: true condition: always() diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 09c3a3325e..d3a432878e 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -98,6 +98,9 @@ function Exec-Process([string]$command, [string]$commandArgs) { } } +# createSdkLocationFile parameter enables a file being generated under the toolset directory +# which writes the sdk's location into. This is only necessary for cmd --> powershell invocations +# as dot sourcing isn't possible. function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { if (Test-Path variable:global:_DotNetInstallDir) { return $global:_DotNetInstallDir @@ -146,21 +149,23 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { } $env:DOTNET_INSTALL_DIR = $dotnetRoot + } - if ($createSdkLocationFile) { - # Create a temporary file under the toolset dir and rename it to sdk.txt to avoid races. - do { - $sdkCacheFileTemp = Join-Path $ToolsetDir $([System.IO.Path]::GetRandomFileName()) - } - until (!(Test-Path $sdkCacheFileTemp)) - Set-Content -Path $sdkCacheFileTemp -Value $dotnetRoot - - try { - Rename-Item -Force -Path $sdkCacheFileTemp 'sdk.txt' - } catch { - # Somebody beat us - Remove-Item -Path $sdkCacheFileTemp - } + # Creates a temporary file under the toolset dir. + # The following code block is protecting against concurrent access so that this function can + # be called in parallel. + if ($createSdkLocationFile) { + do { + $sdkCacheFileTemp = Join-Path $ToolsetDir $([System.IO.Path]::GetRandomFileName()) + } + until (!(Test-Path $sdkCacheFileTemp)) + Set-Content -Path $sdkCacheFileTemp -Value $dotnetRoot + + try { + Rename-Item -Force -Path $sdkCacheFileTemp 'sdk.txt' + } catch { + # Somebody beat us + Remove-Item -Path $sdkCacheFileTemp } } diff --git a/global.json b/global.json index bc3abbd6dc..7509420c87 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "dotnet": "3.0.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.19615.1" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.19629.1" } } From 3f6848be5670f5a7c72cf100fe558c1411c7502f Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 30 Dec 2019 13:12:26 -0800 Subject: [PATCH 048/243] [master] Update dependencies from dotnet/runtime (#713) * Update dependencies from https://github.com/dotnet/runtime build 20191218.3 - Microsoft.NETCore.App - 5.0.0-alpha.1.19618.3 * Update dependencies from https://github.com/dotnet/runtime build 20191219.11 - Microsoft.NETCore.App - 5.0.0-alpha.1.19619.11 * Update dependencies from https://github.com/dotnet/runtime build 20191220.3 - Microsoft.NETCore.App - 5.0.0-alpha.1.19620.3 * Update dependencies from https://github.com/dotnet/runtime build 20191221.1 - Microsoft.NETCore.App - 5.0.0-alpha.1.19621.1 * Update dependencies from https://github.com/dotnet/runtime build 20191222.1 - Microsoft.NETCore.App - 5.0.0-alpha.1.19622.1 * Update dependencies from https://github.com/dotnet/runtime build 20191223.2 - Microsoft.NETCore.App - 5.0.0-alpha.1.19623.2 * Update dependencies from https://github.com/dotnet/runtime build 20191226.2 - Microsoft.NETCore.App - 5.0.0-alpha.1.19626.2 * Update dependencies from https://github.com/dotnet/runtime build 20191227.5 - Microsoft.NETCore.App - 5.0.0-alpha.1.19627.5 Co-authored-by: Mike McLaughlin --- eng/Version.Details.xml | 6 +++--- eng/Versions.props | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2a9fc634ed..863cef2514 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade f40849c5bbdfd1f1b99801f5a40343f8d4a192c9 - - https://github.com/dotnet/core-setup - c77948d92a2f950140f09384f057cb893ec3955a + + https://github.com/dotnet/runtime + 2ecef0eed6838ffb8053df4354630a26e6a95a11 https://github.com/aspnet/AspNetCore diff --git a/eng/Versions.props b/eng/Versions.props index 41c92569ea..6fc508c6c6 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -15,8 +15,8 @@ $(MicrosoftNETCoreApp30Version) 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.19564.1 - 5.0.0-alpha.1.19627.1 + 5.0.0-alpha.1.19627.5 + 5.0.0-alpha.1.19614.22 From f5dc05d18aa7d32faf29511ee98c6958ab7b3958 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Fri, 3 Jan 2020 12:15:19 -0800 Subject: [PATCH 049/243] Fix sample code to actually print string name of the CLR events (#728) --- documentation/design-docs/diagnostics-client-library.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/design-docs/diagnostics-client-library.md b/documentation/design-docs/diagnostics-client-library.md index b19c8b3d8f..c4de878eb4 100644 --- a/documentation/design-docs/diagnostics-client-library.md +++ b/documentation/design-docs/diagnostics-client-library.md @@ -41,7 +41,7 @@ public void PrintRuntimeGCEvents(int processId) { var source = new EventPipeEventSource(session.EventStream); - source.Dynamic.All += (TraceEvent obj) => { + source.Clr.All += (TraceEvent obj) => { Console.WriteLine(obj.EventName); } try From eb13265352569304912eedaa66894eb760d6c158 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Fri, 3 Jan 2020 17:46:46 -0800 Subject: [PATCH 050/243] Some misc fixes to counters doc (#729) --- documentation/design-docs/eventcounters.md | 65 ++++++++++++---------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/documentation/design-docs/eventcounters.md b/documentation/design-docs/eventcounters.md index 5ef0cd52d2..e62b9d3610 100644 --- a/documentation/design-docs/eventcounters.md +++ b/documentation/design-docs/eventcounters.md @@ -7,12 +7,13 @@ The .NET Core runtime (CoreCLR) and few .NET libraries publish basic diagnostics Apart from the EventCounters that are already provided by the .NET runtime or the rest of the framework (i.e. ASP.NET, gRPC, etc.), you may choose to implement your own EventCounters to keep track of various metrics for your service. -EventCounters live as a part of an [EventSource](https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.tracing.eventsource?view=netcore-3.0). Like any other events on an `EventSource`, they can be consumed both in-proc and out-of-proc via [EventListener](https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.tracing.eventlistener?view=netcore-3.0) and EventPipe/ETW. +EventCounters live as a part of an [EventSource](https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.tracing.eventsource?view=netcore-3.0) and are automatically pushed to listener tools on a regular basis. Like any other events on an `EventSource`, they can be consumed both in-proc and out-of-proc via [EventListener](https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.tracing.eventlistener?view=netcore-3.0) and EventPipe/ETW. ![EventCounter](EventCounters.jpg) ## Runtime Counters The .NET runtime (CoreCLR) publishes the following list of counters: +`System.Runtime` provider * CPU usage * Working Set Size * GC Heap Size @@ -33,20 +34,27 @@ The .NET runtime (CoreCLR) publishes the following list of counters: * ThreadPool Completed Items Rate * Active Timer Count -ASP.NET Core also publishes the following counters: +Other components of .NET Core also publishes counters: +ASP.NET Core `Microsoft.AspNetCore.Hosting` provider * Requests per second * Total Requests Count * Current Requests Count * Failed Requests Count +SignalR `Microsoft.AspNetCore.Http.Connections` provider +* Total Connections Started +* Total Connections Stopped +* Total Connections Timed Out +* Average Connection Duration + ## EventCounters API Overview -At a high level, there are two types of counters in terms of their *purpose* - counters for ever-increasing values (i.e. Total # of exceptions, Total # of GCs, Total # of requests, etc.) and "snapshot" values (heap usage, CPU usage, working set size, etc.). Within each of these categories of counters, there are also two types of counters for implementation details - polling counters and non-polling counters. That gives us a total of 4 different counters, and each of these can be implemented by `EventCounter`, `PollingCounter`, `IncrementingEventCounter`, and `IncrementingPollingCounter`. +At a high level, there are two types of counters in terms of their *purpose* - counters for ever-increasing values (i.e. Total # of exceptions, Total # of GCs, Total # of requests, etc.) and "snapshot" values (heap usage, CPU usage, working set size, etc.). Within each of these categories of counters, there are also two types of counters depending on how they get their value - polling counters (value retrieved via a callback) and non-polling counters (value directly set on the counter). That gives us a total of 4 different counters, and each of these are implemented by `EventCounter`, `PollingCounter`, `IncrementingEventCounter`, and `IncrementingPollingCounter`. The runtime supports four different types of counters for different situations: 1. `EventCounter` records a set of values. The `WriteMetric()` method adds a new value to the set. At the end of each time interval, summary statistics for the set are computed such as the min, max, and mean. dotnet-counters will always display the mean value. EventCounter is useful to describe a discrete set of operations such as the average size in bytes of recent IO operations or the average monetary value of a set of financial transactions. -2. `IncrementingEventCounter` records a running total. The `Increment()` method increases this total. At the end of each time period the total value is reported and then it is reset to zero. dotnet-counters will display this as a rate, the recorded total / time. This counter is useful to measure how frequently an action is occurring such as the number of requests processed each second. +2. `IncrementingEventCounter` records a running total. The `Increment()` method increases this total. At the end of each time period the difference between the total value for that period and the total of the previous period is reported as an increment. dotnet-counters will display this as a rate, the recorded total / time. This counter is useful to measure how frequently an action is occurring such as the number of requests processed each second. 3. `PollingCounter` is a customizable counter that doesn't have any state and uses a callback to determine the value that is reported. At the end of each time interval the user provided callback function is invoked and whatever value it returns is reported as the current value of the counter. This counter can be used to query a metric from an external source, for example getting the current free bytes on a disk. It can also be used to report custom statistics that can be computed on demand by an application such as 95th percentile of recent request latencies or the current hit/miss ratio of a cache. @@ -56,7 +64,8 @@ The runtime supports four different types of counters for different situations: ## Writing EventCounters -Let's begin by looking at an implementation of sample `EventSource` that contains an `EventCounter`. +The following code implements a sample `EventSource` exposed as `Samples-EventCounterDemos-Minimal` provider. This source contains an `EventCounter` representing request processing time. Such a counter has a name (i.e. its unique ID in the source) and a display name both used by listener tools such as dotnet-counter. + ```cs using System; @@ -89,20 +98,20 @@ public sealed class MinimalEventCounterSource : EventSource } ``` -Create a new dotnet console app using the code above and run it. Then use `dotnet-counters` to see what process-id this is: +Create a new dotnet console app using the code above and run it. Then use `dotnet-counters ps` to see what its process ID is: ```cmd -E:\>dotnet-counters ps +C:\>dotnet-counters ps 1398652 dotnet C:\Program Files\dotnet\dotnet.exe 1399072 dotnet C:\Program Files\dotnet\dotnet.exe 1399112 dotnet C:\Program Files\dotnet\dotnet.exe 1401880 dotnet C:\Program Files\dotnet\dotnet.exe - 1400180 sample-counters E:\sample-counters\bin\Debug\netcoreapp3.1\sample-counters.exe + 1400180 sample-counters C:\sample-counters\bin\Debug\netcoreapp3.1\sample-counters.exe ``` -You can start monitoring your counter with the following command: +You need to pass the `EventSource` name as an argument to `--providers` to start monitoring your counter with the following command: ```cmd -E:\>dotnet-counters monitor --process-id 1400180 --providers Samples-EventCounterDemos-Minimal +C:\>dotnet-counters monitor --process-id 1400180 --providers Samples-EventCounterDemos-Minimal ``` Then you will see the following screen in your console: @@ -111,7 +120,7 @@ Press p to pause, r to resume, q to quit. Status: Running [Samples-EventCounterDemos-Minimal] - Request Processing Time (MSec) 0.5 + Request Processing Time (MSec) 0.445 ``` Let's take a look at a couple of sample EventCounter implementation in the .NET Core runtime (CoreCLR). Here is the runtime implementation for the counter that tracks the working set size of the application. @@ -148,12 +157,12 @@ IncrementingPollingCounter monitorContentionCounter = new IncrementingPollingCou This counter uses the [Monitor.LockContentionCount](https://docs.microsoft.com/en-us/dotnet/api/system.threading.monitor.lockcontentioncount?view=netcore-3.0) API to report the increment of the total lock contention count. The `DisplayRateTimeScale` property is an optional `TimeSpan` which can be set to provide a hint of what time interval this counter is best displayed at. For example, the lock contention count is best displayed as *count per second*, so its `DisplayRateTimeScale` is set to 1 second. This can be adjusted for different types of rate counters. -There are more runtime counter implementation to use as a reference in the [CoreCLR](https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/src/System/Diagnostics/Eventing/RuntimeEventSource.cs) repo. +There are more runtime counter implementation to use as a reference in the [CoreCLR](https://github.com/dotnet/runtime/blob/master/src/coreclr/src/System.Private.CoreLib/src/System/Diagnostics/Eventing/RuntimeEventSource.cs) repo. ## Concurrency It is important to note that if the delegates passed to the `PollingCounter`/`IncrementingPollingCounter` instances are called by multiple threads at once, the EventCounters API does not guarantee thread safety. It is the author's responsibility to guarantee the thread-safety of the delegates being passed to the counter APIs. -For example, suppose we have the following `EventSource` which keeps track of requests. +For example, let's suppose we have the following `EventSource` to keep track of requests. ```cs public class RequestEventSource : EventSource @@ -161,32 +170,32 @@ public class RequestEventSource : EventSource // singleton instance of the eventsource. public static RequestEventSource Log = new RequestEventSource(); - public IncrementingEventCounter requestRateCounter; + public IncrementingPollingCounter requestRateCounter; private int _requestCnt; private RequestEventSource() : base(EventSourceSettings.EtwSelfDescribingEventFormat) { - requestCnt = 0; + _requestCnt = 0; this.requestRateCounter = new IncrementingPollingCounter("request-rate", this, () => _requestCnt) { DisplayName = "Request Rate", - DisplayRateTimeScale = TimeSpan.FromSeconds(1); - } + DisplayRateTimeScale = TimeSpan.FromSeconds(1) + }; } // Method being called from request handlers to log that a request happened - public void Request() + public void AddRequest() { - requestCnt += 1; + _requestCnt += 1; } } ``` -`RequestEventSource.Request()` can be called from a request handler, and `requestRateCounter` simply polls this value at the interval specified by the consumer of this counter. However, this method can be called by multiple threads at once, so `requestCnt` can be susceptible to race. +`RequestEventSource.AddRequest()` can be called from a request handler, and `requestRateCounter` simply polls this value at the interval specified by the consumer of this counter. However, this method can be called by multiple threads at once, putting a race condition on `_requestCnt`. -Therefore, this method should be modified to the following to prevent the race. +Therefore, this method should be modified to update the value in a thread-safe way. ```cs -public void Request() +public void AddRequest() { Interlocked.Increment(ref _requestCnt); } @@ -239,10 +248,8 @@ public class SimpleEventListener : EventListener { if (source.Name.Equals("System.Runtime")) { - Dictionary refreshInterval = new Dictionary() - { - { "EventCounterIntervalSec", _intervalSec.ToString() } - }; + var refreshInterval = new Dictionary(); + refreshInterval.Add("EventCounterIntervalSec", "1"); EnableEvents(source, _level, (EventKeywords)(-1), refreshInterval); } } @@ -257,7 +264,7 @@ public class SimpleEventListener : EventListener string key = payload.Key; string val = payload.Value.ToString(); - if (key.Equals("Name")) + if (key.Equals("DisplayName")) { counterName = val; } @@ -323,4 +330,6 @@ The official dotnet-trace documentation contains a [section](https://github.com/ #### TraceEvent -TraceEvent is a managed library that makes it easy to consume ETW and EventPipe events. For more information, refer to the [TraceEvent Library Programmers Guide](https://github.com/Microsoft/perfview/blob/master/documentation/TraceEvent/TraceEventProgrammersGuide.md). \ No newline at end of file +TraceEvent is a managed library that makes it easy to consume ETW and EventPipe events. For more information, refer to the [TraceEvent Library Programmers Guide](https://github.com/Microsoft/perfview/blob/master/documentation/TraceEvent/TraceEventProgrammersGuide.md). + +For some more detailed code samples, you can also try reading [Criteo Labs blog](https://medium.com/criteo-labs/net-core-counters-internals-how-to-integrate-counters-in-your-monitoring-pipeline-5354cd61b42e) on how to do this. \ No newline at end of file From 8c8e7d139e9c0bcce3cfc99afbd84cc8eabb52d1 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Mon, 30 Dec 2019 18:14:52 -0800 Subject: [PATCH 051/243] Misc cleanup and fixes found during runtime change testing. Change ctrl-c message issue: https://github.com/dotnet/diagnostics/issues/532 Revert 5.0.x runtime version until issue https://github.com/dotnet/runtime/issues/1229 is fixed. --- eng/Versions.props | 4 +-- src/SOS/SOS.NETCore/SymbolReader.cs | 6 +++- src/SOS/SOS.UnitTests/SOSRunner.cs | 9 ++++-- src/SOS/Strike/exts.cpp | 31 ++++++++++++------- src/SOS/Strike/exts.h | 2 +- src/SOS/Strike/hostcoreclr.cpp | 46 ++++++++++++++++++++--------- src/SOS/Strike/hostcoreclr.h | 14 ++++++++- src/SOS/Strike/sos.h | 2 +- src/SOS/Strike/util.cpp | 28 +++++++++++++----- src/SOS/Strike/util.h | 2 +- src/SOS/Strike/xplat/dbgeng.h | 7 +---- src/SOS/lldbplugin/services.cpp | 6 ++-- src/SOS/lldbplugin/soscommand.cpp | 1 + 13 files changed, 109 insertions(+), 49 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index 6fc508c6c6..3bb721addf 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -15,8 +15,8 @@ $(MicrosoftNETCoreApp30Version) 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.19627.5 - 5.0.0-alpha.1.19614.22 + 5.0.0-alpha.1.19562.8 + 5.0.0-alpha.1.19626.3 diff --git a/src/SOS/SOS.NETCore/SymbolReader.cs b/src/SOS/SOS.NETCore/SymbolReader.cs index a345efbce2..50231e29ba 100644 --- a/src/SOS/SOS.NETCore/SymbolReader.cs +++ b/src/SOS/SOS.NETCore/SymbolReader.cs @@ -83,6 +83,8 @@ private class TargetStream : Stream public TargetStream(ulong address, int size, ReadMemoryDelegate readMemory) : base() { + Debug.Assert(address != 0); + Debug.Assert(size != 0); _address = address; _readMemory = readMemory; Length = size; @@ -294,7 +296,9 @@ public static void LoadNativeSymbols(SymbolFileCallback callback, IntPtr paramet s_tracer.Verbose("{0} {1}", key.FullPathName, key.Index); // Don't download the sos binaries that come with the runtime - if (moduleFileName != "SOS.NETCore.dll" && !moduleFileName.StartsWith("libsos.")) + if (!IsPathEqual(moduleFileName, "SOS.NETCore.dll") && + !IsPathEqual(moduleFileName, "sos.dll") && + !moduleFileName.StartsWith("libsos.")) { string downloadFilePath = GetSymbolFile(key); if (downloadFilePath != null) diff --git a/src/SOS/SOS.UnitTests/SOSRunner.cs b/src/SOS/SOS.UnitTests/SOSRunner.cs index a86eb1c950..de87100f87 100644 --- a/src/SOS/SOS.UnitTests/SOSRunner.cs +++ b/src/SOS/SOS.UnitTests/SOSRunner.cs @@ -704,11 +704,11 @@ public async Task RunScript(string scriptRelativePath) } try { - await RunSosCommand("sosstatus"); + await RunSosCommand("SOSStatus"); } catch (Exception ex) { - WriteLine("Exception executing sosstatus {0}", ex.ToString()); + WriteLine("Exception executing SOSStatus {0}", ex.ToString()); } throw; } @@ -1245,6 +1245,10 @@ public async Task WaitForCommandPrompt() Task currentTask = null; lock (this) { + if (_taskQueue.Count == 0) + { + return false; + } currentTask = _taskQueue[0]; _taskQueue.RemoveAt(0); } @@ -1256,6 +1260,7 @@ public Task WaitForCommandOutput() Task currentTask = null; lock (this) { + Debug.Assert(_taskQueue.Count > 0); currentTask = _taskQueue[0]; } return currentTask; diff --git a/src/SOS/Strike/exts.cpp b/src/SOS/Strike/exts.cpp index 32083f858c..63f27dc91f 100644 --- a/src/SOS/Strike/exts.cpp +++ b/src/SOS/Strike/exts.cpp @@ -14,15 +14,11 @@ #define VER_PRODUCTVERSION_W (0x0100) -extern void SOSShutdown(); - // // globals // WINDBG_EXTENSION_APIS ExtensionApis; -OnUnloadTask *OnUnloadTask::s_pUnloadTaskList = NULL; - // // Valid for the lifetime of the debug session. // @@ -41,6 +37,8 @@ bool g_palInitialized = false; #endif // FEATURE_PAL +OnUnloadTask *OnUnloadTask::s_pUnloadTaskList = NULL; + IMachine* g_targetMachine = NULL; BOOL g_bDacBroken = FALSE; @@ -64,6 +62,7 @@ PDEBUG_SYSTEM_OBJECTS g_ExtSystem; extern "C" HRESULT ExtQuery(PDEBUG_CLIENT client) { + HRESULT Status; g_ExtClient = client; #else extern "C" HRESULT @@ -79,12 +78,16 @@ ExtQuery(ILLDBServices* services) g_palInitialized = true; } g_ExtServices = services; - services->QueryInterface(__uuidof(ILLDBServices2), (void**)&g_ExtServices2); + HRESULT Status = services->QueryInterface(__uuidof(ILLDBServices2), (void**)&g_ExtServices2); + if (FAILED(Status)) + { + g_ExtServices = NULL; + return Status; + } DebugClient* client = new DebugClient(services, g_ExtServices2); g_DebugClient = client; #endif - HRESULT Status; SOS_ExtQueryFailGo(g_ExtControl, IDebugControl2); SOS_ExtQueryFailGo(g_ExtData, IDebugDataSpaces); SOS_ExtQueryFailGo(g_ExtRegisters, IDebugRegisters); @@ -265,7 +268,6 @@ DebugExtensionInitialize(PULONG Version, PULONG Flags) ExtRelease(); OnUnloadTask::Register(CleanupEventCallbacks); - OnUnloadTask::Register(SOSShutdown); g_pCallbacksClient = DebugClient; EventCallbacks* pCallbacksObj = new EventCallbacks(DebugClient); IDebugEventCallbacks* pCallbacks = NULL; @@ -295,7 +297,6 @@ void CALLBACK DebugExtensionNotify(ULONG Notify, ULONG64 /*Argument*/) { - return; } extern "C" @@ -303,12 +304,12 @@ void CALLBACK DebugExtensionUninitialize(void) { - // execute all registered cleanup tasks + // Execute all registered cleanup tasks OnUnloadTask::Run(); - return; } -BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved) +BOOL WINAPI +DllMain(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved) { if (dwReason == DLL_PROCESS_ATTACH) { @@ -319,6 +320,14 @@ BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved) #else // FEATURE_PAL +__attribute__((destructor)) +void +Uninitialize(void) +{ + // Execute all registered cleanup tasks + OnUnloadTask::Run(); +} + HRESULT DebugClient::QueryInterface( REFIID InterfaceId, diff --git a/src/SOS/Strike/exts.h b/src/SOS/Strike/exts.h index c6c9f5a617..e15e88776d 100644 --- a/src/SOS/Strike/exts.h +++ b/src/SOS/Strike/exts.h @@ -172,7 +172,7 @@ inline BOOL IsInterrupt() { if (!ControlC && g_ExtControl->GetInterrupt() == S_OK) { - ExtOut("Command cancelled at the user's request.\n"); + ExtOut("Command canceled at the user's request.\n"); ControlC = TRUE; } diff --git a/src/SOS/Strike/hostcoreclr.cpp b/src/SOS/Strike/hostcoreclr.cpp index f56c7706ed..e362a1b843 100644 --- a/src/SOS/Strike/hostcoreclr.cpp +++ b/src/SOS/Strike/hostcoreclr.cpp @@ -434,10 +434,10 @@ static HRESULT GetHostRuntime(std::string& coreClrPath, std::string& hostRuntime return S_OK; } -// -// Returns the unique temporary directory for this instnace of SOS -// -static LPCSTR GetTempDirectory() +/**********************************************************************\ + * Returns the unique temporary directory for this instance of SOS +\**********************************************************************/ +LPCSTR GetTempDirectory() { if (g_tmpPath == nullptr) { @@ -454,6 +454,7 @@ static LPCSTR GetTempDirectory() CreateDirectoryA(tmpPath, NULL); g_tmpPath = _strdup(tmpPath); + OnUnloadTask::Register(CleanupTempDirectory); } return g_tmpPath; } @@ -461,10 +462,7 @@ static LPCSTR GetTempDirectory() /**********************************************************************\ * Clean up the temporary directory files and DAC symlink. \**********************************************************************/ -#ifdef FEATURE_PAL -__attribute__((destructor)) -#endif -void SOSShutdown() +void CleanupTempDirectory() { LPCSTR tmpPath = (LPCSTR)InterlockedExchangePointer((PVOID *)&g_tmpPath, nullptr); if (tmpPath != nullptr) @@ -785,7 +783,16 @@ HRESULT InitializeSymbolStore( IfFailRet(InitializeHosting()); _ASSERTE(g_SOSNetCoreCallbacks.InitializeSymbolStoreDelegate != nullptr); - if (!g_SOSNetCoreCallbacks.InitializeSymbolStoreDelegate(logging, msdl, symweb, GetTempDirectory(), symbolServer, timeoutInMinutes, cacheDirectory, searchDirectory, windowsSymbolPath)) + if (!g_SOSNetCoreCallbacks.InitializeSymbolStoreDelegate( + logging, + msdl, + symweb, + GetTempDirectory(), + symbolServer, + timeoutInMinutes, + cacheDirectory, + searchDirectory, + windowsSymbolPath)) { ExtErr("Error initializing symbol server support\n"); return E_FAIL; @@ -828,7 +835,16 @@ void InitializeSymbolStoreFromSymPath() { if (strlen(symbolPath) > 0) { - if (!g_SOSNetCoreCallbacks.InitializeSymbolStoreDelegate(false, false, false, GetTempDirectory(), nullptr, 0, nullptr, nullptr, symbolPath)) + if (!g_SOSNetCoreCallbacks.InitializeSymbolStoreDelegate( + false, // logging + false, // msdl + false, // symweb + GetTempDirectory(), // tempDirectory + nullptr, // symbolServerPath + 0, // timeoutInMinutes + nullptr, // symbolCachePath + nullptr, // symbolDirectoryPath + symbolPath)) // windowsSymbolPath { ExtErr("Windows symbol path parsing FAILED\n"); return; @@ -1087,19 +1103,21 @@ HRESULT SymbolReader::LoadSymbols(___in IMetaDataImport* pMD, ___in IXCLRDataMod ExtOut("LoadSymbols moduleData.Request FAILED 0x%08x\n", hr); return hr; #else - ULONG64 modBase; - hr = GetClrModuleImages(pModule, CLRDATA_MODULE_PE_FILE, &modBase); + ULONG64 moduleBase; + ULONG64 moduleSize; + hr = GetClrModuleImages(pModule, CLRDATA_MODULE_PE_FILE, &moduleBase, &moduleSize); if (FAILED(hr)) { ExtOut("LoadSymbols GetClrModuleImages FAILED 0x%08x\n", hr); return hr; } - hr = LoadSymbolsForWindowsPDB(pMD, modBase, pModuleName, FALSE); + hr = LoadSymbolsForWindowsPDB(pMD, moduleBase, pModuleName, FALSE); if (SUCCEEDED(hr)) { return hr; } - moduleData.LoadedPEAddress = modBase; + moduleData.LoadedPEAddress = moduleBase; + moduleData.LoadedPESize = moduleSize; moduleData.IsFileLayout = TRUE; #endif } diff --git a/src/SOS/Strike/hostcoreclr.h b/src/SOS/Strike/hostcoreclr.h index 390dccd257..f4848c6d27 100644 --- a/src/SOS/Strike/hostcoreclr.h +++ b/src/SOS/Strike/hostcoreclr.h @@ -16,7 +16,17 @@ typedef void (*WriteLineDelegate)(const char*); typedef int (*ReadMemoryDelegate)(ULONG64, uint8_t*, int); typedef void (*SymbolFileCallbackDelegate)(void*, const char* moduleFileName, const char* symbolFilePath); -typedef BOOL (*InitializeSymbolStoreDelegate)(BOOL, BOOL, BOOL, const char*, const char*, int, const char*, const char*, const char*); +typedef BOOL (*InitializeSymbolStoreDelegate)( + BOOL logging, + BOOL msdl, + BOOL symweb, + const char* tempDirectory, + const char* symbolServerPath, + int timeoutInMinutes, + const char* symbolCacehPath, + const char* symbolDirectoryPath, + const char* windowsSymbolPath); + typedef void (*DisplaySymbolStoreDelegate)(WriteLineDelegate); typedef void (*DisableSymbolStoreDelegate)(); typedef void (*LoadNativeSymbolsDelegate)(SymbolFileCallbackDelegate, void*, const char*, ULONG64, int, ReadMemoryDelegate); @@ -69,6 +79,8 @@ extern HRESULT GetRuntimeDirectory(std::string& runtimeDirectory); extern HRESULT GetRuntimeDirectory(LPWSTR modulePath, int modulePathSize); extern LPCSTR GetDacFilePath(); extern LPCSTR GetDbiFilePath(); +extern LPCSTR GetTempDirectory(); +extern void CleanupTempDirectory(); extern BOOL IsHostingInitialized(); extern HRESULT InitializeHosting(); diff --git a/src/SOS/Strike/sos.h b/src/SOS/Strike/sos.h index 4d154ef76f..b8a85660b1 100644 --- a/src/SOS/Strike/sos.h +++ b/src/SOS/Strike/sos.h @@ -107,7 +107,7 @@ namespace sos inline void CheckInterrupt() { if (g_ExtControl->GetInterrupt() == S_OK) - Throw("User interrupt."); + Throw("Command canceled at the user's request."); } /* ThinLock struct. Use Object::GetThinLock to fill the struct. diff --git a/src/SOS/Strike/util.cpp b/src/SOS/Strike/util.cpp index 939ba9d850..9b9332ab46 100644 --- a/src/SOS/Strike/util.cpp +++ b/src/SOS/Strike/util.cpp @@ -2371,13 +2371,15 @@ DWORD_PTR *ModuleFromName(__in_opt LPSTR mName, int *numModule) * instance passed in, and the extent type requested. * * * \**********************************************************************/ -HRESULT GetClrModuleImages(__in IXCLRDataModule* module, __in CLRDataModuleExtentType desiredType, __out PULONG64 firstAdd) +HRESULT GetClrModuleImages(__in IXCLRDataModule* module, __in CLRDataModuleExtentType desiredType, __out PULONG64 pBase, __out PULONG64 pSize) { CLRDATA_ENUM enumExtents; HRESULT hr; - _ASSERTE(firstAdd != nullptr); - *firstAdd = 0; + _ASSERTE(pBase != nullptr); + _ASSERTE(pSize != nullptr); + *pBase = 0; + *pSize = 0; if (FAILED(hr = module->StartEnumExtents(&enumExtents))) { @@ -2388,12 +2390,24 @@ HRESULT GetClrModuleImages(__in IXCLRDataModule* module, __in CLRDataModuleExten { if ((desiredType == CLRDATA_MODULE_OTHER) || (desiredType == extent.type)) { - ULONG64 modBase; - if (FAILED(hr = g_ExtSymbols->GetModuleByOffset(extent.base, 0, nullptr, &modBase))) + ULONG64 moduleBase; + if (FAILED(hr = g_ExtSymbols->GetModuleByOffset(extent.base, 0, nullptr, &moduleBase))) + { + if (desiredType == CLRDATA_MODULE_PE_FILE) + { + *pBase = extent.base; + *pSize = extent.length; + hr = S_OK; + } + break; + } + DEBUG_MODULE_PARAMETERS params; + if (FAILED(hr = g_ExtSymbols->GetModuleParameters(1, &moduleBase, 0, ¶ms))) { break; } - *firstAdd = modBase; + *pBase = moduleBase; + *pSize = params.Size; hr = S_OK; break; } @@ -2438,7 +2452,7 @@ HRESULT GetModuleFromAddress(___in CLRDATA_ADDRESS peAddress, ___out IXCLRDataMo #ifdef FEATURE_PAL return hr; #else - hr = GetClrModuleImages(module, CLRDATA_MODULE_PE_FILE, &moduleData.LoadedPEAddress); + hr = GetClrModuleImages(module, CLRDATA_MODULE_PE_FILE, &moduleData.LoadedPEAddress, &moduleData.LoadedPESize); if (FAILED(hr)) { return hr; diff --git a/src/SOS/Strike/util.h b/src/SOS/Strike/util.h index 2f54066400..febfdda089 100644 --- a/src/SOS/Strike/util.h +++ b/src/SOS/Strike/util.h @@ -1391,7 +1391,7 @@ class TableOutput }; #ifndef FEATURE_PAL -HRESULT GetClrModuleImages(__in IXCLRDataModule* module, __in CLRDataModuleExtentType desiredType, __out PULONG64 firstAdd); +HRESULT GetClrModuleImages(__in IXCLRDataModule* module, __in CLRDataModuleExtentType desiredType, __out PULONG64 pBase, __out PULONG64 pSize); #endif HRESULT GetMethodDefinitionsFromName(DWORD_PTR ModulePtr, IXCLRDataModule* mod, const char* name, IXCLRDataMethodDefinition **ppMethodDefinitions, int numMethods, int *numMethodsNeeded); HRESULT GetMethodDescsFromName(DWORD_PTR ModulePtr, IXCLRDataModule* mod, const char* name, DWORD_PTR **pOut, int *numMethodDescs); diff --git a/src/SOS/Strike/xplat/dbgeng.h b/src/SOS/Strike/xplat/dbgeng.h index 42a5060427..d278fe5007 100644 --- a/src/SOS/Strike/xplat/dbgeng.h +++ b/src/SOS/Strike/xplat/dbgeng.h @@ -34,9 +34,7 @@ class DebugClient m_lldbservices2(lldbservices2) { m_lldbservices->AddRef(); - if (m_lldbservices2 != nullptr) { - m_lldbservices2->AddRef(); - } + m_lldbservices2->AddRef(); } //---------------------------------------------------------------------------- @@ -281,9 +279,6 @@ class DebugClient ULONG bufferSize, PULONG versionInfoSize) { - if (m_lldbservices2 == nullptr) { - return E_NOINTERFACE; - } return m_lldbservices2->GetModuleVersionInformation(index, base, item, buffer, bufferSize, versionInfoSize); } diff --git a/src/SOS/lldbplugin/services.cpp b/src/SOS/lldbplugin/services.cpp index a2340bdd3b..478a8e4562 100644 --- a/src/SOS/lldbplugin/services.cpp +++ b/src/SOS/lldbplugin/services.cpp @@ -1348,8 +1348,10 @@ LLDBServices::GetModuleSize( size += section.GetByteSize(); } } - - return size; + // For core dumps lldb doesn't return the section sizes when it + // doesn't have access to the actual module file, but SOS (like + // the SymbolReader code) still needs a non-zero module size. + return size != 0 ? size : LONG_MAX; } //---------------------------------------------------------------------------- diff --git a/src/SOS/lldbplugin/soscommand.cpp b/src/SOS/lldbplugin/soscommand.cpp index 487c62d561..8031e72c9e 100644 --- a/src/SOS/lldbplugin/soscommand.cpp +++ b/src/SOS/lldbplugin/soscommand.cpp @@ -172,5 +172,6 @@ sosCommandInitialize(lldb::SBDebugger debugger) interpreter.AddCommand("sympath", new sosCommand("SetSymbolServer", "-sympath"), "Add server, cache and directory paths in the Windows symbol path format."); interpreter.AddCommand("soshelp", new sosCommand("Help"), "Displays all available commands when no parameter is specified, or displays detailed help information about the specified command. soshelp "); interpreter.AddCommand("sosstatus", new sosCommand("SOSStatus"), "Displays the global SOS status."); + interpreter.AddCommand("sosflush", new sosCommand("SOSFlush"), "Flushes the DAC caches."); return true; } From d31a5fee2c8e1262cf742258d95fc7b954b7c6bb Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Mon, 30 Dec 2019 18:18:23 -0800 Subject: [PATCH 052/243] Abstract all the runtime specific info and class. Add IRuntime/Runtime classes. The code to get the runtime module address/size info, DAC/DBI file path, create/get the SOS DAC process instance and to create/get the ICorDebug process instance to the Runtime class implementation. It was moved mostly intack with some type and function name changes. Added -desktop and -netcore options to the !sosstatus command to switch between runtimes. Eventually SOSHosting will provide the IRuntime instance when hosted under dotnet-dump. Fix unloading/reloading SOS (under windbg) issue: https://github.com/dotnet/diagnostics/issues/386 Flush process specific global state when process terminates issue: https://github.com/dotnet/diagnostics/issues/479 --- src/SOS/SOS.Hosting/SOSHost.cs | 5 +- src/SOS/Strike/CMakeLists.txt | 2 + src/SOS/Strike/EventCallbacks.cpp | 3 +- src/SOS/Strike/ExpressionNode.cpp | 18 +- src/SOS/Strike/ExpressionNode.h | 2 + src/SOS/Strike/Strike.vcxproj | 4 + src/SOS/Strike/Strike.vcxproj.filters | 4 + src/SOS/Strike/WatchCmd.cpp | 2 - src/SOS/Strike/cordebugdatatarget.h | 251 ++++++++ src/SOS/Strike/cordebuglibraryprovider.h | 170 +++++ src/SOS/Strike/disasm.h | 2 - src/SOS/Strike/exts.h | 21 +- src/SOS/Strike/hostcoreclr.cpp | 238 +------ src/SOS/Strike/hostcoreclr.h | 12 +- src/SOS/Strike/runtime.cpp | 599 ++++++++++++++++++ src/SOS/Strike/runtime.h | 257 ++++++++ src/SOS/Strike/sosdocs.txt | 24 +- src/SOS/Strike/sosdocsunix.txt | 13 +- src/SOS/Strike/strike.cpp | 155 ++--- src/SOS/Strike/util.cpp | 756 +---------------------- src/SOS/Strike/util.h | 100 --- src/Tools/dotnet-dump/Analyzer.cs | 34 +- 22 files changed, 1509 insertions(+), 1163 deletions(-) create mode 100644 src/SOS/Strike/cordebugdatatarget.h create mode 100644 src/SOS/Strike/cordebuglibraryprovider.h create mode 100644 src/SOS/Strike/runtime.cpp create mode 100644 src/SOS/Strike/runtime.h diff --git a/src/SOS/SOS.Hosting/SOSHost.cs b/src/SOS/SOS.Hosting/SOSHost.cs index f30e710e27..115bdeb236 100644 --- a/src/SOS/SOS.Hosting/SOSHost.cs +++ b/src/SOS/SOS.Hosting/SOSHost.cs @@ -38,6 +38,7 @@ private delegate int SOSInitializeDelegate( [In, MarshalAs(UnmanagedType.Struct)] ref SOSNetCoreCallbacks callbacks, int callbacksSize, [In, MarshalAs(UnmanagedType.LPStr)] string tempDirectory, + bool isDesktop, [In, MarshalAs(UnmanagedType.LPStr)] string dacFilePath, [In, MarshalAs(UnmanagedType.LPStr)] string dbiFilePath, bool symbolStoreEnabled); @@ -224,9 +225,10 @@ public SOSHost(IServiceProvider serviceProvider) /// Loads and initializes the SOS module. /// /// Temporary directory created to download DAC module + /// if true, desktop runtime, else .NET Core runtime /// The path to DAC that CLRMD loaded or downloaded or null /// The path to DBI (for future use) or null - public void InitializeSOSHost(string tempDirectory, string dacFilePath, string dbiFilePath) + public void InitializeSOSHost(string tempDirectory, bool isDesktop, string dacFilePath, string dbiFilePath) { if (_sosLibrary == IntPtr.Zero) { @@ -268,6 +270,7 @@ public void InitializeSOSHost(string tempDirectory, string dacFilePath, string d ref s_callbacks, Marshal.SizeOf(), tempDirectory, + isDesktop, dacFilePath, dbiFilePath, SymbolReader.IsSymbolStoreEnabled()); diff --git a/src/SOS/Strike/CMakeLists.txt b/src/SOS/Strike/CMakeLists.txt index ae4ff471f3..207ec5a993 100644 --- a/src/SOS/Strike/CMakeLists.txt +++ b/src/SOS/Strike/CMakeLists.txt @@ -69,6 +69,7 @@ if(WIN32) gcroot.cpp hostcoreclr.cpp metadata.cpp + runtime.cpp sigparser.cpp sildasm.cpp sos.cpp @@ -125,6 +126,7 @@ else(WIN32) gcroot.cpp hostcoreclr.cpp metadata.cpp + runtime.cpp sigparser.cpp sildasm.cpp stressLogDump.cpp diff --git a/src/SOS/Strike/EventCallbacks.cpp b/src/SOS/Strike/EventCallbacks.cpp index 947d913bec..bdef2f9e65 100644 --- a/src/SOS/Strike/EventCallbacks.cpp +++ b/src/SOS/Strike/EventCallbacks.cpp @@ -105,7 +105,8 @@ HRESULT __stdcall EventCallbacks::Exception(PEXCEPTION_RECORD64 Exception, ULONG HRESULT __stdcall EventCallbacks::ExitProcess(ULONG ExitCode) { - UninitCorDebugInterface(); + Runtime::CleanupRuntimes(); + CleanupTempDirectory(); return DEBUG_STATUS_NO_CHANGE; } diff --git a/src/SOS/Strike/ExpressionNode.cpp b/src/SOS/Strike/ExpressionNode.cpp index b61dcad487..45a2f5c191 100644 --- a/src/SOS/Strike/ExpressionNode.cpp +++ b/src/SOS/Strike/ExpressionNode.cpp @@ -4,11 +4,12 @@ #include "ExpressionNode.h" - #ifndef IfFailRet #define IfFailRet(EXPR) do { Status = (EXPR); if(FAILED(Status)) { return (Status); } } while (0) #endif +ICorDebugProcess* ExpressionNode::s_pCorDebugProcess = nullptr; + // Returns the complete expression being evaluated to get the value for this node // The returned pointer is a string interior to this object - once you release // all references to this object the string is invalid. @@ -45,8 +46,15 @@ WCHAR* ExpressionNode::GetErrorMessage() { return pErrorMessage; } // Factory function for creating the expression node at the root of a tree HRESULT ExpressionNode::CreateExpressionNode(__in_z WCHAR* pExpression, ExpressionNode** ppExpressionNode) { + _ASSERTE(g_pRuntime != nullptr); *ppExpressionNode = NULL; - HRESULT Status = CreateExpressionNodeHelper(pExpression, + + HRESULT Status = g_pRuntime->GetCorDebugInterface(&s_pCorDebugProcess); + if (FAILED(Status)) + { + return Status; + } + Status = CreateExpressionNodeHelper(pExpression, pExpression, 0, NULL, @@ -1760,7 +1768,8 @@ HRESULT ExpressionNode::EnumerateFrames(FrameEnumCallback pCallback, VOID* pUser ULONG ulThreadID = 0; g_ExtSystem->GetCurrentThreadSystemId(&ulThreadID); - IfFailRet(g_pCorDebugProcess->GetThread(ulThreadID, &pThread)); + _ASSERTE(s_pCorDebugProcess != nullptr); + IfFailRet(s_pCorDebugProcess->GetThread(ulThreadID, &pThread)); IfFailRet(pThread->QueryInterface(IID_ICorDebugThread3, (LPVOID *) &pThread3)); IfFailRet(pThread3->CreateStackWalk(&pStackWalk)); @@ -1980,7 +1989,8 @@ HRESULT ExpressionNode::FindTypeByName(__in_z const WCHAR* pTypeName, ICorDebugT { HRESULT Status = S_OK; ToRelease pAppDomainEnum; - IfFailRet(g_pCorDebugProcess->EnumerateAppDomains(&pAppDomainEnum)); + _ASSERTE(s_pCorDebugProcess != nullptr); + IfFailRet(s_pCorDebugProcess->EnumerateAppDomains(&pAppDomainEnum)); DWORD count; IfFailRet(pAppDomainEnum->GetCount(&count)); for(DWORD i = 0; i < count; i++) diff --git a/src/SOS/Strike/ExpressionNode.h b/src/SOS/Strike/ExpressionNode.h index 48cc036729..b845c8a334 100644 --- a/src/SOS/Strike/ExpressionNode.h +++ b/src/SOS/Strike/ExpressionNode.h @@ -88,6 +88,8 @@ class ExpressionNode VOID DFSVisit(ExpressionNodeVisitorCallback pFunc, VOID* pUserData, int depth=0); private: + static ICorDebugProcess* s_pCorDebugProcess; + // for nodes that evaluate to a type, this is that type // for nodes that evaluate to a debuggee value, this is the type of that // value or one of its base types. It represents the type the value should diff --git a/src/SOS/Strike/Strike.vcxproj b/src/SOS/Strike/Strike.vcxproj index 9f5e15cb10..510008f66c 100644 --- a/src/SOS/Strike/Strike.vcxproj +++ b/src/SOS/Strike/Strike.vcxproj @@ -391,6 +391,7 @@ + @@ -405,6 +406,8 @@ + + @@ -417,6 +420,7 @@ + diff --git a/src/SOS/Strike/Strike.vcxproj.filters b/src/SOS/Strike/Strike.vcxproj.filters index cd5bb759b5..1f4f91078e 100644 --- a/src/SOS/Strike/Strike.vcxproj.filters +++ b/src/SOS/Strike/Strike.vcxproj.filters @@ -21,6 +21,7 @@ + @@ -57,6 +58,9 @@ inc + + + diff --git a/src/SOS/Strike/WatchCmd.cpp b/src/SOS/Strike/WatchCmd.cpp index 443f1dd6ef..ca548eea25 100644 --- a/src/SOS/Strike/WatchCmd.cpp +++ b/src/SOS/Strike/WatchCmd.cpp @@ -95,7 +95,6 @@ HRESULT WatchCmd::Print(int expansionIndex, __in_z WCHAR* expansionPath, __in_z INIT_API_EE(); INIT_API_DAC(); EnableDMLHolder dmlHolder(TRUE); - IfFailRet(InitCorDebugInterface()); PersistList* pFilterList = NULL; if(pFilterName != NULL) @@ -208,7 +207,6 @@ HRESULT WatchCmd::SaveList(__in_z WCHAR* pSaveName) HRESULT Status = S_OK; INIT_API_EE(); INIT_API_DAC(); - IfFailRet(InitCorDebugInterface()); RemoveList(pSaveName); PersistList* pList = new PersistList(); diff --git a/src/SOS/Strike/cordebugdatatarget.h b/src/SOS/Strike/cordebugdatatarget.h new file mode 100644 index 0000000000..fe5bece3a5 --- /dev/null +++ b/src/SOS/Strike/cordebugdatatarget.h @@ -0,0 +1,251 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#ifndef __cordebugdatatarget_h__ +#define __cordebugdatatarget_h__ + +/**********************************************************************\ +* Data target for the debugged process. Provided to OpenVirtualProcess +* in order to get an ICorDebugProcess back. +\**********************************************************************/ +class CorDebugDataTarget : public ICorDebugMutableDataTarget, public ICorDebugMetaDataLocator, public ICorDebugDataTarget4 +{ +public: + CorDebugDataTarget() : m_ref(0) + { + } + + virtual ~CorDebugDataTarget() {} + + virtual HRESULT STDMETHODCALLTYPE QueryInterface( + REFIID InterfaceId, + PVOID* pInterface) + { + if (InterfaceId == IID_IUnknown) + { + *pInterface = static_cast(static_cast(this)); + } + else if (InterfaceId == IID_ICorDebugDataTarget) + { + *pInterface = static_cast(this); + } + else if (InterfaceId == IID_ICorDebugMutableDataTarget) + { + *pInterface = static_cast(this); + } + else if (InterfaceId == IID_ICorDebugMetaDataLocator) + { + *pInterface = static_cast(this); + } + else if (InterfaceId == IID_ICorDebugDataTarget4) + { + *pInterface = static_cast(this); + } + else + { + *pInterface = NULL; + return E_NOINTERFACE; + } + + AddRef(); + return S_OK; + } + + virtual ULONG STDMETHODCALLTYPE AddRef() + { + return InterlockedIncrement(&m_ref); + } + + virtual ULONG STDMETHODCALLTYPE Release() + { + LONG ref = InterlockedDecrement(&m_ref); + if (ref == 0) + { + delete this; + } + return ref; + } + + // + // ICorDebugDataTarget. + // + + virtual HRESULT STDMETHODCALLTYPE GetPlatform(CorDebugPlatform * pPlatform) + { + ULONG platformKind = g_targetMachine->GetPlatform(); +#ifdef FEATURE_PAL + if(platformKind == IMAGE_FILE_MACHINE_I386) + *pPlatform = CORDB_PLATFORM_POSIX_X86; + else if(platformKind == IMAGE_FILE_MACHINE_AMD64) + *pPlatform = CORDB_PLATFORM_POSIX_AMD64; + else if(platformKind == IMAGE_FILE_MACHINE_ARMNT) + *pPlatform = CORDB_PLATFORM_POSIX_ARM; + else + return E_FAIL; +#else + if(platformKind == IMAGE_FILE_MACHINE_I386) + *pPlatform = CORDB_PLATFORM_WINDOWS_X86; + else if(platformKind == IMAGE_FILE_MACHINE_AMD64) + *pPlatform = CORDB_PLATFORM_WINDOWS_AMD64; + else if(platformKind == IMAGE_FILE_MACHINE_ARMNT) + *pPlatform = CORDB_PLATFORM_WINDOWS_ARM; + else if(platformKind == IMAGE_FILE_MACHINE_ARM64) + *pPlatform = CORDB_PLATFORM_WINDOWS_ARM64; + else + return E_FAIL; +#endif + + return S_OK; + } + + virtual HRESULT STDMETHODCALLTYPE ReadVirtual( + CORDB_ADDRESS address, + BYTE * pBuffer, + ULONG32 request, + ULONG32 * pcbRead) + { + if (g_ExtData == NULL) + { + return E_UNEXPECTED; + } +#ifdef FEATURE_PAL + if (g_sos != nullptr) + { + // LLDB synthesizes memory (returns 0's) for missing pages (in this case the missing metadata pages) + // in core dumps. This functions creates a list of the metadata regions and caches the metadata if + // available from the local or downloaded assembly. If the read would be in the metadata of a loaded + // assembly, the metadata from the this cache will be returned. + HRESULT hr = GetMetadataMemory(address, request, pBuffer); + if (SUCCEEDED(hr)) { + if (pcbRead != nullptr) { + *pcbRead = request; + } + return hr; + } + } +#endif + HRESULT hr = g_ExtData->ReadVirtual(address, pBuffer, request, (PULONG) pcbRead); + if (FAILED(hr)) + { + ExtDbgOut("CorDebugDataTarget::ReadVirtual FAILED %08x address %p size %08x\n", hr, address, request); + } + return hr; + } + + virtual HRESULT STDMETHODCALLTYPE GetThreadContext( + DWORD dwThreadOSID, + ULONG32 contextFlags, + ULONG32 contextSize, + BYTE * context) + { +#ifdef FEATURE_PAL + if (g_ExtServices == NULL) + { + return E_UNEXPECTED; + } + return g_ExtServices->GetThreadContextById(dwThreadOSID, contextFlags, contextSize, context); +#else + ULONG ulThreadIDOrig; + ULONG ulThreadIDRequested; + HRESULT hr; + + hr = g_ExtSystem->GetCurrentThreadId(&ulThreadIDOrig); + if (FAILED(hr)) + { + return hr; + } + + hr = g_ExtSystem->GetThreadIdBySystemId(dwThreadOSID, &ulThreadIDRequested); + if (FAILED(hr)) + { + return hr; + } + + hr = g_ExtSystem->SetCurrentThreadId(ulThreadIDRequested); + if (FAILED(hr)) + { + return hr; + } + + // Prepare context structure + ZeroMemory(context, contextSize); + ((CONTEXT*) context)->ContextFlags = contextFlags; + + // Ok, do it! + hr = g_ExtAdvanced->GetThreadContext((LPVOID) context, contextSize); + + // This is cleanup; failure here doesn't mean GetThreadContext should fail + // (that's determined by hr). + g_ExtSystem->SetCurrentThreadId(ulThreadIDOrig); + + return hr; +#endif // FEATURE_PAL + } + + // + // ICorDebugMutableDataTarget. + // + + virtual HRESULT STDMETHODCALLTYPE WriteVirtual(CORDB_ADDRESS address, + const BYTE * pBuffer, + ULONG32 bytesRequested) + { + if (g_ExtData == NULL) + { + return E_UNEXPECTED; + } + return g_ExtData->WriteVirtual(address, (PVOID)pBuffer, bytesRequested, NULL); + } + + virtual HRESULT STDMETHODCALLTYPE SetThreadContext(DWORD dwThreadID, + ULONG32 contextSize, + const BYTE * pContext) + { + return E_NOTIMPL; + } + + virtual HRESULT STDMETHODCALLTYPE ContinueStatusChanged(DWORD dwThreadId, + CORDB_CONTINUE_STATUS continueStatus) + { + return E_NOTIMPL; + } + + // + // ICorDebugMetaDataLocator. + // + + virtual HRESULT STDMETHODCALLTYPE GetMetaData( + /* [in] */ LPCWSTR wszImagePath, + /* [in] */ DWORD dwImageTimeStamp, + /* [in] */ DWORD dwImageSize, + /* [in] */ ULONG32 cchPathBuffer, + /* [annotation][out] */ + _Out_ ULONG32 *pcchPathBuffer, + /* [annotation][length_is][size_is][out] */ + _Out_writes_to_(cchPathBuffer, *pcchPathBuffer) WCHAR wszPathBuffer[]) + { + return E_NOTIMPL; + } + + // + // ICorDebugDataTarget4 + // + virtual HRESULT STDMETHODCALLTYPE VirtualUnwind(DWORD threadId, ULONG32 contextSize, PBYTE context) + { +#ifdef FEATURE_PAL + if (g_ExtServices == NULL) + { + return E_UNEXPECTED; + } + return g_ExtServices->VirtualUnwind(threadId, contextSize, context); +#else + return E_NOTIMPL; +#endif + } + +protected: + LONG m_ref; +}; + +#endif // __cordebugdatatarget_h__ diff --git a/src/SOS/Strike/cordebuglibraryprovider.h b/src/SOS/Strike/cordebuglibraryprovider.h new file mode 100644 index 0000000000..f5eac41b5e --- /dev/null +++ b/src/SOS/Strike/cordebuglibraryprovider.h @@ -0,0 +1,170 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#ifndef __cordebuglibraryprovider_h__ +#define __cordebuglibraryprovider_h__ + +#ifndef FEATURE_PAL +extern HMODULE LoadLibraryAndCheck(PCWSTR filename, DWORD timestamp, DWORD filesize); +#endif + +/**********************************************************************\ + * Provides a way for the public CLR debugging interface to find the + * appropriate mscordbi.dll, DAC, etc. +\**********************************************************************/ +class CorDebugLibraryProvider : public ICLRDebuggingLibraryProvider, ICLRDebuggingLibraryProvider2 +{ +public: + CorDebugLibraryProvider(Runtime* pRuntime) : + m_ref(0), + m_pRuntime(pRuntime) + { + } + + virtual ~CorDebugLibraryProvider() {} + + virtual HRESULT STDMETHODCALLTYPE QueryInterface( + REFIID InterfaceId, + PVOID* pInterface) + { + if (InterfaceId == IID_IUnknown) + { + *pInterface = static_cast(static_cast(this)); + } +#ifndef FEATURE_PAL + else if (InterfaceId == IID_ICLRDebuggingLibraryProvider) + { + *pInterface = static_cast(this); + } +#endif + else if (InterfaceId == IID_ICLRDebuggingLibraryProvider2) + { + *pInterface = static_cast(this); + } + else + { + *pInterface = NULL; + return E_NOINTERFACE; + } + + AddRef(); + return S_OK; + } + + virtual ULONG STDMETHODCALLTYPE AddRef() + { + return InterlockedIncrement(&m_ref); + } + + virtual ULONG STDMETHODCALLTYPE Release() + { + LONG ref = InterlockedDecrement(&m_ref); + if (ref == 0) + { + delete this; + } + return ref; + } + + HRESULT ProvideLibraryInternal( + const WCHAR* pwszFileName, + DWORD dwTimestamp, + DWORD dwSizeOfImage, + HMODULE* phModule, + LPWSTR* ppResolvedModulePath) + { + const char* filePath = nullptr; + + if (_wcsncmp(pwszFileName, m_pRuntime->GetDacDllNameW(), _wcslen(m_pRuntime->GetDacDllNameW())) == 0) + { + filePath = m_pRuntime->GetDacFilePath(); + } + else if (_wcsncmp(pwszFileName, NET_DBI_DLL_NAME_W, _wcslen(NET_DBI_DLL_NAME_W)) == 0) + { + filePath = m_pRuntime->GetDbiFilePath(); + } + + ArrayHolder modulePath = new WCHAR[MAX_LONGPATH + 1]; + if (filePath != nullptr) + { + int length = MultiByteToWideChar(CP_ACP, 0, filePath, -1, modulePath, MAX_LONGPATH); + if (0 >= length) + { + ExtErr("MultiByteToWideChar(filePath) failed. Last error = 0x%x\n", GetLastError()); + return HRESULT_FROM_WIN32(GetLastError()); + } + } + else + { + LPCSTR runtimeDirectory = m_pRuntime->GetRuntimeDirectory(); + if (runtimeDirectory == nullptr) + { + ExtErr("Runtime not loaded\n"); + return E_FAIL; + } + int length = MultiByteToWideChar(CP_ACP, 0, runtimeDirectory, -1, modulePath, MAX_LONGPATH); + if (0 >= length) + { + ExtErr("MultiByteToWideChar(runtimeDirectory) failed. Last error = 0x%x\n", GetLastError()); + return HRESULT_FROM_WIN32(GetLastError()); + } + wcscat_s(modulePath, MAX_LONGPATH, pwszFileName); + } + + ExtOut("Loaded %S\n", modulePath.GetPtr()); + +#ifndef FEATURE_PAL + if (phModule != NULL) + { + *phModule = LoadLibraryAndCheck(modulePath.GetPtr(), dwTimestamp, dwSizeOfImage); + } +#endif + if (ppResolvedModulePath != NULL) + { + *ppResolvedModulePath = modulePath.Detach(); + } + return S_OK; + } + + // Called by the shim to locate and load dac and dbi + // Parameters: + // pwszFileName - the name of the file to load + // dwTimestamp - the expected timestamp of the file + // dwSizeOfImage - the expected SizeOfImage (a PE header data value) + // phModule - a handle to loaded module + // + // Return Value + // S_OK if the file was loaded, or any error if not + virtual HRESULT STDMETHODCALLTYPE ProvideLibrary( + const WCHAR * pwszFileName, + DWORD dwTimestamp, + DWORD dwSizeOfImage, + HMODULE* phModule) + { + if ((phModule == NULL) || (pwszFileName == NULL)) + { + return E_INVALIDARG; + } + return ProvideLibraryInternal(pwszFileName, dwTimestamp, dwSizeOfImage, phModule, NULL); + } + + virtual HRESULT STDMETHODCALLTYPE ProvideLibrary2( + const WCHAR* pwszFileName, + DWORD dwTimestamp, + DWORD dwSizeOfImage, + LPWSTR* ppResolvedModulePath) + { + if ((pwszFileName == NULL) || (ppResolvedModulePath == NULL)) + { + return E_INVALIDARG; + } + return ProvideLibraryInternal(pwszFileName, dwTimestamp, dwSizeOfImage, NULL, ppResolvedModulePath); + } + +protected: + LONG m_ref; + Runtime* m_pRuntime; +}; + +#endif // __cordebuglibraryprovider_h__ diff --git a/src/SOS/Strike/disasm.h b/src/SOS/Strike/disasm.h index cec59b5a68..1eb3920cb0 100644 --- a/src/SOS/Strike/disasm.h +++ b/src/SOS/Strike/disasm.h @@ -90,8 +90,6 @@ void DumpStackWorker (DumpStackFlag &DSFlag); void UnassemblyUnmanaged (DWORD_PTR IP, BOOL bSuppressLines); -HRESULT CheckEEDll (); - BOOL GetCalleeSite (DWORD_PTR IP, DWORD_PTR &IPCallee); void DisasmAndClean (DWORD_PTR &IP, __out_ecount_opt(length) char *line, ULONG length); diff --git a/src/SOS/Strike/exts.h b/src/SOS/Strike/exts.h index e15e88776d..cefec80d91 100644 --- a/src/SOS/Strike/exts.h +++ b/src/SOS/Strike/exts.h @@ -79,6 +79,7 @@ typedef struct _TADDR_SEGINFO } TADDR_SEGINFO; #include "util.h" +#include "runtime.h" #ifdef __cplusplus extern "C" { @@ -175,7 +176,6 @@ inline BOOL IsInterrupt() ExtOut("Command canceled at the user's request.\n"); ControlC = TRUE; } - return ControlC; } @@ -196,7 +196,11 @@ class __ExtensionCleanUp inline void EENotLoadedMessage(HRESULT Status) { - ExtOut("Failed to find runtime module (%s), 0x%08x\n", GetRuntimeDllName(), Status); +#ifdef FEATURE_PAL + ExtOut("Failed to find runtime module (%s), 0x%08x\n", NETCORE_RUNTIME_DLL_NAME_A, Status); +#else + ExtOut("Failed to find runtime module (%s or %s), 0x%08x\n", NETCORE_RUNTIME_DLL_NAME_A, DESKTOP_RUNTIME_DLL_NAME_A, Status); +#endif ExtOut("Extension commands need it in order to have something to do.\n"); } @@ -204,7 +208,7 @@ inline void DACMessage(HRESULT Status) { ExtOut("Failed to load data access module, 0x%08x\n", Status); #ifndef FEATURE_PAL - ExtOut("Verify that 1) you have a recent build of the debugger (6.2.14 or newer)\n"); + ExtOut("Verify that 1) you have a recent build of the debugger (10.0.18317.1001 or newer)\n"); ExtOut(" 2) the file %s that matches your version of %s is\n", GetDacDllName(), GetRuntimeDllName()); ExtOut(" in the version directory or on the symbol path\n"); ExtOut(" 3) or, if you are debugging a dump file, verify that the file \n"); @@ -251,7 +255,7 @@ HRESULT CheckEEDll(); if ((Status = ArchQuery()) != S_OK) return Status; #define INIT_API_EE() \ - if ((Status = CheckEEDll()) != S_OK) \ + if ((Status = CheckEEDll()) != S_OK) \ { \ EENotLoadedMessage(Status); \ return Status; \ @@ -285,13 +289,8 @@ HRESULT CheckEEDll(); // and functions they call should test g_bDacBroken before calling any DAC enabled // feature. #define INIT_API_NO_RET_ON_FAILURE() \ - INIT_API_NOEE() \ - if ((Status = CheckEEDll()) != S_OK) \ - { \ - ExtOut("Failed to find runtime module (%s), 0x%08x\n", GetRuntimeDllName(), Status); \ - ExtOut("Some functionality may be impaired\n"); \ - } \ - else if ((Status = LoadClrDebugDll()) != S_OK) \ + INIT_API_NODAC() \ + if ((Status = LoadClrDebugDll()) != S_OK) \ { \ ExtOut("Failed to load data access module (%s), 0x%08x\n", GetDacDllName(), Status); \ ExtOut("Some functionality may be impaired\n"); \ diff --git a/src/SOS/Strike/hostcoreclr.cpp b/src/SOS/Strike/hostcoreclr.cpp index e362a1b843..62e4dc1944 100644 --- a/src/SOS/Strike/hostcoreclr.cpp +++ b/src/SOS/Strike/hostcoreclr.cpp @@ -9,6 +9,7 @@ // ==--== #include "sos.h" #include "disasm.h" +#include "runtime.h" #include #include "corhdr.h" @@ -40,10 +41,8 @@ #endif static bool g_hostingInitialized = false; -static bool g_symbolStoreInitialized = false; +bool g_symbolStoreInitialized = false; LPCSTR g_hostRuntimeDirectory = nullptr; -LPCSTR g_dacFilePath = nullptr; -LPCSTR g_dbiFilePath = nullptr; LPCSTR g_tmpPath = nullptr; SOSNetCoreCallbacks g_SOSNetCoreCallbacks; #ifndef FEATURE_PAL @@ -226,78 +225,6 @@ static bool GetEntrypointExecutableAbsolutePath(std::string& entrypointExecutabl #endif // FEATURE_PAL -/**********************************************************************\ - * Returns the runtime module/runtime directory of the target. -\**********************************************************************/ -HRESULT GetRuntimeDirectory(std::string& runtimeDirectory) -{ -#ifdef FEATURE_PAL - LPCSTR directory = g_ExtServices->GetCoreClrDirectory(); - if (directory == NULL) - { - ExtErr("Error: Runtime module (%s) not loaded yet\n", GetRuntimeDllName()); - return E_FAIL; - } - if (!GetAbsolutePath(directory, runtimeDirectory)) - { - ExtDbgOut("Error: Runtime directory %s doesn't exist\n", directory); - return E_FAIL; - } -#else - ULONG index; - HRESULT Status = GetRuntimeModuleInfo(&index, NULL); - if (FAILED(Status)) - { - ExtErr("Error: Runtime module (%s) not loaded yet\n", GetRuntimeDllName()); - return Status; - } - ArrayHolder szModuleName = new char[MAX_LONGPATH + 1]; - Status = g_ExtSymbols->GetModuleNames(index, 0, szModuleName, MAX_LONGPATH, NULL, NULL, 0, NULL, NULL, 0, NULL); - if (FAILED(Status)) - { - ExtErr("Error: Failed to get runtime module name\n"); - return Status; - } - if (GetFileAttributesA(szModuleName) == INVALID_FILE_ATTRIBUTES) - { - Status = HRESULT_FROM_WIN32(GetLastError()); - ExtDbgOut("Error: Runtime module %s doesn't exist %08x\n", szModuleName, Status); - return Status; - } - runtimeDirectory = szModuleName; - - // Parse off the module name to get just the path - size_t lastSlash = runtimeDirectory.rfind(DIRECTORY_SEPARATOR_CHAR_A); - if (lastSlash == std::string::npos) - { - ExtDbgOut("Error: Runtime module %s has no directory separator\n", szModuleName); - return E_FAIL; - } - runtimeDirectory.assign(runtimeDirectory, 0, lastSlash); -#endif - return S_OK; -} - -/**********************************************************************\ - * Returns the runtime module/runtime directory of the target. -\**********************************************************************/ -HRESULT GetRuntimeDirectory(LPWSTR modulePath, int modulePathSize) -{ - std::string runtimeDirectory; - HRESULT hr = GetRuntimeDirectory(runtimeDirectory); - if (FAILED(hr)) - { - return hr; - } - int length = MultiByteToWideChar(CP_ACP, 0, runtimeDirectory.c_str(), -1, modulePath, modulePathSize); - if (0 >= length) - { - ExtErr("MultiByteToWideChar(runtimeDirectory) failed. Last error = 0x%x\n", GetLastError()); - return HRESULT_FROM_WIN32(GetLastError()); - } - return S_OK; -} - // // Searches the runtime directory for a .NET Core runtime version // @@ -408,17 +335,22 @@ static HRESULT GetHostRuntime(std::string& coreClrPath, std::string& hostRuntime // Find highest 3.1.x version if (!FindDotNetVersion(3, 1, hostRuntimeDirectory)) { + HRESULT hr = CheckEEDll(); + if (FAILED(hr)) { + return hr; + } // Don't use the desktop runtime to host - if (g_isDesktopRuntime) + if (g_pRuntime->IsDesktop()) { return E_FAIL; } // If an installed runtime can not be found, use the target coreclr version - HRESULT hr = GetRuntimeDirectory(hostRuntimeDirectory); - if (FAILED(hr)) + LPCSTR runtimeDirectory = g_pRuntime->GetRuntimeDirectory(); + if (runtimeDirectory == nullptr) { - return hr; + return E_FAIL; } + hostRuntimeDirectory = runtimeDirectory; } } } @@ -494,96 +426,10 @@ void CleanupTempDirectory() } } -/**********************************************************************\ - * Returns the DAC module path to the rest of SOS. -\**********************************************************************/ -LPCSTR GetDacFilePath() -{ - // If the DAC path hasn't been set by the symbol download support, use the one in the runtime directory. - if (g_dacFilePath == nullptr) - { - std::string dacModulePath; - HRESULT hr = GetRuntimeDirectory(dacModulePath); - if (SUCCEEDED(hr)) - { - dacModulePath.append(DIRECTORY_SEPARATOR_STR_A); - dacModulePath.append(GetDacDllName()); -#ifdef FEATURE_PAL - // If DAC file exists in the runtime directory - if (access(dacModulePath.c_str(), F_OK) == 0) -#endif - { -#if defined(__linux__) - // We are creating a symlink to the DAC in a temp directory - // where libcoreclrtraceptprovider.so doesn't exist so it - // doesn't get loaded by the DAC causing a LTTng-UST exception. - // - // Issue #https://github.com/dotnet/coreclr/issues/20205 - LPCSTR tmpPath = GetTempDirectory(); - if (tmpPath != nullptr) - { - std::string dacSymLink(tmpPath); - dacSymLink.append(NETCORE_DAC_DLL_NAME_A); - - int error = symlink(dacModulePath.c_str(), dacSymLink.c_str()); - if (error == 0) - { - dacModulePath.assign(dacSymLink); - } - else - { - ExtErr("symlink(%s, %s) FAILED %s\n", dacModulePath.c_str(), dacSymLink.c_str(), strerror(errno)); - } - } -#endif - g_dacFilePath = _strdup(dacModulePath.c_str()); - } - } - - if (g_dacFilePath == nullptr) - { - // Attempt to only load the DAC/DBI modules - LoadNativeSymbols(true); - } - } - return g_dacFilePath; -} - -/**********************************************************************\ - * Returns the DBI module path to the rest of SOS. -\**********************************************************************/ -LPCSTR GetDbiFilePath() -{ - if (g_dbiFilePath == nullptr) - { - std::string dbiModulePath; - HRESULT hr = GetRuntimeDirectory(dbiModulePath); - if (SUCCEEDED(hr)) - { - dbiModulePath.append(DIRECTORY_SEPARATOR_STR_A); - dbiModulePath.append(NET_DBI_DLL_NAME_A); -#ifdef FEATURE_PAL - // If DBI file exists in the runtime directory - if (access(dbiModulePath.c_str(), F_OK) == 0) -#endif - { - g_dbiFilePath = _strdup(dbiModulePath.c_str()); - } - } - - if (g_dbiFilePath == nullptr) - { - // Attempt to only load the DAC/DBI modules - LoadNativeSymbols(true); - } - } - return g_dbiFilePath; -} - /**********************************************************************\ * Called when the managed SOS Host loads/initializes SOS. \**********************************************************************/ -extern "C" HRESULT SOSInitializeByHost(SOSNetCoreCallbacks* callbacks, int callbacksSize, LPCSTR tempDirectory, LPCSTR dacFilePath, LPCSTR dbiFilePath, bool symbolStoreEnabled) +extern "C" HRESULT SOSInitializeByHost(SOSNetCoreCallbacks* callbacks, int callbacksSize, LPCSTR tempDirectory, bool isDesktop, LPCSTR dacFilePath, LPCSTR dbiFilePath, bool symbolStoreEnabled) { if (memcpy_s(&g_SOSNetCoreCallbacks, sizeof(g_SOSNetCoreCallbacks), callbacks, callbacksSize) != 0) { @@ -593,14 +439,7 @@ extern "C" HRESULT SOSInitializeByHost(SOSNetCoreCallbacks* callbacks, int callb { g_tmpPath = _strdup(tempDirectory); } - if (dacFilePath != nullptr) - { - g_dacFilePath = _strdup(dacFilePath); - } - if (dbiFilePath != nullptr) - { - g_dbiFilePath = _strdup(dbiFilePath); - } + Runtime::SetDacDbiPath(isDesktop, dacFilePath, dbiFilePath); #ifndef FEATURE_PAL // When SOS is hosted on dotnet-dump, the ExtensionApis are not set so // the expression evaluation function needs to be supplied. @@ -756,7 +595,7 @@ HRESULT InitializeHosting() // Pass to managed helper code to read in-memory PEs/PDBs. // Returns the number of bytes read. // -static int ReadMemoryForSymbols(ULONG64 address, uint8_t *buffer, int cb) +int ReadMemoryForSymbols(ULONG64 address, uint8_t *buffer, int cb) { ULONG read; if (SafeReadMemory(TO_TADDR(address), (PVOID)buffer, cb, &read)) @@ -857,32 +696,23 @@ void InitializeSymbolStoreFromSymPath() } #endif // FEATURE_PAL +#ifdef FEATURE_PAL + // // Symbol downloader callback // static void SymbolFileCallback(void* param, const char* moduleFileName, const char* symbolFilePath) { - if (strcmp(moduleFileName, GetRuntimeDllName()) == 0) { + if (strcmp(moduleFileName, NETCORE_RUNTIME_DLL_NAME_A) == 0) { return; } - if (strcmp(moduleFileName, GetDacDllName()) == 0) { - if (g_dacFilePath == nullptr) { - g_dacFilePath = _strdup(symbolFilePath); - } + if (strcmp(moduleFileName, NETCORE_DAC_DLL_NAME_A) == 0) { return; } if (strcmp(moduleFileName, NET_DBI_DLL_NAME_A) == 0) { - if (g_dbiFilePath == nullptr) { - g_dbiFilePath = _strdup(symbolFilePath); - } return; } -#ifdef FEATURE_PAL - if (g_ExtServices2 != nullptr) - { - g_ExtServices2->AddModuleSymbol(param, symbolFilePath); - } -#endif + g_ExtServices2->AddModuleSymbol(param, symbolFilePath); } // @@ -903,40 +733,14 @@ static void LoadNativeSymbolsCallback(void* param, const char* moduleFilePath, U HRESULT LoadNativeSymbols(bool runtimeOnly) { HRESULT hr = S_OK; -#ifdef FEATURE_PAL if (g_symbolStoreInitialized) { - hr = g_ExtServices2 ? g_ExtServices2->LoadNativeSymbols(runtimeOnly, LoadNativeSymbolsCallback) : E_NOINTERFACE; + hr = g_ExtServices2->LoadNativeSymbols(runtimeOnly, LoadNativeSymbolsCallback); } -#else - if (runtimeOnly) - { - ULONG index; - ULONG64 moduleAddress; - HRESULT hr = GetRuntimeModuleInfo(&index, &moduleAddress); - if (SUCCEEDED(hr)) - { - ArrayHolder moduleFilePath = new char[MAX_LONGPATH + 1]; - hr = g_ExtSymbols->GetModuleNames(index, 0, moduleFilePath, MAX_LONGPATH, NULL, NULL, 0, NULL, NULL, 0, NULL); - if (SUCCEEDED(hr)) - { - DEBUG_MODULE_PARAMETERS moduleParams; - hr = g_ExtSymbols->GetModuleParameters(1, &moduleAddress, 0, &moduleParams); - if (SUCCEEDED(hr)) - { - hr = InitializeSymbolStore(); - if (SUCCEEDED(hr) && g_symbolStoreInitialized) - { - LoadNativeSymbolsCallback(nullptr, moduleFilePath, moduleAddress, moduleParams.Size); - } - } - } - } - } -#endif return hr; } +#endif /**********************************************************************\ * Displays the symbol server and cache status. diff --git a/src/SOS/Strike/hostcoreclr.h b/src/SOS/Strike/hostcoreclr.h index f4848c6d27..e1bc8d7f4f 100644 --- a/src/SOS/Strike/hostcoreclr.h +++ b/src/SOS/Strike/hostcoreclr.h @@ -70,15 +70,14 @@ static const char *MetadataHelperClassName = "SOS.MetadataHelper"; extern HMODULE g_hInstance; extern LPCSTR g_hostRuntimeDirectory; -extern LPCSTR g_dacFilePath; -extern LPCSTR g_dbiFilePath; extern LPCSTR g_tmpPath; extern SOSNetCoreCallbacks g_SOSNetCoreCallbacks; -extern HRESULT GetRuntimeDirectory(std::string& runtimeDirectory); -extern HRESULT GetRuntimeDirectory(LPWSTR modulePath, int modulePathSize); -extern LPCSTR GetDacFilePath(); -extern LPCSTR GetDbiFilePath(); +#ifdef FEATURE_PAL +extern bool GetAbsolutePath(const char* path, std::string& absolutePath); +extern HRESULT LoadNativeSymbols(bool runtimeOnly = false); +#endif + extern LPCSTR GetTempDirectory(); extern void CleanupTempDirectory(); extern BOOL IsHostingInitialized(); @@ -98,7 +97,6 @@ extern HRESULT InitializeSymbolStore( extern void InitializeSymbolStoreFromSymPath(); #endif -extern HRESULT LoadNativeSymbols(bool runtimeOnly = false); extern void DisplaySymbolStore(); extern void DisableSymbolStore(); diff --git a/src/SOS/Strike/runtime.cpp b/src/SOS/Strike/runtime.cpp new file mode 100644 index 0000000000..cafe21bd1c --- /dev/null +++ b/src/SOS/Strike/runtime.cpp @@ -0,0 +1,599 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include "strike.h" +#include "util.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "runtime.h" +#include "datatarget.h" +#include "cordebugdatatarget.h" +#include "cordebuglibraryprovider.h" + +#ifdef FEATURE_PAL +#include +#include +#include +#endif // !FEATURE_PAL + +Runtime* Runtime::s_netcore = nullptr; +#ifndef FEATURE_PAL +Runtime* Runtime::s_desktop = nullptr; +#endif + +// Used to initialize the runtime instance with values from the host when under dotnet-dump +bool Runtime::s_isDesktop = false; +LPCSTR Runtime::s_dacFilePath = nullptr; +LPCSTR Runtime::s_dbiFilePath = nullptr; + +// Current runtime instance +IRuntime* g_pRuntime = nullptr; + +/**********************************************************************\ + * Creates a desktop or .NET Core instance of the runtime class +\**********************************************************************/ +HRESULT Runtime::CreateInstance(bool isDesktop, Runtime **ppRuntime) +{ + PCSTR runtimeModuleName = isDesktop ? DESKTOP_RUNTIME_MODULE_NAME_A : NETCORE_RUNTIME_MODULE_NAME_A; + ULONG moduleIndex = 0; + ULONG64 moduleAddress = 0; + ULONG64 moduleSize = 0; + HRESULT hr = S_OK; + + if (*ppRuntime == nullptr) + { + hr = g_ExtSymbols->GetModuleByModuleName(runtimeModuleName, 0, &moduleIndex, &moduleAddress); + if (SUCCEEDED(hr)) + { +#ifdef FEATURE_PAL + hr = g_ExtServices2->GetModuleInfo(moduleIndex, nullptr, &moduleSize); +#else + _ASSERTE(moduleAddress != 0); + DEBUG_MODULE_PARAMETERS params; + hr = g_ExtSymbols->GetModuleParameters(1, &moduleAddress, 0, ¶ms); + if (SUCCEEDED(hr)) + { + moduleSize = params.Size; + + if (params.SymbolType == SymDeferred) + { + std::string reloadCommand; + reloadCommand.append("/f "); + reloadCommand.append(runtimeModuleName); + reloadCommand.append(".dll"); + g_ExtSymbols->Reload(reloadCommand.c_str()); + g_ExtSymbols->GetModuleParameters(1, &moduleAddress, 0, ¶ms); + + if (params.SymbolType != SymPdb && params.SymbolType != SymDia) + { + ExtOut("PDB symbol for %s not loaded\n", runtimeModuleName); + } + } + } +#endif + } + if (SUCCEEDED(hr)) + { + *ppRuntime = new Runtime(isDesktop, moduleIndex, moduleAddress, moduleSize); + OnUnloadTask::Register(CleanupRuntimes); + } + } + return hr; +} + +/**********************************************************************\ + * Creates an instance of the runtime class. First it attempts to create + * the .NET Core instance and if that fails, it will try to create the + * desktop CLR instance. If both runtimes exists in the process or dump + * this runtime only creates the .NET Core version and leaves creating + * the desktop instance on demand in SwitchRuntime. +\**********************************************************************/ +HRESULT Runtime::CreateInstance() +{ + HRESULT hr = S_OK; + if (g_pRuntime == nullptr) + { + hr = CreateInstance(false, &s_netcore); +#ifdef FEATURE_PAL + g_pRuntime = s_netcore; +#else + if (FAILED(hr)) + { + hr = CreateInstance(true, &s_desktop); + } + g_pRuntime = s_netcore != nullptr ? s_netcore : s_desktop; +#endif + } + return hr; +} + +/**********************************************************************\ + * Switches between the .NET Core and desktop runtimes (if both + * loaded). Creates the desktop CLR runtime instance on demand. +\**********************************************************************/ +#ifndef FEATURE_PAL +bool Runtime::SwitchRuntime(bool desktop) +{ + if (desktop) { + CreateInstance(true, &s_desktop); + } + IRuntime* runtime = desktop ? s_desktop : s_netcore; + if (runtime == nullptr) { + return false; + } + g_pRuntime = runtime; + return true; +} +#endif + +/**********************************************************************\ + * Cleans up the runtime instances +\**********************************************************************/ +void Runtime::CleanupRuntimes() +{ + if (s_netcore != nullptr) + { + delete s_netcore; + s_netcore = nullptr; + } +#ifndef FEATURE_PAL + if (s_desktop != nullptr) + { + delete s_desktop; + s_desktop = nullptr; + } +#endif + g_pRuntime = nullptr; +} + +/**********************************************************************\ + * Destroys the runtime instance +\**********************************************************************/ +Runtime::~Runtime() +{ + if (m_runtimeDirectory != nullptr) + { + free((void*)m_runtimeDirectory); + m_runtimeDirectory = nullptr; + } + if (m_dacFilePath != nullptr) + { + free((void*)m_dacFilePath); + m_dacFilePath = nullptr; + } + if (m_dbiFilePath != nullptr) + { + free((void*)m_dbiFilePath); + m_dbiFilePath = nullptr; + } + if (m_pCorDebugProcess != NULL) + { + m_pCorDebugProcess->Detach(); + m_pCorDebugProcess->Release(); + m_pCorDebugProcess = nullptr; + } + if (m_clrDataProcess != nullptr) + { + m_clrDataProcess->Release(); + m_clrDataProcess = nullptr; + } +} + +/**********************************************************************\ + * Flushes DAC caches +\**********************************************************************/ +void Runtime::Flush() +{ + if (s_netcore != nullptr && s_netcore->m_clrDataProcess != nullptr) + { + s_netcore->m_clrDataProcess->Flush(); + } +#ifndef FEATURE_PAL + if (s_desktop != nullptr && s_desktop->m_clrDataProcess != nullptr) + { + s_desktop->m_clrDataProcess->Flush(); + } +#endif +} + +/**********************************************************************\ + * Returns the runtime directory of the target +\**********************************************************************/ +HRESULT Runtime::GetRuntimeDirectory(std::string& runtimeDirectory) +{ +#ifdef FEATURE_PAL + LPCSTR directory = g_ExtServices->GetCoreClrDirectory(); + if (directory == NULL) + { + ExtErr("Error: Runtime module (%s) not loaded yet\n", GetRuntimeDllName()); + return E_FAIL; + } + if (!GetAbsolutePath(directory, runtimeDirectory)) + { + ExtDbgOut("Error: Runtime directory %s doesn't exist\n", directory); + return E_FAIL; + } +#else + ArrayHolder szModuleName = new char[MAX_LONGPATH + 1]; + HRESULT hr = g_ExtSymbols->GetModuleNames(m_index, 0, szModuleName, MAX_LONGPATH, NULL, NULL, 0, NULL, NULL, 0, NULL); + if (FAILED(hr)) + { + ExtErr("Error: Failed to get runtime module name\n"); + return hr; + } + if (GetFileAttributesA(szModuleName) == INVALID_FILE_ATTRIBUTES) + { + hr = HRESULT_FROM_WIN32(GetLastError()); + ExtDbgOut("Error: Runtime module %s doesn't exist %08x\n", szModuleName, hr); + return hr; + } + runtimeDirectory = szModuleName; + + // Parse off the module name to get just the path + size_t lastSlash = runtimeDirectory.rfind(DIRECTORY_SEPARATOR_CHAR_A); + if (lastSlash == std::string::npos) + { + ExtDbgOut("Error: Runtime module %s has no directory separator\n", szModuleName); + return E_FAIL; + } + runtimeDirectory.assign(runtimeDirectory, 0, lastSlash); +#endif + return S_OK; +} + +/**********************************************************************\ + * Returns the runtime directory of the target +\**********************************************************************/ +LPCSTR Runtime::GetRuntimeDirectory() +{ + if (m_runtimeDirectory == nullptr) + { + std::string runtimeDirectory; + if (SUCCEEDED(GetRuntimeDirectory(runtimeDirectory))) + { + m_runtimeDirectory = _strdup(runtimeDirectory.c_str()); + } + } + return m_runtimeDirectory; +} + +/**********************************************************************\ + * Returns the DAC module path to the rest of SOS. +\**********************************************************************/ +LPCSTR Runtime::GetDacFilePath() +{ + // If the DAC path hasn't been set by the symbol download support, use the one in the runtime directory. + if (m_dacFilePath == nullptr) + { + LPCSTR directory = GetRuntimeDirectory(); + if (directory != nullptr) + { + std::string dacModulePath(directory); + dacModulePath.append(DIRECTORY_SEPARATOR_STR_A); + dacModulePath.append(GetDacDllName()); +#ifdef FEATURE_PAL + // If DAC file exists in the runtime directory + if (access(dacModulePath.c_str(), F_OK) == 0) +#endif + { +#if defined(__linux__) + // We are creating a symlink to the DAC in a temp directory + // where libcoreclrtraceptprovider.so doesn't exist so it + // doesn't get loaded by the DAC causing a LTTng-UST exception. + // + // Issue #https://github.com/dotnet/coreclr/issues/20205 + LPCSTR tmpPath = GetTempDirectory(); + if (tmpPath != nullptr) + { + std::string dacSymLink(tmpPath); + dacSymLink.append(NETCORE_DAC_DLL_NAME_A); + + int error = symlink(dacModulePath.c_str(), dacSymLink.c_str()); + if (error == 0) + { + dacModulePath.assign(dacSymLink); + } + else + { + ExtErr("symlink(%s, %s) FAILED %s\n", dacModulePath.c_str(), dacSymLink.c_str(), strerror(errno)); + } + } +#endif + m_dacFilePath = _strdup(dacModulePath.c_str()); + } + } + + if (m_dacFilePath == nullptr) + { + // Attempt to only load the DAC/DBI modules + LoadRuntimeModules(); + } + } + return m_dacFilePath; +} + +/**********************************************************************\ + * Returns the DBI module path to the rest of SOS +\**********************************************************************/ +LPCSTR Runtime::GetDbiFilePath() +{ + if (m_dbiFilePath == nullptr) + { + LPCSTR directory = GetRuntimeDirectory(); + if (directory != nullptr) + { + std::string dbiModulePath(directory); + dbiModulePath.append(DIRECTORY_SEPARATOR_STR_A); + dbiModulePath.append(NET_DBI_DLL_NAME_A); +#ifdef FEATURE_PAL + // If DBI file exists in the runtime directory + if (access(dbiModulePath.c_str(), F_OK) == 0) +#endif + { + m_dbiFilePath = _strdup(dbiModulePath.c_str()); + } + } + + if (m_dbiFilePath == nullptr) + { + // Attempt to only load the DAC/DBI modules + LoadRuntimeModules(); + } + } + return m_dbiFilePath; +} + +/**********************************************************************\ + * Creates an instance of the DAC clr data process +\**********************************************************************/ +HRESULT Runtime::GetClrDataProcess(IXCLRDataProcess** ppClrDataProcess) +{ + if (m_clrDataProcess == nullptr) + { + *ppClrDataProcess = nullptr; + + LPCSTR dacFilePath = GetDacFilePath(); + if (dacFilePath == nullptr) + { + return CORDBG_E_NO_IMAGE_AVAILABLE; + } + HMODULE hdac = LoadLibraryA(dacFilePath); + if (hdac == NULL) + { + return CORDBG_E_MISSING_DEBUGGER_EXPORTS; + } + PFN_CLRDataCreateInstance pfnCLRDataCreateInstance = (PFN_CLRDataCreateInstance)GetProcAddress(hdac, "CLRDataCreateInstance"); + if (pfnCLRDataCreateInstance == nullptr) + { + FreeLibrary(hdac); + return CORDBG_E_MISSING_DEBUGGER_EXPORTS; + } + ICLRDataTarget *target = new DataTarget(); + HRESULT hr = pfnCLRDataCreateInstance(__uuidof(IXCLRDataProcess), target, (void**)&m_clrDataProcess); + if (FAILED(hr)) + { + m_clrDataProcess = nullptr; + return hr; + } + ULONG32 flags = 0; + m_clrDataProcess->GetOtherNotificationFlags(&flags); + flags |= (CLRDATA_NOTIFY_ON_MODULE_LOAD | CLRDATA_NOTIFY_ON_MODULE_UNLOAD | CLRDATA_NOTIFY_ON_EXCEPTION); + m_clrDataProcess->SetOtherNotificationFlags(flags); + } + *ppClrDataProcess = m_clrDataProcess; + return S_OK; +} + +/**********************************************************************\ + * Loads and initializes the public ICorDebug interfaces. This should be + * called at least once per debugger stop state to ensure that the + * interface is available and that it doesn't hold stale data. Calling + * it more than once isn't an error, but does have perf overhead from + * needlessly flushing memory caches. +\**********************************************************************/ +HRESULT Runtime::GetCorDebugInterface(ICorDebugProcess** ppCorDebugProcess) +{ + HMODULE hModule = NULL; + HRESULT hr; + ToRelease pClrDebugging; + + // We may already have an ICorDebug instance we can use + if (m_pCorDebugProcess != nullptr) + { + // ICorDebugProcess4 is currently considered a private experimental interface on ICorDebug, it might go away so + // we need to be sure to handle its absence gracefully + ToRelease pProcess4 = NULL; + if (SUCCEEDED(m_pCorDebugProcess->QueryInterface(__uuidof(ICorDebugProcess4), (void**)&pProcess4))) + { + // FLUSH_ALL is more expensive than PROCESS_RUNNING, but this allows us to be safe even if things + // like IDNA are in use where we might be looking at non-sequential snapshots of process state + if (SUCCEEDED(pProcess4->ProcessStateChanged(FLUSH_ALL))) + { + // We already have an ICorDebug instance loaded and flushed, nothing more to do + *ppCorDebugProcess = m_pCorDebugProcess; + return S_OK; + } + } + + // This is a very heavy handed way of reseting + m_pCorDebugProcess->Detach(); + m_pCorDebugProcess->Release(); + m_pCorDebugProcess = nullptr; + } + + // SOS now has a statically linked version of the loader code that is normally found in mscoree/mscoreei.dll + // Its not much code and takes a big step towards 0 install dependencies + // Need to pick the appropriate SKU of CLR to detect +#if defined(FEATURE_CORESYSTEM) + GUID skuId = CLR_ID_ONECORE_CLR; +#else + GUID skuId = CLR_ID_CORECLR; +#endif +#ifndef FEATURE_PAL + if (IsDesktop()) + { + skuId = CLR_ID_V4_DESKTOP; + } +#endif + CLRDebuggingImpl* pDebuggingImpl = new CLRDebuggingImpl(skuId); + hr = pDebuggingImpl->QueryInterface(IID_ICLRDebugging, (LPVOID *)&pClrDebugging); + if (FAILED(hr)) + { + delete pDebuggingImpl; + return hr; + } + + ToRelease pCorDebugDataTarget = new CorDebugDataTarget; + pCorDebugDataTarget->AddRef(); + + ToRelease pCorDebugLibraryProvider = new CorDebugLibraryProvider(this); + pCorDebugLibraryProvider->AddRef(); + + CLR_DEBUGGING_VERSION clrDebuggingVersionRequested = {0}; + clrDebuggingVersionRequested.wMajor = 4; + + CLR_DEBUGGING_VERSION clrDebuggingVersionActual = {0}; + + CLR_DEBUGGING_PROCESS_FLAGS clrDebuggingFlags = (CLR_DEBUGGING_PROCESS_FLAGS)0; + + ToRelease pUnkProcess; + hr = pClrDebugging->OpenVirtualProcess( + GetModuleAddress(), + pCorDebugDataTarget, + pCorDebugLibraryProvider, + &clrDebuggingVersionRequested, + IID_ICorDebugProcess, + &pUnkProcess, + &clrDebuggingVersionActual, + &clrDebuggingFlags); + + if (FAILED(hr)) { + return hr; + } + hr = pUnkProcess->QueryInterface(IID_ICorDebugProcess, (PVOID*)&m_pCorDebugProcess); + if (FAILED(hr)) { + return hr; + } + *ppCorDebugProcess = m_pCorDebugProcess; + return hr; +} + +/**********************************************************************\ + * Displays the runtime internal status +\**********************************************************************/ +void Runtime::DisplayStatus() +{ + ExtOut("%s runtime at %p (%08x)\n", m_isDesktop ? "Desktop" : ".NET Core", m_address, m_size); + if (m_runtimeDirectory != nullptr) { + ExtOut("Runtime directory: %s\n", m_runtimeDirectory); + } + if (m_dacFilePath != nullptr) { + ExtOut("DAC file path: %s\n", m_dacFilePath); + } + if (m_dbiFilePath != nullptr) { + ExtOut("DBI file path: %s\n", m_dbiFilePath); + } +} + +extern bool g_symbolStoreInitialized; +extern HRESULT InitializeSymbolStore(); +extern int ReadMemoryForSymbols(ULONG64 address, uint8_t* buffer, int cb); + +/**********************************************************************\ + * Attempt to download the runtime modules (runtime, DAC and DBI) +\**********************************************************************/ +void Runtime::LoadRuntimeModules() +{ + ArrayHolder moduleFilePath = new char[MAX_LONGPATH + 1]; + HRESULT hr = g_ExtSymbols->GetModuleNames(m_index, 0, moduleFilePath, MAX_LONGPATH, NULL, NULL, 0, NULL, NULL, 0, NULL); + if (SUCCEEDED(hr)) + { + hr = InitializeSymbolStore(); + if (SUCCEEDED(hr) && g_symbolStoreInitialized) + { + _ASSERTE(g_SOSNetCoreCallbacks.LoadNativeSymbolsDelegate != nullptr); + g_SOSNetCoreCallbacks.LoadNativeSymbolsDelegate(SymbolFileCallback, this, moduleFilePath, m_address, (int)m_size, ReadMemoryForSymbols); + } + } +} + +/**********************************************************************\ + * Called by LoadRuntimeModules to set the DAC and DBI file paths +\**********************************************************************/ +void Runtime::SymbolFileCallback(const char* moduleFileName, const char* symbolFilePath) +{ + if (strcmp(moduleFileName, GetRuntimeDllName()) == 0) { + return; + } + if (strcmp(moduleFileName, GetDacDllName()) == 0) { + SetDacFilePath(symbolFilePath); + return; + } + if (strcmp(moduleFileName, NET_DBI_DLL_NAME_A) == 0) { + SetDbiFilePath(symbolFilePath); + return; + } +} + +#ifndef FEATURE_PAL + +/**********************************************************************\ + * Internal function to load and check the version of the module +\**********************************************************************/ +HMODULE LoadLibraryAndCheck( + PCWSTR filename, + DWORD timestamp, + DWORD filesize) +{ + HMODULE hModule = LoadLibraryExW( + filename, + NULL, // __reserved + LOAD_WITH_ALTERED_SEARCH_PATH); // Ensure we check the dir in wszFullPath first + + if (hModule == NULL) + { + ExtOut("Unable to load '%S'. hr = 0x%x.\n", filename, HRESULT_FROM_WIN32(GetLastError())); + return NULL; + } + + // Did we load the right one? + MODULEINFO modInfo = {0}; + if (!GetModuleInformation( + GetCurrentProcess(), + hModule, + &modInfo, + sizeof(modInfo))) + { + ExtOut("Failed to read module information for '%S'. hr = 0x%x.\n", filename, HRESULT_FROM_WIN32(GetLastError())); + FreeLibrary(hModule); + return NULL; + } + + IMAGE_DOS_HEADER * pDOSHeader = (IMAGE_DOS_HEADER *) modInfo.lpBaseOfDll; + IMAGE_NT_HEADERS * pNTHeaders = (IMAGE_NT_HEADERS *) (((LPBYTE) modInfo.lpBaseOfDll) + pDOSHeader->e_lfanew); + DWORD dwSizeActual = pNTHeaders->OptionalHeader.SizeOfImage; + DWORD dwTimeStampActual = pNTHeaders->FileHeader.TimeDateStamp; + if ((dwSizeActual != filesize) || (dwTimeStampActual != timestamp)) + { + ExtOut("Found '%S', but it does not match the CLR being debugged.\n", filename); + ExtOut("Size: Expected '0x%x', Actual '0x%x'\n", filesize, dwSizeActual); + ExtOut("Time stamp: Expected '0x%x', Actual '0x%x'\n", timestamp, dwTimeStampActual); + FreeLibrary(hModule); + return NULL; + } + + return hModule; +} + +#endif // FEATURE_PAL diff --git a/src/SOS/Strike/runtime.h b/src/SOS/Strike/runtime.h new file mode 100644 index 0000000000..eef4893527 --- /dev/null +++ b/src/SOS/Strike/runtime.h @@ -0,0 +1,257 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#ifndef __runtime_h__ +#define __runtime_h__ + +#ifdef FEATURE_PAL + +#define NETCORE_RUNTIME_MODULE_NAME_W MAKEDLLNAME_W(W("coreclr")) +#define NETCORE_RUNTIME_MODULE_NAME_A MAKEDLLNAME_A("coreclr") +#define NETCORE_RUNTIME_DLL_NAME_W NETCORE_RUNTIME_MODULE_NAME_W +#define NETCORE_RUNTIME_DLL_NAME_A NETCORE_RUNTIME_MODULE_NAME_A + +#define NETCORE_DAC_MODULE_NAME_W MAKEDLLNAME_W(W("mscordaccore")) +#define NETCORE_DAC_MODULE_NAME_A MAKEDLLNAME_A("mscordaccore") +#define NETCORE_DAC_DLL_NAME_W NETCORE_DAC_MODULE_NAME_W +#define NETCORE_DAC_DLL_NAME_A NETCORE_DAC_MODULE_NAME_A + +#define NET_DBI_MODULE_NAME_W MAKEDLLNAME_W(W("mscordbi")) +#define NET_DBI_MODULE_NAME_A MAKEDLLNAME_A("mscordbi") +#define NET_DBI_DLL_NAME_W NET_DBI_MODULE_NAME_W +#define NET_DBI_DLL_NAME_A NET_DBI_MODULE_NAME_A + +#else + +#define NETCORE_RUNTIME_MODULE_NAME_W W("coreclr") +#define NETCORE_RUNTIME_MODULE_NAME_A "coreclr" +#define NETCORE_RUNTIME_DLL_NAME_W MAKEDLLNAME_W(NETCORE_RUNTIME_MODULE_NAME_W) +#define NETCORE_RUNTIME_DLL_NAME_A MAKEDLLNAME_A(NETCORE_RUNTIME_MODULE_NAME_A) + +#define NETCORE_DAC_MODULE_NAME_W W("mscordaccore") +#define NETCORE_DAC_MODULE_NAME_A "mscordaccore" +#define NETCORE_DAC_DLL_NAME_W MAKEDLLNAME_W(NETCORE_DAC_MODULE_NAME_W) +#define NETCORE_DAC_DLL_NAME_A MAKEDLLNAME_A(NETCORE_DAC_MODULE_NAME_A) + +#define NET_DBI_MODULE_NAME_W W("mscordbi") +#define NET_DBI_MODULE_NAME_A "mscordbi" +#define NET_DBI_DLL_NAME_W MAKEDLLNAME_W(W("mscordbi")) +#define NET_DBI_DLL_NAME_A MAKEDLLNAME_A("mscordbi") + +#endif // FEATURE_PAL + +#define DESKTOP_RUNTIME_MODULE_NAME_W W("clr") +#define DESKTOP_RUNTIME_MODULE_NAME_A "clr" +#define DESKTOP_RUNTIME_DLL_NAME_W MAKEDLLNAME_W(DESKTOP_RUNTIME_MODULE_NAME_W) +#define DESKTOP_RUNTIME_DLL_NAME_A MAKEDLLNAME_A(DESKTOP_RUNTIME_MODULE_NAME_A) + +#define DESKTOP_DAC_MODULE_NAME_W W("mscordacwks") +#define DESKTOP_DAC_MODULE_NAME_A "mscordacwks" +#define DESKTOP_DAC_DLL_NAME_W MAKEDLLNAME_W(W("mscordacwks")) +#define DESKTOP_DAC_DLL_NAME_A MAKEDLLNAME_A("mscordacwks") + +/**********************************************************************\ + * Runtime interface +\**********************************************************************/ +class IRuntime +{ +public: + // Returns true if desktop CLR; false if .NET Core + virtual bool IsDesktop() const = 0; + + // Returns the runtime module index + virtual ULONG GetModuleIndex() const = 0; + + // Returns the runtime module base address + virtual ULONG64 GetModuleAddress() const = 0; + + // Returns the runtime module size + virtual ULONG64 GetModuleSize() const = 0; + + // Returns the directory of the runtime file + virtual LPCSTR GetRuntimeDirectory() = 0; + + // Returns the DAC module path to the rest of SOS + virtual LPCSTR GetDacFilePath() = 0; + + // Returns the DBI module path to the rest of SOS + virtual LPCSTR GetDbiFilePath() = 0; + + // Returns the DAC data process instance + virtual HRESULT GetClrDataProcess(IXCLRDataProcess** ppClrDataProcess) = 0; + + // Initializes and returns the DBI debugging interface instance + virtual HRESULT GetCorDebugInterface(ICorDebugProcess** ppCorDebugProcess) = 0; + + // Displays the runtime internal status + virtual void DisplayStatus() = 0; +}; + +extern IRuntime* g_pRuntime; + +/**********************************************************************\ + * Local Runtime interface implementation +\**********************************************************************/ +class Runtime : public IRuntime +{ +private: + bool m_isDesktop; + ULONG m_index; + ULONG64 m_address; + ULONG64 m_size; + LPCSTR m_runtimeDirectory; + LPCSTR m_dacFilePath; + LPCSTR m_dbiFilePath; + IXCLRDataProcess* m_clrDataProcess; + ICorDebugProcess* m_pCorDebugProcess; + + static Runtime* s_netcore; +#ifndef FEATURE_PAL + static Runtime* s_desktop; +#endif + static bool s_isDesktop; + static LPCSTR s_dacFilePath; + static LPCSTR s_dbiFilePath; + + Runtime(bool isDesktop, ULONG index, ULONG64 address, ULONG64 size) : + m_isDesktop(isDesktop), + m_index(index), + m_address(address), + m_size(size), + m_runtimeDirectory(nullptr), + m_dacFilePath(nullptr), + m_dbiFilePath(nullptr), + m_clrDataProcess(nullptr), + m_pCorDebugProcess(nullptr) + { + _ASSERTE(index != -1); + _ASSERTE(address != 0); + _ASSERTE(size != 0); + if (isDesktop == s_isDesktop) { + SetDacFilePath(s_dacFilePath); + SetDbiFilePath(s_dbiFilePath); + } + } + + virtual Runtime::~Runtime(); + + static HRESULT CreateInstance(bool isDesktop, Runtime** ppRuntime); + + HRESULT GetRuntimeDirectory(std::string& runtimeDirectory); + + void LoadRuntimeModules(); + + void SymbolFileCallback(const char* moduleFileName, const char* symbolFilePath); + + static void SymbolFileCallback(void* param, const char* moduleFileName, const char* symbolFilePath) + { + ((Runtime*)param)->SymbolFileCallback(moduleFileName, symbolFilePath); + } + + void SetDacFilePath(LPCSTR dacFilePath) + { + if (m_dacFilePath == nullptr && dacFilePath != nullptr) { + m_dacFilePath = _strdup(dacFilePath); + } + } + + void SetDbiFilePath(LPCSTR dbiFilePath) + { + if (m_dbiFilePath == nullptr && dbiFilePath != nullptr) { + m_dbiFilePath = _strdup(dbiFilePath); + } + } + +public: + static HRESULT CreateInstance(); + + static void CleanupRuntimes(); + +#ifndef FEATURE_PAL + static bool SwitchRuntime(bool desktop); +#endif + + static void SetDacDbiPath(bool isDesktop, LPCSTR dacFilePath, LPCSTR dbiFilePath) + { + s_isDesktop = isDesktop; + if (dacFilePath != nullptr) { + s_dacFilePath = _strdup(dacFilePath); + } + if (dbiFilePath != nullptr) { + s_dbiFilePath = _strdup(dbiFilePath); + } + } + + static void Flush(); + + virtual bool IsDesktop() const { return m_isDesktop; } + + virtual ULONG GetModuleIndex() const { return m_index; } + + virtual ULONG64 GetModuleAddress() const { return m_address; } + + virtual ULONG64 GetModuleSize() const { return m_size; } + + LPCSTR GetRuntimeDirectory(); + + LPCSTR GetDacFilePath(); + + LPCSTR GetDbiFilePath(); + + HRESULT GetClrDataProcess(IXCLRDataProcess** ppClrDataProcess); + + HRESULT GetCorDebugInterface(ICorDebugProcess** ppCorDebugProcess); + + void DisplayStatus(); + + // Returns the runtime module DLL name (clr.dll, coreclr.dll, libcoreclr.so, libcoreclr.dylib) + inline const char* GetRuntimeDllName() const + { + return IsDesktop() ? DESKTOP_RUNTIME_DLL_NAME_A : NETCORE_RUNTIME_DLL_NAME_A; + } + + // Returns the DAC module name (mscordacwks.dll, mscordaccore.dll, libmscordaccore.so, libmscordaccore.dylib) + inline const char* GetDacDllName() const + { + return IsDesktop() ? DESKTOP_DAC_DLL_NAME_A : NETCORE_DAC_DLL_NAME_A; + } + + // Returns the DAC module name (mscordacwks, mscordaccore, libmscordaccore.so, libmscordaccore.dylib) + inline const WCHAR* GetDacModuleNameW() const + { + return IsDesktop() ? DESKTOP_DAC_MODULE_NAME_W : NETCORE_DAC_MODULE_NAME_W; + } + + // Returns the DAC module name (mscordacwks.dll, mscordaccore.dll, libmscordaccore.so, libmscordaccore.dylib) + inline const WCHAR* GetDacDllNameW() const + { + return IsDesktop() ? DESKTOP_DAC_DLL_NAME_W : NETCORE_DAC_DLL_NAME_W; + } +}; + +// Returns the runtime module name (clr, coreclr, libcoreclr.so, libcoreclr.dylib). +inline const char* GetRuntimeModuleName() +{ + return g_pRuntime->IsDesktop() ? DESKTOP_RUNTIME_MODULE_NAME_A : NETCORE_RUNTIME_MODULE_NAME_A; +} + +// Returns the runtime module DLL name (clr.dll, coreclr.dll, libcoreclr.so, libcoreclr.dylib) +inline const char* GetRuntimeDllName() +{ + return g_pRuntime->IsDesktop() ? DESKTOP_RUNTIME_DLL_NAME_A : NETCORE_RUNTIME_DLL_NAME_A; +} + +// Returns the DAC module name (mscordacwks, mscordaccore, libmscordaccore.so, libmscordaccore.dylib) +inline const char* GetDacModuleName() +{ + return g_pRuntime->IsDesktop() ? DESKTOP_DAC_MODULE_NAME_A : NETCORE_DAC_MODULE_NAME_A; +} + +// Returns the DAC module name (mscordacwks.dll, mscordaccore.dll, libmscordaccore.so, libmscordaccore.dylib) +inline const char* GetDacDllName() +{ + return g_pRuntime->IsDesktop() ? DESKTOP_DAC_DLL_NAME_A : NETCORE_DAC_DLL_NAME_A; +} + +#endif // __runtime_h__ diff --git a/src/SOS/Strike/sosdocs.txt b/src/SOS/Strike/sosdocs.txt index 655b39094e..fcd4cfad04 100644 --- a/src/SOS/Strike/sosdocs.txt +++ b/src/SOS/Strike/sosdocs.txt @@ -64,7 +64,8 @@ HistInit SetHostRuntime (sethostruntime) HistRoot SetSymbolServer (setsymbolserver) HistObj FAQ HistObjFind SOSFlush -HistClear Help (soshelp) +HistClear SOSStatus (sosstatus) + Help (soshelp) \\ COMMAND: faq. @@ -2609,7 +2610,7 @@ You can use the "dotnet --info" in a command shell to find the path of an instal \\ COMMAND: setsymbolserver. -SetSymbolServer [-ms] [-mi] [-disable] [-log] [-cache ] [-directory ] [] +!SetSymbolServer [-ms] [-mi] [-disable] [-log] [-cache ] [-directory ] [] -ms - Use the public Microsoft symbol server. -mi - Use the internal symweb symbol server. @@ -2625,3 +2626,22 @@ symbol server support is automatically enabled. To disable downloading or clear the current SOS symbol settings allowing new symbol paths to be set: 0:000> !setsymbolserver -disable +\\ + +COMMAND: sosstatus. +!SOSStatus [-desktop] [-netcore] [-reset] + +-desktop - switch to the desktop runtime if loaded. +-netcore - switch to the .NET Core runtime if loaded. +-reset - reset all the cached internal SOS state. + +Display internal SOS status, reset the internal cached state, or change between desktop or +netcore runtimes when both are loaded in the process or dump. + +0:000> !sosstatus +Target platform: 8664 Context size 04d0 +.NET Core runtime at 00007FFEE7230000 (005c2000) +DAC file path: C:\Users\mikem\AppData\Local\Temp\SymbolCache\mscordaccore.dll/5d0707425c2000/mscordaccore.dll +DBI file path: C:\Users\mikem\AppData\Local\Temp\SymbolCache\mscordbi.dll/5d0707425c2000/mscordbi.dll +Cache: C:\Users\mikem\AppData\Local\Temp\SymbolCache +Server: http://msdl.microsoft.com/download/symbols/ \ No newline at end of file diff --git a/src/SOS/Strike/sosdocsunix.txt b/src/SOS/Strike/sosdocsunix.txt index 3aa6df27b7..e2200387d4 100644 --- a/src/SOS/Strike/sosdocsunix.txt +++ b/src/SOS/Strike/sosdocsunix.txt @@ -56,8 +56,9 @@ Examining the GC history Other HistInit (histinit) SetHostRuntime (sethostruntime) HistRoot (histroot) SetSymbolServer (setsymbolserver, loadsymbols) HistObj (histobj) FAQ -HistObjFind (histobjfind) SOSFlush -HistClear (histclear) Help (soshelp) +HistObjFind (histobjfind) SOSFlush (sosflush) +HistClear (histclear) SOSStatus (sosstatus) + Help (soshelp) \\ COMMAND: faq. @@ -1954,3 +1955,11 @@ stack frames). (lldb) loadsymbols (lldb) bt +\\ + +COMMAND: sosstatus. +SOSStatus [-reset] + +-reset - reset all the cached internal SOS state. + +Display internal SOS status or reset the internal cached state. diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index acd6d3d636..27814e649a 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -1405,8 +1405,10 @@ DECLARE_API(DumpMT) if (MethodDescData.Request(g_sos, TO_CDADDR(methodDesc)) == S_OK) { // Is it an fcall? - if ((TO_TADDR(MethodDescData.NativeCodeAddr) >= TO_TADDR(g_moduleInfo[MSCORWKS].baseAddr)) && - ((TO_TADDR(MethodDescData.NativeCodeAddr) < TO_TADDR(g_moduleInfo[MSCORWKS].baseAddr + g_moduleInfo[MSCORWKS].size)))) + ULONG64 baseAddress = g_pRuntime->GetModuleAddress(); + ULONG64 size = g_pRuntime->GetModuleSize(); + if ((TO_TADDR(MethodDescData.NativeCodeAddr) >= TO_TADDR(baseAddress)) && + ((TO_TADDR(MethodDescData.NativeCodeAddr) < TO_TADDR(baseAddress + size)))) { pszJitType = "FCALL"; } @@ -7578,7 +7580,6 @@ class CNotification : public IXCLRDataExceptionNotification5 } return m_count; } - /* * New code was generated or discarded for a method.: @@ -7586,9 +7587,11 @@ class CNotification : public IXCLRDataExceptionNotification5 STDMETHODIMP OnCodeGenerated(IXCLRDataMethodInstance* method) { #ifndef FEATURE_PAL + _ASSERTE(g_pRuntime != nullptr); + // This is only needed for desktop runtime because OnCodeGenerated2 // isn't supported by the desktop DAC. - if (g_isDesktopRuntime) + if (g_pRuntime->IsDesktop()) { // Some method has been generated, make a breakpoint and remove it. ULONG32 len = mdNameLen; @@ -9831,8 +9834,10 @@ DECLARE_API(DumpLog) MINIDUMP_NOT_SUPPORTED(); + _ASSERTE(g_pRuntime != nullptr); + // Not supported on desktop runtime - if (g_isDesktopRuntime) + if (g_pRuntime->IsDesktop()) { ExtErr("DumpLog not supported on desktop runtime\n"); return E_FAIL; @@ -9915,12 +9920,6 @@ DECLARE_API (DumpGCLog) INIT_API_NODAC(); MINIDUMP_NOT_SUPPORTED(); - if (GetEEFlavor() == UNKNOWNEE) - { - ExtOut("CLR not loaded\n"); - return Status; - } - const char* fileName = "GCLog.txt"; while (isspace (*args)) @@ -10021,12 +10020,6 @@ DECLARE_API (DumpGCConfigLog) #ifdef GC_CONFIG_DRIVEN MINIDUMP_NOT_SUPPORTED(); - if (GetEEFlavor() == UNKNOWNEE) - { - ExtOut("CLR not loaded\n"); - return Status; - } - const char* fileName = "GCConfigLog.txt"; while (isspace (*args)) @@ -10317,11 +10310,6 @@ DECLARE_API(EEVersion) { INIT_API(); - EEFLAVOR eef = GetEEFlavor(); - if (eef == UNKNOWNEE) { - ExtOut("CLR not loaded\n"); - return Status; - } static const int fileVersionBufferSize = 1024; ArrayHolder fileVersionBuffer = new char[fileVersionBufferSize]; VS_FIXEDFILEINFO version; @@ -10347,7 +10335,7 @@ DECLARE_API(EEVersion) } else { - BOOL fRet = IsRetailBuild((size_t)g_moduleInfo[eef].baseAddr); + BOOL fRet = IsRetailBuild((size_t)g_pRuntime->GetModuleAddress()); if (fRet) ExtOut(" retail"); else @@ -10407,27 +10395,55 @@ DECLARE_API(EEVersion) \**********************************************************************/ DECLARE_API(SOSStatus) { - INIT_API_NOEE(); + INIT_API_EXT(); + BOOL bDesktop = FALSE; + BOOL bNetCore = FALSE; + BOOL bReset = FALSE; + CMDOption option[] = + { // name, vptr, type, hasValue +#ifndef FEATURE_PAL + {"-desktop", &bDesktop, COBOOL, FALSE}, + {"-netcore", &bNetCore, COBOOL, FALSE}, +#endif + {"-reset", &bReset, COBOOL, FALSE}, + }; + if (!GetCMDOption(args, option, _countof(option), NULL, 0, NULL)) + { + return Status; + } +#ifndef FEATURE_PAL + if (bNetCore || bDesktop) + { + PCSTR name = bDesktop ? "desktop CLR" : ".NET Core";; + if (!Runtime::SwitchRuntime(bDesktop)) + { + ExtErr("The %s runtime is not loaded\n", name); + return E_FAIL; + } + ExtOut("Switched to %s runtime successfully\n", name); + return S_OK; + } +#endif + if (bReset) + { + Runtime::CleanupRuntimes(); + CleanupTempDirectory(); + ExtOut("SOS state reset\n"); + return S_OK; + } if (g_targetMachine != nullptr) { ExtOut("Target platform: %04x Context size %04x\n", g_targetMachine->GetPlatform(), g_targetMachine->GetContextSize()); } + if (g_pRuntime != nullptr) { + g_pRuntime->DisplayStatus(); + } if (g_tmpPath != nullptr) { ExtOut("Temp path: %s\n", g_tmpPath); } - if (g_dacFilePath != nullptr) { - ExtOut("DAC file path: %s\n", g_dacFilePath); - } - if (g_dbiFilePath != nullptr) { - ExtOut("DBI file path: %s\n", g_dbiFilePath); - } if (g_hostRuntimeDirectory != nullptr) { ExtOut("Host runtime path: %s\n", g_hostRuntimeDirectory); } - std::string runtimeDirectory; - if (SUCCEEDED(GetRuntimeDirectory(runtimeDirectory))) { - ExtOut("Runtime path: %s\n", runtimeDirectory.c_str()); - } DisplaySymbolStore(); return Status; @@ -11683,10 +11699,8 @@ DECLARE_API(GCHandles) #ifndef FEATURE_PAL DECLARE_API(TraceToCode) { - INIT_API_NOEE(); - - static ULONG64 g_clrBaseAddr = 0; - + INIT_API_NODAC(); + _ASSERTE(g_pRuntime != nullptr); while(true) { @@ -11703,13 +11717,10 @@ DECLARE_API(TraceToCode) ULONG64 base = 0; CLRDATA_ADDRESS cdaStart = TO_CDADDR(Offset); DacpMethodDescData MethodDescData; - if(g_ExtSymbols->GetModuleByOffset(Offset, 0, NULL, &base) == S_OK) + if (g_ExtSymbols->GetModuleByOffset(Offset, 0, NULL, &base) == S_OK) { - if(g_clrBaseAddr == 0) - { - GetRuntimeModuleInfo(NULL, &g_clrBaseAddr); - } - if(g_clrBaseAddr == base) + ULONG64 clrBaseAddr = g_pRuntime->GetModuleAddress(); + if(clrBaseAddr == base) { ExtOut("Compiled code in CLR\n"); codeType = 4; @@ -11774,14 +11785,14 @@ DECLARE_API(TraceToCode) // This is an experimental and undocumented API that sets a debugger pseudo-register based // on the type of code at the given IP. It can be used in scripts to keep stepping until certain -// kinds of code have been reached. Presumbably its slower than !TraceToCode but at least it +// kinds of code have been reached. Presumably its slower than !TraceToCode but at least it // cancels much better #ifndef FEATURE_PAL DECLARE_API(GetCodeTypeFlags) { INIT_API(); + _ASSERTE(g_pRuntime != nullptr); - char buffer[100+mdNameLen]; size_t ip; StringHolder PReg; @@ -11822,7 +11833,7 @@ DECLARE_API(GetCodeTypeFlags) CLRDATA_ADDRESS cdaStart = TO_CDADDR(ip); DWORD codeType = 0; CLRDATA_ADDRESS addr; - if(g_sos->GetMethodDescPtrFromIP(cdaStart, &addr) == S_OK) + if (g_sos->GetMethodDescPtrFromIP(cdaStart, &addr) == S_OK) { WCHAR wszNameBuffer[1024]; // should be large enough @@ -11841,8 +11852,8 @@ DECLARE_API(GetCodeTypeFlags) } else if(g_ExtSymbols->GetModuleByOffset (ip, 0, NULL, &base) == S_OK) { - ULONG64 clrBaseAddr = 0; - if(SUCCEEDED(GetRuntimeModuleInfo(NULL, &clrBaseAddr)) && base==clrBaseAddr) + ULONG64 clrBaseAddr = g_pRuntime->GetModuleAddress(); + if (base == clrBaseAddr) { ExtOut("Compiled code in CLR"); codeType = 4; @@ -13175,7 +13186,8 @@ class ClrStackImplWithICorDebug { HRESULT Status; - IfFailRet(InitCorDebugInterface()); + ICorDebugProcess* pCorDebugProcess; + IfFailRet(g_pRuntime->GetCorDebugInterface(&pCorDebugProcess)); ExtOut("\n\n\nDumping managed stack and managed variables using ICorDebug.\n"); ExtOut("=============================================================================\n"); @@ -13186,7 +13198,7 @@ class ClrStackImplWithICorDebug ULONG ulThreadID = 0; g_ExtSystem->GetCurrentThreadSystemId(&ulThreadID); - IfFailRet(g_pCorDebugProcess->GetThread(ulThreadID, &pThread)); + IfFailRet(pCorDebugProcess->GetThread(ulThreadID, &pThread)); IfFailRet(pThread->QueryInterface(IID_ICorDebugThread3, (LPVOID *) &pThread3)); IfFailRet(pThread3->CreateStackWalk(&pStackWalk)); @@ -13346,10 +13358,6 @@ class ClrStackImplWithICorDebug } ExtOut("=============================================================================\n"); -#ifdef FEATURE_PAL - // Temporary until we get a process exit notification plumbed from lldb - UninitCorDebugInterface(); -#endif return S_OK; } }; @@ -14265,17 +14273,17 @@ DECLARE_API( VMMap ) #endif // FEATURE_PAL -DECLARE_API( SOSFlush ) +DECLARE_API(SOSFlush) { - INIT_API(); + INIT_API_EXT(); - g_clrData->Flush(); + Runtime::Flush(); #ifdef FEATURE_PAL FlushMetadataRegions(); #endif return Status; -} // DECLARE_API( SOSFlush ) +} #ifndef FEATURE_PAL @@ -15465,7 +15473,7 @@ DECLARE_API(VerifyStackTrace) // This is an internal-only Apollo extension to de-optimize the code DECLARE_API(SuppressJitOptimization) { - INIT_API_NOEE(); + INIT_API_NODAC(); MINIDUMP_NOT_SUPPORTED(); StringHolder onOff; @@ -15503,12 +15511,12 @@ DECLARE_API(SuppressJitOptimization) else if(nArg == 1 && (_stricmp(onOff.data, "Off") == 0)) { // if CLR is already loaded, try to change the flags now - if(CheckEEDll() == S_OK) + if (CheckEEDll() == S_OK) { SetNGENCompilerFlags(CORDEBUG_JIT_DEFAULT); } - if(g_fAllowJitOptimization) + if (g_fAllowJitOptimization) ExtOut("JIT optimization is already permitted\n"); else { @@ -15531,13 +15539,14 @@ HRESULT SetNGENCompilerFlags(DWORD flags) HRESULT hr; ToRelease proc2; - if(FAILED(hr = InitCorDebugInterface())) + ICorDebugProcess* pCorDebugProcess; + if (FAILED(hr = g_pRuntime->GetCorDebugInterface(&pCorDebugProcess))) { ExtOut("SOS: warning, prejitted code optimizations could not be changed. Failed to load ICorDebug HR = 0x%x\n", hr); } - else if(FAILED(g_pCorDebugProcess->QueryInterface(__uuidof(ICorDebugProcess2), (void**) &proc2))) + else if (FAILED(pCorDebugProcess->QueryInterface(__uuidof(ICorDebugProcess2), (void**) &proc2))) { - if(flags != CORDEBUG_JIT_DEFAULT) + if (flags != CORDEBUG_JIT_DEFAULT) { ExtOut("SOS: warning, prejitted code optimizations could not be changed. This CLR version doesn't support the functionality\n"); } @@ -15546,7 +15555,7 @@ HRESULT SetNGENCompilerFlags(DWORD flags) hr = S_OK; } } - else if(FAILED(hr = proc2->SetDesiredNGENCompilerFlags(flags))) + else if (FAILED(hr = proc2->SetDesiredNGENCompilerFlags(flags))) { // Versions of CLR that don't have SetDesiredNGENCompilerFlags DAC-ized will return E_FAIL. // This was first supported in the clr_triton branch around 4/1/12, Apollo release @@ -15562,9 +15571,9 @@ HRESULT SetNGENCompilerFlags(DWORD flags) hr = S_OK; } } - else if(hr == CORDBG_E_NGEN_NOT_SUPPORTED) + else if (hr == CORDBG_E_NGEN_NOT_SUPPORTED) { - if(flags != CORDEBUG_JIT_DEFAULT) + if (flags != CORDEBUG_JIT_DEFAULT) { ExtOut("SOS: warning, prejitted code optimizations could not be changed. This CLR version doesn't support NGEN\n"); } @@ -15573,14 +15582,14 @@ HRESULT SetNGENCompilerFlags(DWORD flags) hr = S_OK; } } - else if(hr == CORDBG_E_MUST_BE_IN_CREATE_PROCESS) + else if (hr == CORDBG_E_MUST_BE_IN_CREATE_PROCESS) { DWORD currentFlags = 0; - if(FAILED(hr = proc2->GetDesiredNGENCompilerFlags(¤tFlags))) + if (FAILED(hr = proc2->GetDesiredNGENCompilerFlags(¤tFlags))) { ExtOut("SOS: warning, prejitted code optimizations could not be changed. GetDesiredNGENCompilerFlags failed hr=0x%x\n", hr); } - else if(currentFlags != flags) + else if (currentFlags != flags) { ExtOut("SOS: warning, prejitted code optimizations could not be changed at this time. This setting is fixed once CLR starts\n"); } @@ -15927,8 +15936,8 @@ DECLARE_API(SetSymbolServer) {"-timeout", &timeoutInMinutes, COSIZE_T, TRUE}, {"-ms", &msdl, COBOOL, FALSE}, {"-log", &logging, COBOOL, FALSE}, - {"-loadsymbols", &loadNative, COBOOL, FALSE}, #ifdef FEATURE_PAL + {"-loadsymbols", &loadNative, COBOOL, FALSE}, {"-sympath", &windowsSymbolPath.data, COSTRING, TRUE}, #else {"-mi", &symweb, COBOOL, FALSE}, @@ -15997,10 +16006,12 @@ DECLARE_API(SetSymbolServer) ExtOut("Symbol download logging enabled\n"); } } +#ifdef FEATURE_PAL else if (loadNative) { Status = LoadNativeSymbols(); } +#endif else { DisplaySymbolStore(); diff --git a/src/SOS/Strike/util.cpp b/src/SOS/Strike/util.cpp index 9b9332ab46..4bde52925d 100644 --- a/src/SOS/Strike/util.cpp +++ b/src/SOS/Strike/util.cpp @@ -26,6 +26,7 @@ #include #include "debugshim.h" #include "datatarget.h" +#include "runtime.h" #include "gcinfo.h" #ifndef STRESS_LOG @@ -63,8 +64,6 @@ const char * const CorElementTypeNamespace[ELEMENT_TYPE_MAX]= IXCLRDataProcess *g_clrData = NULL; ISOSDacInterface *g_sos = NULL; -IXCLRDataProcess *g_clrDataProcess = NULL; -ICorDebugProcess *g_pCorDebugProcess = NULL; #ifndef IfFailRet #define IfFailRet(EXPR) do { Status = (EXPR); if(FAILED(Status)) { return (Status); } } while (0) @@ -97,6 +96,7 @@ void __cdecl operator delete[](void* pObj) throw() \**********************************************************************/ DWORD_PTR GetValueFromExpression(___in __in_z const char *const instr) { + _ASSERTE(g_pRuntime != nullptr); std::string symbol; symbol.append(GetRuntimeModuleName()); symbol.append("!"); @@ -156,86 +156,14 @@ DWORD_PTR GetValueFromExpression(___in __in_z const char *const instr) #endif // FEATURE_PAL -ModuleInfo g_moduleInfo[MSCOREND] = {{0, 0, DEBUG_ANY_ID, FALSE}, {0, 0, DEBUG_ANY_ID, FALSE}, {0, 0, DEBUG_ANY_ID, FALSE}}; - void ReportOOM() { ExtOut("SOS Error: Out of memory\n"); } -// This is set as a side-effect of CheckEEDll()/GetRuntimeModuleInfo(). -bool g_isDesktopRuntime = false; - -HRESULT GetRuntimeModuleInfo(PULONG moduleIndex, PULONG64 moduleBase) -{ - g_isDesktopRuntime = false; - HRESULT hr = g_ExtSymbols->GetModuleByModuleName(NETCORE_RUNTIME_MODULE_NAME_A, 0, moduleIndex, moduleBase); -#ifndef FEATURE_PAL - if (FAILED(hr)) { - hr = g_ExtSymbols->GetModuleByModuleName(DESKTOP_RUNTIME_MODULE_NAME_A, 0, moduleIndex, moduleBase); - g_isDesktopRuntime = SUCCEEDED(hr); - } -#endif - return hr; -} - HRESULT CheckEEDll() { - HRESULT hr = S_OK; - - // Do we have runtime module info? - if (g_moduleInfo[MSCORWKS].baseAddr == 0) - { - hr = GetRuntimeModuleInfo(&g_moduleInfo[MSCORWKS].index, &g_moduleInfo[MSCORWKS].baseAddr); -#ifdef FEATURE_PAL - if (SUCCEEDED(hr)) - { - if (g_ExtServices2 != nullptr) - { - g_ExtServices2->GetModuleInfo(g_moduleInfo[MSCORWKS].index, nullptr, &g_moduleInfo[MSCORWKS].size); - } - } -#else - if (g_moduleInfo[MSCORWKS].baseAddr != 0 && g_moduleInfo[MSCORWKS].hasPdb == FALSE) - { - DEBUG_MODULE_PARAMETERS params; - if (SUCCEEDED(g_ExtSymbols->GetModuleParameters(1, &g_moduleInfo[MSCORWKS].baseAddr, 0, ¶ms))) - { - if (params.SymbolType == SymDeferred) - { - std::string reloadCommand; - reloadCommand.append("/f "); - reloadCommand.append(GetRuntimeDllName()); - g_ExtSymbols->Reload(reloadCommand.c_str()); - g_ExtSymbols->GetModuleParameters(1, &g_moduleInfo[MSCORWKS].baseAddr, 0, ¶ms); - } - if (params.SymbolType == SymPdb || params.SymbolType == SymDia) - { - g_moduleInfo[MSCORWKS].hasPdb = TRUE; - } - g_moduleInfo[MSCORWKS].size = params.Size; - } - } - if (g_moduleInfo[MSCORWKS].baseAddr != 0 && g_moduleInfo[MSCORWKS].hasPdb == FALSE) - { - ExtOut("PDB symbol for %s not loaded\n", GetRuntimeDllName()); - } -#endif // FEATURE_PAL - } - return hr; -} - -EEFLAVOR GetEEFlavor() -{ -#ifdef FEATURE_PAL - return MSCORWKS; -#else // FEATUER_PAL - EEFLAVOR flavor = UNKNOWNEE; - if (SUCCEEDED(GetRuntimeModuleInfo(NULL, NULL))) { - flavor = MSCORWKS; - } - return flavor; -#endif // FEATURE_PAL else + return Runtime::CreateInstance(); } BOOL IsDumpFile() @@ -3280,6 +3208,7 @@ CLRDATA_ADDRESS GetCurrentManagedThread () void ReloadSymbolWithLineInfo() { + _ASSERTE(g_pRuntime != nullptr); #ifndef FEATURE_PAL static BOOL bLoadSymbol = FALSE; if (!bLoadSymbol) @@ -3293,14 +3222,10 @@ void ReloadSymbolWithLineInfo() { g_ExtSymbols->Reload("/f" MSCOREE_SHIM_A); } - EEFLAVOR flavor = GetEEFlavor(); - if (flavor == MSCORWKS) - { - std::string reloadCommand; - reloadCommand.append("/f "); - reloadCommand.append(GetRuntimeDllName()); - g_ExtSymbols->Reload(reloadCommand.c_str()); - } + std::string reloadCommand; + reloadCommand.append("/f "); + reloadCommand.append(GetRuntimeDllName()); + g_ExtSymbols->Reload(reloadCommand.c_str()); } // reload mscoree.pdb and clrjit.pdb to get line info @@ -3365,9 +3290,7 @@ BOOL GetEEVersion(VS_FIXEDFILEINFO* pFileInfo, char* fileVersionBuffer, int file { _ASSERTE(pFileInfo); _ASSERTE(g_ExtSymbols2 != nullptr); - - ModuleInfo moduleInfo = g_moduleInfo[GetEEFlavor()]; - _ASSERTE(moduleInfo.index != DEBUG_ANY_ID); + _ASSERTE(g_pRuntime != nullptr); #ifdef FEATURE_PAL // Load the symbols for runtime. On Linux we are looking for the "sccsid" @@ -3375,7 +3298,7 @@ BOOL GetEEVersion(VS_FIXEDFILEINFO* pFileInfo, char* fileVersionBuffer, int file LoadNativeSymbols(true); #endif - HRESULT hr = g_ExtSymbols2->GetModuleVersionInformation(moduleInfo.index, 0, "\\", pFileInfo, sizeof(VS_FIXEDFILEINFO), NULL); + HRESULT hr = g_ExtSymbols2->GetModuleVersionInformation(g_pRuntime->GetModuleIndex(), 0, "\\", pFileInfo, sizeof(VS_FIXEDFILEINFO), NULL); // Attempt to get the the FileVersion string that contains version and the "built by" and commit id info if (fileVersionBuffer != nullptr) @@ -3385,7 +3308,7 @@ BOOL GetEEVersion(VS_FIXEDFILEINFO* pFileInfo, char* fileVersionBuffer, int file } // We can assume the English/CP_UNICODE lang/code page for the runtime modules g_ExtSymbols2->GetModuleVersionInformation( - moduleInfo.index, 0, "\\StringFileInfo\\040904B0\\FileVersion", fileVersionBuffer, fileVersionBufferSizeInBytes, NULL); + g_pRuntime->GetModuleIndex(), 0, "\\StringFileInfo\\040904B0\\FileVersion", fileVersionBuffer, fileVersionBufferSizeInBytes, NULL); } return SUCCEEDED(hr); @@ -3959,47 +3882,6 @@ void ResetGlobals(void) Output::ResetIndent(); } -static HRESULT GetClrDataProcess() -{ - HRESULT hr = S_OK; - - if (g_clrDataProcess == NULL) - { - LPCSTR dacFilePath = GetDacFilePath(); - if (dacFilePath == nullptr) - { - return E_FAIL; - } - HMODULE hdac = LoadLibraryA(dacFilePath); - if (hdac == NULL) - { - return CORDBG_E_MISSING_DEBUGGER_EXPORTS; - } - PFN_CLRDataCreateInstance pfnCLRDataCreateInstance = (PFN_CLRDataCreateInstance)GetProcAddress(hdac, "CLRDataCreateInstance"); - if (pfnCLRDataCreateInstance == NULL) - { - FreeLibrary(hdac); - return CORDBG_E_MISSING_DEBUGGER_EXPORTS; - } - ICLRDataTarget *target = new DataTarget(); - hr = pfnCLRDataCreateInstance(__uuidof(IXCLRDataProcess), target, (void**)&g_clrDataProcess); - if (FAILED(hr)) - { - g_clrDataProcess = NULL; - return hr; - } - ULONG32 flags = 0; - g_clrDataProcess->GetOtherNotificationFlags(&flags); - flags |= (CLRDATA_NOTIFY_ON_MODULE_LOAD | CLRDATA_NOTIFY_ON_MODULE_UNLOAD | CLRDATA_NOTIFY_ON_EXCEPTION); - g_clrDataProcess->SetOtherNotificationFlags(flags); - } - g_clrData = g_clrDataProcess; - g_clrData->AddRef(); - g_clrData->Flush(); - - return S_OK; -} - //--------------------------------------------------------------------------------------- // // Loads private DAC interface, and points g_clrData to it. @@ -4009,8 +3891,9 @@ static HRESULT GetClrDataProcess() // HRESULT LoadClrDebugDll(void) { - HRESULT hr = GetClrDataProcess(); - if (FAILED(hr)) + _ASSERTE(g_pRuntime != nullptr); + HRESULT hr = g_pRuntime->GetClrDataProcess(&g_clrData); + if (FAILED(hr)) { #ifdef FEATURE_PAL return hr; @@ -4030,621 +3913,20 @@ HRESULT LoadClrDebugDll(void) g_clrData->Flush(); #endif } - hr = g_clrData->QueryInterface(__uuidof(ISOSDacInterface), (void**)&g_sos); - if (FAILED(hr)) - { - g_sos = NULL; - return hr; - } - return S_OK; -} - -#ifndef FEATURE_PAL - -HMODULE -LoadLibraryAndCheck( - PCWSTR filename, - DWORD timestamp, - DWORD filesize) -{ - HMODULE hModule = LoadLibraryExW( - filename, - NULL, // __reserved - LOAD_WITH_ALTERED_SEARCH_PATH); // Ensure we check the dir in wszFullPath first - - if (hModule == NULL) - { - ExtOut("Unable to load '%S'. hr = 0x%x.\n", filename, HRESULT_FROM_WIN32(GetLastError())); - return NULL; - } - - // Did we load the right one? - MODULEINFO modInfo = {0}; - if (!GetModuleInformation( - GetCurrentProcess(), - hModule, - &modInfo, - sizeof(modInfo))) - { - ExtOut("Failed to read module information for '%S'. hr = 0x%x.\n", filename, HRESULT_FROM_WIN32(GetLastError())); - FreeLibrary(hModule); - return NULL; - } - - IMAGE_DOS_HEADER * pDOSHeader = (IMAGE_DOS_HEADER *) modInfo.lpBaseOfDll; - IMAGE_NT_HEADERS * pNTHeaders = (IMAGE_NT_HEADERS *) (((LPBYTE) modInfo.lpBaseOfDll) + pDOSHeader->e_lfanew); - DWORD dwSizeActual = pNTHeaders->OptionalHeader.SizeOfImage; - DWORD dwTimeStampActual = pNTHeaders->FileHeader.TimeDateStamp; - if ((dwSizeActual != filesize) || (dwTimeStampActual != timestamp)) - { - ExtOut("Found '%S', but it does not match the CLR being debugged.\n", filename); - ExtOut("Size: Expected '0x%x', Actual '0x%x'\n", filesize, dwSizeActual); - ExtOut("Time stamp: Expected '0x%x', Actual '0x%x'\n", timestamp, dwTimeStampActual); - FreeLibrary(hModule); - return NULL; - } - - return hModule; -} - -#endif // FEATURE_PAL - -//--------------------------------------------------------------------------------------- -// Provides a way for the public CLR debugging interface to find the appropriate mscordbi.dll, DAC, etc. -class SOSLibraryProvider : public ICLRDebuggingLibraryProvider, ICLRDebuggingLibraryProvider2 -{ -public: - SOSLibraryProvider() : m_ref(0) - { - } - - virtual ~SOSLibraryProvider() {} - - virtual HRESULT STDMETHODCALLTYPE QueryInterface( - REFIID InterfaceId, - PVOID* pInterface) - { - if (InterfaceId == IID_IUnknown) - { - *pInterface = static_cast(static_cast(this)); - } -#ifndef FEATURE_PAL - else if (InterfaceId == IID_ICLRDebuggingLibraryProvider) - { - *pInterface = static_cast(this); - } -#endif - else if (InterfaceId == IID_ICLRDebuggingLibraryProvider2) - { - *pInterface = static_cast(this); - } - else - { - *pInterface = NULL; - return E_NOINTERFACE; - } - - AddRef(); - return S_OK; - } - - virtual ULONG STDMETHODCALLTYPE AddRef() - { - return InterlockedIncrement(&m_ref); - } - - virtual ULONG STDMETHODCALLTYPE Release() - { - LONG ref = InterlockedDecrement(&m_ref); - if (ref == 0) - { - delete this; - } - return ref; - } - - HRESULT ProvideLibraryInternal( - const WCHAR* pwszFileName, - DWORD dwTimestamp, - DWORD dwSizeOfImage, - HMODULE* phModule, - LPWSTR* ppResolvedModulePath) - { - const char* filePath = nullptr; - - if (_wcsncmp(pwszFileName, GetDacDllNameW(), _wcslen(GetDacDllNameW())) == 0) - { - filePath = GetDacFilePath(); - } - else if (_wcsncmp(pwszFileName, NET_DBI_DLL_NAME_W, _wcslen(NET_DBI_DLL_NAME_W)) == 0) - { - filePath = GetDbiFilePath(); - } - - ArrayHolder modulePath = new WCHAR[MAX_LONGPATH + 1]; - if (filePath != nullptr) - { - int length = MultiByteToWideChar(CP_ACP, 0, filePath, -1, modulePath, MAX_LONGPATH); - if (0 >= length) - { - ExtErr("MultiByteToWideChar(filePath) failed. Last error = 0x%x\n", GetLastError()); - return HRESULT_FROM_WIN32(GetLastError()); - } - } - else - { - HRESULT hr = GetRuntimeDirectory(modulePath, MAX_LONGPATH); - if (FAILED(hr)) - { - return hr; - } - wcscat_s(modulePath, MAX_LONGPATH, pwszFileName); - } - - ExtOut("Loaded %S\n", modulePath.GetPtr()); - -#ifndef FEATURE_PAL - if (phModule != NULL) - { - *phModule = LoadLibraryAndCheck(modulePath.GetPtr(), dwTimestamp, dwSizeOfImage); - } -#endif - if (ppResolvedModulePath != NULL) - { - *ppResolvedModulePath = modulePath.Detach(); - } - return S_OK; - } - - // Called by the shim to locate and load dac and dbi - // Parameters: - // pwszFileName - the name of the file to load - // dwTimestamp - the expected timestamp of the file - // dwSizeOfImage - the expected SizeOfImage (a PE header data value) - // phModule - a handle to loaded module - // - // Return Value - // S_OK if the file was loaded, or any error if not - virtual HRESULT STDMETHODCALLTYPE ProvideLibrary( - const WCHAR * pwszFileName, - DWORD dwTimestamp, - DWORD dwSizeOfImage, - HMODULE* phModule) - { - if ((phModule == NULL) || (pwszFileName == NULL)) - { - return E_INVALIDARG; - } - return ProvideLibraryInternal(pwszFileName, dwTimestamp, dwSizeOfImage, phModule, NULL); - } - - virtual HRESULT STDMETHODCALLTYPE ProvideLibrary2( - const WCHAR* pwszFileName, - DWORD dwTimestamp, - DWORD dwSizeOfImage, - LPWSTR* ppResolvedModulePath) - { - if ((pwszFileName == NULL) || (ppResolvedModulePath == NULL)) - { - return E_INVALIDARG; - } - return ProvideLibraryInternal(pwszFileName, dwTimestamp, dwSizeOfImage, NULL, ppResolvedModulePath); - } - -protected: - LONG m_ref; -}; - -//--------------------------------------------------------------------------------------- -// Data target for the debugged process. Provided to OpenVirtualProcess in order to -// get an ICorDebugProcess back -// -class SOSDataTarget : public ICorDebugMutableDataTarget, public ICorDebugMetaDataLocator, public ICorDebugDataTarget4 -{ -public: - SOSDataTarget() : m_ref(0) - { - } - - virtual ~SOSDataTarget() {} - - virtual HRESULT STDMETHODCALLTYPE QueryInterface( - REFIID InterfaceId, - PVOID* pInterface) - { - if (InterfaceId == IID_IUnknown) - { - *pInterface = static_cast(static_cast(this)); - } - else if (InterfaceId == IID_ICorDebugDataTarget) - { - *pInterface = static_cast(this); - } - else if (InterfaceId == IID_ICorDebugMutableDataTarget) - { - *pInterface = static_cast(this); - } - else if (InterfaceId == IID_ICorDebugMetaDataLocator) - { - *pInterface = static_cast(this); - } - else if (InterfaceId == IID_ICorDebugDataTarget4) - { - *pInterface = static_cast(this); - } - else - { - *pInterface = NULL; - return E_NOINTERFACE; - } - - AddRef(); - return S_OK; - } - - virtual ULONG STDMETHODCALLTYPE AddRef() - { - return InterlockedIncrement(&m_ref); - } - - virtual ULONG STDMETHODCALLTYPE Release() - { - LONG ref = InterlockedDecrement(&m_ref); - if (ref == 0) - { - delete this; - } - return ref; - } - - // - // ICorDebugDataTarget. - // - - virtual HRESULT STDMETHODCALLTYPE GetPlatform(CorDebugPlatform * pPlatform) - { - ULONG platformKind = g_targetMachine->GetPlatform(); -#ifdef FEATURE_PAL - if(platformKind == IMAGE_FILE_MACHINE_I386) - *pPlatform = CORDB_PLATFORM_POSIX_X86; - else if(platformKind == IMAGE_FILE_MACHINE_AMD64) - *pPlatform = CORDB_PLATFORM_POSIX_AMD64; - else if(platformKind == IMAGE_FILE_MACHINE_ARMNT) - *pPlatform = CORDB_PLATFORM_POSIX_ARM; - else - return E_FAIL; -#else - if(platformKind == IMAGE_FILE_MACHINE_I386) - *pPlatform = CORDB_PLATFORM_WINDOWS_X86; - else if(platformKind == IMAGE_FILE_MACHINE_AMD64) - *pPlatform = CORDB_PLATFORM_WINDOWS_AMD64; - else if(platformKind == IMAGE_FILE_MACHINE_ARMNT) - *pPlatform = CORDB_PLATFORM_WINDOWS_ARM; - else if(platformKind == IMAGE_FILE_MACHINE_ARM64) - *pPlatform = CORDB_PLATFORM_WINDOWS_ARM64; - else - return E_FAIL; -#endif - - return S_OK; - } - - virtual HRESULT STDMETHODCALLTYPE ReadVirtual( - CORDB_ADDRESS address, - BYTE * pBuffer, - ULONG32 request, - ULONG32 * pcbRead) - { - if (g_ExtData == NULL) - { - return E_UNEXPECTED; - } -#ifdef FEATURE_PAL - if (g_sos != nullptr) - { - // LLDB synthesizes memory (returns 0's) for missing pages (in this case the missing metadata pages) - // in core dumps. This functions creates a list of the metadata regions and caches the metadata if - // available from the local or downloaded assembly. If the read would be in the metadata of a loaded - // assembly, the metadata from the this cache will be returned. - HRESULT hr = GetMetadataMemory(address, request, pBuffer); - if (SUCCEEDED(hr)) { - if (pcbRead != nullptr) { - *pcbRead = request; - } - return hr; - } - } -#endif - HRESULT hr = g_ExtData->ReadVirtual(address, pBuffer, request, (PULONG) pcbRead); - if (FAILED(hr)) - { - ExtDbgOut("SOSDataTarget::ReadVirtual FAILED %08x address %p size %08x\n", hr, address, request); - } - return hr; - } - - virtual HRESULT STDMETHODCALLTYPE GetThreadContext( - DWORD dwThreadOSID, - ULONG32 contextFlags, - ULONG32 contextSize, - BYTE * context) - { -#ifdef FEATURE_PAL - if (g_ExtServices == NULL) - { - return E_UNEXPECTED; - } - return g_ExtServices->GetThreadContextById(dwThreadOSID, contextFlags, contextSize, context); -#else - ULONG ulThreadIDOrig; - ULONG ulThreadIDRequested; - HRESULT hr; - - hr = g_ExtSystem->GetCurrentThreadId(&ulThreadIDOrig); - if (FAILED(hr)) - { - return hr; - } - - hr = g_ExtSystem->GetThreadIdBySystemId(dwThreadOSID, &ulThreadIDRequested); - if (FAILED(hr)) - { - return hr; - } - - hr = g_ExtSystem->SetCurrentThreadId(ulThreadIDRequested); - if (FAILED(hr)) - { - return hr; - } - - // Prepare context structure - ZeroMemory(context, contextSize); - ((CONTEXT*) context)->ContextFlags = contextFlags; - - // Ok, do it! - hr = g_ExtAdvanced->GetThreadContext((LPVOID) context, contextSize); - - // This is cleanup; failure here doesn't mean GetThreadContext should fail - // (that's determined by hr). - g_ExtSystem->SetCurrentThreadId(ulThreadIDOrig); - - return hr; -#endif // FEATURE_PAL - } - - // - // ICorDebugMutableDataTarget. - // - - virtual HRESULT STDMETHODCALLTYPE WriteVirtual(CORDB_ADDRESS address, - const BYTE * pBuffer, - ULONG32 bytesRequested) - { - if (g_ExtData == NULL) - { - return E_UNEXPECTED; - } - return g_ExtData->WriteVirtual(address, (PVOID)pBuffer, bytesRequested, NULL); - } - - virtual HRESULT STDMETHODCALLTYPE SetThreadContext(DWORD dwThreadID, - ULONG32 contextSize, - const BYTE * pContext) - { - return E_NOTIMPL; - } - - virtual HRESULT STDMETHODCALLTYPE ContinueStatusChanged(DWORD dwThreadId, - CORDB_CONTINUE_STATUS continueStatus) - { - return E_NOTIMPL; - } - - // - // ICorDebugMetaDataLocator. - // - - virtual HRESULT STDMETHODCALLTYPE GetMetaData( - /* [in] */ LPCWSTR wszImagePath, - /* [in] */ DWORD dwImageTimeStamp, - /* [in] */ DWORD dwImageSize, - /* [in] */ ULONG32 cchPathBuffer, - /* [annotation][out] */ - _Out_ ULONG32 *pcchPathBuffer, - /* [annotation][length_is][size_is][out] */ - _Out_writes_to_(cchPathBuffer, *pcchPathBuffer) WCHAR wszPathBuffer[]) - { - return E_NOTIMPL; - } - - // - // ICorDebugDataTarget4 - // - virtual HRESULT STDMETHODCALLTYPE VirtualUnwind(DWORD threadId, ULONG32 contextSize, PBYTE context) - { -#ifdef FEATURE_PAL - if (g_ExtServices == NULL) - { - return E_UNEXPECTED; - } - return g_ExtServices->VirtualUnwind(threadId, contextSize, context); -#else - return E_NOTIMPL; -#endif - } - -protected: - LONG m_ref; -}; - -HRESULT InitCorDebugInterfaceFromModule(ULONG64 ulBase, ICLRDebugging * pClrDebugging) -{ - HRESULT hr; - - ToRelease pSOSDataTarget = new SOSDataTarget; - pSOSDataTarget->AddRef(); - - ToRelease pSOSLibraryProvider = new SOSLibraryProvider; - pSOSLibraryProvider->AddRef(); - - CLR_DEBUGGING_VERSION clrDebuggingVersionRequested = {0}; - clrDebuggingVersionRequested.wMajor = 4; - - CLR_DEBUGGING_VERSION clrDebuggingVersionActual = {0}; - - CLR_DEBUGGING_PROCESS_FLAGS clrDebuggingFlags = (CLR_DEBUGGING_PROCESS_FLAGS)0; - - ToRelease pUnkProcess; - - hr = pClrDebugging->OpenVirtualProcess( - ulBase, - pSOSDataTarget, - pSOSLibraryProvider, - &clrDebuggingVersionRequested, - IID_ICorDebugProcess, - &pUnkProcess, - &clrDebuggingVersionActual, - &clrDebuggingFlags); - if (FAILED(hr)) + else { - return hr; + g_clrData->AddRef(); + g_clrData->Flush(); } - - ICorDebugProcess * pCorDebugProcess = NULL; - hr = pUnkProcess->QueryInterface(IID_ICorDebugProcess, (PVOID*) &pCorDebugProcess); + hr = g_clrData->QueryInterface(__uuidof(ISOSDacInterface), (void**)&g_sos); if (FAILED(hr)) { + g_sos = NULL; return hr; } - - // Transfer memory ownership of refcount to global - g_pCorDebugProcess = pCorDebugProcess; return S_OK; } -//--------------------------------------------------------------------------------------- -// -// Unloads public ICorDebug interfaces, and clears g_pCorDebugProcess -// This is only needed once after CLR unloads, not after every InitCorDebugInterface call -// -VOID UninitCorDebugInterface() -{ - if(g_pCorDebugProcess != NULL) - { - g_pCorDebugProcess->Detach(); - g_pCorDebugProcess->Release(); - g_pCorDebugProcess = NULL; - } -} - -//--------------------------------------------------------------------------------------- -// -// Loads public ICorDebug interfaces, and points g_pCorDebugProcess to them -// This should be called at least once per windbg stop state to ensure that -// the interface is available and that it doesn't hold stale data. Calling it -// more than once isn't an error, but does have perf overhead from needlessly -// flushing memory caches. -// -// Return Value: -// HRESULT indicating success or failure -// - -HRESULT InitCorDebugInterface() -{ - HMODULE hModule = NULL; - HRESULT hr; - ToRelease pClrDebugging; - - // we may already have an ICorDebug instance we can use - if(g_pCorDebugProcess != NULL) - { - // ICorDebugProcess4 is currently considered a private experimental interface on ICorDebug, it might go away so - // we need to be sure to handle its absence gracefully - ToRelease pProcess4 = NULL; - if(SUCCEEDED(g_pCorDebugProcess->QueryInterface(__uuidof(ICorDebugProcess4), (void**)&pProcess4))) - { - // FLUSH_ALL is more expensive than PROCESS_RUNNING, but this allows us to be safe even if things - // like IDNA are in use where we might be looking at non-sequential snapshots of process state - if(SUCCEEDED(pProcess4->ProcessStateChanged(FLUSH_ALL))) - { - // we already have an ICorDebug instance loaded and flushed, nothing more to do - return S_OK; - } - } - - // this is a very heavy handed way of reseting - UninitCorDebugInterface(); - } - - // SOS now has a statically linked version of the loader code that is normally found in mscoree/mscoreei.dll - // Its not much code and takes a big step towards 0 install dependencies - // Need to pick the appropriate SKU of CLR to detect -#if defined(FEATURE_CORESYSTEM) - GUID skuId = CLR_ID_ONECORE_CLR; -#else - GUID skuId = CLR_ID_CORECLR; -#endif -#ifndef FEATURE_PAL - if (g_isDesktopRuntime) - { - skuId = CLR_ID_V4_DESKTOP; - } -#endif - CLRDebuggingImpl* pDebuggingImpl = new CLRDebuggingImpl(skuId); - hr = pDebuggingImpl->QueryInterface(IID_ICLRDebugging, (LPVOID *)&pClrDebugging); - if (FAILED(hr)) - { - delete pDebuggingImpl; - return hr; - } - -#ifndef FEATURE_PAL - ULONG cLoadedModules; - ULONG cUnloadedModules; - hr = g_ExtSymbols->GetNumberModules(&cLoadedModules, &cUnloadedModules); - if (FAILED(hr)) - { - return hr; - } - - ULONG64 ulBase; - for (ULONG i = 0; i < cLoadedModules; i++) - { - hr = g_ExtSymbols->GetModuleByIndex(i, &ulBase); - if (FAILED(hr)) - { - return hr; - } - - // Dunno if this is a CLR module or not (or even if it's the particular one the - // user cares about during inproc SxS scenarios). For now, just try to use it - // to grab an ICorDebugProcess. If it works, great. Else, continue the loop - // until we find the first one that works. - hr = InitCorDebugInterfaceFromModule(ulBase, pClrDebugging); - if (SUCCEEDED(hr)) - { - return hr; - } - - // On failure, just iterate to the next module and try again... - } - - // Still here? Didn't find the right module. - // TODO: Anything useful to return or log here? - return E_FAIL; -#else - ULONG64 ulBase; - hr = GetRuntimeModuleInfo(NULL, &ulBase); - if (SUCCEEDED(hr)) - { - hr = InitCorDebugInterfaceFromModule(ulBase, pClrDebugging); - } - return hr; -#endif // FEATURE_PAL -} - - typedef enum { GC_HEAP_INVALID = 0, diff --git a/src/SOS/Strike/util.h b/src/SOS/Strike/util.h index febfdda089..92666b8a15 100644 --- a/src/SOS/Strike/util.h +++ b/src/SOS/Strike/util.h @@ -202,9 +202,6 @@ extern ISOSDacInterface *g_sos; #include "dacprivate.h" -interface ICorDebugProcess; -extern ICorDebugProcess * g_pCorDebugProcess; - // This class is templated for easy modification. We may need to update the CachedString // or related classes to use WCHAR instead of char in the future. template @@ -1539,99 +1536,6 @@ class ToRelease T* m_ptr; }; -// SOS's runtime, dac and dbi module name defines. *MODULE* is just the -// module name on Windows, *DLL* has the .dll extension. On Linux/MacOS, -// *MODULE* and *DLL* are the same. - -#ifdef FEATURE_PAL - -#define NETCORE_RUNTIME_MODULE_NAME_W MAKEDLLNAME_W(W("coreclr")) -#define NETCORE_RUNTIME_MODULE_NAME_A MAKEDLLNAME_A("coreclr") -#define NETCORE_RUNTIME_DLL_NAME_W NETCORE_RUNTIME_MODULE_NAME_W -#define NETCORE_RUNTIME_DLL_NAME_A NETCORE_RUNTIME_MODULE_NAME_A - -#define NETCORE_DAC_MODULE_NAME_W MAKEDLLNAME_W(W("mscordaccore")) -#define NETCORE_DAC_MODULE_NAME_A MAKEDLLNAME_A("mscordaccore") -#define NETCORE_DAC_DLL_NAME_W NETCORE_DAC_MODULE_NAME_W -#define NETCORE_DAC_DLL_NAME_A NETCORE_DAC_MODULE_NAME_A - -#define NET_DBI_MODULE_NAME_W MAKEDLLNAME_W(W("mscordbi")) -#define NET_DBI_MODULE_NAME_A MAKEDLLNAME_A("mscordbi") -#define NET_DBI_DLL_NAME_W NET_DBI_MODULE_NAME_W -#define NET_DBI_DLL_NAME_A NET_DBI_MODULE_NAME_A - -#else - -#define NETCORE_RUNTIME_MODULE_NAME_W W("coreclr") -#define NETCORE_RUNTIME_MODULE_NAME_A "coreclr" -#define NETCORE_RUNTIME_DLL_NAME_W MAKEDLLNAME_W(NETCORE_RUNTIME_MODULE_NAME_W) -#define NETCORE_RUNTIME_DLL_NAME_A MAKEDLLNAME_A(NETCORE_RUNTIME_MODULE_NAME_A) - -#define NETCORE_DAC_MODULE_NAME_W W("mscordaccore") -#define NETCORE_DAC_MODULE_NAME_A "mscordaccore" -#define NETCORE_DAC_DLL_NAME_W MAKEDLLNAME_W(NETCORE_DAC_MODULE_NAME_W) -#define NETCORE_DAC_DLL_NAME_A MAKEDLLNAME_A(NETCORE_DAC_MODULE_NAME_A) - -#define NET_DBI_MODULE_NAME_W W("mscordbi") -#define NET_DBI_MODULE_NAME_A "mscordbi" -#define NET_DBI_DLL_NAME_W MAKEDLLNAME_W(W("mscordbi")) -#define NET_DBI_DLL_NAME_A MAKEDLLNAME_A("mscordbi") - -#endif // FEATURE_PAL - -#define DESKTOP_RUNTIME_MODULE_NAME_W W("clr") -#define DESKTOP_RUNTIME_MODULE_NAME_A "clr" -#define DESKTOP_RUNTIME_DLL_NAME_W MAKEDLLNAME_W(DESKTOP_RUNTIME_MODULE_NAME_W) -#define DESKTOP_RUNTIME_DLL_NAME_A MAKEDLLNAME_A(DESKTOP_RUNTIME_MODULE_NAME_A) - -#define DESKTOP_DAC_MODULE_NAME_W W("mscordacwks") -#define DESKTOP_DAC_MODULE_NAME_A "mscordacwks" -#define DESKTOP_DAC_DLL_NAME_W MAKEDLLNAME_W(W("mscordacwks")) -#define DESKTOP_DAC_DLL_NAME_A MAKEDLLNAME_A("mscordacwks") - -// This is set as a side-effect of CheckEEDll()/GetRuntimeModuleInfo(). -extern bool g_isDesktopRuntime; - -inline const char* GetRuntimeModuleName() -{ - return g_isDesktopRuntime ? DESKTOP_RUNTIME_MODULE_NAME_A : NETCORE_RUNTIME_MODULE_NAME_A; -} - -inline const char* GetRuntimeDllName() -{ - return g_isDesktopRuntime ? DESKTOP_RUNTIME_DLL_NAME_A : NETCORE_RUNTIME_DLL_NAME_A; -} - -inline const char* GetDacModuleName() -{ - return g_isDesktopRuntime ? DESKTOP_DAC_MODULE_NAME_A : NETCORE_DAC_MODULE_NAME_A; -} - -inline const char* GetDacDllName() -{ - return g_isDesktopRuntime ? DESKTOP_DAC_DLL_NAME_A : NETCORE_DAC_DLL_NAME_A; -} - -inline const WCHAR* GetDacModuleNameW() -{ - return g_isDesktopRuntime ? DESKTOP_DAC_MODULE_NAME_W : NETCORE_DAC_MODULE_NAME_W; -} - -inline const WCHAR* GetDacDllNameW() -{ - return g_isDesktopRuntime ? DESKTOP_DAC_DLL_NAME_W : NETCORE_DAC_DLL_NAME_W; -} - -struct ModuleInfo -{ - ULONG64 baseAddr; - ULONG64 size; - ULONG index; - BOOL hasPdb; -}; - -extern ModuleInfo g_moduleInfo[]; - BOOL InitializeHeapData(); BOOL IsServerBuild (); UINT GetMaxGeneration(); @@ -1645,10 +1549,6 @@ void DecodeIL(IMetaDataImport *pImport, BYTE *buffer, ULONG bufSize); void DecodeDynamicIL(BYTE *data, ULONG Size, DacpObjectData& tokenArray); ULONG DisplayILOperation(const UINT indentCount, BYTE* pBuffer, ULONG position, std::function& func); -HRESULT GetRuntimeModuleInfo(PULONG moduleIndex, PULONG64 moduleBase); -EEFLAVOR GetEEFlavor (); -HRESULT InitCorDebugInterface(); -VOID UninitCorDebugInterface(); BOOL GetEEVersion(VS_FIXEDFILEINFO* pFileInfo, char* fileVersionBuffer, int fileVersionBufferSizeInBytes); bool IsRuntimeVersion(DWORD major); bool IsRuntimeVersion(VS_FIXEDFILEINFO& fileInfo, DWORD major); diff --git a/src/Tools/dotnet-dump/Analyzer.cs b/src/Tools/dotnet-dump/Analyzer.cs index 77c33c3414..b48a758102 100644 --- a/src/Tools/dotnet-dump/Analyzer.cs +++ b/src/Tools/dotnet-dump/Analyzer.cs @@ -26,6 +26,7 @@ public class Analyzer private readonly ServiceProvider _serviceProvider; private readonly ConsoleProvider _consoleProvider; private readonly CommandProcessor _commandProcessor; + private bool _isDesktop; private string _dacFilePath; /// @@ -142,7 +143,7 @@ private void AddServices(DataTarget target) _serviceProvider.AddServiceFactory(typeof(SOSHost), () => { var sosHost = new SOSHost(_serviceProvider); - sosHost.InitializeSOSHost(SymbolReader.TempDirectory, _dacFilePath, dbiFilePath: null); + sosHost.InitializeSOSHost(SymbolReader.TempDirectory, _isDesktop, _dacFilePath, dbiFilePath: null); return sosHost; }); } @@ -152,11 +153,33 @@ private void AddServices(DataTarget target) /// private ClrRuntime CreateRuntime(DataTarget target) { - ClrRuntime runtime; - if (target.ClrVersions.Count != 1) { - throw new InvalidOperationException("More or less than 1 CLR version is present"); + ClrInfo clrInfo = null; + + // First check if there is a .NET Core runtime loaded + foreach (ClrInfo clr in target.ClrVersions) + { + if (clr.Flavor == ClrFlavor.Core) + { + clrInfo = clr; + break; + } } - ClrInfo clrInfo = target.ClrVersions[0]; + // If no .NET Core runtime, then check for desktop runtime + if (clrInfo == null) + { + foreach (ClrInfo clr in target.ClrVersions) + { + if (clr.Flavor == ClrFlavor.Desktop) + { + clrInfo = clr; + break; + } + } + } + if (clrInfo == null) { + throw new InvalidOperationException("No CLR runtime is present"); + } + ClrRuntime runtime; string dacFilePath = GetDacFile(clrInfo); try { @@ -219,6 +242,7 @@ private string GetDacFile(ClrInfo clrInfo) { throw new FileNotFoundException("Could not find matching DAC for this runtime: {0}", clrInfo.ModuleInfo.FileName); } + _isDesktop = clrInfo.Flavor == ClrFlavor.Desktop; } return _dacFilePath; } From 1f0c9a7198a6b8a9f99d316f524a60c0914b5ae6 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Fri, 3 Jan 2020 19:32:34 -0800 Subject: [PATCH 053/243] Add dual .NET Core/desktop CLR runtime test Added an desktop host native DLL that the modified WebApp3 debuggee optionally pinvokes to start the desktop CLR. An modified SymbolTestDll is the managed assembly that this desktop host loads and runs. Fixed bug in GetClrModuleImages. --- src/SOS/CMakeLists.txt | 1 + .../Windows/Debugger.Tests.Config.txt | 16 ++- .../Debuggees/DesktopClrHost/CMakeLists.txt | 35 ++++++ .../DesktopClrHost/DesktopClrHost.cpp | 73 +++++++++++ .../SymbolTestApp/SymbolTestApp.cs | 2 +- .../SymbolTestDll/SymbolTestDll.csproj | 3 +- .../SymbolTestApp/SymbolTestDll/TestClass.cs | 30 +++-- .../Debuggees/WebApp3/Program.cs | 19 +++ .../WebApp3/Properties/launchSettings.json | 12 +- src/SOS/SOS.UnitTests/SOS.cs | 19 +++ src/SOS/SOS.UnitTests/SOSRunner.cs | 14 ++- .../SOS.UnitTests/Scripts/DualRuntimes.script | 106 ++++++++++++++++ src/inc/MSCOREE.IDL | 3 + src/pal/prebuilt/inc/mscoree.h | 18 ++- src/pal/prebuilt/inc/mscorsvc.h | 115 ++---------------- 15 files changed, 330 insertions(+), 136 deletions(-) create mode 100644 src/SOS/SOS.UnitTests/Debuggees/DesktopClrHost/CMakeLists.txt create mode 100644 src/SOS/SOS.UnitTests/Debuggees/DesktopClrHost/DesktopClrHost.cpp create mode 100644 src/SOS/SOS.UnitTests/Scripts/DualRuntimes.script diff --git a/src/SOS/CMakeLists.txt b/src/SOS/CMakeLists.txt index 4d567398e6..07cf24bd60 100644 --- a/src/SOS/CMakeLists.txt +++ b/src/SOS/CMakeLists.txt @@ -11,6 +11,7 @@ if(WIN32) add_compile_options(/Zl) # omit default library name in .OBJ add_subdirectory(runcommand) + add_subdirectory(SOS.UnitTests/Debuggees/DesktopClrHost) endif(WIN32) add_definitions(-D_SECURE_SCL=0) diff --git a/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt b/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt index a6221d512b..ef06736e0c 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt +++ b/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt @@ -22,6 +22,7 @@ $(RootBinDir)\tmp\$(TargetConfiguration)\dumps $(RootBinDir)\bin\SOS.UnitTests\$(TargetConfiguration)\netcoreapp2.0\publish\runtimes\win-$(TargetArchitecture)\native\cdb.exe $(InstallDir)\runcommand.dll + net462 $(RepoRootDir)\src\SOS\SOS.UnitTests\Debuggees sdk.prebuilt @@ -104,10 +105,19 @@ $(AspNetCoreVersion21) - + https://github.com/dotnet/arcade - f40849c5bbdfd1f1b99801f5a40343f8d4a192c9 + 111d78c79ac38f596688af152779d7a39e4bf973 - + https://github.com/dotnet/arcade - f40849c5bbdfd1f1b99801f5a40343f8d4a192c9 + 111d78c79ac38f596688af152779d7a39e4bf973 https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 3bb721addf..c329a3f034 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -38,7 +38,7 @@ 4.5.3 2.4.1 2.0.3 - 5.0.0-beta.19629.1 + 5.0.0-beta.20055.1 10.0.18362 diff --git a/eng/common/templates/steps/publish-logs.yml b/eng/common/templates/steps/publish-logs.yml deleted file mode 100644 index f91751fe78..0000000000 --- a/eng/common/templates/steps/publish-logs.yml +++ /dev/null @@ -1,23 +0,0 @@ -parameters: - StageLabel: '' - JobLabel: '' - -steps: -- task: Powershell@2 - displayName: Prepare Binlogs to Upload - inputs: - targetType: inline - script: | - New-Item -ItemType Directory $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/ - Move-Item -Path $(Build.SourcesDirectory)/artifacts/log/Debug/* $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/ - continueOnError: true - condition: always() - -- task: PublishBuildArtifacts@1 - displayName: Publish Logs - inputs: - PathtoPublish: '$(Build.SourcesDirectory)/PostBuildLogs' - PublishLocation: Container - ArtifactName: PostBuildLogs - continueOnError: true - condition: always() diff --git a/global.json b/global.json index 7509420c87..82f48ac2d3 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "dotnet": "3.0.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.19629.1" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20055.1" } } From 900436ce5ad9bcf0f796b85dbd637ef2b0d10c3f Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Mon, 6 Jan 2020 16:32:38 -0800 Subject: [PATCH 055/243] Update FAQ.md --- documentation/FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/FAQ.md b/documentation/FAQ.md index fb2fab82c6..74239d0a46 100644 --- a/documentation/FAQ.md +++ b/documentation/FAQ.md @@ -7,6 +7,6 @@ Frequently Asked Questions * If dump analysis (`dotnet-dump analyze`) on Microsoft .NET Core SDK Linux docker images fails with an`Unhandled exception: System.DllNotFoundException: Unable to load shared library 'libdl.so' or one of its dependencies` exception. Try installing the "libc6-dev" package. -* During dump collection (`dotnet-dump collect`) a failure ending in a message like `Permission denied /tmp/dotnet-diagnostic-19668-22628141-socket error` hints you don't have access to use such a socket. Verify the target process is owned by the user trying to create the dump, or trigger dump creation command with `sudo` +* During dump collection (`dotnet-dump collect`) a failure ending in a message like `Permission denied /tmp/dotnet-diagnostic-19668-22628141-socket error` hints you don't have access to use such a socket. Verify the target process is owned by the user trying to create the dump, or trigger dump creation command with `sudo`. If you use `sudo` to collect the dump, make sure the dump file output path is accessible by the target process/user (via the --output option). The default dump path is the in the current directory and may not be the same user as the target process. * If dump collection (`dotnet-dump collect`) fails with `Core dump generation FAILED 0x80004005` look for error message output on the target process's console (not the console executing the dotnet-dump collect). This error may be caused by writing the core dump to a protected, inaccessible or non-existent location. To get more information about the core dump generation add the `--diag` option the dotnet-dump collect command and look for the diagnostic logging on the target process's console. From b28e529b9c6d5e88822d6b107338b978cfc6101f Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 8 Jan 2020 16:41:11 +0000 Subject: [PATCH 056/243] [master] Update dependencies from dotnet/runtime (#725) * Update dependencies from https://github.com/dotnet/runtime build 20191230.4 - Microsoft.NETCore.App - 5.0.0-alpha.1.19630.4 * Update dependencies from https://github.com/dotnet/runtime build 20191231.3 - Microsoft.NETCore.App - 5.0.0-alpha.1.19631.3 * Update dependencies from https://github.com/dotnet/runtime build 20200101.1 - Microsoft.NETCore.App - 5.0.0-alpha.1.20051.1 * Update dependencies from https://github.com/dotnet/runtime build 20200102.3 - Microsoft.NETCore.App - 5.0.0-alpha.1.20052.3 * Update dependencies from https://github.com/dotnet/runtime build 20200103.4 - Microsoft.NETCore.App - 5.0.0-alpha.1.20053.4 * Update dependencies from https://github.com/dotnet/runtime build 20200104.2 - Microsoft.NETCore.App - 5.0.0-alpha.1.20054.2 * Update dependencies from https://github.com/dotnet/runtime build 20200105.4 - Microsoft.NETCore.App - 5.0.0-alpha.1.20055.4 * Update dependencies from https://github.com/dotnet/runtime build 20200106.3 - Microsoft.NETCore.App - 5.0.0-alpha.1.20056.3 * Update dependencies from https://github.com/dotnet/runtime build 20200107.6 - Microsoft.NETCore.App - 5.0.0-alpha.1.20057.6 Co-authored-by: Mike McLaughlin --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index cd38b00e8c..00948aaf84 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 111d78c79ac38f596688af152779d7a39e4bf973 - + https://github.com/dotnet/runtime - 2ecef0eed6838ffb8053df4354630a26e6a95a11 + c07be36e3ce00b06e99d02669fd658a813cdce11 https://github.com/aspnet/AspNetCore diff --git a/eng/Versions.props b/eng/Versions.props index c329a3f034..e6ad8d0591 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -15,7 +15,7 @@ $(MicrosoftNETCoreApp30Version) 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.19562.8 + 5.0.0-alpha.1.20057.6 5.0.0-alpha.1.19626.3 From f9e87b9b4cdbd0527a561e2b286f6dc7f7ca1d47 Mon Sep 17 00:00:00 2001 From: Dongkyun Son Date: Thu, 9 Jan 2020 04:43:14 +0900 Subject: [PATCH 057/243] Handle glibc sys/sysctl.h deprecation (#27048) (#681) glibc has deprecated sys/sysctl.h: In file included from /coreclr/src/pal/src/misc/sysinfo.cpp:32: /usr/include/sys/sysctl.h:21:2: error: "The header is deprecated and will be removed." [-Werror,-W#warnings] #warning "The header is deprecated and will be removed." ^ 1 error generated. Fix that by preferring sysconf and only including sys/sysctl.h if HAVE_SYSCONF is not true. This mirrors the order of the implementation code in this file (sysinfo.cpp) which checks for HAVE_SYSCONF before HAVE_SYSCTL. Fixes #27008 Co-authored-by: Omair Majid --- src/pal/src/misc/sysinfo.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/pal/src/misc/sysinfo.cpp b/src/pal/src/misc/sysinfo.cpp index dd23c9cea8..45b6b3bdb8 100644 --- a/src/pal/src/misc/sysinfo.cpp +++ b/src/pal/src/misc/sysinfo.cpp @@ -26,9 +26,12 @@ Revision History: #include #include #include -#if HAVE_SYSCTL + +#if HAVE_SYSCONF +// already included above +#elif HAVE_SYSCTL #include -#elif !HAVE_SYSCONF +#else #error Either sysctl or sysconf is required for GetSystemInfo. #endif From 8211ef2dd004b714c524d5a6fbe15ee20ddfd748 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 8 Jan 2020 11:45:29 -0800 Subject: [PATCH 058/243] [master] Update dependencies from aspnet/AspNetCore (#726) * Update dependencies from https://github.com/aspnet/AspNetCore build 20191230.2 - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.19630.2 * Update dependencies from https://github.com/aspnet/AspNetCore build 20200102.2 - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.20052.2 * Update dependencies from https://github.com/aspnet/AspNetCore build 20200104.2 - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.20054.2 * Update dependencies from https://github.com/aspnet/AspNetCore build 20200106.1 - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.20056.1 * Update dependencies from https://github.com/aspnet/AspNetCore build 20200106.6 - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.20056.6 Co-authored-by: Mike McLaughlin --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 00948aaf84..a543194ea0 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime c07be36e3ce00b06e99d02669fd658a813cdce11 - + https://github.com/aspnet/AspNetCore - af9f99299cd4a059cf30483d4f7f551ff38c5a28 + c17ce436b8703470231e7979cead042f5682c3f5 diff --git a/eng/Versions.props b/eng/Versions.props index e6ad8d0591..6f13b66efc 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) 5.0.0-alpha.1.20057.6 - 5.0.0-alpha.1.19626.3 + 5.0.0-alpha.1.20056.6 From c045fdc9eb65ccaf931058c230cf4dbf2ef15a9e Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Wed, 8 Jan 2020 12:57:02 -0800 Subject: [PATCH 059/243] Update FAQ.md --- documentation/FAQ.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/documentation/FAQ.md b/documentation/FAQ.md index 74239d0a46..c71b7af6c8 100644 --- a/documentation/FAQ.md +++ b/documentation/FAQ.md @@ -10,3 +10,14 @@ Frequently Asked Questions * During dump collection (`dotnet-dump collect`) a failure ending in a message like `Permission denied /tmp/dotnet-diagnostic-19668-22628141-socket error` hints you don't have access to use such a socket. Verify the target process is owned by the user trying to create the dump, or trigger dump creation command with `sudo`. If you use `sudo` to collect the dump, make sure the dump file output path is accessible by the target process/user (via the --output option). The default dump path is the in the current directory and may not be the same user as the target process. * If dump collection (`dotnet-dump collect`) fails with `Core dump generation FAILED 0x80004005` look for error message output on the target process's console (not the console executing the dotnet-dump collect). This error may be caused by writing the core dump to a protected, inaccessible or non-existent location. To get more information about the core dump generation add the `--diag` option the dotnet-dump collect command and look for the diagnostic logging on the target process's console. + +* If you receive the following error message executing a SOS command under `lldb` or `dotnet-dump analyze`, SOS cannot find the DAC module (`libmscordaccore.so` or `libmscordaccore.dylib`) in the same directory as the runtime (libcoreclr.so or libcoreclr.dylib) module. + ``` + (lldb) clrstack + Failed to load data access module, 0x80131c64 + Can not load or initialize libmscordaccore.so. The target runtime may not be initialized. + ClrStack failed + ``` + First try enabling the symbol downloading with `setsymbolserver -ms`. This is already enabled for `dotnet-dump analyze` and if SOS for lldb was installed with `dotnet-sos install`. + + If that doesn't work, try using the `setclrpath ` command with a directory that contains the matching version of the DAC module. This is useful for private runtimes or debug builds that haven't been published to our symbol servers. From f9359a501bf42fce3e49a4cb0e6cd6f4802101fe Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 9 Jan 2020 13:56:29 +0000 Subject: [PATCH 060/243] Update dependencies from https://github.com/dotnet/runtime build 20200108.9 (#735) - Microsoft.NETCore.App - 5.0.0-alpha.1.20058.9 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a543194ea0..6053aa2a26 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 111d78c79ac38f596688af152779d7a39e4bf973 - + https://github.com/dotnet/runtime - c07be36e3ce00b06e99d02669fd658a813cdce11 + 8019c079ce8174845107e13eb4ddf3582bb10cd0 https://github.com/aspnet/AspNetCore diff --git a/eng/Versions.props b/eng/Versions.props index 6f13b66efc..9a9312a0ba 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -15,7 +15,7 @@ $(MicrosoftNETCoreApp30Version) 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20057.6 + 5.0.0-alpha.1.20058.9 5.0.0-alpha.1.20056.6 From 96f21e4469bed415f7a2a45e4bd460edbba60229 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Thu, 9 Jan 2020 16:07:28 -0800 Subject: [PATCH 061/243] Fix newline formatting for dotnet-trace provider info (#737) --- src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs index 8cc33b7ffb..b28eab6e28 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs @@ -222,7 +222,7 @@ private static void PrintProviders(IReadOnlyList providers, D Console.Out.Write(String.Format("{0, -40}","Provider Name")); // +4 is for the tab Console.Out.Write(String.Format("{0, -20}","Keywords")); Console.Out.Write(String.Format("{0, -20}","Level")); - Console.Out.Write("Enabled By\n"); + Console.Out.Write("Enabled By\r\n"); foreach (var provider in providers) { Console.Out.WriteLine(String.Format("{0, -80}", $"{GetProviderDisplayString(provider)}") + $"{enabledBy[provider.Name]}"); From b52e0f24de51be794f8b51861dcf5a8cb0bbe6fd Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Thu, 9 Jan 2020 17:23:47 -0800 Subject: [PATCH 062/243] Add --clrevents flag to dotnet-trace (#738) * Add clrevents flag * Ignore clrevents if providers is already specified * Docs change * Change the error message a little bit * case insensitive comparison for keywords, add clreventlevel option * Threw back in a line that was deleted accidentally * Add test for CLR provider parsing * use stringcomparer instead of tolower --- documentation/dotnet-trace-instructions.md | 36 +++++++++ .../CommandLine/Commands/CollectCommand.cs | 45 ++++++++++- src/Tools/dotnet-trace/Extensions.cs | 65 ++++++++++++++++ src/tests/dotnet-trace/CLRProviderParsing.cs | 74 +++++++++++++++++++ 4 files changed, 216 insertions(+), 4 deletions(-) create mode 100644 src/tests/dotnet-trace/CLRProviderParsing.cs diff --git a/documentation/dotnet-trace-instructions.md b/documentation/dotnet-trace-instructions.md index 62ba14e752..db623c5962 100644 --- a/documentation/dotnet-trace-instructions.md +++ b/documentation/dotnet-trace-instructions.md @@ -175,6 +175,42 @@ Options: KeyValueArgs format: '[key1=value1][;key2=value2]' note: values that contain ';' or '=' characters should be surrounded by double quotes ("), e.g., 'key="value;with=symbols";key2=value2' + --clrevents + List of CLR events to collect. + + The string should be in the format '[Keyword1]+[Keyword2]+...+[KeywordN]'. For example: --clrevents GC+GCHandle + + List of CLR event keywords: + * GC + * GCHandle + * Fusion + * Loader + * JIT + * NGEN + * StartEnumeration + * EndEnumeration + * Security + * AppDomainResourceManagement + * JITTracing + * Interop + * Contention + * Exception + * Threading + * JittedMethodILToNativeMap + * OverrideAndSuppressNGENEvents + * Type + * GCHeapDump + * GCSampledObjectAllocationHigh + * GCHeapSurvivalAndMovement + * GCHeapCollect + * GCHeapAndTypeNames + * GCSampledObjectAllocationLow + * PerfTrack + * Stack + * ThreadTransfer + * Debugger + + --buffersize Sets the size of the in-memory circular buffer in megabytes. Default 256 MB. diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs index b28eab6e28..fc7f6f50b7 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs @@ -19,7 +19,7 @@ namespace Microsoft.Diagnostics.Tools.Trace { internal static class CollectCommandHandler { - delegate Task CollectDelegate(CancellationToken ct, IConsole console, int processId, FileInfo output, uint buffersize, string providers, string profile, TraceFileFormat format, TimeSpan duration); + delegate Task CollectDelegate(CancellationToken ct, IConsole console, int processId, FileInfo output, uint buffersize, string providers, string profile, TraceFileFormat format, TimeSpan duration, string clrevents, string clreventlevel); /// /// Collects a diagnostic trace from a currently running process. @@ -32,8 +32,11 @@ internal static class CollectCommandHandler /// A list of EventPipe providers to be enabled. This is in the form 'Provider[,Provider]', where Provider is in the form: 'KnownProviderName[:Flags[:Level][:KeyValueArgs]]', and KeyValueArgs is in the form: '[key1=value1][;key2=value2]' /// A named pre-defined set of provider configurations that allows common tracing scenarios to be specified succinctly. /// The desired format of the created trace file. + /// The duration of trace to be taken. + /// A list of CLR events to be emitted. + /// The verbosity level of CLR events /// - private static async Task Collect(CancellationToken ct, IConsole console, int processId, FileInfo output, uint buffersize, string providers, string profile, TraceFileFormat format, TimeSpan duration) + private static async Task Collect(CancellationToken ct, IConsole console, int processId, FileInfo output, uint buffersize, string providers, string profile, TraceFileFormat format, TimeSpan duration, string clrevents, string clreventlevel) { try { @@ -56,7 +59,7 @@ private static async Task Collect(CancellationToken ct, IConsole console, i return ErrorCodes.ArgumentError; } - if (profile.Length == 0 && providers.Length == 0) + if (profile.Length == 0 && providers.Length == 0 && clrevents.Length == 0) { Console.Out.WriteLine("No profile or providers specified, defaulting to trace profile 'cpu-sampling'"); profile = "cpu-sampling"; @@ -83,6 +86,22 @@ private static async Task Collect(CancellationToken ct, IConsole console, i Profile.MergeProfileAndProviders(selectedProfile, providerCollection, enabledBy); } + // Parse --clrevents parameter + if (clrevents.Length != 0) + { + // Ignore --clrevents if CLR event provider was already specified via --profile or --providers command. + if (enabledBy.ContainsKey(Extensions.CLREventProviderName)) + { + Console.WriteLine($"The argument --clrevents {clrevents} will be ignored because the CLR provider was configured via either --profile or --providers command."); + } + else + { + var clrProvider = Extensions.ToCLREventPipeProvider(clrevents, clreventlevel); + providerCollection.Add(clrProvider); + enabledBy[Extensions.CLREventProviderName] = "--clrevents"; + } + } + if (providerCollection.Count <= 0) { @@ -284,7 +303,9 @@ public static Command CollectCommand() => ProvidersOption(), ProfileOption(), CommonOptions.FormatOption(), - DurationOption() + DurationOption(), + CLREventsOption(), + CLREventLevelOption() }; private static uint DefaultCircularBufferSizeInMB => 256; @@ -331,5 +352,21 @@ private static Option DurationOption() => Argument = new Argument(name: "duration-timespan", defaultValue: default), IsHidden = true }; + + private static Option CLREventsOption() => + new Option( + alias: "--clrevents", + description: @"List of CLR runtime events to emit.") + { + Argument = new Argument(name: "clrevents", defaultValue: "") + }; + + private static Option CLREventLevelOption() => + new Option( + alias: "--clreventlevel", + description: @"Verbosity of CLR events to be emitted.") + { + Argument = new Argument(name: "clreventlevel", defaultValue: "") + }; } } diff --git a/src/Tools/dotnet-trace/Extensions.cs b/src/Tools/dotnet-trace/Extensions.cs index 59b54664ec..aa0c8bff1e 100644 --- a/src/Tools/dotnet-trace/Extensions.cs +++ b/src/Tools/dotnet-trace/Extensions.cs @@ -12,7 +12,41 @@ namespace Microsoft.Diagnostics.Tools.Trace { internal static class Extensions { + public static string CLREventProviderName = "Microsoft-Windows-DotNETRuntime"; + private static EventLevel defaultEventLevel = EventLevel.Verbose; + // Keep this in sync with runtime repo's clretwall.man + private static Dictionary CLREventKeywords = new Dictionary(StringComparer.InvariantCultureIgnoreCase) + { + { "gc", 0x1 }, + { "gchandle", 0x2 }, + { "fusion", 0x4 }, + { "loader", 0x8 }, + { "jit", 0x10 }, + { "ngen", 0x20 }, + { "startenumeration", 0x40 }, + { "endenumeration", 0x80 }, + { "security", 0x400 }, + { "appdomainresourcemanagement", 0x800 }, + { "jittracing", 0x1000 }, + { "interop", 0x2000 }, + { "contention", 0x4000 }, + { "exception", 0x8000 }, + { "threading", 0x10000 }, + { "jittedmethodiltonativemap", 0x20000 }, + { "overrideandsuppressngenevents", 0x40000 }, + { "type", 0x80000 }, + { "gcheapdump", 0x100000 }, + { "gcsampledobjectallcationhigh", 0x200000 }, + { "gcheapsurvivalandmovement", 0x400000 }, + { "gcheapcollect", 0x800000 }, + { "gcheapandtypenames", 0x1000000 }, + { "gcsampledobjectallcationlow", 0x2000000 }, + { "perftrack", 0x20000000 }, + { "stack", 0x40000000 }, + { "threadtransfer", 0x80000000 }, + { "debugger", 0x100000000 } + }; public static List ToProviders(string providers) { @@ -22,6 +56,37 @@ public static List ToProviders(string providers) new List() : providers.Split(',').Select(ToProvider).ToList(); } + public static EventPipeProvider ToCLREventPipeProvider(string clreventslist, string clreventlevel) + { + if (clreventslist == null || clreventslist.Length == 0) + { + return null; + } + + var clrevents = clreventslist.Split("+"); + long clrEventsKeywordsMask = 0; + for (var i = 0; i < clrevents.Length; i++) + { + if (CLREventKeywords.TryGetValue(clrevents[i], out var keyword)) + { + clrEventsKeywordsMask |= keyword; + } + else + { + throw new ArgumentException($"{clrevents[i]} is not a valid CLR event keyword"); + } + } + + EventLevel level = (EventLevel)4; // Default event level + + if (clreventlevel.Length != 0) + { + level = GetEventLevel(clreventlevel); + } + + return new EventPipeProvider(CLREventProviderName, level, clrEventsKeywordsMask, null); + } + private static EventLevel GetEventLevel(string token) { if (Int32.TryParse(token, out int level) && level >= 0) diff --git a/src/tests/dotnet-trace/CLRProviderParsing.cs b/src/tests/dotnet-trace/CLRProviderParsing.cs new file mode 100644 index 0000000000..b391f9f439 --- /dev/null +++ b/src/tests/dotnet-trace/CLRProviderParsing.cs @@ -0,0 +1,74 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Diagnostics.NETCore.Client; +using System; +using Xunit; +using System.Collections.Generic; +using System.Linq; + +namespace Microsoft.Diagnostics.Tools.Trace +{ + public class CLRProviderParsingTests + { + private static string CLRProviderName = "Microsoft-Windows-DotNETRuntime"; + + [Theory] + [InlineData("gc")] + [InlineData("Gc")] + [InlineData("GC")] + public void ValidSingleCLREvent(string providerToParse) + { + var provider = Extensions.ToCLREventPipeProvider(providerToParse, "4"); + Assert.True(provider.Name == CLRProviderName); + Assert.True(provider.Keywords == 1); + Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Informational); + Assert.True(provider.Arguments == null); + } + + [Theory] + [InlineData("nosuchevent")] + [InlineData("something")] + [InlineData("haha")] + public void InValidSingleCLREvent(string providerToParse) + { + Assert.Throws(() => Extensions.ToCLREventPipeProvider(providerToParse, "4")); + } + + [Theory] + [InlineData("gc+gchandle")] + [InlineData("gc+GCHandle")] + [InlineData("GC+GCHandle")] + public void ValidManyCLREvents(string providerToParse) + { + var provider = Extensions.ToCLREventPipeProvider(providerToParse, "5"); + Assert.True(provider.Name == CLRProviderName); + Assert.True(provider.Keywords == 3); + Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); + Assert.True(provider.Arguments == null); + } + + [Theory] + [InlineData("informational")] + [InlineData("4")] + [InlineData("Informational")] + [InlineData("InFORMationAL")] + public void ValidCLREventLevel(string clreventlevel) + { + var provider = Extensions.ToCLREventPipeProvider("gc", clreventlevel); + Assert.True(provider.Name == CLRProviderName); + Assert.True(provider.Keywords == 1); + Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Informational); + Assert.True(provider.Arguments == null); + } + + [Theory] + [InlineData("something")] + [InlineData("hello")] + public void InvalidCLREventLevel(string clreventlevel) + { + Assert.Throws(() => Extensions.ToCLREventPipeProvider("gc", clreventlevel)); + } + } +} \ No newline at end of file From 092a120bfddb1920cde10a40c15e97c51a012607 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 10 Jan 2020 13:41:59 +0000 Subject: [PATCH 063/243] Update dependencies from https://github.com/dotnet/runtime build 20200109.11 (#739) - Microsoft.NETCore.App - 5.0.0-alpha.1.20059.11 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6053aa2a26..d084fbc8b9 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 111d78c79ac38f596688af152779d7a39e4bf973 - + https://github.com/dotnet/runtime - 8019c079ce8174845107e13eb4ddf3582bb10cd0 + d4f423e057fb1ba3ca92d99bc96905e0746b95f2 https://github.com/aspnet/AspNetCore diff --git a/eng/Versions.props b/eng/Versions.props index 9a9312a0ba..c768619db1 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -15,7 +15,7 @@ $(MicrosoftNETCoreApp30Version) 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20058.9 + 5.0.0-alpha.1.20059.11 5.0.0-alpha.1.20056.6 From 16134feee8be6fd1a62de6491f6f409128b9295b Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 11 Jan 2020 13:48:50 +0000 Subject: [PATCH 064/243] Update dependencies from https://github.com/dotnet/runtime build 20200110.7 (#741) - Microsoft.NETCore.App - 5.0.0-alpha.1.20060.7 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index d084fbc8b9..25f7e9cfa8 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 111d78c79ac38f596688af152779d7a39e4bf973 - + https://github.com/dotnet/runtime - d4f423e057fb1ba3ca92d99bc96905e0746b95f2 + ff03a08accc88651d6b4c34c23d502131b91b6c7 https://github.com/aspnet/AspNetCore diff --git a/eng/Versions.props b/eng/Versions.props index c768619db1..bb8862b633 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -15,7 +15,7 @@ $(MicrosoftNETCoreApp30Version) 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20059.11 + 5.0.0-alpha.1.20060.7 5.0.0-alpha.1.20056.6 From fcc344b7117166ebb87e500ed046cfb1dce296b3 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sun, 12 Jan 2020 18:44:01 +0000 Subject: [PATCH 065/243] Update dependencies from https://github.com/dotnet/runtime build 20200111.3 (#743) - Microsoft.NETCore.App - 5.0.0-alpha.1.20061.3 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 25f7e9cfa8..bd183f69f8 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 111d78c79ac38f596688af152779d7a39e4bf973 - + https://github.com/dotnet/runtime - ff03a08accc88651d6b4c34c23d502131b91b6c7 + afc21e51af60a4d2cb11a1081fb38b1e3a8df0a2 https://github.com/aspnet/AspNetCore diff --git a/eng/Versions.props b/eng/Versions.props index bb8862b633..5dd3cb2981 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -15,7 +15,7 @@ $(MicrosoftNETCoreApp30Version) 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20060.7 + 5.0.0-alpha.1.20061.3 5.0.0-alpha.1.20056.6 From 008e4c410eb02d67234cf9fb2e7a9319c75aae73 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2020 14:43:03 +0000 Subject: [PATCH 066/243] Update dependencies from https://github.com/dotnet/arcade build 20200112.1 (#744) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.20062.1 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.20062.1 --- eng/Version.Details.xml | 8 ++-- eng/Versions.props | 2 +- eng/common/performance/performance-setup.ps1 | 3 +- eng/common/performance/performance-setup.sh | 2 +- .../channels/generic-internal-channel.yml | 38 +++++++----------- .../channels/generic-public-channel.yml | 39 +++++++------------ eng/common/templates/steps/publish-logs.yml | 23 +++++++++++ global.json | 2 +- 8 files changed, 62 insertions(+), 55 deletions(-) create mode 100644 eng/common/templates/steps/publish-logs.yml diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index bd183f69f8..2d3e3a9a09 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,15 +4,15 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - 111d78c79ac38f596688af152779d7a39e4bf973 + 250782df013aa8586e21bb225f8efd715372dcf1 - + https://github.com/dotnet/arcade - 111d78c79ac38f596688af152779d7a39e4bf973 + 250782df013aa8586e21bb225f8efd715372dcf1 https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 5dd3cb2981..4d3a4c6bcc 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -38,7 +38,7 @@ 4.5.3 2.4.1 2.0.3 - 5.0.0-beta.20055.1 + 5.0.0-beta.20062.1 10.0.18362 diff --git a/eng/common/performance/performance-setup.ps1 b/eng/common/performance/performance-setup.ps1 index ec41965fc8..f6e878297d 100644 --- a/eng/common/performance/performance-setup.ps1 +++ b/eng/common/performance/performance-setup.ps1 @@ -49,7 +49,8 @@ if ($Internal) { $HelixSourcePrefix = "official" } -$CommonSetupArguments="--frameworks $Framework --queue $Queue --build-number $BuildNumber --build-configs $Configurations" +# FIX ME: This is a workaround until we get this from the actual pipeline +$CommonSetupArguments="--channel master --queue $Queue --build-number $BuildNumber --build-configs $Configurations" $SetupArguments = "--repository https://github.com/$Repository --branch $Branch --get-perf-hash --commit-sha $CommitSha $CommonSetupArguments" if ($RunFromPerformanceRepo) { diff --git a/eng/common/performance/performance-setup.sh b/eng/common/performance/performance-setup.sh index 2f2092166e..7ef15514e5 100644 --- a/eng/common/performance/performance-setup.sh +++ b/eng/common/performance/performance-setup.sh @@ -164,7 +164,7 @@ if [[ "$internal" == true ]]; then fi fi -common_setup_arguments="--frameworks $framework --queue $queue --build-number $build_number --build-configs $configurations" +common_setup_arguments="--channel master --queue $queue --build-number $build_number --build-configs $configurations" setup_arguments="--repository https://github.com/$repository --branch $branch --get-perf-hash --commit-sha $commit_sha $common_setup_arguments" if [[ "$run_from_perf_repo" = true ]]; then diff --git a/eng/common/templates/post-build/channels/generic-internal-channel.yml b/eng/common/templates/post-build/channels/generic-internal-channel.yml index 3a8755fbbb..700211049b 100644 --- a/eng/common/templates/post-build/channels/generic-internal-channel.yml +++ b/eng/common/templates/post-build/channels/generic-internal-channel.yml @@ -30,16 +30,15 @@ stages: vmImage: 'windows-2019' steps: - task: DownloadBuildArtifacts@0 - displayName: Download Blob Artifacts - inputs: - artifactName: 'BlobArtifacts' + displayName: Download Build Assets continueOnError: true - - - task: DownloadBuildArtifacts@0 - displayName: Download PDB Artifacts inputs: - artifactName: 'PDBArtifacts' - continueOnError: true + buildType: 'current' + downloadType: 'specific' + itemPattern: | + PDBArtifacts/** + BlobArtifacts/** + downloadPath: '$(Build.ArtifactStagingDirectory)' # This is necessary whenever we want to publish/restore to an AzDO private feed # Since sdk-task.ps1 tries to restore packages we need to do this authentication here @@ -85,23 +84,16 @@ stages: vmImage: 'windows-2019' steps: - task: DownloadBuildArtifacts@0 - displayName: Download Package Artifacts - inputs: - buildType: current - artifactName: PackageArtifacts - continueOnError: true - - - task: DownloadBuildArtifacts@0 - displayName: Download Blob Artifacts - inputs: - buildType: current - artifactName: BlobArtifacts + displayName: Download Build Assets continueOnError: true - - task: DownloadBuildArtifacts@0 - displayName: Download Asset Manifests inputs: - buildType: current - artifactName: AssetManifests + buildType: 'current' + downloadType: 'specific' + itemPattern: | + PackageArtifacts/** + BlobArtifacts/** + AssetManifests/** + downloadPath: '$(Build.ArtifactStagingDirectory)' - task: NuGetToolInstaller@1 displayName: 'Install NuGet.exe' diff --git a/eng/common/templates/post-build/channels/generic-public-channel.yml b/eng/common/templates/post-build/channels/generic-public-channel.yml index 3f572f8b12..fbb5a19b67 100644 --- a/eng/common/templates/post-build/channels/generic-public-channel.yml +++ b/eng/common/templates/post-build/channels/generic-public-channel.yml @@ -30,16 +30,15 @@ stages: vmImage: 'windows-2019' steps: - task: DownloadBuildArtifacts@0 - displayName: Download Blob Artifacts - inputs: - artifactName: 'BlobArtifacts' + displayName: Download Build Assets continueOnError: true - - - task: DownloadBuildArtifacts@0 - displayName: Download PDB Artifacts inputs: - artifactName: 'PDBArtifacts' - continueOnError: true + buildType: 'current' + downloadType: 'specific' + itemPattern: | + PDBArtifacts/** + BlobArtifacts/** + downloadPath: '$(Build.ArtifactStagingDirectory)' # This is necessary whenever we want to publish/restore to an AzDO private feed # Since sdk-task.ps1 tries to restore packages we need to do this authentication here @@ -84,24 +83,16 @@ stages: vmImage: 'windows-2019' steps: - task: DownloadBuildArtifacts@0 - displayName: Download Package Artifacts - inputs: - buildType: current - artifactName: PackageArtifacts + displayName: Download Build Assets continueOnError: true - - - task: DownloadBuildArtifacts@0 - displayName: Download Blob Artifacts - inputs: - buildType: current - artifactName: BlobArtifacts - continueOnError: true - - - task: DownloadBuildArtifacts@0 - displayName: Download Asset Manifests inputs: - buildType: current - artifactName: AssetManifests + buildType: 'current' + downloadType: 'specific' + itemPattern: | + PackageArtifacts/** + BlobArtifacts/** + AssetManifests/** + downloadPath: '$(Build.ArtifactStagingDirectory)' - task: NuGetToolInstaller@1 displayName: 'Install NuGet.exe' diff --git a/eng/common/templates/steps/publish-logs.yml b/eng/common/templates/steps/publish-logs.yml new file mode 100644 index 0000000000..f91751fe78 --- /dev/null +++ b/eng/common/templates/steps/publish-logs.yml @@ -0,0 +1,23 @@ +parameters: + StageLabel: '' + JobLabel: '' + +steps: +- task: Powershell@2 + displayName: Prepare Binlogs to Upload + inputs: + targetType: inline + script: | + New-Item -ItemType Directory $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/ + Move-Item -Path $(Build.SourcesDirectory)/artifacts/log/Debug/* $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/ + continueOnError: true + condition: always() + +- task: PublishBuildArtifacts@1 + displayName: Publish Logs + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/PostBuildLogs' + PublishLocation: Container + ArtifactName: PostBuildLogs + continueOnError: true + condition: always() diff --git a/global.json b/global.json index 82f48ac2d3..f73caf35b1 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "dotnet": "3.0.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20055.1" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20062.1" } } From 5e1f652eb9a1ddbcdcdc455c56cf07d1020a4c44 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2020 14:57:26 +0000 Subject: [PATCH 067/243] Update dependencies from https://github.com/dotnet/runtime build 20200112.3 (#745) - Microsoft.NETCore.App - 5.0.0-alpha.1.20062.3 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2d3e3a9a09..a324294b96 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 250782df013aa8586e21bb225f8efd715372dcf1 - + https://github.com/dotnet/runtime - afc21e51af60a4d2cb11a1081fb38b1e3a8df0a2 + 773f64296d3c6932f716ae6c8932662ade93b284 https://github.com/aspnet/AspNetCore diff --git a/eng/Versions.props b/eng/Versions.props index 4d3a4c6bcc..7d8c8a479e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -15,7 +15,7 @@ $(MicrosoftNETCoreApp30Version) 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20061.3 + 5.0.0-alpha.1.20062.3 5.0.0-alpha.1.20056.6 From edf36ab22f0b70bc05ff1ef256af4b83079d02b9 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Tue, 14 Jan 2020 00:22:12 -0800 Subject: [PATCH 068/243] Fix line number issues in SOS (#734) Fix line number issues in SOS The change is to subtract 1 from the IP used to get the source/line info when the stack frame is a leaf node. For hardware exceptions, the IP has already been adjusted (+1) by the runtime so they cancel out. Fixes in SOS the same issues reported in https://github.com/dotnet/coreclr/issues/27765 and https://github.com/dotnet/coreclr/issues/25740 for the runtime's unhandled exception message. Add some more PrintException -lines testing for thrown and hardware exceptions. Gracefully fail with runtime module size == 0. Fix "clrmodules" failure our vendors found. Add line number (LineNum) check testcase --- debuggees.sln | 43 ++++++++++++++ src/SOS/SOS.NETCore/SymbolReader.cs | 3 +- .../Debuggees/LineNums/LineNums.csproj | 8 +++ .../Debuggees/LineNums/Program.cs | 29 ++++++++++ src/SOS/SOS.UnitTests/SOS.cs | 6 ++ src/SOS/SOS.UnitTests/Scripts/DivZero.script | 17 +++++- src/SOS/SOS.UnitTests/Scripts/LineNums.script | 58 +++++++++++++++++++ .../SOS.UnitTests/Scripts/SimpleThrow.script | 14 ++++- src/SOS/Strike/disasm.h | 9 ++- src/SOS/Strike/exts.h | 2 + src/SOS/Strike/runtime.cpp | 12 +++- src/SOS/Strike/strike.cpp | 56 ++++++++++++++++-- src/SOS/Strike/util.cpp | 6 +- src/SOS/Strike/util.h | 2 +- src/Tools/dotnet-dump/Analyzer.cs | 7 ++- 15 files changed, 257 insertions(+), 15 deletions(-) create mode 100644 src/SOS/SOS.UnitTests/Debuggees/LineNums/LineNums.csproj create mode 100644 src/SOS/SOS.UnitTests/Debuggees/LineNums/Program.cs create mode 100644 src/SOS/SOS.UnitTests/Scripts/LineNums.script diff --git a/debuggees.sln b/debuggees.sln index 74b27053cf..abffc6dacd 100644 --- a/debuggees.sln +++ b/debuggees.sln @@ -35,6 +35,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SymbolTestApp", "src\SOS\SO EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SymbolTestDll", "src\SOS\SOS.UnitTests\Debuggees\SymbolTestApp\SymbolTestDll\SymbolTestDll.csproj", "{8C27904A-47C0-44C7-B191-88FF34580CBE}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LineNums", "src\SOS\SOS.UnitTests\Debuggees\LineNums\LineNums.csproj", "{84881FB8-37E1-4D9B-B27E-9831C30DCC04}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Checked|Any CPU = Checked|Any CPU @@ -579,6 +581,46 @@ Global {8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|x64.Build.0 = Release|Any CPU {8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU {8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|x86.Build.0 = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Checked|Any CPU.Build.0 = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Checked|ARM.ActiveCfg = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Checked|ARM.Build.0 = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Checked|ARM64.ActiveCfg = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Checked|ARM64.Build.0 = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Checked|x64.ActiveCfg = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Checked|x64.Build.0 = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Checked|x86.ActiveCfg = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Checked|x86.Build.0 = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Debug|ARM.ActiveCfg = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Debug|ARM.Build.0 = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Debug|ARM64.Build.0 = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Debug|x64.ActiveCfg = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Debug|x64.Build.0 = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Debug|x86.ActiveCfg = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Debug|x86.Build.0 = Debug|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Release|Any CPU.Build.0 = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Release|ARM.ActiveCfg = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Release|ARM.Build.0 = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Release|ARM64.ActiveCfg = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Release|ARM64.Build.0 = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Release|x64.ActiveCfg = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Release|x64.Build.0 = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Release|x86.ActiveCfg = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.Release|x86.Build.0 = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.RelWithDebInfo|x64.Build.0 = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU + {84881FB8-37E1-4D9B-B27E-9831C30DCC04}.RelWithDebInfo|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -599,6 +641,7 @@ Global {B50D14DB-8EE5-47BD-B412-62FA5C693CC7} = {C3072949-6D24-451B-A308-2F3621F858B0} {112FE2A7-3FD2-4496-8A14-171898AD5CF5} = {C3072949-6D24-451B-A308-2F3621F858B0} {8C27904A-47C0-44C7-B191-88FF34580CBE} = {C3072949-6D24-451B-A308-2F3621F858B0} + {84881FB8-37E1-4D9B-B27E-9831C30DCC04} = {C3072949-6D24-451B-A308-2F3621F858B0} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {46465737-C938-44FC-BE1A-4CE139EBB5E0} diff --git a/src/SOS/SOS.NETCore/SymbolReader.cs b/src/SOS/SOS.NETCore/SymbolReader.cs index 50231e29ba..1f17a22843 100644 --- a/src/SOS/SOS.NETCore/SymbolReader.cs +++ b/src/SOS/SOS.NETCore/SymbolReader.cs @@ -19,6 +19,7 @@ using System.Reflection.PortableExecutable; using System.Runtime.InteropServices; using System.Threading; +using System.Threading.Tasks; namespace SOS { @@ -309,7 +310,7 @@ public static void LoadNativeSymbols(SymbolFileCallback callback, IntPtr paramet } } } - catch (Exception ex) when (ex is BadInputFormatException || ex is InvalidVirtualAddressException) + catch (Exception ex) when (ex is BadInputFormatException || ex is InvalidVirtualAddressException || ex is TaskCanceledException) { s_tracer.Error("{0}/{1:X16}: {2}", moduleFilePath, address, ex.Message); } diff --git a/src/SOS/SOS.UnitTests/Debuggees/LineNums/LineNums.csproj b/src/SOS/SOS.UnitTests/Debuggees/LineNums/LineNums.csproj new file mode 100644 index 0000000000..a951e54a3a --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/LineNums/LineNums.csproj @@ -0,0 +1,8 @@ + + + Exe + true + $(BuildProjectFramework) + netcoreapp2.1;netcoreapp3.0 + + diff --git a/src/SOS/SOS.UnitTests/Debuggees/LineNums/Program.cs b/src/SOS/SOS.UnitTests/Debuggees/LineNums/Program.cs new file mode 100644 index 0000000000..721fd9c15f --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/LineNums/Program.cs @@ -0,0 +1,29 @@ +using System; +using System.Runtime.CompilerServices; + +namespace LineNums +{ + class Program + { + static void Main(string[] args) + { + Foo(); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + static void Foo() + { + Bar(); + Bar(); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + static void Bar() + { + while (true) + { + throw new Exception("This should be line #25"); + } + } + } +} diff --git a/src/SOS/SOS.UnitTests/SOS.cs b/src/SOS/SOS.UnitTests/SOS.cs index b667cde626..338abcec29 100644 --- a/src/SOS/SOS.UnitTests/SOS.cs +++ b/src/SOS/SOS.UnitTests/SOS.cs @@ -144,6 +144,12 @@ public async Task SimpleThrow(TestConfiguration config) await RunTest(config, "SimpleThrow", "SimpleThrow.script", testTriage: true); } + [SkippableTheory, MemberData(nameof(Configurations))] + public async Task LineNums(TestConfiguration config) + { + await RunTest(config, "LineNums", "LineNums.script", testTriage: true); + } + [SkippableTheory, MemberData(nameof(Configurations))] public async Task NestedExceptionTest(TestConfiguration config) { diff --git a/src/SOS/SOS.UnitTests/Scripts/DivZero.script b/src/SOS/SOS.UnitTests/Scripts/DivZero.script index 47379e38de..be215a4a99 100644 --- a/src/SOS/SOS.UnitTests/Scripts/DivZero.script +++ b/src/SOS/SOS.UnitTests/Scripts/DivZero.script @@ -10,7 +10,6 @@ LOADSOS # Verifying that PrintException gives us the right exception in the format above. SOSCOMMAND:PrintException - VERIFY:Exception object:\s+\s+ VERIFY:Exception type:\s+System\.DivideByZeroException\s+ VERIFY:Message:\s+(|Attempted to divide by zero\.)\s+ @@ -24,6 +23,22 @@ VERIFY:\s+\s+\s+[Dd]iv[Zz]ero.*!C\.Main(\(.*\))?\+0x\s+ VERIFY:(StackTraceString: \s+)?\s+ VERIFY:HResult:\s+80020012\s+ +SOSCOMMAND:PrintException -lines +VERIFY:Exception object:\s+\s+ +VERIFY:Exception type:\s+System\.DivideByZeroException\s+ +VERIFY:Message:\s+(|Attempted to divide by zero\.)\s+ +VERIFY:InnerException:\s+\s+ +VERIFY:StackTrace \(generated\):\s+ +VERIFY:\s+SP\s+IP\s+\s+Function\s+ +VERIFY:\s+\s+\s+[Dd]iv[Zz]ero.*!C\.DivideByZero(\(.*\))?\+0x\s+ +VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?DivZero[\\|/]DivZero\.cs @ 12\s*\]\s* +VERIFY:\s+\s+\s+[Dd]iv[Zz]ero.*!C\.F3(\(.*\))?\+0x\s+ +VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?DivZero[\\|/]DivZero\.cs @ 21\s*\]\s* +VERIFY:\s+\s+\s+[Dd]iv[Zz]ero.*!C\.F2(\(.*\))?\+0x\s+ +VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?DivZero[\\|/]DivZero\.cs @ 33\s*\]\s* +VERIFY:\s+\s+\s+[Dd]iv[Zz]ero.*!C\.Main(\(.*\))?\+0x\s+ +VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?DivZero[\\|/]DivZero\.cs @ 54\s*\]\s* + # Verify that Threads (clrthreads) works IFDEF:DOTNETDUMP SOSCOMMAND:clrthreads diff --git a/src/SOS/SOS.UnitTests/Scripts/LineNums.script b/src/SOS/SOS.UnitTests/Scripts/LineNums.script new file mode 100644 index 0000000000..cfbc537359 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Scripts/LineNums.script @@ -0,0 +1,58 @@ +# Test source line numbers for corner cases + +CONTINUE + +LOADSOS + +SOSCOMMAND:PrintException +VERIFY:Exception object:\s+\s+ +VERIFY:Exception type:\s+System\.Exception\s+ +VERIFY:Message:\s+(|This should be line #25)\s+ +VERIFY:InnerException:\s+\s+ +VERIFY:StackTrace\s+\(generated\):\s+ +VERIFY:\s+SP\s+IP\s+Function\s+ +VERIFY:\s+\s+\s+LineNums.*!LineNums\.Program\.Bar.*\+0x\s+ +VERIFY:\s+\s+\s+LineNums.*!LineNums\.Program\.Foo.*\+0x\s+ +VERIFY:\s+\s+\s+LineNums.*!LineNums\.Program\.Main.*\+0x\s+ +VERIFY:HResult:\s+80131500 + +SOSCOMMAND:PrintException -lines +VERIFY:Exception object:\s+\s+ +VERIFY:Exception type:\s+System\.Exception\s+ +VERIFY:Message:\s+(|This should be line #25)\s+ +VERIFY:InnerException:\s+\s+ +VERIFY:StackTrace\s+\(generated\):\s+ +VERIFY:\s+SP\s+IP\s+Function\s+ +VERIFY:\s+\s+\s+LineNums.*!LineNums\.Program\.Bar.*\+0x\s+ +VERIFY:\[.*[\\|/]Debuggees[\\|/]LineNums[\\|/]Program\.cs @ 25\s*\]\s* +VERIFY:\s+\s+\s+LineNums.*!LineNums\.Program\.Foo.*\+0x\s+ +VERIFY:\[.*[\\|/]Debuggees[\\|/]LineNums[\\|/]Program\.cs @ 16\s*\]\s* +VERIFY:\s+\s+\s+LineNums.*!LineNums\.Program\.Main.*\+0x\s+ +VERIFY:\[.*[\\|/]Debuggees[\\|/]LineNums[\\|/]Program\.cs @ 10\s*\]\s* + +# Verify that Threads (clrthreads) works +IFDEF:DOTNETDUMP +SOSCOMMAND:clrthreads +ENDIF:DOTNETDUMP +!IFDEF:DOTNETDUMP +SOSCOMMAND:Threads +ENDIF:DOTNETDUMP +VERIFY:\s*ThreadCount:\s+\s+ +VERIFY:\s+UnstartedThread:\s+\s+ +VERIFY:\s+BackgroundThread:\s+\s+ +VERIFY:\s+PendingThread:\s+\s+ +VERIFY:\s+DeadThread:\s+\s+ +VERIFY:\s+Hosted Runtime:\s+no\s+ +VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+ +VERIFY:\s+\s+\s+\s+.*\s+ + +# Verify that ClrStack with no options works +SOSCOMMAND:ClrStack +VERIFY:.*OS Thread Id:\s+0x\s+.* +VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ +VERIFY:\s+\s+\s+LineNums\.Program\.Bar\(\).*\s+ +VERIFY:\[.*[\\|/]Debuggees[\\|/]LineNums[\\|/]Program\.cs @ 25\s*\]\s* +VERIFY:\s+\s+\s+LineNums\.Program\.Foo\(\).*\s+ +VERIFY:\[.*[\\|/]Debuggees[\\|/]LineNums[\\|/]Program\.cs @ 16\s*\]\s* +VERIFY:\s+\s+\s+LineNums\.Program\.Main\(System.String\[\]\).*\s+ +VERIFY:\[.*[\\|/]Debuggees[\\|/]LineNums[\\|/]Program\.cs @ 10\s*\]\s* diff --git a/src/SOS/SOS.UnitTests/Scripts/SimpleThrow.script b/src/SOS/SOS.UnitTests/Scripts/SimpleThrow.script index 278a45f3da..c2bf379c88 100644 --- a/src/SOS/SOS.UnitTests/Scripts/SimpleThrow.script +++ b/src/SOS/SOS.UnitTests/Scripts/SimpleThrow.script @@ -33,6 +33,18 @@ VERIFY:\s+\s+\s+[Ss]imple[Tt]hrow.*!(\$0_)?UserObject\.UseObject VERIFY:\s+\s+\s+[Ss]imple[Tt]hrow.*!(\$0_)?Simple\.Main.*\+0x\s+ VERIFY:HResult:\s+80131509 +SOSCOMMAND:PrintException -lines +VERIFY:Exception object:\s+\s+ +VERIFY:Exception type:\s+System\.InvalidOperationException\s+ +VERIFY:Message:\s+(|Throwing an invalid operation\.\.\.\.)\s+ +VERIFY:InnerException:\s+\s+ +VERIFY:StackTrace\s+\(generated\):\s+ +VERIFY:\s+SP\s+IP\s+Function\s+ +VERIFY:\s+\s+\s+[Ss]imple[Tt]hrow.*!(\$0_)?UserObject\.UseObject.*\+0x\s* +VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?SimpleThrow[\\|/]UserObject\.cs @ 16\s*\]\s* +VERIFY:\s+\s+\s+[Ss]imple[Tt]hrow.*!(\$0_)?Simple\.Main.*\+0x\s+ +VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?SimpleThrow[\\|/]SimpleThrow\.cs @ 9\s*\]\s* + # Verify that Threads (clrthreads) works IFDEF:DOTNETDUMP SOSCOMMAND:clrthreads @@ -54,6 +66,6 @@ SOSCOMMAND:ClrStack VERIFY:.*OS Thread Id:\s+0x\s+.* VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ VERIFY:\s+\s+\s+(\*\*\* WARNING: Unable to verify checksum for SimpleThrow.exe\s*)?UserObject\.UseObject.*\s+ -VERIFY:[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?SimpleThrow[\\|/]UserObject\.cs @ 18\s*\] +VERIFY:[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?SimpleThrow[\\|/]UserObject\.cs @ 16\s*\] VERIFY:\s+\s+\s+Simple\.Main\(\)\s+ VERIFY:[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?SimpleThrow[\\|/]SimpleThrow\.cs @ 9\s*\] diff --git a/src/SOS/Strike/disasm.h b/src/SOS/Strike/disasm.h index 1eb3920cb0..fb2ee3e640 100644 --- a/src/SOS/Strike/disasm.h +++ b/src/SOS/Strike/disasm.h @@ -125,7 +125,6 @@ eTargetType GetFinalTarget(DWORD_PTR callee, DWORD_PTR* finalMDorIP); #ifndef THUMB_CODE #define THUMB_CODE 1 #endif -#define STACKWALK_CONTROLPC_ADJUST_OFFSET 2 #ifdef SOS_TARGET_X86 @@ -177,6 +176,8 @@ class X86Machine : public IMachine virtual void DumpGCInfo(GCInfoToken gcInfoToken, unsigned methodSize, printfFtn gcPrintf, bool encBytes, bool bPrintHeader) const; + int StackWalkIPAdjustOffset() const { return 1; } + private: X86Machine() {} ~X86Machine() {} @@ -244,6 +245,8 @@ class ARMMachine : public IMachine virtual void DumpGCInfo(GCInfoToken gcInfoToken, unsigned methodSize, printfFtn gcPrintf, bool encBytes, bool bPrintHeader) const; + int StackWalkIPAdjustOffset() const { return 2; } + private: ARMMachine() {} ~ARMMachine() {} @@ -313,6 +316,8 @@ class AMD64Machine : public IMachine virtual void DumpGCInfo(GCInfoToken gcInfoToken, unsigned methodSize, printfFtn gcPrintf, bool encBytes, bool bPrintHeader) const; + int StackWalkIPAdjustOffset() const { return 1; } + private: AMD64Machine() {} ~AMD64Machine() {} @@ -378,6 +383,8 @@ class ARM64Machine : public IMachine virtual void DumpGCInfo(GCInfoToken gcInfoToken, unsigned methodSize, printfFtn gcPrintf, bool encBytes, bool bPrintHeader) const; + int StackWalkIPAdjustOffset() const { return 4; } + private: ARM64Machine() {} ~ARM64Machine() {} diff --git a/src/SOS/Strike/exts.h b/src/SOS/Strike/exts.h index cefec80d91..2d630b87bd 100644 --- a/src/SOS/Strike/exts.h +++ b/src/SOS/Strike/exts.h @@ -390,6 +390,8 @@ class IMachine typedef void (*printfFtn)(const char* fmt, ...); // Dumps the GCInfo virtual void DumpGCInfo(GCInfoToken gcInfoToken, unsigned methodSize, printfFtn gcPrintf, bool encBytes, bool bPrintHeader) const = 0; + // The amount of bytes to adjust the IP for software exception throw instructions (the STACKWALK_CONTROLPC_ADJUST_OFFSET define in the runtime) + virtual int StackWalkIPAdjustOffset() const = 0; protected: IMachine() {} diff --git a/src/SOS/Strike/runtime.cpp b/src/SOS/Strike/runtime.cpp index cafe21bd1c..04d48bfa09 100644 --- a/src/SOS/Strike/runtime.cpp +++ b/src/SOS/Strike/runtime.cpp @@ -85,8 +85,16 @@ HRESULT Runtime::CreateInstance(bool isDesktop, Runtime **ppRuntime) } if (SUCCEEDED(hr)) { - *ppRuntime = new Runtime(isDesktop, moduleIndex, moduleAddress, moduleSize); - OnUnloadTask::Register(CleanupRuntimes); + if (moduleSize > 0) + { + *ppRuntime = new Runtime(isDesktop, moduleIndex, moduleAddress, moduleSize); + OnUnloadTask::Register(CleanupRuntimes); + } + else + { + ExtOut("Runtime (%s) module size == 0\n", runtimeModuleName); + hr = E_INVALIDARG; + } } } return hr; diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 27814e649a..4efa101bbc 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -2384,13 +2384,15 @@ size_t FormatGeneratedException (DWORD_PTR dataPtr, UINT bytes, __out_ecount_opt(bufferLength) WCHAR *wszBuffer, size_t bufferLength, - BOOL bAsync, + BOOL bAsync, // hardware exception if true BOOL bNestedCase = FALSE, BOOL bLineNumbers = FALSE) { UINT count = bytes / sizeof(StackTraceElement); size_t Length = 0; + _ASSERTE(g_targetMachine != nullptr); + if (wszBuffer && bufferLength > 0) { wszBuffer[0] = L'\0'; @@ -2464,7 +2466,28 @@ size_t FormatGeneratedException (DWORD_PTR dataPtr, WCHAR filename[MAX_LONGPATH] = W(""); ULONG linenum = 0; if (bLineNumbers && - SUCCEEDED(GetLineByOffset(TO_CDADDR(ste.ip), &linenum, filename, _countof(filename)))) + // To get the source line number of the actual code that threw an exception, the IP needs + // to be adjusted in certain cases. + // + // The IP of the stack frame points to either: + // + // 1) The instruction that caused a hardware exception (div by zero, null ref, etc). + // 2) The instruction after the call to an internal runtime function (FCALL like IL_Throw, + // IL_Rethrow, JIT_OverFlow, etc.) that caused a software exception. + // 3) The instruction after the call to a managed function (non-leaf node). + // + // #2 and #3 are the cases that need to adjust IP because they point after the call instruction + // and may point to the next (incorrect) IL instruction/source line. We distinguish these from + // #1 by the bAsync flag which is set to true for hardware exceptions and that it is a leaf node + // (i == 0). + // + // When the IP needs to be adjusted it is a lot simpler to decrement IP instead of trying to figure + // out the beginning of the instruction. It is enough for GetLineByOffset to return the correct line number. + // + // The unmodified IP is displayed (above by DumpMDInfoBuffer) which points after the exception in most + // cases. This means that the printed IP and the printed line number often will not map to one another + // and this is intentional. + SUCCEEDED(GetLineByOffset(TO_CDADDR(bAsync && i == 0 ? ste.ip : ste.ip - g_targetMachine->StackWalkIPAdjustOffset()), &linenum, filename, _countof(filename)))) { swprintf_s(wszLineBuffer, _countof(wszLineBuffer), W(" %s [%s @ %d]\n"), so.String(), filename, linenum); } @@ -13439,6 +13462,8 @@ class ClrStackImpl public: static void PrintThread(ULONG osID, BOOL bParams, BOOL bLocals, BOOL bSuppressLines, BOOL bGC, BOOL bFull, BOOL bDisplayRegVals) { + _ASSERTE(g_targetMachine != nullptr); + // Symbols variables ULONG symlines = 0; // symlines will be non-zero only if SYMOPT_LOAD_LINES was set in the symbol options if (!bSuppressLines && SUCCEEDED(g_ExtSymbols->GetSymbolOptions(&symlines))) @@ -13481,7 +13506,9 @@ class ClrStackImpl TableOutput out(3, POINTERSIZE_HEX, AlignRight); out.WriteRow("Child SP", "IP", "Call Site"); - + + int frameNumber = 0; + int internalFrames = 0; do { if (IsInterrupt()) @@ -13516,6 +13543,8 @@ class ClrStackImpl // Print the method/Frame info if (SUCCEEDED(frameDataResult) && FrameData.frameAddr) { + internalFrames++; + // Skip the instruction pointer because it doesn't really mean anything for method frames out.WriteColumn(1, bFull ? String("") : NativePtr(ip)); @@ -13534,8 +13563,27 @@ class ClrStackImpl } else { + // To get the source line number of the actual code that threw an exception, the IP needs + // to be adjusted in certain cases. + // + // The IP of stack frame points to either: + // + // 1) Currently executing instruction (if you hit a breakpoint or are single stepping through). + // 2) The instruction that caused a hardware exception (div by zero, null ref, etc). + // 3) The instruction after the call to an internal runtime function (FCALL like IL_Throw, + // JIT_OverFlow, etc.) that caused a software exception. + // 4) The instruction after the call to a managed function (non-leaf node). + // + // #3 and #4 are the cases that need IP adjusted back because they point after the call instruction + // and may point to the next (incorrect) IL instruction/source line. We distinguish these from #1 + // or #2 by either being non-leaf node stack frame (#4) or the present of an internal stack frame (#3). + bool bAdjustIPForLineNumber = frameNumber > 0 || internalFrames > 0; + frameNumber++; + + // The unmodified IP is displayed which points after the exception in most cases. This means that the + // printed IP and the printed line number often will not map to one another and this is intentional. out.WriteColumn(1, InstructionPtr(ip)); - out.WriteColumn(2, MethodNameFromIP(ip, bSuppressLines, bFull, bFull)); + out.WriteColumn(2, MethodNameFromIP(ip, bSuppressLines, bFull, bFull, bAdjustIPForLineNumber)); // Print out gc references. refCount will be zero if bGC is false (or if we // failed to fetch gc reference information). diff --git a/src/SOS/Strike/util.cpp b/src/SOS/Strike/util.cpp index 4bde52925d..6cdae98c51 100644 --- a/src/SOS/Strike/util.cpp +++ b/src/SOS/Strike/util.cpp @@ -5169,7 +5169,7 @@ WString GetFrameFromAddress(TADDR frameAddr, IXCLRDataStackWalk *pStackWalk, BOO return frameOutput; } -WString MethodNameFromIP(CLRDATA_ADDRESS ip, BOOL bSuppressLines, BOOL bAssemblyName, BOOL bDisplacement) +WString MethodNameFromIP(CLRDATA_ADDRESS ip, BOOL bSuppressLines, BOOL bAssemblyName, BOOL bDisplacement, BOOL bAdjustIPForLineNumber) { ULONG linenum; WString methodOutput; @@ -5242,7 +5242,9 @@ WString MethodNameFromIP(CLRDATA_ADDRESS ip, BOOL bSuppressLines, BOOL bAssembly ArrayHolder wszFileName = new WCHAR[MAX_LONGPATH]; if (!bSuppressLines && - SUCCEEDED(GetLineByOffset(TO_CDADDR(ip), &linenum, wszFileName, MAX_LONGPATH))) + // If the IP needs to be adjusted, it is a lot simpler to decrement IP instead of trying to figure out + // the beginning of the instruction. It is enough for GetLineByOffset to return the correct line number. + SUCCEEDED(GetLineByOffset(TO_CDADDR(bAdjustIPForLineNumber ? ip - g_targetMachine->StackWalkIPAdjustOffset() : ip), &linenum, wszFileName, MAX_LONGPATH))) { methodOutput += WString(W(" [")) + wszFileName + W(" @ ") + Decimal(linenum) + W("]"); } diff --git a/src/SOS/Strike/util.h b/src/SOS/Strike/util.h index 92666b8a15..28b6cccda1 100644 --- a/src/SOS/Strike/util.h +++ b/src/SOS/Strike/util.h @@ -2589,7 +2589,7 @@ typedef struct _CROSS_PLATFORM_CONTEXT { WString BuildRegisterOutput(const SOSStackRefData &ref, bool printObj = true); -WString MethodNameFromIP(CLRDATA_ADDRESS methodDesc, BOOL bSuppressLines = FALSE, BOOL bAssemblyName = FALSE, BOOL bDisplacement = FALSE); +WString MethodNameFromIP(CLRDATA_ADDRESS methodDesc, BOOL bSuppressLines = FALSE, BOOL bAssemblyName = FALSE, BOOL bDisplacement = FALSE, BOOL bAdjustIPForLineNumber = FALSE); HRESULT GetGCRefs(ULONG osID, SOSStackRefData **ppRefs, unsigned int *pRefCnt, SOSStackRefError **ppErrors, unsigned int *pErrCount); WString GetFrameFromAddress(TADDR frameAddr, IXCLRDataStackWalk *pStackwalk = NULL, BOOL bAssemblyName = FALSE); diff --git a/src/Tools/dotnet-dump/Analyzer.cs b/src/Tools/dotnet-dump/Analyzer.cs index b48a758102..339901db54 100644 --- a/src/Tools/dotnet-dump/Analyzer.cs +++ b/src/Tools/dotnet-dump/Analyzer.cs @@ -183,7 +183,10 @@ private ClrRuntime CreateRuntime(DataTarget target) string dacFilePath = GetDacFile(clrInfo); try { - runtime = clrInfo.CreateRuntime(dacFilePath); + // Ignore the DAC version mismatch that can happen on Linux because the clrmd ELF dump + // reader returns 0.0.0.0 for the runtime module that the DAC is matched against. This + // will be fixed in clrmd 2.0 but not 1.1. + runtime = clrInfo.CreateRuntime(dacFilePath, ignoreMismatch: RuntimeInformation.IsOSPlatform(OSPlatform.Linux)); } catch (DllNotFoundException ex) { @@ -240,7 +243,7 @@ private string GetDacFile(ClrInfo clrInfo) if (_dacFilePath == null) { - throw new FileNotFoundException("Could not find matching DAC for this runtime: {0}", clrInfo.ModuleInfo.FileName); + throw new FileNotFoundException($"Could not find matching DAC for this runtime: {clrInfo.ModuleInfo.FileName}"); } _isDesktop = clrInfo.Flavor == ClrFlavor.Desktop; } From 44fe9873fe9905d9d3c4b6d1309364e36918e278 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2020 13:40:22 +0000 Subject: [PATCH 069/243] Update dependencies from https://github.com/dotnet/runtime build 20200113.7 (#747) - Microsoft.NETCore.App - 5.0.0-alpha.1.20063.7 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a324294b96..b2837e1e8b 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 250782df013aa8586e21bb225f8efd715372dcf1 - + https://github.com/dotnet/runtime - 773f64296d3c6932f716ae6c8932662ade93b284 + 05909c4ae8ea0a3bf1093c08323ddbacb34f715f https://github.com/aspnet/AspNetCore diff --git a/eng/Versions.props b/eng/Versions.props index 7d8c8a479e..a01be126cd 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -15,7 +15,7 @@ $(MicrosoftNETCoreApp30Version) 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20062.3 + 5.0.0-alpha.1.20063.7 5.0.0-alpha.1.20056.6 From 9f8bb3677682a76dba36ecac1a87139fcc2d04bd Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2020 14:00:50 +0000 Subject: [PATCH 070/243] Update dependencies from https://github.com/dotnet/runtime build 20200114.4 (#750) - Microsoft.NETCore.App - 5.0.0-alpha.1.20064.4 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index b2837e1e8b..6687dc0636 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 250782df013aa8586e21bb225f8efd715372dcf1 - + https://github.com/dotnet/runtime - 05909c4ae8ea0a3bf1093c08323ddbacb34f715f + f57d49bb711fda8ac0bd231229d91919f4fca8e8 https://github.com/aspnet/AspNetCore diff --git a/eng/Versions.props b/eng/Versions.props index a01be126cd..79abb9dfb8 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -15,7 +15,7 @@ $(MicrosoftNETCoreApp30Version) 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20063.7 + 5.0.0-alpha.1.20064.4 5.0.0-alpha.1.20056.6 From 06892619ac9a6891116e845cfc3ba2074d939e59 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2020 09:21:10 -0800 Subject: [PATCH 071/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200114.4 (#751) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.20064.4 Co-authored-by: Mike McLaughlin --- eng/Version.Details.xml | 6 +++--- eng/Versions.props | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6687dc0636..414d62d556 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime f57d49bb711fda8ac0bd231229d91919f4fca8e8 - - https://github.com/aspnet/AspNetCore - c17ce436b8703470231e7979cead042f5682c3f5 + + https://github.com/dotnet/aspnetcore + deceebc062af5a51e53cf6a8cb539da118d46484 diff --git a/eng/Versions.props b/eng/Versions.props index 79abb9dfb8..e690d6e846 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) 5.0.0-alpha.1.20064.4 - 5.0.0-alpha.1.20056.6 + 5.0.0-alpha.1.20064.4 From 6b6b723129856c69c0b61f7ea89563d7fae9bf7f Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Wed, 15 Jan 2020 14:52:49 -0800 Subject: [PATCH 072/243] Change Versions.props so darc updates don't conflict (#752) --- eng/Versions.props | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/eng/Versions.props b/eng/Versions.props index e690d6e846..96661f043d 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -15,7 +15,11 @@ $(MicrosoftNETCoreApp30Version) 3.1.0 $(MicrosoftNETCoreApp31Version) + + 5.0.0-alpha.1.20064.4 + + 5.0.0-alpha.1.20064.4 From 6391155fa77613fd361885bc31948c32b7fafe6d Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 16 Jan 2020 13:44:43 +0000 Subject: [PATCH 073/243] Update dependencies from https://github.com/dotnet/runtime build 20200115.4 (#755) - Microsoft.NETCore.App - 5.0.0-alpha.1.20065.4 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 414d62d556..92c9beae5c 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 250782df013aa8586e21bb225f8efd715372dcf1 - + https://github.com/dotnet/runtime - f57d49bb711fda8ac0bd231229d91919f4fca8e8 + 5c9338e09ad0a2f282c3dd14b0cc06aab37887a0 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 96661f043d..9e13dc2969 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -15,10 +15,8 @@ $(MicrosoftNETCoreApp30Version) 3.1.0 $(MicrosoftNETCoreApp31Version) - - 5.0.0-alpha.1.20064.4 - + 5.0.0-alpha.1.20065.4 5.0.0-alpha.1.20064.4 From 78cbef38898f6d2ee6488ea0d00e3c81f145f3bc Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Thu, 16 Jan 2020 16:02:10 -0800 Subject: [PATCH 074/243] Build Windows arm64 version of SOS. (#754) Build Windows arm64 version of SOS. Make sure that the "BuildArch" msbuild property is always passed to managed and native builds. Add the arm64 SOS to the various packages and zip files. The diasymreader package for Windows PDB support is currently disabled for arm64 waiting for issue https://github.com/dotnet/diagnostics/issues/324 to be addressed. --- .vsts-dotnet.yml | 14 ++++++++++++++ eng/Build-Native.cmd | 15 +++++++++------ eng/build.ps1 | 4 ++-- src/SOS/CMakeLists.txt | 4 +++- src/SOS/SOS.NETCore/CMakeLists.txt | 5 ++++- src/SOS/SOS.NETCore/SOS.NETCore.csproj | 3 ++- src/SOS/SOS.Package/SOS.Package.csproj | 17 +++++++++++++++++ src/SOS/SOS.Package/SOS.Symbol.Package.csproj | 3 +++ src/SOS/Strike/hostcoreclr.cpp | 4 ++-- src/SOS/Strike/util.h | 4 +--- src/sos-packaging.props | 12 ++++++++++++ 11 files changed, 69 insertions(+), 16 deletions(-) diff --git a/.vsts-dotnet.yml b/.vsts-dotnet.yml index 87b5ae13df..43ba18a7a5 100644 --- a/.vsts-dotnet.yml +++ b/.vsts-dotnet.yml @@ -29,6 +29,11 @@ jobs: _BuildConfig: Release _BuildArch: arm _PublishArtifacts: bin/Windows_NT.arm.Release + Build_Release_arm64: + _BuildOnly: true + _BuildConfig: Release + _BuildArch: arm64 + _PublishArtifacts: bin/Windows_NT.arm64.Release - template: /eng/build.yml parameters: @@ -253,6 +258,15 @@ jobs: targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Windows_NT.arm.Release' condition: succeeded() + # Windows arm64 download + + - task: DownloadPipelineArtifact@2 + displayName: Download Windows Arm64 Artifacts + inputs: + artifactName: Windows_arm64_Release + targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Windows_NT.arm64.Release' + condition: succeeded() + # Linux x64 download - task: DownloadPipelineArtifact@2 diff --git a/eng/Build-Native.cmd b/eng/Build-Native.cmd index e8f4082386..bdd4b942a2 100644 --- a/eng/Build-Native.cmd +++ b/eng/Build-Native.cmd @@ -123,6 +123,9 @@ if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir% set "__CMakeBinDir=%__BinDir%" set "__CMakeBinDir=%__CMakeBinDir:\=/%" +:: Common msbuild arguments +set "__CommonBuildArgs=/v:!__Verbosity! /p:Configuration=%__BuildType% /p:BuildArch=%__BuildArch% %__UnprocessedBuildArgs%" + if not exist "%__BinDir%" md "%__BinDir%" if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%" if not exist "%__LogDir%" md "%__LogDir%" @@ -174,13 +177,13 @@ if /i %__BuildCrossArch% EQU 1 ( echo Generating Version Header set __GenerateVersionRestoreLog="%__LogDir%\GenerateVersionRestore.binlog" - "%__DotNetCli%" msbuild "%__ProjectDir%\eng\CreateVersionFile.csproj" /v:!__Verbosity! /bl:!__GenerateVersionRestoreLog! /t:Restore /p:Configuration=%__BuildType% /p:Platform=%__BuildArch% %__UnprocessedBuildArgs% + "%__DotNetCli%" msbuild "%__ProjectDir%\eng\CreateVersionFile.csproj" /bl:!__GenerateVersionRestoreLog! /t:Restore %__CommonBuildArgs% if not !errorlevel! == 0 ( echo Generate Version Restore FAILED exit /b 1 ) set __GenerateVersionLog="%__LogDir%\GenerateVersion.binlog" - "%__DotNetCli%" msbuild "%__ProjectDir%\eng\CreateVersionFile.csproj" /v:!__Verbosity! /bl:!__GenerateVersionLog! /t:GenerateVersionFiles /p:FileVersionFile=%__RootBinDir%\bin\FileVersion.txt /p:GenerateVersionHeader=true /p:NativeVersionHeaderFile=%__CrossCompIntermediatesDir%\_version.h /p:Configuration=%__BuildType% /p:Platform=%__BuildArch% %__UnprocessedBuildArgs% + "%__DotNetCli%" msbuild "%__ProjectDir%\eng\CreateVersionFile.csproj" /bl:!__GenerateVersionLog! /t:GenerateVersionFiles /p:FileVersionFile=%__RootBinDir%\bin\FileVersion.txt /p:GenerateVersionHeader=true /p:NativeVersionHeaderFile=%__CrossCompIntermediatesDir%\_version.h %__CommonBuildArgs% if not !errorlevel! == 0 ( echo Generate Version Header FAILED exit /b 1 @@ -209,7 +212,7 @@ if /i %__BuildCrossArch% EQU 1 ( set __BuildLog="%__LogDir%\Cross.Build.binlog" :: MSBuild.exe is the only one that has the C++ targets. "%__DotNetCli% msbuild" fails because VCTargetsPath isn't defined. - msbuild.exe %__CrossCompIntermediatesDir%\install.vcxproj /v:!__Verbosity! /bl:!__BuildLog! /p:Configuration=%__BuildType% /p:Platform=%__CrossArch% %__UnprocessedBuildArgs% + msbuild.exe %__CrossCompIntermediatesDir%\install.vcxproj /bl:!__BuildLog! %__CommonBuildArgs% if not !ERRORLEVEL! == 0 ( echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details: @@ -258,13 +261,13 @@ if %__Build% EQU 1 ( echo Generating Version Header set __GenerateVersionRestoreLog="%__LogDir%\GenerateVersionRestore.binlog" - "%__DotNetCli%" msbuild "%__ProjectDir%\eng\CreateVersionFile.csproj" /v:!__Verbosity! /bl:!__GenerateVersionRestoreLog! /t:Restore /p:Configuration=%__BuildType% /p:Platform=%__BuildArch% %__UnprocessedBuildArgs% + "%__DotNetCli%" msbuild "%__ProjectDir%\eng\CreateVersionFile.csproj" /bl:!__GenerateVersionRestoreLog! /t:Restore %__CommonBuildArgs% if not !errorlevel! == 0 ( echo Generate Version Restore FAILED exit /b 1 ) set __GenerateVersionLog="%__LogDir%\GenerateVersion.binlog" - "%__DotNetCli%" msbuild "%__ProjectDir%\eng\CreateVersionFile.csproj" /v:!__Verbosity! /bl:!__GenerateVersionLog! /t:GenerateVersionFiles /p:FileVersionFile=%__RootBinDir%\bin\FileVersion.txt /p:GenerateVersionHeader=true /p:NativeVersionHeaderFile=%__IntermediatesDir%\_version.h /p:Configuration=%__BuildType% /p:Platform=%__BuildArch% %__UnprocessedBuildArgs% + "%__DotNetCli%" msbuild "%__ProjectDir%\eng\CreateVersionFile.csproj" /bl:!__GenerateVersionLog! /t:GenerateVersionFiles /p:FileVersionFile=%__RootBinDir%\bin\FileVersion.txt /p:GenerateVersionHeader=true /p:NativeVersionHeaderFile=%__IntermediatesDir%\_version.h %__CommonBuildArgs% if not !errorlevel! == 0 ( echo Generate Version Header FAILED exit /b 1 @@ -292,7 +295,7 @@ if %__Build% EQU 1 ( set __BuildLog="%__LogDir%\Native.Build.binlog" :: MSBuild.exe is the only one that has the C++ targets. "%__DotNetCli% msbuild" fails because VCTargetsPath isn't defined. - msbuild.exe %__IntermediatesDir%\install.vcxproj /v:!__Verbosity! /bl:!__BuildLog! /p:Configuration=%__BuildType% /p:Platform=%__BuildArch% %__UnprocessedBuildArgs% + msbuild.exe %__IntermediatesDir%\install.vcxproj /bl:!__BuildLog! %__CommonBuildArgs% if not !ERRORLEVEL! == 0 ( echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details: diff --git a/eng/build.ps1 b/eng/build.ps1 index 7521165a17..8f32731eba 100644 --- a/eng/build.ps1 +++ b/eng/build.ps1 @@ -52,7 +52,7 @@ if ($ci) { # Install sdk for building, restore and build managed components. if (-not $skipmanaged) { - Invoke-Expression "& `"$engroot\common\build.ps1`" -build -configuration $configuration -verbosity $verbosity /p:TestArchitectures=$architecture $remainingargs" + Invoke-Expression "& `"$engroot\common\build.ps1`" -build -binaryLog -configuration $configuration -verbosity $verbosity /p:BuildArch=$architecture /p:TestArchitectures=$architecture $remainingargs" if ($lastExitCode -ne 0) { exit $lastExitCode } @@ -69,7 +69,7 @@ if (-not $skipnative) { # Run the xunit tests if ($test -or $dailytest) { if (-not $crossbuild) { - & "$engroot\common\build.ps1" -test -configuration $configuration -verbosity $verbosity -ci:$ci /bl:$logdir\Test.binlog /p:TestArchitectures=$architecture /p:BuildArch=$architecture /p:DailyTest=$dailyTest + & "$engroot\common\build.ps1" -test -configuration $configuration -verbosity $verbosity -ci:$ci /bl:$logdir\Test.binlog /p:BuildArch=$architecture /p:TestArchitectures=$architecture /p:DailyTest=$dailyTest if ($lastExitCode -ne 0) { exit $lastExitCode } diff --git a/src/SOS/CMakeLists.txt b/src/SOS/CMakeLists.txt index 07cf24bd60..c6578d7595 100644 --- a/src/SOS/CMakeLists.txt +++ b/src/SOS/CMakeLists.txt @@ -11,7 +11,9 @@ if(WIN32) add_compile_options(/Zl) # omit default library name in .OBJ add_subdirectory(runcommand) - add_subdirectory(SOS.UnitTests/Debuggees/DesktopClrHost) + if(NOT CLR_CMAKE_TARGET_ARCH_ARM64) + add_subdirectory(SOS.UnitTests/Debuggees/DesktopClrHost) + endif() endif(WIN32) add_definitions(-D_SECURE_SCL=0) diff --git a/src/SOS/SOS.NETCore/CMakeLists.txt b/src/SOS/SOS.NETCore/CMakeLists.txt index e92f5891f8..bc8caa12d0 100644 --- a/src/SOS/SOS.NETCore/CMakeLists.txt +++ b/src/SOS/SOS.NETCore/CMakeLists.txt @@ -22,5 +22,8 @@ if(NOT ${NUGET_PACKAGES} STREQUAL "") set(DIASYMREADER_ARCH amd64) endif() - install(FILES ${NUGET_PACKAGES}/microsoft.diasymreader.native/1.7.0/runtimes/win/native/Microsoft.DiaSymReader.Native.${DIASYMREADER_ARCH}.dll DESTINATION . ) + # Until issue https://github.com/dotnet/diagnostics/issues/324 is done there is no arm64 version of the diasymreader in this package + if(NOT CLR_CMAKE_TARGET_ARCH_ARM64) + install(FILES ${NUGET_PACKAGES}/microsoft.diasymreader.native/1.7.0/runtimes/win/native/Microsoft.DiaSymReader.Native.${DIASYMREADER_ARCH}.dll DESTINATION . ) + endif() endif() diff --git a/src/SOS/SOS.NETCore/SOS.NETCore.csproj b/src/SOS/SOS.NETCore/SOS.NETCore.csproj index 74decf10c1..d4487ca8a5 100644 --- a/src/SOS/SOS.NETCore/SOS.NETCore.csproj +++ b/src/SOS/SOS.NETCore/SOS.NETCore.csproj @@ -12,6 +12,7 @@ - + + diff --git a/src/SOS/SOS.Package/SOS.Package.csproj b/src/SOS/SOS.Package/SOS.Package.csproj index fa13882087..d429cbbbe7 100644 --- a/src/SOS/SOS.Package/SOS.Package.csproj +++ b/src/SOS/SOS.Package/SOS.Package.csproj @@ -41,6 +41,7 @@ + @@ -110,6 +111,18 @@ $(GallerySubDir)\win-arm + + + $(GallerySubDir)\win-arm64 + + + + $(GallerySubDir)\win-arm64 + @@ -138,6 +151,10 @@ $(SymbolsDir)\win-arm + + + $(SymbolsDir)\win-arm64 + diff --git a/src/SOS/SOS.Package/SOS.Symbol.Package.csproj b/src/SOS/SOS.Package/SOS.Symbol.Package.csproj index c1f326b0d7..cf0e5a0c8b 100644 --- a/src/SOS/SOS.Package/SOS.Symbol.Package.csproj +++ b/src/SOS/SOS.Package/SOS.Symbol.Package.csproj @@ -27,6 +27,9 @@ $(SOSPackagePathPrefix)/win-arm + + $(SOSPackagePathPrefix)/win-arm64 + $(SOSPackagePathPrefix)/linux-x64 diff --git a/src/SOS/Strike/hostcoreclr.cpp b/src/SOS/Strike/hostcoreclr.cpp index 62e4dc1944..ea44f8431a 100644 --- a/src/SOS/Strike/hostcoreclr.cpp +++ b/src/SOS/Strike/hostcoreclr.cpp @@ -992,7 +992,7 @@ HRESULT SymbolReader::LoadSymbolsForWindowsPDB(___in IMetaDataImport* pMD, ___in size_t lastSlash = diasymreaderPath.rfind(DIRECTORY_SEPARATOR_CHAR_A); if (lastSlash == std::string::npos) { - ExtErr("Error: Failed to parse sos module name\n"); + ExtErr("Error: Failed to parse SOS module name\n"); return E_FAIL; } diasymreaderPath.erase(lastSlash + 1); @@ -1001,7 +1001,7 @@ HRESULT SymbolReader::LoadSymbolsForWindowsPDB(___in IMetaDataImport* pMD, ___in // We now need a binder object that will take the module and return a if (FAILED(Status = CreateInstanceFromPath(CLSID_CorSymBinder_SxS, IID_ISymUnmanagedBinder3, diasymreaderPath.c_str(), &g_hmoduleSymBinder, (void**)&g_pSymBinder))) { - ExtOut("SOS error: Unable to find the diasymreader module/interface %08x at %s\n", Status, diasymreaderPath.c_str()); + ExtDbgOut("SOS error: Unable to find the diasymreader module/interface %08x at %s\n", Status, diasymreaderPath.c_str()); return Status; } OnUnloadTask::Register(CleanupSymBinder); diff --git a/src/SOS/Strike/util.h b/src/SOS/Strike/util.h index 28b6cccda1..6c2fde13e0 100644 --- a/src/SOS/Strike/util.h +++ b/src/SOS/Strike/util.h @@ -97,9 +97,7 @@ DECLARE_HANDLE(OBJECTHANDLE); #elif defined(_ARM_) #define NATIVE_SYMBOL_READER_DLL "Microsoft.DiaSymReader.Native.arm.dll" #elif defined(_ARM64_) -// Use diasymreader until the package has an arm64 version - issue #7360 -//#define NATIVE_SYMBOL_READER_DLL "Microsoft.DiaSymReader.Native.arm64.dll" -#define NATIVE_SYMBOL_READER_DLL "diasymreader.dll" +#define NATIVE_SYMBOL_READER_DLL "Microsoft.DiaSymReader.Native.arm64.dll" #endif // PREFIX macros - Begin diff --git a/src/sos-packaging.props b/src/sos-packaging.props index ff43ddee83..de482365cb 100644 --- a/src/sos-packaging.props +++ b/src/sos-packaging.props @@ -39,6 +39,18 @@ $(SOSPackagePathPrefix)/win-arm + + $(SOSPackagePathPrefix)/win-arm64 + + + $(SOSPackagePathPrefix)/win-arm64 + + + $(SOSPackagePathPrefix)/linux-x64 From 0e710642ff196fc8c2d5b38ca6e605bdd962fa83 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 17 Jan 2020 13:44:00 +0000 Subject: [PATCH 075/243] Update dependencies from https://github.com/dotnet/runtime build 20200116.11 (#757) - Microsoft.NETCore.App - 5.0.0-alpha.1.20066.11 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 92c9beae5c..ecea390e1d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 250782df013aa8586e21bb225f8efd715372dcf1 - + https://github.com/dotnet/runtime - 5c9338e09ad0a2f282c3dd14b0cc06aab37887a0 + 4db72366e8e49c30d7aa6d2cc920cf063fb911ea https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 9e13dc2969..8308c8b980 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20065.4 + 5.0.0-alpha.1.20066.11 5.0.0-alpha.1.20064.4 From 914b6d821c7ce7a28706ed91d6aa34c7dbb48c53 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 18 Jan 2020 13:50:14 +0000 Subject: [PATCH 076/243] Update dependencies from https://github.com/dotnet/runtime build 20200117.9 (#759) - Microsoft.NETCore.App - 5.0.0-alpha.1.20067.9 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ecea390e1d..1945b79fb4 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 250782df013aa8586e21bb225f8efd715372dcf1 - + https://github.com/dotnet/runtime - 4db72366e8e49c30d7aa6d2cc920cf063fb911ea + c4bddfbe85c0ba3498a1129ec560eb24d2f1df85 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 8308c8b980..bf7afafff9 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20066.11 + 5.0.0-alpha.1.20067.9 5.0.0-alpha.1.20064.4 From 287376d3c89237df1574de12550338322329eadd Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 18 Jan 2020 13:51:30 +0000 Subject: [PATCH 077/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200117.2 (#760) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.20067.2 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1945b79fb4..dd44cc8a2d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime c4bddfbe85c0ba3498a1129ec560eb24d2f1df85 - + https://github.com/dotnet/aspnetcore - deceebc062af5a51e53cf6a8cb539da118d46484 + c848c33cfa392f118b31523ac7692318ef142d85 diff --git a/eng/Versions.props b/eng/Versions.props index bf7afafff9..01f5b50fd2 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20067.9 - 5.0.0-alpha.1.20064.4 + 5.0.0-alpha.1.20067.2 From 28a8d0747d193e2edcff72a47a7ab95c8ce1c80a Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sun, 19 Jan 2020 13:47:25 +0000 Subject: [PATCH 078/243] Update dependencies from https://github.com/dotnet/runtime build 20200118.4 (#762) - Microsoft.NETCore.App - 5.0.0-alpha.1.20068.4 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index dd44cc8a2d..d208a90017 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 250782df013aa8586e21bb225f8efd715372dcf1 - + https://github.com/dotnet/runtime - c4bddfbe85c0ba3498a1129ec560eb24d2f1df85 + 339b44734dad126a1241a10511ec1c5ecd1f41cf https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 01f5b50fd2..506164d2f8 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20067.9 + 5.0.0-alpha.1.20068.4 5.0.0-alpha.1.20067.2 From eb41d79d6f467500e3e3b673812e93813519049d Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2020 13:31:25 +0000 Subject: [PATCH 079/243] Update dependencies from https://github.com/dotnet/arcade build 20200118.1 (#763) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.20068.1 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.20068.1 --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 2 +- global.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index d208a90017..0ae1995698 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,15 +4,15 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - 250782df013aa8586e21bb225f8efd715372dcf1 + ebc71292545adda514c1e6a5657cd9ab753240bc - + https://github.com/dotnet/arcade - 250782df013aa8586e21bb225f8efd715372dcf1 + ebc71292545adda514c1e6a5657cd9ab753240bc https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 506164d2f8..253fa068f8 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -40,7 +40,7 @@ 4.5.3 2.4.1 2.0.3 - 5.0.0-beta.20062.1 + 5.0.0-beta.20068.1 10.0.18362 diff --git a/global.json b/global.json index f73caf35b1..51eb1928cf 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "dotnet": "3.0.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20062.1" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20068.1" } } From e41310424d8cfa3eaf9a61373c15722b97b9fe63 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2020 13:34:13 +0000 Subject: [PATCH 080/243] Update dependencies from https://github.com/dotnet/runtime build 20200119.2 (#764) - Microsoft.NETCore.App - 5.0.0-alpha.1.20069.2 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 0ae1995698..32082ef3d7 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade ebc71292545adda514c1e6a5657cd9ab753240bc - + https://github.com/dotnet/runtime - 339b44734dad126a1241a10511ec1c5ecd1f41cf + cd622cd50c7104fc14a25fb199f8377472920f2e https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 253fa068f8..b3bf62b925 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20068.4 + 5.0.0-alpha.1.20069.2 5.0.0-alpha.1.20067.2 From a8364c6f244e78e472c2deeec59c4de85d1855ef Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2020 13:54:13 +0000 Subject: [PATCH 081/243] Update dependencies from https://github.com/dotnet/runtime build 20200120.4 (#765) - Microsoft.NETCore.App - 5.0.0-alpha.1.20070.4 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 32082ef3d7..e954811ee6 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade ebc71292545adda514c1e6a5657cd9ab753240bc - + https://github.com/dotnet/runtime - cd622cd50c7104fc14a25fb199f8377472920f2e + 46d7becc6c59ed6cd101824814055b360337a702 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index b3bf62b925..a0fa17eba1 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20069.2 + 5.0.0-alpha.1.20070.4 5.0.0-alpha.1.20067.2 From e0c4ffe291dec2c7b518d7b0c6e0516cbf1629bb Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2020 13:55:53 +0000 Subject: [PATCH 082/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200120.2 (#766) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.20070.2 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e954811ee6..4d563e1cfa 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime 46d7becc6c59ed6cd101824814055b360337a702 - + https://github.com/dotnet/aspnetcore - c848c33cfa392f118b31523ac7692318ef142d85 + 53a07c95a314c1e9476b7831dfea906e053fccce diff --git a/eng/Versions.props b/eng/Versions.props index a0fa17eba1..214a90fc4a 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20070.4 - 5.0.0-alpha.1.20067.2 + 5.0.0-alpha.1.20070.2 From 3c598ab6337113ec9be3071762a9892d956a2247 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Tue, 21 Jan 2020 14:40:27 -0800 Subject: [PATCH 083/243] Misc SOS fixes (#758) Misc SOS fixes Change "dbgout" command not to require EE or DAC (use INIT_API_EXT). Fix case where the DAC is already in the temp directory because of a loadsymbols command when symlink'ing it on Linux. Allow just setsymbolserver -log without any other options. --- .../Scripts/OtherCommands.script | 2 +- src/SOS/Strike/runtime.cpp | 15 ++++++-- src/SOS/Strike/strike.cpp | 4 +-- src/SOS/Strike/util.cpp | 36 ++++++++++--------- 4 files changed, 34 insertions(+), 23 deletions(-) diff --git a/src/SOS/SOS.UnitTests/Scripts/OtherCommands.script b/src/SOS/SOS.UnitTests/Scripts/OtherCommands.script index 7c264db535..f3f5a29e6e 100644 --- a/src/SOS/SOS.UnitTests/Scripts/OtherCommands.script +++ b/src/SOS/SOS.UnitTests/Scripts/OtherCommands.script @@ -95,7 +95,7 @@ SOSCOMMAND:DumpAssembly \s*Assembly:\s+()\s+\[.* VERIFY:\s*Parent Domain:\s+\s+ VERIFY:\s*Name:\s+.*(System\.Private\.CoreLib(\.ni)?\.dll|mscorlib.dll)\s+ -SOSCOMMAND:DumpModule \s+Module Name\s+()\s+.* +SOSCOMMAND:DumpModule \s+Module\s+()\s+.* VERIFY:\s*PEFile:\s+\s+ VERIFY:\s*ModuleId:\s+\s+ VERIFY:\s*LoaderHeap:\s+\s+ diff --git a/src/SOS/Strike/runtime.cpp b/src/SOS/Strike/runtime.cpp index 04d48bfa09..76505769bc 100644 --- a/src/SOS/Strike/runtime.cpp +++ b/src/SOS/Strike/runtime.cpp @@ -307,14 +307,23 @@ LPCSTR Runtime::GetDacFilePath() std::string dacSymLink(tmpPath); dacSymLink.append(NETCORE_DAC_DLL_NAME_A); - int error = symlink(dacModulePath.c_str(), dacSymLink.c_str()); - if (error == 0) + // Check if the DAC file already exists in the temp directory because + // of a "loadsymbols" command which downloads everything. + if (access(dacSymLink.c_str(), F_OK) == 0) { dacModulePath.assign(dacSymLink); } else { - ExtErr("symlink(%s, %s) FAILED %s\n", dacModulePath.c_str(), dacSymLink.c_str(), strerror(errno)); + int error = symlink(dacModulePath.c_str(), dacSymLink.c_str()); + if (error == 0) + { + dacModulePath.assign(dacSymLink); + } + else + { + ExtErr("symlink(%s, %s) FAILED %s\n", dacModulePath.c_str(), dacSymLink.c_str(), strerror(errno)); + } } } #endif diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 4efa101bbc..94f857b221 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -14553,7 +14553,7 @@ DECLARE_API(SaveModule) DECLARE_API(dbgout) { - INIT_API(); + INIT_API_EXT(); BOOL bOff = FALSE; @@ -16018,7 +16018,7 @@ DECLARE_API(SetSymbolServer) DisableSymbolStore(); } - if (msdl || symweb || symbolServer.data != nullptr || symbolCache.data != nullptr || searchDirectory.data != nullptr || windowsSymbolPath.data != nullptr) + if (logging || msdl || symweb || symbolServer.data != nullptr || symbolCache.data != nullptr || searchDirectory.data != nullptr || windowsSymbolPath.data != nullptr) { Status = InitializeSymbolStore(logging, msdl, symweb, symbolServer.data, (int)timeoutInMinutes, symbolCache.data, searchDirectory.data, windowsSymbolPath.data); if (FAILED(Status)) diff --git a/src/SOS/Strike/util.cpp b/src/SOS/Strike/util.cpp index 6cdae98c51..0c6be1383a 100644 --- a/src/SOS/Strike/util.cpp +++ b/src/SOS/Strike/util.cpp @@ -1497,7 +1497,7 @@ void AssemblyInfo(DacpAssemblyData *pAssembly) ExtOut("ClassLoader: %p\n", SOS_PTR(pAssembly->ClassLoader)); if ((ULONG64)pAssembly->AssemblySecDesc != NULL) ExtOut("SecurityDescriptor: %p\n", SOS_PTR(pAssembly->AssemblySecDesc)); - ExtOut(" Module Name\n"); + ExtOut(" Module\n"); ArrayHolder Modules = new CLRDATA_ADDRESS[pAssembly->ModuleCount]; if (Modules == NULL @@ -1507,17 +1507,16 @@ void AssemblyInfo(DacpAssemblyData *pAssembly) return; } - for (UINT n=0;nModuleCount;n++) + for (UINT n = 0; n < pAssembly->ModuleCount; n++) { if (IsInterrupt()) { return; } - CLRDATA_ADDRESS ModuleAddr = Modules[n]; - DMLOut("%s " WIN86_8SPACES, DMLModule(ModuleAddr)); + DMLOut(" %s " WIN86_8SPACES, DMLModule(ModuleAddr)); DacpModuleData moduleData; - if (moduleData.Request(g_sos,ModuleAddr)==S_OK) + if (moduleData.Request(g_sos, ModuleAddr) == S_OK) { WCHAR fileName[MAX_LONGPATH]; FileNameForModule (&moduleData, fileName); @@ -1530,6 +1529,10 @@ void AssemblyInfo(DacpAssemblyData *pAssembly) ExtOut("%S\n", (moduleData.bIsReflection) ? W("Dynamic Module") : W("Unknown Module")); } } + else + { + ExtOut("Request module data FAILED\n"); + } } } @@ -2131,7 +2134,7 @@ DWORD_PTR *ModuleFromName(__in_opt LPSTR mName, int *numModule) *numModule = 0; DacpAppDomainStoreData adsData; - if (adsData.Request(g_sos)!=S_OK) + if (adsData.Request(g_sos) != S_OK) return NULL; ArrayHolder pAssemblyArray = NULL; @@ -2144,8 +2147,7 @@ DWORD_PTR *ModuleFromName(__in_opt LPSTR mName, int *numModule) return NULL; } ArrayHolder pArray = new CLRDATA_ADDRESS[arrayLength]; - - if (pArray==NULL) + if (pArray == NULL) { ReportOOM(); return NULL; @@ -2156,7 +2158,7 @@ DWORD_PTR *ModuleFromName(__in_opt LPSTR mName, int *numModule) { pArray[1] = adsData.sharedDomain; } - if (g_sos->GetAppDomainList(adsData.DomainCount, pArray.GetPtr()+numSpecialDomains, NULL)!=S_OK) + if (g_sos->GetAppDomainList(adsData.DomainCount, pArray.GetPtr() + numSpecialDomains, NULL) != S_OK) { ExtOut("Unable to get array of AppDomains\n"); return NULL; @@ -2167,7 +2169,7 @@ DWORD_PTR *ModuleFromName(__in_opt LPSTR mName, int *numModule) int maxList = arrayLength; // account for system and shared domains if (maxList <= 0 || !ClrSafeInt::multiply(maxList, sizeof(PVOID), AllocSize)) { - ExtOut("Integer overflow error.\n"); + ExtOut("\n"); return NULL; } @@ -2190,7 +2192,7 @@ DWORD_PTR *ModuleFromName(__in_opt LPSTR mName, int *numModule) } DacpAppDomainData appDomain; - if (FAILED(appDomain.Request(g_sos,pArray[n]))) + if (FAILED(appDomain.Request(g_sos, pArray[n]))) { // Don't print a failure message here, there is a very normal case when checking // for modules after clr is loaded but before any AppDomains or assemblies are created @@ -2216,7 +2218,7 @@ DWORD_PTR *ModuleFromName(__in_opt LPSTR mName, int *numModule) if (FAILED(g_sos->GetAssemblyList(appDomain.AppDomainPtr, appDomain.AssemblyCount, pAssemblyArray, NULL))) { - ExtOut("Unable to get array of Assemblies for the given AppDomain..\n"); + ExtOut("Unable to get array of Assemblies for the given AppDomain\n"); goto Failure; } @@ -2231,14 +2233,14 @@ DWORD_PTR *ModuleFromName(__in_opt LPSTR mName, int *numModule) DacpAssemblyData assemblyData; if (FAILED(assemblyData.Request(g_sos, pAssemblyArray[nAssem]))) { - ExtOut("Failed to request assembly.\n"); + ExtOut("Failed to request assembly\n"); goto Failure; } pModules = new CLRDATA_ADDRESS[assemblyData.ModuleCount]; if (FAILED(g_sos->GetAssemblyModuleList(assemblyData.AssemblyPtr, assemblyData.ModuleCount, pModules, NULL))) { - ExtOut("Failed to get the modules for the given assembly.\n"); + ExtOut("Failed to get the modules for the given assembly\n"); goto Failure; } @@ -2252,10 +2254,10 @@ DWORD_PTR *ModuleFromName(__in_opt LPSTR mName, int *numModule) CLRDATA_ADDRESS ModuleAddr = pModules[nModule]; DacpModuleData ModuleData; - if (FAILED(ModuleData.Request(g_sos,ModuleAddr))) + if (FAILED(ModuleData.Request(g_sos, ModuleAddr))) { - ExtOut("Failed to request Module data from assembly.\n"); - goto Failure; + ExtDbgOut("Failed to request module data from assembly at %p\n", ModuleAddr); + continue; } if (mName != NULL) From 85eb5956b2f6765ba999d9943a0c16bbbc788b70 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 22 Jan 2020 13:53:17 +0000 Subject: [PATCH 084/243] Update dependencies from https://github.com/dotnet/runtime build 20200121.7 (#768) - Microsoft.NETCore.App - 5.0.0-alpha.1.20071.7 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4d563e1cfa..78c08190fb 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade ebc71292545adda514c1e6a5657cd9ab753240bc - + https://github.com/dotnet/runtime - 46d7becc6c59ed6cd101824814055b360337a702 + 9c82a36c23235c4d50954cb33a4d5d89b787a1aa https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 214a90fc4a..4052cbc478 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20070.4 + 5.0.0-alpha.1.20071.7 5.0.0-alpha.1.20070.2 From e8d2cbe879d72f967b6112aee99512f61b0450f2 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 22 Jan 2020 13:54:42 +0000 Subject: [PATCH 085/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200121.6 (#769) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.20071.6 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 78c08190fb..8a79ff5d70 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime 9c82a36c23235c4d50954cb33a4d5d89b787a1aa - + https://github.com/dotnet/aspnetcore - 53a07c95a314c1e9476b7831dfea906e053fccce + bc60e9576f88c1ee16dc99f18ca08278c254802d diff --git a/eng/Versions.props b/eng/Versions.props index 4052cbc478..699b83c0cb 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20071.7 - 5.0.0-alpha.1.20070.2 + 5.0.0-alpha.1.20071.6 From 327b5f9c70678da4fac17b67fa214ff0b326413b Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 23 Jan 2020 14:07:51 +0000 Subject: [PATCH 086/243] Update dependencies from https://github.com/dotnet/runtime build 20200122.3 (#773) - Microsoft.NETCore.App - 5.0.0-alpha.1.20072.3 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 8a79ff5d70..b0be8c22f5 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade ebc71292545adda514c1e6a5657cd9ab753240bc - + https://github.com/dotnet/runtime - 9c82a36c23235c4d50954cb33a4d5d89b787a1aa + c3dc1fdfdcca9bf504a68be565b053c0372ac73c https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 699b83c0cb..bdf40eccf8 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20071.7 + 5.0.0-alpha.1.20072.3 5.0.0-alpha.1.20071.6 From 07f04ae1e27520665eb8ca3cd133cb46648295b5 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 24 Jan 2020 14:01:13 +0000 Subject: [PATCH 087/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200123.2 (#775) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.20073.2 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index b0be8c22f5..2c94977cee 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime c3dc1fdfdcca9bf504a68be565b053c0372ac73c - + https://github.com/dotnet/aspnetcore - bc60e9576f88c1ee16dc99f18ca08278c254802d + 91d17f6c2dfcd4bd296a447faffc0893cdad4e9e diff --git a/eng/Versions.props b/eng/Versions.props index bdf40eccf8..6487df5616 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20072.3 - 5.0.0-alpha.1.20071.6 + 5.0.0-alpha.1.20073.2 From 36f6509abbd4f8cc4f9fae87dd24b71bfac6f21d Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 24 Jan 2020 14:04:14 +0000 Subject: [PATCH 088/243] Update dependencies from https://github.com/dotnet/runtime build 20200123.8 (#774) - Microsoft.NETCore.App - 5.0.0-alpha.1.20073.8 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2c94977cee..3ac218de8e 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade ebc71292545adda514c1e6a5657cd9ab753240bc - + https://github.com/dotnet/runtime - c3dc1fdfdcca9bf504a68be565b053c0372ac73c + 9999d4b86e0c7b0e7fbc04c24bad346397ef17ff https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 6487df5616..48b617f241 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20072.3 + 5.0.0-alpha.1.20073.8 5.0.0-alpha.1.20073.2 From 7a3e4866b5efa1ab691b584dde5636a4960f90e1 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 25 Jan 2020 14:04:31 +0000 Subject: [PATCH 089/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200124.1 (#777) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.20074.1 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 3ac218de8e..4c9c8d9fa7 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime 9999d4b86e0c7b0e7fbc04c24bad346397ef17ff - + https://github.com/dotnet/aspnetcore - 91d17f6c2dfcd4bd296a447faffc0893cdad4e9e + 9501874f3a3f2b81d8fe43d2da210948decf0ba1 diff --git a/eng/Versions.props b/eng/Versions.props index 48b617f241..83dcad0284 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20073.8 - 5.0.0-alpha.1.20073.2 + 5.0.0-alpha.1.20074.1 From 1b45bead261e29dc53bba7ee3133ea7e02f9d0d7 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 25 Jan 2020 14:07:31 +0000 Subject: [PATCH 090/243] Update dependencies from https://github.com/dotnet/runtime build 20200124.8 (#776) - Microsoft.NETCore.App - 5.0.0-alpha.1.20074.8 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4c9c8d9fa7..4ea88bcf95 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade ebc71292545adda514c1e6a5657cd9ab753240bc - + https://github.com/dotnet/runtime - 9999d4b86e0c7b0e7fbc04c24bad346397ef17ff + 98a558c97755d485866c79d1d676e88fffb14f8c https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 83dcad0284..9c7342bb71 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20073.8 + 5.0.0-alpha.1.20074.8 5.0.0-alpha.1.20074.1 From e3b5c9d374c5fc78dddba6ce438742945fedcf20 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sun, 26 Jan 2020 13:56:24 +0000 Subject: [PATCH 091/243] Update dependencies from https://github.com/dotnet/runtime build 20200125.5 (#778) - Microsoft.NETCore.App - 5.0.0-alpha.1.20075.5 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4ea88bcf95..ec0cee2f96 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade ebc71292545adda514c1e6a5657cd9ab753240bc - + https://github.com/dotnet/runtime - 98a558c97755d485866c79d1d676e88fffb14f8c + cf109642300c1acc7b885de5412f2e30669dea8e https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 9c7342bb71..33092e0de3 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20074.8 + 5.0.0-alpha.1.20075.5 5.0.0-alpha.1.20074.1 From af122d2c904a96c35ef5e1edb5ef2e0875e621a8 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sun, 26 Jan 2020 13:58:25 +0000 Subject: [PATCH 092/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200125.3 (#779) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.20075.3 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ec0cee2f96..9966809049 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime cf109642300c1acc7b885de5412f2e30669dea8e - + https://github.com/dotnet/aspnetcore - 9501874f3a3f2b81d8fe43d2da210948decf0ba1 + c180668c3565a60492a50f669bfbcef355af02ca diff --git a/eng/Versions.props b/eng/Versions.props index 33092e0de3..db917ecd5b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20075.5 - 5.0.0-alpha.1.20074.1 + 5.0.0-alpha.1.20075.3 From 594967fb6246e46653d63b02de5e7cb6c36c4919 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2020 13:41:37 +0000 Subject: [PATCH 093/243] Update dependencies from https://github.com/dotnet/arcade build 20200126.3 (#780) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.20076.3 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.20076.3 --- eng/Version.Details.xml | 8 +++--- eng/Versions.props | 2 +- eng/common/cross/build-rootfs.sh | 19 +++++++++++--- eng/common/enable-cross-org-publishing.ps1 | 9 +++++-- .../templates/post-build/post-build.yml | 26 +++++++++++++++++++ eng/common/tools.ps1 | 3 +++ global.json | 2 +- 7 files changed, 57 insertions(+), 12 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 9966809049..c261f37211 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,15 +4,15 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - ebc71292545adda514c1e6a5657cd9ab753240bc + cc8fe69635c7c6e791c87540851aea75946945fa - + https://github.com/dotnet/arcade - ebc71292545adda514c1e6a5657cd9ab753240bc + cc8fe69635c7c6e791c87540851aea75946945fa https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index db917ecd5b..200cc3feb1 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -40,7 +40,7 @@ 4.5.3 2.4.1 2.0.3 - 5.0.0-beta.20068.1 + 5.0.0-beta.20076.3 10.0.18362 diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh index 8d61377a87..a23f895ba1 100644 --- a/eng/common/cross/build-rootfs.sh +++ b/eng/common/cross/build-rootfs.sh @@ -25,8 +25,9 @@ __UbuntuPackages="build-essential" __AlpinePackages="alpine-base" __AlpinePackages+=" build-base" __AlpinePackages+=" linux-headers" -__AlpinePackages+=" lldb-dev" -__AlpinePackages+=" llvm-dev" +__AlpinePackagesEdgeTesting=" lldb-dev" +__AlpinePackagesEdgeMain=" llvm9-libs" +__AlpinePackagesEdgeMain+=" python3" # symlinks fixer __UbuntuPackages+=" symlinks" @@ -199,13 +200,23 @@ if [[ "$__LinuxCodeName" == "alpine" ]]; then tar -xf $__ApkToolsDir/apk-tools-$__ApkToolsVersion-x86_64-linux.tar.gz -C $__ApkToolsDir mkdir -p $__RootfsDir/usr/bin cp -v /usr/bin/qemu-$__QEMUArch-static $__RootfsDir/usr/bin + $__ApkToolsDir/apk-tools-$__ApkToolsVersion/apk \ -X http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion/main \ -X http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion/community \ - -X http://dl-cdn.alpinelinux.org/alpine/edge/testing \ - -X http://dl-cdn.alpinelinux.org/alpine/edge/main \ -U --allow-untrusted --root $__RootfsDir --arch $__AlpineArch --initdb \ add $__AlpinePackages + + $__ApkToolsDir/apk-tools-$__ApkToolsVersion/apk \ + -X http://dl-cdn.alpinelinux.org/alpine/edge/main \ + -U --allow-untrusted --root $__RootfsDir --arch $__AlpineArch --initdb \ + add $__AlpinePackagesEdgeMain + + $__ApkToolsDir/apk-tools-$__ApkToolsVersion/apk \ + -X http://dl-cdn.alpinelinux.org/alpine/edge/testing \ + -U --allow-untrusted --root $__RootfsDir --arch $__AlpineArch --initdb \ + add $__AlpinePackagesEdgeTesting + rm -r $__ApkToolsDir elif [[ -n $__LinuxCodeName ]]; then qemu-debootstrap --arch $__UbuntuArch $__LinuxCodeName $__RootfsDir $__UbuntuRepo diff --git a/eng/common/enable-cross-org-publishing.ps1 b/eng/common/enable-cross-org-publishing.ps1 index efa26621db..da09da4f1f 100644 --- a/eng/common/enable-cross-org-publishing.ps1 +++ b/eng/common/enable-cross-org-publishing.ps1 @@ -2,7 +2,12 @@ param( [string] $token ) + . $PSScriptRoot\pipeline-logging-functions.ps1 -Write-PipelineSetVariable -Name 'VSS_NUGET_ACCESSTOKEN' -Value $token -Write-PipelineSetVariable -Name 'VSS_NUGET_URI_PREFIXES' -Value 'https://dnceng.pkgs.visualstudio.com/;https://pkgs.dev.azure.com/dnceng/;https://devdiv.pkgs.visualstudio.com/;https://pkgs.dev.azure.com/devdiv/' +# Write-PipelineSetVariable will no-op if a variable named $ci is not defined +# Since this script is only ever called in AzDO builds, just universally set it +$ci = $true + +Write-PipelineSetVariable -Name 'VSS_NUGET_ACCESSTOKEN' -Value $token -IsMultiJobVariable $false +Write-PipelineSetVariable -Name 'VSS_NUGET_URI_PREFIXES' -Value 'https://dnceng.pkgs.visualstudio.com/;https://pkgs.dev.azure.com/dnceng/;https://devdiv.pkgs.visualstudio.com/;https://pkgs.dev.azure.com/devdiv/' -IsMultiJobVariable $false diff --git a/eng/common/templates/post-build/post-build.yml b/eng/common/templates/post-build/post-build.yml index 8a8d84f202..33295ba125 100644 --- a/eng/common/templates/post-build/post-build.yml +++ b/eng/common/templates/post-build/post-build.yml @@ -221,3 +221,29 @@ stages: transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental-symbols/nuget/v3/index.json' + +- template: \eng\common\templates\post-build\channels\generic-public-channel.yml + parameters: + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + dependsOn: ${{ parameters.publishDependsOn }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + stageName: 'Net_Eng_Services_Int_Publish' + channelName: '.NET Eng Services - Int' + channelId: 678 + transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' + shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' + symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng-symbols/nuget/v3/index.json' + +- template: \eng\common\templates\post-build\channels\generic-public-channel.yml + parameters: + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + dependsOn: ${{ parameters.publishDependsOn }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + stageName: 'Net_Eng_Services_Prod_Publish' + channelName: '.NET Eng Services - Prod' + channelId: 679 + transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' + shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' + symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng-symbols/nuget/v3/index.json' diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index d3a432878e..23a3fd53d7 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -655,6 +655,9 @@ Write-PipelineSetVariable -Name 'Artifacts.Log' -Value $LogDir Write-PipelineSetVariable -Name 'TEMP' -Value $TempDir Write-PipelineSetVariable -Name 'TMP' -Value $TempDir +$env:TEMP=$TempDir +$env:TMP=$TempDir + # Import custom tools configuration, if present in the repo. # Note: Import in global scope so that the script set top-level variables without qualification. if (!$disableConfigureToolsetImport) { diff --git a/global.json b/global.json index 51eb1928cf..3d6b07d193 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "dotnet": "3.0.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20068.1" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20076.3" } } From d9ca03a9628f0623a904f80541a137ee56cf3d84 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2020 14:05:19 +0000 Subject: [PATCH 094/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200126.1 (#782) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.20076.1 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index c261f37211..65efe0320a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime cf109642300c1acc7b885de5412f2e30669dea8e - + https://github.com/dotnet/aspnetcore - c180668c3565a60492a50f669bfbcef355af02ca + 2cc333ac3013218a3985ecd0809b0c541cbe1f91 diff --git a/eng/Versions.props b/eng/Versions.props index 200cc3feb1..565ab6c335 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20075.5 - 5.0.0-alpha.1.20075.3 + 5.0.0-alpha.1.20076.1 From ee327d196243fcb6aa333d780310400a08b4c677 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2020 14:08:14 +0000 Subject: [PATCH 095/243] Update dependencies from https://github.com/dotnet/runtime build 20200126.2 (#781) - Microsoft.NETCore.App - 5.0.0-alpha.1.20076.2 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 65efe0320a..087d895f67 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade cc8fe69635c7c6e791c87540851aea75946945fa - + https://github.com/dotnet/runtime - cf109642300c1acc7b885de5412f2e30669dea8e + e793fcc19797f407a1b7e98d5f81b04e25a551c3 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 565ab6c335..6f9157a403 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20075.5 + 5.0.0-alpha.1.20076.2 5.0.0-alpha.1.20076.1 From 0f5601c54211de1b52593bc50c6fa2b4044c3373 Mon Sep 17 00:00:00 2001 From: Andy Sterland Date: Mon, 27 Jan 2020 13:36:10 -0800 Subject: [PATCH 096/243] Changing the output text to say 'dump' rather than 'minidump' to avoid confusion with the minidump file format over in windows land. (#772) --- src/Tools/dotnet-dump/Dumper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tools/dotnet-dump/Dumper.cs b/src/Tools/dotnet-dump/Dumper.cs index 3f1c37d50e..bde84a83d1 100644 --- a/src/Tools/dotnet-dump/Dumper.cs +++ b/src/Tools/dotnet-dump/Dumper.cs @@ -49,7 +49,7 @@ public async Task Collect(IConsole console, int processId, string output, b output = Path.GetFullPath(output); // Display the type of dump and dump path - string dumpTypeMessage = type == DumpTypeOption.Mini ? "minidump" : "minidump with heap"; + string dumpTypeMessage = type == DumpTypeOption.Mini ? "dump" : "dump with heap"; console.Out.WriteLine($"Writing {dumpTypeMessage} to {output}"); if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) From 4f338384b55cb1d585f898199a8e552927f0acce Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2020 14:06:03 +0000 Subject: [PATCH 097/243] Update dependencies from https://github.com/dotnet/runtime build 20200127.11 (#783) - Microsoft.NETCore.App - 5.0.0-alpha.1.20077.11 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 087d895f67..ed09640b0b 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade cc8fe69635c7c6e791c87540851aea75946945fa - + https://github.com/dotnet/runtime - e793fcc19797f407a1b7e98d5f81b04e25a551c3 + 4011572bd462ad94bcfadb7c5b4dfcacfeae970a https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 6f9157a403..d7e1f1db6c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20076.2 + 5.0.0-alpha.1.20077.11 5.0.0-alpha.1.20076.1 From 771558e150aa29ef029eb67a82f5e29adebe7a8e Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2020 13:43:42 +0000 Subject: [PATCH 098/243] Update dependencies from https://github.com/dotnet/runtime build 20200128.2 (#786) - Microsoft.NETCore.App - 5.0.0-alpha.1.20078.2 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ed09640b0b..2c422540b9 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade cc8fe69635c7c6e791c87540851aea75946945fa - + https://github.com/dotnet/runtime - 4011572bd462ad94bcfadb7c5b4dfcacfeae970a + b8942c37f25460bb160d0ff2fde9795d56b9bf01 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index d7e1f1db6c..2cfc0fd150 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20077.11 + 5.0.0-alpha.1.20078.2 5.0.0-alpha.1.20076.1 From 9ff35f13af2f03a68a166cfd53f1a4bb32425f2f Mon Sep 17 00:00:00 2001 From: Koundinya Veluri Date: Wed, 29 Jan 2020 12:43:13 -0800 Subject: [PATCH 099/243] Show optimization tiers for runtime major version >= 3 (including 5) (#785) Show optimization tiers for runtime major version >= 3 (including 5) --- src/SOS/Strike/util.cpp | 39 ++++++++++++++++++++++++++++++++++++++- src/SOS/Strike/util.h | 2 ++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/SOS/Strike/util.cpp b/src/SOS/Strike/util.cpp index 0c6be1383a..805f2f34bc 100644 --- a/src/SOS/Strike/util.cpp +++ b/src/SOS/Strike/util.cpp @@ -2858,7 +2858,7 @@ void DumpTieredNativeCodeAddressInfo(struct DacpTieredVersionData * pTieredVersi ExtOut(" ReJIT ID: %d\n", rejitID); DMLOut(" IL Addr: %s\n", DMLIL(ilAddr)); - if (IsRuntimeVersion(3)) { + if (IsRuntimeVersionAtLeast(3)) { for(int i = cTieredVersionData - 1; i >= 0; --i) { const char *descriptor = NULL; @@ -3345,6 +3345,43 @@ bool IsRuntimeVersion(VS_FIXEDFILEINFO& fileInfo, DWORD major) return false; } +bool IsRuntimeVersionAtLeast(DWORD major) +{ + VS_FIXEDFILEINFO fileInfo; + if (GetEEVersion(&fileInfo, nullptr, 0)) + { + return IsRuntimeVersionAtLeast(fileInfo, major); + } + return false; +} + +bool IsRuntimeVersionAtLeast(VS_FIXEDFILEINFO& fileInfo, DWORD major) +{ + switch (major) + { + case 3: + if (HIWORD(fileInfo.dwFileVersionMS) == 4 && LOWORD(fileInfo.dwFileVersionMS) == 700) + { + return true; + } + // fall through + + case 5: + if (HIWORD(fileInfo.dwFileVersionMS) >= 5) + { + return true; + } + // fall through + + break; + + default: + _ASSERTE(FALSE); + break; + } + return false; +} + #ifndef FEATURE_PAL BOOL GetSOSVersion(VS_FIXEDFILEINFO *pFileInfo) diff --git a/src/SOS/Strike/util.h b/src/SOS/Strike/util.h index 6c2fde13e0..7a487cb13b 100644 --- a/src/SOS/Strike/util.h +++ b/src/SOS/Strike/util.h @@ -1550,6 +1550,8 @@ ULONG DisplayILOperation(const UINT indentCount, BYTE* pBuffer, ULONG position, BOOL GetEEVersion(VS_FIXEDFILEINFO* pFileInfo, char* fileVersionBuffer, int fileVersionBufferSizeInBytes); bool IsRuntimeVersion(DWORD major); bool IsRuntimeVersion(VS_FIXEDFILEINFO& fileInfo, DWORD major); +bool IsRuntimeVersionAtLeast(DWORD major); +bool IsRuntimeVersionAtLeast(VS_FIXEDFILEINFO& fileInfo, DWORD major); #ifndef FEATURE_PAL BOOL IsRetailBuild (size_t base); BOOL GetSOSVersion(VS_FIXEDFILEINFO *pFileInfo); From 8abc02ea28b8f6e0475a136929e12dcb715fb589 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2020 18:46:51 +0000 Subject: [PATCH 100/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200129.7 (#787) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.20079.7 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2c422540b9..b7f84327bb 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime b8942c37f25460bb160d0ff2fde9795d56b9bf01 - + https://github.com/dotnet/aspnetcore - 2cc333ac3013218a3985ecd0809b0c541cbe1f91 + c08221ffbe526d69c0b318792b093f6464e4eb09 diff --git a/eng/Versions.props b/eng/Versions.props index 2cfc0fd150..306108ee3e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20078.2 - 5.0.0-alpha.1.20076.1 + 5.0.0-alpha.1.20079.7 From 6b66e69d455cc444f07a5bf2172719c143e569cd Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Fri, 31 Jan 2020 00:03:48 -0800 Subject: [PATCH 101/243] Various misc changes and SOS fixes (#789) Misc build changes Fix source/line number support Make sure the ip doesn't get adjusted before the start of the function. Allow `!SuppressJitOptimization on` to be used before the runtime is loaded and on xplat Add display il map option to !u --- eng/Build-Native.cmd | 16 +- eng/build.sh | 20 +- eng/common/msbuild.sh | 0 src/SOS/SOS.NETCore/SymbolReader.cs | 26 +- src/SOS/Strike/hostcoreclr.h | 11 +- src/SOS/Strike/sos_unixexports.src | 1 + src/SOS/Strike/sosdocs.txt | 1370 +++++++++++++-------------- src/SOS/Strike/sosdocsunix.txt | 1062 ++++++++++----------- src/SOS/Strike/strike.cpp | 114 ++- src/SOS/Strike/util.cpp | 32 +- 10 files changed, 1326 insertions(+), 1326 deletions(-) mode change 100644 => 100755 eng/common/msbuild.sh diff --git a/eng/Build-Native.cmd b/eng/Build-Native.cmd index bdd4b942a2..8ab3931944 100644 --- a/eng/Build-Native.cmd +++ b/eng/Build-Native.cmd @@ -176,14 +176,8 @@ if /i %__BuildCrossArch% EQU 1 ( if not exist "%__CrossCompIntermediatesDir%" md "%__CrossCompIntermediatesDir%" echo Generating Version Header - set __GenerateVersionRestoreLog="%__LogDir%\GenerateVersionRestore.binlog" - "%__DotNetCli%" msbuild "%__ProjectDir%\eng\CreateVersionFile.csproj" /bl:!__GenerateVersionRestoreLog! /t:Restore %__CommonBuildArgs% - if not !errorlevel! == 0 ( - echo Generate Version Restore FAILED - exit /b 1 - ) set __GenerateVersionLog="%__LogDir%\GenerateVersion.binlog" - "%__DotNetCli%" msbuild "%__ProjectDir%\eng\CreateVersionFile.csproj" /bl:!__GenerateVersionLog! /t:GenerateVersionFiles /p:FileVersionFile=%__RootBinDir%\bin\FileVersion.txt /p:GenerateVersionHeader=true /p:NativeVersionHeaderFile=%__CrossCompIntermediatesDir%\_version.h %__CommonBuildArgs% + powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -File "%__ProjectDir%\eng\common\msbuild.ps1" "%__ProjectDir%\eng\CreateVersionFile.csproj" /bl:!__GenerateVersionLog! /t:GenerateVersionFiles /restore /p:FileVersionFile=%__RootBinDir%\bin\FileVersion.txt /p:GenerateVersionHeader=true /p:NativeVersionHeaderFile=%__CrossCompIntermediatesDir%\_version.h %__CommonBuildArgs% if not !errorlevel! == 0 ( echo Generate Version Header FAILED exit /b 1 @@ -260,14 +254,8 @@ if %__Build% EQU 1 ( ) echo Generating Version Header - set __GenerateVersionRestoreLog="%__LogDir%\GenerateVersionRestore.binlog" - "%__DotNetCli%" msbuild "%__ProjectDir%\eng\CreateVersionFile.csproj" /bl:!__GenerateVersionRestoreLog! /t:Restore %__CommonBuildArgs% - if not !errorlevel! == 0 ( - echo Generate Version Restore FAILED - exit /b 1 - ) set __GenerateVersionLog="%__LogDir%\GenerateVersion.binlog" - "%__DotNetCli%" msbuild "%__ProjectDir%\eng\CreateVersionFile.csproj" /bl:!__GenerateVersionLog! /t:GenerateVersionFiles /p:FileVersionFile=%__RootBinDir%\bin\FileVersion.txt /p:GenerateVersionHeader=true /p:NativeVersionHeaderFile=%__IntermediatesDir%\_version.h %__CommonBuildArgs% + powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -File "%__ProjectDir%\eng\common\msbuild.ps1" "%__ProjectDir%\eng\CreateVersionFile.csproj" /bl:!__GenerateVersionLog! /t:GenerateVersionFiles /restore /p:FileVersionFile=%__RootBinDir%\bin\FileVersion.txt /p:GenerateVersionHeader=true /p:NativeVersionHeaderFile=%__IntermediatesDir%\_version.h %__CommonBuildArgs% if not !errorlevel! == 0 ( echo Generate Version Header FAILED exit /b 1 diff --git a/eng/build.sh b/eng/build.sh index c79122f93c..7a928e4366 100755 --- a/eng/build.sh +++ b/eng/build.sh @@ -441,20 +441,12 @@ if [ ! -e $__DotNetCli ]; then fi if [ $__NativeBuild == true ]; then - if [[ $__CI == true ]]; then - echo "Generating Version Source File" - __GenerateVersionRestoreLog="$__LogDir/GenerateVersionRestore.binlog" - $__DotNetCli msbuild $__ProjectRoot/eng/CreateVersionFile.csproj /v:$__Verbosity /bl:$__GenerateVersionRestoreLog /t:Restore /p:Configuration="$__BuildType" /p:Platform="$__BuildArch" $__UnprocessedBuildArgs - - __GenerateVersionLog="$__LogDir/GenerateVersion.binlog" - $__DotNetCli msbuild $__ProjectRoot/eng/CreateVersionFile.csproj /v:$__Verbosity /bl:$__GenerateVersionLog /t:GenerateVersionFiles /p:GenerateVersionSourceFile=true /p:NativeVersionSourceFile="$__IntermediatesDir/version.cpp" /p:Configuration="$__BuildType" /p:Platform="$__BuildArch" $__UnprocessedBuildArgs - if [ $? != 0 ]; then - echo "Generating Version Source File FAILED" - exit 1 - fi - else - echo "Generating Empty Version Source File" - echo "" > "$__IntermediatesDir/version.cpp" + echo "Generating Version Source File" + __GenerateVersionLog="$__LogDir/GenerateVersion.binlog" + "$__ProjectRoot/eng/common/msbuild.sh" $__ProjectRoot/eng/CreateVersionFile.csproj /v:$__Verbosity /bl:$__GenerateVersionLog /t:GenerateVersionFiles /restore /p:GenerateVersionSourceFile=true /p:NativeVersionSourceFile="$__IntermediatesDir/version.cpp" /p:Configuration="$__BuildType" /p:Platform="$__BuildArch" $__UnprocessedBuildArgs + if [ $? != 0 ]; then + echo "Generating Version Source File FAILED" + exit 1 fi build_native "$__BuildArch" "$__IntermediatesDir" "$__ExtraCmakeArgs" diff --git a/eng/common/msbuild.sh b/eng/common/msbuild.sh old mode 100644 new mode 100755 diff --git a/src/SOS/SOS.NETCore/SymbolReader.cs b/src/SOS/SOS.NETCore/SymbolReader.cs index 1f17a22843..2cd025443e 100644 --- a/src/SOS/SOS.NETCore/SymbolReader.cs +++ b/src/SOS/SOS.NETCore/SymbolReader.cs @@ -529,25 +529,21 @@ private static bool GetSourceLineByILOffset(IntPtr symbolReaderHandle, int metho MethodDebugInformation methodDebugInfo = reader.GetMethodDebugInformation(methodDebugHandle); SequencePointCollection sequencePoints = methodDebugInfo.GetSequencePoints(); - SequencePoint nearestPoint = sequencePoints.GetEnumerator().Current; + SequencePoint? nearestPoint = null; foreach (SequencePoint point in sequencePoints) { - if (point.Offset < ilOffset) - { - nearestPoint = point; - } - else - { - if (point.Offset == ilOffset) - nearestPoint = point; + if (point.Offset > ilOffset) + break; - if (nearestPoint.StartLine == 0 || nearestPoint.StartLine == SequencePoint.HiddenLine) - return false; + if (point.StartLine != 0 && !point.IsHidden) + nearestPoint = point; + } - lineNumber = nearestPoint.StartLine; - fileName = reader.GetString(reader.GetDocument(nearestPoint.Document).Name); - return true; - } + if (nearestPoint.HasValue) + { + lineNumber = nearestPoint.Value.StartLine; + fileName = reader.GetString(reader.GetDocument(nearestPoint.Value.Document).Name); + return true; } } catch diff --git a/src/SOS/Strike/hostcoreclr.h b/src/SOS/Strike/hostcoreclr.h index e1bc8d7f4f..e5b703d1b7 100644 --- a/src/SOS/Strike/hostcoreclr.h +++ b/src/SOS/Strike/hostcoreclr.h @@ -154,14 +154,15 @@ class SymbolReader HRESULT LoadSymbols(___in IMetaDataImport* pMD, ___in IXCLRDataModule* pModule); HRESULT GetLineByILOffset(___in mdMethodDef MethodToken, ___in ULONG64 IlOffset, ___out ULONG *pLinenum, __out_ecount(cchFileName) WCHAR* pwszFileName, ___in ULONG cchFileName); HRESULT GetNamedLocalVariable(___in ICorDebugFrame * pFrame, ___in ULONG localIndex, __out_ecount(paramNameLen) WCHAR* paramName, ___in ULONG paramNameLen, ___out ICorDebugValue** ppValue); - HRESULT ResolveSequencePoint(__in_z WCHAR* pFilename, ___in ULONG32 lineNumber, ___out mdMethodDef* ___out pToken, ___out ULONG32* pIlOffset); + HRESULT ResolveSequencePoint(__in_z WCHAR* pFilename, ___in ULONG32 lineNumber, ___out mdMethodDef* pToken, ___out ULONG32* pIlOffset); }; HRESULT GetLineByOffset( - ___in ULONG64 IP, - ___out ULONG *pLinenum, - __out_ecount(cchFileName) WCHAR* pwszFileName, - ___in ULONG cchFileName); + ___in ULONG64 nativeOffset, + ___out ULONG* pLinenum, + __out_ecount(cchFileName) WCHAR* pwszFileName, + ___in ULONG cchFileName, + ___in BOOL bAdjustOffsetForLineNumber = FALSE); #endif // __hostcoreclr_h__ diff --git a/src/SOS/Strike/sos_unixexports.src b/src/SOS/Strike/sos_unixexports.src index a9afa599c5..50009d200f 100644 --- a/src/SOS/Strike/sos_unixexports.src +++ b/src/SOS/Strike/sos_unixexports.src @@ -50,6 +50,7 @@ SetHostRuntime SetSymbolServer SOSFlush SOSStatus +SuppressJitOptimization SyncBlk Threads ThreadState diff --git a/src/SOS/Strike/sosdocs.txt b/src/SOS/Strike/sosdocs.txt index fcd4cfad04..212ad00e35 100644 --- a/src/SOS/Strike/sosdocs.txt +++ b/src/SOS/Strike/sosdocs.txt @@ -34,7 +34,7 @@ GCRoot GCInfo ObjSize EHInfo FinalizeQueue BPMD (bpmd) PrintException (pe) COMState -TraverseHeap +TraverseHeap Examining CLR data structures Diagnostic Utilities ----------------------------- ----------------------------- @@ -56,7 +56,7 @@ DumpSig VMMap RCWCleanupList VMStat DumpIL MinidumpMode DumpRCW AnalyzeOOM (ao) -DumpCCW +DumpCCW SuppressJitOptimization Examining the GC history Other ----------------------------- ----------------------------- @@ -94,11 +94,11 @@ type: >> I got the following error message. Now what? - 0:000> .loadby sos coreclr - 0:000> !DumpStackObjects - Failed to find runtime DLL (coreclr.dll), 0x80004005 - Extension commands need coreclr.dll in order to have something to do. - 0:000> + 0:000> .loadby sos coreclr + 0:000> !DumpStackObjects + Failed to find runtime DLL (coreclr.dll), 0x80004005 + Extension commands need coreclr.dll in order to have something to do. + 0:000> This means that the coreclr is not loaded yet, or has been unloaded. You need to wait until your managed program is running in order to use these commands. If @@ -224,16 +224,16 @@ the size. You might find an object pointer by running !DumpStackObjects and choosing from the resultant list. Here is a simple object: - 0:000> !DumpObj a79d40 - Name: Customer - MethodTable: 009038ec - EEClass: 03ee1b84 - Size: 20(0x14) bytes - (C:\pub\unittest.exe) - Fields: - MT Field Offset Type VT Attr Value Name - 009038ec 4000008 4 Customer 0 instance 00a79ce4 name - 009038ec 4000009 8 Bank 0 instance 00a79d2c bank + 0:000> !DumpObj a79d40 + Name: Customer + MethodTable: 009038ec + EEClass: 03ee1b84 + Size: 20(0x14) bytes + (C:\pub\unittest.exe) + Fields: + MT Field Offset Type VT Attr Value Name + 009038ec 4000008 4 Customer 0 instance 00a79ce4 name + 009038ec 4000009 8 Bank 0 instance 00a79d2c bank Note that fields of type Customer and Bank are themselves objects, and you can run !DumpObj on them too. You could look at the field directly in memory using @@ -260,11 +260,11 @@ The arguments in detail: COMMAND: da. COMMAND: dumparray. !DumpArray - [-start ] - [-length ] - [-details] - [-nofields] - + [-start ] + [-length ] + [-details] + [-nofields] + This command allows you to examine elements of an array object. The arguments in detail: @@ -280,46 +280,46 @@ The arguments in detail: Example output: - 0:000> !dumparray -start 2 -length 3 -details 00ad28d0 - Name: Value[] - MethodTable: 03e41044 - EEClass: 03e40fc0 - Size: 132(0x84) bytes - Array: Rank 1, Number of elements 10, Type VALUETYPE - Element Type: Value - [2] 00ad28f0 - Name: Value - MethodTable 03e40f4c - EEClass: 03ef1698 - Size: 20(0x14) bytes - (C:\bugs\225271\arraytest.exe) - Fields: - MT Field Offset Type Attr Value Name - 5b9a628c 4000001 0 System.Int32 instance 2 x - 5b9a628c 4000002 4 System.Int32 instance 4 y - 5b9a628c 4000003 8 System.Int32 instance 6 z - [3] 00ad28fc - Name: Value - MethodTable 03e40f4c - EEClass: 03ef1698 - Size: 20(0x14) bytes - (C:\bugs\225271\arraytest.exe) - Fields: - MT Field Offset Type Attr Value Name - 5b9a628c 4000001 0 System.Int32 instance 3 x - 5b9a628c 4000002 4 System.Int32 instance 6 y - 5b9a628c 4000003 8 System.Int32 instance 9 z - [4] 00ad2908 - Name: Value - MethodTable 03e40f4c - EEClass: 03ef1698 - Size: 20(0x14) bytes - (C:\bugs\225271\arraytest.exe) - Fields: - MT Field Offset Type Attr Value Name - 5b9a628c 4000001 0 System.Int32 instance 4 x - 5b9a628c 4000002 4 System.Int32 instance 8 y - 5b9a628c 4000003 8 System.Int32 instance 12 z + 0:000> !dumparray -start 2 -length 3 -details 00ad28d0 + Name: Value[] + MethodTable: 03e41044 + EEClass: 03e40fc0 + Size: 132(0x84) bytes + Array: Rank 1, Number of elements 10, Type VALUETYPE + Element Type: Value + [2] 00ad28f0 + Name: Value + MethodTable 03e40f4c + EEClass: 03ef1698 + Size: 20(0x14) bytes + (C:\bugs\225271\arraytest.exe) + Fields: + MT Field Offset Type Attr Value Name + 5b9a628c 4000001 0 System.Int32 instance 2 x + 5b9a628c 4000002 4 System.Int32 instance 4 y + 5b9a628c 4000003 8 System.Int32 instance 6 z + [3] 00ad28fc + Name: Value + MethodTable 03e40f4c + EEClass: 03ef1698 + Size: 20(0x14) bytes + (C:\bugs\225271\arraytest.exe) + Fields: + MT Field Offset Type Attr Value Name + 5b9a628c 4000001 0 System.Int32 instance 3 x + 5b9a628c 4000002 4 System.Int32 instance 6 y + 5b9a628c 4000003 8 System.Int32 instance 9 z + [4] 00ad2908 + Name: Value + MethodTable 03e40f4c + EEClass: 03ef1698 + Size: 20(0x14) bytes + (C:\bugs\225271\arraytest.exe) + Fields: + MT Field Offset Type Attr Value Name + 5b9a628c 4000001 0 System.Int32 instance 4 x + 5b9a628c 4000002 4 System.Int32 instance 8 y + 5b9a628c 4000003 8 System.Int32 instance 12 z \\ @@ -364,7 +364,7 @@ COMMAND: dumpdelegate. For example: - 0:000> !dumpdelegate + 0:000> !dumpdelegate Target Method Name 000001461bacb0d8 00007ffc5c894b80 ConsoleApp16.Program.InstanceMethod() 000001461bacb098 00007ffc5c894b68 ConsoleApp16.Program.StaticMethod() @@ -393,26 +393,26 @@ fragmentation in the GC heap. When called without options, the output is first a list of objects in the heap, followed by a report listing all the types found, their size and number: - 0:000> !dumpheap - Address MT Size - 00a71000 0015cde8 12 Free - 00a7100c 0015cde8 12 Free - 00a71018 0015cde8 12 Free - 00a71024 5ba58328 68 - 00a71068 5ba58380 68 - 00a710ac 5ba58430 68 - 00a710f0 5ba5dba4 68 - ... - total 619 objects - Statistics: - MT Count TotalSize Class Name - 5ba7607c 1 12 System.Security.Permissions.HostProtectionResource - 5ba75d54 1 12 System.Security.Permissions.SecurityPermissionFlag - 5ba61f18 1 12 System.Collections.CaseInsensitiveComparer - ... - 0015cde8 6 10260 Free - 5ba57bf8 318 18136 System.String - ... + 0:000> !dumpheap + Address MT Size + 00a71000 0015cde8 12 Free + 00a7100c 0015cde8 12 Free + 00a71018 0015cde8 12 Free + 00a71024 5ba58328 68 + 00a71068 5ba58380 68 + 00a710ac 5ba58430 68 + 00a710f0 5ba5dba4 68 + ... + total 619 objects + Statistics: + MT Count TotalSize Class Name + 5ba7607c 1 12 System.Security.Permissions.HostProtectionResource + 5ba75d54 1 12 System.Security.Permissions.SecurityPermissionFlag + 5ba61f18 1 12 System.Collections.CaseInsensitiveComparer + ... + 0015cde8 6 10260 Free + 5ba57bf8 318 18136 System.String + ... "Free" objects are simply regions of space the garbage collector can use later. If 30%% or more of the heap contains "Free" objects, the process may suffer from @@ -420,12 +420,12 @@ heap fragmentation. This is usually caused by pinning objects for a long time combined with a high rate of allocation. Here is example output where !DumpHeap provides a warning about fragmentation: - - Fragmented blocks larger than 1MB: - Addr Size Followed by - 00a780c0 1.5MB 00bec800 System.Byte[] - 00da4e38 1.2MB 00ed2c00 System.Byte[] - 00f16df0 1.2MB 01044338 System.Byte[] + + Fragmented blocks larger than 1MB: + Addr Size Followed by + 00a780c0 1.5MB 00bec800 System.Byte[] + 00da4e38 1.2MB 00ed2c00 System.Byte[] + 00f16df0 1.2MB 01044338 System.Byte[] The arguments in detail: @@ -473,41 +473,41 @@ be returned. More generally, "-type []". The start/end parameters can be obtained from the output of !EEHeap -gc. For example, if you only want to list objects in the large heap segment: - 0:000> !eeheap -gc - Number of GC Heaps: 1 - generation 0 starts at 0x00c32754 - generation 1 starts at 0x00c32748 - generation 2 starts at 0x00a71000 - segment begin allocated size - 00a70000 00a71000 010443a8 005d33a8(6108072) - Large object heap starts at 0x01a71000 - segment begin allocated size - 01a70000 01a71000 01a75000 0x00004000(16384) - Total Size 0x5d73a8(6124456) - ------------------------------ - GC Heap Size 0x5d73a8(6124456) - - 0:000> !dumpheap 1a71000 1a75000 - Address MT Size - 01a71000 5ba88bd8 2064 - 01a71810 0019fe48 2032 Free - 01a72000 5ba88bd8 4096 - 01a73000 0019fe48 4096 Free - 01a74000 5ba88bd8 4096 - total 5 objects - Statistics: - MT Count TotalSize Class Name - 0019fe48 2 6128 Free - 5ba88bd8 3 10256 System.Object[] - Total 5 objects + 0:000> !eeheap -gc + Number of GC Heaps: 1 + generation 0 starts at 0x00c32754 + generation 1 starts at 0x00c32748 + generation 2 starts at 0x00a71000 + segment begin allocated size + 00a70000 00a71000 010443a8 005d33a8(6108072) + Large object heap starts at 0x01a71000 + segment begin allocated size + 01a70000 01a71000 01a75000 0x00004000(16384) + Total Size 0x5d73a8(6124456) + ------------------------------ + GC Heap Size 0x5d73a8(6124456) + + 0:000> !dumpheap 1a71000 1a75000 + Address MT Size + 01a71000 5ba88bd8 2064 + 01a71810 0019fe48 2032 Free + 01a72000 5ba88bd8 4096 + 01a73000 0019fe48 4096 Free + 01a74000 5ba88bd8 4096 + total 5 objects + Statistics: + MT Count TotalSize Class Name + 0019fe48 2 6128 Free + 5ba88bd8 3 10256 System.Object[] + Total 5 objects Finally, if GC heap corruption is present, you may see an error like this: - 0:000> !dumpheap -stat - object 00a73d24: does not have valid MT - curr_object : 00a73d24 - Last good object: 00a73d14 - ---------------- + 0:000> !dumpheap -stat + object 00a73d24: does not have valid MT + curr_object : 00a73d24 + Last good object: 00a73d14 + ---------------- That indicates a serious problem. See the help for !VerifyHeap for more information on diagnosing the cause. @@ -522,33 +522,33 @@ to know the MethodTable address to tell SOS how to interpret the fields, as a value class is not a first-class object with it's own MethodTable as the first field. For example: - 0:000> !DumpObj a79d98 - Name: Mainy - MethodTable: 009032d8 - EEClass: 03ee1424 - Size: 28(0x1c) bytes - (C:\pub\unittest.exe) - Fields: - MT Field Offset Type Attr Value Name - 0090320c 4000010 4 VALUETYPE instance 00a79d9c m_valuetype - 009032d8 400000f 4 CLASS static 00a79d54 m_sExcep + 0:000> !DumpObj a79d98 + Name: Mainy + MethodTable: 009032d8 + EEClass: 03ee1424 + Size: 28(0x1c) bytes + (C:\pub\unittest.exe) + Fields: + MT Field Offset Type Attr Value Name + 0090320c 4000010 4 VALUETYPE instance 00a79d9c m_valuetype + 009032d8 400000f 4 CLASS static 00a79d54 m_sExcep m_valuetype is a value type. The value in the MT column (0090320c) is the MethodTable for it, and the Value column provides the start address: - 0:000> !DumpVC 0090320c 00a79d9c - Name: Funny - MethodTable 0090320c - EEClass: 03ee14b8 - Size: 28(0x1c) bytes - (C:\pub\unittest.exe) - Fields: - MT Field Offset Type Attr Value Name - 0090320c 4000001 0 CLASS instance 00a743d8 signature - 0090320c 4000002 8 System.Int32 instance 2345 m1 - 0090320c 4000003 10 System.Boolean instance 1 b1 - 0090320c 4000004 c System.Int32 instance 1234 m2 - 0090320c 4000005 4 CLASS instance 00a79d98 backpointer + 0:000> !DumpVC 0090320c 00a79d9c + Name: Funny + MethodTable 0090320c + EEClass: 03ee14b8 + Size: 28(0x1c) bytes + (C:\pub\unittest.exe) + Fields: + MT Field Offset Type Attr Value Name + 0090320c 4000001 0 CLASS instance 00a743d8 signature + 0090320c 4000002 8 System.Int32 instance 2345 m1 + 0090320c 4000003 10 System.Boolean instance 1 b1 + 0090320c 4000004 c System.Int32 instance 1234 m2 + 0090320c 4000005 4 CLASS instance 00a79d98 backpointer !DumpVC is quite a specialized function. Some managed programs make heavy use of value classes, while others do not. @@ -588,22 +588,22 @@ of any objects pointed to by those handles. In calculating object size, For example, !DumpObj lists a size of 20 bytes for this Customer object: - 0:000> !do a79d40 - Name: Customer - MethodTable: 009038ec - EEClass: 03ee1b84 - Size: 20(0x14) bytes - (C:\pub\unittest.exe) - Fields: - MT Field Offset Type Attr Value Name - 009038ec 4000008 4 CLASS instance 00a79ce4 name - 009038ec 4000009 8 CLASS instance 00a79d2c bank - 009038ec 400000a c System.Boolean instance 1 valid + 0:000> !do a79d40 + Name: Customer + MethodTable: 009038ec + EEClass: 03ee1b84 + Size: 20(0x14) bytes + (C:\pub\unittest.exe) + Fields: + MT Field Offset Type Attr Value Name + 009038ec 4000008 4 CLASS instance 00a79ce4 name + 009038ec 4000009 8 CLASS instance 00a79d2c bank + 009038ec 400000a c System.Boolean instance 1 valid but !ObjSize lists 152 bytes: - 0:000> !ObjSize a79d40 - sizeof(00a79d40) = 152 ( 0x98) bytes (Customer) + 0:000> !ObjSize a79d40 + sizeof(00a79d40) = 152 ( 0x98) bytes (Customer) This is because a Customer points to a Bank, has a name, and the Bank points to an Address string. You can use !ObjSize to identify any particularly large @@ -627,20 +627,20 @@ COMMAND: finalizequeue. This command lists the objects registered for finalization. Here is output from a simple program: - 0:000> !finalizequeue - SyncBlocks to be cleaned up: 0 - MTA Interfaces to be released: 0 - STA Interfaces to be released: 1 - generation 0 has 4 finalizable objects (0015bc90->0015bca0) - generation 1 has 0 finalizable objects (0015bc90->0015bc90) - generation 2 has 0 finalizable objects (0015bc90->0015bc90) - Ready for finalization 0 objects (0015bca0->0015bca0) - Statistics: - MT Count TotalSize Class Name - 5ba6cf78 1 24 Microsoft.Win32.SafeHandles.SafeFileHandle - 5ba5db04 1 68 System.Threading.Thread - 5ba73e28 2 112 System.IO.StreamWriter - Total 4 objects + 0:000> !finalizequeue + SyncBlocks to be cleaned up: 0 + MTA Interfaces to be released: 0 + STA Interfaces to be released: 1 + generation 0 has 4 finalizable objects (0015bc90->0015bca0) + generation 1 has 0 finalizable objects (0015bc90->0015bc90) + generation 2 has 0 finalizable objects (0015bc90->0015bc90) + Ready for finalization 0 objects (0015bca0->0015bca0) + Statistics: + MT Count TotalSize Class Name + 5ba6cf78 1 24 Microsoft.Win32.SafeHandles.SafeFileHandle + 5ba5db04 1 68 System.Threading.Thread + 5ba73e28 2 112 System.IO.StreamWriter + Total 4 objects The GC heap is divided into generations, and objects are listed accordingly. We see that only generation 0 (the youngest generation) has any objects registered @@ -924,24 +924,24 @@ COMMAND: ip2md. Given an address in managed JITTED code, IP2MD attempts to find the MethodDesc associated with it. For example, this output from K: - 0:000> K - ChildEBP RetAddr - 00a79c78 03ef02ab image00400000!Mainy.Top()+0xb - 00a79c78 03ef01a6 image00400000!Mainy.Level(Int32)+0xb - 00a79c78 5d3725a1 image00400000!Mainy.Main()+0xee - 0012ea04 5d512f59 clr!CallDescrWorkerInternal+0x30 - 0012ee34 5d7946aa clr!CallDescrWorker+0x109 - - 0:000> !IP2MD 03ef01a6 - MethodDesc: 00902f40 - Method Name: Mainy.Main() - Class: 03ee1424 - MethodTable: 009032d8 - mdToken: 0600000d - Module: 001caa38 - IsJitted: yes - CodeAddr: 03ef00b8 - Source file: c:\Code\prj.mini\exc.cs @ 39 + 0:000> K + ChildEBP RetAddr + 00a79c78 03ef02ab image00400000!Mainy.Top()+0xb + 00a79c78 03ef01a6 image00400000!Mainy.Level(Int32)+0xb + 00a79c78 5d3725a1 image00400000!Mainy.Main()+0xee + 0012ea04 5d512f59 clr!CallDescrWorkerInternal+0x30 + 0012ee34 5d7946aa clr!CallDescrWorker+0x109 + + 0:000> !IP2MD 03ef01a6 + MethodDesc: 00902f40 + Method Name: Mainy.Main() + Class: 03ee1424 + MethodTable: 009032d8 + mdToken: 0600000d + Module: 001caa38 + IsJitted: yes + CodeAddr: 03ef00b8 + Source file: c:\Code\prj.mini\exc.cs @ 39 We have taken a return address into Mainy.Main, and discovered information about that method. You could run !U, !DumpMT, !DumpClass, !DumpMD, or @@ -960,12 +960,12 @@ pointer for the method, or a code address within the method body. Unlike the debugger "U" function, the entire method from start to finish is printed, with annotations that convert metadata tokens to names. - - ... - 03ef015d b901000000 mov ecx,0x1 - 03ef0162 ff156477a25b call dword ptr [mscorlib_dll+0x3c7764 (5ba27764)] (System.Console.InitializeStdOutError(Boolean), mdToken: 06000713) - 03ef0168 a17c20a701 mov eax,[01a7207c] (Object: SyncTextWriter) - 03ef016d 89442414 mov [esp+0x14],eax + + ... + 03ef015d b901000000 mov ecx,0x1 + 03ef0162 ff156477a25b call dword ptr [mscorlib_dll+0x3c7764 (5ba27764)] (System.Console.InitializeStdOutError(Boolean), mdToken: 06000713) + 03ef0168 a17c20a701 mov eax,[01a7207c] (Object: SyncTextWriter) + 03ef016d 89442414 mov [esp+0x14],eax If you pass the -gcinfo flag, you'll get inline display of the GCInfo for the method. You can also obtain this information with the !GCInfo command. @@ -985,17 +985,17 @@ include the source file name and line number corresponding to the disassembly. The -n (No line numbers) flag can be specified to disable this behavior. - - ... - c:\Code\prj.mini\exc.cs @ 38: - 001b00b0 8b0d3020ab03 mov ecx,dword ptr ds:[3AB2030h] ("Break in debugger. When done type to continue: ") - 001b00b6 e8d5355951 call mscorlib_ni+0x8b3690 (51743690) (System.Console.Write(System.String), mdToken: 0600091b) - 001b00bb 90 nop - - c:\Code\prj.mini\exc.cs @ 39: - 001b00bc e863cdc651 call mscorlib_ni+0xf8ce24 (51e1ce24) (System.Console.ReadLine(), mdToken: 060008f6) - >>> 001b00c1 90 nop - ... + + ... + c:\Code\prj.mini\exc.cs @ 38: + 001b00b0 8b0d3020ab03 mov ecx,dword ptr ds:[3AB2030h] ("Break in debugger. When done type to continue: ") + 001b00b6 e8d5355951 call mscorlib_ni+0x8b3690 (51743690) (System.Console.Write(System.String), mdToken: 0600091b) + 001b00bb 90 nop + + c:\Code\prj.mini\exc.cs @ 39: + 001b00bc e863cdc651 call mscorlib_ni+0xf8ce24 (51e1ce24) (System.Console.ReadLine(), mdToken: 060008f6) + >>> 001b00c1 90 nop + ... \\ COMMAND: dumpstack. @@ -1045,27 +1045,27 @@ block and the handler block. For a TYPED handler, this would be the "try" and Sample output: - 0:000> !ehinfo 33bbd3a - MethodDesc: 03310f68 - Method Name: MainClass.Main() - Class: 03571358 - MethodTable: 0331121c - mdToken: 0600000b - Module: 001e2fd8 - IsJitted: yes - CodeAddr: 033bbca0 + 0:000> !ehinfo 33bbd3a + MethodDesc: 03310f68 + Method Name: MainClass.Main() + Class: 03571358 + MethodTable: 0331121c + mdToken: 0600000b + Module: 001e2fd8 + IsJitted: yes + CodeAddr: 033bbca0 - EHHandler 0: TYPED catch(System.IO.FileNotFoundException) - Clause: [033bbd2b, 033bbd3c] [8b, 9c] - Handler: [033bbd3c, 033bbd50] [9c, b0] + EHHandler 0: TYPED catch(System.IO.FileNotFoundException) + Clause: [033bbd2b, 033bbd3c] [8b, 9c] + Handler: [033bbd3c, 033bbd50] [9c, b0] - EHHandler 1: FINALLY - Clause: [033bbd83, 033bbda3] [e3, 103] - Handler: [033bbda3, 033bbdc5] [103, 125] + EHHandler 1: FINALLY + Clause: [033bbd83, 033bbda3] [e3, 103] + Handler: [033bbda3, 033bbdc5] [103, 125] - EHHandler 2: TYPED catch(System.Exception) - Clause: [033bbd7a, 033bbdc5] [da, 125] - Handler: [033bbdc5, 033bbdd6] [125, 136] + EHHandler 2: TYPED catch(System.Exception) + Clause: [033bbd7a, 033bbdc5] [da, 125] + Handler: [033bbdc5, 033bbdd6] [125, 136] \\ @@ -1084,53 +1084,53 @@ you would print this output out and read it alongside a disassembly of the method. For example, the notation "reg EDI becoming live" at offset 0x11 of the method might correspond to a "mov edi,ecx" statement. - 0:000> !gcinfo 5b68dbb8 (5b68dbb8 is the start of a JITTED method) - entry point 5b68dbb8 - preJIT generated code - GC info 5b9f2f09 - Method info block: - method size = 0036 - prolog size = 19 - epilog size = 8 - epilog count = 1 - epilog end = yes - saved reg. mask = 000B - ebp frame = yes - fully interruptible=yes - double align = no - security check = no - exception handlers = no - local alloc = no - edit & continue = no - varargs = no - argument count = 4 - stack frame size = 1 - untracked count = 5 - var ptr tab count = 0 - epilog at 002E - 36 D4 8C C7 AA | - 93 F3 40 05 | - - Pointer table: - 14 | [EBP+14H] an untracked local - 10 | [EBP+10H] an untracked local - 0C | [EBP+0CH] an untracked local - 08 | [EBP+08H] an untracked local - 44 | [EBP-04H] an untracked local - F1 79 | 0011 reg EDI becoming live - 72 | 0013 reg ESI becoming live - 83 | 0016 push ptr 0 - 8B | 0019 push ptr 1 - 93 | 001C push ptr 2 - 9B | 001F push ptr 3 - 56 | 0025 reg EDX becoming live - 4A | 0027 reg ECX becoming live - 0E | 002D reg ECX becoming dead - 10 | 002D reg EDX becoming dead - E0 | 002D pop 4 ptrs - F0 31 | 0036 reg ESI becoming dead - 38 | 0036 reg EDI becoming dead - FF | + 0:000> !gcinfo 5b68dbb8 (5b68dbb8 is the start of a JITTED method) + entry point 5b68dbb8 + preJIT generated code + GC info 5b9f2f09 + Method info block: + method size = 0036 + prolog size = 19 + epilog size = 8 + epilog count = 1 + epilog end = yes + saved reg. mask = 000B + ebp frame = yes + fully interruptible=yes + double align = no + security check = no + exception handlers = no + local alloc = no + edit & continue = no + varargs = no + argument count = 4 + stack frame size = 1 + untracked count = 5 + var ptr tab count = 0 + epilog at 002E + 36 D4 8C C7 AA | + 93 F3 40 05 | + + Pointer table: + 14 | [EBP+14H] an untracked local + 10 | [EBP+10H] an untracked local + 0C | [EBP+0CH] an untracked local + 08 | [EBP+08H] an untracked local + 44 | [EBP-04H] an untracked local + F1 79 | 0011 reg EDI becoming live + 72 | 0013 reg ESI becoming live + 83 | 0016 push ptr 0 + 8B | 0019 push ptr 1 + 93 | 001C push ptr 2 + 9B | 001F push ptr 3 + 56 | 0025 reg EDX becoming live + 4A | 0027 reg ECX becoming live + 0E | 002D reg ECX becoming dead + 10 | 002D reg EDX becoming dead + E0 | 002D pop 4 ptrs + F0 31 | 0036 reg ESI becoming dead + 38 | 0036 reg EDI becoming dead + FF | This function is important for CLR Devs, but very difficult for anyone else to make sense of it. You would usually come to use it if you suspect a gc heap @@ -1194,18 +1194,18 @@ To correctly specify explicitly implemented methods make sure to retrieve the method name from the metadata, or from the output of the "!dumpmt -md" command. For example: - public interface I1 - { - void M1(); - } - public class ExplicitItfImpl : I1 - { - ... - void I1.M1() // this method's name is 'I1.M1' - { ... } - } + public interface I1 + { + void M1(); + } + public class ExplicitItfImpl : I1 + { + ... + void I1.M1() // this method's name is 'I1.M1' + { ... } + } - !bpmd myapp.exe ExplicitItfImpl.I1.M1 + !bpmd myapp.exe ExplicitItfImpl.I1.M1 !bpmd works equally well with generic types. Adding a breakpoint on a generic @@ -1213,56 +1213,56 @@ type sets breakpoints on all already JIT-ted generic methods and sets a pending breakpoint for any instantiation that will be JIT-ted in the future. Example for generics: - Given the following two classes: + Given the following two classes: - class G3 - { - ... - public void F(T1 p1, T2 p2, T3 p3) - { ... } - } + class G3 + { + ... + public void F(T1 p1, T2 p2, T3 p3) + { ... } + } - public class G1 { - // static method - static public void G(W w) - { ... } - } + public class G1 { + // static method + static public void G(W w) + { ... } + } - One would issue the following commands to set breapoints on G3.F() and - G1.G(): + One would issue the following commands to set breapoints on G3.F() and + G1.G(): - !bpmd myapp.exe G3`3.F - !bpmd myapp.exe G1`1.G + !bpmd myapp.exe G3`3.F + !bpmd myapp.exe G1`1.G And for explicitly implemented methods on generic interfaces: - public interface IT1 - { - void M1(T t); - } + public interface IT1 + { + void M1(T t); + } - public class ExplicitItfImpl : IT1 - { - ... - void IT1.M1(U u) // this method's name is 'IT1.M1' - { ... } - } + public class ExplicitItfImpl : IT1 + { + ... + void IT1.M1(U u) // this method's name is 'IT1.M1' + { ... } + } - !bpmd bpmd.exe ExplicitItfImpl`1.IT1.M1 + !bpmd bpmd.exe ExplicitItfImpl`1.IT1.M1 Additional examples: - If IT1 and ExplicitItfImpl are types declared inside another class, - Outer, the bpmd command would become: + If IT1 and ExplicitItfImpl are types declared inside another class, + Outer, the bpmd command would become: - !bpmd bpmd.exe Outer+ExplicitItfImpl`1.Outer.IT1.M1 + !bpmd bpmd.exe Outer+ExplicitItfImpl`1.Outer.IT1.M1 - (note that the fully qualified type name for ExplicitItfImpl became - Outer+ExplicitItfImpl, using the '+' separator, while the method name - is Outer.IT1.M1, using a '.' as the separator) + (note that the fully qualified type name for ExplicitItfImpl became + Outer+ExplicitItfImpl, using the '+' separator, while the method name + is Outer.IT1.M1, using a '.' as the separator) - Furthermore, if the Outer class resides in a namespace, NS, the bpmd - command to use becomes: + Furthermore, if the Outer class resides in a namespace, NS, the bpmd + command to use becomes: - !bpmd bpmd.exe NS.Outer+ExplicitItfImpl`1.NS.Outer.IT1.M1 + !bpmd bpmd.exe NS.Outer+ExplicitItfImpl`1.NS.Outer.IT1.M1 !bpmd does not accept offsets nor parameters in the method name. You can add an IL offset as an optional parameter seperate from the name. If there are overloaded @@ -1306,19 +1306,19 @@ have an object pointer, and can attempt to run "!DumpObj" on it. Here is output for a simple program: - 0:000> !eeheap -gc - Number of GC Heaps: 1 - generation 0 starts at 0x00a71018 - generation 1 starts at 0x00a7100c - generation 2 starts at 0x00a71000 - segment begin allocated size - 00a70000 00a71000 00a7e01c 0000d01c(53276) - Large object heap starts at 0x01a71000 - segment begin allocated size - 01a70000 01a71000 01a76000 0x00005000(20480) - Total Size 0x1201c(73756) - ------------------------------ - GC Heap Size 0x1201c(73756) + 0:000> !eeheap -gc + Number of GC Heaps: 1 + generation 0 starts at 0x00a71018 + generation 1 starts at 0x00a7100c + generation 2 starts at 0x00a71000 + segment begin allocated size + 00a70000 00a71000 00a7e01c 0000d01c(53276) + Large object heap starts at 0x01a71000 + segment begin allocated size + 01a70000 01a71000 01a76000 0x00005000(20480) + Total Size 0x1201c(73756) + ------------------------------ + GC Heap Size 0x1201c(73756) So the total size of the GC Heap is only 72K. On a large web server, with multiple processors, you can expect to see a GC Heap of 400MB or more. The @@ -1331,49 +1331,49 @@ The loader output lists various private heaps associated with AppDomains. It also lists heaps associated with the JIT compiler, and heaps associated with Modules. For example: - 0:000> !EEHeap -loader - Loader Heap: - -------------------------------------- - System Domain: 5e0662a0 - LowFrequencyHeap:008f0000(00002000:00001000) Size: 0x00001000 bytes. - HighFrequencyHeap:008f2000(00008000:00001000) Size: 0x00001000 bytes. - StubHeap:008fa000(00002000:00001000) Size: 0x00001000 bytes. - Total size: 0x3000(12288)bytes - -------------------------------------- - Shared Domain: 5e066970 - LowFrequencyHeap:00920000(00002000:00001000) 03e30000(00010000:00003000) Size: 0x00004000 bytes. - Wasted: 0x00001000 bytes. - HighFrequencyHeap:00922000(00008000:00001000) Size: 0x00001000 bytes. - StubHeap:0092a000(00002000:00001000) Size: 0x00001000 bytes. - Total size: 0x6000(24576)bytes - -------------------------------------- - Domain 1: 14f000 - LowFrequencyHeap:00900000(00002000:00001000) 03ee0000(00010000:00003000) Size: 0x00004000 bytes. - Wasted: 0x00001000 bytes. - HighFrequencyHeap:00902000(00008000:00003000) Size: 0x00003000 bytes. - StubHeap:0090a000(00002000:00001000) Size: 0x00001000 bytes. - Total size: 0x8000(32768)bytes - -------------------------------------- - Jit code heap: - Normal JIT:03ef0000(00010000:00002000) Size: 0x00002000 bytes. - Total size: 0x2000(8192)bytes - -------------------------------------- - Module Thunk heaps: - Module 5ba22410: Size: 0x00000000 bytes. - Module 001c1320: Size: 0x00000000 bytes. - Module 001c03f0: Size: 0x00000000 bytes. - Module 001caa38: Size: 0x00000000 bytes. - Total size: 0x0(0)bytes - -------------------------------------- - Module Lookup Table heaps: - Module 5ba22410:Size: 0x00000000 bytes. - Module 001c1320:Size: 0x00000000 bytes. - Module 001c03f0:Size: 0x00000000 bytes. - Module 001caa38:03ec0000(00010000:00002000) Size: 0x00002000 bytes. - Total size: 0x2000(8192)bytes - -------------------------------------- - Total LoaderHeap size: 0x15000(86016)bytes - ======================================= + 0:000> !EEHeap -loader + Loader Heap: + -------------------------------------- + System Domain: 5e0662a0 + LowFrequencyHeap:008f0000(00002000:00001000) Size: 0x00001000 bytes. + HighFrequencyHeap:008f2000(00008000:00001000) Size: 0x00001000 bytes. + StubHeap:008fa000(00002000:00001000) Size: 0x00001000 bytes. + Total size: 0x3000(12288)bytes + -------------------------------------- + Shared Domain: 5e066970 + LowFrequencyHeap:00920000(00002000:00001000) 03e30000(00010000:00003000) Size: 0x00004000 bytes. + Wasted: 0x00001000 bytes. + HighFrequencyHeap:00922000(00008000:00001000) Size: 0x00001000 bytes. + StubHeap:0092a000(00002000:00001000) Size: 0x00001000 bytes. + Total size: 0x6000(24576)bytes + -------------------------------------- + Domain 1: 14f000 + LowFrequencyHeap:00900000(00002000:00001000) 03ee0000(00010000:00003000) Size: 0x00004000 bytes. + Wasted: 0x00001000 bytes. + HighFrequencyHeap:00902000(00008000:00003000) Size: 0x00003000 bytes. + StubHeap:0090a000(00002000:00001000) Size: 0x00001000 bytes. + Total size: 0x8000(32768)bytes + -------------------------------------- + Jit code heap: + Normal JIT:03ef0000(00010000:00002000) Size: 0x00002000 bytes. + Total size: 0x2000(8192)bytes + -------------------------------------- + Module Thunk heaps: + Module 5ba22410: Size: 0x00000000 bytes. + Module 001c1320: Size: 0x00000000 bytes. + Module 001c03f0: Size: 0x00000000 bytes. + Module 001caa38: Size: 0x00000000 bytes. + Total size: 0x0(0)bytes + -------------------------------------- + Module Lookup Table heaps: + Module 5ba22410:Size: 0x00000000 bytes. + Module 001c1320:Size: 0x00000000 bytes. + Module 001c03f0:Size: 0x00000000 bytes. + Module 001caa38:03ec0000(00010000:00002000) Size: 0x00002000 bytes. + Total size: 0x2000(8192)bytes + -------------------------------------- + Total LoaderHeap size: 0x15000(86016)bytes + ======================================= By using !EEHeap to keep track of the growth of these private heaps, we are able to rule out or include them as a source of a memory leak. @@ -1386,21 +1386,21 @@ COMMAND: name2ee. This function allows you to turn a class name into a MethodTable and EEClass. It turns a method name into a MethodDesc. Here is an example for a method: - 0:000> !name2ee unittest.exe MainClass.Main - Module: 001caa38 - Token: 0x0600000d - MethodDesc: 00902f40 - Name: MainClass.Main() - JITTED Code Address: 03ef00b8 + 0:000> !name2ee unittest.exe MainClass.Main + Module: 001caa38 + Token: 0x0600000d + MethodDesc: 00902f40 + Name: MainClass.Main() + JITTED Code Address: 03ef00b8 and for a class: - 0:000> !name2ee unittest!MainClass - Module: 001caa38 - Token: 0x02000005 - MethodTable: 009032d8 - EEClass: 03ee1424 - Name: MainClass + 0:000> !name2ee unittest!MainClass + Module: 001caa38 + Token: 0x02000005 + MethodTable: 009032d8 + EEClass: 03ee1424 + Name: MainClass The module you are "browsing" with Name2EE needs to be loaded in the process. To get a type name exactly right, first browse the module with ILDASM. You @@ -1425,12 +1425,12 @@ price, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null For this kind of module, simply use price as the module name: - 0:044> !name2ee price Price - Module: 10f028b0 (price, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null) - Token: 0x02000002 - MethodTable: 11a47ae0 - EEClass: 11a538c8 - Name: Price + 0:044> !name2ee price Price + Module: 10f028b0 (price, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null) + Token: 0x02000002 + MethodTable: 11a47ae0 + EEClass: 11a538c8 + Name: Price Where are we getting these module names from? Run !DumpDomain to see a list of all loaded modules in all domains. And remember that you can browse all the @@ -1478,30 +1478,30 @@ This is a deadlock situation, as Thread A could take r1, and Thread B r2, leaving both threads with no option but to wait forever in the second lock statement. !SyncBlk will detect this with the following output: - 0:003> !syncblk - Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner - 238 001e40ec 3 1 001e4e60 e04 3 00a7a194 Resource - 239 001e4124 3 1 001e5980 ab8 4 00a7a1a4 Resource + 0:003> !syncblk + Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner + 238 001e40ec 3 1 001e4e60 e04 3 00a7a194 Resource + 239 001e4124 3 1 001e5980 ab8 4 00a7a1a4 Resource It means that Thread e04 owns object 00a7a194, and Thread ab8 owns object 00a7a1a4. Combine that information with the call stacks of the deadlock: (threads 3 and 4 have similar output) - 0:003> k - ChildEBP RetAddr - 0404ea04 77f5c524 SharedUserData!SystemCallStub+0x4 - 0404ea08 77e75ee0 ntdll!NtWaitForMultipleObjects+0xc - 0404eaa4 5d9de9d6 KERNEL32!WaitForMultipleObjectsEx+0x12c - 0404eb38 5d9def80 clr!Thread::DoAppropriateAptStateWait+0x156 - 0404ecc4 5d9dd8bb clr!Thread::DoAppropriateWaitWorker+0x360 - 0404ed20 5da628dd clr!Thread::DoAppropriateWait+0xbb - 0404ede4 5da4e2e2 clr!CLREvent::Wait+0x29d - 0404ee70 5da4dd41 clr!AwareLock::EnterEpilog+0x132 - 0404ef34 5da4efa3 clr!AwareLock::Enter+0x2c1 - 0404f09c 5d767880 clr!AwareLock::Contention+0x483 - 0404f1c4 03f00229 clr!JITutil_MonContention+0x2c0 - 0404f1f4 5b6ef077 image00400000!Worker.Work()+0x79 - ... + 0:003> k + ChildEBP RetAddr + 0404ea04 77f5c524 SharedUserData!SystemCallStub+0x4 + 0404ea08 77e75ee0 ntdll!NtWaitForMultipleObjects+0xc + 0404eaa4 5d9de9d6 KERNEL32!WaitForMultipleObjectsEx+0x12c + 0404eb38 5d9def80 clr!Thread::DoAppropriateAptStateWait+0x156 + 0404ecc4 5d9dd8bb clr!Thread::DoAppropriateWaitWorker+0x360 + 0404ed20 5da628dd clr!Thread::DoAppropriateWait+0xbb + 0404ede4 5da4e2e2 clr!CLREvent::Wait+0x29d + 0404ee70 5da4dd41 clr!AwareLock::EnterEpilog+0x132 + 0404ef34 5da4efa3 clr!AwareLock::Enter+0x2c1 + 0404f09c 5d767880 clr!AwareLock::Contention+0x483 + 0404f1c4 03f00229 clr!JITutil_MonContention+0x2c0 + 0404f1f4 5b6ef077 image00400000!Worker.Work()+0x79 + ... By looking at the code corresponding to Worker.Work()+0x79 (run "!u 03f00229"), you can see that thread 3 is attempting to acquire the Resource 00a7a1a4, which @@ -1541,14 +1541,14 @@ COMMAND: dumpmd. This command lists information about a MethodDesc. You can use !IP2MD to turn a code address in a managed function into a MethodDesc: - 0:000> !dumpmd 902f40 - Method Name: Mainy.Main() - Class: 03ee1424 - MethodTable: 009032d8 - mdToken: 0600000d - Module: 001caa78 - IsJitted: yes - CodeAddr: 03ef00b8 + 0:000> !dumpmd 902f40 + Method Name: Mainy.Main() + Class: 03ee1424 + MethodTable: 009032d8 + mdToken: 0600000d + Module: 001caa78 + IsJitted: yes + CodeAddr: 03ef00b8 If IsJitted is "yes," you can run !U on the CodeAddr pointer to see a disassembly of the JITTED code. You can also call !DumpClass, !DumpMT, @@ -1561,18 +1561,18 @@ COMMAND: token2ee. This function allows you to turn a metadata token into a MethodTable or MethodDesc. Here is an example showing class tokens being resolved: - 0:000> !token2ee unittest.exe 02000003 - Module: 001caa38 - Token: 0x02000003 - MethodTable: 0090375c - EEClass: 03ee1ae0 - Name: Bank - 0:000> !token2ee image00400000 02000004 - Module: 001caa38 - Token: 0x02000004 - MethodTable: 009038ec - EEClass: 03ee1b84 - Name: Customer + 0:000> !token2ee unittest.exe 02000003 + Module: 001caa38 + Token: 0x02000003 + MethodTable: 0090375c + EEClass: 03ee1ae0 + Name: Bank + 0:000> !token2ee image00400000 02000004 + Module: 001caa38 + Token: 0x02000004 + MethodTable: 009038ec + EEClass: 03ee1b84 + Name: Customer The module you are "browsing" with Token2EE needs to be loaded in the process. This function doesn't see much use, especially since a tool like ILDASM can @@ -1603,28 +1603,28 @@ COMMAND: dumpmodule. You can get a Module address from !DumpDomain, !DumpAssembly and other functions. Here is sample output: - 0:000> !DumpModule 1caa50 - Name: C:\pub\unittest.exe - Attributes: PEFile - Assembly: 001ca248 - LoaderHeap: 001cab3c - TypeDefToMethodTableMap: 03ec0010 - TypeRefToMethodTableMap: 03ec0024 - MethodDefToDescMap: 03ec0064 - FieldDefToDescMap: 03ec00a4 - MemberRefToDescMap: 03ec00e8 - FileReferencesMap: 03ec0128 - AssemblyReferencesMap: 03ec012c - MetaData start address: 00402230 (1888 bytes) + 0:000> !DumpModule 1caa50 + Name: C:\pub\unittest.exe + Attributes: PEFile + Assembly: 001ca248 + LoaderHeap: 001cab3c + TypeDefToMethodTableMap: 03ec0010 + TypeRefToMethodTableMap: 03ec0024 + MethodDefToDescMap: 03ec0064 + FieldDefToDescMap: 03ec00a4 + MemberRefToDescMap: 03ec00e8 + FileReferencesMap: 03ec0128 + AssemblyReferencesMap: 03ec012c + MetaData start address: 00402230 (1888 bytes) The Maps listed map metadata tokens to CLR data structures. Without going into too much detail, you can examine memory at those addresses to find the appropriate structures. For example, the TypeDefToMethodTableMap above can be examined: - 0:000> dd 3ec0010 - 03ec0010 00000000 00000000 0090320c 0090375c - 03ec0020 009038ec ... + 0:000> dd 3ec0010 + 03ec0010 00000000 00000000 0090320c 0090375c + 03ec0020 009038ec ... This means TypeDef token 2 maps to a MethodTable with the value 0090320c. You can run !DumpMT to verify that. The MethodDefToDescMap takes a MethodDef token @@ -1633,28 +1633,28 @@ and maps it to a MethodDesc, which can be passed to !DumpMD. There is a new option "-mt", which will display the types defined in a module, and the types referenced by the module. For example: - 0:000> !dumpmodule -mt 1aa580 - Name: C:\pub\unittest.exe - ...... - MetaData start address: 0040220c (1696 bytes) + 0:000> !dumpmodule -mt 1aa580 + Name: C:\pub\unittest.exe + ...... + MetaData start address: 0040220c (1696 bytes) - Types defined in this module + Types defined in this module - MT TypeDef Name - -------------------------------------------------------------------------- - 030d115c 0x02000002 Funny - 030d1228 0x02000003 Mainy + MT TypeDef Name + -------------------------------------------------------------------------- + 030d115c 0x02000002 Funny + 030d1228 0x02000003 Mainy - Types referenced in this module + Types referenced in this module - MT TypeRef Name - -------------------------------------------------------------------------- - 030b6420 0x01000001 System.ValueType - 030b5cb0 0x01000002 System.Object - 030fceb4 0x01000003 System.Exception - 0334e374 0x0100000c System.Console - 03167a50 0x0100000e System.Runtime.InteropServices.GCHandle - 0336a048 0x0100000f System.GC + MT TypeRef Name + -------------------------------------------------------------------------- + 030b6420 0x01000001 System.ValueType + 030b5cb0 0x01000002 System.Object + 030fceb4 0x01000003 System.Exception + 0334e374 0x0100000c System.Console + 03167a50 0x0100000e System.Runtime.InteropServices.GCHandle + 0336a048 0x0100000f System.GC \\ @@ -1671,12 +1671,12 @@ COMMAND: dumpassembly. Example output: - 0:000> !dumpassembly 1ca248 - Parent Domain: 0014f000 - Name: C:\pub\unittest.exe - ClassLoader: 001ca060 - Module Name - 001caa50 C:\pub\unittest.exe + 0:000> !dumpassembly 1ca248 + Parent Domain: 0014f000 + Name: C:\pub\unittest.exe + ClassLoader: 001ca060 + Module Name + 001caa50 C:\pub\unittest.exe An assembly can consist of multiple modules, and those will be listed. You can get an Assembly address from the output of !DumpDomain. @@ -1688,18 +1688,18 @@ COMMAND: dumpruntimetypes. !DumpRuntimeTypes finds all System.RuntimeType objects in the gc heap and prints the type name and MethodTable they refer too. Sample output: - Address Domain MT Type Name - ------------------------------------------------------------------------------ - a515f4 14a740 5baf8d28 System.TypedReference - a51608 14a740 5bb05764 System.Globalization.BaseInfoTable - a51958 14a740 5bb05b24 System.Globalization.CultureInfo - a51a44 14a740 5bb06298 System.Globalization.GlobalizationAssembly - a51de0 14a740 5bb069c8 System.Globalization.TextInfo - a56b98 14a740 5bb12d28 System.Security.Permissions.HostProtectionResource - a56bbc 14a740 5baf7248 System.Int32 - a56bd0 14a740 5baf3fdc System.String - a56cfc 14a740 5baf36a4 System.ValueType - ... + Address Domain MT Type Name + ------------------------------------------------------------------------------ + a515f4 14a740 5baf8d28 System.TypedReference + a51608 14a740 5bb05764 System.Globalization.BaseInfoTable + a51958 14a740 5bb05b24 System.Globalization.CultureInfo + a51a44 14a740 5bb06298 System.Globalization.GlobalizationAssembly + a51de0 14a740 5bb069c8 System.Globalization.TextInfo + a56b98 14a740 5bb12d28 System.Security.Permissions.HostProtectionResource + a56bbc 14a740 5baf7248 System.Int32 + a56bd0 14a740 5baf3fdc System.String + a56cfc 14a740 5baf36a4 System.ValueType + ... This command will print a "?" in the domain column if the type is loaded into multiple AppDomains. For example: @@ -1890,22 +1890,22 @@ signs of corruption. It walks objects one by one in a pattern like this: If an error is found, !VerifyHeap will report it. I'll take a perfectly good object and corrupt it: - 0:000> !DumpObj a79d40 - Name: Customer - MethodTable: 009038ec - EEClass: 03ee1b84 - Size: 20(0x14) bytes - (C:\pub\unittest.exe) - Fields: - MT Field Offset Type Attr Value Name - 009038ec 4000008 4 CLASS instance 00a79ce4 name - 009038ec 4000009 8 CLASS instance 00a79d2c bank - 009038ec 400000a c System.Boolean instance 1 valid - - 0:000> ed a79d40+4 01 (change the name field to the bogus pointer value 1) - 0:000> !VerifyHeap - object 01ee60dc: bad member 00000003 at 01EE6168 - Last good object: 01EE60C4. + 0:000> !DumpObj a79d40 + Name: Customer + MethodTable: 009038ec + EEClass: 03ee1b84 + Size: 20(0x14) bytes + (C:\pub\unittest.exe) + Fields: + MT Field Offset Type Attr Value Name + 009038ec 4000008 4 CLASS instance 00a79ce4 name + 009038ec 4000009 8 CLASS instance 00a79d2c bank + 009038ec 400000a c System.Boolean instance 1 valid + + 0:000> ed a79d40+4 01 (change the name field to the bogus pointer value 1) + 0:000> !VerifyHeap + object 01ee60dc: bad member 00000003 at 01EE6168 + Last good object: 01EE60C4. If this gc heap corruption exists, there is a serious bug in your own code or in the CLR. In user code, an error in constructing PInvoke calls can cause @@ -1921,11 +1921,11 @@ COMMAND: verifyobj. !VerifyObj is a diagnostic tool that checks the object that is passed as an argument for signs of corruption. - 0:002> !verifyobj 028000ec - object 0x28000ec does not have valid method table + 0:002> !verifyobj 028000ec + object 0x28000ec does not have valid method table - 0:002> !verifyobj 0680017c - object 0x680017c: bad member 00000001 at 06800184 + 0:002> !verifyobj 0680017c + object 0x680017c: bad member 00000001 at 06800184 \\ @@ -1952,18 +1952,18 @@ The process of answering the question would go something like this: 1. Find out the generation of the object of interest using the !GCWhere command, say it is gen 1: - !GCWhere + !GCWhere 2. Instruct the runtime to stop the next time it collects that generation using the !FindRoots command: - !FindRoots -gen 1 - g + !FindRoots -gen 1 + g 3. When the next GC starts, and has proceeded past the mark phase a CLR notification will cause a break in the debugger: - (fd0.ec4): CLR notification exception - code e0444143 (first chance) - CLR notification: GC - end of mark phase. - Condemned generation: 1. + (fd0.ec4): CLR notification exception - code e0444143 (first chance) + CLR notification: GC - end of mark phase. + Condemned generation: 1. 4. Now we can use the !FindRoots to find out the cross generational references to the object of interest. In other words, even if the @@ -1971,9 +1971,9 @@ object is not referenced by any "proper" root it may still be referenced by an older object (from an older generation), from a generation that has not yet been scheduled for collection. At this point !FindRoots will search those older generations too, and report those roots. - 0:002> !findroots 06808094 - older generations::Root: 068012f8(AAA.Test+a)-> - 06808094(AAA.Test+b) + 0:002> !findroots 06808094 + older generations::Root: 068012f8(AAA.Test+a)-> + 06808094(AAA.Test+b) \\ @@ -1988,32 +1988,32 @@ GC heap that are not rooted anymore. Sample output: - 0:002> !heapstat - Heap Gen0 Gen1 Gen2 LOH - Heap0 177904 12 306956 8784 - Heap1 159652 12 12 16 - Total 337556 24 306968 8800 - - Free space: Percentage - Heap0 28 12 12 64 SOH: 0%% LOH: 0%% - Heap1 104 12 12 16 SOH: 0%% LOH:100%% - Total 132 24 24 80 - - 0:002> !heapstat -inclUnrooted - Heap Gen0 Gen1 Gen2 LOH - Heap0 177904 12 306956 8784 - Heap1 159652 12 12 16 - Total 337556 24 306968 8800 - - Free space: Percentage - Heap0 28 12 12 64 SOH: 0%% LOH: 0%% - Heap1 104 12 12 16 SOH: 0%% LOH:100%% - Total 132 24 24 80 - - Unrooted objects: Percentage - Heap0 152212 0 306196 0 SOH: 94%% LOH: 0%% - Heap1 155704 0 0 0 SOH: 97%% LOH: 0%% - Total 307916 0 306196 0 + 0:002> !heapstat + Heap Gen0 Gen1 Gen2 LOH + Heap0 177904 12 306956 8784 + Heap1 159652 12 12 16 + Total 337556 24 306968 8800 + + Free space: Percentage + Heap0 28 12 12 64 SOH: 0%% LOH: 0%% + Heap1 104 12 12 16 SOH: 0%% LOH:100%% + Total 132 24 24 80 + + 0:002> !heapstat -inclUnrooted + Heap Gen0 Gen1 Gen2 LOH + Heap0 177904 12 306956 8784 + Heap1 159652 12 12 16 + Total 337556 24 306968 8800 + + Free space: Percentage + Heap0 28 12 12 64 SOH: 0%% LOH: 0%% + Heap1 104 12 12 16 SOH: 0%% LOH:100%% + Total 132 24 24 80 + + Unrooted objects: Percentage + Heap0 152212 0 306196 0 SOH: 94%% LOH: 0%% + Heap1 155704 0 0 0 SOH: 97%% LOH: 0%% + Total 307916 0 306196 0 The percentage column contains a breakout of free or unrooted bytes to total bytes. @@ -2083,16 +2083,16 @@ COMMAND: gcwhere. !GCWhere displays the location in the GC heap of the argument passed in. - 0:002> !GCWhere 02800038 - Address Gen Heap segment begin allocated size - 02800038 2 0 02800000 02800038 0282b740 12 + 0:002> !GCWhere 02800038 + Address Gen Heap segment begin allocated size + 02800038 2 0 02800000 02800038 0282b740 12 When the argument lies in the managed heap, but is not a valid *object* address the "size" is displayed as 0: - 0:002> !GCWhere 0280003c - Address Gen Heap segment begin allocated size - 0280003c 2 0 02800000 02800038 0282b740 0 + 0:002> !GCWhere 0280003c + Address Gen Heap segment begin allocated size + 0280003c 2 0 02800000 02800038 0282b740 0 \\ @@ -2107,27 +2107,27 @@ The command looks for the address in the GC heap that looks like a valid beginning of a managed object (based on a valid method table) and the object following the argument address. - 0:002> !ListNearObj 028000ec - Before: 0x28000a4 72 (0x48 ) System.StackOverflowException - After: 0x2800134 72 (0x48 ) System.Threading.ThreadAbortException - Heap local consistency confirmed. + 0:002> !ListNearObj 028000ec + Before: 0x28000a4 72 (0x48 ) System.StackOverflowException + After: 0x2800134 72 (0x48 ) System.Threading.ThreadAbortException + Heap local consistency confirmed. - 0:002> !ListNearObj 028000f0 - Before: 0x28000ec 72 (0x48 ) System.ExecutionEngineException - After: 0x2800134 72 (0x48 ) System.Threading.ThreadAbortException - Heap local consistency confirmed. + 0:002> !ListNearObj 028000f0 + Before: 0x28000ec 72 (0x48 ) System.ExecutionEngineException + After: 0x2800134 72 (0x48 ) System.Threading.ThreadAbortException + Heap local consistency confirmed. The command considers the heap as "locally consistent" if: - prev_obj_addr + prev_obj_size = arg_addr && arg_obj + arg_size = next_obj_addr + prev_obj_addr + prev_obj_size = arg_addr && arg_obj + arg_size = next_obj_addr OR - prev_obj_addr + prev_obj_size = next_obj_addr + prev_obj_addr + prev_obj_size = next_obj_addr When the condition is not satisfied: - 0:002> !lno 028000ec - Before: 0x28000a4 72 (0x48 ) System.StackOverflowException - After: 0x2800134 72 (0x48 ) System.Threading.ThreadAbortException - Heap local consistency not confirmed. + 0:002> !lno 028000ec + Before: 0x28000a4 72 (0x48 ) System.StackOverflowException + After: 0x2800134 72 (0x48 ) System.Threading.ThreadAbortException + Heap local consistency not confirmed. \\ @@ -2143,10 +2143,10 @@ in the current directory is created. The optional argument addr allows one to specify a stress log other then the default one. - 0:000> !DumpLog - Attempting to dump Stress log to file 'StressLog.txt' - ................. - SUCCESS: Stress log dumped + 0:000> !DumpLog + Attempting to dump Stress log to file 'StressLog.txt' + ................. + SUCCESS: Stress log dumped To turn on the stress log, set the following environment variables before starting the .NET Core app: @@ -2204,27 +2204,27 @@ The log facilities are defined as follows: Here is some sample output: - 3560 9.981137099 : `SYNC` RareEnablePremptiveGC: entering. - Thread state = a030 + 3560 9.981137099 : `SYNC` RareEnablePremptiveGC: entering. + Thread state = a030 - 3560 9.981135033 : `GC`GCALLOC`GCROOTS` ========== ENDGC 4194 (gen = 2, - collect_classes = 0) ==========={ + 3560 9.981135033 : `GC`GCALLOC`GCROOTS` ========== ENDGC 4194 (gen = 2, + collect_classes = 0) ==========={ - 3560 9.981125826 : `GC` Segment mem 00C61000 alloc - = 00D071F0 used 00D09254 committed 00D17000 + 3560 9.981125826 : `GC` Segment mem 00C61000 alloc + = 00D071F0 used 00D09254 committed 00D17000 - 3560 9.981125726 : `GC` Generation 0 [00CED07C, 00000000 - ] cur = 00000000 + 3560 9.981125726 : `GC` Generation 0 [00CED07C, 00000000 + ] cur = 00000000 - 3560 9.981125529 : `GC` Generation 1 [00CED070, 00000000 - ] cur = 00000000 + 3560 9.981125529 : `GC` Generation 1 [00CED070, 00000000 + ] cur = 00000000 - 3560 9.981125103 : `GC` Generation 2 [00C61000, 00000000 - ] cur = 00000000 + 3560 9.981125103 : `GC` Generation 2 [00C61000, 00000000 + ] cur = 00000000 - 3560 9.981124963 : `GC` GC Heap 00000000 + 3560 9.981124963 : `GC` GC Heap 00000000 - 3560 9.980618994 : `GC`GCROOTS` GcScanHandles (Promotion Phase = 0) + 3560 9.980618994 : `GC`GCROOTS` GcScanHandles (Promotion Phase = 0) The first column is the OS thread ID for the thread appending to the log, the second column is the timestamp, the third is the facility category for the @@ -2241,10 +2241,10 @@ COMMAND: findappdomain. !FindAppDomain will attempt to resolve the AppDomain of an object. For example, using an Object Pointer from the output of !DumpStackObjects: - 0:000> !findappdomain 00a79d98 - AppDomain: 0014f000 - Name: unittest.exe - ID: 1 + 0:000> !findappdomain 00a79d98 + AppDomain: 0014f000 + Name: unittest.exe + ID: 1 You can find out more about the AppDomain with the !DumpDomain command. Not every object has enough clues about it's origin to determine the AppDomain. @@ -2262,24 +2262,24 @@ binary to a file, so you can disassemble the code and browse types with ILDASM. The base address of an image can be found with the "LM" debugger command: - 0:000> lm - start end module name - 00400000 00408000 image00400000 (deferred) - 10200000 102ac000 MSVCR80D (deferred) - 5a000000 5a0b1000 mscoree (deferred) - 5a140000 5a29e000 clrjit (deferred) - 5b660000 5c440000 mscorlib_dll (deferred) - 5d1d0000 5e13c000 clr (deferred) - ... + 0:000> lm + start end module name + 00400000 00408000 image00400000 (deferred) + 10200000 102ac000 MSVCR80D (deferred) + 5a000000 5a0b1000 mscoree (deferred) + 5a140000 5a29e000 clrjit (deferred) + 5b660000 5c440000 mscorlib_dll (deferred) + 5d1d0000 5e13c000 clr (deferred) + ... If I wanted to save a copy of coreclr.dll, I could run: - 0:000> !SaveModule 5d1d0000 c:\pub\out.tmp - 4 sections in file - section 0 - VA=1000, VASize=e82da9, FileAddr=400, FileSize=e82e00 - section 1 - VA=e84000, VASize=24d24, FileAddr=e83200, FileSize=ec00 - section 2 - VA=ea9000, VASize=5a8, FileAddr=e91e00, FileSize=600 - section 3 - VA=eaa000, VASize=c183c, FileAddr=e92400, FileSize=c1a00 + 0:000> !SaveModule 5d1d0000 c:\pub\out.tmp + 4 sections in file + section 0 - VA=1000, VASize=e82da9, FileAddr=400, FileSize=e82e00 + section 1 - VA=e84000, VASize=24d24, FileAddr=e83200, FileSize=ec00 + section 2 - VA=ea9000, VASize=5a8, FileAddr=e91e00, FileSize=600 + section 3 - VA=eaa000, VASize=c183c, FileAddr=e92400, FileSize=c1a00 The diagnostic output indicates that the operation was successful. If c:\pub\out.tmp already exists, it will be overwritten. @@ -2394,15 +2394,15 @@ COMMAND: vmmap. !VMMap traverses the virtual address space and lists the type of protection applied to each region. Sample output: - 0:000> !VMMap - Start Stop Length AllocProtect Protect State Type - 00000000-0000ffff 00010000 NA Free - 00010000-00011fff 00002000 RdWr RdWr Commit Private - 00012000-0001ffff 0000e000 NA Free - 00020000-00020fff 00001000 RdWr RdWr Commit Private - 00021000-0002ffff 0000f000 NA Free - 00030000-00030fff 00001000 RdWr Reserve Private - ... + 0:000> !VMMap + Start Stop Length AllocProtect Protect State Type + 00000000-0000ffff 00010000 NA Free + 00010000-00011fff 00002000 RdWr RdWr Commit Private + 00012000-0001ffff 0000e000 NA Free + 00020000-00020fff 00001000 RdWr RdWr Commit Private + 00021000-0002ffff 0000f000 NA Free + 00030000-00030fff 00001000 RdWr Reserve Private + ... \\ COMMAND: vmstat. @@ -2412,20 +2412,20 @@ Provides a summary view of the virtual address space, ordered by each type of protection applied to that memory (free, reserved, committed, private, mapped, image). The TOTAL column is (AVERAGE * BLK COUNT). Sample output below: - 0:000> !VMStat - ~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~~~ ~~~~~ - TYPE MINIMUM MAXIMUM AVERAGE BLK COUNT TOTAL - Free: - Small 4,096 65,536 48,393 27 1,306,611 - Medium 139,264 528,384 337,920 4 1,351,680 - Large 6,303,744 974,778,368 169,089,706 12 2,029,076,472 - Summary 4,096 974,778,368 47,249,646 43 2,031,734,778 + 0:000> !VMStat + ~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~~~ ~~~~~ + TYPE MINIMUM MAXIMUM AVERAGE BLK COUNT TOTAL + Free: + Small 4,096 65,536 48,393 27 1,306,611 + Medium 139,264 528,384 337,920 4 1,351,680 + Large 6,303,744 974,778,368 169,089,706 12 2,029,076,472 + Summary 4,096 974,778,368 47,249,646 43 2,031,734,778 - Reserve: - Small 4,096 65,536 43,957 41 1,802,237 - Medium 249,856 1,019,904 521,557 6 3,129,342 - Large 2,461,696 16,703,488 11,956,224 3 35,868,672 - Summary 4,096 16,703,488 816,005 50 40,800,250 + Reserve: + Small 4,096 65,536 43,957 41 1,802,237 + Medium 249,856 1,019,904 521,557 6 3,129,342 + Large 2,461,696 16,703,488 11,956,224 3 35,868,672 + Summary 4,096 16,703,488 816,005 50 40,800,250 \\ @@ -2445,24 +2445,24 @@ HistInit command. Sample output: - 0:001> !HistInit - Attempting to read Stress log - STRESS LOG: - facilitiesToLog = 0xffffffff - levelToLog = 6 - MaxLogSizePerThread = 0x10000 (65536) - MaxTotalLogSize = 0x1000000 (16777216) - CurrentTotalLogChunk = 9 - ThreadsWithLogs = 3 - Clock frequency = 3.392 GHz - Start time 15:26:31 - Last message time 15:26:56 - Total elapsed time 25.077 sec - ..................................... - ---------------------------- 2407 total entries ----------------------------- + 0:001> !HistInit + Attempting to read Stress log + STRESS LOG: + facilitiesToLog = 0xffffffff + levelToLog = 6 + MaxLogSizePerThread = 0x10000 (65536) + MaxTotalLogSize = 0x1000000 (16777216) + CurrentTotalLogChunk = 9 + ThreadsWithLogs = 3 + Clock frequency = 3.392 GHz + Start time 15:26:31 + Last message time 15:26:56 + Total elapsed time 25.077 sec + ..................................... + ---------------------------- 2407 total entries ----------------------------- - SUCCESS: GCHist structures initialized + SUCCESS: GCHist structures initialized \\ @@ -2473,17 +2473,17 @@ To examine log entries related to an object whose present address is known one would use this command. The output of this command contains all entries that reference the object: - 0:003> !HistObjFind 028970d4 - GCCount Object Message - --------------------------------------------------------- - 2296 028970d4 Promotion for root 01e411b8 (MT = 5b6c5cd8) - 2296 028970d4 Relocation NEWVALUE for root 00223fc4 - 2296 028970d4 Relocation NEWVALUE for root 01e411b8 - ... - 2295 028970d4 Promotion for root 01e411b8 (MT = 5b6c5cd8) - 2295 028970d4 Relocation NEWVALUE for root 00223fc4 - 2295 028970d4 Relocation NEWVALUE for root 01e411b8 - ... + 0:003> !HistObjFind 028970d4 + GCCount Object Message + --------------------------------------------------------- + 2296 028970d4 Promotion for root 01e411b8 (MT = 5b6c5cd8) + 2296 028970d4 Relocation NEWVALUE for root 00223fc4 + 2296 028970d4 Relocation NEWVALUE for root 01e411b8 + ... + 2295 028970d4 Promotion for root 01e411b8 (MT = 5b6c5cd8) + 2295 028970d4 Relocation NEWVALUE for root 00223fc4 + 2295 028970d4 Relocation NEWVALUE for root 01e411b8 + ... \\ @@ -2496,23 +2496,23 @@ an object through the GCs. HistRoot provides information related to both promotions and relocations of the root specified as the argument. - 0:003> !HistRoot 01e411b8 - GCCount Value MT Promoted? Notes - --------------------------------------------------------- - 2296 028970d4 5b6c5cd8 yes - 2295 028970d4 5b6c5cd8 yes - 2294 028970d4 5b6c5cd8 yes - 2293 028970d4 5b6c5cd8 yes - 2292 028970d4 5b6c5cd8 yes - 2291 028970d4 5b6c5cd8 yes - 2290 028970d4 5b6c5cd8 yes - 2289 028970d4 5b6c5cd8 yes - 2288 028970d4 5b6c5cd8 yes - 2287 028970d4 5b6c5cd8 yes - 2286 028970d4 5b6c5cd8 yes - 2285 028970d4 5b6c5cd8 yes - 322 028970e8 5b6c5cd8 yes Duplicate promote/relocs - ... + 0:003> !HistRoot 01e411b8 + GCCount Value MT Promoted? Notes + --------------------------------------------------------- + 2296 028970d4 5b6c5cd8 yes + 2295 028970d4 5b6c5cd8 yes + 2294 028970d4 5b6c5cd8 yes + 2293 028970d4 5b6c5cd8 yes + 2292 028970d4 5b6c5cd8 yes + 2291 028970d4 5b6c5cd8 yes + 2290 028970d4 5b6c5cd8 yes + 2289 028970d4 5b6c5cd8 yes + 2288 028970d4 5b6c5cd8 yes + 2287 028970d4 5b6c5cd8 yes + 2286 028970d4 5b6c5cd8 yes + 2285 028970d4 5b6c5cd8 yes + 322 028970e8 5b6c5cd8 yes Duplicate promote/relocs + ... \\ @@ -2523,29 +2523,29 @@ This command examines all stress log relocation records and displays the chain of GC relocations that may have led to the address passed in as an argument. Conceptually the output is: - GenN obj_address root1, root2, root3, - GenN-1 prev_obj_addr root1, root2, - GenN-2 prev_prev_oa root1, root4, - ... + GenN obj_address root1, root2, root3, + GenN-1 prev_obj_addr root1, root2, + GenN-2 prev_prev_oa root1, root4, + ... Sample output: - 0:003> !HistObj 028970d4 - GCCount Object Roots - --------------------------------------------------------- - 2296 028970d4 00223fc4, 01e411b8, - 2295 028970d4 00223fc4, 01e411b8, - 2294 028970d4 00223fc4, 01e411b8, - 2293 028970d4 00223fc4, 01e411b8, - 2292 028970d4 00223fc4, 01e411b8, - 2291 028970d4 00223fc4, 01e411b8, - 2290 028970d4 00223fc4, 01e411b8, - 2289 028970d4 00223fc4, 01e411b8, - 2288 028970d4 00223fc4, 01e411b8, - 2287 028970d4 00223fc4, 01e411b8, - 2286 028970d4 00223fc4, 01e411b8, - 2285 028970d4 00223fc4, 01e411b8, - 322 028970d4 01e411b8, - 0 028970d4 + 0:003> !HistObj 028970d4 + GCCount Object Roots + --------------------------------------------------------- + 2296 028970d4 00223fc4, 01e411b8, + 2295 028970d4 00223fc4, 01e411b8, + 2294 028970d4 00223fc4, 01e411b8, + 2293 028970d4 00223fc4, 01e411b8, + 2292 028970d4 00223fc4, 01e411b8, + 2291 028970d4 00223fc4, 01e411b8, + 2290 028970d4 00223fc4, 01e411b8, + 2289 028970d4 00223fc4, 01e411b8, + 2288 028970d4 00223fc4, 01e411b8, + 2287 028970d4 00223fc4, 01e411b8, + 2286 028970d4 00223fc4, 01e411b8, + 2285 028970d4 00223fc4, 01e411b8, + 322 028970d4 01e411b8, + 0 028970d4 \\ @@ -2556,8 +2556,8 @@ This command releases any resources used by the Hist-family of commands. Generally there's no need to call this explicitly, as each HistInit will first cleanup the previous resources. - 0:003> !HistClear - Completed successfully. + 0:003> !HistClear + Completed successfully. \\ @@ -2633,7 +2633,7 @@ COMMAND: sosstatus. -desktop - switch to the desktop runtime if loaded. -netcore - switch to the .NET Core runtime if loaded. --reset - reset all the cached internal SOS state. +-reset - reset all the cached internal SOS state. Display internal SOS status, reset the internal cached state, or change between desktop or netcore runtimes when both are loaded in the process or dump. diff --git a/src/SOS/Strike/sosdocsunix.txt b/src/SOS/Strike/sosdocsunix.txt index e2200387d4..196a45be26 100644 --- a/src/SOS/Strike/sosdocsunix.txt +++ b/src/SOS/Strike/sosdocsunix.txt @@ -39,7 +39,7 @@ Examining CLR data structures Diagnostic Utilities DumpDomain (dumpdomain) VerifyHeap EEHeap (eeheap) FindAppDomain Name2EE (name2ee) DumpLog (dumplog) -SyncBlk (syncblk) +SyncBlk (syncblk) SuppressJitOptimization DumpMT (dumpmt) DumpClass (dumpclass) DumpMD (dumpmd) @@ -84,10 +84,10 @@ you can now set a breakpoint on Main with "bpmd". (lldb) bpmd Foo.dll Program.Main >> I got the following error message. Now what? - - (lldb) sos DumpStackObjects - The coreclr module is not loaded yet in the target process - (lldb) + + (lldb) sos DumpStackObjects + The coreclr module is not loaded yet in the target process + (lldb) This means that the clr is not loaded yet, or has been unloaded. You need to wait until your managed program is running in order to use these commands. If @@ -110,16 +110,16 @@ the size. You might find an object pointer by running DumpStackObjects and choosing from the resultant list. Here is a simple object: - (lldb) dumpobj a79d40 - Name: Customer - MethodTable: 009038ec - EEClass: 03ee1b84 - Size: 20(0x14) bytes - (/home/user/pub/unittest) - Fields: - MT Field Offset Type VT Attr Value Name - 009038ec 4000008 4 Customer 0 instance 00a79ce4 name - 009038ec 4000009 8 Bank 0 instance 00a79d2c bank + (lldb) dumpobj a79d40 + Name: Customer + MethodTable: 009038ec + EEClass: 03ee1b84 + Size: 20(0x14) bytes + (/home/user/pub/unittest) + Fields: + MT Field Offset Type VT Attr Value Name + 009038ec 4000008 4 Customer 0 instance 00a79ce4 name + 009038ec 4000009 8 Bank 0 instance 00a79d2c bank Note that fields of type Customer and Bank are themselves objects, and you can run DumpObj on them too. You could look at the field directly in memory using @@ -142,11 +142,11 @@ The arguments in detail: COMMAND: dumparray. DumpArray - [-start ] - [-length ] - [-details] - [-nofields] - + [-start ] + [-length ] + [-details] + [-nofields] + This command allows you to examine elements of an array object. The arguments in detail: @@ -162,46 +162,46 @@ The arguments in detail: Example output: - (lldb) sos DumpArray -start 2 -length 3 -details 00ad28d0 - Name: Value[] - MethodTable: 03e41044 - EEClass: 03e40fc0 - Size: 132(0x84) bytes - Array: Rank 1, Number of elements 10, Type VALUETYPE - Element Type: Value - [2] 00ad28f0 - Name: Value - MethodTable 03e40f4c - EEClass: 03ef1698 - Size: 20(0x14) bytes - (/home/user/bugs/225271/arraytest) - Fields: - MT Field Offset Type Attr Value Name - 5b9a628c 4000001 0 System.Int32 instance 2 x - 5b9a628c 4000002 4 System.Int32 instance 4 y - 5b9a628c 4000003 8 System.Int32 instance 6 z - [3] 00ad28fc - Name: Value - MethodTable 03e40f4c - EEClass: 03ef1698 - Size: 20(0x14) bytes - (/home/user/bugs/225271/arraytest) - Fields: - MT Field Offset Type Attr Value Name - 5b9a628c 4000001 0 System.Int32 instance 3 x - 5b9a628c 4000002 4 System.Int32 instance 6 y - 5b9a628c 4000003 8 System.Int32 instance 9 z - [4] 00ad2908 - Name: Value - MethodTable 03e40f4c - EEClass: 03ef1698 - Size: 20(0x14) bytes - (/home/user/bugs/225271/arraytest.exe) - Fields: - MT Field Offset Type Attr Value Name - 5b9a628c 4000001 0 System.Int32 instance 4 x - 5b9a628c 4000002 4 System.Int32 instance 8 y - 5b9a628c 4000003 8 System.Int32 instance 12 z + (lldb) sos DumpArray -start 2 -length 3 -details 00ad28d0 + Name: Value[] + MethodTable: 03e41044 + EEClass: 03e40fc0 + Size: 132(0x84) bytes + Array: Rank 1, Number of elements 10, Type VALUETYPE + Element Type: Value + [2] 00ad28f0 + Name: Value + MethodTable 03e40f4c + EEClass: 03ef1698 + Size: 20(0x14) bytes + (/home/user/bugs/225271/arraytest) + Fields: + MT Field Offset Type Attr Value Name + 5b9a628c 4000001 0 System.Int32 instance 2 x + 5b9a628c 4000002 4 System.Int32 instance 4 y + 5b9a628c 4000003 8 System.Int32 instance 6 z + [3] 00ad28fc + Name: Value + MethodTable 03e40f4c + EEClass: 03ef1698 + Size: 20(0x14) bytes + (/home/user/bugs/225271/arraytest) + Fields: + MT Field Offset Type Attr Value Name + 5b9a628c 4000001 0 System.Int32 instance 3 x + 5b9a628c 4000002 4 System.Int32 instance 6 y + 5b9a628c 4000003 8 System.Int32 instance 9 z + [4] 00ad2908 + Name: Value + MethodTable 03e40f4c + EEClass: 03ef1698 + Size: 20(0x14) bytes + (/home/user/bugs/225271/arraytest.exe) + Fields: + MT Field Offset Type Attr Value Name + 5b9a628c 4000001 0 System.Int32 instance 4 x + 5b9a628c 4000002 4 System.Int32 instance 8 y + 5b9a628c 4000003 8 System.Int32 instance 12 z \\ COMMAND: dumpasync. @@ -274,26 +274,26 @@ fragmentation in the GC heap. When called without options, the output is first a list of objects in the heap, followed by a report listing all the types found, their size and number: - (lldb) dumpheap - Address MT Size - 00a71000 0015cde8 12 Free - 00a7100c 0015cde8 12 Free - 00a71018 0015cde8 12 Free - 00a71024 5ba58328 68 - 00a71068 5ba58380 68 - 00a710ac 5ba58430 68 - 00a710f0 5ba5dba4 68 - ... - total 619 objects - Statistics: - MT Count TotalSize Class Name - 5ba7607c 1 12 System.Security.Permissions.HostProtectionResource - 5ba75d54 1 12 System.Security.Permissions.SecurityPermissionFlag - 5ba61f18 1 12 System.Collections.CaseInsensitiveComparer - ... - 0015cde8 6 10260 Free - 5ba57bf8 318 18136 System.String - ... + (lldb) dumpheap + Address MT Size + 00a71000 0015cde8 12 Free + 00a7100c 0015cde8 12 Free + 00a71018 0015cde8 12 Free + 00a71024 5ba58328 68 + 00a71068 5ba58380 68 + 00a710ac 5ba58430 68 + 00a710f0 5ba5dba4 68 + ... + total 619 objects + Statistics: + MT Count TotalSize Class Name + 5ba7607c 1 12 System.Security.Permissions.HostProtectionResource + 5ba75d54 1 12 System.Security.Permissions.SecurityPermissionFlag + 5ba61f18 1 12 System.Collections.CaseInsensitiveComparer + ... + 0015cde8 6 10260 Free + 5ba57bf8 318 18136 System.String + ... "Free" objects are simply regions of space the garbage collector can use later. If 30% or more of the heap contains "Free" objects, the process may suffer from @@ -301,12 +301,12 @@ heap fragmentation. This is usually caused by pinning objects for a long time combined with a high rate of allocation. Here is example output where DumpHeap provides a warning about fragmentation: - - Fragmented blocks larger than 1MB: - Addr Size Followed by - 00a780c0 1.5MB 00bec800 System.Byte[] - 00da4e38 1.2MB 00ed2c00 System.Byte[] - 00f16df0 1.2MB 01044338 System.Byte[] + + Fragmented blocks larger than 1MB: + Addr Size Followed by + 00a780c0 1.5MB 00bec800 System.Byte[] + 00da4e38 1.2MB 00ed2c00 System.Byte[] + 00f16df0 1.2MB 01044338 System.Byte[] The arguments in detail: @@ -354,41 +354,41 @@ be returned. More generally, "-type []". The start/end parameters can be obtained from the output of eeheap -gc. For example, if you only want to list objects in the large heap segment: - (lldb) eeheap -gc - Number of GC Heaps: 1 - generation 0 starts at 0x00c32754 - generation 1 starts at 0x00c32748 - generation 2 starts at 0x00a71000 - segment begin allocated size - 00a70000 00a71000 010443a8 005d33a8(6108072) - Large object heap starts at 0x01a71000 - segment begin allocated size - 01a70000 01a71000 01a75000 0x00004000(16384) - Total Size 0x5d73a8(6124456) - ------------------------------ - GC Heap Size 0x5d73a8(6124456) - - (lldb) dumpheap 1a71000 1a75000 - Address MT Size - 01a71000 5ba88bd8 2064 - 01a71810 0019fe48 2032 Free - 01a72000 5ba88bd8 4096 - 01a73000 0019fe48 4096 Free - 01a74000 5ba88bd8 4096 - total 5 objects - Statistics: - MT Count TotalSize Class Name - 0019fe48 2 6128 Free - 5ba88bd8 3 10256 System.Object[] - Total 5 objects + (lldb) eeheap -gc + Number of GC Heaps: 1 + generation 0 starts at 0x00c32754 + generation 1 starts at 0x00c32748 + generation 2 starts at 0x00a71000 + segment begin allocated size + 00a70000 00a71000 010443a8 005d33a8(6108072) + Large object heap starts at 0x01a71000 + segment begin allocated size + 01a70000 01a71000 01a75000 0x00004000(16384) + Total Size 0x5d73a8(6124456) + ------------------------------ + GC Heap Size 0x5d73a8(6124456) + + (lldb) dumpheap 1a71000 1a75000 + Address MT Size + 01a71000 5ba88bd8 2064 + 01a71810 0019fe48 2032 Free + 01a72000 5ba88bd8 4096 + 01a73000 0019fe48 4096 Free + 01a74000 5ba88bd8 4096 + total 5 objects + Statistics: + MT Count TotalSize Class Name + 0019fe48 2 6128 Free + 5ba88bd8 3 10256 System.Object[] + Total 5 objects Finally, if GC heap corruption is present, you may see an error like this: - (lldb) dumpheap -stat - object 00a73d24: does not have valid MT - curr_object : 00a73d24 - Last good object: 00a73d14 - ---------------- + (lldb) dumpheap -stat + object 00a73d24: does not have valid MT + curr_object : 00a73d24 + Last good object: 00a73d14 + ---------------- That indicates a serious problem. See the help for VerifyHeap for more information on diagnosing the cause. @@ -403,33 +403,33 @@ to know the MethodTable address to tell SOS how to interpret the fields, as a value class is not a first-class object with it's own MethodTable as the first field. For example: - (lldb) sos DumpObj a79d98 - Name: Mainy - MethodTable: 009032d8 - EEClass: 03ee1424 - Size: 28(0x1c) bytes - (/home/user/pub/unittest) - Fields: - MT Field Offset Type Attr Value Name - 0090320c 4000010 4 VALUETYPE instance 00a79d9c m_valuetype - 009032d8 400000f 4 CLASS static 00a79d54 m_sExcep + (lldb) sos DumpObj a79d98 + Name: Mainy + MethodTable: 009032d8 + EEClass: 03ee1424 + Size: 28(0x1c) bytes + (/home/user/pub/unittest) + Fields: + MT Field Offset Type Attr Value Name + 0090320c 4000010 4 VALUETYPE instance 00a79d9c m_valuetype + 009032d8 400000f 4 CLASS static 00a79d54 m_sExcep m_valuetype is a value type. The value in the MT column (0090320c) is the MethodTable for it, and the Value column provides the start address: - (lldb) sos DumpVC 0090320c 00a79d9c - Name: Funny - MethodTable 0090320c - EEClass: 03ee14b8 - Size: 28(0x1c) bytes - (/home/user/pub/unittest) - Fields: - MT Field Offset Type Attr Value Name - 0090320c 4000001 0 CLASS instance 00a743d8 signature - 0090320c 4000002 8 System.Int32 instance 2345 m1 - 0090320c 4000003 10 System.Boolean instance 1 b1 - 0090320c 4000004 c System.Int32 instance 1234 m2 - 0090320c 4000005 4 CLASS instance 00a79d98 backpointer + (lldb) sos DumpVC 0090320c 00a79d9c + Name: Funny + MethodTable 0090320c + EEClass: 03ee14b8 + Size: 28(0x1c) bytes + (/home/user/pub/unittest) + Fields: + MT Field Offset Type Attr Value Name + 0090320c 4000001 0 CLASS instance 00a743d8 signature + 0090320c 4000002 8 System.Int32 instance 2345 m1 + 0090320c 4000003 10 System.Boolean instance 1 b1 + 0090320c 4000004 c System.Int32 instance 1234 m2 + 0090320c 4000005 4 CLASS instance 00a79d98 backpointer DumpVC is quite a specialized function. Some managed programs make heavy use of value classes, while others do not. @@ -691,7 +691,7 @@ IP2MD Given an address in managed JITTED code, IP2MD attempts to find the MethodDesc associated with it. For example, this output from K: - (lldb) bt + (lldb) bt ... frame #9: 0x00007fffffffbf60 0x00007ffff61c6d89 libcoreclr.so`MethodDesc::DoPrestub(this=0x00007ffff041f870, pDispatchingMT=0x0000000000000000) + 3001 at prestub.cpp:1490 frame #10: 0x00007fffffffc140 0x00007ffff61c5f17 libcoreclr.so`::PreStubWorker(pTransitionBlock=0x00007fffffffc9a8, pMD=0x00007ffff041f870) + 1399 at prestub.cpp:1037 @@ -704,7 +704,7 @@ associated with it. For example, this output from K: frame #23: 0x00007fffffffccb0 0x00007ffff5d6d6dc libcoreclr.so`CallDescrWorkerWithHandler(pCallDescrData=0x00007fffffffce80, fCriticalCall=0) + 476 at callhelpers.cpp:88 frame #24: 0x00007fffffffcd00 0x00007ffff5d6eb38 libcoreclr.so`MethodDescCallSite::CallTargetWorker(this=0x00007fffffffd0c8, pArguments=0x00007fffffffd048) + 2504 at callhelpers.cpp:633 - (lldb) ip2md 0x00007ffff049773c + (lldb) ip2md 0x00007ffff049773c MethodDesc: 00007ffff7f71920 Method Name: Microsoft.Win32.SafeHandles.SafeFileHandle.Open(System.Func`1) Class: 00007ffff0494bf8 @@ -732,12 +732,12 @@ pointer for the method, or a code address within the method body. Unlike the debugger "U" function, the entire method from start to finish is printed, with annotations that convert metadata tokens to names. - - ... - 03ef015d b901000000 mov ecx,0x1 - 03ef0162 ff156477a25b call dword ptr [mscorlib_dll+0x3c7764 (5ba27764)] (System.Console.InitializeStdOutError(Boolean), mdToken: 06000713) - 03ef0168 a17c20a701 mov eax,[01a7207c] (Object: SyncTextWriter) - 03ef016d 89442414 mov [esp+0x14],eax + + ... + 03ef015d b901000000 mov ecx,0x1 + 03ef0162 ff156477a25b call dword ptr [mscorlib_dll+0x3c7764 (5ba27764)] (System.Console.InitializeStdOutError(Boolean), mdToken: 06000713) + 03ef0168 a17c20a701 mov eax,[01a7207c] (Object: SyncTextWriter) + 03ef016d 89442414 mov [esp+0x14],eax If you pass the -gcinfo flag, you'll get inline display of the GCInfo for the method. You can also obtain this information with the GCInfo command. @@ -757,17 +757,17 @@ include the source file name and line number corresponding to the disassembly. The -n (No line numbers) flag can be specified to disable this behavior. - - ... - c:\Code\prj.mini\exc.cs @ 38: - 001b00b0 8b0d3020ab03 mov ecx,dword ptr ds:[3AB2030h] ("Break in debugger. When done type to continue: ") - 001b00b6 e8d5355951 call mscorlib_ni+0x8b3690 (51743690) (System.Console.Write(System.String), mdToken: 0600091b) - 001b00bb 90 nop - - c:\Code\prj.mini\exc.cs @ 39: - 001b00bc e863cdc651 call mscorlib_ni+0xf8ce24 (51e1ce24) (System.Console.ReadLine(), mdToken: 060008f6) - >>> 001b00c1 90 nop - ... + + ... + c:\Code\prj.mini\exc.cs @ 38: + 001b00b0 8b0d3020ab03 mov ecx,dword ptr ds:[3AB2030h] ("Break in debugger. When done type to continue: ") + 001b00b6 e8d5355951 call mscorlib_ni+0x8b3690 (51743690) (System.Console.Write(System.String), mdToken: 0600091b) + 001b00bb 90 nop + + c:\Code\prj.mini\exc.cs @ 39: + 001b00bc e863cdc651 call mscorlib_ni+0xf8ce24 (51e1ce24) (System.Console.ReadLine(), mdToken: 060008f6) + >>> 001b00c1 90 nop + ... \\ COMMAND: dumpstack. @@ -815,27 +815,27 @@ block and the handler block. For a TYPED handler, this would be the "try" and Sample output: - (lldb) sos EHInfo 33bbd3a - MethodDesc: 03310f68 - Method Name: MainClass.Main() - Class: 03571358 - MethodTable: 0331121c - mdToken: 0600000b - Module: 001e2fd8 - IsJitted: yes - CodeAddr: 033bbca0 + (lldb) sos EHInfo 33bbd3a + MethodDesc: 03310f68 + Method Name: MainClass.Main() + Class: 03571358 + MethodTable: 0331121c + mdToken: 0600000b + Module: 001e2fd8 + IsJitted: yes + CodeAddr: 033bbca0 - EHHandler 0: TYPED catch(System.IO.FileNotFoundException) - Clause: [033bbd2b, 033bbd3c] [8b, 9c] - Handler: [033bbd3c, 033bbd50] [9c, b0] + EHHandler 0: TYPED catch(System.IO.FileNotFoundException) + Clause: [033bbd2b, 033bbd3c] [8b, 9c] + Handler: [033bbd3c, 033bbd50] [9c, b0] - EHHandler 1: FINALLY - Clause: [033bbd83, 033bbda3] [e3, 103] - Handler: [033bbda3, 033bbdc5] [103, 125] + EHHandler 1: FINALLY + Clause: [033bbd83, 033bbda3] [e3, 103] + Handler: [033bbda3, 033bbdc5] [103, 125] - EHHandler 2: TYPED catch(System.Exception) - Clause: [033bbd7a, 033bbdc5] [da, 125] - Handler: [033bbdc5, 033bbdd6] [125, 136] + EHHandler 2: TYPED catch(System.Exception) + Clause: [033bbd7a, 033bbdc5] [da, 125] + Handler: [033bbdc5, 033bbdd6] [125, 136] \\ @@ -854,53 +854,53 @@ you would print this output out and read it alongside a disassembly of the method. For example, the notation "reg EDI becoming live" at offset 0x11 of the method might correspond to a "mov edi,ecx" statement. - (lldb) sos GCInfo 5b68dbb8 (5b68dbb8 is the start of a JITTED method) - entry point 5b68dbb8 - preJIT generated code - GC info 5b9f2f09 - Method info block: - method size = 0036 - prolog size = 19 - epilog size = 8 - epilog count = 1 - epilog end = yes - saved reg. mask = 000B - ebp frame = yes - fully interruptible=yes - double align = no - security check = no - exception handlers = no - local alloc = no - edit & continue = no - varargs = no - argument count = 4 - stack frame size = 1 - untracked count = 5 - var ptr tab count = 0 - epilog at 002E - 36 D4 8C C7 AA | - 93 F3 40 05 | - - Pointer table: - 14 | [EBP+14H] an untracked local - 10 | [EBP+10H] an untracked local - 0C | [EBP+0CH] an untracked local - 08 | [EBP+08H] an untracked local - 44 | [EBP-04H] an untracked local - F1 79 | 0011 reg EDI becoming live - 72 | 0013 reg ESI becoming live - 83 | 0016 push ptr 0 - 8B | 0019 push ptr 1 - 93 | 001C push ptr 2 - 9B | 001F push ptr 3 - 56 | 0025 reg EDX becoming live - 4A | 0027 reg ECX becoming live - 0E | 002D reg ECX becoming dead - 10 | 002D reg EDX becoming dead - E0 | 002D pop 4 ptrs - F0 31 | 0036 reg ESI becoming dead - 38 | 0036 reg EDI becoming dead - FF | + (lldb) sos GCInfo 5b68dbb8 (5b68dbb8 is the start of a JITTED method) + entry point 5b68dbb8 + preJIT generated code + GC info 5b9f2f09 + Method info block: + method size = 0036 + prolog size = 19 + epilog size = 8 + epilog count = 1 + epilog end = yes + saved reg. mask = 000B + ebp frame = yes + fully interruptible=yes + double align = no + security check = no + exception handlers = no + local alloc = no + edit & continue = no + varargs = no + argument count = 4 + stack frame size = 1 + untracked count = 5 + var ptr tab count = 0 + epilog at 002E + 36 D4 8C C7 AA | + 93 F3 40 05 | + + Pointer table: + 14 | [EBP+14H] an untracked local + 10 | [EBP+10H] an untracked local + 0C | [EBP+0CH] an untracked local + 08 | [EBP+08H] an untracked local + 44 | [EBP-04H] an untracked local + F1 79 | 0011 reg EDI becoming live + 72 | 0013 reg ESI becoming live + 83 | 0016 push ptr 0 + 8B | 0019 push ptr 1 + 93 | 001C push ptr 2 + 9B | 001F push ptr 3 + 56 | 0025 reg EDX becoming live + 4A | 0027 reg ECX becoming live + 0E | 002D reg ECX becoming dead + 10 | 002D reg EDX becoming dead + E0 | 002D pop 4 ptrs + F0 31 | 0036 reg ESI becoming dead + 38 | 0036 reg EDI becoming dead + FF | This function is important for CLR Devs, but very difficult for anyone else to make sense of it. You would usually come to use it if you suspect a gc heap @@ -949,18 +949,18 @@ To correctly specify explicitly implemented methods make sure to retrieve the method name from the metadata, or from the output of the "dumpmt -md" command. For example: - public interface I1 - { - void M1(); - } - public class ExplicitItfImpl : I1 - { - ... - void I1.M1() // this method's name is 'I1.M1' - { ... } - } + public interface I1 + { + void M1(); + } + public class ExplicitItfImpl : I1 + { + ... + void I1.M1() // this method's name is 'I1.M1' + { ... } + } - bpmd myapp.dll ExplicitItfImpl.I1.M1 + bpmd myapp.dll ExplicitItfImpl.I1.M1 bpmd works equally well with generic types. Adding a breakpoint on a generic @@ -968,56 +968,56 @@ type sets breakpoints on all already JIT-ted generic methods and sets a pending breakpoint for any instantiation that will be JIT-ted in the future. Example for generics: - Given the following two classes: + Given the following two classes: - class G3 - { - ... - public void F(T1 p1, T2 p2, T3 p3) - { ... } - } + class G3 + { + ... + public void F(T1 p1, T2 p2, T3 p3) + { ... } + } - public class G1 { - // static method - static public void G(W w) - { ... } - } + public class G1 { + // static method + static public void G(W w) + { ... } + } - One would issue the following commands to set breakpoints on G3.F() and - G1.G(): + One would issue the following commands to set breakpoints on G3.F() and + G1.G(): - bpmd myapp.dll G3`3.F - bpmd myapp.dll G1`1.G + bpmd myapp.dll G3`3.F + bpmd myapp.dll G1`1.G And for explicitly implemented methods on generic interfaces: - public interface IT1 - { - void M1(T t); - } + public interface IT1 + { + void M1(T t); + } - public class ExplicitItfImpl : IT1 - { - ... - void IT1.M1(U u) // this method's name is 'IT1.M1' - { ... } - } + public class ExplicitItfImpl : IT1 + { + ... + void IT1.M1(U u) // this method's name is 'IT1.M1' + { ... } + } - bpmd bpmd.dll ExplicitItfImpl`1.IT1.M1 + bpmd bpmd.dll ExplicitItfImpl`1.IT1.M1 Additional examples: - If IT1 and ExplicitItfImpl are types declared inside another class, - Outer, the bpmd command would become: + If IT1 and ExplicitItfImpl are types declared inside another class, + Outer, the bpmd command would become: - bpmd bpmd.exe Outer+ExplicitItfImpl`1.Outer.IT1.M1 + bpmd bpmd.exe Outer+ExplicitItfImpl`1.Outer.IT1.M1 - (note that the fully qualified type name for ExplicitItfImpl became - Outer+ExplicitItfImpl, using the '+' separator, while the method name - is Outer.IT1.M1, using a '.' as the separator) + (note that the fully qualified type name for ExplicitItfImpl became + Outer+ExplicitItfImpl, using the '+' separator, while the method name + is Outer.IT1.M1, using a '.' as the separator) - Furthermore, if the Outer class resides in a namespace, NS, the bpmd - command to use becomes: + Furthermore, if the Outer class resides in a namespace, NS, the bpmd + command to use becomes: - bpmd bpmd.dll NS.Outer+ExplicitItfImpl`1.NS.Outer.IT1.M1 + bpmd bpmd.dll NS.Outer+ExplicitItfImpl`1.NS.Outer.IT1.M1 bpmd does not accept offsets nor parameters in the method name. You can add an IL offset as an optional parameter separate from the name. If there are overloaded @@ -1061,19 +1061,19 @@ have an object pointer, and can attempt to run "dumpobj" on it. Here is output for a simple program: - (lldb) eeheap -gc - Number of GC Heaps: 1 - generation 0 starts at 0x00a71018 - generation 1 starts at 0x00a7100c - generation 2 starts at 0x00a71000 - segment begin allocated size - 00a70000 00a71000 00a7e01c 0000d01c(53276) - Large object heap starts at 0x01a71000 - segment begin allocated size - 01a70000 01a71000 01a76000 0x00005000(20480) - Total Size 0x1201c(73756) - ------------------------------ - GC Heap Size 0x1201c(73756) + (lldb) eeheap -gc + Number of GC Heaps: 1 + generation 0 starts at 0x00a71018 + generation 1 starts at 0x00a7100c + generation 2 starts at 0x00a71000 + segment begin allocated size + 00a70000 00a71000 00a7e01c 0000d01c(53276) + Large object heap starts at 0x01a71000 + segment begin allocated size + 01a70000 01a71000 01a76000 0x00005000(20480) + Total Size 0x1201c(73756) + ------------------------------ + GC Heap Size 0x1201c(73756) So the total size of the GC Heap is only 72K. On a large web server, with multiple processors, you can expect to see a GC Heap of 400MB or more. The @@ -1086,49 +1086,49 @@ The loader output lists various private heaps associated with AppDomains. It also lists heaps associated with the JIT compiler, and heaps associated with Modules. For example: - (lldb) eeheap -loader - Loader Heap: - -------------------------------------- - System Domain: 5e0662a0 - LowFrequencyHeap:008f0000(00002000:00001000) Size: 0x00001000 bytes. - HighFrequencyHeap:008f2000(00008000:00001000) Size: 0x00001000 bytes. - StubHeap:008fa000(00002000:00001000) Size: 0x00001000 bytes. - Total size: 0x3000(12288)bytes - -------------------------------------- - Shared Domain: 5e066970 - LowFrequencyHeap:00920000(00002000:00001000) 03e30000(00010000:00003000) Size: 0x00004000 bytes. - Wasted: 0x00001000 bytes. - HighFrequencyHeap:00922000(00008000:00001000) Size: 0x00001000 bytes. - StubHeap:0092a000(00002000:00001000) Size: 0x00001000 bytes. - Total size: 0x6000(24576)bytes - -------------------------------------- - Domain 1: 14f000 - LowFrequencyHeap:00900000(00002000:00001000) 03ee0000(00010000:00003000) Size: 0x00004000 bytes. - Wasted: 0x00001000 bytes. - HighFrequencyHeap:00902000(00008000:00003000) Size: 0x00003000 bytes. - StubHeap:0090a000(00002000:00001000) Size: 0x00001000 bytes. - Total size: 0x8000(32768)bytes - -------------------------------------- - Jit code heap: - Normal JIT:03ef0000(00010000:00002000) Size: 0x00002000 bytes. - Total size: 0x2000(8192)bytes - -------------------------------------- - Module Thunk heaps: - Module 5ba22410: Size: 0x00000000 bytes. - Module 001c1320: Size: 0x00000000 bytes. - Module 001c03f0: Size: 0x00000000 bytes. - Module 001caa38: Size: 0x00000000 bytes. - Total size: 0x0(0)bytes - -------------------------------------- - Module Lookup Table heaps: - Module 5ba22410:Size: 0x00000000 bytes. - Module 001c1320:Size: 0x00000000 bytes. - Module 001c03f0:Size: 0x00000000 bytes. - Module 001caa38:03ec0000(00010000:00002000) Size: 0x00002000 bytes. - Total size: 0x2000(8192)bytes - -------------------------------------- - Total LoaderHeap size: 0x15000(86016)bytes - ======================================= + (lldb) eeheap -loader + Loader Heap: + -------------------------------------- + System Domain: 5e0662a0 + LowFrequencyHeap:008f0000(00002000:00001000) Size: 0x00001000 bytes. + HighFrequencyHeap:008f2000(00008000:00001000) Size: 0x00001000 bytes. + StubHeap:008fa000(00002000:00001000) Size: 0x00001000 bytes. + Total size: 0x3000(12288)bytes + -------------------------------------- + Shared Domain: 5e066970 + LowFrequencyHeap:00920000(00002000:00001000) 03e30000(00010000:00003000) Size: 0x00004000 bytes. + Wasted: 0x00001000 bytes. + HighFrequencyHeap:00922000(00008000:00001000) Size: 0x00001000 bytes. + StubHeap:0092a000(00002000:00001000) Size: 0x00001000 bytes. + Total size: 0x6000(24576)bytes + -------------------------------------- + Domain 1: 14f000 + LowFrequencyHeap:00900000(00002000:00001000) 03ee0000(00010000:00003000) Size: 0x00004000 bytes. + Wasted: 0x00001000 bytes. + HighFrequencyHeap:00902000(00008000:00003000) Size: 0x00003000 bytes. + StubHeap:0090a000(00002000:00001000) Size: 0x00001000 bytes. + Total size: 0x8000(32768)bytes + -------------------------------------- + Jit code heap: + Normal JIT:03ef0000(00010000:00002000) Size: 0x00002000 bytes. + Total size: 0x2000(8192)bytes + -------------------------------------- + Module Thunk heaps: + Module 5ba22410: Size: 0x00000000 bytes. + Module 001c1320: Size: 0x00000000 bytes. + Module 001c03f0: Size: 0x00000000 bytes. + Module 001caa38: Size: 0x00000000 bytes. + Total size: 0x0(0)bytes + -------------------------------------- + Module Lookup Table heaps: + Module 5ba22410:Size: 0x00000000 bytes. + Module 001c1320:Size: 0x00000000 bytes. + Module 001c03f0:Size: 0x00000000 bytes. + Module 001caa38:03ec0000(00010000:00002000) Size: 0x00002000 bytes. + Total size: 0x2000(8192)bytes + -------------------------------------- + Total LoaderHeap size: 0x15000(86016)bytes + ======================================= By using eeheap to keep track of the growth of these private heaps, we are able to rule out or include them as a source of a memory leak. @@ -1141,21 +1141,21 @@ Name2EE ! This function allows you to turn a class name into a MethodTable and EEClass. It turns a method name into a MethodDesc. Here is an example for a method: - (lldb) name2ee unittest.exe MainClass.Main - Module: 001caa38 - Token: 0x0600000d - MethodDesc: 00902f40 - Name: MainClass.Main() - JITTED Code Address: 03ef00b8 + (lldb) name2ee unittest.exe MainClass.Main + Module: 001caa38 + Token: 0x0600000d + MethodDesc: 00902f40 + Name: MainClass.Main() + JITTED Code Address: 03ef00b8 and for a class: - (lldb) name2ee unittest!MainClass - Module: 001caa38 - Token: 0x02000005 - MethodTable: 009032d8 - EEClass: 03ee1424 - Name: MainClass + (lldb) name2ee unittest!MainClass + Module: 001caa38 + Token: 0x02000005 + MethodTable: 009032d8 + EEClass: 03ee1424 + Name: MainClass The module you are "browsing" with Name2EE needs to be loaded in the process. To get a type name exactly right, first browse the module with ILDASM. You @@ -1179,12 +1179,12 @@ price, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null For this kind of module, simply use price as the module name: - 0:044> name2ee price Price - Module: 10f028b0 (price, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null) - Token: 0x02000002 - MethodTable: 11a47ae0 - EEClass: 11a538c8 - Name: Price + 0:044> name2ee price Price + Module: 10f028b0 (price, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null) + Token: 0x02000002 + MethodTable: 11a47ae0 + EEClass: 11a538c8 + Name: Price Where are we getting these module names from? Run DumpDomain to see a list of all loaded modules in all domains. And remember that you can browse all the @@ -1295,14 +1295,14 @@ DumpMD This command lists information about a MethodDesc. You can use ip2md to turn a code address in a managed function into a MethodDesc: - (lldb) dumpmd 902f40 - Method Name: Mainy.Main() - Class: 03ee1424 - MethodTable: 009032d8 - mdToken: 0600000d - Module: 001caa78 - IsJitted: yes - CodeAddr: 03ef00b8 + (lldb) dumpmd 902f40 + Method Name: Mainy.Main() + Class: 03ee1424 + MethodTable: 009032d8 + mdToken: 0600000d + Module: 001caa78 + IsJitted: yes + CodeAddr: 03ef00b8 If IsJitted is "yes," you can run U on the CodeAddr pointer to see a disassembly of the JITTED code. You can call also DumpClass, DumpMT, @@ -1315,18 +1315,18 @@ Token2EE This function allows you to turn a metadata token into a MethodTable or MethodDesc. Here is an example showing class tokens being resolved: - (lldb) sos Token2EE unittest.exe 02000003 - Module: 001caa38 - Token: 0x02000003 - MethodTable: 0090375c - EEClass: 03ee1ae0 - Name: Bank - (lldb) sos Token2EE image00400000 02000004 - Module: 001caa38 - Token: 0x02000004 - MethodTable: 009038ec - EEClass: 03ee1b84 - Name: Customer + (lldb) sos Token2EE unittest.exe 02000003 + Module: 001caa38 + Token: 0x02000003 + MethodTable: 0090375c + EEClass: 03ee1ae0 + Name: Bank + (lldb) sos Token2EE image00400000 02000004 + Module: 001caa38 + Token: 0x02000004 + MethodTable: 009038ec + EEClass: 03ee1b84 + Name: Customer The module you are "browsing" with Token2EE needs to be loaded in the process. This function doesn't see much use, especially since a tool like ILDASM can @@ -1344,28 +1344,28 @@ DumpModule [-mt] You can get a Module address from DumpDomain, DumpAssembly and other functions. Here is sample output: - (lldb) sos DumpModule 1caa50 - Name: /home/user/pub/unittest - Attributes: PEFile - Assembly: 001ca248 - LoaderHeap: 001cab3c - TypeDefToMethodTableMap: 03ec0010 - TypeRefToMethodTableMap: 03ec0024 - MethodDefToDescMap: 03ec0064 - FieldDefToDescMap: 03ec00a4 - MemberRefToDescMap: 03ec00e8 - FileReferencesMap: 03ec0128 - AssemblyReferencesMap: 03ec012c - MetaData start address: 00402230 (1888 bytes) + (lldb) sos DumpModule 1caa50 + Name: /home/user/pub/unittest + Attributes: PEFile + Assembly: 001ca248 + LoaderHeap: 001cab3c + TypeDefToMethodTableMap: 03ec0010 + TypeRefToMethodTableMap: 03ec0024 + MethodDefToDescMap: 03ec0064 + FieldDefToDescMap: 03ec00a4 + MemberRefToDescMap: 03ec00e8 + FileReferencesMap: 03ec0128 + AssemblyReferencesMap: 03ec012c + MetaData start address: 00402230 (1888 bytes) The Maps listed map metadata tokens to CLR data structures. Without going into too much detail, you can examine memory at those addresses to find the appropriate structures. For example, the TypeDefToMethodTableMap above can be examined: - (lldb) dd 3ec0010 - 03ec0010 00000000 00000000 0090320c 0090375c - 03ec0020 009038ec ... + (lldb) dd 3ec0010 + 03ec0010 00000000 00000000 0090320c 0090375c + 03ec0020 009038ec ... This means TypeDef token 2 maps to a MethodTable with the value 0090320c. You can run DumpMT to verify that. The MethodDefToDescMap takes a MethodDef token @@ -1374,28 +1374,28 @@ and maps it to a MethodDesc, which can be passed to dumpmd. There is a new option "-mt", which will display the types defined in a module, and the types referenced by the module. For example: - (lldb) sos DumpModule -mt 1aa580 - Name: /home/user/pub/unittest - ...... - MetaData start address: 0040220c (1696 bytes) + (lldb) sos DumpModule -mt 1aa580 + Name: /home/user/pub/unittest + ...... + MetaData start address: 0040220c (1696 bytes) - Types defined in this module + Types defined in this module - MT TypeDef Name - -------------------------------------------------------------------------- - 030d115c 0x02000002 Funny - 030d1228 0x02000003 Mainy + MT TypeDef Name + -------------------------------------------------------------------------- + 030d115c 0x02000002 Funny + 030d1228 0x02000003 Mainy - Types referenced in this module + Types referenced in this module - MT TypeRef Name - -------------------------------------------------------------------------- - 030b6420 0x01000001 System.ValueType - 030b5cb0 0x01000002 System.Object - 030fceb4 0x01000003 System.Exception - 0334e374 0x0100000c System.Console - 03167a50 0x0100000e System.Runtime.InteropServices.GCHandle - 0336a048 0x0100000f System.GC + MT TypeRef Name + -------------------------------------------------------------------------- + 030b6420 0x01000001 System.ValueType + 030b5cb0 0x01000002 System.Object + 030fceb4 0x01000003 System.Exception + 0334e374 0x0100000c System.Console + 03167a50 0x0100000e System.Runtime.InteropServices.GCHandle + 0336a048 0x0100000f System.GC \\ @@ -1404,12 +1404,12 @@ DumpAssembly Example output: - (lldb) sos DumpAssembly 1ca248 - Parent Domain: 0014f000 - Name: /home/user/pub/unittest - ClassLoader: 001ca060 - Module Name - 001caa50 /home/user/pub/unittest + (lldb) sos DumpAssembly 1ca248 + Parent Domain: 0014f000 + Name: /home/user/pub/unittest + ClassLoader: 001ca060 + Module Name + 001caa50 /home/user/pub/unittest An assembly can consist of multiple modules, and those will be listed. You can get an Assembly address from the output of DumpDomain. @@ -1421,18 +1421,18 @@ DumpRuntimeTypes DumpRuntimeTypes finds all System.RuntimeType objects in the gc heap and prints the type name and MethodTable they refer too. Sample output: - Address Domain MT Type Name - ------------------------------------------------------------------------------ - a515f4 14a740 5baf8d28 System.TypedReference - a51608 14a740 5bb05764 System.Globalization.BaseInfoTable - a51958 14a740 5bb05b24 System.Globalization.CultureInfo - a51a44 14a740 5bb06298 System.Globalization.GlobalizationAssembly - a51de0 14a740 5bb069c8 System.Globalization.TextInfo - a56b98 14a740 5bb12d28 System.Security.Permissions.HostProtectionResource - a56bbc 14a740 5baf7248 System.Int32 - a56bd0 14a740 5baf3fdc System.String - a56cfc 14a740 5baf36a4 System.ValueType - ... + Address Domain MT Type Name + ------------------------------------------------------------------------------ + a515f4 14a740 5baf8d28 System.TypedReference + a51608 14a740 5bb05764 System.Globalization.BaseInfoTable + a51958 14a740 5bb05b24 System.Globalization.CultureInfo + a51a44 14a740 5bb06298 System.Globalization.GlobalizationAssembly + a51de0 14a740 5bb069c8 System.Globalization.TextInfo + a56b98 14a740 5bb12d28 System.Security.Permissions.HostProtectionResource + a56bbc 14a740 5baf7248 System.Int32 + a56bd0 14a740 5baf3fdc System.String + a56cfc 14a740 5baf36a4 System.ValueType + ... This command will print a "?" in the domain column if the type is loaded into multiple AppDomains. For example: @@ -1587,22 +1587,22 @@ signs of corruption. It walks objects one by one in a pattern like this: If an error is found, VerifyHeap will report it. I'll take a perfectly good object and corrupt it: - (lldb) dumpobj a79d40 - Name: Customer - MethodTable: 009038ec - EEClass: 03ee1b84 - Size: 20(0x14) bytes - (/home/user/pub/unittest) - Fields: - MT Field Offset Type Attr Value Name - 009038ec 4000008 4 CLASS instance 00a79ce4 name - 009038ec 4000009 8 CLASS instance 00a79d2c bank - 009038ec 400000a c System.Boolean instance 1 valid - - (lldb) ed a79d40+4 01 (change the name field to the bogus pointer value 1) - (lldb) sos VerifyHeap - object 01ee60dc: bad member 00000003 at 01EE6168 - Last good object: 01EE60C4. + (lldb) dumpobj a79d40 + Name: Customer + MethodTable: 009038ec + EEClass: 03ee1b84 + Size: 20(0x14) bytes + (/home/user/pub/unittest) + Fields: + MT Field Offset Type Attr Value Name + 009038ec 4000008 4 CLASS instance 00a79ce4 name + 009038ec 4000009 8 CLASS instance 00a79d2c bank + 009038ec 400000a c System.Boolean instance 1 valid + + (lldb) ed a79d40+4 01 (change the name field to the bogus pointer value 1) + (lldb) sos VerifyHeap + object 01ee60dc: bad member 00000003 at 01EE6168 + Last good object: 01EE60C4. If this gc heap corruption exists, there is a serious bug in your own code or in the CLR. In user code, an error in constructing PInvoke calls can cause @@ -1616,16 +1616,16 @@ GCWhere !GCWhere displays the location in the GC heap of the argument passed in. - 0:002> !GCWhere 02800038 - Address Gen Heap segment begin allocated size - 02800038 2 0 02800000 02800038 0282b740 12 + 0:002> !GCWhere 02800038 + Address Gen Heap segment begin allocated size + 02800038 2 0 02800000 02800038 0282b740 12 When the argument lies in the managed heap, but is not a valid *object* address the "size" is displayed as 0: - 0:002> !GCWhere 0280003c - Address Gen Heap segment begin allocated size - 0280003c 2 0 02800000 02800038 0282b740 0 + 0:002> !GCWhere 0280003c + Address Gen Heap segment begin allocated size + 0280003c 2 0 02800000 02800038 0282b740 0 \\ COMMAND: dumplog. @@ -1640,10 +1640,10 @@ in the current directory is created. The optional argument addr allows one to specify a stress log other then the default one. - (lldb) dumplog - Attempting to dump Stress log to file 'StressLog.txt' - ................. - SUCCESS: Stress log dumped + (lldb) dumplog + Attempting to dump Stress log to file 'StressLog.txt' + ................. + SUCCESS: Stress log dumped To turn on the stress log, set the following environment variables before starting the .NET Core app: @@ -1701,27 +1701,27 @@ The log facilities are defined as follows: Here is some sample output: - 3560 9.981137099 : `SYNC` RareEnablePremptiveGC: entering. - Thread state = a030 + 3560 9.981137099 : `SYNC` RareEnablePremptiveGC: entering. + Thread state = a030 - 3560 9.981135033 : `GC`GCALLOC`GCROOTS` ========== ENDGC 4194 (gen = 2, - collect_classes = 0) ==========={ + 3560 9.981135033 : `GC`GCALLOC`GCROOTS` ========== ENDGC 4194 (gen = 2, + collect_classes = 0) ==========={ - 3560 9.981125826 : `GC` Segment mem 00C61000 alloc - = 00D071F0 used 00D09254 committed 00D17000 + 3560 9.981125826 : `GC` Segment mem 00C61000 alloc + = 00D071F0 used 00D09254 committed 00D17000 - 3560 9.981125726 : `GC` Generation 0 [00CED07C, 00000000 - ] cur = 00000000 + 3560 9.981125726 : `GC` Generation 0 [00CED07C, 00000000 + ] cur = 00000000 - 3560 9.981125529 : `GC` Generation 1 [00CED070, 00000000 - ] cur = 00000000 + 3560 9.981125529 : `GC` Generation 1 [00CED070, 00000000 + ] cur = 00000000 - 3560 9.981125103 : `GC` Generation 2 [00C61000, 00000000 - ] cur = 00000000 + 3560 9.981125103 : `GC` Generation 2 [00C61000, 00000000 + ] cur = 00000000 - 3560 9.981124963 : `GC` GC Heap 00000000 + 3560 9.981124963 : `GC` GC Heap 00000000 - 3560 9.980618994 : `GC`GCROOTS` GcScanHandles (Promotion Phase = 0) + 3560 9.980618994 : `GC`GCROOTS` GcScanHandles (Promotion Phase = 0) The first column is the OS thread ID for the thread appending to the log, the second column is the timestamp, the third is the facility category for the @@ -1738,10 +1738,10 @@ FindAppDomain FindAppDomain will attempt to resolve the AppDomain of an object. For example, using an Object Pointer from the output of DumpStackObjects: - (lldb) sos FindAppDomain 00a79d98 - AppDomain: 0014f000 - Name: unittest.exe - ID: 1 + (lldb) sos FindAppDomain 00a79d98 + AppDomain: 0014f000 + Name: unittest.exe + ID: 1 You can find out more about the AppDomain with the DumpDomain command. Not every object has enough clues about it's origin to determine the AppDomain. @@ -1758,24 +1758,24 @@ HistInit command. Sample output: - (lldb) histinit - Attempting to read Stress log - STRESS LOG: - facilitiesToLog = 0xffffffff - levelToLog = 6 - MaxLogSizePerThread = 0x10000 (65536) - MaxTotalLogSize = 0x1000000 (16777216) - CurrentTotalLogChunk = 9 - ThreadsWithLogs = 3 - Clock frequency = 3.392 GHz - Start time 15:26:31 - Last message time 15:26:56 - Total elapsed time 25.077 sec - ..................................... - ---------------------------- 2407 total entries ----------------------------- - - - SUCCESS: GCHist structures initialized + (lldb) histinit + Attempting to read Stress log + STRESS LOG: + facilitiesToLog = 0xffffffff + levelToLog = 6 + MaxLogSizePerThread = 0x10000 (65536) + MaxTotalLogSize = 0x1000000 (16777216) + CurrentTotalLogChunk = 9 + ThreadsWithLogs = 3 + Clock frequency = 3.392 GHz + Start time 15:26:31 + Last message time 15:26:56 + Total elapsed time 25.077 sec + ..................................... + ---------------------------- 2407 total entries ----------------------------- + + + SUCCESS: GCHist structures initialized \\ @@ -1786,17 +1786,17 @@ To examine log entries related to an object whose present address is known one would use this command. The output of this command contains all entries that reference the object: - (lldb) histobjfind 028970d4 - GCCount Object Message - --------------------------------------------------------- - 2296 028970d4 Promotion for root 01e411b8 (MT = 5b6c5cd8) - 2296 028970d4 Relocation NEWVALUE for root 00223fc4 - 2296 028970d4 Relocation NEWVALUE for root 01e411b8 - ... - 2295 028970d4 Promotion for root 01e411b8 (MT = 5b6c5cd8) - 2295 028970d4 Relocation NEWVALUE for root 00223fc4 - 2295 028970d4 Relocation NEWVALUE for root 01e411b8 - ... + (lldb) histobjfind 028970d4 + GCCount Object Message + --------------------------------------------------------- + 2296 028970d4 Promotion for root 01e411b8 (MT = 5b6c5cd8) + 2296 028970d4 Relocation NEWVALUE for root 00223fc4 + 2296 028970d4 Relocation NEWVALUE for root 01e411b8 + ... + 2295 028970d4 Promotion for root 01e411b8 (MT = 5b6c5cd8) + 2295 028970d4 Relocation NEWVALUE for root 00223fc4 + 2295 028970d4 Relocation NEWVALUE for root 01e411b8 + ... \\ @@ -1809,23 +1809,23 @@ an object through the GCs. HistRoot provides information related to both promotions and relocations of the root specified as the argument. - (lldb) histroot 01e411b8 - GCCount Value MT Promoted? Notes - --------------------------------------------------------- - 2296 028970d4 5b6c5cd8 yes - 2295 028970d4 5b6c5cd8 yes - 2294 028970d4 5b6c5cd8 yes - 2293 028970d4 5b6c5cd8 yes - 2292 028970d4 5b6c5cd8 yes - 2291 028970d4 5b6c5cd8 yes - 2290 028970d4 5b6c5cd8 yes - 2289 028970d4 5b6c5cd8 yes - 2288 028970d4 5b6c5cd8 yes - 2287 028970d4 5b6c5cd8 yes - 2286 028970d4 5b6c5cd8 yes - 2285 028970d4 5b6c5cd8 yes - 322 028970e8 5b6c5cd8 yes Duplicate promote/relocs - ... + (lldb) histroot 01e411b8 + GCCount Value MT Promoted? Notes + --------------------------------------------------------- + 2296 028970d4 5b6c5cd8 yes + 2295 028970d4 5b6c5cd8 yes + 2294 028970d4 5b6c5cd8 yes + 2293 028970d4 5b6c5cd8 yes + 2292 028970d4 5b6c5cd8 yes + 2291 028970d4 5b6c5cd8 yes + 2290 028970d4 5b6c5cd8 yes + 2289 028970d4 5b6c5cd8 yes + 2288 028970d4 5b6c5cd8 yes + 2287 028970d4 5b6c5cd8 yes + 2286 028970d4 5b6c5cd8 yes + 2285 028970d4 5b6c5cd8 yes + 322 028970e8 5b6c5cd8 yes Duplicate promote/relocs + ... \\ @@ -1836,29 +1836,29 @@ This command examines all stress log relocation records and displays the chain of GC relocations that may have led to the address passed in as an argument. Conceptually the output is: - GenN obj_address root1, root2, root3, - GenN-1 prev_obj_addr root1, root2, - GenN-2 prev_prev_oa root1, root4, - ... + GenN obj_address root1, root2, root3, + GenN-1 prev_obj_addr root1, root2, + GenN-2 prev_prev_oa root1, root4, + ... Sample output: - (lldb) histobj 028970d4 - GCCount Object Roots - --------------------------------------------------------- - 2296 028970d4 00223fc4, 01e411b8, - 2295 028970d4 00223fc4, 01e411b8, - 2294 028970d4 00223fc4, 01e411b8, - 2293 028970d4 00223fc4, 01e411b8, - 2292 028970d4 00223fc4, 01e411b8, - 2291 028970d4 00223fc4, 01e411b8, - 2290 028970d4 00223fc4, 01e411b8, - 2289 028970d4 00223fc4, 01e411b8, - 2288 028970d4 00223fc4, 01e411b8, - 2287 028970d4 00223fc4, 01e411b8, - 2286 028970d4 00223fc4, 01e411b8, - 2285 028970d4 00223fc4, 01e411b8, - 322 028970d4 01e411b8, - 0 028970d4 + (lldb) histobj 028970d4 + GCCount Object Roots + --------------------------------------------------------- + 2296 028970d4 00223fc4, 01e411b8, + 2295 028970d4 00223fc4, 01e411b8, + 2294 028970d4 00223fc4, 01e411b8, + 2293 028970d4 00223fc4, 01e411b8, + 2292 028970d4 00223fc4, 01e411b8, + 2291 028970d4 00223fc4, 01e411b8, + 2290 028970d4 00223fc4, 01e411b8, + 2289 028970d4 00223fc4, 01e411b8, + 2288 028970d4 00223fc4, 01e411b8, + 2287 028970d4 00223fc4, 01e411b8, + 2286 028970d4 00223fc4, 01e411b8, + 2285 028970d4 00223fc4, 01e411b8, + 322 028970d4 01e411b8, + 0 028970d4 \\ @@ -1869,8 +1869,8 @@ This command releases any resources used by the Hist-family of commands. Generally there's no need to call this explicitly, as each HistInit will first cleanup the previous resources. - (lldb) histclear - Completed successfully. + (lldb) histclear + Completed successfully. \\ diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 94f857b221..48eda6df2c 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -2242,15 +2242,23 @@ size_t AddExceptionHeader (__out_ecount_opt(bufferLength) WCHAR *wszBuffer, size return _wcslen(wszHeader); } +enum StackTraceElementFlags +{ + // Set if this element represents the last frame of the foreign exception stack trace + STEF_LAST_FRAME_FROM_FOREIGN_STACK_TRACE = 0x0001, + + // Set if the "ip" field has already been adjusted (decremented) + STEF_IP_ADJUSTED = 0x0002, +}; + +// This struct needs to match the definition in the runtime. +// See: https://github.com/dotnet/runtime/blob/master/src/coreclr/src/vm/clrex.h struct StackTraceElement { UINT_PTR ip; UINT_PTR sp; DWORD_PTR pFunc; // MethodDesc - // TRUE if this element represents the last frame of the foreign - // exception stack trace. - BOOL fIsLastFrameFromForeignStackTrace; - + INT flags; // This is StackTraceElementFlags but it needs to always be "int" sized for backward compatibility. }; #include "sos_stacktrace.h" @@ -2487,7 +2495,7 @@ size_t FormatGeneratedException (DWORD_PTR dataPtr, // The unmodified IP is displayed (above by DumpMDInfoBuffer) which points after the exception in most // cases. This means that the printed IP and the printed line number often will not map to one another // and this is intentional. - SUCCEEDED(GetLineByOffset(TO_CDADDR(bAsync && i == 0 ? ste.ip : ste.ip - g_targetMachine->StackWalkIPAdjustOffset()), &linenum, filename, _countof(filename)))) + SUCCEEDED(GetLineByOffset(TO_CDADDR(ste.ip), &linenum, filename, _countof(filename), !bAsync || i > 0))) { swprintf_s(wszLineBuffer, _countof(wszLineBuffer), W(" %s [%s @ %d]\n"), so.String(), filename, linenum); } @@ -2665,6 +2673,8 @@ HRESULT FormatException(CLRDATA_ADDRESS taObj, BOOL bLineNumbers = FALSE) if (arrayLen != 0 && hr == S_OK) { + // This code is accessing the StackTraceInfo class in the runtime. + // See: https://github.com/dotnet/runtime/blob/master/src/coreclr/src/vm/clrex.h #ifdef _TARGET_WIN64_ DWORD_PTR dataPtr = taStackTrace + sizeof(DWORD_PTR) + sizeof(DWORD) + sizeof(DWORD); #else @@ -9328,6 +9338,7 @@ DECLARE_API(u) BOOL fWithEHInfo = FALSE; BOOL bSuppressLines = FALSE; BOOL bDisplayOffsets = FALSE; + BOOL bDisplayILMap = FALSE; BOOL bIL = FALSE; BOOL dml = FALSE; size_t nArg; @@ -9339,6 +9350,7 @@ DECLARE_API(u) {"-n", &bSuppressLines, COBOOL, FALSE}, {"-o", &bDisplayOffsets, COBOOL, FALSE}, {"-il", &bIL, COBOOL, FALSE}, + {"-map", &bDisplayILMap, COBOOL, FALSE}, #ifndef FEATURE_PAL {"/d", &dml, COBOOL, FALSE}, #endif @@ -9394,7 +9406,7 @@ DECLARE_API(u) DacpCodeHeaderData& codeHeaderData = std::get<1>(p); std::unique_ptr map(nullptr); ULONG32 mapCount = 0; - Status = GetIntermediateLangMap(bIL, codeHeaderData, map /*out*/, mapCount /* out */, false); + Status = GetIntermediateLangMap(bIL, codeHeaderData, map /*out*/, mapCount /* out */, bDisplayILMap); if (Status != S_OK) { return Status; @@ -9831,7 +9843,7 @@ HRESULT GetIntermediateLangMap(BOOL bIL, const DacpCodeHeaderData& codeHeaderDat { // TODO: These information should be interleaved with the disassembly // Decoded IL can be obtained through refactoring DumpIL code. - ExtOut("%04x %p %p\n", map[i].ilOffset, map[i].startAddress, map[i].endAddress); + ExtOut("%08x %p %p\n", map[i].ilOffset, map[i].startAddress, map[i].endAddress); } } } @@ -15207,6 +15219,8 @@ HRESULT AppendExceptionInfo(CLRDATA_ADDRESS cdaObj, if (arrayLen) { + // This code is accessing the StackTraceInfo class in the runtime. + // See: https://github.com/dotnet/runtime/blob/master/src/coreclr/src/vm/clrex.h #ifdef _TARGET_WIN64_ DWORD_PTR dataPtr = arrayPtr + sizeof(DWORD_PTR) + sizeof(DWORD) + sizeof(DWORD); #else @@ -15518,10 +15532,49 @@ DECLARE_API(VerifyStackTrace) return Status; } -// This is an internal-only Apollo extension to de-optimize the code +// This is an internal-only Apollo extension to save breakpoint/watch state +DECLARE_API(SaveState) +{ + INIT_API_NOEE(); + MINIDUMP_NOT_SUPPORTED(); + + StringHolder filePath; + CMDValue arg[] = + { // vptr, type + {&filePath.data, COSTRING}, + }; + size_t nArg; + if (!GetCMDOption(args, NULL, 0, arg, _countof(arg), &nArg)) + { + return E_FAIL; + } + + if(nArg == 0) + { + ExtOut("Usage: !SaveState \n"); + } + + FILE* pFile; + errno_t error = fopen_s(&pFile, filePath.data, "w"); + if(error != 0) + { + ExtOut("Failed to open file %s, error=0x%x\n", filePath.data, error); + return E_FAIL; + } + + g_bpoints.SaveBreakpoints(pFile); + g_watchCmd.SaveListToFile(pFile); + + fclose(pFile); + ExtOut("Session breakpoints and watch expressions saved to %s\n", filePath.data); + return S_OK; +} + +#endif // FEATURE_PAL + DECLARE_API(SuppressJitOptimization) { - INIT_API_NODAC(); + INIT_API_NOEE(); MINIDUMP_NOT_SUPPORTED(); StringHolder onOff; @@ -15553,8 +15606,6 @@ DECLARE_API(SuppressJitOptimization) g_ExtControl->Execute(DEBUG_EXECUTE_NOT_LOGGED, "sxe -c \"!SOSHandleCLRN\" clrn", 0); ExtOut("JIT optimization will be suppressed\n"); } - - } else if(nArg == 1 && (_stricmp(onOff.data, "Off") == 0)) { @@ -15655,47 +15706,6 @@ HRESULT SetNGENCompilerFlags(DWORD flags) return hr; } - -// This is an internal-only Apollo extension to save breakpoint/watch state -DECLARE_API(SaveState) -{ - INIT_API_NOEE(); - MINIDUMP_NOT_SUPPORTED(); - - StringHolder filePath; - CMDValue arg[] = - { // vptr, type - {&filePath.data, COSTRING}, - }; - size_t nArg; - if (!GetCMDOption(args, NULL, 0, arg, _countof(arg), &nArg)) - { - return E_FAIL; - } - - if(nArg == 0) - { - ExtOut("Usage: !SaveState \n"); - } - - FILE* pFile; - errno_t error = fopen_s(&pFile, filePath.data, "w"); - if(error != 0) - { - ExtOut("Failed to open file %s, error=0x%x\n", filePath.data, error); - return E_FAIL; - } - - g_bpoints.SaveBreakpoints(pFile); - g_watchCmd.SaveListToFile(pFile); - - fclose(pFile); - ExtOut("Session breakpoints and watch expressions saved to %s\n", filePath.data); - return S_OK; -} - -#endif // FEATURE_PAL - DECLARE_API(StopOnCatch) { INIT_API(); diff --git a/src/SOS/Strike/util.cpp b/src/SOS/Strike/util.cpp index 805f2f34bc..f368161fd9 100644 --- a/src/SOS/Strike/util.cpp +++ b/src/SOS/Strike/util.cpp @@ -4822,7 +4822,8 @@ GetLastMethodIlOffset( // represent an "IL offset". HRESULT ConvertNativeToIlOffset( - ___in ULONG64 native, + ___in ULONG64 nativeOffset, + ___in BOOL bAdjustOffsetForLineNumber, ___out IXCLRDataModule** ppModule, ___out mdMethodDef* methodToken, ___out PULONG32 methodOffs) @@ -4830,12 +4831,24 @@ ConvertNativeToIlOffset( ToRelease pMethodInst(NULL); HRESULT Status; - if ((Status = GetClrMethodInstance(native, &pMethodInst)) != S_OK) + if ((Status = GetClrMethodInstance(nativeOffset, &pMethodInst)) != S_OK) { return Status; } - if ((Status = pMethodInst->GetILOffsetsByAddress(native, 1, NULL, methodOffs)) != S_OK) + if (bAdjustOffsetForLineNumber) + { + CLRDATA_ADDRESS startAddr; + if (pMethodInst->GetRepresentativeEntryAddress(&startAddr) == S_OK) + { + if (nativeOffset >= (startAddr + g_targetMachine->StackWalkIPAdjustOffset())) + { + nativeOffset -= g_targetMachine->StackWalkIPAdjustOffset(); + } + } + } + + if ((Status = pMethodInst->GetILOffsetsByAddress(nativeOffset, 1, NULL, methodOffs)) != S_OK) { *methodOffs = 0; } @@ -4870,18 +4883,19 @@ ConvertNativeToIlOffset( // identifies the corresponding source file name and line number. HRESULT GetLineByOffset( - ___in ULONG64 offset, + ___in ULONG64 nativeOffset, ___out ULONG *pLinenum, __out_ecount(cchFileName) WCHAR* pwszFileName, - ___in ULONG cchFileName) + ___in ULONG cchFileName, + ___in BOOL bAdjustOffsetForLineNumber /* = FALSE */) { HRESULT Status = S_OK; ULONG32 methodToken; ULONG32 methodOffs; - // Find the image, method token and IL offset that correspond to "offset" + // Find the image, method token and IL offset that correspond to "nativeOffset" ToRelease pModule(NULL); - IfFailRet(ConvertNativeToIlOffset(offset, &pModule, &methodToken, &methodOffs)); + IfFailRet(ConvertNativeToIlOffset(nativeOffset, bAdjustOffsetForLineNumber, &pModule, &methodToken, &methodOffs)); ToRelease pMDImport(NULL); pModule->QueryInterface(IID_IMetaDataImport, (LPVOID *) &pMDImport); @@ -5281,9 +5295,7 @@ WString MethodNameFromIP(CLRDATA_ADDRESS ip, BOOL bSuppressLines, BOOL bAssembly ArrayHolder wszFileName = new WCHAR[MAX_LONGPATH]; if (!bSuppressLines && - // If the IP needs to be adjusted, it is a lot simpler to decrement IP instead of trying to figure out - // the beginning of the instruction. It is enough for GetLineByOffset to return the correct line number. - SUCCEEDED(GetLineByOffset(TO_CDADDR(bAdjustIPForLineNumber ? ip - g_targetMachine->StackWalkIPAdjustOffset() : ip), &linenum, wszFileName, MAX_LONGPATH))) + SUCCEEDED(GetLineByOffset(TO_CDADDR(ip), &linenum, wszFileName, MAX_LONGPATH, bAdjustIPForLineNumber))) { methodOutput += WString(W(" [")) + wszFileName + W(" @ ") + Decimal(linenum) + W("]"); } From cf65b0e50cac9829df0b4d880f53d925ba98af6f Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Fri, 31 Jan 2020 18:48:27 -0800 Subject: [PATCH 102/243] Fix official build failures with latest runtime (#795) --- src/SOS/SOS.UnitTests/Scripts/NestedExceptionTest.script | 4 ++-- src/SOS/SOS.UnitTests/Scripts/StackTests.script | 8 ++++---- src/SOS/SOS.UnitTests/Scripts/TaskNestedException.script | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/SOS/SOS.UnitTests/Scripts/NestedExceptionTest.script b/src/SOS/SOS.UnitTests/Scripts/NestedExceptionTest.script index f298eaa119..a08bb14a8d 100644 --- a/src/SOS/SOS.UnitTests/Scripts/NestedExceptionTest.script +++ b/src/SOS/SOS.UnitTests/Scripts/NestedExceptionTest.script @@ -89,7 +89,7 @@ VERIFY:InnerException:\s+System\.FormatException, Use !PrintException t VERIFY:StackTrace \(generated\): VERIFY:\s+SP\s+IP\s+Function\s+ VERIFY:\s+\s+\s+[Nn]ested[Ee]xception[Tt]est.*!NestedExceptionTest\.Program\.Main(\(.*\))?\+0x\s* -VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Nn]ested[Ee]xception[Tt]est[\\|/][Nn]ested[Ee]xception[Tt]est\.cs @ 8\s*\]\s* +VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Nn]ested[Ee]xception[Tt]est[\\|/][Nn]ested[Ee]xception[Tt]est\.cs @ (8|17)\s*\]\s* VERIFY:(StackTraceString: \s+)? VERIFY:HResult:\s+80131509\s+ VERIFY:There are nested exceptions on this thread. Run with -nested for details @@ -115,4 +115,4 @@ SOSCOMMAND:ClrStack VERIFY:.*OS Thread Id:\s+0x\s+.* VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ VERIFY:\s+\s+\s+NestedExceptionTest\.Program\.Main(\(.*\))?\s* -VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Nn]ested[Ee]xception[Tt]est[\\|/][Nn]ested[Ee]xception[Tt]est\.cs @ 8\s*\]\s* +VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Nn]ested[Ee]xception[Tt]est[\\|/][Nn]ested[Ee]xception[Tt]est\.cs @ (8|17)\s*\]\s* diff --git a/src/SOS/SOS.UnitTests/Scripts/StackTests.script b/src/SOS/SOS.UnitTests/Scripts/StackTests.script index 5b7a88f23c..4173bdc346 100644 --- a/src/SOS/SOS.UnitTests/Scripts/StackTests.script +++ b/src/SOS/SOS.UnitTests/Scripts/StackTests.script @@ -14,7 +14,7 @@ VERIFY:\s+....* SOSCOMMAND:ClrStack VERIFY:.*OS Thread Id:\s+0x\s+.* VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ -VERIFY:\s+\s+.*\s+NestedExceptionTest\.Program\.Main\(.*\)\s+\[(?i:.*[\\|/]NestedExceptionTest\.cs) @ 8\s*\]\s+ +VERIFY:\s+\s+.*\s+NestedExceptionTest\.Program\.Main\(.*\)\s+\[(?i:.*[\\|/]NestedExceptionTest\.cs) @ (8|17)\s*\]\s+ IFDEF:64BIT VERIFY:.*\s+\s+\s+NestedExceptionTest\.Program\.Main\(.*\)\s+\[(?i:.*[\\|/]NestedExceptionTest\.cs) @ 13\s*\]\s+ ENDIF:64BIT @@ -27,7 +27,7 @@ ENDIF:DOTNETDUMP SOSCOMMAND:ClrStack -f VERIFY:.*OS Thread Id:\s+0x\s+.* VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ -VERIFY:.*\s+\s+\s+(?i:NestedExceptionTest.*)!NestedExceptionTest\.Program\.Main\(.*\)\s+\+\s+\s+\[(?i:.*[\\|/]NestedExceptionTest\.cs) @ 8\s*\]\s+ +VERIFY:.*\s+\s+\s+(?i:NestedExceptionTest.*)!NestedExceptionTest\.Program\.Main\(.*\)\s+\+\s+\s+\[(?i:.*[\\|/]NestedExceptionTest\.cs) @ (8|17)\s*\]\s+ IFDEF:64BIT VERIFY:.*\s+\s+\s+(?i:NestedExceptionTest.*)!NestedExceptionTest\.Program\.Main\(.*\)\s+\+\s+\s+\[(?i:.*[\\|/]NestedExceptionTest\.cs) @ 13\s*\]\s+ ENDIF:64BIT @@ -37,7 +37,7 @@ SOSCOMMAND:SetSymbolServer -disable SOSCOMMAND:ClrStack -a VERIFY:.*OS Thread Id:\s+0x\s+.* VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ -VERIFY:\s+\s+\s+NestedExceptionTest\.Program\.Main\(.*\)\s+\[(?i:.*[\\|/]NestedExceptionTest\.cs) @ 8\s*\]\s+ +VERIFY:\s+\s+\s+NestedExceptionTest\.Program\.Main\(.*\)\s+\[(?i:.*[\\|/]NestedExceptionTest\.cs) @ (8|17)\s*\]\s+ VERIFY:\s+PARAMETERS:\s+ VERIFY:\s+args \(0x\) = 0x\s+ VERIFY:\s+LOCALS:\s+ @@ -55,7 +55,7 @@ SOSCOMMAND:ClrStack -r VERIFY:.*OS Thread Id:\s+0x\s+.* VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ -VERIFY:\s+\s+\s+NestedExceptionTest\.Program\.Main\(.*\)\s+\[(?i:.*[\\|/]NestedExceptionTest\.cs) @ 8\s*\]\s+ +VERIFY:\s+\s+\s+NestedExceptionTest\.Program\.Main\(.*\)\s+\[(?i:.*[\\|/]NestedExceptionTest\.cs) @ (8|17)\s*\]\s+ IFDEF:ARM VERIFY:\s+r0=\s+r1=\s+r2=\s+ ENDIF:ARM diff --git a/src/SOS/SOS.UnitTests/Scripts/TaskNestedException.script b/src/SOS/SOS.UnitTests/Scripts/TaskNestedException.script index 1fe6af549b..7617a50a79 100644 --- a/src/SOS/SOS.UnitTests/Scripts/TaskNestedException.script +++ b/src/SOS/SOS.UnitTests/Scripts/TaskNestedException.script @@ -44,7 +44,7 @@ VERIFY:\s+SP\s+IP\s+Function\s+ VERIFY:\s+\s+.+RandomTest(::|\.)RandomUserTask\.InnerException(\(\))?\+0x\s* !IFDEF:DESKTOP !IFDEF:TRIAGE_DUMP -VERIFY:[.+[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Tt]ask[Nn]ested[Ee]xception[\\|/][Rr]andom[Uu]ser[Ll]ibrary[\\|/][Rr]andom[Uu]ser[Tt]ask\.cs @ 34\] +VERIFY:[.+[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Tt]ask[Nn]ested[Ee]xception[\\|/][Rr]andom[Uu]ser[Ll]ibrary[\\|/][Rr]andom[Uu]ser[Tt]ask\.cs @ (34|35)\] ENDIF:TRIAGE_DUMP ENDIF:DESKTOP VERIFY:\s+\s+.+RandomTest(::|\.)RandomUserTask\.<\.ctor>.+\+0x\s* From 3730b74be89c62c6922800a8ad966d5ea4f1a7e2 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sun, 2 Feb 2020 13:49:19 +0000 Subject: [PATCH 103/243] [master] Update dependencies from dotnet/runtime (#793) * Update dependencies from https://github.com/dotnet/runtime build 20200130.10 - Microsoft.NETCore.App - 5.0.0-alpha.1.20080.10 * Update dependencies from https://github.com/dotnet/runtime build 20200201.1 - Microsoft.NETCore.App - 5.0.0-alpha.1.20101.1 * Update dependencies from https://github.com/dotnet/runtime build 20200201.3 - Microsoft.NETCore.App - 5.0.0-alpha.1.20101.3 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index b7f84327bb..bcc13de2fe 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade cc8fe69635c7c6e791c87540851aea75946945fa - + https://github.com/dotnet/runtime - b8942c37f25460bb160d0ff2fde9795d56b9bf01 + 316a82fdcebb3bc025b3a5d056b751b29c1c3296 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 306108ee3e..61bf4c1045 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20078.2 + 5.0.0-alpha.1.20101.3 5.0.0-alpha.1.20079.7 From 6b0c4171211b4fa262ac1940b643cfb383ceadf5 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2020 13:36:40 +0000 Subject: [PATCH 104/243] Update dependencies from https://github.com/dotnet/arcade build 20200201.2 (#796) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.20101.2 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.20101.2 --- eng/Version.Details.xml | 8 +- eng/Versions.props | 2 +- eng/common/build.sh | 10 + eng/common/darc-init.ps1 | 4 +- eng/common/generate-graph-files.ps1 | 2 +- eng/common/performance/performance-setup.ps1 | 2 +- eng/common/performance/performance-setup.sh | 2 +- ...ote-build.ps1 => add-build-to-channel.ps1} | 2 +- eng/common/templates/job/execute-sdl.yml | 20 +- .../channels/generic-internal-channel.yml | 30 ++- .../channels/generic-public-channel.yml | 30 ++- .../templates/post-build/post-build.yml | 219 +++++++++++------- .../templates/post-build/promote-build.yml | 25 -- .../post-build/setup-maestro-vars.yml | 51 +++- ...ote-build.yml => add-build-to-channel.yml} | 4 +- eng/common/tools.ps1 | 3 - global.json | 2 +- 17 files changed, 268 insertions(+), 148 deletions(-) rename eng/common/post-build/{promote-build.ps1 => add-build-to-channel.ps1} (95%) delete mode 100644 eng/common/templates/post-build/promote-build.yml rename eng/common/templates/steps/{promote-build.yml => add-build-to-channel.yml} (68%) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index bcc13de2fe..8440c4d79c 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,15 +4,15 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - cc8fe69635c7c6e791c87540851aea75946945fa + 779323758d3e8aa7e4ee3dc2619d57e696078089 - + https://github.com/dotnet/arcade - cc8fe69635c7c6e791c87540851aea75946945fa + 779323758d3e8aa7e4ee3dc2619d57e696078089 https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 61bf4c1045..fece83cd38 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -40,7 +40,7 @@ 4.5.3 2.4.1 2.0.3 - 5.0.0-beta.20076.3 + 5.0.0-beta.20101.2 10.0.18362 diff --git a/eng/common/build.sh b/eng/common/build.sh index 36f9aa0462..6e395455f2 100755 --- a/eng/common/build.sh +++ b/eng/common/build.sh @@ -175,6 +175,16 @@ function Build { InitializeCustomToolset if [[ ! -z "$projects" ]]; then + # Split project paths by semi-colon, find full-paths using readlink, + # finally and splice back as a semi-colon separated list + IFS=';' read -r -a projs <<< "$projects" + len=${#projs[@]} + for ((i=0; i<$len; i++)); + do + projs[$i]=$(readlink -f "${projs[$i]}"); + done + projects=$(IFS=\; ; echo "${projs[*]}") + echo Updated projects: $projects properties="$properties /p:Projects=$projects" fi diff --git a/eng/common/darc-init.ps1 b/eng/common/darc-init.ps1 index fc2190365f..2a30ccfd74 100644 --- a/eng/common/darc-init.ps1 +++ b/eng/common/darc-init.ps1 @@ -24,13 +24,15 @@ function InstallDarcCli ($darcVersion) { $darcVersion = $(Invoke-WebRequest -Uri $versionEndpoint -UseBasicParsing).Content } - $arcadeServicesSource = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json' + $arcadeServicesSource = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' Write-Host "Installing Darc CLI version $darcVersion..." Write-Host 'You may need to restart your command window if this is the first dotnet tool you have installed.' if (-not $toolpath) { + Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity -g" & "$dotnet" tool install $darcCliPackageName --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity -g }else { + Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity -g --tool-path '$toolpath'" & "$dotnet" tool install $darcCliPackageName --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity --tool-path "$toolpath" } } diff --git a/eng/common/generate-graph-files.ps1 b/eng/common/generate-graph-files.ps1 index 7ad26afa69..0728b1a8b5 100644 --- a/eng/common/generate-graph-files.ps1 +++ b/eng/common/generate-graph-files.ps1 @@ -3,7 +3,7 @@ Param( [Parameter(Mandatory=$true)][string] $gitHubPat, # GitHub personal access token from https://github.com/settings/tokens (no auth scopes needed) [Parameter(Mandatory=$true)][string] $azdoPat, # Azure Dev Ops tokens from https://dev.azure.com/dnceng/_details/security/tokens (code read scope needed) [Parameter(Mandatory=$true)][string] $outputFolder, # Where the graphviz.txt file will be created - [string] $darcVersion = '1.1.0-beta.19175.6', # darc's version + [string] $darcVersion, # darc's version [string] $graphvizVersion = '2.38', # GraphViz version [switch] $includeToolset # Whether the graph should include toolset dependencies or not. i.e. arcade, optimization. For more about # toolset dependencies see https://github.com/dotnet/arcade/blob/master/Documentation/Darc.md#toolset-vs-product-dependencies diff --git a/eng/common/performance/performance-setup.ps1 b/eng/common/performance/performance-setup.ps1 index f6e878297d..3c2adf8c73 100644 --- a/eng/common/performance/performance-setup.ps1 +++ b/eng/common/performance/performance-setup.ps1 @@ -9,7 +9,7 @@ Param( [string] $Branch=$env:BUILD_SOURCEBRANCH, [string] $CommitSha=$env:BUILD_SOURCEVERSION, [string] $BuildNumber=$env:BUILD_BUILDNUMBER, - [string] $RunCategories="coreclr corefx", + [string] $RunCategories="Libraries Runtime", [string] $Csproj="src\benchmarks\micro\MicroBenchmarks.csproj", [string] $Kind="micro", [switch] $Internal, diff --git a/eng/common/performance/performance-setup.sh b/eng/common/performance/performance-setup.sh index 7ef15514e5..604aebffca 100644 --- a/eng/common/performance/performance-setup.sh +++ b/eng/common/performance/performance-setup.sh @@ -13,7 +13,7 @@ build_number=$BUILD_BUILDNUMBER internal=false compare=false kind="micro" -run_categories="coreclr corefx" +run_categories="Libraries Runtime" csproj="src\benchmarks\micro\MicroBenchmarks.csproj" configurations= run_from_perf_repo=false diff --git a/eng/common/post-build/promote-build.ps1 b/eng/common/post-build/add-build-to-channel.ps1 similarity index 95% rename from eng/common/post-build/promote-build.ps1 rename to eng/common/post-build/add-build-to-channel.ps1 index ce45635fbd..de2d957922 100644 --- a/eng/common/post-build/promote-build.ps1 +++ b/eng/common/post-build/add-build-to-channel.ps1 @@ -17,7 +17,7 @@ try { ExitWithExitCode 1 } - # Get info about which channels the build has already been promoted to + # Get info about which channel(s) the build has already been promoted to $buildInfo = Get-MaestroBuild -BuildId $BuildId if (!$buildInfo) { diff --git a/eng/common/templates/job/execute-sdl.yml b/eng/common/templates/job/execute-sdl.yml index 2973bcaf3a..640f2b04e2 100644 --- a/eng/common/templates/job/execute-sdl.yml +++ b/eng/common/templates/job/execute-sdl.yml @@ -1,4 +1,5 @@ parameters: + enable: 'false' # Whether the SDL validation job should execute or not overrideParameters: '' # Optional: to override values for parameters. additionalParameters: '' # Optional: parameters that need user specific values eg: '-SourceToolsList @("abc","def") -ArtifactToolsList @("ghi","jkl")' # There is some sort of bug (has been reported) in Azure DevOps where if this parameter is named @@ -16,8 +17,15 @@ jobs: - job: Run_SDL dependsOn: ${{ parameters.dependsOn }} displayName: Run SDL tool + condition: eq( ${{ parameters.enable }}, 'true') variables: - group: DotNet-VSTS-Bot + - name: AzDOProjectName + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOProjectName'] ] + - name: AzDOPipelineId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOPipelineId'] ] + - name: AzDOBuildId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildId'] ] pool: name: Hosted VS2017 steps: @@ -28,14 +36,22 @@ jobs: - task: DownloadBuildArtifacts@0 displayName: Download Build Artifacts inputs: - buildType: current + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) artifactName: ${{ artifactName }} downloadPath: $(Build.ArtifactStagingDirectory)\artifacts - ${{ if eq(parameters.artifactNames, '') }}: - task: DownloadBuildArtifacts@0 displayName: Download Build Artifacts inputs: - buildType: current + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) downloadType: specific files itemPattern: "**" downloadPath: $(Build.ArtifactStagingDirectory)\artifacts diff --git a/eng/common/templates/post-build/channels/generic-internal-channel.yml b/eng/common/templates/post-build/channels/generic-internal-channel.yml index 700211049b..29d8d46ee2 100644 --- a/eng/common/templates/post-build/channels/generic-internal-channel.yml +++ b/eng/common/templates/post-build/channels/generic-internal-channel.yml @@ -23,9 +23,15 @@ stages: - job: publish_symbols displayName: Symbol Publishing dependsOn: setupMaestroVars - condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.channelId }} )) + condition: or(contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.channelId }} )), eq(dependencies.setupMaestroVars.outputs['setReleaseVars.PromoteToMaestroChannelId'], ${{ parameters.channelId }})) variables: - group: DotNet-Symbol-Server-Pats + - name: AzDOProjectName + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOProjectName'] ] + - name: AzDOPipelineId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOPipelineId'] ] + - name: AzDOBuildId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildId'] ] pool: vmImage: 'windows-2019' steps: @@ -33,7 +39,11 @@ stages: displayName: Download Build Assets continueOnError: true inputs: - buildType: 'current' + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) downloadType: 'specific' itemPattern: | PDBArtifacts/** @@ -79,7 +89,13 @@ stages: value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ] - name: IsStableBuild value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.IsStableBuild'] ] - condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.channelId }})) + - name: AzDOProjectName + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOProjectName'] ] + - name: AzDOPipelineId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOPipelineId'] ] + - name: AzDOBuildId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildId'] ] + condition: or(contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.channelId }} )), eq(dependencies.setupMaestroVars.outputs['setReleaseVars.PromoteToMaestroChannelId'], ${{ parameters.channelId }})) pool: vmImage: 'windows-2019' steps: @@ -87,7 +103,11 @@ stages: displayName: Download Build Assets continueOnError: true inputs: - buildType: 'current' + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) downloadType: 'specific' itemPattern: | PackageArtifacts/** @@ -146,6 +166,6 @@ stages: StageLabel: '${{ parameters.stageName }}' JobLabel: 'AssetsPublishing' - - template: ../../steps/promote-build.yml + - template: ../../steps/add-build-to-channel.yml parameters: ChannelId: ${{ parameters.channelId }} diff --git a/eng/common/templates/post-build/channels/generic-public-channel.yml b/eng/common/templates/post-build/channels/generic-public-channel.yml index fbb5a19b67..883e033c80 100644 --- a/eng/common/templates/post-build/channels/generic-public-channel.yml +++ b/eng/common/templates/post-build/channels/generic-public-channel.yml @@ -23,9 +23,15 @@ stages: - job: publish_symbols displayName: Symbol Publishing dependsOn: setupMaestroVars - condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.channelId }} )) + condition: or(contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.channelId }} )), eq(dependencies.setupMaestroVars.outputs['setReleaseVars.PromoteToMaestroChannelId'], ${{ parameters.channelId }})) variables: - group: DotNet-Symbol-Server-Pats + - name: AzDOProjectName + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOProjectName'] ] + - name: AzDOPipelineId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOPipelineId'] ] + - name: AzDOBuildId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildId'] ] pool: vmImage: 'windows-2019' steps: @@ -33,7 +39,11 @@ stages: displayName: Download Build Assets continueOnError: true inputs: - buildType: 'current' + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) downloadType: 'specific' itemPattern: | PDBArtifacts/** @@ -78,7 +88,13 @@ stages: value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ] - name: IsStableBuild value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.IsStableBuild'] ] - condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.channelId }})) + - name: AzDOProjectName + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOProjectName'] ] + - name: AzDOPipelineId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOPipelineId'] ] + - name: AzDOBuildId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildId'] ] + condition: or(contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.channelId }} )), eq(dependencies.setupMaestroVars.outputs['setReleaseVars.PromoteToMaestroChannelId'], ${{ parameters.channelId }})) pool: vmImage: 'windows-2019' steps: @@ -86,7 +102,11 @@ stages: displayName: Download Build Assets continueOnError: true inputs: - buildType: 'current' + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) downloadType: 'specific' itemPattern: | PackageArtifacts/** @@ -145,6 +165,6 @@ stages: StageLabel: '${{ parameters.stageName }}' JobLabel: 'AssetsPublishing' - - template: ../../steps/promote-build.yml + - template: ../../steps/add-build-to-channel.yml parameters: ChannelId: ${{ parameters.channelId }} diff --git a/eng/common/templates/post-build/post-build.yml b/eng/common/templates/post-build/post-build.yml index 33295ba125..70cb65f50b 100644 --- a/eng/common/templates/post-build/post-build.yml +++ b/eng/common/templates/post-build/post-build.yml @@ -26,97 +26,136 @@ stages: - stage: Validate dependsOn: ${{ parameters.validateDependsOn }} displayName: Validate + variables: + - template: common-variables.yml jobs: - - ${{ if eq(parameters.enableNugetValidation, 'true') }}: - - job: - displayName: NuGet Validation - pool: - vmImage: 'windows-2019' - steps: - - task: DownloadBuildArtifacts@0 - displayName: Download Package Artifacts - inputs: - buildType: current - artifactName: PackageArtifacts - - - task: PowerShell@2 - displayName: Validate - inputs: - filePath: $(Build.SourcesDirectory)/eng/common/post-build/nuget-validation.ps1 - arguments: -PackagesPath $(Build.ArtifactStagingDirectory)/PackageArtifacts/ - -ToolDestinationPath $(Agent.BuildDirectory)/Extract/ - - - ${{ if eq(parameters.enableSigningValidation, 'true') }}: - - job: - displayName: Signing Validation - variables: - - template: common-variables.yml - pool: - vmImage: 'windows-2019' - steps: - - task: DownloadBuildArtifacts@0 - displayName: Download Package Artifacts - inputs: - buildType: current - artifactName: PackageArtifacts - - # This is necessary whenever we want to publish/restore to an AzDO private feed - # Since sdk-task.ps1 tries to restore packages we need to do this authentication here - # otherwise it'll complain about accessing a private feed. - - task: NuGetAuthenticate@0 - displayName: 'Authenticate to AzDO Feeds' - - - task: PowerShell@2 - displayName: Enable cross-org publishing - inputs: - filePath: eng\common\enable-cross-org-publishing.ps1 - arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) - - - task: PowerShell@2 - displayName: Validate - inputs: - filePath: eng\common\sdk-task.ps1 - arguments: -task SigningValidation -restore -msbuildEngine dotnet - /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts' - /p:SignCheckExclusionsFile='$(Build.SourcesDirectory)/eng/SignCheckExclusionsFile.txt' - ${{ parameters.signingValidationAdditionalParameters }} - - - template: ../steps/publish-logs.yml - parameters: - StageLabel: 'Validation' - JobLabel: 'Signing' - - - ${{ if eq(parameters.enableSourceLinkValidation, 'true') }}: - - job: - displayName: SourceLink Validation - variables: - - template: common-variables.yml - pool: - vmImage: 'windows-2019' - steps: - - task: DownloadBuildArtifacts@0 - displayName: Download Blob Artifacts - inputs: - buildType: current - artifactName: BlobArtifacts - - - task: PowerShell@2 - displayName: Validate - inputs: - filePath: $(Build.SourcesDirectory)/eng/common/post-build/sourcelink-validation.ps1 - arguments: -InputPath $(Build.ArtifactStagingDirectory)/BlobArtifacts/ - -ExtractPath $(Agent.BuildDirectory)/Extract/ - -GHRepoName $(Build.Repository.Name) - -GHCommit $(Build.SourceVersion) - -SourcelinkCliVersion $(SourceLinkCLIVersion) - continueOnError: true - - - ${{ if eq(parameters.SDLValidationParameters.enable, 'true') }}: - - template: /eng/common/templates/job/execute-sdl.yml - parameters: - additionalParameters: ${{ parameters.SDLValidationParameters.params }} - continueOnError: ${{ parameters.SDLValidationParameters.continueOnError }} - artifactNames: ${{ parameters.SDLValidationParameters.artifactNames }} + - template: setup-maestro-vars.yml + + - job: + displayName: NuGet Validation + dependsOn: setupMaestroVars + condition: eq( ${{ parameters.enableNugetValidation }}, 'true') + pool: + vmImage: 'windows-2019' + variables: + - name: AzDOProjectName + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOProjectName'] ] + - name: AzDOPipelineId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOPipelineId'] ] + - name: AzDOBuildId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildId'] ] + steps: + - task: DownloadBuildArtifacts@0 + displayName: Download Package Artifacts + inputs: + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) + artifactName: PackageArtifacts + + - task: PowerShell@2 + displayName: Validate + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/post-build/nuget-validation.ps1 + arguments: -PackagesPath $(Build.ArtifactStagingDirectory)/PackageArtifacts/ + -ToolDestinationPath $(Agent.BuildDirectory)/Extract/ + + - job: + displayName: Signing Validation + dependsOn: setupMaestroVars + condition: eq( ${{ parameters.enableSigningValidation }}, 'true') + variables: + - template: common-variables.yml + - name: AzDOProjectName + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOProjectName'] ] + - name: AzDOPipelineId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOPipelineId'] ] + - name: AzDOBuildId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildId'] ] + pool: + vmImage: 'windows-2019' + steps: + - task: DownloadBuildArtifacts@0 + displayName: Download Package Artifacts + inputs: + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) + artifactName: PackageArtifacts + + # This is necessary whenever we want to publish/restore to an AzDO private feed + # Since sdk-task.ps1 tries to restore packages we need to do this authentication here + # otherwise it'll complain about accessing a private feed. + - task: NuGetAuthenticate@0 + displayName: 'Authenticate to AzDO Feeds' + + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + + - task: PowerShell@2 + displayName: Validate + inputs: + filePath: eng\common\sdk-task.ps1 + arguments: -task SigningValidation -restore -msbuildEngine dotnet + /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts' + /p:SignCheckExclusionsFile='$(Build.SourcesDirectory)/eng/SignCheckExclusionsFile.txt' + ${{ parameters.signingValidationAdditionalParameters }} + + - template: ../steps/publish-logs.yml + parameters: + StageLabel: 'Validation' + JobLabel: 'Signing' + + - job: + displayName: SourceLink Validation + dependsOn: setupMaestroVars + condition: eq( ${{ parameters.enableSourceLinkValidation }}, 'true') + variables: + - template: common-variables.yml + - name: AzDOProjectName + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOProjectName'] ] + - name: AzDOPipelineId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOPipelineId'] ] + - name: AzDOBuildId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildId'] ] + pool: + vmImage: 'windows-2019' + steps: + - task: DownloadBuildArtifacts@0 + displayName: Download Blob Artifacts + inputs: + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) + artifactName: BlobArtifacts + + - task: PowerShell@2 + displayName: Validate + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/post-build/sourcelink-validation.ps1 + arguments: -InputPath $(Build.ArtifactStagingDirectory)/BlobArtifacts/ + -ExtractPath $(Agent.BuildDirectory)/Extract/ + -GHRepoName $(Build.Repository.Name) + -GHCommit $(Build.SourceVersion) + -SourcelinkCliVersion $(SourceLinkCLIVersion) + continueOnError: true + + - template: /eng/common/templates/job/execute-sdl.yml + parameters: + enable: ${{ parameters.SDLValidationParameters.enable }} + dependsOn: setupMaestroVars + additionalParameters: ${{ parameters.SDLValidationParameters.params }} + continueOnError: ${{ parameters.SDLValidationParameters.continueOnError }} + artifactNames: ${{ parameters.SDLValidationParameters.artifactNames }} - template: \eng\common\templates\post-build\channels\generic-public-channel.yml parameters: diff --git a/eng/common/templates/post-build/promote-build.yml b/eng/common/templates/post-build/promote-build.yml deleted file mode 100644 index 6b479c3b82..0000000000 --- a/eng/common/templates/post-build/promote-build.yml +++ /dev/null @@ -1,25 +0,0 @@ -parameters: - ChannelId: 0 - -jobs: -- job: - displayName: Promote Build - dependsOn: setupMaestroVars - condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.ChannelId }})) - variables: - - name: BARBuildId - value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ] - - name: ChannelId - value: ${{ parameters.ChannelId }} - pool: - vmImage: 'windows-2019' - steps: - - task: PowerShell@2 - displayName: Add Build to Channel - inputs: - filePath: $(Build.SourcesDirectory)/eng/common/post-build/promote-build.ps1 - arguments: -BuildId $(BARBuildId) - -ChannelId $(ChannelId) - -MaestroApiAccessToken $(MaestroApiAccessToken) - -MaestroApiEndPoint $(MaestroApiEndPoint) - -MaestroApiVersion $(MaestroApiVersion) diff --git a/eng/common/templates/post-build/setup-maestro-vars.yml b/eng/common/templates/post-build/setup-maestro-vars.yml index 716b53f740..05e611edb6 100644 --- a/eng/common/templates/post-build/setup-maestro-vars.yml +++ b/eng/common/templates/post-build/setup-maestro-vars.yml @@ -1,6 +1,12 @@ jobs: - job: setupMaestroVars displayName: Setup Maestro Vars + variables: + - template: common-variables.yml + - name: BuildId + value: $[ coalesce(variables.BARBuildId, 0) ] + - name: PromoteToChannelId + value: $[ coalesce(variables.PromoteToMaestroChannelId, 0) ] pool: vmImage: 'windows-2019' steps: @@ -8,6 +14,7 @@ jobs: - task: DownloadBuildArtifacts@0 displayName: Download Release Configs + condition: eq(variables.PromoteToChannelId, 0) inputs: buildType: current artifactName: ReleaseConfigs @@ -19,18 +26,50 @@ jobs: targetType: inline script: | try { - $Content = Get-Content $(Build.StagingDirectory)/ReleaseConfigs/ReleaseConfigs.txt + if ($Env:PromoteToChannelId -eq 0) { + $Content = Get-Content $(Build.StagingDirectory)/ReleaseConfigs/ReleaseConfigs.txt - $BarId = $Content | Select -Index 0 + $BarId = $Content | Select -Index 0 - $Channels = "" - $Content | Select -Index 1 | ForEach-Object { $Channels += "$_ ," } + $Channels = "" + $Content | Select -Index 1 | ForEach-Object { $Channels += "$_ ," } + + $IsStableBuild = $Content | Select -Index 2 - $IsStableBuild = $Content | Select -Index 2 + $AzureDevOpsProject = $Env:System_TeamProject + $AzureDevOpsBuildDefinitionId = $Env:System_DefinitionId + $AzureDevOpsBuildId = $Env:Build_BuildId + $PromoteToMaestroChannelId = 0 + } + else { + $buildApiEndpoint = "${Env:MaestroApiEndPoint}/api/builds/${Env:BARBuildId}?api-version=${Env:MaestroApiVersion}" + + $apiHeaders = New-Object 'System.Collections.Generic.Dictionary[[String],[String]]' + $apiHeaders.Add('Accept', 'application/json') + $apiHeaders.Add('Authorization',"Bearer ${Env:MAESTRO_API_TOKEN}") + + $buildInfo = try { Invoke-WebRequest -Method Get -Uri $buildApiEndpoint -Headers $apiHeaders | ConvertFrom-Json } catch { Write-Host "Error: $_" } + + $BarId = $Env:BARBuildId + $Channels = 'None' + + #TODO: Fix this once this issue is done: https://github.com/dotnet/arcade/issues/3834 + $IsStableBuild = 'False' + + $AzureDevOpsProject = $buildInfo.azureDevOpsProject + $AzureDevOpsBuildDefinitionId = $buildInfo.azureDevOpsBuildDefinitionId + $AzureDevOpsBuildId = $buildInfo.azureDevOpsBuildId + $PromoteToMaestroChannelId = $Env:PromoteToMaestroChannelId + } Write-Host "##vso[task.setvariable variable=BARBuildId;isOutput=true]$BarId" Write-Host "##vso[task.setvariable variable=InitialChannels;isOutput=true]$Channels" Write-Host "##vso[task.setvariable variable=IsStableBuild;isOutput=true]$IsStableBuild" + + Write-Host "##vso[task.setvariable variable=AzDOProjectName;isOutput=true]$AzureDevOpsProject" + Write-Host "##vso[task.setvariable variable=AzDOPipelineId;isOutput=true]$AzureDevOpsBuildDefinitionId" + Write-Host "##vso[task.setvariable variable=AzDOBuildId;isOutput=true]$AzureDevOpsBuildId" + Write-Host "##vso[task.setvariable variable=PromoteToMaestroChannelId;isOutput=true]$PromoteToMaestroChannelId" } catch { Write-Host $_ @@ -38,3 +77,5 @@ jobs: Write-Host $_.ScriptStackTrace exit 1 } + env: + MAESTRO_API_TOKEN: $(MaestroApiAccessToken) diff --git a/eng/common/templates/steps/promote-build.yml b/eng/common/templates/steps/add-build-to-channel.yml similarity index 68% rename from eng/common/templates/steps/promote-build.yml rename to eng/common/templates/steps/add-build-to-channel.yml index b90404435d..f67a210d62 100644 --- a/eng/common/templates/steps/promote-build.yml +++ b/eng/common/templates/steps/add-build-to-channel.yml @@ -5,9 +5,9 @@ steps: - task: PowerShell@2 displayName: Add Build to Channel inputs: - filePath: $(Build.SourcesDirectory)/eng/common/post-build/promote-build.ps1 + filePath: $(Build.SourcesDirectory)/eng/common/post-build/add-build-to-channel.ps1 arguments: -BuildId $(BARBuildId) -ChannelId ${{ parameters.ChannelId }} -MaestroApiAccessToken $(MaestroApiAccessToken) -MaestroApiEndPoint $(MaestroApiEndPoint) - -MaestroApiVersion $(MaestroApiVersion) + -MaestroApiVersion $(MaestroApiVersion) diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 23a3fd53d7..d3a432878e 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -655,9 +655,6 @@ Write-PipelineSetVariable -Name 'Artifacts.Log' -Value $LogDir Write-PipelineSetVariable -Name 'TEMP' -Value $TempDir Write-PipelineSetVariable -Name 'TMP' -Value $TempDir -$env:TEMP=$TempDir -$env:TMP=$TempDir - # Import custom tools configuration, if present in the repo. # Note: Import in global scope so that the script set top-level variables without qualification. if (!$disableConfigureToolsetImport) { diff --git a/global.json b/global.json index 3d6b07d193..72dad80688 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "dotnet": "3.0.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20076.3" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20101.2" } } From b8aa9293be506c06d0f95ef06334584712600a04 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2020 13:42:56 +0000 Subject: [PATCH 105/243] Update dependencies from https://github.com/dotnet/runtime build 20200202.3 (#797) - Microsoft.NETCore.App - 5.0.0-alpha.1.20102.3 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 8440c4d79c..009ac389ed 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 779323758d3e8aa7e4ee3dc2619d57e696078089 - + https://github.com/dotnet/runtime - 316a82fdcebb3bc025b3a5d056b751b29c1c3296 + fb14ae86f5637ea51c349fe2f7fcf9b8c6fa1a5a https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index fece83cd38..9a6b24756b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20101.3 + 5.0.0-alpha.1.20102.3 5.0.0-alpha.1.20079.7 From b2143fcc4470b49cf1c23d0188896669c16b200d Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 4 Feb 2020 13:53:24 +0000 Subject: [PATCH 106/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200203.9 (#799) - Microsoft.AspNetCore.App.Ref - 5.0.0-alpha.1.20103.9 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 009ac389ed..cf58072f4f 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime fb14ae86f5637ea51c349fe2f7fcf9b8c6fa1a5a - + https://github.com/dotnet/aspnetcore - c08221ffbe526d69c0b318792b093f6464e4eb09 + 51b2443750779f67ad1d8c06447c252776d5b81f diff --git a/eng/Versions.props b/eng/Versions.props index 9a6b24756b..26dc78a649 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20102.3 - 5.0.0-alpha.1.20079.7 + 5.0.0-alpha.1.20103.9 From 2b8b6cfba90d86f478a2e1d614dc898648fe7a10 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 4 Feb 2020 13:54:51 +0000 Subject: [PATCH 107/243] Update dependencies from https://github.com/dotnet/runtime build 20200203.10 (#798) - Microsoft.NETCore.App - 5.0.0-alpha.1.20103.10 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index cf58072f4f..f0abfadc93 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 779323758d3e8aa7e4ee3dc2619d57e696078089 - + https://github.com/dotnet/runtime - fb14ae86f5637ea51c349fe2f7fcf9b8c6fa1a5a + a7f8cdc0de945561ae3fcaa72440c0ec56d69060 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 26dc78a649..17c0b2cd64 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20102.3 + 5.0.0-alpha.1.20103.10 5.0.0-alpha.1.20103.9 From 2fde642f1cfb34a7d8668f99030687ab7706a938 Mon Sep 17 00:00:00 2001 From: Next Turn <45985406+NextTurn@users.noreply.github.com> Date: Wed, 5 Feb 2020 02:00:23 +0800 Subject: [PATCH 108/243] Add weak WinRT handle kind (#800) --- src/SOS/Strike/gcroot.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/SOS/Strike/gcroot.cpp b/src/SOS/Strike/gcroot.cpp index 7a364f8be6..1a2a02813f 100644 --- a/src/SOS/Strike/gcroot.cpp +++ b/src/SOS/Strike/gcroot.cpp @@ -117,6 +117,8 @@ static const char *NameForHandle(unsigned int type) return "async pinned"; case 8: return "sized ref"; + case 9: + return "weak WinRT"; } return "unknown"; From 3c73baf6c56e8688267542b93fdf4b0d374f072f Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2020 17:41:41 +0000 Subject: [PATCH 109/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200205.1 (#802) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.1.20105.1 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index f0abfadc93..1eb44ebeee 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime a7f8cdc0de945561ae3fcaa72440c0ec56d69060 - + https://github.com/dotnet/aspnetcore - 51b2443750779f67ad1d8c06447c252776d5b81f + 264fb6a1c95535d054a5fc9bd5b3e2580daefc39 diff --git a/eng/Versions.props b/eng/Versions.props index 17c0b2cd64..ac10bfdd45 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20103.10 - 5.0.0-alpha.1.20103.9 + 5.0.0-preview.1.20105.1 From 06f3cbfb426178850dd9245f2fcda679df89ead8 Mon Sep 17 00:00:00 2001 From: Next Turn <45985406+NextTurn@users.noreply.github.com> Date: Thu, 6 Feb 2020 14:09:30 +0800 Subject: [PATCH 110/243] Remove dead codes (#806) --- src/Tools/dotnet-dump/Dumper.Linux.cs | 68 --------------------------- 1 file changed, 68 deletions(-) delete mode 100644 src/Tools/dotnet-dump/Dumper.Linux.cs diff --git a/src/Tools/dotnet-dump/Dumper.Linux.cs b/src/Tools/dotnet-dump/Dumper.Linux.cs deleted file mode 100644 index beb521f88a..0000000000 --- a/src/Tools/dotnet-dump/Dumper.Linux.cs +++ /dev/null @@ -1,68 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Linq; -using System.Diagnostics; -using System.Threading.Tasks; -using System.IO; - -namespace Microsoft.Diagnostics.Tools.Dump -{ - public partial class Dumper - { - private static class Linux - { - internal static async Task CollectDumpAsync(Process process, string fileName, DumpTypeOption type) - { - // We don't work on WSL :( - string ostype = await File.ReadAllTextAsync("/proc/sys/kernel/osrelease"); - if (ostype.Contains("Microsoft")) - { - throw new PlatformNotSupportedException("Cannot collect memory dumps from Windows Subsystem for Linux."); - } - - // First step is to find the .NET runtime. To do this we look for coreclr.so - ProcessModule coreclr = process.Modules.Cast().FirstOrDefault(m => string.Equals(m.ModuleName, "libcoreclr.so")); - if (coreclr == null) - { - throw new NotSupportedException("Unable to locate .NET runtime associated with this process!"); - } - - // Find createdump next to that file - string runtimeDirectory = Path.GetDirectoryName(coreclr.FileName); - string createDumpPath = Path.Combine(runtimeDirectory, "createdump"); - if (!File.Exists(createDumpPath)) - { - throw new NotSupportedException($"Unable to locate 'createdump' tool in '{runtimeDirectory}'"); - } - - // Create the dump - int exitCode = await CreateDumpAsync(createDumpPath, fileName, process.Id, type); - if (exitCode != 0) - { - throw new InvalidOperationException($"createdump exited with non-zero exit code: {exitCode}"); - } - } - - private static Task CreateDumpAsync(string exePath, string fileName, int processId, DumpTypeOption type) - { - string dumpType = type == DumpTypeOption.Mini ? "--normal" : "--withheap"; - var tcs = new TaskCompletionSource(); - var createdump = new Process() - { - StartInfo = new ProcessStartInfo() - { - FileName = exePath, - Arguments = $"--name {fileName} {dumpType} {processId}", - }, - EnableRaisingEvents = true, - }; - createdump.Exited += (s, a) => tcs.TrySetResult(createdump.ExitCode); - createdump.Start(); - return tcs.Task; - } - } - } -} From 965c09daf7a9df501815594eadc0c7d6866563cd Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 8 Feb 2020 13:55:58 +0000 Subject: [PATCH 111/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200207.8 (#813) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.1.20107.8 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1eb44ebeee..72961dfffb 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime a7f8cdc0de945561ae3fcaa72440c0ec56d69060 - + https://github.com/dotnet/aspnetcore - 264fb6a1c95535d054a5fc9bd5b3e2580daefc39 + 4911c083389afd0ea1cc18f8600526c11c2418d6 diff --git a/eng/Versions.props b/eng/Versions.props index ac10bfdd45..83f1165771 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20103.10 - 5.0.0-preview.1.20105.1 + 5.0.0-preview.1.20107.8 From c33369b982c6edf35677aec57ce1b799c8ff8cec Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Sat, 8 Feb 2020 12:03:08 -0800 Subject: [PATCH 112/243] Fix the Windows private runtime build testing problems (#807) Fix the Windows private runtime build testing problems Enable the "setclrpath" for Windows. Change the SOS test harness and scripts to set the runtime path for triage dumps. Add -privatebuildpath option to build scripts that installs the test runtimes, copies the private runtime build and on Windows regedit's the necessary keys to create dumps. Add private build registry cleanup. --- README.md | 50 +----- documentation/privatebuildtesting.md | 39 +++++ documentation/sos.md | 46 ++++++ eng/CleanupPrivateBuild.csproj | 8 + eng/InstallRuntimes.proj | 142 +++++++++++++++++- eng/build.ps1 | 15 +- eng/build.sh | 10 +- .../Windows/Debugger.Tests.Config.txt | 7 +- src/SOS/SOS.UnitTests/SOSRunner.cs | 26 +++- .../SOS.UnitTests/Scripts/DualRuntimes.script | 9 +- src/SOS/Strike/runtime.cpp | 16 +- src/SOS/Strike/runtime.h | 1 + src/SOS/Strike/sos.def | 2 + src/SOS/Strike/sosdocs.txt | 28 +++- src/SOS/Strike/sosdocsunix.txt | 26 ++-- src/SOS/Strike/strike.cpp | 35 +++++ src/SOS/lldbplugin/setclrpathcommand.cpp | 2 +- src/Tools/dotnet-dump/Commands/SOSCommand.cs | 1 + 18 files changed, 372 insertions(+), 91 deletions(-) create mode 100644 documentation/privatebuildtesting.md create mode 100644 documentation/sos.md create mode 100644 eng/CleanupPrivateBuild.csproj diff --git a/README.md b/README.md index 980c1b649a..066162d2f7 100644 --- a/README.md +++ b/README.md @@ -27,62 +27,22 @@ To install the platform's prerequisites and build: * [MacOS Instructions](documentation/building/osx-instructions.md) * [FreeBSD Instructions](documentation/building/freebsd-instructions.md) * [NetBSD Instructions](documentation/building/netbsd-instructions.md) + * [Testing on private runtime builds](documentation/privatebuildtesting.md) -## Getting lldb - -Getting a version of lldb that works for your platform can be a problem sometimes. The version has to be at least 3.9 or greater because of a bug running SOS on a core dump that was fixed. Some Linux distros like Ubuntu it is easy as `sudo apt-get install lldb-3.9 python-lldb-3.9`. On other distros, you will need to build lldb. The directions below should give you some guidance. - -* [Linux Instructions](documentation/lldb/linux-instructions.md) -* [MacOS Instructions](documentation/lldb/osx-instructions.md) -* [FreeBSD Instructions](documentation/lldb/freebsd-instructions.md) -* [NetBSD Instructions](documentation/lldb/netbsd-instructions.md) - -## Installing SOS - -* [Linux and MacOS Instructions](documentation/installing-sos-instructions.md) -* [Windows Instructions](documentation/installing-sos-windows-instructions.md) - -## Using SOS - -* [SOS debugging for Linux/MacOS](documentation/sos-debugging-extension.md) -* [SOS debugging for Windows](documentation/sos-debugging-extension-windows.md) -* [Debugging a core dump](documentation/debugging-coredump.md) - -## Tools +## SOS and Other Diagnostic Tools +* [SOS](documentation/sos.md) - About the SOS debugger extension. * [dotnet-dump](documentation/dotnet-dump-instructions.md) - Dump collection and analysis utility. * [dotnet-trace](documentation/dotnet-trace-instructions.md) - Enable the collection of events for a running .NET Core Application to a local trace file. * [dotnet-counters](documentation/dotnet-counters-instructions.md) - Monitor performance counters of a .NET Core application in real time. -## New Features - -The `bpmd` command can now be used before the runtime is loaded. You can load SOS or the sos plugin on Linux and execute bpmd. Always add the module extension for the first parameter. - - bpmd SymbolTestApp.dll SymbolTestApp.Program.Main - -You can set a source file/line number breakpoint like this (the fully qualified source file path is usually not necessary): - - bpmd SymbolTestApp.cs:24 - -Symbol server support - The `setsymbolserver` command enables downloading the symbol files (portable PDBs) for managed assemblies during commands like `clrstack`, etc. See `soshelp setsymbolserver` for more details. - - (lldb) setsymbolserver -ms - -Before executing the "bt" command to dump native frames to load the native symbols (for live debugging only): - - (lldb) loadsymbols - -To add a local directory to search for symbols: - - (lldb) setsymbolserver -directory /tmp/symbols - ## Useful Links * [FAQ](documentation/FAQ.md) - Frequently asked questions. * [The LLDB Debugger](http://lldb.llvm.org/index.html) - More information about lldb. * [SOS](https://msdn.microsoft.com/en-us/library/bb190764(v=vs.110).aspx) - More information about SOS. -* [Debugging CoreCLR](https://github.com/dotnet/coreclr/blob/master/Documentation/building/debugging-instructions.md) - Instructions for debugging .NET Core and the CoreCLR runtime. -* [dotnet/coreclr](https://github.com/dotnet/coreclr) - Source for the .NET Core runtime. +* [Debugging CoreCLR](https://github.com/dotnet/runtime/blob/master/docs/workflow/debugging/coreclr/debugging.md) - Instructions for debugging .NET Core and the CoreCLR runtime. +* [dotnet/runtime](https://github.com/dotnet/runtime) - Source for the .NET Core runtime. * [Official Build Instructions](documentation/building/official-build-instructions.md) - Internal official build instructions. [//]: # (Begin current test results) diff --git a/documentation/privatebuildtesting.md b/documentation/privatebuildtesting.md new file mode 100644 index 0000000000..4a389c4f29 --- /dev/null +++ b/documentation/privatebuildtesting.md @@ -0,0 +1,39 @@ +Private runtime build testing +============================= + +Here are some instructions on how to run the diagnostics repo's tests against a locally build private .NET Core runtime. These directions will work on Windows, Linux and MacOS. + +1. Build the runtime repo (see [Workflow Guide](https://github.com/dotnet/runtime/blob/master/docs/workflow/README.md)). +2. Build the diagnostics repo (see [Building the Repository](../README.md)). +3. Run the diagnostics repo tests with the -privatebuildpath option. + +On Windows: +``` +C:\diagnostics> test -privatebuildpath c:\runtime\artifacts\bin\coreclr\Windows_NT.x64.Debug +``` + +When you are all done with the private runtime testing, run this command to remove the Windows registry entries added in the above steps. + +``` +C:\diagnostics> test -cleanupprivatebuild +``` + +There will be some popups from regedit asking for administrator permission to edit the registry (press Yes), warning about adding registry keys from AddPrivateTesting.reg (press Yes) and that the edit was successful (press OK). + +On Linux/MacOS: +``` +~/diagnostics$ ./test.sh --privatebuildpath /home/user/runtime/artifacts/bin/coreclr/Linux.x64.Debug +``` +The private runtime will be copied to the diagnostics repo and the tests started. It can be just the coreclr binaries but this assumes that the private build is close to the latest published master build. If not, you can pass the runtime's testhost directory containing all the shared runtime bits i.e. `c:\runtime\artifacts\bin\testhost\netcoreapp5.0-Windows_NT-Debug-x64\shared\Microsoft.NETCore.App\5.0.0` or `/home/user/runtime/artifacts/bin/testhost/netcoreapp5.0-Linux-Release-x64/shared/Microsoft.NETCore.App/5.0.0` + +On Linux/MacOS it is recommended to test against Release runtime builds because of a benign assert in DAC (tracked by issue #[31897](https://github.com/dotnet/runtime/issues/31897)) that causes the tests to fail. + +On Windows the DAC is not properly signed for a private runtime build so there are a couple of registry keys that need to be added so Windows will load the DAC and the tests can create proper mini-dumps. An example of the registry key values added are: + +``` +[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\KnownManagedDebuggingDlls] +"C:\diagnostics\.dotnet\shared\Microsoft.NETCore.App\5.0.0-alpha.1.20102.3\mscordaccore.dll"=dword:0 + +[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\MiniDumpAuxiliaryDlls] +"C:\diagnostics\.dotnet\shared\Microsoft.NETCore.App\5.0.0-alpha.1.20102.3\coreclr.dll"="C:\diagnostics\.dotnet\shared\Microsoft.NETCore.App\5.0.0-alpha.1.20102.3\mscordaccore.dll" +``` \ No newline at end of file diff --git a/documentation/sos.md b/documentation/sos.md new file mode 100644 index 0000000000..fe4518d7ac --- /dev/null +++ b/documentation/sos.md @@ -0,0 +1,46 @@ +SOS +=== + +SOS is a debugger extension that allows a developer to inspect the managed state of a .NET Core and desktop runtime process. SOS can be loaded by WinDbg/cdb debuggers on Windows and lldb on Linux and MacOS. + +## Getting lldb + +Getting a version of lldb that works for your platform can be a problem sometimes. The version has to be at least 3.9 or greater because of a bug running SOS on a core dump that was fixed. Some Linux distros like Ubuntu it is easy as `sudo apt-get install lldb-3.9 python-lldb-3.9`. On other distros, you will need to build lldb. The directions below should give you some guidance. + +* [Linux Instructions](lldb/linux-instructions.md) +* [MacOS Instructions](lldb/osx-instructions.md) +* [FreeBSD Instructions](lldb/freebsd-instructions.md) +* [NetBSD Instructions](lldb/netbsd-instructions.md) + +## Installing SOS + +* [Linux and MacOS Instructions](installing-sos-instructions.md) +* [Windows Instructions](installing-sos-windows-instructions.md) + +## Using SOS + +* [SOS debugging for Linux/MacOS](sos-debugging-extension.md) +* [SOS debugging for Windows](sos-debugging-extension-windows.md) +* [Debugging a core dump](debugging-coredump.md) + +## New SOS Features + +The `bpmd` command can now be used before the runtime is loaded. You can load SOS or the sos plugin on Linux and execute bpmd. Always add the module extension for the first parameter. + + bpmd SymbolTestApp.dll SymbolTestApp.Program.Main + +You can set a source file/line number breakpoint like this (the fully qualified source file path is usually not necessary): + + bpmd SymbolTestApp.cs:24 + +Symbol server support - The `setsymbolserver` command enables downloading the symbol files (portable PDBs) for managed assemblies during commands like `clrstack`, etc. See `soshelp setsymbolserver` for more details. + + (lldb) setsymbolserver -ms + +Before executing the "bt" command to dump native frames to load the native symbols (for live debugging only): + + (lldb) loadsymbols + +To add a local directory to search for symbols: + + (lldb) setsymbolserver -directory /tmp/symbols diff --git a/eng/CleanupPrivateBuild.csproj b/eng/CleanupPrivateBuild.csproj new file mode 100644 index 0000000000..83118ceba4 --- /dev/null +++ b/eng/CleanupPrivateBuild.csproj @@ -0,0 +1,8 @@ + + + netcoreapp2.0 + + + + + diff --git a/eng/InstallRuntimes.proj b/eng/InstallRuntimes.proj index 0e86ebdb38..4b4b6255ff 100644 --- a/eng/InstallRuntimes.proj +++ b/eng/InstallRuntimes.proj @@ -1,7 +1,9 @@ + + + DependsOnTargets="InstallRuntimesWindows;InstallRuntimesUnix;WriteTestVersionManifest;TestPrivateBuild" /> + + + + @@ -76,7 +106,14 @@ Condition="%(TestVersions.Install)" /> - + + + + $(MicrosoftAspNetCoreAppRefVersion) ]]> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/eng/build.ps1 b/eng/build.ps1 index 8f32731eba..820720139b 100644 --- a/eng/build.ps1 +++ b/eng/build.ps1 @@ -8,6 +8,8 @@ Param( [switch] $skipmanaged, [switch] $skipnative, [switch] $dailytest, + [string] $privatebuildpath = "", + [switch] $cleanupprivatebuild, [Parameter(ValueFromRemainingArguments=$true)][String[]] $remainingargs ) @@ -45,11 +47,22 @@ $engroot = Join-Path $reporoot "eng" $artifactsdir = Join-Path $reporoot "artifacts" $logdir = Join-Path $artifactsdir "log" $logdir = Join-Path $logdir Windows_NT.$architecture.$configuration +$dailytestproperty = "false" if ($ci) { $remainingargs = "-ci " + $remainingargs } +if ($dailytest -or $privatebuildpath -ne "") { + $dailytestproperty = "true" +} + +# Remove the private build registry keys +if ($cleanupprivatebuild) { + Invoke-Expression "& `"$engroot\common\msbuild.ps1`" $engroot\CleanupPrivateBuild.csproj /v:$verbosity /t:CleanupPrivateBuild /p:BuildArch=$architecture /p:TestArchitectures=$architecture" + exit $lastExitCode +} + # Install sdk for building, restore and build managed components. if (-not $skipmanaged) { Invoke-Expression "& `"$engroot\common\build.ps1`" -build -binaryLog -configuration $configuration -verbosity $verbosity /p:BuildArch=$architecture /p:TestArchitectures=$architecture $remainingargs" @@ -69,7 +82,7 @@ if (-not $skipnative) { # Run the xunit tests if ($test -or $dailytest) { if (-not $crossbuild) { - & "$engroot\common\build.ps1" -test -configuration $configuration -verbosity $verbosity -ci:$ci /bl:$logdir\Test.binlog /p:BuildArch=$architecture /p:TestArchitectures=$architecture /p:DailyTest=$dailyTest + & "$engroot\common\build.ps1" -test -configuration $configuration -verbosity $verbosity -ci:$ci /bl:$logdir\Test.binlog /p:BuildArch=$architecture /p:TestArchitectures=$architecture /p:DailyTest=$dailytestproperty /p:PrivateBuildPath=$privatebuildpath if ($lastExitCode -ne 0) { exit $lastExitCode } diff --git a/eng/build.sh b/eng/build.sh index 7a928e4366..bf621c9791 100755 --- a/eng/build.sh +++ b/eng/build.sh @@ -30,6 +30,7 @@ __NativeBuild=true __CrossBuild=false __Test=false __DailyTest=false +__PrivateBuildPath="" __CI=false __Verbosity=minimal __ManagedBuildArgs= @@ -43,6 +44,7 @@ usage() echo "--skipnative - Skip building native components" echo "--test - run xunit tests" echo "--dailytest - test components for daily build job" + echo "--privatebuildpath - path to local private runtime build to test" echo "--architecture " echo "--configuration " echo "--rootfs " @@ -177,6 +179,12 @@ while :; do __DailyTest=true ;; + -privatebuildpath) + __PrivateBuildPath=$2 + __DailyTest=true + shift + ;; + -ci) __CI=true __ManagedBuildArgs="$__ManagedBuildArgs $1" @@ -498,7 +506,7 @@ if [ $__Test == true ]; then echo "lldb: '$LLDB_PATH' gdb: '$GDB_PATH'" - "$__ProjectRoot/eng/common/build.sh" --test --configuration "$__BuildType" --verbosity "$__Verbosity" /bl:$__LogDir/Test.binlog /p:BuildArch=$__BuildArch /p:DailyTest=$__DailyTest $__TestArgs + "$__ProjectRoot/eng/common/build.sh" --test --configuration "$__BuildType" --verbosity "$__Verbosity" /bl:$__LogDir/Test.binlog /p:BuildArch=$__BuildArch /p:DailyTest=$__DailyTest /p:PrivateBuildPath=$__PrivateBuildPath $__TestArgs if [ $? != 0 ]; then exit 1 fi diff --git a/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt b/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt index ef06736e0c..3ee2b5eded 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt +++ b/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt @@ -22,6 +22,9 @@ $(RootBinDir)\tmp\$(TargetConfiguration)\dumps $(RootBinDir)\bin\SOS.UnitTests\$(TargetConfiguration)\netcoreapp2.0\publish\runtimes\win-$(TargetArchitecture)\native\cdb.exe $(InstallDir)\runcommand.dll + + $(WinDir)\Microsoft.Net\Framework64\v4.0.30319\ + $(WinDir)\Microsoft.Net\Framework\v4.0.30319\ net462 $(RepoRootDir)\src\SOS\SOS.UnitTests\Debuggees @@ -163,9 +166,7 @@ $(DesktopFramework) win-$(TargetArchitecture) full - $(WinDir)\Microsoft.Net\Framework64\v4.0.30319\ - $(WinDir)\Microsoft.Net\Framework\v4.0.30319\ - $(FrameworkDirPath) + $(DesktopFrameworkPath) $(DotNetRoot)\shared\Microsoft.NETCore.App\$(RuntimeVersion21) diff --git a/src/SOS/SOS.UnitTests/SOSRunner.cs b/src/SOS/SOS.UnitTests/SOSRunner.cs index 0c84c29966..fd63d8d95b 100644 --- a/src/SOS/SOS.UnitTests/SOSRunner.cs +++ b/src/SOS/SOS.UnitTests/SOSRunner.cs @@ -440,11 +440,14 @@ public static async Task StartDebugger(TestInformation information, D initialCommands.Add(".sympath %DEBUG_ROOT%"); initialCommands.Add(".extpath " + Path.GetDirectoryName(config.SOSPath())); - // Add the path to runtime so cdb/sos can find mscordbi. - string runtimeSymbolsPath = config.RuntimeSymbolsPath; - if (runtimeSymbolsPath != null) + // Add the path to runtime so cdb/SOS can find DAC/DBI for triage dumps + if (information.DumpType == DumpType.Triage) { - initialCommands.Add(".sympath+ " + runtimeSymbolsPath); + string runtimeSymbolsPath = config.RuntimeSymbolsPath; + if (runtimeSymbolsPath != null) + { + initialCommands.Add(".sympath+ " + runtimeSymbolsPath); + } } // Turn off warnings that can happen in the middle of a command's output initialCommands.Add(".outmask- 0x244"); @@ -543,6 +546,15 @@ public static async Task StartDebugger(TestInformation information, D } initialCommands.Add("setsymbolserver -directory %DEBUG_ROOT%"); + // Add the path to runtime so dotnet-dump/SOS can find DAC/DBI for triage dumps + if (information.DumpType == DumpType.Triage) + { + string runtimeSymbolsPath = config.RuntimeSymbolsPath; + if (runtimeSymbolsPath != null) + { + initialCommands.Add("setclrpath " + runtimeSymbolsPath); + } + } arguments.Append(debuggerPath); arguments.Append(@" analyze %DUMP_NAME%"); debuggerPath = config.DotNetDumpHost(); @@ -1175,6 +1187,7 @@ private static Dictionary GenerateVariables(TestInformation info } vars.Add("%DEBUG_ROOT%", debuggeeConfig.BinaryDirPath); vars.Add("%SOS_PATH%", information.TestConfiguration.SOSPath()); + vars.Add("%DESKTOP_RUNTIME_PATH%", information.TestConfiguration.DesktopRuntimePath()); // Can be used in an RegEx expression vars.Add("", debuggeeExe.Replace(@"\", @"\\")); @@ -1385,6 +1398,11 @@ public static string SOSHostRuntime(this TestConfiguration config) return TestConfiguration.MakeCanonicalPath(config.GetValue("SOSHostRuntime")); } + public static string DesktopRuntimePath(this TestConfiguration config) + { + return TestConfiguration.MakeCanonicalPath(config.GetValue("DesktopRuntimePath")); + } + public static bool GenerateDumpWithLLDB(this TestConfiguration config) { return config.GetValue("GenerateDumpWithLLDB")?.ToLowerInvariant() == "true"; diff --git a/src/SOS/SOS.UnitTests/Scripts/DualRuntimes.script b/src/SOS/SOS.UnitTests/Scripts/DualRuntimes.script index e54fa09c84..954d5fea3d 100644 --- a/src/SOS/SOS.UnitTests/Scripts/DualRuntimes.script +++ b/src/SOS/SOS.UnitTests/Scripts/DualRuntimes.script @@ -71,6 +71,10 @@ VERIFY:\s*Total\s+\s+objects\s+ SOSCOMMAND:SOSStatus VERIFY:.*\.NET Core runtime at.*\s+ +IFDEF:TRIAGE_DUMP +SOSCOMMAND:setclrpath %DESKTOP_RUNTIME_PATH% +ENDIF:TRIAGE_DUMP + SOSCOMMAND:SOSStatus -desktop VERIFY:\s*Switched to desktop CLR runtime successfully\s+ @@ -83,12 +87,7 @@ VERIFY:\s+\s+\s+SymbolTestDll\.TestClass\.Foo6\(.*\)\s+\[(?i:.*[ VERIFY:\s+\s+\s+SymbolTestDll\.TestClass\.Foo5\(.*\)\s+\[(?i:.*[\\|/]TestClass\.cs) @ 16\]\s* VERIFY:\s+\s+\s+SymbolTestDll\.TestClass\.ThrowException\(.*\)\s+\[(?i:.*[\\|/]TestClass\.cs) @ 10\]\s* -IFDEF:DOTNETDUMP SOSCOMMAND:clrthreads -ENDIF:DOTNETDUMP -!IFDEF:DOTNETDUMP -SOSCOMMAND:Threads -ENDIF:DOTNETDUMP VERIFY:\s*ThreadCount:\s+\s+ VERIFY:\s+UnstartedThread:\s+\s+ VERIFY:\s+BackgroundThread:\s+\s+ diff --git a/src/SOS/Strike/runtime.cpp b/src/SOS/Strike/runtime.cpp index 76505769bc..94afc1fd0a 100644 --- a/src/SOS/Strike/runtime.cpp +++ b/src/SOS/Strike/runtime.cpp @@ -37,6 +37,9 @@ bool Runtime::s_isDesktop = false; LPCSTR Runtime::s_dacFilePath = nullptr; LPCSTR Runtime::s_dbiFilePath = nullptr; +// The runtime module path set by the "setclrpath" command +LPCSTR g_runtimeModulePath = nullptr; + // Current runtime instance IRuntime* g_pRuntime = nullptr; @@ -267,10 +270,17 @@ LPCSTR Runtime::GetRuntimeDirectory() { if (m_runtimeDirectory == nullptr) { - std::string runtimeDirectory; - if (SUCCEEDED(GetRuntimeDirectory(runtimeDirectory))) + if (g_runtimeModulePath != nullptr) + { + m_runtimeDirectory = _strdup(g_runtimeModulePath); + } + else { - m_runtimeDirectory = _strdup(runtimeDirectory.c_str()); + std::string runtimeDirectory; + if (SUCCEEDED(GetRuntimeDirectory(runtimeDirectory))) + { + m_runtimeDirectory = _strdup(runtimeDirectory.c_str()); + } } } return m_runtimeDirectory; diff --git a/src/SOS/Strike/runtime.h b/src/SOS/Strike/runtime.h index eef4893527..1693201982 100644 --- a/src/SOS/Strike/runtime.h +++ b/src/SOS/Strike/runtime.h @@ -88,6 +88,7 @@ class IRuntime virtual void DisplayStatus() = 0; }; +extern LPCSTR g_runtimeModulePath; extern IRuntime* g_pRuntime; /**********************************************************************\ diff --git a/src/SOS/Strike/sos.def b/src/SOS/Strike/sos.def index 55e1003800..ec85ef31c3 100644 --- a/src/SOS/Strike/sos.def +++ b/src/SOS/Strike/sos.def @@ -128,6 +128,8 @@ EXPORTS sethostruntime=SetHostRuntime SetSymbolServer setsymbolserver=SetSymbolServer + SetClrPath + setclrpath=SetClrPath SOSFlush sosflush=SOSFlush StopOnException diff --git a/src/SOS/Strike/sosdocs.txt b/src/SOS/Strike/sosdocs.txt index 212ad00e35..f38283f3bb 100644 --- a/src/SOS/Strike/sosdocs.txt +++ b/src/SOS/Strike/sosdocs.txt @@ -62,9 +62,10 @@ Examining the GC history Other ----------------------------- ----------------------------- HistInit SetHostRuntime (sethostruntime) HistRoot SetSymbolServer (setsymbolserver) -HistObj FAQ +HistObj SetClrPath (setclrpath) HistObjFind SOSFlush HistClear SOSStatus (sosstatus) + FAQ Help (soshelp) \\ @@ -2638,10 +2639,21 @@ COMMAND: sosstatus. Display internal SOS status, reset the internal cached state, or change between desktop or netcore runtimes when both are loaded in the process or dump. -0:000> !sosstatus -Target platform: 8664 Context size 04d0 -.NET Core runtime at 00007FFEE7230000 (005c2000) -DAC file path: C:\Users\mikem\AppData\Local\Temp\SymbolCache\mscordaccore.dll/5d0707425c2000/mscordaccore.dll -DBI file path: C:\Users\mikem\AppData\Local\Temp\SymbolCache\mscordbi.dll/5d0707425c2000/mscordbi.dll -Cache: C:\Users\mikem\AppData\Local\Temp\SymbolCache -Server: http://msdl.microsoft.com/download/symbols/ \ No newline at end of file + 0:000> !sosstatus + Target platform: 8664 Context size 04d0 + .NET Core runtime at 00007FFEE7230000 (005c2000) + DAC file path: C:\Users\mikem\AppData\Local\Temp\SymbolCache\mscordaccore.dll/5d0707425c2000/mscordaccore.dll + DBI file path: C:\Users\mikem\AppData\Local\Temp\SymbolCache\mscordbi.dll/5d0707425c2000/mscordbi.dll + Cache: C:\Users\mikem\AppData\Local\Temp\SymbolCache + Server: http://msdl.microsoft.com/download/symbols/ +// + +COMMAND: setclrpath. +!setclrpath + +Sets the path to load the runtime DAC/DBI files. This command may be necessary for dumps that were created +on another machine or for triage dumps because there are no module paths included in the dump to infer the +runtime directory. + + 0:000> !setclrpath "C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.0" +// \ No newline at end of file diff --git a/src/SOS/Strike/sosdocsunix.txt b/src/SOS/Strike/sosdocsunix.txt index 196a45be26..2ead3614d1 100644 --- a/src/SOS/Strike/sosdocsunix.txt +++ b/src/SOS/Strike/sosdocsunix.txt @@ -55,26 +55,14 @@ Examining the GC history Other ----------------------------- ----------------------------- HistInit (histinit) SetHostRuntime (sethostruntime) HistRoot (histroot) SetSymbolServer (setsymbolserver, loadsymbols) -HistObj (histobj) FAQ +HistObj (histobj) SetClrPath (setclrpath) HistObjFind (histobjfind) SOSFlush (sosflush) HistClear (histclear) SOSStatus (sosstatus) + FAQ Help (soshelp) \\ COMMAND: faq. ->> Where can I get the right version of SOS for my build? - -If you are running a xplat version of coreclr, the sos module (exact name -is platform dependent) is installed in the same directory as the main coreclr -module. There is also an lldb sos plugin command that allows the path where -the sos, dac and dbi modules are loaded: - - "setclrpath /home/user/coreclr/bin/Product/Linux.x64.Debug"" - -If you are using a dump file created on another machine, it is a little bit -more complex. You need to make sure the dac module that came with that install -is in the directory set with the above command. - >> I have a chicken and egg problem. I want to use SOS commands, but the CLR isn't loaded yet. What can I do? @@ -1963,3 +1951,13 @@ SOSStatus [-reset] -reset - reset all the cached internal SOS state. Display internal SOS status or reset the internal cached state. +\\ + +COMMAND: setclrpath. +!setclrpath + +Sets the path to load the runtime DAC/DBI files. This command may be necessary for dumps that were created +on another machine or for triage dumps. + + (lldb) setclrpath /home/user/coreclr/bin/Product/Linux.x64.Debug +\\ \ No newline at end of file diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 48eda6df2c..8e18d42c25 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -10470,6 +10470,9 @@ DECLARE_API(SOSStatus) if (g_targetMachine != nullptr) { ExtOut("Target platform: %04x Context size %04x\n", g_targetMachine->GetPlatform(), g_targetMachine->GetContextSize()); } + if (g_runtimeModulePath != nullptr) { + ExtOut("Runtime module path: %s\n", g_runtimeModulePath); + } if (g_pRuntime != nullptr) { g_pRuntime->DisplayStatus(); } @@ -16078,6 +16081,38 @@ DECLARE_API(SetSymbolServer) return Status; } +// +// Sets the runtime module path +// +DECLARE_API(SetClrPath) +{ + INIT_API_EXT(); + + StringHolder runtimeModulePath; + CMDValue arg[] = + { + {&runtimeModulePath.data, COSTRING}, + }; + size_t narg; + if (!GetCMDOption(args, nullptr, 0, arg, _countof(arg), &narg)) + { + return E_FAIL; + } + if (narg > 0) + { + if (g_runtimeModulePath != nullptr) + { + free((void*)g_runtimeModulePath); + } + g_runtimeModulePath = _strdup(runtimeModulePath.data); + } + if (g_runtimeModulePath != nullptr) + { + ExtOut("Runtime module path: %s\n", g_runtimeModulePath); + } + return S_OK; +} + void PrintHelp (__in_z LPCSTR pszCmdName) { static LPSTR pText = NULL; diff --git a/src/SOS/lldbplugin/setclrpathcommand.cpp b/src/SOS/lldbplugin/setclrpathcommand.cpp index 0a964473ff..cbe4773e8a 100644 --- a/src/SOS/lldbplugin/setclrpathcommand.cpp +++ b/src/SOS/lldbplugin/setclrpathcommand.cpp @@ -48,6 +48,6 @@ bool setclrpathCommandInitialize(lldb::SBDebugger debugger) { lldb::SBCommandInterpreter interpreter = debugger.GetCommandInterpreter(); - lldb::SBCommand command = interpreter.AddCommand("setclrpath", new setclrpathCommand(), "Set the path to load coreclr dac/dbi files. setclrpath "); + lldb::SBCommand command = interpreter.AddCommand("setclrpath", new setclrpathCommand(), "Set the path to load the runtime DAC/DBI files. setclrpath "); return true; } diff --git a/src/Tools/dotnet-dump/Commands/SOSCommand.cs b/src/Tools/dotnet-dump/Commands/SOSCommand.cs index 639693eb5d..2bb9c8d60a 100644 --- a/src/Tools/dotnet-dump/Commands/SOSCommand.cs +++ b/src/Tools/dotnet-dump/Commands/SOSCommand.cs @@ -48,6 +48,7 @@ namespace Microsoft.Diagnostics.Tools.Dump [Command(Name = "histobjfind", AliasExpansion = "HistObjFind", Help = "Displays all the log entries that reference an object at the specified address.")] [Command(Name = "histroot", AliasExpansion = "HistRoot", Help = "Displays information related to both promotions and relocations of the specified root.")] [Command(Name = "setsymbolserver", AliasExpansion = "SetSymbolServer", Help = "Enables the symbol server support ")] + [Command(Name = "setclrpath", AliasExpansion = "setclrpath", Platform = CommandPlatform.Windows, Help = "Set the path to load the runtime DAC/DBI files.")] [Command(Name = "dumprcw", AliasExpansion = "DumpRCW", Platform = CommandPlatform.Windows, Help = "Displays information about a Runtime Callable Wrapper.")] [Command(Name = "dumpccw", AliasExpansion = "DumpCCW", Platform = CommandPlatform.Windows, Help = "Displays information about a COM Callable Wrapper.")] [Command(Name = "dumppermissionset",AliasExpansion = "DumpPermissionSet", Platform = CommandPlatform.Windows, Help = "Displays a PermissionSet object (debug build only).")] From 81e6a18bf4684994133d10314045caa0326a9ab6 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2020 13:31:50 +0000 Subject: [PATCH 113/243] Update dependencies from https://github.com/dotnet/arcade build 20200209.1 (#814) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.20109.1 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.20109.1 --- eng/Version.Details.xml | 8 ++-- eng/Versions.props | 2 +- eng/common/build.sh | 10 ---- eng/common/performance/performance-setup.ps1 | 4 +- eng/common/performance/performance-setup.sh | 4 +- .../channels/generic-internal-channel.yml | 2 +- .../channels/generic-public-channel.yml | 2 +- eng/common/tools.ps1 | 48 ++++++++++++++----- eng/common/tools.sh | 38 +++++++++++---- global.json | 2 +- 10 files changed, 79 insertions(+), 41 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 72961dfffb..616b409e92 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,15 +4,15 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - 779323758d3e8aa7e4ee3dc2619d57e696078089 + b0e8d3944155f94f83deea8afe025debe369e69f - + https://github.com/dotnet/arcade - 779323758d3e8aa7e4ee3dc2619d57e696078089 + b0e8d3944155f94f83deea8afe025debe369e69f https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 83f1165771..bb9ad5702e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -40,7 +40,7 @@ 4.5.3 2.4.1 2.0.3 - 5.0.0-beta.20101.2 + 5.0.0-beta.20109.1 10.0.18362 diff --git a/eng/common/build.sh b/eng/common/build.sh index 6e395455f2..36f9aa0462 100755 --- a/eng/common/build.sh +++ b/eng/common/build.sh @@ -175,16 +175,6 @@ function Build { InitializeCustomToolset if [[ ! -z "$projects" ]]; then - # Split project paths by semi-colon, find full-paths using readlink, - # finally and splice back as a semi-colon separated list - IFS=';' read -r -a projs <<< "$projects" - len=${#projs[@]} - for ((i=0; i<$len; i++)); - do - projs[$i]=$(readlink -f "${projs[$i]}"); - done - projects=$(IFS=\; ; echo "${projs[*]}") - echo Updated projects: $projects properties="$properties /p:Projects=$projects" fi diff --git a/eng/common/performance/performance-setup.ps1 b/eng/common/performance/performance-setup.ps1 index 3c2adf8c73..e337669929 100644 --- a/eng/common/performance/performance-setup.ps1 +++ b/eng/common/performance/performance-setup.ps1 @@ -14,7 +14,7 @@ Param( [string] $Kind="micro", [switch] $Internal, [switch] $Compare, - [string] $Configurations="CompilationMode=$CompilationMode" + [string] $Configurations="CompilationMode=$CompilationMode RunKind=$Kind" ) $RunFromPerformanceRepo = ($Repository -eq "dotnet/performance") -or ($Repository -eq "dotnet-performance") @@ -50,7 +50,7 @@ if ($Internal) { } # FIX ME: This is a workaround until we get this from the actual pipeline -$CommonSetupArguments="--channel master --queue $Queue --build-number $BuildNumber --build-configs $Configurations" +$CommonSetupArguments="--channel master --queue $Queue --build-number $BuildNumber --build-configs $Configurations --architecture $Architecture" $SetupArguments = "--repository https://github.com/$Repository --branch $Branch --get-perf-hash --commit-sha $CommitSha $CommonSetupArguments" if ($RunFromPerformanceRepo) { diff --git a/eng/common/performance/performance-setup.sh b/eng/common/performance/performance-setup.sh index 604aebffca..94a04e0fe5 100644 --- a/eng/common/performance/performance-setup.sh +++ b/eng/common/performance/performance-setup.sh @@ -15,7 +15,7 @@ compare=false kind="micro" run_categories="Libraries Runtime" csproj="src\benchmarks\micro\MicroBenchmarks.csproj" -configurations= +configurations="CompliationMode=$compilation_mode RunKind=$kind" run_from_perf_repo=false use_core_run=true use_baseline_core_run=true @@ -164,7 +164,7 @@ if [[ "$internal" == true ]]; then fi fi -common_setup_arguments="--channel master --queue $queue --build-number $build_number --build-configs $configurations" +common_setup_arguments="--channel master --queue $queue --build-number $build_number --build-configs $configurations --architecture $architecture" setup_arguments="--repository https://github.com/$repository --branch $branch --get-perf-hash --commit-sha $commit_sha $common_setup_arguments" if [[ "$run_from_perf_repo" = true ]]; then diff --git a/eng/common/templates/post-build/channels/generic-internal-channel.yml b/eng/common/templates/post-build/channels/generic-internal-channel.yml index 29d8d46ee2..380122901d 100644 --- a/eng/common/templates/post-build/channels/generic-internal-channel.yml +++ b/eng/common/templates/post-build/channels/generic-internal-channel.yml @@ -46,7 +46,7 @@ stages: buildId: $(AzDOBuildId) downloadType: 'specific' itemPattern: | - PDBArtifacts/** + PdbArtifacts/** BlobArtifacts/** downloadPath: '$(Build.ArtifactStagingDirectory)' diff --git a/eng/common/templates/post-build/channels/generic-public-channel.yml b/eng/common/templates/post-build/channels/generic-public-channel.yml index 883e033c80..ae8c6349d4 100644 --- a/eng/common/templates/post-build/channels/generic-public-channel.yml +++ b/eng/common/templates/post-build/channels/generic-public-channel.yml @@ -46,7 +46,7 @@ stages: buildId: $(AzDOBuildId) downloadType: 'specific' itemPattern: | - PDBArtifacts/** + PdbArtifacts/** BlobArtifacts/** downloadPath: '$(Build.ArtifactStagingDirectory)' diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index d3a432878e..fef7e5a3fd 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -155,12 +155,12 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { # The following code block is protecting against concurrent access so that this function can # be called in parallel. if ($createSdkLocationFile) { - do { + do { $sdkCacheFileTemp = Join-Path $ToolsetDir $([System.IO.Path]::GetRandomFileName()) - } + } until (!(Test-Path $sdkCacheFileTemp)) Set-Content -Path $sdkCacheFileTemp -Value $dotnetRoot - + try { Rename-Item -Force -Path $sdkCacheFileTemp 'sdk.txt' } catch { @@ -188,7 +188,33 @@ function GetDotNetInstallScript([string] $dotnetRoot) { if (!(Test-Path $installScript)) { Create-Directory $dotnetRoot $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit - Invoke-WebRequest "https://dot.net/$dotnetInstallScriptVersion/dotnet-install.ps1" -OutFile $installScript + + $maxRetries = 5 + $retries = 1 + + $uri = "https://dot.net/$dotnetInstallScriptVersion/dotnet-install.ps1" + + while($true) { + try { + Write-Host "GET $uri" + Invoke-WebRequest $uri -OutFile $installScript + break + } + catch { + Write-Host "Failed to download '$uri'" + Write-Error $_.Exception.Message -ErrorAction Continue + } + + if (++$retries -le $maxRetries) { + $delayInSeconds = [math]::Pow(2, $retries) - 1 # Exponential backoff + Write-Host "Retrying. Waiting for $delayInSeconds seconds before next attempt ($retries of $maxRetries)." + Start-Sleep -Seconds $delayInSeconds + } + else { + throw "Unable to download file in $maxRetries attempts." + } + + } } return $installScript @@ -198,12 +224,12 @@ function InstallDotNetSdk([string] $dotnetRoot, [string] $version, [string] $arc InstallDotNet $dotnetRoot $version $architecture } -function InstallDotNet([string] $dotnetRoot, - [string] $version, - [string] $architecture = '', - [string] $runtime = '', - [bool] $skipNonVersionedFiles = $false, - [string] $runtimeSourceFeed = '', +function InstallDotNet([string] $dotnetRoot, + [string] $version, + [string] $architecture = '', + [string] $runtime = '', + [bool] $skipNonVersionedFiles = $false, + [string] $runtimeSourceFeed = '', [string] $runtimeSourceFeedKey = '') { $installScript = GetDotNetInstallScript $dotnetRoot @@ -298,7 +324,7 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = $vsMajorVersion = $vsMinVersion.Major $xcopyMSBuildVersion = "$vsMajorVersion.$($vsMinVersion.Minor).0-alpha" } - + $vsInstallDir = $null if ($xcopyMSBuildVersion.Trim() -ine "none") { $vsInstallDir = InitializeXCopyMSBuild $xcopyMSBuildVersion $install diff --git a/eng/common/tools.sh b/eng/common/tools.sh index e071af4ee4..c26525e52b 100644 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -41,7 +41,7 @@ fi # Configures warning treatment in msbuild. warn_as_error=${warn_as_error:-true} -# True to attempt using .NET Core already that meets requirements specified in global.json +# True to attempt using .NET Core already that meets requirements specified in global.json # installed on the machine instead of downloading one. use_installed_dotnet_cli=${use_installed_dotnet_cli:-true} @@ -172,7 +172,7 @@ function InstallDotNetSdk { function InstallDotNet { local root=$1 local version=$2 - + GetDotNetInstallScript "$root" local install_script=$_GetDotNetInstallScript @@ -218,6 +218,28 @@ function InstallDotNet { } } +function with_retries { + local maxRetries=5 + local retries=1 + echo "Trying to run '$@' for maximum of $maxRetries attempts." + while [[ $((retries++)) -le $maxRetries ]]; do + "$@" + + if [[ $? == 0 ]]; then + echo "Ran '$@' successfully." + return 0 + fi + + timeout=$((2**$retries-1)) + echo "Failed to execute '$@'. Waiting $timeout seconds before next attempt ($retries out of $maxRetries)." 1>&2 + sleep $timeout + done + + echo "Failed to execute '$@' for $maxRetries times." 1>&2 + + return 1 +} + function GetDotNetInstallScript { local root=$1 local install_script="$root/dotnet-install.sh" @@ -230,13 +252,13 @@ function GetDotNetInstallScript { # Use curl if available, otherwise use wget if command -v curl > /dev/null; then - curl "$install_script_url" -sSL --retry 10 --create-dirs -o "$install_script" || { + with_retries curl "$install_script_url" -isSLv --retry 10 --create-dirs -o "$install_script" || { local exit_code=$? Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to acquire dotnet install script (exit code '$exit_code')." ExitWithExitCode $exit_code } - else - wget -q -O "$install_script" "$install_script_url" || { + else + with_retries wget -v -O "$install_script" "$install_script_url" || { local exit_code=$? Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to acquire dotnet install script (exit code '$exit_code')." ExitWithExitCode $exit_code @@ -251,11 +273,11 @@ function InitializeBuildTool { if [[ -n "${_InitializeBuildTool:-}" ]]; then return fi - + InitializeDotNetCli $restore # return values - _InitializeBuildTool="$_InitializeDotNetCli/dotnet" + _InitializeBuildTool="$_InitializeDotNetCli/dotnet" _InitializeBuildToolCommand="msbuild" _InitializeBuildToolFramework="netcoreapp2.1" } @@ -319,7 +341,7 @@ function InitializeToolset { if [[ "$binary_log" == true ]]; then bl="/bl:$log_dir/ToolsetRestore.binlog" fi - + echo '' > "$proj" MSBuild-Core "$proj" $bl /t:__WriteToolsetLocation /clp:ErrorsOnly\;NoSummary /p:__ToolsetLocationOutputFile="$toolset_location_file" diff --git a/global.json b/global.json index 72dad80688..2e4001a6f9 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "dotnet": "3.0.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20101.2" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20109.1" } } From ec3b6c8ceaeb5c2e92d7b4d328cb88c855d3c499 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Mon, 10 Feb 2020 11:11:15 -0800 Subject: [PATCH 114/243] Do not clear the screen if returning error at launch (#815) --- .../CommandLine/Commands/CollectCommand.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs index fc7f6f50b7..dfbde502f6 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs @@ -43,11 +43,6 @@ private static async Task Collect(CancellationToken ct, IConsole console, i Debug.Assert(output != null); Debug.Assert(profile != null); - bool hasConsole = console.GetTerminal() != null; - - if (hasConsole) - Console.Clear(); - if (processId < 0) { Console.Error.WriteLine("Process ID should not be negative."); @@ -59,6 +54,11 @@ private static async Task Collect(CancellationToken ct, IConsole console, i return ErrorCodes.ArgumentError; } + bool hasConsole = console.GetTerminal() != null; + + if (hasConsole) + Console.Clear(); + if (profile.Length == 0 && providers.Length == 0 && clrevents.Length == 0) { Console.Out.WriteLine("No profile or providers specified, defaulting to trace profile 'cpu-sampling'"); From 58c760c3bdb346cd7e1451365433975d85d69b35 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2020 13:51:22 +0000 Subject: [PATCH 115/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200210.4 (#822) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.1.20110.4 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 616b409e92..2ff29052a9 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime a7f8cdc0de945561ae3fcaa72440c0ec56d69060 - + https://github.com/dotnet/aspnetcore - 4911c083389afd0ea1cc18f8600526c11c2418d6 + 568e73e69a1b086d08520fd80840d095a42bcd4f diff --git a/eng/Versions.props b/eng/Versions.props index bb9ad5702e..d8df365903 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20103.10 - 5.0.0-preview.1.20107.8 + 5.0.0-preview.1.20110.4 From 16217c02f6a5d7e475e39c6090fb20d0e5815f31 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Tue, 11 Feb 2020 17:42:15 -0800 Subject: [PATCH 116/243] Fix ps handler for elevated process (#749) --- src/Tools/Common/Commands/ProcessStatus.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Tools/Common/Commands/ProcessStatus.cs b/src/Tools/Common/Commands/ProcessStatus.cs index 34c3227b02..19ff7bec41 100644 --- a/src/Tools/Common/Commands/ProcessStatus.cs +++ b/src/Tools/Common/Commands/ProcessStatus.cs @@ -44,6 +44,10 @@ public static void PrintProcessStatus(IConsole console) { sb.Append($"{process.Id, 10} {process.ProcessName, -10} [Elevated process - cannot determine path]\n"); } + catch (NullReferenceException) + { + sb.Append($"{process.Id, 10} {process.ProcessName, -10} [Elevated process - cannot determine path]\n"); + } } console.Out.WriteLine(sb.ToString()); } From 92fa9c8e394c626cec244ad393b7f3426aad19b8 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Tue, 11 Feb 2020 17:51:31 -0800 Subject: [PATCH 117/243] Make diagnostics client library tests not sleep (#742) * Make the diagnostics client library tests not sleep * Remove thread.sleep * task.delay instead of thread.sleep * Fix failing test --- .../EventPipeSessionTests.cs | 2 +- .../GetPublishedProcessesTests.cs | 14 ++++++- .../TestRunner.cs | 40 +++++++++++++++---- 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs index 6344f47491..011e507be8 100644 --- a/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs @@ -55,7 +55,7 @@ public void BasicEventPipeSessionTest() public void EventPipeSessionStreamTest() { TestRunner runner = new TestRunner(CommonHelper.GetTraceePath(), output); - runner.Start(5000); + runner.Start(3000); DiagnosticsClient client = new DiagnosticsClient(runner.Pid); runner.PrintStatus(); output.WriteLine($"[{DateTime.Now.ToString()}] Trying to start an EventPipe session on process {runner.Pid}"); diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs index e2945f73a3..d108b64fac 100644 --- a/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs @@ -4,6 +4,8 @@ using System; using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Threading; using Xunit; using Xunit.Abstractions; @@ -27,6 +29,13 @@ public void PublishedProcessTest1() { TestRunner runner = new TestRunner(CommonHelper.GetTraceePath(), output); runner.Start(3000); + // On Windows, runner.Start will not wait for named pipe creation since for other tests, NamedPipeClientStream will + // just wait until the named pipe is created. + // For these tests, we need to sleep an arbitrary time before pipe is created. + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + Thread.Sleep(5000); + } List publishedProcesses = new List(DiagnosticsClient.GetPublishedProcesses()); foreach (int p in publishedProcesses) { @@ -48,7 +57,10 @@ public void MultiplePublishedProcessTest() runner[i].Start(); pids[i] = runner[i].Pid; } - System.Threading.Thread.Sleep(2000); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + Thread.Sleep(5000); + } List publishedProcesses = new List(DiagnosticsClient.GetPublishedProcesses()); foreach (int p in publishedProcesses) { diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/TestRunner.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/TestRunner.cs index 420bde839b..653d4d8bdb 100644 --- a/src/tests/Microsoft.Diagnostics.NETCore.Client/TestRunner.cs +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/TestRunner.cs @@ -2,17 +2,20 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. + +using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Diagnostics.TestHelpers; using System; using System.Collections.Generic; using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; using System.Threading; +using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; -using Microsoft.Diagnostics.TestHelpers; - -using Microsoft.Diagnostics.NETCore.Client; - namespace Microsoft.Diagnostics.NETCore.Client { public class TestRunner @@ -34,7 +37,7 @@ public void AddEnvVar(string key, string value) startInfo.EnvironmentVariables[key] = value; } - public void Start(int timeoutInMS=0) + public void Start(int timeoutInMS=15000) { if (outputHelper != null) outputHelper.WriteLine("$[{DateTime.Now.ToString()}] Launching test: " + startInfo.FileName); @@ -57,9 +60,30 @@ public void Start(int timeoutInMS=0) outputHelper.WriteLine($"Have total {testProcess.Modules.Count} modules loaded"); } - outputHelper.WriteLine($"[{DateTime.Now.ToString()}] Sleeping for {timeoutInMS} ms."); - Thread.Sleep(timeoutInMS); - outputHelper.WriteLine($"[{DateTime.Now.ToString()}] Done sleeping. Ready to test."); + // Block until we see the IPC channel created, or until timeout specified. + Task monitorSocketTask = Task.Run(() => + { + while (true) + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + // On Windows, namedpipe connection will block until the named pipe is ready to connect so no need to block here + break; + } + else + { + // On Linux, we wait until the socket is created. + var matchingFiles = Directory.GetFiles(Path.GetTempPath(), $"dotnet-diagnostic-{testProcess.Id}-*-socket"); // Try best match. + if (matchingFiles.Length > 0) + { + break; + } + } + Task.Delay(100); + } + }); + + monitorSocketTask.Wait(TimeSpan.FromMilliseconds(timeoutInMS)); } public void Stop() From 5a870484880ae8eaf4b9435eac7c986e8d8715e6 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Tue, 11 Feb 2020 17:52:00 -0800 Subject: [PATCH 118/243] Properly encode semicolon in argument strings for EventPipeProvider (#824) * Add quotation to semicolon in argument string for EventPipeProvider * Add test * remove dup * Wrap the entire argument string in quotes instead * Add more test --- .../DiagnosticsClient/EventPipeProvider.cs | 2 +- .../EventPipeProviderTests.cs | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeProvider.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeProvider.cs index 332ecd20a3..e3d00f4ee6 100644 --- a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeProvider.cs +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeProvider.cs @@ -69,7 +69,7 @@ internal string GetArgumentString() { return ""; } - return string.Join(";", Arguments.Select(a => $"{a.Key}={a.Value}")); + return string.Join(";", Arguments.Select(a => (a.Value.Contains(";") || a.Value.Contains("=")) ? $"{a.Key}=\"{a.Value}\"" : $"{a.Key}={a.Value}")); } } diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeProviderTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeProviderTests.cs index 5f66f28e32..46d216d3cb 100644 --- a/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeProviderTests.cs +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeProviderTests.cs @@ -109,5 +109,43 @@ public void ToStringTest2() Assert.Equal("MyProvider:0x00000000DEADBEEF:5:key1=value1", provider1.ToString()); Assert.Equal("MyProvider:0x00000000DEADBEEF:5:key1=value1;key2=value2", provider2.ToString()); } + + [Fact] + public void DiagnosticSourceArgumentStringTest1() + { + string diagnosticFilterString = "Microsoft.AspNetCore/Microsoft.AspNetCore.Hosting.HttpRequestIn.Start@Activity1Start:-" + + "Request.Path" + + ";Request.Method" + + "\r\n"; + + var provider = new EventPipeProvider("DiagnosticSourceProvider", EventLevel.Verbose, (long)(0xdeadbeef), + new Dictionary() + { + { "FilterAndPayloadSpecs", diagnosticFilterString } + }); + + Assert.Equal("DiagnosticSourceProvider:0x00000000DEADBEEF:5:FilterAndPayloadSpecs=\"Microsoft.AspNetCore/Microsoft.AspNetCore.Hosting.HttpRequestIn.Start@Activity1Start:-Request.Path;Request.Method\r\n\"", + provider.ToString()); + } + + + [Fact] + public void DiagnosticSourceArgumentStringTest2() + { + string diagnosticFilterString = "Microsoft.AspNetCore/Microsoft.AspNetCore.Hosting.HttpRequestIn.Start@Activity1Start:-" + + "Request.Path" + + ";Request.Method" + + ";RequestName=SomeRequest" + + "\r\n"; + + var provider = new EventPipeProvider("DiagnosticSourceProvider", EventLevel.Verbose, (long)(0xdeadbeef), + new Dictionary() + { + { "FilterAndPayloadSpecs", diagnosticFilterString } + }); + + Assert.Equal("DiagnosticSourceProvider:0x00000000DEADBEEF:5:FilterAndPayloadSpecs=\"Microsoft.AspNetCore/Microsoft.AspNetCore.Hosting.HttpRequestIn.Start@Activity1Start:-Request.Path;Request.Method;RequestName=SomeRequest\r\n\"", + provider.ToString()); + } } } From 37df898f774bed9f370796d852a025e1766d7832 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2020 13:51:40 +0000 Subject: [PATCH 119/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200211.6 (#828) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.1.20111.6 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2ff29052a9..6fc97a1e5a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime a7f8cdc0de945561ae3fcaa72440c0ec56d69060 - + https://github.com/dotnet/aspnetcore - 568e73e69a1b086d08520fd80840d095a42bcd4f + 1bd2b5f19e7f6366ad5414d6cf19b538c9fb2b31 diff --git a/eng/Versions.props b/eng/Versions.props index d8df365903..c59a937164 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20103.10 - 5.0.0-preview.1.20110.4 + 5.0.0-preview.1.20111.6 From dc180b2bbcded065d66c9f9c9930e325d7beb34d Mon Sep 17 00:00:00 2001 From: Ilia Date: Wed, 12 Feb 2020 21:58:30 +0300 Subject: [PATCH 120/243] Try to get UnixDomainSocketEndPoint from System.Core if not found in System.Net.Sockets (#826) Fixes #821 --- .../DiagnosticsIpc/IpcClient.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs index 079699c16a..dd1105fb61 100644 --- a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs @@ -9,6 +9,7 @@ using System.Linq; using System.Net; using System.Net.Sockets; +using System.Reflection; using System.Runtime.InteropServices; using System.Security.Principal; @@ -127,7 +128,8 @@ private static EndPoint CreateUnixDomainSocketEndPoint(string path) return new UnixDomainSocketEndPoint(path); #elif NETSTANDARD2_0 // UnixDomainSocketEndPoint is not part of .NET Standard 2.0 - var type = typeof(Socket).Assembly.GetType("System.Net.Sockets.UnixDomainSocketEndPoint"); + var type = typeof(Socket).Assembly.GetType("System.Net.Sockets.UnixDomainSocketEndPoint") + ?? Assembly.Load("System.Core").GetType("System.Net.Sockets.UnixDomainSocketEndPoint"); if (type == null) { throw new PlatformNotSupportedException("Current process is not running a compatible .NET Core runtime."); From e1d58b65fec0a207833d27488397324cd6e3bf43 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Wed, 12 Feb 2020 15:10:13 -0800 Subject: [PATCH 121/243] Escape EventPipeProvider argument key as well (#825) * Escape EventPipeProvider argument key as well * put the brace where it was --- .../DiagnosticsClient/EventPipeProvider.cs | 8 +++- .../EventPipeProviderTests.cs | 43 ++++++++++++++++++- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeProvider.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeProvider.cs index e3d00f4ee6..53f8591245 100644 --- a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeProvider.cs +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeProvider.cs @@ -69,8 +69,12 @@ internal string GetArgumentString() { return ""; } - return string.Join(";", Arguments.Select(a => (a.Value.Contains(";") || a.Value.Contains("=")) ? $"{a.Key}=\"{a.Value}\"" : $"{a.Key}={a.Value}")); + return string.Join(";", Arguments.Select(a => { + var escapedKey = a.Key.Contains(";") || a.Key.Contains("=") ? $"\"{a.Key}\"" : a.Key; + var escapedValue = a.Value.Contains(";") || a.Value.Contains("=") ? $"\"{a.Value}\"" : a.Value; + return $"{escapedKey}={escapedValue}"; + })); } } -} \ No newline at end of file +} diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeProviderTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeProviderTests.cs index 46d216d3cb..31f87b34a5 100644 --- a/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeProviderTests.cs +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeProviderTests.cs @@ -111,7 +111,7 @@ public void ToStringTest2() } [Fact] - public void DiagnosticSourceArgumentStringTest1() + public void DiagnosticSourceArgumentStringTestWithEscapedValue1() { string diagnosticFilterString = "Microsoft.AspNetCore/Microsoft.AspNetCore.Hosting.HttpRequestIn.Start@Activity1Start:-" + "Request.Path" + @@ -130,7 +130,7 @@ public void DiagnosticSourceArgumentStringTest1() [Fact] - public void DiagnosticSourceArgumentStringTest2() + public void DiagnosticSourceArgumentStringTestWithEscapedValue2() { string diagnosticFilterString = "Microsoft.AspNetCore/Microsoft.AspNetCore.Hosting.HttpRequestIn.Start@Activity1Start:-" + "Request.Path" + @@ -147,5 +147,44 @@ public void DiagnosticSourceArgumentStringTest2() Assert.Equal("DiagnosticSourceProvider:0x00000000DEADBEEF:5:FilterAndPayloadSpecs=\"Microsoft.AspNetCore/Microsoft.AspNetCore.Hosting.HttpRequestIn.Start@Activity1Start:-Request.Path;Request.Method;RequestName=SomeRequest\r\n\"", provider.ToString()); } + + [Fact] + public void DiagnosticSourceArgumentStringTestWithEscapedKey() + { + string diagnosticFilterString = "Microsoft.AspNetCore/Microsoft.AspNetCore.Hosting.HttpRequestIn.Start@Activity1Start:-" + + "Request.Path" + + ";Request.Method" + + ";RequestName=SomeRequest" + + "\r\n"; + + var provider = new EventPipeProvider("DiagnosticSourceProvider", EventLevel.Verbose, (long)(0xdeadbeef), + new Dictionary() + { + { "ArgumentKeyWith;Semicolon=Equal", diagnosticFilterString } + }); + + Assert.Equal("DiagnosticSourceProvider:0x00000000DEADBEEF:5:\"ArgumentKeyWith;Semicolon=Equal\"=\"Microsoft.AspNetCore/Microsoft.AspNetCore.Hosting.HttpRequestIn.Start@Activity1Start:-Request.Path;Request.Method;RequestName=SomeRequest\r\n\"", + provider.ToString()); + } + + [Fact] + public void DiagnosticSourceArgumentStringTestWithManyArgs() + { + string diagnosticFilterString = "Microsoft.AspNetCore/Microsoft.AspNetCore.Hosting.HttpRequestIn.Start@Activity1Start:-" + + "Request.Path" + + ";Request.Method" + + ";RequestName=SomeRequest" + + "\r\n"; + + var provider = new EventPipeProvider("DiagnosticSourceProvider", EventLevel.Verbose, (long)(0xdeadbeef), + new Dictionary() + { + { "ArgumentKeyWith;Semicolon=Equal", diagnosticFilterString }, + { "ArgumentKeyWith;Semicolon=Equal2", diagnosticFilterString } + }); + + Assert.Equal("DiagnosticSourceProvider:0x00000000DEADBEEF:5:\"ArgumentKeyWith;Semicolon=Equal\"=\"Microsoft.AspNetCore/Microsoft.AspNetCore.Hosting.HttpRequestIn.Start@Activity1Start:-Request.Path;Request.Method;RequestName=SomeRequest\r\n\";\"ArgumentKeyWith;Semicolon=Equal2\"=\"Microsoft.AspNetCore/Microsoft.AspNetCore.Hosting.HttpRequestIn.Start@Activity1Start:-Request.Path;Request.Method;RequestName=SomeRequest\r\n\"", + provider.ToString()); + } } } From 5f72e31cf991d95f653470e5a5f52aeca6a84ef1 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2020 14:08:37 +0000 Subject: [PATCH 122/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200212.5 (#830) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.1.20112.5 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6fc97a1e5a..0e2df49bdf 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime a7f8cdc0de945561ae3fcaa72440c0ec56d69060 - + https://github.com/dotnet/aspnetcore - 1bd2b5f19e7f6366ad5414d6cf19b538c9fb2b31 + ccf3c4e6b8574f5e432d6c18efbb5caf5d2dbef2 diff --git a/eng/Versions.props b/eng/Versions.props index c59a937164..0a90e1834f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20103.10 - 5.0.0-preview.1.20111.6 + 5.0.0-preview.1.20112.5 From 32e66a6c6c124b1348a74c324b6eb39143f6816b Mon Sep 17 00:00:00 2001 From: Ilia Date: Thu, 13 Feb 2020 22:14:30 +0300 Subject: [PATCH 123/243] Get UnixDomainSocketEndPoint using Type.GetType() to avoid FileNotFoundException (#829) Fixes #821 --- .../DiagnosticsIpc/IpcClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs index dd1105fb61..0d3d116e28 100644 --- a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs @@ -129,7 +129,7 @@ private static EndPoint CreateUnixDomainSocketEndPoint(string path) #elif NETSTANDARD2_0 // UnixDomainSocketEndPoint is not part of .NET Standard 2.0 var type = typeof(Socket).Assembly.GetType("System.Net.Sockets.UnixDomainSocketEndPoint") - ?? Assembly.Load("System.Core").GetType("System.Net.Sockets.UnixDomainSocketEndPoint"); + ?? Type.GetType("System.Net.Sockets.UnixDomainSocketEndPoint, System.Core"); if (type == null) { throw new PlatformNotSupportedException("Current process is not running a compatible .NET Core runtime."); From b16254d5121dd30e5a6140406bb823fb41bd1807 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2020 13:49:27 +0000 Subject: [PATCH 124/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200213.23 (#831) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.1.20113.23 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 0e2df49bdf..4d79c944a7 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime a7f8cdc0de945561ae3fcaa72440c0ec56d69060 - + https://github.com/dotnet/aspnetcore - ccf3c4e6b8574f5e432d6c18efbb5caf5d2dbef2 + 62ae8a9271b747e82a6e79b5f09f62a57843ef28 diff --git a/eng/Versions.props b/eng/Versions.props index 0a90e1834f..ad56c1b5de 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20103.10 - 5.0.0-preview.1.20112.5 + 5.0.0-preview.1.20113.23 From d97b210cbe74b66a05ad15738e8117fb6b52656a Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 15 Feb 2020 13:46:11 +0000 Subject: [PATCH 125/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200214.15 (#833) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.1.20114.15 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4d79c944a7..1734df2104 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime a7f8cdc0de945561ae3fcaa72440c0ec56d69060 - + https://github.com/dotnet/aspnetcore - 62ae8a9271b747e82a6e79b5f09f62a57843ef28 + 47a7fe9bea6092721e7122303b2f93e1471c3d15 diff --git a/eng/Versions.props b/eng/Versions.props index ad56c1b5de..1ad68716f2 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-alpha.1.20103.10 - 5.0.0-preview.1.20113.23 + 5.0.0-preview.1.20114.15 From 7368bb1c45c8fb42807d3f5315382d1ea4ea1e90 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sun, 16 Feb 2020 17:41:31 +0000 Subject: [PATCH 126/243] [master] Update dependencies from dotnet/runtime (#827) * Update dependencies from https://github.com/dotnet/runtime build 20200212.1 - Microsoft.NETCore.App - 5.0.0-alpha.1.20112.1 * Update dependencies from https://github.com/dotnet/runtime build 20200212.12 - Microsoft.NETCore.App - 5.0.0-preview.1.20112.12 * Update dependencies from https://github.com/dotnet/runtime build 20200213.7 - Microsoft.NETCore.App - 5.0.0-preview.1.20113.7 * Update dependencies from https://github.com/dotnet/runtime build 20200214.8 - Microsoft.NETCore.App - 5.0.0-preview.1.20114.8 * Update dependencies from https://github.com/dotnet/runtime build 20200215.9 - Microsoft.NETCore.App - 5.0.0-preview.1.20115.9 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1734df2104..e127808851 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade b0e8d3944155f94f83deea8afe025debe369e69f - + https://github.com/dotnet/runtime - a7f8cdc0de945561ae3fcaa72440c0ec56d69060 + 24967d0491595e7ab069acbf3e52110462202ac8 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 1ad68716f2..9be6f94294 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-alpha.1.20103.10 + 5.0.0-preview.1.20115.9 5.0.0-preview.1.20114.15 From 6de5274bd29c3ab47b0014db2c62889ad394f25c Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2020 13:31:12 +0000 Subject: [PATCH 127/243] Update dependencies from https://github.com/dotnet/arcade build 20200216.1 (#834) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.20116.1 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.20116.1 --- eng/Version.Details.xml | 8 ++-- eng/Versions.props | 2 +- eng/common/cross/toolchain.cmake | 12 ++++- eng/common/post-build/darc-gather-drop.ps1 | 44 ------------------- eng/common/post-build/nuget-validation.ps1 | 2 +- .../templates/post-build/darc-gather-drop.yml | 23 ---------- .../templates/post-build/post-build.yml | 26 +++++++++++ eng/common/tools.ps1 | 7 ++- eng/common/tools.sh | 2 +- global.json | 2 +- 10 files changed, 51 insertions(+), 77 deletions(-) delete mode 100644 eng/common/post-build/darc-gather-drop.ps1 delete mode 100644 eng/common/templates/post-build/darc-gather-drop.yml diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e127808851..28b02dea73 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,15 +4,15 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - b0e8d3944155f94f83deea8afe025debe369e69f + 2086e534f12e6116889ee480646ef54c1f781887 - + https://github.com/dotnet/arcade - b0e8d3944155f94f83deea8afe025debe369e69f + 2086e534f12e6116889ee480646ef54c1f781887 https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 9be6f94294..07eb8f9ed0 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -40,7 +40,7 @@ 4.5.3 2.4.1 2.0.3 - 5.0.0-beta.20109.1 + 5.0.0-beta.20116.1 10.0.18362 diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake index 0eea7d1df3..556da2e135 100644 --- a/eng/common/cross/toolchain.cmake +++ b/eng/common/cross/toolchain.cmake @@ -71,7 +71,17 @@ endif() if(TARGET_ARCH_NAME MATCHES "^(arm|armel)$") add_compile_options(-mthumb) - add_compile_options(-mfpu=vfpv3) + if (NOT DEFINED CLR_ARM_FPU_TYPE) + set (CLR_ARM_FPU_TYPE vfpv3) + endif (NOT DEFINED CLR_ARM_FPU_TYPE) + + add_compile_options (-mfpu=${CLR_ARM_FPU_TYPE}) + if (NOT DEFINED CLR_ARM_FPU_CAPABILITY) + set (CLR_ARM_FPU_CAPABILITY 0x7) + endif (NOT DEFINED CLR_ARM_FPU_CAPABILITY) + + add_definitions (-DCLR_ARM_FPU_CAPABILITY=${CLR_ARM_FPU_CAPABILITY}) + if(TARGET_ARCH_NAME STREQUAL "armel") add_compile_options(-mfloat-abi=softfp) if(DEFINED TIZEN_TOOLCHAIN) diff --git a/eng/common/post-build/darc-gather-drop.ps1 b/eng/common/post-build/darc-gather-drop.ps1 deleted file mode 100644 index 81ff2a4377..0000000000 --- a/eng/common/post-build/darc-gather-drop.ps1 +++ /dev/null @@ -1,44 +0,0 @@ -param( - [Parameter(Mandatory=$true)][int] $BarBuildId, # ID of the build which assets should be downloaded - [Parameter(Mandatory=$true)][string] $DropLocation, # Where the assets should be downloaded to - [Parameter(Mandatory=$true)][string] $MaestroApiAccessToken, # Token used to access Maestro API - [Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro-prod.westus2.cloudapp.azure.com', # Maestro API URL - [Parameter(Mandatory=$false)][string] $MaestroApiVersion = '2019-01-16' # Version of Maestro API to use -) - -try { - . $PSScriptRoot\post-build-utils.ps1 - - Write-Host 'Installing DARC ...' - - . $PSScriptRoot\..\darc-init.ps1 - $exitCode = $LASTEXITCODE - - if ($exitCode -ne 0) { - Write-PipelineTelemetryError -Category "Darc" -Message "Something failed while running 'darc-init.ps1'. Check for errors above. Exiting now..." - ExitWithExitCode $exitCode - } - - # For now, only use a dry run. - # Ideally we would change darc to enable a quick request that - # would check whether the file exists that you can download it, - # and that it won't conflict with other files. - # https://github.com/dotnet/arcade/issues/3674 - # Right now we can't remove continue-on-error because we ocassionally will have - # dependencies that have no associated builds (e.g. an old dependency). - # We need to add an option to baseline specific dependencies away, or add them manually - # to the BAR. - darc gather-drop --non-shipping ` - --dry-run ` - --continue-on-error ` - --id $BarBuildId ` - --output-dir $DropLocation ` - --bar-uri $MaestroApiEndpoint ` - --password $MaestroApiAccessToken ` - --latest-location -} -catch { - Write-Host $_.ScriptStackTrace - Write-PipelineTelemetryError -Category "Darc" -Message $_ - ExitWithExitCode 1 -} diff --git a/eng/common/post-build/nuget-validation.ps1 b/eng/common/post-build/nuget-validation.ps1 index 3d6129d72b..dab3534ab5 100644 --- a/eng/common/post-build/nuget-validation.ps1 +++ b/eng/common/post-build/nuget-validation.ps1 @@ -9,7 +9,7 @@ param( try { . $PSScriptRoot\post-build-utils.ps1 - $url = 'https://raw.githubusercontent.com/NuGet/NuGetGallery/jver-verify/src/VerifyMicrosoftPackage/verify.ps1' + $url = 'https://raw.githubusercontent.com/NuGet/NuGetGallery/3e25ad135146676bcab0050a516939d9958bfa5d/src/VerifyMicrosoftPackage/verify.ps1' New-Item -ItemType 'directory' -Path ${ToolDestinationPath} -Force diff --git a/eng/common/templates/post-build/darc-gather-drop.yml b/eng/common/templates/post-build/darc-gather-drop.yml deleted file mode 100644 index 3268ccaa55..0000000000 --- a/eng/common/templates/post-build/darc-gather-drop.yml +++ /dev/null @@ -1,23 +0,0 @@ -parameters: - ChannelId: 0 - -jobs: -- job: gatherDrop - displayName: Gather Drop - dependsOn: setupMaestroVars - condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.ChannelId }})) - variables: - - name: BARBuildId - value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ] - pool: - vmImage: 'windows-2019' - steps: - - task: PowerShell@2 - displayName: Darc gather-drop - inputs: - filePath: $(Build.SourcesDirectory)/eng/common/post-build/darc-gather-drop.ps1 - arguments: -BarBuildId $(BARBuildId) - -DropLocation $(Agent.BuildDirectory)/Temp/Drop/ - -MaestroApiAccessToken $(MaestroApiAccessToken) - -MaestroApiEndPoint $(MaestroApiEndPoint) - -MaestroApiVersion $(MaestroApiVersion) diff --git a/eng/common/templates/post-build/post-build.yml b/eng/common/templates/post-build/post-build.yml index 70cb65f50b..eff0d9ac79 100644 --- a/eng/common/templates/post-build/post-build.yml +++ b/eng/common/templates/post-build/post-build.yml @@ -170,6 +170,32 @@ stages: shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json' +- template: \eng\common\templates\post-build\channels\generic-public-channel.yml + parameters: + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + dependsOn: ${{ parameters.publishDependsOn }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + stageName: 'Net5_Preview1_Publish' + channelName: '.NET 5 Preview 1' + channelId: 737 + transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json' + shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json' + symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json' + +- template: \eng\common\templates\post-build\channels\generic-public-channel.yml + parameters: + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + dependsOn: ${{ parameters.publishDependsOn }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + stageName: 'Net5_Preview2_Publish' + channelName: '.NET 5 Preview 2' + channelId: 738 + transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json' + shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json' + symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json' + - template: \eng\common\templates\post-build\channels\generic-public-channel.yml parameters: artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index fef7e5a3fd..a45302b377 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -399,7 +399,12 @@ function LocateVisualStudio([object]$vsRequirements = $null){ if (!(Test-Path $vsWhereExe)) { Create-Directory $vsWhereDir Write-Host 'Downloading vswhere' - Invoke-WebRequest "https://github.com/Microsoft/vswhere/releases/download/$vswhereVersion/vswhere.exe" -OutFile $vswhereExe + try { + Invoke-WebRequest "https://netcorenativeassets.blob.core.windows.net/resource-packages/external/windows/vswhere/$vswhereVersion/vswhere.exe" -OutFile $vswhereExe + } + catch { + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message $_ + } } if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs } diff --git a/eng/common/tools.sh b/eng/common/tools.sh index c26525e52b..664ac1055b 100644 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -252,7 +252,7 @@ function GetDotNetInstallScript { # Use curl if available, otherwise use wget if command -v curl > /dev/null; then - with_retries curl "$install_script_url" -isSLv --retry 10 --create-dirs -o "$install_script" || { + with_retries curl "$install_script_url" -sSL --retry 10 --create-dirs -o "$install_script" || { local exit_code=$? Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to acquire dotnet install script (exit code '$exit_code')." ExitWithExitCode $exit_code diff --git a/global.json b/global.json index 2e4001a6f9..8e1fc8cf1a 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "dotnet": "3.0.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20109.1" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20116.1" } } From f8442db780d900713c2e29d7f2143f2860ee3df5 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2020 13:45:05 +0000 Subject: [PATCH 128/243] Update dependencies from https://github.com/dotnet/runtime build 20200217.2 (#835) - Microsoft.NETCore.App - 5.0.0-preview.1.20117.2 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 28b02dea73..09e5de6ffe 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 2086e534f12e6116889ee480646ef54c1f781887 - + https://github.com/dotnet/runtime - 24967d0491595e7ab069acbf3e52110462202ac8 + 76b4d64bd6510921fee46dbb7f2fd5613ab71e35 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 07eb8f9ed0..afbd54c7b6 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.1.20115.9 + 5.0.0-preview.1.20117.2 5.0.0-preview.1.20114.15 From dbf02bc1d2d89471a4fe90255e9eeba3c6a3a39f Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2020 13:46:30 +0000 Subject: [PATCH 129/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200216.1 (#836) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.1.20116.1 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 09e5de6ffe..72d43eaede 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime 76b4d64bd6510921fee46dbb7f2fd5613ab71e35 - + https://github.com/dotnet/aspnetcore - 47a7fe9bea6092721e7122303b2f93e1471c3d15 + 2a521681156cfd8b297572a7fb19e96812c92d7b diff --git a/eng/Versions.props b/eng/Versions.props index afbd54c7b6..6f87cf39e7 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-preview.1.20117.2 - 5.0.0-preview.1.20114.15 + 5.0.0-preview.1.20116.1 From fd5a03a9a257bcf431658f1dbfc1f7ccd8546721 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 18 Feb 2020 13:44:39 +0000 Subject: [PATCH 130/243] Update dependencies from https://github.com/dotnet/runtime build 20200217.8 (#838) - Microsoft.NETCore.App - 5.0.0-preview.1.20117.8 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 72d43eaede..749f74e35e 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 2086e534f12e6116889ee480646ef54c1f781887 - + https://github.com/dotnet/runtime - 76b4d64bd6510921fee46dbb7f2fd5613ab71e35 + 4225fd10fef47bbcd859f7e4134a7500108dc9b6 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 6f87cf39e7..7e2ad2dabb 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.1.20117.2 + 5.0.0-preview.1.20117.8 5.0.0-preview.1.20116.1 From 794d05664985c3441a3eafaf12bbbf3cb338e9a2 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 19 Feb 2020 13:51:29 +0000 Subject: [PATCH 131/243] Update dependencies from https://github.com/dotnet/runtime build 20200218.7 (#840) - Microsoft.NETCore.App - 5.0.0-preview.1.20118.7 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 749f74e35e..3fc0537766 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 2086e534f12e6116889ee480646ef54c1f781887 - + https://github.com/dotnet/runtime - 4225fd10fef47bbcd859f7e4134a7500108dc9b6 + b49ab01db607606ddb2741615e7c06131847cbf8 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 7e2ad2dabb..589ff2f726 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.1.20117.8 + 5.0.0-preview.1.20118.7 5.0.0-preview.1.20116.1 From 2792e7f5704c9bc7d5a89c644f4533a897bd7d5f Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 19 Feb 2020 13:52:56 +0000 Subject: [PATCH 132/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200218.8 (#841) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.1.20118.8 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 3fc0537766..2726f87b0d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime b49ab01db607606ddb2741615e7c06131847cbf8 - + https://github.com/dotnet/aspnetcore - 2a521681156cfd8b297572a7fb19e96812c92d7b + 853d8f02e76a4beede6f6f883f96703943cfb38a diff --git a/eng/Versions.props b/eng/Versions.props index 589ff2f726..e2b85dd775 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-preview.1.20118.7 - 5.0.0-preview.1.20116.1 + 5.0.0-preview.1.20118.8 From 8d3d296e143934708d5531617f8ed4175b252a4a Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 20 Feb 2020 13:52:35 +0000 Subject: [PATCH 133/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200219.7 (#843) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.1.20119.7 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2726f87b0d..1d9a801aed 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime b49ab01db607606ddb2741615e7c06131847cbf8 - + https://github.com/dotnet/aspnetcore - 853d8f02e76a4beede6f6f883f96703943cfb38a + 1e4438647c834c3ffa9474d04b48d4a72c3e8978 diff --git a/eng/Versions.props b/eng/Versions.props index e2b85dd775..b583022603 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-preview.1.20118.7 - 5.0.0-preview.1.20118.8 + 5.0.0-preview.1.20119.7 From d9e528feef7ef1e57fccd4651b9335c8ec8ff563 Mon Sep 17 00:00:00 2001 From: Mohammad Mustakim Ali Date: Fri, 7 Feb 2020 23:28:42 +0000 Subject: [PATCH 134/243] dotnet-gcdump: Update docs to include print verb --- documentation/design-docs/dotnet-tools.md | 31 +++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/documentation/design-docs/dotnet-tools.md b/documentation/design-docs/dotnet-tools.md index 6b6eb1f1ac..b47dafcd60 100644 --- a/documentation/design-docs/dotnet-tools.md +++ b/documentation/design-docs/dotnet-tools.md @@ -632,6 +632,7 @@ OPTIONS COMMANDS collect Capture dumps from a process + print Prints a previously collected gcdump into the stdout COLLECT @@ -656,6 +657,9 @@ COLLECT -v, --verbose Turns on logging for gcdump + --std-out + Also writes plaintext results into stdout. + Examples: $ dotnet gcdump collect --process-id 1902 @@ -663,6 +667,33 @@ Examples: Wrote 12576 bytes to file Complete +PRINT + + dotnet-gcdump print -f|--file + + Prints a previously collected gcdump into the stdout + + Usage: + dotnet-gcdump print [options] + + Options: + -f, --file The file to read gcdump from. + +Examples: + + $ dotnet gcdump print -f 20200207_094403_19847.gcdump | head -10 + 1,335,288 (Dump size) + 299,845 (Total allocations) + + 55,898 System.String (Bytes > 10K) [System.Private.CoreLib.dll] + 32,664 System.Object[] (Bytes > 10K) [System.Private.CoreLib.dll] + 31,128 System.Int32[] (Bytes > 10K) [System.Private.CoreLib.dll] + 13,816 Entry[] (Bytes > 10K) [System.Private.CoreLib.dll] + 10,368 Entry[] (Bytes > 10K) [System.Private.CoreLib.dll] + 8,960 Node[] (Bytes > 1K) [System.Collections.Concurrent.dll] + 8,216 System.Char[] (Bytes > 1K) [System.Private.CoreLib.dll] + + ## Future suggestions Work described in here captures potential future directions these tools could take given time and customer interest. Some of these might come relatively soon, others feel quite speculative or duplicative with existing technology. Regardless, understanding potential future options helps to ensure that we don't unknowingly paint ourselves into a corner or build an incoherent offering. From d792a1b38f5cd0283ff55f2dd4143d3a09ea50e0 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2020 13:45:42 +0000 Subject: [PATCH 135/243] [master] Update dependencies from dotnet/runtime (#842) * Update dependencies from https://github.com/dotnet/runtime build 20200219.9 - Microsoft.NETCore.App - 5.0.0-preview.2.20119.9 * Update dependencies from https://github.com/dotnet/runtime build 20200220.8 - Microsoft.NETCore.App - 5.0.0-preview.2.20120.8 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1d9a801aed..626771bb5b 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 2086e534f12e6116889ee480646ef54c1f781887 - + https://github.com/dotnet/runtime - b49ab01db607606ddb2741615e7c06131847cbf8 + cfac865f9d44a443843d7dfc660a497f7d5bdf5a https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index b583022603..7091139f71 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.1.20118.7 + 5.0.0-preview.2.20120.8 5.0.0-preview.1.20119.7 From 72b2eb11e5878927aee7282c46f4dfda0b11b7e9 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 22 Feb 2020 13:42:26 +0000 Subject: [PATCH 136/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200221.13 (#850) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.2.20121.13 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 626771bb5b..8e2fb4f2b9 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime cfac865f9d44a443843d7dfc660a497f7d5bdf5a - + https://github.com/dotnet/aspnetcore - 1e4438647c834c3ffa9474d04b48d4a72c3e8978 + 5a0526dfd991419d5bce0d8ea525b50df2e37b04 diff --git a/eng/Versions.props b/eng/Versions.props index 7091139f71..17a1f3b9b8 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-preview.2.20120.8 - 5.0.0-preview.1.20119.7 + 5.0.0-preview.2.20121.13 From e800f94144f269caee37a870f81469ba67cb572b Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Sat, 22 Feb 2020 22:13:18 -0800 Subject: [PATCH 137/243] Microsoft.Diagnostics.NETCore.Client Documentation (#845) * some docs * More API descriptions * fix broken links * More link * link * cleanup * pr feedback * PR feedback --- ...diagnostics-client-library-instructions.md | 490 ++++++++++++++++++ 1 file changed, 490 insertions(+) create mode 100644 documentation/diagnostics-client-library-instructions.md diff --git a/documentation/diagnostics-client-library-instructions.md b/documentation/diagnostics-client-library-instructions.md new file mode 100644 index 0000000000..baeee40a5c --- /dev/null +++ b/documentation/diagnostics-client-library-instructions.md @@ -0,0 +1,490 @@ +# Microsoft.Diagnostics.NETCore.Client API Documentation + +## Intro +Microsoft.Diagnostics.NETCore.Client (also known as the Diagnostics Client library) is a managed library that lets you interact with .NET Core runtime (CoreCLR) for various diagnostics related tasks, such as tracing, requesting a dump, or attaching an ICorProfiler. Using this library, you can write your own diagnostics tools customized for your particular scenario. + +## Installing +Microsoft.Diagnostics.NETCore.Client is available on [NuGet](https://www.nuget.org/packages/Microsoft.Diagnostics.NETCore.Client/). + + +## Sample Code: + +Here are some sample code showing the usage of this library. + +#### 1. Attaching to a process and dumping out all the runtime GC events in real time to the console +This sample shows an example where we trigger an EventPipe session with the .NET runtime provider with the GC keyword at informational level, and use `EventPipeEventSource` (provided by the [TraceEvent library](https://www.nuget.org/packages/Microsoft.Diagnostics.Tracing.TraceEvent/)) to parse the events coming in and print the name of each event to the console in real time. + +```cs +using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Diagnostics.Tracing.Parsers; + +public void PrintRuntimeGCEvents(int processId) +{ + var providers = new List() + { + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", + EventLevel.Informational, (long)ClrTraceEventParser.Keywords.GC) + }; + + var client = new DiagnosticsClient(processId); + using (var session = client.StartEventPipeSession(providers, false)) + { + var source = new EventPipeEventSource(session.EventStream); + + source.Clr.All += (TraceEvent obj) => { + Console.WriteLine(obj.EventName); + } + try + { + source.Process(); + } + // NOTE: This exception does not currently exist. It is something that needs to be added to TraceEvent. + catch (EventStreamException e) + { + Console.WriteLine("Error encountered while processing events"); + Console.WriteLine(e.ToString()); + } + } +} +``` + +#### 2. Write a core dump. +This sample shows how to trigger a dump using `DiagnosticsClient`. +```cs +using Microsoft.Diagnostics.NETCore.Client; + +public void TriggerCoreDump(int processId) +{ + var client = new DiagnosticsClient(processId); + client.WriteDump(DumpType.Normal); +} +``` + +#### 3. Trigger a core dump when CPU usage goes above a certain threshold +This sample shows an example where we monitor the `cpu-usage` counter published by the .NET runtime and use the `WriteDump` API to write out a dump when the CPU usage grows beyond a certain threshold. +```cs + +using Microsoft.Diagnostics.NETCore.Client; + +public void TriggerDumpOnCpuUsage(int processId, int threshold) +{ + var providers = new List() + { + new EventPipeProvider( + "System.Runtime", + EventLevel.Informational, + (long)ClrTraceEventParser.Keywords.None, + new Dictionary() { + { "EventCounterIntervalSec", "1" } + } + ) + }; + var client = new DiagnosticsClient(processId); + using(var session = client.StartEventPipeSession(providers)) + { + var source = new EventPipeEventSource(session.EventStream); + source.Dynamic.All += (TraceEvent obj) => + { + if (obj.EventName.Equals("EventCounters")) + { + // I know this part is ugly. But this is all TraceEvent. + var payloadFields = (IDictionary)(obj.GetPayloadValueByName("Payload")); + if (payloadFields["Name"].ToString().Equals("cpu-usage")) + { + double cpuUsage = Double.Parse(payloadFields["Mean"]); + if (cpuUsage > (double)threshold) + { + client.WriteDump(DumpType.Normal, "/tmp/minidump.dmp"); + } + } + } + } + try + { + source.Process(); + } + catch (EventStreamException) {} + + } + } +} +``` + +#### 4. Trigger a CPU trace for given number of seconds +This sample shows an example where we trigger an EventPipe session for certain period of time, with the default CLR trace keyword as well as the sample profiler, and read from the stream that gets created as a result and write the bytes out to a file. Essentially this is what `dotnet-trace` uses internally to write a trace file. + +```cs + +using Microsoft.Diagnostics.NETCore.Client; +using System.Diagnostics; +using System.IO; +using System.Threading.Task; + +public void TraceProcessForDuration(int processId, int duration, string traceName) +{ + var cpuProviders = new List() + { + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Informational, (long)ClrTraceEventParser.Keywords.Default), + new EventPipeProvider("Microsoft-DotNETCore-SampleProfiler", EventLevel.Informational, (long)ClrTraceEventParser.Keywords.None) + }; + var client = new DiagnosticsClient(processId); + using (var traceSession = client.StartEventPipeSession(cpuProviders)) + { + Task copyTask = Task.Run(async () => + { + using (FileStream fs = new FileStream(traceName, FileMode.Create, FileAccess.Write)) + { + await traceSession.EventStream.CopyToAsync(fs); + } + }); + + copyTask.Wait(duration * 1000); + traceSession.Stop(); + } +} +``` + +#### 5. Print names of all .NET processes that published a diagnostics server to connect + +This sample shows how to use `DiagnosticsClient.GetPublishedProcesses` API to print the names of the .NET processes that published a diagnostics IPC channel. + +```cs +using Microsoft.Diagnostics.NETCore.Client; +using System.Linq; + +public static void PrintProcessStatus() +{ + var processes = DiagnosticsClient.GetPublishedProcesses() + .Select(GetProcessById) + .Where(process => process != null) + + foreach (var process in processes) + { + Console.WriteLine($"{process.ProcessName}"); + } +} +``` + + +#### 6. Live-parsing events for a specified period of time. + +This sample shows an example where we create two tasks, one that parses the events coming in live with `EventPipeEventSource` and one that reads the console input for a user input signaling the program to end. If the target app exists before the users presses enter, the app exists gracefully. Otherwise, `inputTask` will send the Stop command to the pipe and exit gracefully. + +```cs +using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Diagnostics.Tracing.Parsers; + +public static void PrintEventsLive(int processId) +{ + var providers = new List() + { + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", + EventLevel.Informational, (long)ClrTraceEventParser.Keywords.Default) + }; + var client = new DiagnosticsClient(processId); + using (var session = client.StartEventPipeSession(providers, false)) + { + + Task streamTask = Task.Run(() => + { + var source = new EventPipeEventSource(session.EventStream); + source.Dynamic.All += (TraceEvent obj) => + { + Console.WriteLine(obj.EventName); + }; + try + { + source.Process(); + } + // NOTE: This exception does not currently exist. It is something that needs to be added to TraceEvent. + catch (Exception e) + { + Console.WriteLine("Error encountered while processing events"); + Console.WriteLine(e.ToString()); + } + }); + + Task inputTask = Task.Run(() => + { + Console.WriteLine("Press Enter to exit"); + while (Console.ReadKey().Key != ConsoleKey.Enter) + { + Thread.Sleep(100); + } + session.Stop(); + }); + + Task.WaitAny(streamTask, sleepTask); + } +} +``` + +#### 7. Attach a ICorProfiler profiler + +This sample shows how to attach an ICorProfiler to a process (profiler attach). +```cs +public static int AttachProfiler(int processId, Guid profilerGuid, string profilerPath) +{ + var client = new DiagnosticsClient(processId); + return client.AttachProfiler(TimeSpan.FromSeconds(10), profilerGuid, profilerPath); +} +``` + + + +## API Description + +This section describes the APIs of the library. + +#### class DiagnosticsClient +```cs +public DiagnosticsClient +{ + public DiagnosticsClient(int processId); + public EventPipeSession StartEventPipeSession(IEnumerable providers, bool requestRundown=true, int circularBufferMB=256); + public void WriteDump(DumpType dumpType, string dumpPath=null, bool logDumpGeneration=false); + public void AttachProfiler(TimeSpan attachTimeout, Guid profilerGuid, string profilerPath, byte[] additionalData=null); + public static IEnumerable GetPublishedProcesses(); +} +``` + + + +#### Methods + +```csharp +public DiagnosticsClient(int processId); +``` + +Creates a new instance of `DiagnosticsClient` for a compatible .NET process running with process ID of `processId`. + +`processID` : Process ID of the target application. + + + +```csharp +public EventPipeSession StartEventPipeSession(IEnumerable providers, bool requestRundown=true, int circularBufferMB=256) +``` + +Starts an EventPipe tracing session using the given providers and settings. + +* `providers` : An `IEnumerable` of [`EventPipeProvider`](#class-eventpipeprovider)s to be collected. +* `requestRundown`: A `bool` specifying whether rundown provider events from the target app's runtime should be requested. + +**Remarks** + +Rundown events contain payloads that may be needed for post analysis, such as resolving method names of thread samples. Unless you know you do not want this, we recommend setting this to true. In large applications, this may take up to minutes. + +* `circularBufferMB` : The size of the circular buffer to be used as a buffer for writing events within the runtime. + + + +```csharp +public void WriteDump(DumpType dumpType, string dumpPath=null, bool logDumpGeneration=false); +``` + +Request a dump for post-mortem debugging of the target application. The type of the dump can be specified using the [`DumpType`](#enum-dumptype) enum. + +* `dumpType` : Type of the dump to be requested. + +* `dumpPath` : The path to the dump to be written out to. +* `logDumpGeneration` : If set to `true`, the target application will write out diagnostic logs during dump generation. + + + + + +```csharp +public void AttachProfiler(TimeSpan attachTimeout, Guid profilerGuid, string profilerPath, byte[] additionalData=null); +``` + +Request to attach an ICorProfiler to the target application. + +* `attachTimeout` : A `TimeSpan` after which attach will be aborted. +* `profilerGuid` : `Guid` of the ICorProfiler to be attached. +* `profilerPath ` : Path to the ICorProfiler dll to be attached. +* `additionalData` : Optional additional data that can be passed to the runtime during profiler attach. + + + +```csharp +public static IEnumerable GetPublishedProcesses(); +``` + +Get an `IEnumerable` of process IDs of all the active .NET processes that can be attached to. + + + + + +#### class EventPipeProvider + +```cs +public class EventPipeProvider +{ + public EventPipeProvider( + string name, + EventLevel eventLevel, + long keywords = 0, + IDictionary arguments = null) + + public string Name { get; } + + public EventLevel EventLevel { get; } + + public long Keywords { get; } + + public IDictionary Arguments { get; } + + public override string ToString(); + + public override bool Equals(object obj); + + public override int GetHashCode(); + + public static bool operator ==(Provider left, Provider right); + + public static bool operator !=(Provider left, Provider right); +} +``` + + + +```csharp +public EventPipeProvider(string name, + EventLevel eventLevel, + long keywords = 0, + IDictionary arguments = null) +``` + +Creates a new instance of `EventPipeProvider` with the given provider name, [EventLevel](https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.tracing.eventlevel), keywords, and arguments. + +#### Properties + + + +```csharp +public string Name { get; } +``` + +The name of the Provider + + + +```csharp +public EventLevel EventLevel { get; } +``` + +The EventLevel of the given instance of [`EventPipeProvider`](#class-eventpipeprovider). + + + +```csharp +public long Keywords { get; } +``` + +A long that represents bitmask for keywords of the EventSource. + + + +```csharp +public IDictionary Arguments { get; } +``` + +An `IDictionary` of key-value pair string representing optional arguments to be passed to EventSource representing the given `EventPipeProvider`. + + +#### Remarks + +This class is immutable, as EventPipe does not allow a provider's configuration to be modified during an EventPipe session (as of .NET Core 3.1). + + + +### class EventPipeSession + +```csharp +public class EventPipeSession : IDisposable +{ + public Stream EventStream { get; } + + public void Stop(); +} +``` + +This class represents an ongoing EventPipe session that has been started. It is immutable and acts as a handle to an EventPipe session of the given runtime. + +#### Properties + +```csharp +public Stream EventStream { get; } +``` + +Returns a `Stream` that can be used to read the event stream. + +#### Methods + +```csharp +public void Stop(); +``` + +Stops the given EventPipe session. + + + +### enum DumpType + +```csharp +public enum DumpType +{ + Normal = 1, + WithHeap = 2, + Triage = 3, + Full = 4 +} +``` + +Represents the type of dump that can be requested. + +* `Normal`: Include just the information necessary to capture stack traces for all existing traces for all existing threads in a process. Limited GC heap memory and information. +* `WithHeap`: Includes the GC heaps and information necessary to capture stack traces for all existing threads in a process. +* `Triage`: Include just the information necessary to capture stack traces for all existing traces for all existing threads in a process. Limited GC heap memory and information. +* `Full`: Include all accessible memory in the process. The raw memory data is included at the end, so that the initial structures can be mapped directly without the raw memory information. This option can result in a very large dump file. + + + +### Exceptions + +Either `DiagnosticsClientException` or its subclass can be thrown from the library. + +```csharp +public class DiagnosticsClientException : Exception +``` + +#### UnsupportedProtocolException + +```csharp +public class UnsupportedProtocolException : DiagnosticsClientException +``` + +This may be thrown when the command is not supported by either the library or the target process' runtime. + + + +#### ServerNotAvailableException + +```csharp +public class ServerNotAvailableException : DiagnosticsClientException +``` + +This may be thrown when the runtime is not available for diagnostics IPC commands, such as early during runtime startup before the runtime is ready for diagnostics commands, or when the runtime is shutting down. + +#### ServerErrorException + +```csharp +public class ServerErrorException : DiagnosticsClientException +``` + +This may be thrown when the runtime responds with an error to a given command. + + + From ddcdbf0caa283336ab4b9dda01b824783153e9ac Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2020 13:36:37 +0000 Subject: [PATCH 138/243] Update dependencies from https://github.com/dotnet/arcade build 20200223.1 (#851) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.20123.1 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.20123.1 --- eng/Version.Details.xml | 8 +- eng/Versions.props | 2 +- eng/common/CheckSymbols.ps1 | 159 -------------- eng/common/PublishToPackageFeed.proj | 83 -------- eng/common/PublishToSymbolServers.proj | 84 -------- eng/common/SourceLinkValidation.ps1 | 195 ------------------ .../post-build/check-channel-consistency.ps1 | 25 +++ .../channels/generic-public-channel.yml | 4 +- .../templates/post-build/post-build.yml | 58 ++++-- global.json | 2 +- 10 files changed, 80 insertions(+), 540 deletions(-) delete mode 100644 eng/common/CheckSymbols.ps1 delete mode 100644 eng/common/PublishToPackageFeed.proj delete mode 100644 eng/common/PublishToSymbolServers.proj delete mode 100644 eng/common/SourceLinkValidation.ps1 create mode 100644 eng/common/post-build/check-channel-consistency.ps1 diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 8e2fb4f2b9..ed5752346b 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,15 +4,15 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - 2086e534f12e6116889ee480646ef54c1f781887 + 85d76351b1f0245c9f331f72219d12e8e2d48e72 - + https://github.com/dotnet/arcade - 2086e534f12e6116889ee480646ef54c1f781887 + 85d76351b1f0245c9f331f72219d12e8e2d48e72 https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 17a1f3b9b8..a0ca23e55b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -40,7 +40,7 @@ 4.5.3 2.4.1 2.0.3 - 5.0.0-beta.20116.1 + 5.0.0-beta.20123.1 10.0.18362 diff --git a/eng/common/CheckSymbols.ps1 b/eng/common/CheckSymbols.ps1 deleted file mode 100644 index 5442eff386..0000000000 --- a/eng/common/CheckSymbols.ps1 +++ /dev/null @@ -1,159 +0,0 @@ -param( - [Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where NuGet packages to be checked are stored - [Parameter(Mandatory=$true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation - [Parameter(Mandatory=$true)][string] $SymbolToolPath # Full path to directory where dotnet symbol-tool was installed -) - -Add-Type -AssemblyName System.IO.Compression.FileSystem -. $PSScriptRoot\pipeline-logging-functions.ps1 - -function FirstMatchingSymbolDescriptionOrDefault { - param( - [string] $FullPath, # Full path to the module that has to be checked - [string] $TargetServerParameter, # Parameter to pass to `Symbol Tool` indicating the server to lookup for symbols - [string] $SymbolsPath - ) - - $FileName = [System.IO.Path]::GetFileName($FullPath) - $Extension = [System.IO.Path]::GetExtension($FullPath) - - # Those below are potential symbol files that the `dotnet symbol` might - # return. Which one will be returned depend on the type of file we are - # checking and which type of file was uploaded. - - # The file itself is returned - $SymbolPath = $SymbolsPath + '\' + $FileName - - # PDB file for the module - $PdbPath = $SymbolPath.Replace($Extension, '.pdb') - - # PDB file for R2R module (created by crossgen) - $NGenPdb = $SymbolPath.Replace($Extension, '.ni.pdb') - - # DBG file for a .so library - $SODbg = $SymbolPath.Replace($Extension, '.so.dbg') - - # DWARF file for a .dylib - $DylibDwarf = $SymbolPath.Replace($Extension, '.dylib.dwarf') - - .\dotnet-symbol.exe --symbols --modules --windows-pdbs $TargetServerParameter $FullPath -o $SymbolsPath | Out-Null - - if (Test-Path $PdbPath) { - return 'PDB' - } - elseif (Test-Path $NGenPdb) { - return 'NGen PDB' - } - elseif (Test-Path $SODbg) { - return 'DBG for SO' - } - elseif (Test-Path $DylibDwarf) { - return 'Dwarf for Dylib' - } - elseif (Test-Path $SymbolPath) { - return 'Module' - } - else { - return $null - } -} - -function CountMissingSymbols { - param( - [string] $PackagePath # Path to a NuGet package - ) - - # Ensure input file exist - if (!(Test-Path $PackagePath)) { - throw "Input file does not exist: $PackagePath" - } - - # Extensions for which we'll look for symbols - $RelevantExtensions = @('.dll', '.exe', '.so', '.dylib') - - # How many files are missing symbol information - $MissingSymbols = 0 - - $PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath) - $PackageGuid = New-Guid - $ExtractPath = Join-Path -Path $ExtractPath -ChildPath $PackageGuid - $SymbolsPath = Join-Path -Path $ExtractPath -ChildPath 'Symbols' - - [System.IO.Compression.ZipFile]::ExtractToDirectory($PackagePath, $ExtractPath) - - # Makes easier to reference `symbol tool` - Push-Location $SymbolToolPath - - Get-ChildItem -Recurse $ExtractPath | - Where-Object {$RelevantExtensions -contains $_.Extension} | - ForEach-Object { - if ($_.FullName -Match '\\ref\\') { - Write-Host "`t Ignoring reference assembly file" $_.FullName - return - } - - $SymbolsOnMSDL = FirstMatchingSymbolDescriptionOrDefault -FullPath $_.FullName -TargetServerParameter '--microsoft-symbol-server' -SymbolsPath $SymbolsPath - $SymbolsOnSymWeb = FirstMatchingSymbolDescriptionOrDefault -FullPath $_.FullName -TargetServerParameter '--internal-server' -SymbolsPath $SymbolsPath - - Write-Host -NoNewLine "`t Checking file" $_.FullName "... " - - if ($SymbolsOnMSDL -ne $null -and $SymbolsOnSymWeb -ne $null) { - Write-Host "Symbols found on MSDL (${$SymbolsOnMSDL}) and SymWeb (${$SymbolsOnSymWeb})" - } - else { - $MissingSymbols++ - - if ($SymbolsOnMSDL -eq $null -and $SymbolsOnSymWeb -eq $null) { - Write-Host 'No symbols found on MSDL or SymWeb!' - } - else { - if ($SymbolsOnMSDL -eq $null) { - Write-Host 'No symbols found on MSDL!' - } - else { - Write-Host 'No symbols found on SymWeb!' - } - } - } - } - - Pop-Location - - return $MissingSymbols -} - -function CheckSymbolsAvailable { - if (Test-Path $ExtractPath) { - Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue - } - - Get-ChildItem "$InputPath\*.nupkg" | - ForEach-Object { - $FileName = $_.Name - - # These packages from Arcade-Services include some native libraries that - # our current symbol uploader can't handle. Below is a workaround until - # we get issue: https://github.com/dotnet/arcade/issues/2457 sorted. - if ($FileName -Match 'Microsoft\.DotNet\.Darc\.') { - Write-Host "Ignoring Arcade-services file: $FileName" - Write-Host - return - } - elseif ($FileName -Match 'Microsoft\.DotNet\.Maestro\.Tasks\.') { - Write-Host "Ignoring Arcade-services file: $FileName" - Write-Host - return - } - - Write-Host "Validating $FileName " - $Status = CountMissingSymbols "$InputPath\$FileName" - - if ($Status -ne 0) { - Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "Missing symbols for $Status modules in the package $FileName" - } - - Write-Host - } -} - -CheckSymbolsAvailable diff --git a/eng/common/PublishToPackageFeed.proj b/eng/common/PublishToPackageFeed.proj deleted file mode 100644 index a1b1333723..0000000000 --- a/eng/common/PublishToPackageFeed.proj +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - netcoreapp2.1 - - - - - - - - - - - - - - - - - - - - - - - - - https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json - https://dotnetfeed.blob.core.windows.net/arcade-validation/index.json - https://dotnetfeed.blob.core.windows.net/aspnet-aspnetcore/index.json - https://dotnetfeed.blob.core.windows.net/aspnet-aspnetcore-tooling/index.json - https://dotnetfeed.blob.core.windows.net/aspnet-entityframeworkcore/index.json - https://dotnetfeed.blob.core.windows.net/aspnet-extensions/index.json - https://dotnetfeed.blob.core.windows.net/dotnet-coreclr/index.json - https://dotnetfeed.blob.core.windows.net/dotnet-sdk/index.json - https://dotnetfeed.blob.core.windows.net/dotnet-tools-internal/index.json - https://dotnetfeed.blob.core.windows.net/dotnet-toolset/index.json - https://dotnetfeed.blob.core.windows.net/dotnet-windowsdesktop/index.json - https://dotnetfeed.blob.core.windows.net/nuget-nugetclient/index.json - https://dotnetfeed.blob.core.windows.net/aspnet-entityframework6/index.json - https://dotnetfeed.blob.core.windows.net/aspnet-blazor/index.json - - - - - - - - - - - - diff --git a/eng/common/PublishToSymbolServers.proj b/eng/common/PublishToSymbolServers.proj deleted file mode 100644 index 311e2bbe0f..0000000000 --- a/eng/common/PublishToSymbolServers.proj +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - netcoreapp2.1 - - - - - - - - - - - - - - - - 3650 - true - true - true - false - - - - - - - - - - - - - - - - - diff --git a/eng/common/SourceLinkValidation.ps1 b/eng/common/SourceLinkValidation.ps1 deleted file mode 100644 index 0e4c349e00..0000000000 --- a/eng/common/SourceLinkValidation.ps1 +++ /dev/null @@ -1,195 +0,0 @@ -param( - [Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where Symbols.NuGet packages to be checked are stored - [Parameter(Mandatory=$true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation - [Parameter(Mandatory=$true)][string] $SourceLinkToolPath, # Full path to directory where dotnet SourceLink CLI was installed - [Parameter(Mandatory=$true)][string] $GHRepoName, # GitHub name of the repo including the Org. E.g., dotnet/arcade - [Parameter(Mandatory=$true)][string] $GHCommit # GitHub commit SHA used to build the packages -) - -function ValidateSourceLinkLinks { - if (!($GHRepoName -Match "^[^\s\/]+/[^\s\/]+$")) { - Write-PipelineTelemetryError -Category "Build" -Message "GHRepoName should be in the format /" - $global:LASTEXITCODE = 1 - return - } - - if (!($GHCommit -Match "^[0-9a-fA-F]{40}$")) { - Write-PipelineTelemetryError -Category "Build" -Message "GHCommit should be a 40 chars hexadecimal string" - $global:LASTEXITCODE = 1 - return - } - - $RepoTreeURL = -Join("https://api.github.com/repos/", $GHRepoName, "/git/trees/", $GHCommit, "?recursive=1") - $CodeExtensions = @(".cs", ".vb", ".fs", ".fsi", ".fsx", ".fsscript") - - try { - # Retrieve the list of files in the repo at that particular commit point and store them in the RepoFiles hash - $Data = Invoke-WebRequest $RepoTreeURL | ConvertFrom-Json | Select-Object -ExpandProperty tree - - foreach ($file in $Data) { - $Extension = [System.IO.Path]::GetExtension($file.path) - - if ($CodeExtensions.Contains($Extension)) { - $RepoFiles[$file.path] = 1 - } - } - } - catch { - Write-PipelineTelemetryError -Category "Build" -Message "Problems downloading the list of files from the repo. Url used: $RepoTreeURL" - $global:LASTEXITCODE = 1 - return - } - - if (Test-Path $ExtractPath) { - Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue - } - - # Process each NuGet package in parallel - $Jobs = @() - Get-ChildItem "$InputPath\*.symbols.nupkg" | - ForEach-Object { - $Jobs += Start-Job -ScriptBlock $ValidatePackage -ArgumentList $_.FullName - } - - foreach ($Job in $Jobs) { - Wait-Job -Id $Job.Id | Receive-Job - } -} - -try { - . $PSScriptRoot\pipeline-logging-functions.ps1 - - # Cache/HashMap (File -> Exist flag) used to consult whether a file exist - # in the repository at a specific commit point. This is populated by inserting - # all files present in the repo at a specific commit point. - $global:RepoFiles = @{} - - $ValidatePackage = { - param( - [string] $PackagePath # Full path to a Symbols.NuGet package - ) - - # Ensure input file exist - if (!(Test-Path $PackagePath)) { - throw "Input file does not exist: $PackagePath" - } - - # Extensions for which we'll look for SourceLink information - # For now we'll only care about Portable & Embedded PDBs - $RelevantExtensions = @(".dll", ".exe", ".pdb") - - Write-Host -NoNewLine "Validating" ([System.IO.Path]::GetFileName($PackagePath)) "... " - - $PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath) - $ExtractPath = Join-Path -Path $using:ExtractPath -ChildPath $PackageId - $FailedFiles = 0 - - Add-Type -AssemblyName System.IO.Compression.FileSystem - - [System.IO.Directory]::CreateDirectory($ExtractPath); - - $zip = [System.IO.Compression.ZipFile]::OpenRead($PackagePath) - - $zip.Entries | - Where-Object {$RelevantExtensions -contains [System.IO.Path]::GetExtension($_.Name)} | - ForEach-Object { - $FileName = $_.FullName - $Extension = [System.IO.Path]::GetExtension($_.Name) - $FakeName = -Join((New-Guid), $Extension) - $TargetFile = Join-Path -Path $ExtractPath -ChildPath $FakeName - - # We ignore resource DLLs - if ($FileName.EndsWith(".resources.dll")) { - return - } - - [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_, $TargetFile, $true) - - $ValidateFile = { - param( - [string] $FullPath, # Full path to the module that has to be checked - [string] $RealPath, - [ref] $FailedFiles - ) - - # Makes easier to reference `sourcelink cli` - Push-Location $using:SourceLinkToolPath - - $SourceLinkInfos = .\sourcelink.exe print-urls $FullPath | Out-String - - if ($LASTEXITCODE -eq 0 -and -not ([string]::IsNullOrEmpty($SourceLinkInfos))) { - $NumFailedLinks = 0 - - # We only care about Http addresses - $Matches = (Select-String '(http[s]?)(:\/\/)([^\s,]+)' -Input $SourceLinkInfos -AllMatches).Matches - - if ($Matches.Count -ne 0) { - $Matches.Value | - ForEach-Object { - $Link = $_ - $CommitUrl = -Join("https://raw.githubusercontent.com/", $using:GHRepoName, "/", $using:GHCommit, "/") - $FilePath = $Link.Replace($CommitUrl, "") - $Status = 200 - $Cache = $using:RepoFiles - - if ( !($Cache.ContainsKey($FilePath)) ) { - try { - $Uri = $Link -as [System.URI] - - # Only GitHub links are valid - if ($Uri.AbsoluteURI -ne $null -and $Uri.Host -match "github") { - $Status = (Invoke-WebRequest -Uri $Link -UseBasicParsing -Method HEAD -TimeoutSec 5).StatusCode - } - else { - $Status = 0 - } - } - catch { - $Status = 0 - } - } - - if ($Status -ne 200) { - if ($NumFailedLinks -eq 0) { - if ($FailedFiles.Value -eq 0) { - Write-Host - } - - Write-Host "`tFile $RealPath has broken links:" - } - - Write-Host "`t`tFailed to retrieve $Link" - - $NumFailedLinks++ - } - } - } - - if ($NumFailedLinks -ne 0) { - $FailedFiles.value++ - $global:LASTEXITCODE = 1 - } - } - - Pop-Location - } - - &$ValidateFile $TargetFile $FileName ([ref]$FailedFiles) - } - - $zip.Dispose() - - if ($FailedFiles -eq 0) { - Write-Host "Passed." - } - } - - Measure-Command { ValidateSourceLinkLinks } -} -catch { - Write-Host $_.ScriptStackTrace - Write-PipelineTelemetryError -Category 'SourceLink' -Message $_ - ExitWithExitCode 1 -} - - diff --git a/eng/common/post-build/check-channel-consistency.ps1 b/eng/common/post-build/check-channel-consistency.ps1 new file mode 100644 index 0000000000..7e6618d64a --- /dev/null +++ b/eng/common/post-build/check-channel-consistency.ps1 @@ -0,0 +1,25 @@ +param( + [Parameter(Mandatory=$true)][string] $PromoteToChannels, # List of channels that the build should be promoted to + [Parameter(Mandatory=$true)][array] $AvailableChannelIds # List of channel IDs available in the YAML implementation +) + +try { + . $PSScriptRoot\post-build-utils.ps1 + + # Check that every channel that Maestro told to promote the build to + # is available in YAML + $PromoteToChannelsIds = $PromoteToChannels -split "\D" | Where-Object { $_ } + + foreach ($id in $PromoteToChannelsIds) { + if (($id -ne 0) -and ($id -notin $AvailableChannelIds)) { + Write-PipelineTaskError -Type 'warning' -Message "Channel $id is not present in the post-build YAML configuration!" + } + } + + Write-Host 'done.' +} +catch { + Write-Host $_ + Write-PipelineTelemetryError -Category 'CheckChannelConsistency' -Message "There was an error while trying to check consistency of Maestro default channels for the build and post-build YAML configuration." + ExitWithExitCode 1 +} diff --git a/eng/common/templates/post-build/channels/generic-public-channel.yml b/eng/common/templates/post-build/channels/generic-public-channel.yml index ae8c6349d4..00ef36fefe 100644 --- a/eng/common/templates/post-build/channels/generic-public-channel.yml +++ b/eng/common/templates/post-build/channels/generic-public-channel.yml @@ -94,6 +94,8 @@ stages: value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOPipelineId'] ] - name: AzDOBuildId value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.AzDOBuildId'] ] + - name: ArtifactsCategory + value: ${{ coalesce(variables._DotNetArtifactsCategory, '.NETCore') }} condition: or(contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', ${{ parameters.channelId }} )), eq(dependencies.setupMaestroVars.outputs['setReleaseVars.PromoteToMaestroChannelId'], ${{ parameters.channelId }})) pool: vmImage: 'windows-2019' @@ -132,7 +134,7 @@ stages: inputs: filePath: eng\common\sdk-task.ps1 arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet - /p:ArtifactsCategory=$(_DotNetArtifactsCategory) + /p:ArtifactsCategory=$(ArtifactsCategory) /p:IsStableBuild=$(IsStableBuild) /p:IsInternalBuild=$(IsInternalBuild) /p:RepositoryName=$(Build.Repository.Name) diff --git a/eng/common/templates/post-build/post-build.yml b/eng/common/templates/post-build/post-build.yml index eff0d9ac79..05ff3561fc 100644 --- a/eng/common/templates/post-build/post-build.yml +++ b/eng/common/templates/post-build/post-build.yml @@ -22,6 +22,22 @@ parameters: publishDependsOn: - Validate + # Channel ID's instantiated in this file. + # When adding a new channel implementation the call to `check-channel-consistency.ps1` + # needs to be updated with the new channel ID + NetEngLatestChannelId: 2 + NetEngValidationChannelId: 9 + NetCoreDev5ChannelId: 131 + GeneralTestingChannelId: 529 + NETCoreToolingDevChannelId: 548 + NETCoreToolingReleaseChannelId: 549 + NETInternalToolingChannelId: 551 + NETCoreExperimentalChannelId: 562 + NetEngServicesIntChannelId: 678 + NetEngServicesProdChannelId: 679 + Net5Preview1ChannelId: 737 + Net5Preview2ChannelId: 738 + stages: - stage: Validate dependsOn: ${{ parameters.validateDependsOn }} @@ -31,6 +47,24 @@ stages: jobs: - template: setup-maestro-vars.yml + - job: + displayName: Post-build Checks + dependsOn: setupMaestroVars + variables: + - name: InitialChannels + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'] ] + - name: PromoteToMaestroChannelId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.PromoteToMaestroChannelId'] ] + pool: + vmImage: 'windows-2019' + steps: + - task: PowerShell@2 + displayName: Maestro Channels Consistency + inputs: + filePath: $(Build.SourcesDirectory)/eng/common/post-build/check-channel-consistency.ps1 + arguments: -PromoteToChannels "$(InitialChannels)[$(PromoteToMaestroChannelId)]" + -AvailableChannelIds ${{parameters.NetEngLatestChannelId}},${{parameters.NetEngValidationChannelId}},${{parameters.NetCoreDev5ChannelId}},${{parameters.GeneralTestingChannelId}},${{parameters.NETCoreToolingDevChannelId}},${{parameters.NETCoreToolingReleaseChannelId}},${{parameters.NETInternalToolingChannelId}},${{parameters.NETCoreExperimentalChannelId}},${{parameters.NetEngServicesIntChannelId}},${{parameters.NetEngServicesProdChannelId}},${{parameters.Net5Preview1ChannelId}},${{parameters.Net5Preview2ChannelId}} + - job: displayName: NuGet Validation dependsOn: setupMaestroVars @@ -165,7 +199,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'NetCore_Dev5_Publish' channelName: '.NET Core 5 Dev' - channelId: 131 + channelId: ${{ parameters.NetCoreDev5ChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json' @@ -178,7 +212,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'Net5_Preview1_Publish' channelName: '.NET 5 Preview 1' - channelId: 737 + channelId: ${{ parameters.Net5Preview1ChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json' @@ -191,7 +225,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'Net5_Preview2_Publish' channelName: '.NET 5 Preview 2' - channelId: 738 + channelId: ${{ parameters.Net5Preview2ChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json' @@ -204,7 +238,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'Net_Eng_Latest_Publish' channelName: '.NET Eng - Latest' - channelId: 2 + channelId: ${{ parameters.NetEngLatestChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng-symbols/nuget/v3/index.json' @@ -217,7 +251,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'Net_Eng_Validation_Publish' channelName: '.NET Eng - Validation' - channelId: 9 + channelId: ${{ parameters.NetEngValidationChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng-symbols/nuget/v3/index.json' @@ -230,7 +264,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'General_Testing_Publish' channelName: 'General Testing' - channelId: 529 + channelId: ${{ parameters.GeneralTestingChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/general-testing/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/general-testing/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/general-testing-symbols/nuget/v3/index.json' @@ -243,7 +277,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'NETCore_Tooling_Dev_Publishing' channelName: '.NET Core Tooling Dev' - channelId: 548 + channelId: ${{ parameters.NETCoreToolingDevChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools-symbols/nuget/v3/index.json' @@ -256,7 +290,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'NETCore_Tooling_Release_Publishing' channelName: '.NET Core Tooling Release' - channelId: 549 + channelId: ${{ parameters.NETCoreToolingReleaseChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools-symbols/nuget/v3/index.json' @@ -269,7 +303,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'NET_Internal_Tooling_Publishing' channelName: '.NET Internal Tooling' - channelId: 551 + channelId: ${{ parameters.NETInternalToolingChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-tools-internal/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-tools-internal/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-tools-internal-symbols/nuget/v3/index.json' @@ -282,7 +316,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'NETCore_Experimental_Publishing' channelName: '.NET Core Experimental' - channelId: 562 + channelId: ${{ parameters.NETCoreExperimentalChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental-symbols/nuget/v3/index.json' @@ -295,7 +329,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'Net_Eng_Services_Int_Publish' channelName: '.NET Eng Services - Int' - channelId: 678 + channelId: ${{ parameters.NetEngServicesIntChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng-symbols/nuget/v3/index.json' @@ -308,7 +342,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'Net_Eng_Services_Prod_Publish' channelName: '.NET Eng Services - Prod' - channelId: 679 + channelId: ${{ parameters.NetEngServicesProdChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng-symbols/nuget/v3/index.json' diff --git a/global.json b/global.json index 8e1fc8cf1a..29a5854697 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "dotnet": "3.0.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20116.1" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20123.1" } } From c6e59214087cc68c7e72aac369ccf9a89aebe297 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2020 13:46:18 +0000 Subject: [PATCH 139/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200224.10 (#853) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.2.20124.10 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ed5752346b..3064316847 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime cfac865f9d44a443843d7dfc660a497f7d5bdf5a - + https://github.com/dotnet/aspnetcore - 5a0526dfd991419d5bce0d8ea525b50df2e37b04 + f1c302e66eb4ee2199aadb774e47380ca4d34301 diff --git a/eng/Versions.props b/eng/Versions.props index a0ca23e55b..3c35cb7091 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-preview.2.20120.8 - 5.0.0-preview.2.20121.13 + 5.0.0-preview.2.20124.10 From d436a7a2d57dcae6be69731f67996d8379caa005 Mon Sep 17 00:00:00 2001 From: Mikhail Kurinnoi Date: Tue, 25 Feb 2020 19:55:26 +0300 Subject: [PATCH 140/243] Updates tryrun.cmake for cross build (#837) Fix cross build: ``` ... -- Performing Test UNGETC_NOT_RETURN_EOF CMake Error: TRY_RUN() invoked in cross-compiling mode, please set the following cache variables appropriately: UNGETC_NOT_RETURN_EOF_EXITCODE (advanced) UNGETC_NOT_RETURN_EOF_EXITCODE__TRYRUN_OUTPUT (advanced) For details see /home/viewizard/Desktop/diagnostics/artifacts/obj/Linux.armel.Release/TryRunResults.cmake -- Performing Test UNGETC_NOT_RETURN_EOF - Success ... ``` Related to cmake changes (starts from 3.14.0-rc3, https://gitlab.kitware.com/cmake/cmake/commit/92d9ec9bfb61d2cd35a82d6906de86c71350b865) More info: https://gitlab.kitware.com/cmake/cmake/issues/18973 --- eng/cross/tryrun.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/eng/cross/tryrun.cmake b/eng/cross/tryrun.cmake index 988a59c5f6..f841f56b83 100644 --- a/eng/cross/tryrun.cmake +++ b/eng/cross/tryrun.cmake @@ -3,6 +3,7 @@ set(TARGET_ARCH_NAME $ENV{TARGET_BUILD_ARCH}) macro(set_cache_value) set(${ARGV0} ${ARGV1} CACHE STRING "Result from TRY_RUN" FORCE) + set(${ARGV0}__TRYRUN_OUTPUT "dummy output" CACHE STRING "Output from TRY_RUN" FORCE) endmacro() if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv6-alpine-linux-musleabihf OR From f5b7bf05776b452197c5310daad7e30f44272c63 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2020 19:34:46 +0000 Subject: [PATCH 141/243] Update dependencies from https://github.com/dotnet/runtime build 20200225.1 (#854) - Microsoft.NETCore.App - 5.0.0-preview.2.20125.1 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 3064316847..7bc9c43467 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 85d76351b1f0245c9f331f72219d12e8e2d48e72 - + https://github.com/dotnet/runtime - cfac865f9d44a443843d7dfc660a497f7d5bdf5a + 67580dcf025222985ddaacc6c22ebec8c7f9a707 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 3c35cb7091..acf2a1dbb2 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.2.20120.8 + 5.0.0-preview.2.20125.1 5.0.0-preview.2.20124.10 From 5a4d0d53703385d1bd41798c2f61ca620ae96bc8 Mon Sep 17 00:00:00 2001 From: dotnet-bot Date: Wed, 26 Feb 2020 01:46:08 +0000 Subject: [PATCH 142/243] Add SECURITY.md --- SECURITY.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..030ac0c065 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,15 @@ +# Security Policy + +## Supported Versions + +The .NET Core and ASP.NET Core support policy, including supported versions can be found at the [.NET Core Support Policy Page](https://dotnet.microsoft.com/platform/support/policy/dotnet-core). + +## Reporting a Vulnerability + +Security issues and bugs should be reported privately to the Microsoft Security Response Center (MSRC), either by emailing secure@microsoft.com or via the portal at https://msrc.microsoft.com. +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your +original message. Further information, including the MSRC PGP key, can be found in the [MSRC Report an Issue FAQ](https://www.microsoft.com/en-us/msrc/faqs-report-an-issue). + +Reports via MSRC may qualify for the .NET Core Bug Bounty. Details of the .NET Core Bug Bounty including terms and conditions are at [https://aka.ms/corebounty](https://aka.ms/corebounty). + +Please do not open issues for anything you think might have a security implication. \ No newline at end of file From 2c5e532fcf247421c0a373c7efaeaa6e7942a73e Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 26 Feb 2020 15:19:21 +0000 Subject: [PATCH 143/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200225.12 (#857) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.2.20125.12 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 7bc9c43467..32863da121 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime 67580dcf025222985ddaacc6c22ebec8c7f9a707 - + https://github.com/dotnet/aspnetcore - f1c302e66eb4ee2199aadb774e47380ca4d34301 + 03a9e8ec1c47d3c27902daf586c3ad30b0c40c31 diff --git a/eng/Versions.props b/eng/Versions.props index acf2a1dbb2..a7339f72bf 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-preview.2.20125.1 - 5.0.0-preview.2.20124.10 + 5.0.0-preview.2.20125.12 From 0d368aa2edfad485d9eff694bda43792cdd4c3c8 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 26 Feb 2020 15:22:58 +0000 Subject: [PATCH 144/243] Update dependencies from https://github.com/dotnet/runtime build 20200225.16 (#856) - Microsoft.NETCore.App - 5.0.0-preview.2.20125.16 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 32863da121..0f3fabac94 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 85d76351b1f0245c9f331f72219d12e8e2d48e72 - + https://github.com/dotnet/runtime - 67580dcf025222985ddaacc6c22ebec8c7f9a707 + 4807684b13d473c19121fbe757296e7607f3cabf https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index a7339f72bf..ae8f223f9e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.2.20125.1 + 5.0.0-preview.2.20125.16 5.0.0-preview.2.20125.12 From cac64e29a564e032490b66aa33c00f8550308921 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 27 Feb 2020 13:46:44 +0000 Subject: [PATCH 145/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200226.7 (#863) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.2.20126.7 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 0f3fabac94..404313a57d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime 4807684b13d473c19121fbe757296e7607f3cabf - + https://github.com/dotnet/aspnetcore - 03a9e8ec1c47d3c27902daf586c3ad30b0c40c31 + b0d3ee83776ace2f9624d5ddf0f069fb575acdf5 diff --git a/eng/Versions.props b/eng/Versions.props index ae8f223f9e..5648650434 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-preview.2.20125.16 - 5.0.0-preview.2.20125.12 + 5.0.0-preview.2.20126.7 From a68e0a37a21bcc2cdd304e0cefa2da9bab74e20a Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2020 13:46:07 +0000 Subject: [PATCH 146/243] Update dependencies from https://github.com/dotnet/runtime build 20200227.14 (#864) - Microsoft.NETCore.App - 5.0.0-preview.2.20127.14 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 404313a57d..a30dc32e45 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 85d76351b1f0245c9f331f72219d12e8e2d48e72 - + https://github.com/dotnet/runtime - 4807684b13d473c19121fbe757296e7607f3cabf + 487c940876b1932920454c44d2463d996cc8407c https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 5648650434..3193987610 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.2.20125.16 + 5.0.0-preview.2.20127.14 5.0.0-preview.2.20126.7 From 3ebe49fd10f7d6752be24676cb7d2291729d3740 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 29 Feb 2020 13:44:10 +0000 Subject: [PATCH 147/243] Update dependencies from https://github.com/dotnet/runtime build 20200228.16 (#865) - Microsoft.NETCore.App - 5.0.0-preview.2.20128.16 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a30dc32e45..4aa6c86bc4 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 85d76351b1f0245c9f331f72219d12e8e2d48e72 - + https://github.com/dotnet/runtime - 487c940876b1932920454c44d2463d996cc8407c + cf4cc83d44f3ebd1807b6db0ad9e546bdce218b7 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 3193987610..6f3c431254 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.2.20127.14 + 5.0.0-preview.2.20128.16 5.0.0-preview.2.20126.7 From b62c9ec10f583757e53fa8c5af58be8ce4b3b55b Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 29 Feb 2020 13:45:29 +0000 Subject: [PATCH 148/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200228.11 (#866) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.2.20128.11 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4aa6c86bc4..da129999cd 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime cf4cc83d44f3ebd1807b6db0ad9e546bdce218b7 - + https://github.com/dotnet/aspnetcore - b0d3ee83776ace2f9624d5ddf0f069fb575acdf5 + 41a3c63bc556db014d7368a08232eadfe744b10d diff --git a/eng/Versions.props b/eng/Versions.props index 6f3c431254..65c67ea8ad 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-preview.2.20128.16 - 5.0.0-preview.2.20126.7 + 5.0.0-preview.2.20128.11 From 328934d17b3c4a74a4a41d13732353ee9e0c8ae2 Mon Sep 17 00:00:00 2001 From: Mohammad Mustakim Ali Date: Sun, 1 Mar 2020 00:11:53 +0000 Subject: [PATCH 149/243] dotnet-gcdump: Update docs to include new print verb --- documentation/design-docs/dotnet-tools.md | 59 +++++++++++++++-------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/documentation/design-docs/dotnet-tools.md b/documentation/design-docs/dotnet-tools.md index b47dafcd60..506644b045 100644 --- a/documentation/design-docs/dotnet-tools.md +++ b/documentation/design-docs/dotnet-tools.md @@ -632,7 +632,7 @@ OPTIONS COMMANDS collect Capture dumps from a process - print Prints a previously collected gcdump into the stdout + report Generate report into stdout from a previously generated gcdump or from a running process. COLLECT @@ -657,9 +657,6 @@ COLLECT -v, --verbose Turns on logging for gcdump - --std-out - Also writes plaintext results into stdout. - Examples: $ dotnet gcdump collect --process-id 1902 @@ -667,32 +664,52 @@ Examples: Wrote 12576 bytes to file Complete -PRINT +REPORT - dotnet-gcdump print -f|--file + dotnet-gcdump report -f|--file - Prints a previously collected gcdump into the stdout + Generate report into stdout from a previously generated gcdump or from a running process. Usage: - dotnet-gcdump print [options] + dotnet-gcdump report [options] Options: - -f, --file The file to read gcdump from. + -f, --file The file to read gcdump from. + -p, --process-id The process id to collect the trace. + -t, --report-type The type of report to generate. Available options: heapstat (default) Examples: - $ dotnet gcdump print -f 20200207_094403_19847.gcdump | head -10 - 1,335,288 (Dump size) - 299,845 (Total allocations) - - 55,898 System.String (Bytes > 10K) [System.Private.CoreLib.dll] - 32,664 System.Object[] (Bytes > 10K) [System.Private.CoreLib.dll] - 31,128 System.Int32[] (Bytes > 10K) [System.Private.CoreLib.dll] - 13,816 Entry[] (Bytes > 10K) [System.Private.CoreLib.dll] - 10,368 Entry[] (Bytes > 10K) [System.Private.CoreLib.dll] - 8,960 Node[] (Bytes > 1K) [System.Collections.Concurrent.dll] - 8,216 System.Char[] (Bytes > 1K) [System.Private.CoreLib.dll] - + $ dotnet gcdump report -f 20200207_094403_19847.gcdump | head -9 + 5,080,860 GC Heap bytes + 66,289 GC Heap objects + + Object Bytes Type + 131,096 System.Byte[] (Bytes > 100K) [System.Private.CoreLib.dll] + 57,756 System.String (Bytes > 10K) [System.Private.CoreLib.dll] + 31,128 System.Int32[] (Bytes > 10K) [System.Private.CoreLib.dll] + 28,605 System.Byte[] (Bytes > 10K) [System.Private.CoreLib.dll] + 22,432 System.Object[] (Bytes > 10K) [System.Private.CoreLib.dll] + 12,476 System.Char[] (Bytes > 10K) [System.Private.CoreLib.dll] + 8,216 System.Char[] (Bytes > 1K) [System.Private.CoreLib.dll] + 8,216 System.Byte[] (Bytes > 1K) [System.Private.CoreLib.dll] + 8,216 System.UInt32[] (Bytes > 1K) [System.Private.CoreLib.dll] + + + $ dotnet gcdump report -p 1752 | head -9 + 5,080,860 GC Heap bytes + 66,289 GC Heap objects + + Object Bytes Type + 131,096 System.Byte[] (Bytes > 100K) [System.Private.CoreLib.dll] + 57,756 System.String (Bytes > 10K) [System.Private.CoreLib.dll] + 31,128 System.Int32[] (Bytes > 10K) [System.Private.CoreLib.dll] + 28,605 System.Byte[] (Bytes > 10K) [System.Private.CoreLib.dll] + 22,432 System.Object[] (Bytes > 10K) [System.Private.CoreLib.dll] + 12,476 System.Char[] (Bytes > 10K) [System.Private.CoreLib.dll] + 8,216 System.Char[] (Bytes > 1K) [System.Private.CoreLib.dll] + 8,216 System.Byte[] (Bytes > 1K) [System.Private.CoreLib.dll] + 8,216 System.UInt32[] (Bytes > 1K) [System.Private.CoreLib.dll] ## Future suggestions From c3186b29f804bd80ff9f03650a8a2b78e3fb8ba2 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2020 13:44:08 +0000 Subject: [PATCH 150/243] Update dependencies from https://github.com/dotnet/runtime build 20200229.8 (#867) - Microsoft.NETCore.App - 5.0.0-preview.2.20129.8 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index da129999cd..2ddb3249a4 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 85d76351b1f0245c9f331f72219d12e8e2d48e72 - + https://github.com/dotnet/runtime - cf4cc83d44f3ebd1807b6db0ad9e546bdce218b7 + 6d9e5035905ae71b5fceeb8bb5a2c01f7622b7f6 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 65c67ea8ad..75c4a7d0fb 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.2.20128.16 + 5.0.0-preview.2.20129.8 5.0.0-preview.2.20128.11 From befd5fba8ec164e1119fc0bd315809f1f2818af9 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2020 13:31:30 +0000 Subject: [PATCH 151/243] Update dependencies from https://github.com/dotnet/arcade build 20200301.1 (#868) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.20151.1 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.20151.1 --- eng/Version.Details.xml | 8 +-- eng/Versions.props | 2 +- eng/common/dotnet-install.sh | 2 +- eng/common/init-tools-native.sh | 49 +++++++++++++++---- eng/common/performance/perfhelixpublish.proj | 21 +++++++- .../channels/generic-internal-channel.yml | 1 + .../channels/generic-public-channel.yml | 1 + global.json | 4 +- 8 files changed, 70 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2ddb3249a4..ae282ce747 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,15 +4,15 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - 85d76351b1f0245c9f331f72219d12e8e2d48e72 + 8ccad075bbb0db445e03eed0a6073d27bdd4f31a - + https://github.com/dotnet/arcade - 85d76351b1f0245c9f331f72219d12e8e2d48e72 + 8ccad075bbb0db445e03eed0a6073d27bdd4f31a https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 75c4a7d0fb..ca1f1e9de3 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -40,7 +40,7 @@ 4.5.3 2.4.1 2.0.3 - 5.0.0-beta.20123.1 + 5.0.0-beta.20151.1 10.0.18362 diff --git a/eng/common/dotnet-install.sh b/eng/common/dotnet-install.sh index 50bc5e475c..ead6a1d9a2 100755 --- a/eng/common/dotnet-install.sh +++ b/eng/common/dotnet-install.sh @@ -63,7 +63,7 @@ case $cpuname in amd64|x86_64) buildarch=x64 ;; - armv7l) + armv*l) buildarch=arm ;; i686) diff --git a/eng/common/init-tools-native.sh b/eng/common/init-tools-native.sh index dbd7cbfdf6..29fc5db8ae 100644 --- a/eng/common/init-tools-native.sh +++ b/eng/common/init-tools-native.sh @@ -34,6 +34,14 @@ while (($# > 0)); do force=true shift 1 ;; + --donotabortonfailure) + donotabortonfailure=true + shift 1 + ;; + --donotdisplaywarnings) + donotdisplaywarnings=true + shift 1 + ;; --downloadretries) download_retries=$2 shift 2 @@ -52,6 +60,8 @@ while (($# > 0)); do echo " - (default) %USERPROFILE%/.netcoreeng/native" echo "" echo " --clean Switch specifying not to install anything, but cleanup native asset folders" + echo " --donotabortonfailure Switch specifiying whether to abort native tools installation on failure" + echo " --donotdisplaywarnings Switch specifiying whether to display warnings during native tools installation on failure" echo " --force Clean and then install tools" echo " --help Print help and exit" echo "" @@ -92,6 +102,7 @@ if [[ -z $install_directory ]]; then fi install_bin="${native_base_dir}/bin" +installed_any=false ReadGlobalJsonNativeTools @@ -103,8 +114,8 @@ else for tool in "${!native_assets[@]}" do tool_version=${native_assets[$tool]} - installer_name="install-$tool.sh" - installer_command="$native_installer_dir/$installer_name" + installer_path="$native_installer_dir/install-$tool.sh" + installer_command="$installer_path" installer_command+=" --baseuri $base_uri" installer_command+=" --installpath $install_bin" installer_command+=" --version $tool_version" @@ -118,11 +129,29 @@ else installer_command+=" --clean" fi - $installer_command - - if [[ $? != 0 ]]; then - Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed" - exit 1 + if [[ -a $installer_path ]]; then + $installer_command + if [[ $? != 0 ]]; then + if [[ $donotabortonfailure = true ]]; then + if [[ $donotdisplaywarnings != true ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed" + fi + else + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed" + exit 1 + fi + else + $installed_any = true + fi + else + if [[ $donotabortonfailure == true ]]; then + if [[ $donotdisplaywarnings != true ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed: no install script" + fi + else + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed: no install script" + exit 1 + fi fi done fi @@ -135,8 +164,10 @@ if [[ -d $install_bin ]]; then echo "Native tools are available from $install_bin" echo "##vso[task.prependpath]$install_bin" else - Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Native tools install directory does not exist, installation failed" - exit 1 + if [[ $installed_any = true ]]; then + Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Native tools install directory does not exist, installation failed" + exit 1 + fi fi exit 0 diff --git a/eng/common/performance/perfhelixpublish.proj b/eng/common/performance/perfhelixpublish.proj index e5826b5323..cf5941e1b6 100644 --- a/eng/common/performance/perfhelixpublish.proj +++ b/eng/common/performance/perfhelixpublish.proj @@ -6,7 +6,7 @@ py -3 %HELIX_CORRELATION_PAYLOAD%\Core_Root\CoreRun.exe %HELIX_CORRELATION_PAYLOAD%\Baseline_Core_Root\CoreRun.exe - $(HelixPreCommands);call %HELIX_CORRELATION_PAYLOAD%\performance\tools\machine-setup.cmd + $(HelixPreCommands);call %HELIX_CORRELATION_PAYLOAD%\performance\tools\machine-setup.cmd;set PYTHONPATH=%HELIX_WORKITEM_PAYLOAD%\scripts%3B%HELIX_WORKITEM_PAYLOAD% %HELIX_CORRELATION_PAYLOAD%\artifacts\BenchmarkDotNet.Artifacts %HELIX_CORRELATION_PAYLOAD%\artifacts\BenchmarkDotNet.Artifacts_Baseline %HELIX_CORRELATION_PAYLOAD%\performance\src\tools\ResultsComparer\ResultsComparer.csproj @@ -99,4 +99,23 @@ 4:00 + + + + $(WorkItemDirectory)\ScenarioCorrelation + $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen\test.py crossgen --test-name System.Private.Xml.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root + + + $(WorkItemDirectory)\ScenarioCorrelation + $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen\test.py crossgen --test-name System.Linq.Expressions.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root + + + $(WorkItemDirectory)\ScenarioCorrelation + $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen\test.py crossgen --test-name Microsoft.CodeAnalysis.VisualBasic.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root + + + $(WorkItemDirectory)\ScenarioCorrelation + $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen\test.py crossgen --test-name Microsoft.CodeAnalysis.CSharp.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root + + \ No newline at end of file diff --git a/eng/common/templates/post-build/channels/generic-internal-channel.yml b/eng/common/templates/post-build/channels/generic-internal-channel.yml index 380122901d..dde27800c3 100644 --- a/eng/common/templates/post-build/channels/generic-internal-channel.yml +++ b/eng/common/templates/post-build/channels/generic-internal-channel.yml @@ -84,6 +84,7 @@ stages: - job: publish_assets displayName: Publish Assets dependsOn: setupMaestroVars + timeoutInMinutes: 120 variables: - name: BARBuildId value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ] diff --git a/eng/common/templates/post-build/channels/generic-public-channel.yml b/eng/common/templates/post-build/channels/generic-public-channel.yml index 00ef36fefe..29bc1a941a 100644 --- a/eng/common/templates/post-build/channels/generic-public-channel.yml +++ b/eng/common/templates/post-build/channels/generic-public-channel.yml @@ -83,6 +83,7 @@ stages: - job: publish_assets displayName: Publish Assets dependsOn: setupMaestroVars + timeoutInMinutes: 120 variables: - name: BARBuildId value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ] diff --git a/global.json b/global.json index 29a5854697..014ace9d8b 100644 --- a/global.json +++ b/global.json @@ -1,8 +1,8 @@ { "tools": { - "dotnet": "3.0.101" + "dotnet": "3.1.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20123.1" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20151.1" } } From a5541ae561696bda4a7c8882b22617a520b5ee5c Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2020 13:49:45 +0000 Subject: [PATCH 152/243] Update dependencies from https://github.com/dotnet/runtime build 20200301.4 (#869) - Microsoft.NETCore.App - 5.0.0-preview.2.20151.4 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ae282ce747..0c7dc878a1 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 8ccad075bbb0db445e03eed0a6073d27bdd4f31a - + https://github.com/dotnet/runtime - 6d9e5035905ae71b5fceeb8bb5a2c01f7622b7f6 + c822449a48de9d209c8d5184e64ba4ca68094dca https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index ca1f1e9de3..7a35d58d6a 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.2.20129.8 + 5.0.0-preview.2.20151.4 5.0.0-preview.2.20128.11 From 66b278db4ca66e39568b2ce1f11bb7fb9e36d8e9 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Mon, 2 Mar 2020 17:41:26 -0800 Subject: [PATCH 153/243] Fix whitespace in SECURITY.md (#870) --- SECURITY.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 030ac0c065..27ff07f700 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,15 +1,15 @@ -# Security Policy - -## Supported Versions - -The .NET Core and ASP.NET Core support policy, including supported versions can be found at the [.NET Core Support Policy Page](https://dotnet.microsoft.com/platform/support/policy/dotnet-core). - -## Reporting a Vulnerability - -Security issues and bugs should be reported privately to the Microsoft Security Response Center (MSRC), either by emailing secure@microsoft.com or via the portal at https://msrc.microsoft.com. -You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your -original message. Further information, including the MSRC PGP key, can be found in the [MSRC Report an Issue FAQ](https://www.microsoft.com/en-us/msrc/faqs-report-an-issue). - -Reports via MSRC may qualify for the .NET Core Bug Bounty. Details of the .NET Core Bug Bounty including terms and conditions are at [https://aka.ms/corebounty](https://aka.ms/corebounty). - +# Security Policy + +## Supported Versions + +The .NET Core and ASP.NET Core support policy, including supported versions can be found at the [.NET Core Support Policy Page](https://dotnet.microsoft.com/platform/support/policy/dotnet-core). + +## Reporting a Vulnerability + +Security issues and bugs should be reported privately to the Microsoft Security Response Center (MSRC), either by emailing secure@microsoft.com or via the portal at https://msrc.microsoft.com. +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your +original message. Further information, including the MSRC PGP key, can be found in the [MSRC Report an Issue FAQ](https://www.microsoft.com/en-us/msrc/faqs-report-an-issue). + +Reports via MSRC may qualify for the .NET Core Bug Bounty. Details of the .NET Core Bug Bounty including terms and conditions are at [https://aka.ms/corebounty](https://aka.ms/corebounty). + Please do not open issues for anything you think might have a security implication. \ No newline at end of file From d5140eebae5a6a8c0d5cfb1f1687be0bbc56058a Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2020 09:09:38 -0800 Subject: [PATCH 154/243] Update dependencies from https://github.com/dotnet/runtime build 20200302.11 (#872) - Microsoft.NETCore.App - 5.0.0-preview.2.20152.11 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 0c7dc878a1..73d1c8a2c9 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 8ccad075bbb0db445e03eed0a6073d27bdd4f31a - + https://github.com/dotnet/runtime - c822449a48de9d209c8d5184e64ba4ca68094dca + b3f81350c856cfd5079c52349024a8f55d0c009a https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 7a35d58d6a..566670be78 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.2.20151.4 + 5.0.0-preview.2.20152.11 5.0.0-preview.2.20128.11 From 44e551782d02089c78bce5ed87d7ec769085d7a2 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2020 09:10:16 -0800 Subject: [PATCH 155/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200302.3 (#873) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.2.20152.3 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 73d1c8a2c9..3dcc7e7c85 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime b3f81350c856cfd5079c52349024a8f55d0c009a - + https://github.com/dotnet/aspnetcore - 41a3c63bc556db014d7368a08232eadfe744b10d + d08ecf003ac2484351222be94cc0acb5d451a2c2 diff --git a/eng/Versions.props b/eng/Versions.props index 566670be78..e9fb69cb7c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-preview.2.20152.11 - 5.0.0-preview.2.20128.11 + 5.0.0-preview.2.20152.3 From 686645c3a014fffaf06310666ac847114de26e85 Mon Sep 17 00:00:00 2001 From: Juan Hoyos Date: Tue, 3 Mar 2020 09:35:21 -0800 Subject: [PATCH 156/243] Pipeline consolidation, added SDL and signature verification. (#852) * Consolidate CI and Build pipelines * Add source checks to pipelines - Disable CI. - Enable exclusions for documentation and license. * Encompass all prior jobs into a single job for SDL/Publishing v2 changes * Add Alpine to PR testing * Use Publishing v2 and run SDL on official builds This modifies how we publish symbols, usual packages, and runs policheck and crediscan against internal builds. This also runs signature validation, nuget validity, and sourcelink. * Delete UnicodeData.txt This was brought with the coreclr's pal but was deleted in dotnet/coreclr#24581 This was used to generate sources, but not automatically as part of the build. The generated file is checked in, and SOS's is already outdated. * Fix Policheck issues Fixes all the flagged terms except for API contracts, false positives, and files aquired from LLDB. * Add alpine debug to testing * Fix whitespace --- .vsts-dotnet-ci.yml | 49 - .vsts-dotnet.yml | 364 - diagnostics.yml | 404 + documentation/design-docs/dotnet-tools.md | 2 +- documentation/tutorial/README.md | 6 +- .../app_is_leaking_memory_eventual_crash.md | 8 +- documentation/tutorial/hung_app.md | 15 +- eng/build.yml | 15 +- eng/common-variables.yml | 32 + .../TestStep.cs | 2 +- src/SOS/Strike/util.h | 4 +- .../dotnet-gcdump/DotNetHeapDump/Graph.cs | 9 +- src/pal/src/locale/UnicodeData.txt | 12860 ---------------- 13 files changed, 460 insertions(+), 13310 deletions(-) delete mode 100644 .vsts-dotnet-ci.yml delete mode 100644 .vsts-dotnet.yml create mode 100644 diagnostics.yml create mode 100644 eng/common-variables.yml delete mode 100644 src/pal/src/locale/UnicodeData.txt diff --git a/.vsts-dotnet-ci.yml b/.vsts-dotnet-ci.yml deleted file mode 100644 index 948485f9e2..0000000000 --- a/.vsts-dotnet-ci.yml +++ /dev/null @@ -1,49 +0,0 @@ -trigger: -- master -- release/* - -pr: -- master -- release/* - -jobs: -- template: /eng/build.yml - parameters: - name: Windows - osGroup: Windows_NT - strategy: - matrix: - Build_Debug: - _BuildConfig: Debug - _BuildArch: x64 - Build_Release: - _BuildConfig: Release - _BuildArch: x64 - -- template: /eng/build.yml - parameters: - name: CentOS_7 - osGroup: Linux - dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-3e800f1-20190501005343 - strategy: - matrix: - Build_Debug: - _BuildConfig: Debug - _BuildArch: x64 - Build_Release: - _BuildConfig: Release - _BuildArch: x64 - -- template: /eng/build.yml - parameters: - name: MacOS - osGroup: MacOS - strategy: - matrix: - Build_Debug: - _BuildConfig: Debug - _BuildArch: x64 - Build_Release: - _BuildConfig: Release - _BuildArch: x64 - diff --git a/.vsts-dotnet.yml b/.vsts-dotnet.yml deleted file mode 100644 index 43ba18a7a5..0000000000 --- a/.vsts-dotnet.yml +++ /dev/null @@ -1,364 +0,0 @@ -trigger: -- master -- release/* - -pr: -- master -- release/* - -jobs: -- template: /eng/build.yml - parameters: - name: Windows - osGroup: Windows_NT - strategy: - matrix: - Build_Debug: - _BuildConfig: Debug - _BuildArch: x64 - Build_Release: - _BuildConfig: Release - _BuildArch: x64 - _PublishArtifacts: bin - Build_Release_x86: - _BuildConfig: Release - _BuildArch: x86 - _PublishArtifacts: bin/Windows_NT.x86.Release - Build_Release_arm: - _BuildOnly: true - _BuildConfig: Release - _BuildArch: arm - _PublishArtifacts: bin/Windows_NT.arm.Release - Build_Release_arm64: - _BuildOnly: true - _BuildConfig: Release - _BuildArch: arm64 - _PublishArtifacts: bin/Windows_NT.arm64.Release - -- template: /eng/build.yml - parameters: - name: CentOS_7 - osGroup: Linux - dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-3e800f1-20190501005343 - strategy: - matrix: - Build_Debug: - _BuildConfig: Debug - _BuildArch: x64 - _PublishArtifacts: bin/Linux.x64.Debug - Build_Release: - _BuildConfig: Release - _BuildArch: x64 - _PublishArtifacts: bin/Linux.x64.Release - -- template: /eng/build.yml - parameters: - name: Linux_cross - osGroup: Linux - dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-14.04-cross-1735d26-20190521133857 - crossrootfsDir: '/crossrootfs/arm' - strategy: - matrix: - Build_Release: - _BuildOnly: true - _BuildConfig: Release - _BuildArch: arm - _PublishArtifacts: bin/Linux.arm.Release - -- template: /eng/build.yml - parameters: - name: Linux_cross64 - osGroup: Linux - dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-a3ae44b-20180315221921 - crossrootfsDir: '/crossrootfs/arm64' - strategy: - matrix: - Build_Release: - _BuildOnly: true - _BuildConfig: Release - _BuildArch: arm64 - _PublishArtifacts: bin/Linux.arm64.Release - -- template: /eng/build.yml - parameters: - name: Alpine3_6 - osGroup: Linux - dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.6-WithNode-f4d3fe3-20181220200247 - strategy: - matrix: - Build_Release: - _BuildConfig: Release - _BuildArch: x64 - _PublishArtifacts: bin/Linux.x64.Release - -- template: /eng/build.yml - parameters: - name: MacOS - osGroup: MacOS - strategy: - matrix: - Build_Release: - _BuildConfig: Release - _BuildArch: x64 - _PublishArtifacts: bin/OSX.x64.Release - -# Test only legs - -- template: /eng/build.yml - parameters: - name: Debian_Stretch - osGroup: Linux - dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-stretch-3e800f1-20190521154431 - dependsOn: CentOS_7 - testOnly: true - strategy: - matrix: - Build_Debug: - _BuildConfig: Debug - _BuildArch: x64 - -- template: /eng/build.yml - parameters: - name: Fedora_28 - osGroup: Linux - dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-28-09ca40b-20190508143249 - dependsOn: CentOS_7 - testOnly: true - strategy: - matrix: - Build_Debug: - _BuildConfig: Debug - _BuildArch: x64 - -- template: /eng/build.yml - parameters: - name: Fedora_29 - osGroup: Linux - dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-29-09ca40b-20190508143249 - dependsOn: CentOS_7 - testOnly: true - strategy: - matrix: - Build_Debug: - _BuildConfig: Debug - _BuildArch: x64 - -- template: /eng/build.yml - parameters: - name: OpenSuse_42_1 - osGroup: Linux - dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:opensuse-42.1-c103199-20180628122439 - dependsOn: CentOS_7 - testOnly: true - strategy: - matrix: - Build_Debug: - _BuildConfig: Debug - _BuildArch: x64 - -- template: /eng/build.yml - parameters: - name: OpenSuse_42_3 - osGroup: Linux - dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:opensuse-42.3-3e800f1-20190501005344 - dependsOn: CentOS_7 - testOnly: true - strategy: - matrix: - Build_Debug: - _BuildConfig: Debug - _BuildArch: x64 - -- template: /eng/build.yml - parameters: - name: Ubuntu_14_04 - osGroup: Linux - dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-14.04-1735d26-20190521133852 - dependsOn: CentOS_7 - testOnly: true - strategy: - matrix: - Build_Debug: - _BuildConfig: Debug - _BuildArch: x64 - -- template: /eng/build.yml - parameters: - name: Ubuntu_16_04 - osGroup: Linux - dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-09ca40b-20190520220842 - dependsOn: CentOS_7 - testOnly: true - strategy: - matrix: - Build_Debug: - _BuildConfig: Debug - _BuildArch: x64 - -- template: /eng/build.yml - parameters: - name: Ubuntu_18_04 - osGroup: Linux - dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-3e800f1-20190508143252 - dependsOn: CentOS_7 - testOnly: true - strategy: - matrix: - Build_Debug: - _BuildConfig: Debug - _BuildArch: x64 - -# Download, sign, package and publish - -- template: /eng/common/templates/job/job.yml - parameters: - name: Sign_Package_Publish - dependsOn: - - Windows - - CentOS_7 - - Alpine3_6 - - MacOS - - Linux_cross - - Linux_cross64 - condition: succeeded() - pool: - name: NetCoreInternal-Pool - queue: BuildPool.Windows.10.Amd64.VS2017 - variables: - - _PublishBlobFeedUrl: https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json - - _TeamName: DotNetCore - - _SignType: $(SignType) - enableMicrobuild: true - steps: - - # Windows x64 download. Everything under "bin" is published for the Windows x64 build. - - - task: DownloadPipelineArtifact@2 - displayName: Download Windows x64 and Managed Artifacts - inputs: - artifactName: Windows_x64_Release - targetPath: '$(Build.SourcesDirectory)/artifacts/bin' - condition: succeeded() - - # Windows x86 download - - - task: DownloadPipelineArtifact@2 - displayName: Download Windows x86 Artifacts - inputs: - artifactName: Windows_x86_Release - targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Windows_NT.x86.Release' - condition: succeeded() - - # Windows arm download - - - task: DownloadPipelineArtifact@2 - displayName: Download Windows Arm Artifacts - inputs: - artifactName: Windows_arm_Release - targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Windows_NT.arm.Release' - condition: succeeded() - - # Windows arm64 download - - - task: DownloadPipelineArtifact@2 - displayName: Download Windows Arm64 Artifacts - inputs: - artifactName: Windows_arm64_Release - targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Windows_NT.arm64.Release' - condition: succeeded() - - # Linux x64 download - - - task: DownloadPipelineArtifact@2 - displayName: Download Linux Artifacts - inputs: - artifactName: CentOS_7_x64_Release - targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Linux.x64.Release' - condition: succeeded() - - # Linux MUSL x64 download - - - task: DownloadPipelineArtifact@2 - displayName: Download Linux Musl Artifacts - inputs: - artifactName: Alpine3_6_x64_Release - targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Linux-musl.x64.Release' - condition: succeeded() - - # Linux arm download - - - task: DownloadPipelineArtifact@2 - displayName: Download Linux Arm Artifacts - inputs: - artifactName: Linux_cross_arm_Release - targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Linux.arm.Release' - condition: succeeded() - - # Linux arm64 download - - - task: DownloadPipelineArtifact@2 - displayName: Download Linux Arm64 Artifacts - inputs: - artifactName: Linux_cross64_arm64_Release - targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Linux.arm64.Release' - condition: succeeded() - - # MacOS download - - - task: DownloadPipelineArtifact@2 - displayName: Download MacOS Artifacts - inputs: - artifactName: MacOS_x64_Release - targetPath: '$(Build.SourcesDirectory)/artifacts/bin/OSX.x64.Release' - condition: succeeded() - - # Create nuget packages, sign binaries and publish to blob feed - - - script: $(Build.SourcesDirectory)\eng\cipack.cmd - -configuration Release - -prepareMachine - -verbosity normal - /p:TeamName=$(_TeamName) - /p:DotNetSignType=$(SignType) - /p:DotNetPublishBlobFeedKey=$(dotnetfeed-storage-access-key-1) - /p:DotNetPublishBlobFeedUrl=$(_PublishBlobFeedUrl) - /p:DotNetPublishToBlobFeed=$(PublishPackages) - /p:OfficialBuildId=$(BUILD.BUILDNUMBER) - displayName: Sign / Package - continueOnError: true - condition: succeeded() - - # Publish symbols - - - task: PowerShell@2 - displayName: Publish Symbols - inputs: - filePath: eng\common\sdk-task.ps1 - arguments: -task PublishToSymbolServers -restore -msbuildEngine dotnet -configuration Release -verbosity normal - /p:UsingToolSymbolUploader=true - /p:DotNetSymbolServerTokenMsdl=$(microsoft-symbol-server-pat) - /p:DotNetSymbolServerTokenSymWeb=$(symweb-symbol-server-pat) - /p:PDBArtifactsDirectory='$(Build.SourcesDirectory)/artifacts/SymStore/**' - /p:BlobBasePath='$(Build.SourcesDirectory)/artifacts/packages/Release/**' - continueOnError: true - condition: and(succeeded(), eq(variables['PublishSymbols'], 'true')) - - # Publish package and log build artifacts - - - task: PublishBuildArtifacts@1 - displayName: Publish Package Artifacts - inputs: - publishLocation: Container - pathtoPublish: '$(Build.SourcesDirectory)/artifacts/packages' - artifactName: Packages - continueOnError: true - condition: always() - - - task: PublishBuildArtifacts@1 - displayName: Publish Logs Artifacts - inputs: - publishLocation: Container - pathtoPublish: '$(Build.SourcesDirectory)/artifacts/log' - artifactName: Logs_Packaging_Signing - continueOnError: true - condition: always() diff --git a/diagnostics.yml b/diagnostics.yml new file mode 100644 index 0000000000..8ab67db9cf --- /dev/null +++ b/diagnostics.yml @@ -0,0 +1,404 @@ +trigger: none + +pr: + autoCancel: true + branches: + include: + - master + - release/* + paths: + exclude: + - documentation/* + - THIRD-PARTY-NOTICES.TXT + - LICENSE.TXT + +variables: +- template: /eng/common-variables.yml + +stages: + - stage: build + displayName: Build and Test Diagnostics + jobs: + + ############################ + # # + # Build legs # + # # + ############################ + + - template: /eng/build.yml + parameters: + name: Windows + osGroup: Windows_NT + strategy: + matrix: + Build_Debug: + _BuildConfig: Debug + _BuildArch: x64 + Build_Release: + _BuildConfig: Release + _BuildArch: x64 + _PublishArtifacts: bin + ${{ if ne(variables['System.TeamProject'], 'public') }}: + Build_Release_x86: + _BuildConfig: Release + _BuildArch: x86 + _PublishArtifacts: bin/Windows_NT.x86.Release + Build_Release_arm: + _BuildOnly: true + _BuildConfig: Release + _BuildArch: arm + _PublishArtifacts: bin/Windows_NT.arm.Release + Build_Release_arm64: + _BuildOnly: true + _BuildConfig: Release + _BuildArch: arm64 + _PublishArtifacts: bin/Windows_NT.arm64.Release + + - template: /eng/build.yml + parameters: + name: CentOS_7 + osGroup: Linux + dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-3e800f1-20190501005343 + strategy: + matrix: + Build_Debug: + _BuildConfig: Debug + _BuildArch: x64 + _PublishArtifacts: bin/Linux.x64.Debug + Build_Release: + _BuildConfig: Release + _BuildArch: x64 + _PublishArtifacts: bin/Linux.x64.Release + + - template: /eng/build.yml + parameters: + name: Alpine3_6 + osGroup: Linux + dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.6-WithNode-f4d3fe3-20181220200247 + strategy: + matrix: + Build_Release: + _BuildConfig: Release + _BuildArch: x64 + _PublishArtifacts: bin/Linux.x64.Release + ${{ if in(variables['Build.Reason'], 'PullRequest') }}: + Build_Debug: + _BuildConfig: Debug + _BuildArch: x64 + + - template: /eng/build.yml + parameters: + name: MacOS + osGroup: MacOS + strategy: + matrix: + Build_Release: + _BuildConfig: Release + _BuildArch: x64 + _PublishArtifacts: bin/OSX.x64.Release + ${{ if in(variables['Build.Reason'], 'PullRequest') }}: + Build_Debug: + _BuildConfig: Debug + _BuildArch: x64 + + - ${{ if ne(variables['System.TeamProject'], 'public') }}: + - template: /eng/build.yml + parameters: + name: Linux_cross + osGroup: Linux + dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-14.04-cross-1735d26-20190521133857 + crossrootfsDir: '/crossrootfs/arm' + strategy: + matrix: + Build_Release: + _BuildOnly: true + _BuildConfig: Release + _BuildArch: arm + _PublishArtifacts: bin/Linux.arm.Release + + - template: /eng/build.yml + parameters: + name: Linux_cross64 + osGroup: Linux + dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-a3ae44b-20180315221921 + crossrootfsDir: '/crossrootfs/arm64' + strategy: + matrix: + Build_Release: + _BuildOnly: true + _BuildConfig: Release + _BuildArch: arm64 + _PublishArtifacts: bin/Linux.arm64.Release + + + ############################ + # # + # Test only legs # + # # + ############################ + + - template: /eng/build.yml + parameters: + name: Debian_Stretch + osGroup: Linux + dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-stretch-3e800f1-20190521154431 + dependsOn: CentOS_7 + testOnly: true + strategy: + matrix: + Build_Debug: + _BuildConfig: Debug + _BuildArch: x64 + + - template: /eng/build.yml + parameters: + name: Fedora_28 + osGroup: Linux + dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-28-09ca40b-20190508143249 + dependsOn: CentOS_7 + testOnly: true + strategy: + matrix: + Build_Debug: + _BuildConfig: Debug + _BuildArch: x64 + + - template: /eng/build.yml + parameters: + name: Fedora_29 + osGroup: Linux + dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-29-09ca40b-20190508143249 + dependsOn: CentOS_7 + testOnly: true + strategy: + matrix: + Build_Debug: + _BuildConfig: Debug + _BuildArch: x64 + + - template: /eng/build.yml + parameters: + name: OpenSuse_42_1 + osGroup: Linux + dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:opensuse-42.1-c103199-20180628122439 + dependsOn: CentOS_7 + testOnly: true + strategy: + matrix: + Build_Debug: + _BuildConfig: Debug + _BuildArch: x64 + + - template: /eng/build.yml + parameters: + name: OpenSuse_42_3 + osGroup: Linux + dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:opensuse-42.3-3e800f1-20190501005344 + dependsOn: CentOS_7 + testOnly: true + strategy: + matrix: + Build_Debug: + _BuildConfig: Debug + _BuildArch: x64 + + - template: /eng/build.yml + parameters: + name: Ubuntu_14_04 + osGroup: Linux + dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-14.04-1735d26-20190521133852 + dependsOn: CentOS_7 + testOnly: true + strategy: + matrix: + Build_Debug: + _BuildConfig: Debug + _BuildArch: x64 + + - template: /eng/build.yml + parameters: + name: Ubuntu_16_04 + osGroup: Linux + dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-09ca40b-20190520220842 + dependsOn: CentOS_7 + testOnly: true + strategy: + matrix: + Build_Debug: + _BuildConfig: Debug + _BuildArch: x64 + + - template: /eng/build.yml + parameters: + name: Ubuntu_18_04 + osGroup: Linux + dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-3e800f1-20190508143252 + dependsOn: CentOS_7 + testOnly: true + strategy: + matrix: + Build_Debug: + _BuildConfig: Debug + _BuildArch: x64 + + # Download, sign, package and publish + + - ${{ if notin(variables['Build.Reason'], 'PullRequest') }}: + - template: /eng/common/templates/job/job.yml + parameters: + name: Sign_Package_Publish + displayName: Sign, Package, and Publish to BAR + dependsOn: + - Windows + - CentOS_7 + - Alpine3_6 + - MacOS + - Linux_cross + - Linux_cross64 + condition: succeeded() + pool: + name: NetCoreInternal-Pool + queue: BuildPool.Windows.10.Amd64.VS2017 + enablePublishUsingPipelines: true + enableMicrobuild: true + artifacts: + publish: + logs: + name: Logs_Packaging_Signing + steps: + + # Windows x64 download. Everything under "bin" is published for the Windows x64 build. + + - task: DownloadPipelineArtifact@2 + displayName: Download Windows x64 and Managed Artifacts + inputs: + artifactName: Windows_x64_Release + targetPath: '$(Build.SourcesDirectory)/artifacts/bin' + condition: succeeded() + + # Windows x86 download + + - task: DownloadPipelineArtifact@2 + displayName: Download Windows x86 Artifacts + inputs: + artifactName: Windows_x86_Release + targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Windows_NT.x86.Release' + condition: succeeded() + + # Windows arm download + + - task: DownloadPipelineArtifact@2 + displayName: Download Windows Arm Artifacts + inputs: + artifactName: Windows_arm_Release + targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Windows_NT.arm.Release' + condition: succeeded() + + # Windows arm64 download + + - task: DownloadPipelineArtifact@2 + displayName: Download Windows Arm64 Artifacts + inputs: + artifactName: Windows_arm64_Release + targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Windows_NT.arm64.Release' + condition: succeeded() + + # Linux x64 download + + - task: DownloadPipelineArtifact@2 + displayName: Download Linux Artifacts + inputs: + artifactName: CentOS_7_x64_Release + targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Linux.x64.Release' + condition: succeeded() + + # Linux MUSL x64 download + + - task: DownloadPipelineArtifact@2 + displayName: Download Linux Musl Artifacts + inputs: + artifactName: Alpine3_6_x64_Release + targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Linux-musl.x64.Release' + condition: succeeded() + + # Linux arm download + + - task: DownloadPipelineArtifact@2 + displayName: Download Linux Arm Artifacts + inputs: + artifactName: Linux_cross_arm_Release + targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Linux.arm.Release' + condition: succeeded() + + # Linux arm64 download + + - task: DownloadPipelineArtifact@2 + displayName: Download Linux Arm64 Artifacts + inputs: + artifactName: Linux_cross64_arm64_Release + targetPath: '$(Build.SourcesDirectory)/artifacts/bin/Linux.arm64.Release' + condition: succeeded() + + # MacOS download + + - task: DownloadPipelineArtifact@2 + displayName: Download MacOS Artifacts + inputs: + artifactName: MacOS_x64_Release + targetPath: '$(Build.SourcesDirectory)/artifacts/bin/OSX.x64.Release' + condition: succeeded() + + # Create nuget packages, sign binaries and publish to blob feed + + - script: $(Build.SourcesDirectory)\eng\cipack.cmd + -configuration Release + -prepareMachine + -verbosity normal + $(_InternalBuildArgs) + displayName: Sign / Package + continueOnError: true + condition: succeeded() + + # Publish package and log build artifacts + + - task: PublishBuildArtifacts@1 + displayName: Publish Package Artifacts + inputs: + publishLocation: Container + pathtoPublish: '$(Build.SourcesDirectory)/artifacts/packages' + artifactName: Packages + continueOnError: true + condition: always() + + - template: /eng/common/templates/job/publish-build-assets.yml + parameters: + configuration: Release + dependsOn: Sign_Package_Publish + publishUsingPipelines: true + pool: + name: NetCoreInternal-Pool + queue: buildpool.windows.10.amd64.vs2017 + + - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - template: /eng/common/templates/post-build/post-build.yml + parameters: + # This is to enable SDL runs part of Post-Build Validation Stage. + # as well as NuGet, SourceLink, and signing validation. + # The variables get imported from group dotnet-diagnostics-sdl-params + enableSourceLinkValidation: true + SDLValidationParameters: + enable: true + continueOnError: false + params: ' -SourceToolsList @("policheck","credscan") + -TsaInstanceURL $(_TsaInstanceURL) + -TsaProjectName $(_TsaProjectName) + -TsaNotificationEmail $(_TsaNotificationEmail) + -TsaCodebaseAdmin $(_TsaCodebaseAdmin) + -TsaBugAreaPath $(_TsaBugAreaPath) + -TsaIterationPath $(_TsaIterationPath) + -TsaRepositoryName "diagnostics" + -TsaCodebaseName "diagnostics" + -TsaPublish $True' + artifactNames: + - 'Packages' diff --git a/documentation/design-docs/dotnet-tools.md b/documentation/design-docs/dotnet-tools.md index 6b6eb1f1ac..4b492ba335 100644 --- a/documentation/design-docs/dotnet-tools.md +++ b/documentation/design-docs/dotnet-tools.md @@ -1219,7 +1219,7 @@ d -g Run as a native debugger in a managed process (no interop). -h - Write dump if process has a hung window (does not respond to window messages for at least 5 seconds). + Write dump if process has an unresponsive window (does not respond to window messages for at least 5 seconds). -i Install ProcDump as the AeDebug postmortem debugger. Only -ma, -mp, -d and -r are supported as additional options. -l diff --git a/documentation/tutorial/README.md b/documentation/tutorial/README.md index 9076a7fe71..d350000f12 100644 --- a/documentation/tutorial/README.md +++ b/documentation/tutorial/README.md @@ -28,10 +28,6 @@ Please note that you have to be using at least preview 5 for most of the capabil ### [Scenario - App is experiencing intermittent memory spikes](intermittent_memory_spike.md) -### [Scenario - App is hanging](hung_app.md) +### [Scenario - App is not responding](hung_app.md) ### Scenario - App is experiencing intermittent exceptions - - - - diff --git a/documentation/tutorial/app_is_leaking_memory_eventual_crash.md b/documentation/tutorial/app_is_leaking_memory_eventual_crash.md index c442b85c51..dc4cc43903 100644 --- a/documentation/tutorial/app_is_leaking_memory_eventual_crash.md +++ b/documentation/tutorial/app_is_leaking_memory_eventual_crash.md @@ -1,4 +1,4 @@ -# App is leaking memory (eventual crash/hang) +# App is leaking memory (eventual crash/stops responding) http://localhost:5000/api/diagscenario/memleak/{kb} @@ -86,9 +86,3 @@ The string instance appears to be rooted from top level Processor object which i ![alt text](https://user-images.githubusercontent.com/15442480/57110703-4b214a80-6cee-11e9-8887-02c25424a0ad.png) From here we can now try and back-track (from code) why the cache seems to be growing in an unbound fashion. - - - - - - diff --git a/documentation/tutorial/hung_app.md b/documentation/tutorial/hung_app.md index fd76384477..994a0ac96c 100644 --- a/documentation/tutorial/hung_app.md +++ b/documentation/tutorial/hung_app.md @@ -1,16 +1,16 @@ -# App is hanging +# App stops responding **IMPORTANT: This tutorial uses API/methods available in dotnet core preview 5. These API/methods are _subject to change._** http://localhost:5000/api/diagscenario/deadlock -In this scenario, the endpoint will experience a hang and substantial thread accumulation. We'll show how you can use both the existing tools to analyze the problem as well as extending the existing tools to create a more automated debug session. +In this scenario, the endpoint will experience unresponsiveness and substantial thread accumulation. We'll show how you can use both the existing tools to analyze the problem as well as extending the existing tools to create a more automated debug session. ### Memory counters As of preview 5, the lock contention and thread counters are not yet available. They are on the backlog to be included in future milestones. The general symptom of this issue is that one or more requests will take a long time to process and ultimately timeout. ### Core dump generation -In order to investigate hung applications a memory dump is often beneficial allowing us to inspect the state of all the threads as well as any possible locks that may have contention issues. +In order to investigate applications that seem to be making no progress a memory dump is often beneficial allowing us to inspect the state of all the threads as well as any possible locks that may have contention issues. @@ -43,7 +43,7 @@ Once we have the process identifier, we can use the dotnet-dump collect tool (sp -At this point, we have the core dump and the next step is analyzing it to find the root cause of our hanging application. +At this point, we have the core dump and the next step is analyzing it to find the root cause of our unresponsive application. @@ -58,7 +58,7 @@ To start our investigation, let's open the core dump using dotnet-dump analyze: -Since we are looking at a potential hang it's useful to first get an overall feel for the thread activity in the process. We can use the threads command as shown below: +Since we are looking for the root cause of the unresponsiveness, it is often useful to first get an overall feel for the thread state in the process. We can use the threads command as shown below: @@ -351,8 +351,3 @@ System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, ``` The output shows a large number of threads (with associated thread ID's) that is commonly a good indicator that a threading issue is taking place. - - - - - diff --git a/eng/build.yml b/eng/build.yml index 1ec2226a31..a5c61a96f5 100644 --- a/eng/build.yml +++ b/eng/build.yml @@ -33,7 +33,7 @@ jobs: timeoutInMinutes: ${{ parameters.timeoutInMinutes }} enableMicrobuild: true enableTelemetry: true - helixRepo: dotnet/sdk + helixRepo: dotnet/diagnostics pool: # Public Linux Build Pool @@ -144,12 +144,13 @@ jobs: displayName: Build / Test condition: succeeded() - - task: PublishBuildArtifacts@1 - displayName: Publish Build Artifacts - inputs: - pathtoPublish: '$(Build.SourcesDirectory)/artifacts/$(_PublishArtifacts)' - artifactName: $(_PhaseName)_$(_BuildArch)_$(_BuildConfig) - condition: ne(variables['_PublishArtifacts'], '') + - ${{ if ne(variables['System.TeamProject'], 'public') }}: + - task: PublishBuildArtifacts@1 + displayName: Publish Build Artifacts + inputs: + pathtoPublish: '$(Build.SourcesDirectory)/artifacts/$(_PublishArtifacts)' + artifactName: $(_PhaseName)_$(_BuildArch)_$(_BuildConfig) + condition: ne(variables['_PublishArtifacts'], '') - task: PublishBuildArtifacts@1 displayName: Publish Artifacts on failure diff --git a/eng/common-variables.yml b/eng/common-variables.yml new file mode 100644 index 0000000000..c98bd86fee --- /dev/null +++ b/eng/common-variables.yml @@ -0,0 +1,32 @@ + +variables: + - name: _TeamName + value: DotNetCore + - name: _DotNetArtifactsCategory + value: .NETCore + - name: _InternalBuildArgs + value: '' + + - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - name: _SignType + value: real + - name: _PublishBlobFeedUrl + value: https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json + # DotNet-Blob-Feed provides: dotnetfeed-storage-access-key-1 + # DotNet-Diagnostics-SDL-Params provides Tsa* variables for SDL checks. + # DotNet-Symbol-Server-Pats provides: provides microsoft-symbol-server-pat and symweb-symbol-server-pat + # Publish-Build-Assets provides: MaestroAccessToken, BotAccount-dotnet-maestro-bot-PAT + - group: DotNet-Blob-Feed + - group: DotNet-Diagnostics-SDL-Params + - group: DotNet-Symbol-Server-Pats + - group: Publish-Build-Assets + - name: _InternalBuildArgs + value: /p:DotNetSignType=$(_SignType) /p:TeamName=$(_TeamName) + /p:DotNetArtifactsCategory=$(_DotNetArtifactsCategory) + /p:DotNetPublishBlobFeedKey=$(dotnetfeed-storage-access-key-1) + /p:DotNetPublishBlobFeedUrl=$(_PublishBlobFeedUrl) + /p:DotNetPublishToBlobFeed=$(PublishPackages) + /p:DotNetPublishUsingPipelines=$(PublishPackages) + /p:DotNetSymbolServerTokenMsdl=$(microsoft-symbol-server-pat) + /p:DotNetSymbolServerTokenSymWeb=$(symweb-symbol-server-pat) + /p:OfficialBuildId=$(BUILD.BUILDNUMBER) \ No newline at end of file diff --git a/src/Microsoft.Diagnostics.TestHelpers/TestStep.cs b/src/Microsoft.Diagnostics.TestHelpers/TestStep.cs index 0d03ac3279..203e93a105 100644 --- a/src/Microsoft.Diagnostics.TestHelpers/TestStep.cs +++ b/src/Microsoft.Diagnostics.TestHelpers/TestStep.cs @@ -304,7 +304,7 @@ private void ThrowExceptionForIncompleteWorkIfNeeded(TestStepState initialStepSt else if (openedStepState.ProcessID != Process.GetCurrentProcess().Id) { errorMessage.AppendLine("As of " + DateTimeOffset.Now + " the process executing this step (ID: 0x" + currentState.ProcessID.ToString("x") + ")" + Environment.NewLine + - "is still running. The process may be hung or running more slowly than expected?"); + "is still running. The process may have stopped responding or is running more slowly than expected?"); } else { diff --git a/src/SOS/Strike/util.h b/src/SOS/Strike/util.h index 7a487cb13b..03b77952c7 100644 --- a/src/SOS/Strike/util.h +++ b/src/SOS/Strike/util.h @@ -2707,8 +2707,8 @@ class LinearReadCache */ bool MoveToPage(TADDR addr, unsigned int size = 0x18); - /* Attempts to read from the target process if the data is possibly hanging off - * the end of a page. + /* Attempts to read from the target process if the data possibly crosses the + * boundaries of the page. */ template inline bool MisalignedRead(TADDR addr, T *t) diff --git a/src/Tools/dotnet-gcdump/DotNetHeapDump/Graph.cs b/src/Tools/dotnet-gcdump/DotNetHeapDump/Graph.cs index e6d1aee359..23bed8b0e3 100644 --- a/src/Tools/dotnet-gcdump/DotNetHeapDump/Graph.cs +++ b/src/Tools/dotnet-gcdump/DotNetHeapDump/Graph.cs @@ -43,8 +43,8 @@ namespace Graphs /// nodes with the code:Graph.AllocNodeStorage call /// /// Thus the basic flow is you call code:Graph.AllocNodeStorage to allocate storage, then call code:Graph.GetRoot - /// to get your first node. If you need to 'hang' additional information off he nodes, you allocate an array - /// of Size code:Graph.NodeIndexLimit to hold it (for example a 'visited' bit). Then repeatedly call + /// to get your first node. If you need to provide additional information about the nodes, you can allocate an auxiliary + /// array of Size code:Graph.NodeIndexLimit to hold it (for example a 'visited' bit). Then repeatedly call /// code:Node.GetFirstChild, code:Node.GetNextChild to get the children of a node to traverse the graph. /// /// OVERHEAD @@ -2603,8 +2603,9 @@ private void ValidateStats(bool allNodesVisited, bool completed = false) if (allNodesVisited) { Debug.Assert(total == m_graph.NodeCount); - // TODO FIX NOW enable Debug.Assert(totalSize == m_graph.TotalSize); - Debug.Assert(Math.Abs(totalSize - m_graph.TotalSize) / totalSize < .01); // TODO FIX NOW lame, replace with assert above + // TODO The assert should be Debug.Assert(totalSize == m_graph.TotalSize); + // but we have to give a 1% error margin to get things passing. Fix this. + Debug.Assert(Math.Abs(totalSize - m_graph.TotalSize) / totalSize < .01); } Debug.Assert(sampleTotal == m_newGraph.NodeCount); } diff --git a/src/pal/src/locale/UnicodeData.txt b/src/pal/src/locale/UnicodeData.txt deleted file mode 100644 index a137245b52..0000000000 --- a/src/pal/src/locale/UnicodeData.txt +++ /dev/null @@ -1,12860 +0,0 @@ -0000;;Cc;0;BN;;;;;N;NULL;;;; -0001;;Cc;0;BN;;;;;N;START OF HEADING;;;; -0002;;Cc;0;BN;;;;;N;START OF TEXT;;;; -0003;;Cc;0;BN;;;;;N;END OF TEXT;;;; -0004;;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;; -0005;;Cc;0;BN;;;;;N;ENQUIRY;;;; -0006;;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;; -0007;;Cc;0;BN;;;;;N;BELL;;;; -0008;;Cc;0;BN;;;;;N;BACKSPACE;;;; -0009;;Cc;0;S;;;;;N;HORIZONTAL TABULATION;;;; -000A;;Cc;0;B;;;;;N;LINE FEED;;;; -000B;;Cc;0;S;;;;;N;VERTICAL TABULATION;;;; -000C;;Cc;0;WS;;;;;N;FORM FEED;;;; -000D;;Cc;0;B;;;;;N;CARRIAGE RETURN;;;; -000E;;Cc;0;BN;;;;;N;SHIFT OUT;;;; -000F;;Cc;0;BN;;;;;N;SHIFT IN;;;; -0010;;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;; -0011;;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;; -0012;;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;; -0013;;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;; -0014;;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;; -0015;;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;; -0016;;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;; -0017;;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;; -0018;;Cc;0;BN;;;;;N;CANCEL;;;; -0019;;Cc;0;BN;;;;;N;END OF MEDIUM;;;; -001A;;Cc;0;BN;;;;;N;SUBSTITUTE;;;; -001B;;Cc;0;BN;;;;;N;ESCAPE;;;; -001C;;Cc;0;B;;;;;N;FILE SEPARATOR;;;; -001D;;Cc;0;B;;;;;N;GROUP SEPARATOR;;;; -001E;;Cc;0;B;;;;;N;RECORD SEPARATOR;;;; -001F;;Cc;0;S;;;;;N;UNIT SEPARATOR;;;; -0020;SPACE;Zs;0;WS;;;;;N;;;;; -0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; -0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;; -0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;; -0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;; -0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;; -0026;AMPERSAND;Po;0;ON;;;;;N;;;;; -0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;; -0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; -0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; -002A;ASTERISK;Po;0;ON;;;;;N;;;;; -002B;PLUS SIGN;Sm;0;ET;;;;;N;;;;; -002C;COMMA;Po;0;CS;;;;;N;;;;; -002D;HYPHEN-MINUS;Pd;0;ET;;;;;N;;;;; -002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; -002F;SOLIDUS;Po;0;ES;;;;;N;SLASH;;;; -0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; -0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; -0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; -0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;; -0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;; -0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;; -0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;; -0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; -0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;; -0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;; -003A;COLON;Po;0;CS;;;;;N;;;;; -003B;SEMICOLON;Po;0;ON;;;;;N;;;;; -003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;; -003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;; -003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;; -003F;QUESTION MARK;Po;0;ON;;;;;N;;;;; -0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;; -0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; -0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; -0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; -0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064; -0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065; -0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066; -0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067; -0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068; -0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069; -004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A; -004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B; -004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C; -004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D; -004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E; -004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F; -0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070; -0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071; -0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072; -0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073; -0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074; -0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075; -0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076; -0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077; -0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078; -0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079; -005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A; -005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;; -005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;; -005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;; -005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;; -005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;; -0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;; -0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 -0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 -0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 -0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044 -0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045 -0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046 -0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047 -0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048 -0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049 -006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A -006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B -006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C -006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D -006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E -006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F -0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050 -0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051 -0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052 -0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053 -0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054 -0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055 -0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056 -0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057 -0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058 -0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059 -007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A -007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;; -007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;; -007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;; -007E;TILDE;Sm;0;ON;;;;;N;;;;; -007F;;Cc;0;BN;;;;;N;DELETE;;;; -0080;;Cc;0;BN;;;;;N;;;;; -0081;;Cc;0;BN;;;;;N;;;;; -0082;;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;; -0083;;Cc;0;BN;;;;;N;NO BREAK HERE;;;; -0084;;Cc;0;BN;;;;;N;;;;; -0085;;Cc;0;B;;;;;N;NEXT LINE;;;; -0086;;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;; -0087;;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;; -0088;;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;; -0089;;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;; -008A;;Cc;0;BN;;;;;N;LINE TABULATION SET;;;; -008B;;Cc;0;BN;;;;;N;PARTIAL LINE DOWN;;;; -008C;;Cc;0;BN;;;;;N;PARTIAL LINE UP;;;; -008D;;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;; -008E;;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;; -008F;;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;; -0090;;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;; -0091;;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;; -0092;;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;; -0093;;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;; -0094;;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;; -0095;;Cc;0;BN;;;;;N;MESSAGE WAITING;;;; -0096;;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;; -0097;;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;; -0098;;Cc;0;BN;;;;;N;START OF STRING;;;; -0099;;Cc;0;BN;;;;;N;;;;; -009A;;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;; -009B;;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;; -009C;;Cc;0;BN;;;;;N;STRING TERMINATOR;;;; -009D;;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;; -009E;;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;; -009F;;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;; -00A0;NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;NON-BREAKING SPACE;;;; -00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; -00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;; -00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;; -00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; -00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;; -00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;; -00A7;SECTION SIGN;So;0;ON;;;;;N;;;;; -00A8;DIAERESIS;Sk;0;ON; 0020 0308;;;;N;SPACING DIAERESIS;;;; -00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;; -00AA;FEMININE ORDINAL INDICATOR;Ll;0;L; 0061;;;;N;;;;; -00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;; -00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; -00AD;SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; -00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; -00AF;MACRON;Sk;0;ON; 0020 0304;;;;N;SPACING MACRON;;;; -00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; -00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;; -00B2;SUPERSCRIPT TWO;No;0;EN; 0032;2;2;2;N;SUPERSCRIPT DIGIT TWO;;;; -00B3;SUPERSCRIPT THREE;No;0;EN; 0033;3;3;3;N;SUPERSCRIPT DIGIT THREE;;;; -00B4;ACUTE ACCENT;Sk;0;ON; 0020 0301;;;;N;SPACING ACUTE;;;; -00B5;MICRO SIGN;Ll;0;L; 03BC;;;;N;;;039C;;039C -00B6;PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;; -00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;; -00B8;CEDILLA;Sk;0;ON; 0020 0327;;;;N;SPACING CEDILLA;;;; -00B9;SUPERSCRIPT ONE;No;0;EN; 0031;1;1;1;N;SUPERSCRIPT DIGIT ONE;;;; -00BA;MASCULINE ORDINAL INDICATOR;Ll;0;L; 006F;;;;N;;;;; -00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;*;;; -00BC;VULGAR FRACTION ONE QUARTER;No;0;ON; 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; -00BD;VULGAR FRACTION ONE HALF;No;0;ON; 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; -00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON; 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; -00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; -00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; -00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; -00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; -00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; -00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; -00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5; -00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;ash *;;00E6; -00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7; -00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8; -00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9; -00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA; -00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB; -00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC; -00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED; -00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE; -00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF; -00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;Icelandic;;00F0; -00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1; -00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2; -00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3; -00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4; -00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5; -00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6; -00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; -00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8; -00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9; -00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA; -00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB; -00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC; -00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD; -00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;Icelandic;;00FE; -00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;German;;; -00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0 -00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1 -00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2 -00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3 -00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4 -00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5 -00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;ash *;00C6;;00C6 -00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7 -00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8 -00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9 -00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA -00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB -00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC -00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD -00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE -00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF -00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;Icelandic;00D0;;00D0 -00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1 -00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2 -00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3 -00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4 -00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5 -00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6 -00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;; -00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8 -00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9 -00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA -00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB -00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC -00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD -00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;Icelandic;00DE;;00DE -00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178 -0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101; -0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100 -0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103; -0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102 -0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105; -0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104 -0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107; -0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106 -0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109; -0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108 -010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B; -010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A -010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D; -010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C -010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F; -010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E -0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111; -0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110 -0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113; -0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112 -0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115; -0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114 -0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117; -0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116 -0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119; -0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118 -011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B; -011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A -011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D; -011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C -011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F; -011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E -0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121; -0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120 -0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123; -0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122 -0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125; -0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124 -0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127; -0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126 -0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129; -0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128 -012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B; -012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A -012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D; -012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C -012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F; -012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E -0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; -0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 -0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L; 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133; -0133;LATIN SMALL LIGATURE IJ;Ll;0;L; 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 -0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135; -0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134 -0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137; -0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136 -0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;Greenlandic;;; -0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; -013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139 -013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C; -013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B -013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E; -013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D -013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L; 004C 00B7;;;;N;;;;0140; -0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L; 006C 00B7;;;;N;;;013F;;013F -0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142; -0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141 -0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144; -0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143 -0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146; -0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145 -0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148; -0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 -0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L; 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;; -014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;Sami;;014B; -014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;Sami;014A;;014A -014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D; -014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C -014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F; -014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E -0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151; -0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150 -0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153; -0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152 -0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155; -0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154 -0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157; -0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156 -0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159; -0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158 -015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B; -015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A -015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D; -015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C -015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;*;;015F; -015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;*;015E;;015E -0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161; -0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160 -0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;*;;0163; -0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;*;0162;;0162 -0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165; -0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164 -0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167; -0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166 -0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169; -0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168 -016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B; -016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A -016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D; -016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C -016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F; -016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E -0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171; -0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170 -0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173; -0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172 -0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175; -0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174 -0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177; -0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176 -0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF; -0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A; -017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179 -017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C; -017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B -017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; -017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D -017F;LATIN SMALL LETTER LONG S;Ll;0;L; 0073;;;;N;;;0053;;0053 -0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;;; -0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; -0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; -0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 -0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185; -0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184 -0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254; -0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188; -0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187 -0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;*;;0256; -018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257; -018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C; -018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B -018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;; -018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD; -018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259; -0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B; -0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192; -0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191 -0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260; -0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263; -0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;hwair;01F6;;01F6 -0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269; -0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; -0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; -0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 -019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;;; -019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;; -019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; -019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; -019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;;; -019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;*;;0275; -01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1; -01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0 -01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;gha;;01A3; -01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;gha;01A2;;01A2 -01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5; -01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4 -01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;*;;0280; -01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8; -01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7 -01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283; -01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;; -01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;; -01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD; -01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC -01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288; -01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0; -01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF -01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A; -01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B; -01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4; -01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3 -01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6; -01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5 -01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292; -01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9; -01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8 -01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;; -01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;; -01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD; -01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC -01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;; -01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7 -01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;; -01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;; -01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;; -01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;; -01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L; 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 -01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L; 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6; -01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L; 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 -01C7;LATIN CAPITAL LETTER LJ;Lu;0;L; 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8 -01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L; 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9; -01C9;LATIN SMALL LETTER LJ;Ll;0;L; 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8 -01CA;LATIN CAPITAL LETTER NJ;Lu;0;L; 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB -01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L; 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC; -01CC;LATIN SMALL LETTER NJ;Ll;0;L; 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB -01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE; -01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD -01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0; -01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF -01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2; -01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1 -01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4; -01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3 -01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6; -01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5 -01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8; -01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7 -01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA; -01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9 -01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC; -01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB -01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E -01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF; -01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE -01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1; -01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0 -01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;ash *;;01E3; -01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;ash *;01E2;;01E2 -01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5; -01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4 -01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7; -01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6 -01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9; -01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8 -01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB; -01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA -01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED; -01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC -01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF; -01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE -01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;; -01F1;LATIN CAPITAL LETTER DZ;Lu;0;L; 0044 005A;;;;N;;;;01F3;01F2 -01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L; 0044 007A;;;;N;;;01F1;01F3; -01F3;LATIN SMALL LETTER DZ;Ll;0;L; 0064 007A;;;;N;;;01F1;;01F2 -01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5; -01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4 -01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195; -01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF; -01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9; -01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8 -01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB; -01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA -01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;ash *;;01FD; -01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;ash *;01FC;;01FC -01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF; -01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE -0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201; -0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200 -0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203; -0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202 -0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205; -0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204 -0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207; -0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206 -0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209; -0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208 -020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B; -020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A -020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D; -020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C -020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F; -020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E -0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211; -0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210 -0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213; -0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212 -0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215; -0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214 -0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217; -0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216 -0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;*;;0219; -0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;*;0218;;0218 -021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;*;;021B; -021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;*;021A;;021A -021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D; -021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C -021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F; -021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E -0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223; -0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222 -0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225; -0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224 -0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227; -0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226 -0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229; -0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228 -022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B; -022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A -022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D; -022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C -022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F; -022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E -0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231; -0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230 -0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233; -0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232 -0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;;; -0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;;; -0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;;; -0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 -0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 -0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;; -0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189 -0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A -0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;; -0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F -025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;; -025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190 -025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;;; -025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;; -025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;; -025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;; -0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193 -0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;;; -0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;; -0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194 -0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;; -0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;;; -0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;;; -0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;; -0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 -0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 -026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;; -026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;;; -026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; -026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; -026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C -0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; -0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;;; -0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D -0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; -0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; -0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F -0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; -0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; -0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; -0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; -027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; -027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; -027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; -027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;;; -027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; -027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; -0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;*;01A6;;01A6 -0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;; -0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;; -0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9 -0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;; -0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;; -0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; -0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;;; -0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE -0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;;; -028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 -028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 -028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;;; -028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; -028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; -028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; -0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;; -0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; -0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 -0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; -0294;LATIN LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;;; -0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; -0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; -0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; -0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;; -0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;; -029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; -029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; -029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; -029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;; -029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;;; -029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; -02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; -02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;; -02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;; -02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;; -02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;; -02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;; -02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;; -02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;; -02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;; -02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;; -02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;; -02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; -02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; -02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; -02B0;MODIFIER LETTER SMALL H;Lm;0;L; 0068;;;;N;;;;; -02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L; 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; -02B2;MODIFIER LETTER SMALL J;Lm;0;L; 006A;;;;N;;;;; -02B3;MODIFIER LETTER SMALL R;Lm;0;L; 0072;;;;N;;;;; -02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L; 0279;;;;N;;;;; -02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L; 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;; -02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L; 0281;;;;N;;;;; -02B7;MODIFIER LETTER SMALL W;Lm;0;L; 0077;;;;N;;;;; -02B8;MODIFIER LETTER SMALL Y;Lm;0;L; 0079;;;;N;;;;; -02B9;MODIFIER LETTER PRIME;Sk;0;ON;;;;;N;;;;; -02BA;MODIFIER LETTER DOUBLE PRIME;Sk;0;ON;;;;;N;;;;; -02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;; -02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;; -02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;; -02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;; -02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; -02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;; -02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;; -02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; -02C7;CARON;Sk;0;ON;;;;;N;MODIFIER LETTER HACEK;Mandarin Chinese third tone;;; -02C8;MODIFIER LETTER VERTICAL LINE;Sk;0;ON;;;;;N;;;;; -02C9;MODIFIER LETTER MACRON;Sk;0;ON;;;;;N;;Mandarin Chinese first tone;;; -02CA;MODIFIER LETTER ACUTE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER ACUTE;Mandarin Chinese second tone;;; -02CB;MODIFIER LETTER GRAVE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER GRAVE;Mandarin Chinese fourth tone;;; -02CC;MODIFIER LETTER LOW VERTICAL LINE;Sk;0;ON;;;;;N;;;;; -02CD;MODIFIER LETTER LOW MACRON;Sk;0;ON;;;;;N;;;;; -02CE;MODIFIER LETTER LOW GRAVE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; -02CF;MODIFIER LETTER LOW ACUTE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;; -02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; -02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; -02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;; -02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;; -02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;; -02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;; -02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;; -02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;; -02D8;BREVE;Sk;0;ON; 0020 0306;;;;N;SPACING BREVE;;;; -02D9;DOT ABOVE;Sk;0;ON; 0020 0307;;;;N;SPACING DOT ABOVE;Mandarin Chinese light tone;;; -02DA;RING ABOVE;Sk;0;ON; 0020 030A;;;;N;SPACING RING ABOVE;;;; -02DB;OGONEK;Sk;0;ON; 0020 0328;;;;N;SPACING OGONEK;;;; -02DC;SMALL TILDE;Sk;0;ON; 0020 0303;;;;N;SPACING TILDE;;;; -02DD;DOUBLE ACUTE ACCENT;Sk;0;ON; 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;; -02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;; -02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;; -02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L; 0263;;;;N;;;;; -02E1;MODIFIER LETTER SMALL L;Lm;0;L; 006C;;;;N;;;;; -02E2;MODIFIER LETTER SMALL S;Lm;0;L; 0073;;;;N;;;;; -02E3;MODIFIER LETTER SMALL X;Lm;0;L; 0078;;;;N;;;;; -02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L; 0295;;;;N;;;;; -02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; -02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; -02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;; -02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;; -02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; -02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; -02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; -02EC;MODIFIER LETTER VOICING;Sk;0;ON;;;;;N;;;;; -02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; -02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; -0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;Varia;;; -0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;Oxia;;; -0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;; -0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;; -0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;; -0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;; -0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;Vrachy;;; -0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;; -0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;Dialytika;;; -0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;; -030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;; -030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;; -030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;; -030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;Tonos;;; -030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;; -030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;; -0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;; -0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;; -0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;; -0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;Psili;;; -0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;Dasia;;; -0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;; -0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;; -0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;; -0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;; -0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;; -031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;; -031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;; -031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;; -031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;; -031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;; -031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;; -0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;; -0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;; -0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;; -0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;; -0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;; -0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; -0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;; -0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; -0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;; -0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;; -032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;; -032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;; -032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;; -032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;; -032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;; -032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;; -0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;; -0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;; -0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;; -0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;; -0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;; -0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;; -0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;; -0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;; -0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;; -0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;; -033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;; -033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;; -033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;; -033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;; -033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;; -033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;; -0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;Vietnamese;;; -0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;Vietnamese;;; -0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;; -0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;; -0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;; -0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399 -0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; -0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; -0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;; -0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;; -034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;; -034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;; -034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;; -034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; -034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;; -0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;; -0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;; -0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;; -0374;GREEK NUMERAL SIGN;Sk;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;; -0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;Aristeri keraia;;; -037A;GREEK YPOGEGRAMMENI;Lm;0;L; 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; -037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;Erotimatiko;;; -0384;GREEK TONOS;Sk;0;ON; 0020 0301;;;;N;GREEK SPACING TONOS;;;; -0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; -0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC; -0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;; -0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD; -0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE; -038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF; -038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC; -038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD; -038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE; -0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;; -0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1; -0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2; -0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3; -0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4; -0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5; -0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6; -0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7; -0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; -0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9; -039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA; -039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB; -039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC; -039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD; -039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE; -039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF; -03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0; -03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; -03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; -03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4; -03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5; -03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6; -03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7; -03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8; -03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9; -03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA; -03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB; -03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386 -03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388 -03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389 -03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A -03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;; -03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391 -03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392 -03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393 -03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394 -03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395 -03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396 -03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397 -03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 -03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399 -03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A -03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B -03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C -03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D -03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E -03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F -03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0 -03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 -03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 -03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 -03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4 -03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5 -03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6 -03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7 -03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8 -03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9 -03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA -03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB -03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C -03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E -03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F -03D0;GREEK BETA SYMBOL;Ll;0;L; 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 -03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 -03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L; 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; -03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;; -03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; -03D5;GREEK PHI SYMBOL;Ll;0;L; 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 -03D6;GREEK PI SYMBOL;Ll;0;L; 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 -03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;;; -03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; -03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA -03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD; -03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC -03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF; -03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE -03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1; -03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0 -03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3; -03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2 -03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5; -03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4 -03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7; -03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6 -03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9; -03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8 -03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB; -03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA -03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED; -03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC -03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF; -03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE -03F0;GREEK KAPPA SYMBOL;Ll;0;L; 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A -03F1;GREEK RHO SYMBOL;Ll;0;L; 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1 -03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L; 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03A3;;03A3 -03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;;; -03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8; -03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L; 03B5;;;;N;;;0395;;0395 -0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; -0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; -0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;Serbocroatian;;0452; -0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453; -0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454; -0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455; -0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456; -0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;Ukrainian;;0457; -0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458; -0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459; -040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A; -040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;Serbocroatian;;045B; -040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C; -040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D; -040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;Byelorussian;;045E; -040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F; -0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430; -0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431; -0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432; -0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433; -0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434; -0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435; -0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436; -0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437; -0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438; -0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439; -041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A; -041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B; -041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C; -041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D; -041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E; -041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F; -0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440; -0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441; -0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442; -0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443; -0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444; -0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445; -0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446; -0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447; -0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448; -0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449; -042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A; -042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B; -042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C; -042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D; -042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E; -042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F; -0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410 -0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411 -0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412 -0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413 -0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414 -0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415 -0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416 -0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417 -0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418 -0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419 -043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A -043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B -043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C -043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D -043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E -043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F -0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420 -0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421 -0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422 -0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423 -0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424 -0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425 -0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426 -0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427 -0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428 -0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429 -044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A -044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B -044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C -044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D -044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E -044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F -0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400 -0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401 -0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;Serbocroatian;0402;;0402 -0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403 -0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404 -0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 -0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406 -0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;Ukrainian;0407;;0407 -0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408 -0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409 -045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A -045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;Serbocroatian;040B;;040B -045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C -045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D -045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;Byelorussian;040E;;040E -045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F -0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461; -0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460 -0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463; -0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462 -0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465; -0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464 -0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467; -0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466 -0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469; -0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468 -046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B; -046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A -046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D; -046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C -046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F; -046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E -0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471; -0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470 -0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473; -0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472 -0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475; -0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474 -0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477; -0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476 -0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479; -0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478 -047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B; -047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A -047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D; -047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C -047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F; -047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E -0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481; -0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480 -0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;; -0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;; -0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; -0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; -0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; -0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; -0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; -048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D; -048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C -048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F; -048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E -0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491; -0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490 -0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493; -0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492 -0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495; -0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494 -0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497; -0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496 -0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499; -0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498 -049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B; -049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A -049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D; -049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C -049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F; -049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E -04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1; -04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0 -04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3; -04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2 -04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5; -04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4 -04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;Abkhasian;;04A7; -04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;Abkhasian;04A6;;04A6 -04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9; -04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8 -04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB; -04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA -04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD; -04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC -04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF; -04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE -04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1; -04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0 -04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3; -04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2 -04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;Abkhasian;;04B5; -04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;Abkhasian;04B4;;04B4 -04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7; -04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6 -04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9; -04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8 -04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB; -04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA -04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD; -04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC -04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; -04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE -04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;; -04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; -04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 -04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; -04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3 -04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8; -04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7 -04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC; -04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB -04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; -04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 -04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; -04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2 -04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5; -04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4 -04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7; -04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6 -04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9; -04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8 -04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB; -04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA -04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD; -04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC -04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF; -04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE -04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1; -04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0 -04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3; -04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2 -04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5; -04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4 -04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7; -04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6 -04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9; -04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8 -04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB; -04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA -04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED; -04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC -04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF; -04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE -04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1; -04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0 -04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3; -04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 -04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; -04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 -04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; -04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 -0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; -0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; -0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; -0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564; -0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565; -0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566; -0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567; -0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568; -0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569; -053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A; -053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B; -053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C; -053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D; -053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E; -053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F; -0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570; -0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571; -0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572; -0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573; -0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574; -0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575; -0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576; -0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577; -0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578; -0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579; -054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A; -054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B; -054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C; -054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D; -054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E; -054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F; -0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580; -0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581; -0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582; -0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583; -0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; -0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; -0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; -0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; -055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; -055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; -055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;; -055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;; -055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;; -055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;; -0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531 -0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532 -0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533 -0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534 -0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535 -0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536 -0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537 -0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538 -0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539 -056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A -056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B -056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C -056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D -056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E -056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F -0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540 -0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541 -0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542 -0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543 -0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544 -0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545 -0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546 -0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547 -0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548 -0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549 -057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A -057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B -057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C -057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D -057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E -057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F -0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550 -0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551 -0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552 -0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553 -0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554 -0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555 -0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556 -0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L; 0565 0582;;;;N;;;;; -0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; -058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; -0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;; -0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;; -0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;; -0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;; -0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;; -0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;*;;; -0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;; -0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;*;;; -0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;; -059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;; -059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;; -059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;; -059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;; -059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;; -059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; -05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; -05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; -05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; -05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; -05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;*;;; -05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;; -05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;; -05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;*;;; -05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;; -05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;*;;; -05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;; -05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;; -05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;; -05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;; -05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;; -05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;; -05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;; -05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;; -05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;; -05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;; -05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;; -05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;; -05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; -05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; -05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; -05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; -05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;or shuruq;;; -05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;*;;; -05BE;HEBREW PUNCTUATION MAQAF;Po;0;R;;;;;N;;;;; -05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; -05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;*;;; -05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; -05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; -05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;*;;; -05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; -05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; -05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; -05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; -05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;; -05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;; -05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;; -05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;; -05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;; -05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;; -05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;; -05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;; -05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;; -05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; -05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;; -05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; -05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;; -05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;; -05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;; -05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;; -05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;; -05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;; -05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;; -05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;; -05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;; -05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;; -05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;; -05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;; -05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; -05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; -05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; -060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; -061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; -061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; -0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; -0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; -0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;; -0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;; -0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;; -0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;; -0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;; -0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;; -0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;; -062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;; -062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;; -062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;; -062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;; -062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;; -062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;; -0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;; -0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;; -0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; -0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;; -0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;; -0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;; -0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;; -0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;; -0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; -0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; -063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; -0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; -0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; -0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; -0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;; -0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;; -0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;; -0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;; -0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;; -0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;; -0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;; -064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;; -064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;; -064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;; -064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;; -064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;; -064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;; -0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;; -0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;; -0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;; -0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;; -0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;; -0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; -0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; -0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; -0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; -0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; -0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; -0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; -0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; -0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; -0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; -0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; -066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;; -066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;; -066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;; -066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;; -0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;; -0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;; -0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;; -0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;; -0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;; -0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL; 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;; -0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL; 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;; -0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL; 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;; -0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL; 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;; -0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;; -067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;; -067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;; -067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;; -067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;; -067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;; -067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;; -0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;; -0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;; -0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;; -0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;; -0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;; -0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;; -0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;; -0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;; -0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;; -0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;; -068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; -068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;; -068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;; -068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;; -068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;; -0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;; -0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;; -0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;; -0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;; -0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;; -0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;; -0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;; -0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;; -0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;; -069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; -069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; -069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; -069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;; -06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;; -06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;; -06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;; -06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;; -06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;; -06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;; -06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;; -06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;; -06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;; -06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;; -06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;; -06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;*;;; -06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;; -06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;; -06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; -06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;; -06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;; -06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; -06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;; -06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;; -06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;; -06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;; -06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;; -06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;; -06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;; -06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;; -06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;; -06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;; -06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;; -06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;; -06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;; -06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;; -06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;; -06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;; -06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;; -06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;; -06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;*;;; -06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;; -06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;; -06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;; -06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;; -06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;; -06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; -06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; -06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;; -06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;; -06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; -06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; -06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; -06DD;ARABIC END OF AYAH;Me;0;NSM;;;;;N;;;;; -06DE;ARABIC START OF RUB EL HIZB;Me;0;NSM;;;;;N;;;;; -06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; -06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; -06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;; -06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;; -06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;; -06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;; -06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;; -06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;; -06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;; -06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;; -06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;; -06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;; -06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;; -06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;; -06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;; -06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;; -06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;; -06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;; -06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;; -06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;; -06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;; -06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;; -06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;; -06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;; -06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;; -06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;; -06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;; -0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;; -0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;; -0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;; -0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;; -0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;; -0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;; -0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; -0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; -0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; -0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; -070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;; -070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;; -070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;; -070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;; -070F;SYRIAC ABBREVIATION MARK;Cf;0;BN;;;;;N;;;;; -0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;; -0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;; -0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;; -0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;; -0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;; -0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;; -0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;; -0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;; -0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;; -0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; -071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;; -071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;; -071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;; -071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;; -071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;; -071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;; -0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;; -0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;; -0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;; -0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;; -0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;; -0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;; -0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;; -0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;; -0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;; -0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;; -072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;; -072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;; -072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;; -0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;; -0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;; -0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;; -0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;; -0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;; -0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;; -0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;; -0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;; -0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;; -0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;; -073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;; -073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;; -073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;; -073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;; -073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;; -073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;; -0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;; -0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;; -0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;; -0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; -0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;; -0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; -0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; -0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;; -0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;; -0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;; -074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;; -0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; -0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; -0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; -0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;; -0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;; -0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;; -0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;; -0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;; -0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;; -0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;; -078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;; -078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;; -078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;; -078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;; -078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;; -078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;; -0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;; -0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;; -0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;; -0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;; -0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;; -0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;; -0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;; -0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;; -0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;; -0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;; -079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;; -079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;; -079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;; -079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;; -079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;; -079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;; -07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;; -07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;; -07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;; -07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;; -07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;; -07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;; -07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;; -07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;; -07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;; -07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;; -07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;; -07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;; -07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;; -07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;; -07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;; -07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; -07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; -0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;; -0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;; -0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;; -0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;; -0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;; -090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;; -090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;; -090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;; -090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;; -0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;; -0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;; -0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;; -0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;; -0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;; -0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;; -0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; -0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;; -0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; -0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; -091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;; -091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; -091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;; -091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; -091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; -091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; -0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; -0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; -0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; -0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; -0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;; -0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;; -0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;; -0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; -0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;; -0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;; -092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;; -092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; -092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;; -092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; -092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;; -092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;; -0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;; -0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;; -0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;; -0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; -0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;; -0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;; -0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; -0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; -0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;; -0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;; -093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; -0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; -0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; -094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; -094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;; -0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;; -0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;; -0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; -0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; -0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;; -0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;; -095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;; -095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;; -095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;; -095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;; -095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;; -095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;; -0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;; -0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; -0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;; -0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;; -0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;; -0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;; -0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;; -098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;; -098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;; -0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;; -0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;; -0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;; -0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;; -0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;; -0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;; -0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;; -0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;; -099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;; -099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;; -099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;; -099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;; -099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;; -099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;; -09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;; -09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;; -09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;; -09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;; -09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;; -09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;; -09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;; -09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;; -09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;; -09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;; -09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;; -09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;; -09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;; -09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;; -09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;; -09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;; -09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;; -09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;; -09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;; -09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;; -09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;; -09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; -09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; -09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; -09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; -09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; -09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;; -09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;Assamese;;; -09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;Assamese;;; -09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;; -09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; -09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1;N;;;;; -09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;2;N;;;;; -09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3;N;;;;; -09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;4;N;;;;; -09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;;N;;;;; -09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; -09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; -0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; -0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;; -0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;; -0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;; -0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;; -0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;; -0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;; -0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;; -0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;; -0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;; -0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;; -0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;; -0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;; -0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;; -0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;; -0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;; -0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;; -0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;; -0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;; -0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;; -0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;; -0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;; -0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;; -0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;; -0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;; -0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;; -0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;; -0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;; -0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;; -0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;; -0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;; -0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;; -0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;; -0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;; -0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;; -0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;; -0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;; -0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;; -0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;; -0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;; -0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;; -0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;; -0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;; -0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;; -0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; -0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; -0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; -0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; -0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; -0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;; -0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;; -0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;; -0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;; -0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; -0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; -0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; -0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;; -0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;; -0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;; -0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;; -0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;; -0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;; -0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;; -0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;; -0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;; -0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;; -0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;; -0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;; -0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;; -0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;; -0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;; -0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;; -0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;; -0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;; -0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;; -0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;; -0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;; -0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;; -0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;; -0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;; -0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;; -0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;; -0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;; -0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;; -0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;; -0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;; -0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;; -0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;; -0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;; -0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;; -0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;; -0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;; -0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;; -0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;; -0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;; -0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;; -0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;; -0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;; -0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;; -0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;; -0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;; -0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;; -0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; -0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; -0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;; -0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;; -0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;; -0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;; -0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;; -0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;; -0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;; -0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;; -0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;; -0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;; -0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;; -0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;; -0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;; -0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;; -0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;; -0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;; -0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;; -0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;; -0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;; -0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;; -0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;; -0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;; -0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;; -0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;; -0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;; -0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;; -0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;; -0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;; -0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;; -0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;; -0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;; -0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;; -0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;; -0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;; -0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;; -0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;; -0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;; -0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;; -0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;; -0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;; -0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;; -0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;; -0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;; -0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;; -0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; -0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; -0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;; -0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;; -0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; -0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;; -0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;; -0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; -0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;; -0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -0B83;TAMIL SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;; -0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;; -0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;; -0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;; -0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;; -0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;; -0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;; -0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;; -0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;; -0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;; -0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;; -0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;; -0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;; -0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;; -0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;; -0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;; -0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;; -0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;; -0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;; -0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;; -0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;; -0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;; -0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;; -0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;; -0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;; -0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;; -0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;; -0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;; -0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; -0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; -0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; -0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; -0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; -0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; -0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; -0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;; -0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; -0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; -0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; -0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;; -0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; -0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; -0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; -0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;; -0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;; -0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;; -0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;; -0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;; -0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;; -0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;; -0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;; -0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;; -0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;; -0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;; -0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;; -0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;; -0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;; -0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;; -0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;; -0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;; -0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;; -0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;; -0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;; -0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;; -0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;; -0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;; -0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;; -0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;; -0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;; -0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;; -0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;; -0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;; -0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;; -0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;; -0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;; -0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;; -0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;; -0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;; -0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;; -0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;; -0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;; -0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;; -0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;; -0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;; -0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;; -0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;; -0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;; -0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; -0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; -0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; -0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; -0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; -0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; -0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; -0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;; -0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; -0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; -0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; -0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; -0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;; -0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;; -0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;; -0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;; -0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;; -0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;; -0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;; -0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;; -0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;; -0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;; -0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;; -0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;; -0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;; -0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;; -0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;; -0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;; -0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;; -0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;; -0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;; -0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;; -0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;; -0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;; -0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;; -0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;; -0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;; -0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;; -0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;; -0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;; -0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;; -0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;; -0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;; -0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;; -0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;; -0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;; -0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;; -0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;; -0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;; -0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;; -0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;; -0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;; -0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;; -0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;; -0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;; -0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;; -0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;; -0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;; -0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0CBF;KANNADA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;; -0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; -0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; -0CC6;KANNADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;; -0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;; -0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;; -0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;; -0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;; -0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;; -0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; -0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; -0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;; -0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;; -0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;; -0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;; -0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;; -0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;; -0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;; -0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;; -0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;; -0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;; -0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;; -0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;; -0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;; -0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;; -0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;; -0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;; -0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;; -0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;; -0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;; -0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;; -0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;; -0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;; -0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;; -0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;; -0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;; -0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;; -0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;; -0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;; -0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;; -0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;; -0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;; -0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;; -0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;; -0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;; -0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;; -0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;; -0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;; -0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;; -0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;; -0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;; -0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;; -0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;; -0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;; -0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;; -0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; -0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; -0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; -0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; -0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; -0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;; -0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;; -0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; -0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; -0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; -0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; -0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;; -0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;; -0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;; -0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;; -0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;; -0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;; -0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;; -0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;; -0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;; -0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;; -0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;; -0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;; -0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;; -0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;; -0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;; -0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;; -0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;; -0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; -0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; -0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; -0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; -0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; -0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;; -0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; -0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; -0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; -0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; -0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; -0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;; -0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;; -0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; -0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; -0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; -0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; -0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;; -0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;; -0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; -0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; -0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; -0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; -0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;; -0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;; -0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; -0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; -0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; -0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; -0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;; -0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;; -0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;; -0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;; -0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;; -0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;; -0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;; -0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;; -0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;; -0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;; -0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;; -0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;; -0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;; -0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;; -0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;; -0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;; -0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;; -0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;; -0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;; -0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;; -0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;; -0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;; -0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;; -0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;; -0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;; -0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;; -0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;; -0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;; -0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;; -0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;; -0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;; -0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;; -0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;; -0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;; -0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;; -0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;; -0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;; -0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;; -0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;; -0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;; -0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;; -0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;; -0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;; -0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;; -0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;; -0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;; -0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;; -0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;; -0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;; -0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;; -0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;; -0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;; -0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;; -0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;; -0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;; -0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;; -0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;; -0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;; -0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;; -0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;; -0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;; -0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;; -0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;; -0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;; -0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;; -0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;; -0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;; -0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;; -0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;; -0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;; -0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;; -0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;; -0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;; -0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;; -0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;; -0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;; -0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;; -0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;paiyan noi;;; -0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;; -0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;; -0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;; -0E33;THAI CHARACTER SARA AM;Lo;0;L; 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;; -0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;; -0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;; -0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;; -0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;sara uue;;; -0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;; -0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;; -0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;; -0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;; -0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;; -0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;; -0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;; -0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;sara ai mai muan;;; -0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;sara ai mai malai;;; -0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;lakkhang yao;;; -0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;mai yamok;;; -0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;mai taikhu;;; -0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;; -0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;; -0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;; -0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;; -0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;; -0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;nikkhahit;;; -0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;; -0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;; -0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;; -0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;; -0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;; -0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;; -0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;; -0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;; -0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;; -0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;; -0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;; -0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;; -0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;; -0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;; -0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;; -0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;; -0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;; -0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;; -0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;; -0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;; -0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;; -0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;; -0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;; -0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;; -0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;; -0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;; -0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;; -0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;; -0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;; -0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;; -0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;; -0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;; -0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;; -0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;; -0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; -0EB3;LAO VOWEL SIGN AM;Lo;0;L; 0ECD 0EB2;;;;N;;;;; -0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; -0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; -0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;; -0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;; -0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;; -0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;; -0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;; -0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;; -0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;; -0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;; -0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; -0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;; -0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;; -0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;; -0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;; -0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;; -0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;; -0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;; -0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;; -0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0EDC;LAO HO NO;Lo;0;L; 0EAB 0E99;;;;N;;;;; -0EDD;LAO HO MO;Lo;0;L; 0EAB 0EA1;;;;N;;;;; -0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;; -0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;ter yik go a thung;;; -0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;ter yik go wum nam chey ma;;; -0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;ter yik go wum ter tsek ma;;; -0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;yik go dun ma;;; -0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;yik go kab ma;;; -0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;yik go pur shey ma;;; -0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;yik go tsek shey ma;;; -0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;drul shey;;; -0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;kur yik go;;; -0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;ka sho yik go;;; -0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;tsek;;; -0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L; 0F0B;;;;N;;tsek tar;;; -0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;shey;;; -0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;nyi shey;;; -0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;tsek shey;;; -0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;nyi tsek shey;;; -0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;rinchen pung shey;;; -0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;gya tram shey;;; -0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;dzu ta me long chen;;; -0F14;TIBETAN MARK GTER TSHEG;So;0;L;;;;;N;TIBETAN COMMA;ter tsek;;; -0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;che ta;;; -0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;hlak ta;;; -0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;trachen char ta;;; -0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;kyu pa;;; -0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;dong tsu;;; -0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;deka chig;;; -0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;deka nyi;;; -0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;deka sum;;; -0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;dena chig;;; -0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;dena nyi;;; -0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;deka dena;;; -0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;; -0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;; -0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;; -0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;; -0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;; -0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;; -0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;; -0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;; -0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;; -0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;; -0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;du ta;;; -0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;nge zung nyi da;;; -0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;dzu ta shi mig chen;;; -0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;nge zung gor ta;;; -0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;che go;;; -0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;tsa tru;;; -0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;N;;gug ta yun;;; -0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;N;;gug ta ye;;; -0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;N;TIBETAN LEFT BRACE;ang kang yun;;; -0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;N;TIBETAN RIGHT BRACE;ang kang ye;;; -0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;yar tse;;; -0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;mar tse;;; -0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; -0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;; -0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;; -0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;; -0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;; -0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;; -0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;; -0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;; -0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;; -0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;; -0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;; -0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;; -0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;; -0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;; -0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;; -0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;; -0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;; -0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;; -0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;; -0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;; -0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;; -0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;; -0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;; -0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;; -0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;; -0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;; -0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;; -0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;; -0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;; -0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;; -0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;; -0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;; -0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;; -0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;*;;; -0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;; -0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;; -0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;; -0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;; -0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;; -0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; -0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; -0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;*;;; -0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; -0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; -0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; -0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;; -0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;; -0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;; -0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM; 0FB2 0F81;;;;N;;;;; -0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;; -0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM; 0FB3 0F81;;;;N;;;;; -0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;; -0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;; -0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;; -0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;; -0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;je su nga ro;;; -0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;nam chey;;; -0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;; -0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;; -0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;nyi da na da;;; -0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;nan de;;; -0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;; -0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;; -0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;ji ta;;; -0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;yang ta;;; -0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;che tsa chen;;; -0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;chu chen;;; -0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;tru chen ging;;; -0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;tru me ging;;; -0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; -0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; -0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; -0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;; -0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; -0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; -0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; -0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; -0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; -0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;; -0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;; -0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;; -0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;; -0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;; -0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; -0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; -0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; -0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;; -0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; -0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; -0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; -0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; -0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;; -0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; -0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; -0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; -0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; -0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;; -0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;*;;; -0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; -0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; -0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;; -0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;*;;; -0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;*;;; -0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; -0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; -0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;; -0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; -0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; -0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; -0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;; -0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;*;;; -0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;*;;; -0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;*;;; -0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;kuruka;;; -0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;kuruka shi mik chen;;; -0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;; -0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;; -0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;chang tyu;;; -0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;bub chey;;; -0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;drilbu;;; -0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;dorje;;; -0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;pema den;;; -0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;dorje gya dram;;; -0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;phurba;;; -0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;norbu;;; -0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;; -0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;; -0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;; -0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;dena sum;;; -1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; -1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; -1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; -1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;; -1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;; -1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;; -1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;; -1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;; -1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;; -1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;; -100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;; -100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;; -100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;; -100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;; -100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;; -100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;; -1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;; -1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;; -1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;; -1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;; -1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;; -1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;; -1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;; -1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;; -1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;; -1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;; -101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;; -101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;; -101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;; -101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;; -101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;; -101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; -1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; -1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; -1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; -1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; -1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; -1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; -1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; -1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; -102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; -102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; -1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; -1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;; -104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;; -104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;; -104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;; -104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;; -104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;; -1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;; -1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;; -1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; -1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; -1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;; -10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;; -10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;; -10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;; -10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;; -10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;; -10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;; -10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;; -10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;; -10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;; -10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;; -10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;; -10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;; -10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;; -10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;; -10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;; -10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;; -10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;; -10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;; -10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;; -10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;; -10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;; -10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;; -10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;; -10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;; -10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;; -10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;; -10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;; -10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;; -10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;; -10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;; -10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;; -10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;; -10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;; -10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;; -10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;; -10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;; -10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;; -10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;; -10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;; -10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;; -10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;; -10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;; -10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;; -10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;; -10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;; -10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;; -10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;; -10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;; -10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;; -10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;; -10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;; -10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;; -10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;; -10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;; -10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;; -10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;; -10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;; -10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;; -10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;; -10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;; -10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;; -10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;; -10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;; -10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;; -10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;; -10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;; -10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;; -10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;; -10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;; -10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;; -10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;; -10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;; -10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; -1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;; -1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;; -1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;n *;;; -1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;; -1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;dd *;;; -1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;r *;;; -1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;m *;;; -1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;b *;;; -1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;bb *;;; -1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;s *;;; -110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;; -110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;; -110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;j *;;; -110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;jj *;;; -110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;; -110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;; -1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;; -1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;; -1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;h *;;; -1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; -1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; -1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; -1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;; -1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; -1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; -1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; -111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; -111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; -111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; -111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; -111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; -111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;; -1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; -1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; -1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; -1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;; -1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;; -1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;; -1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; -1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; -1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;; -112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; -112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;; -112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;; -112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; -1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; -1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; -1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; -1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; -1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;; -1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;; -1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; -1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; -1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;; -1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; -113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;; -113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; -113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;; -113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; -113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;; -113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; -1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;; -1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; -1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;; -1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;; -1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;; -1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;; -1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; -1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; -1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;; -1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;; -114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;; -114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;; -114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; -114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;; -114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;; -114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; -1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;; -1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; -1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;; -1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;; -1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;; -1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;; -1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; -1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; -1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;; -1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; -115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;; -1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;; -1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; -1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;; -1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;; -1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;; -1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;; -1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;; -1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;; -1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;; -1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;; -116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;; -116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;; -116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;; -116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;; -116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;; -116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;; -1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;; -1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;; -1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;; -1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;; -1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;; -1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;; -1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;; -1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;; -1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;; -1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;; -117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;; -117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;; -117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;; -117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;; -117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;; -117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;; -1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;; -1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;; -1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;; -1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;; -1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;; -1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;; -1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;; -1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;; -1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;; -1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;; -118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;; -118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;; -118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;; -118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;; -118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;; -118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;; -1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;; -1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;; -1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;; -1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;; -1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;; -1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;; -1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;; -1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;; -1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;; -1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;; -119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;; -119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;; -119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;; -119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;; -119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;; -119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;; -11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;; -11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;; -11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;; -11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;; -11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;; -11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;gs *;;; -11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;n *;;; -11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;nj *;;; -11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;nh *;;; -11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;; -11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;l *;;; -11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;lg *;;; -11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;lm *;;; -11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;lb *;;; -11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;ls *;;; -11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;lt *;;; -11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;lp *;;; -11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;lh *;;; -11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;m *;;; -11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;b *;;; -11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;bs *;;; -11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;s *;;; -11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;; -11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;ng *;;; -11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;j *;;; -11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;; -11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;; -11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;; -11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;; -11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;h *;;; -11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;; -11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; -11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; -11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; -11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;; -11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;; -11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; -11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; -11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; -11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; -11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; -11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;; -11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; -11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; -11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;; -11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; -11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; -11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;; -11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;; -11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; -11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;; -11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; -11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;; -11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; -11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; -11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;; -11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;; -11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;; -11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; -11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; -11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;; -11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; -11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; -11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; -11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; -11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; -11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;; -11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; -11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; -11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; -11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;; -11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; -11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;; -11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; -11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; -11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; -11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;; -11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;; -11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;; -11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;; -11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; -1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;; -1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;; -1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;; -1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;; -1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; -1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; -1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; -1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; -1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; -120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; -120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;; -120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;; -120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;; -120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;; -120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;; -1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;; -1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;; -1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;; -1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;; -1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;; -1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;; -1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;; -1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;; -1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;; -1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;; -121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;; -121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;; -121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;; -121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;; -121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;; -121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;; -1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;; -1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;; -1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;; -1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;; -1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;; -1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;; -1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;; -1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;; -1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;; -1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;; -122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;; -122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;; -122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;; -122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;; -122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;; -122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;; -1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;; -1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;; -1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;; -1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;; -1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;; -1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;; -1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;; -1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;; -1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;; -1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;; -123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;; -123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;; -123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; -123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;; -123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;; -123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;; -1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;; -1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;; -1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;; -1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;; -1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; -1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; -1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; -1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; -124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; -124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; -124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;; -124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;; -1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;; -1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;; -1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;; -1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;; -1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;; -1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;; -1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;; -1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;; -125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;; -125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;; -125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;; -125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;; -1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;; -1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;; -1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;; -1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;; -1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;; -1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;; -1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;; -1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;; -1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;; -1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;; -126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;; -126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;; -126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;; -126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;; -126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;; -126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;; -1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;; -1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;; -1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;; -1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;; -1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;; -1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;; -1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;; -1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;; -1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;; -1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;; -127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;; -127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;; -127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;; -127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;; -127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;; -127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;; -1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;; -1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;; -1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;; -1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;; -1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; -1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; -1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; -1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; -128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; -128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; -128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;; -128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;; -1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;; -1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;; -1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;; -1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;; -1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;; -1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;; -1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;; -1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;; -1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;; -1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;; -129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;; -129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;; -129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; -129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;; -129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;; -129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;; -12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;; -12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;; -12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;; -12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;; -12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;; -12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;; -12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;; -12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;; -12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;; -12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;; -12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;; -12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;; -12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; -12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; -12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; -12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; -12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; -12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; -12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;; -12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;; -12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;; -12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;; -12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;; -12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;; -12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;; -12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;; -12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;; -12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;; -12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;; -12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;; -12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;; -12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;; -12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;; -12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;; -12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;; -12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;; -12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; -12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; -12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; -12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; -12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; -12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; -12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;; -12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;; -12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;; -12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;; -12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;; -12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;; -12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;; -12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;; -12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; -12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;; -12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;; -12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;; -12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; -12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; -12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; -12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;; -12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; -12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; -12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; -12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;; -12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;; -12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;; -12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;; -12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;; -12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; -12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; -12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; -12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; -12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; -12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; -12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;; -12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;; -12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;; -12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;; -12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;; -12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;; -12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;; -12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;; -12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;; -12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;; -12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;; -12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;; -12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;; -1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;; -1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;; -1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;; -1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;; -1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;; -1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;; -1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;; -1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;; -1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;; -1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;; -130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;; -130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;; -130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; -130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; -130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; -1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; -1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; -1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; -1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;; -1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;; -1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;; -1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;; -131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;; -131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;; -131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; -131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; -131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; -1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; -1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; -1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; -1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;; -1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;; -1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;; -1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;; -1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;; -1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;; -1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;; -132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;; -132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;; -132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;; -132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;; -132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;; -132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;; -1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;; -1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;; -1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;; -1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;; -1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;; -1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;; -1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;; -1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;; -1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;; -1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;; -133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;; -133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;; -133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;; -133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;; -133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;; -133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;; -1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;; -1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;; -1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;; -1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;; -1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; -1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; -1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; -1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; -1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; -134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; -134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;; -134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;; -134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;; -134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;; -134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;; -1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;; -1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;; -1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;; -1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;; -1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;; -1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;; -1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;; -1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;; -1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; -1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; -135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; -1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; -1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; -1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; -1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;; -1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;; -1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; -1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; -1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; -1369;ETHIOPIC DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -136A;ETHIOPIC DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -136B;ETHIOPIC DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -136C;ETHIOPIC DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -136D;ETHIOPIC DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -136E;ETHIOPIC DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -136F;ETHIOPIC DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1370;ETHIOPIC DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1371;ETHIOPIC DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; -1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; -1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; -1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;; -1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; -1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; -1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; -1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; -137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; -137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; -137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; -13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;; -13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;; -13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;; -13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;; -13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;; -13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;; -13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;; -13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;; -13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;; -13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;; -13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;; -13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;; -13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;; -13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;; -13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;; -13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;; -13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;; -13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;; -13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;; -13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;; -13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;; -13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;; -13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;; -13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;; -13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;; -13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;; -13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;; -13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;; -13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;; -13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;; -13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;; -13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;; -13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;; -13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;; -13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;; -13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;; -13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;; -13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;; -13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;; -13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;; -13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;; -13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;; -13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;; -13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;; -13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;; -13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;; -13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;; -13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;; -13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;; -13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;; -13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;; -13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;; -13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;; -13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;; -13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;; -13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;; -13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;; -13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;; -13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;; -13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;; -13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;; -13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;; -13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;; -13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;; -13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;; -13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;; -13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;; -13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;; -13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;; -13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;; -13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;; -13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;; -13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;; -13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;; -13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;; -13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;; -13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;; -13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;; -13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;; -13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;; -13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;; -13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;; -13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;; -13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;; -13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;; -1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; -1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; -1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;; -1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;; -1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;; -1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;; -1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;; -1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;; -1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;; -140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;; -140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;; -140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;; -140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;; -140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;; -140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;; -1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;; -1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;; -1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;; -1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;; -1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;; -1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;; -1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;; -1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;; -1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;; -1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;; -141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;; -141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;; -141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;; -141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;; -141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;; -141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;; -1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;; -1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;; -1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;; -1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;; -1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;; -1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;; -1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;; -1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;; -1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;; -1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;; -142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;; -142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;; -142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;; -142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;; -142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;; -142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;; -1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;; -1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;; -1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;; -1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;; -1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;; -1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;; -1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;; -1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;; -1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;; -1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;; -143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;; -143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;; -143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;; -143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;; -143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;; -143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;; -1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;; -1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;; -1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;; -1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;; -1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;; -1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;; -1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;; -1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;; -1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;; -1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;; -144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;; -144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;; -144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;; -144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;; -144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;; -144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;; -1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;; -1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;; -1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;; -1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;; -1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;; -1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;; -1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;; -1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;; -1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;; -1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;; -145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;; -145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;; -145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;; -145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;; -145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;; -145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;; -1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;; -1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;; -1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;; -1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;; -1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;; -1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;; -1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;; -1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;; -1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;; -1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;; -146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;; -146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;; -146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;; -146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;; -146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;; -146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;; -1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;; -1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;; -1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;; -1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;; -1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;; -1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;; -1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;; -1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;; -1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;; -1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;; -147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;; -147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;; -147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;; -147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;; -147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;; -147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;; -1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;; -1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;; -1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;; -1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;; -1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;; -1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;; -1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;; -1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;; -1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;; -1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;; -148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;; -148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;; -148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;; -148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;; -148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;; -148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;; -1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;; -1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;; -1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;; -1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;; -1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;; -1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;; -1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;; -1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;; -1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;; -1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;; -149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;; -149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;; -149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;; -149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;; -149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;; -149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;; -14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;; -14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;; -14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;; -14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;; -14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;; -14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;; -14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;; -14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;; -14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;; -14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;; -14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;; -14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;; -14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;; -14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;; -14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;; -14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;; -14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;; -14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;; -14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;; -14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;; -14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;; -14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;; -14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;; -14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;; -14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;; -14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;; -14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;; -14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;; -14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;; -14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;; -14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;; -14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;; -14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;; -14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;; -14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;; -14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;; -14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;; -14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;; -14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;; -14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;; -14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;; -14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;; -14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;; -14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;; -14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;; -14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;; -14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;; -14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;; -14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;; -14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;; -14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;; -14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;; -14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;; -14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;; -14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;; -14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;; -14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;; -14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;; -14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;; -14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;; -14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;; -14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;; -14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;; -14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;; -14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;; -14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;; -14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;; -14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;; -14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;; -14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;; -14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;; -14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;; -14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;; -14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;; -14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;; -14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;; -14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;; -14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;; -14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;; -14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;; -14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;; -14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;; -14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;; -14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;; -14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;; -14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;; -14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;; -14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;; -14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;; -14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;; -14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;; -14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;; -14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;; -14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;; -14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;; -14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;; -1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;; -1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;; -1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;; -1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;; -1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;; -1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;; -1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;; -1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;; -1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;; -1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;; -150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;; -150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;; -150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;; -150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;; -150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;; -150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;; -1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;; -1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;; -1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;; -1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;; -1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;; -1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;; -1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;; -1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;; -1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;; -1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;; -151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;; -151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;; -151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;; -151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;; -151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;; -151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;; -1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;; -1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;; -1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;; -1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;; -1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;; -1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;; -1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;; -1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;; -1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;; -1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;; -152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;; -152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;; -152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;; -152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;; -152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;; -152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;; -1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;; -1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;; -1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;; -1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;; -1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;; -1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;; -1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;; -1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;; -1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;; -1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;; -153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;; -153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;; -153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;; -153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;; -153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;; -153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;; -1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;; -1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;; -1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;; -1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;; -1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;; -1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;; -1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;; -1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;; -1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;; -1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;; -154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;; -154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;; -154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;; -154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;; -154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;; -154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;; -1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;; -1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;; -1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;; -1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;; -1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;; -1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;; -1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;; -1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;; -1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;; -1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;; -155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;; -155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;; -155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;; -155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;; -155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;; -155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;; -1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;; -1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;; -1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;; -1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;; -1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;; -1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;; -1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;; -1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;; -1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;; -1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;; -156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;; -156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;; -156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;; -156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;; -156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;; -156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;; -1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;; -1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;; -1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;; -1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;; -1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;; -1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;; -1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;; -1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;; -1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;; -1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;; -157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;; -157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;; -157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;; -157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;; -157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;; -157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;; -1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;; -1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;; -1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;; -1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;; -1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;; -1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;; -1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;; -1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;; -1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;; -1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;; -158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;; -158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;; -158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;; -158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;; -158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;; -158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;; -1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;; -1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;; -1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;; -1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;; -1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;; -1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;; -1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;; -1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;; -1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;; -1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;; -159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;; -159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;; -159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;; -159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;; -159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;; -159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;; -15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;; -15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;; -15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;; -15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;; -15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;; -15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;; -15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;; -15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;; -15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;; -15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;; -15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;; -15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;; -15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;; -15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;; -15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;; -15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;; -15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;; -15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;; -15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;; -15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;; -15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;; -15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;; -15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;; -15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;; -15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;; -15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;; -15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;; -15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;; -15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;; -15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;; -15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;; -15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;; -15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;; -15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;; -15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;; -15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;; -15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;; -15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;; -15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;; -15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;; -15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;; -15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;; -15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;; -15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;; -15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;; -15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;; -15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;; -15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;; -15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;; -15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;; -15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;; -15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;; -15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;; -15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;; -15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;; -15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;; -15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;; -15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;; -15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;; -15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;; -15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;; -15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;; -15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;; -15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;; -15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;; -15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;; -15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;; -15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;; -15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;; -15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;; -15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;; -15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;; -15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;; -15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;; -15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;; -15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;; -15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;; -15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;; -15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;; -15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;; -15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;; -15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;; -15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;; -15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;; -15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;; -15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;; -15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;; -15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;; -15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;; -15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;; -15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;; -15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;; -15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;; -15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;; -15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;; -15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;; -1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;; -1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;; -1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;; -1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;; -1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;; -1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;; -1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;; -1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;; -1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;; -1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;; -160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;; -160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;; -160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;; -160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;; -160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;; -160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;; -1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;; -1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;; -1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;; -1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;; -1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;; -1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;; -1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;; -1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;; -1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;; -1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;; -161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;; -161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;; -161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;; -161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;; -161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;; -161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;; -1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;; -1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;; -1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;; -1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;; -1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;; -1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;; -1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;; -1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;; -1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;; -1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;; -162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;; -162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;; -162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;; -162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;; -162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;; -162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;; -1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;; -1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;; -1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;; -1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;; -1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;; -1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;; -1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;; -1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;; -1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;; -1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;; -163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;; -163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;; -163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;; -163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;; -163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;; -163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;; -1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;; -1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;; -1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;; -1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;; -1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;; -1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;; -1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;; -1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;; -1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;; -1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;; -164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;; -164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;; -164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;; -164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;; -164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;; -164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;; -1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;; -1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;; -1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;; -1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;; -1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;; -1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;; -1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;; -1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;; -1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;; -1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;; -165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;; -165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;; -165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;; -165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;; -165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;; -165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;; -1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;; -1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;; -1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;; -1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;; -1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;; -1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;; -1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;; -1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;; -1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;; -1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;; -166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;; -166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;; -166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;; -166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;; -166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;; -166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;; -1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;; -1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;; -1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;; -1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;; -1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;; -1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;; -1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;; -1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; -1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;; -1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;; -1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;; -1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;; -1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;; -1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;; -1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;; -1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;; -1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;; -168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;; -168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;; -168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;; -168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;; -168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;; -168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;; -1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;; -1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;; -1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;; -1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;; -1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;; -1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;; -1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;; -1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;; -1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; -1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; -169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; -169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;N;;;;; -169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;N;;;;; -16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; -16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; -16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; -16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;; -16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;; -16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;; -16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;; -16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;; -16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;; -16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;; -16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;; -16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;; -16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;; -16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;; -16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;; -16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;; -16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;; -16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;; -16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;; -16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;; -16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;; -16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;; -16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;; -16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;; -16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;; -16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;; -16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;; -16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;; -16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;; -16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;; -16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;; -16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;; -16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;; -16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;; -16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;; -16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;; -16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;; -16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;; -16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;; -16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;; -16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;; -16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;; -16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;; -16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;; -16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;; -16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;; -16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;; -16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;; -16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;; -16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;; -16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;; -16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;; -16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;; -16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;; -16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;; -16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;; -16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;; -16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;; -16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;; -16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;; -16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;; -16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;; -16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;; -16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;; -16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;; -16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;; -16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;; -16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;; -16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;; -16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;; -16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;; -16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;; -16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;; -16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;; -16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;; -16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; -16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;; -16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; -16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;golden number 17;;; -16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;golden number 18;;; -16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;golden number 19;;; -1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;; -1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;; -1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;; -1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;; -1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;; -1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;; -1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;; -1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;; -1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;; -1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;; -178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;; -178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;; -178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;; -178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;; -178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;; -178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;; -1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;; -1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;; -1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;; -1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;; -1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;; -1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;; -1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;; -1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;; -1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;; -1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;; -179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;; -179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;; -179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;; -179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;; -179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;; -179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;; -17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;; -17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;; -17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;; -17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;; -17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;; -17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;; -17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;; -17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;; -17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;; -17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;; -17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;; -17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;; -17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;; -17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;; -17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;; -17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;; -17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;; -17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;; -17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;; -17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;; -17B4;KHMER VOWEL INHERENT AQ;Mc;0;L;;;;;N;;;;; -17B5;KHMER VOWEL INHERENT AA;Mc;0;L;;;;;N;;;;; -17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; -17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; -17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;; -17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;; -17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;; -17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; -17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; -17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;; -17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;; -17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;; -17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;; -17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;; -17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;; -17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;; -17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;; -17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;; -17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;; -17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;; -17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;; -17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;; -17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;; -17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;; -17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;; -17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;; -17D7;KHMER SIGN LEK TOO;Po;0;L;;;;;N;;;;; -17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;; -17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;; -17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;; -17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;; -17DC;KHMER SIGN AVAKRAHASANYA;Po;0;L;;;;;N;;;;; -17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;; -1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;; -1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;; -1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;; -1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;; -1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;; -1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; -1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;; -1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;; -1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;; -180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;; -180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Cf;0;BN;;;;;N;;;;; -180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Cf;0;BN;;;;;N;;;;; -180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Cf;0;BN;;;;;N;;;;; -180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;; -1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;; -1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;; -1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;; -1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;; -1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;; -1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;; -1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;; -1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;; -1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;; -1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;; -182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;; -182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;; -182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;; -182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;; -182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;; -182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;; -1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;; -1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;; -1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;; -1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;; -1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;; -1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;; -1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;; -1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;; -1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;; -1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;; -183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;; -183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;; -183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;; -183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;; -183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;; -183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;; -1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;; -1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;; -1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;; -1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;; -1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;; -1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;; -1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;; -1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;; -1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;; -1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;; -184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;; -184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;; -184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;; -184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;; -184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;; -184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;; -1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;; -1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;; -1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;; -1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;; -1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;; -1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;; -1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;; -1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;; -1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;; -1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;; -185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;; -185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;; -185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;; -185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;; -185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;; -185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;; -1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;; -1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;; -1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;; -1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;; -1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;; -1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;; -1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;; -1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;; -1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;; -1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;; -186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;; -186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;; -186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;; -186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;; -186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;; -186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;; -1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;; -1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;; -1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;; -1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;; -1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;; -1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;; -1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;; -1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;; -1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;; -1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;; -1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;; -1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;; -1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;; -1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;; -1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;; -1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;; -1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;; -1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;; -188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;; -188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;; -188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;; -188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;; -188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;; -188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;; -1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;; -1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;; -1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;; -1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;; -1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;; -1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;; -1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;; -1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;; -1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;; -1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;; -189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;; -189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;; -189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;; -189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;; -189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;; -189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;; -18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;; -18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;; -18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;; -18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;; -18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;; -18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;; -18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;; -18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; -18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; -18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; -1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; -1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 -1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; -1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02 -1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05; -1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04 -1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07; -1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06 -1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09; -1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08 -1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B; -1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A -1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D; -1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C -1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F; -1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E -1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11; -1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10 -1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13; -1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12 -1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15; -1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14 -1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17; -1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16 -1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19; -1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18 -1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B; -1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A -1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D; -1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C -1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F; -1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E -1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21; -1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20 -1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23; -1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22 -1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25; -1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24 -1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27; -1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26 -1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29; -1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28 -1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B; -1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A -1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D; -1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C -1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F; -1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E -1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31; -1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30 -1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33; -1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32 -1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35; -1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34 -1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37; -1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36 -1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39; -1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38 -1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B; -1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A -1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D; -1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C -1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F; -1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E -1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41; -1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40 -1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43; -1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42 -1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45; -1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44 -1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47; -1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46 -1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49; -1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48 -1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B; -1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A -1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D; -1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C -1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F; -1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E -1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51; -1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50 -1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53; -1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52 -1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55; -1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54 -1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57; -1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56 -1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59; -1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58 -1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B; -1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A -1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D; -1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C -1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F; -1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E -1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61; -1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60 -1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63; -1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62 -1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65; -1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64 -1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67; -1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66 -1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69; -1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68 -1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B; -1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A -1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D; -1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C -1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F; -1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E -1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71; -1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70 -1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73; -1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72 -1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75; -1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74 -1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77; -1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76 -1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79; -1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78 -1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B; -1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A -1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D; -1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C -1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F; -1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E -1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81; -1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80 -1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83; -1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82 -1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85; -1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84 -1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87; -1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86 -1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89; -1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88 -1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B; -1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A -1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D; -1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C -1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F; -1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E -1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91; -1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90 -1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93; -1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92 -1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95; -1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94 -1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;; -1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;; -1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;; -1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; -1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L; 0061 02BE;;;;N;;;;; -1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 -1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; -1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 -1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; -1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2 -1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5; -1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4 -1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7; -1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6 -1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9; -1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8 -1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB; -1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA -1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD; -1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC -1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF; -1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE -1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1; -1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0 -1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3; -1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2 -1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5; -1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4 -1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7; -1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6 -1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9; -1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8 -1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB; -1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA -1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD; -1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC -1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF; -1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE -1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1; -1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0 -1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3; -1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2 -1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5; -1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4 -1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7; -1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6 -1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9; -1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8 -1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB; -1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA -1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD; -1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC -1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF; -1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE -1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1; -1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0 -1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3; -1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2 -1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5; -1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4 -1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7; -1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6 -1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9; -1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 -1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB; -1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA -1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD; -1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC -1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF; -1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE -1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1; -1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0 -1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3; -1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2 -1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5; -1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4 -1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7; -1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6 -1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9; -1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8 -1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB; -1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA -1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED; -1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC -1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF; -1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE -1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1; -1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0 -1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3; -1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2 -1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5; -1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4 -1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7; -1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 -1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; -1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 -1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 -1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 -1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A -1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B -1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C -1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D -1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E -1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F -1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00; -1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01; -1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02; -1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03; -1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04; -1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05; -1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06; -1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07; -1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18 -1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19 -1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A -1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B -1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C -1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D -1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10; -1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11; -1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12; -1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13; -1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14; -1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15; -1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28 -1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29 -1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A -1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B -1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C -1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D -1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E -1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F -1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20; -1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21; -1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22; -1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23; -1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24; -1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25; -1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26; -1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27; -1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38 -1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39 -1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A -1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B -1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C -1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D -1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E -1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F -1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30; -1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31; -1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32; -1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33; -1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34; -1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35; -1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36; -1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37; -1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48 -1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49 -1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A -1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B -1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C -1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D -1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40; -1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41; -1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42; -1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43; -1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44; -1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45; -1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;; -1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59 -1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;; -1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B -1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;; -1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D -1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;; -1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F -1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51; -1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53; -1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55; -1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57; -1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68 -1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69 -1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A -1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B -1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C -1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D -1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E -1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F -1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60; -1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61; -1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62; -1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63; -1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64; -1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65; -1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66; -1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67; -1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA -1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB -1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8 -1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9 -1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA -1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB -1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA -1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB -1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8 -1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9 -1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA -1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB -1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA -1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB -1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88 -1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89 -1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A -1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B -1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C -1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D -1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E -1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F -1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80; -1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81; -1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82; -1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83; -1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84; -1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85; -1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86; -1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87; -1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98 -1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99 -1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A -1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B -1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C -1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D -1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E -1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F -1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90; -1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91; -1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92; -1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93; -1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94; -1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95; -1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96; -1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97; -1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8 -1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9 -1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA -1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB -1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC -1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD -1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE -1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF -1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0; -1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1; -1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2; -1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3; -1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4; -1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5; -1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6; -1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7; -1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8 -1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9 -1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;; -1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC -1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;; -1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;; -1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;; -1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0; -1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1; -1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70; -1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71; -1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3; -1FBD;GREEK KORONIS;Sk;0;ON; 0020 0313;;;;N;;;;; -1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399 -1FBF;GREEK PSILI;Sk;0;ON; 0020 0313;;;;N;;;;; -1FC0;GREEK PERISPOMENI;Sk;0;ON; 0020 0342;;;;N;;;;; -1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;; -1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;; -1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC -1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;; -1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;; -1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;; -1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72; -1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73; -1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74; -1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75; -1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3; -1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;; -1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;; -1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;; -1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8 -1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9 -1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;; -1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;; -1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;; -1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;; -1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0; -1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1; -1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76; -1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77; -1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;; -1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;; -1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;; -1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8 -1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9 -1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;; -1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;; -1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;; -1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC -1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;; -1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;; -1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0; -1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1; -1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A; -1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B; -1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5; -1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;; -1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;; -1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;; -1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;; -1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC -1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;; -1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;; -1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;; -1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78; -1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79; -1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C; -1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D; -1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3; -1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;; -1FFE;GREEK DASIA;Sk;0;ON; 0020 0314;;;;N;;;;; -2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; -2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; -2002;EN SPACE;Zs;0;WS; 0020;;;;N;;;;; -2003;EM SPACE;Zs;0;WS; 0020;;;;N;;;;; -2004;THREE-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; -2005;FOUR-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; -2006;SIX-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; -2007;FIGURE SPACE;Zs;0;WS; 0020;;;;N;;;;; -2008;PUNCTUATION SPACE;Zs;0;WS; 0020;;;;N;;;;; -2009;THIN SPACE;Zs;0;WS; 0020;;;;N;;;;; -200A;HAIR SPACE;Zs;0;WS; 0020;;;;N;;;;; -200B;ZERO WIDTH SPACE;Zs;0;BN;;;;;N;;;;; -200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; -200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; -200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; -200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;; -2010;HYPHEN;Pd;0;ON;;;;;N;;;;; -2011;NON-BREAKING HYPHEN;Pd;0;ON; 2010;;;;N;;;;; -2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;; -2013;EN DASH;Pd;0;ON;;;;;N;;;;; -2014;EM DASH;Pd;0;ON;;;;;N;;;;; -2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;; -2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;; -2017;DOUBLE LOW LINE;Po;0;ON; 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;; -2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;; -2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;; -201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;; -201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;; -201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;; -201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;; -201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;; -201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;; -2020;DAGGER;Po;0;ON;;;;;N;;;;; -2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;; -2022;BULLET;Po;0;ON;;;;;N;;;;; -2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;; -2024;ONE DOT LEADER;Po;0;ON; 002E;;;;N;;;;; -2025;TWO DOT LEADER;Po;0;ON; 002E 002E;;;;N;;;;; -2026;HORIZONTAL ELLIPSIS;Po;0;ON; 002E 002E 002E;;;;N;;;;; -2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;; -2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; -2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; -202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;; -202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;; -202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; -202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; -202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; -202F;NARROW NO-BREAK SPACE;Zs;0;WS; 0020;;;;N;;;;; -2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; -2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; -2032;PRIME;Po;0;ET;;;;;N;;;;; -2033;DOUBLE PRIME;Po;0;ET; 2032 2032;;;;N;;;;; -2034;TRIPLE PRIME;Po;0;ET; 2032 2032 2032;;;;N;;;;; -2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;; -2036;REVERSED DOUBLE PRIME;Po;0;ON; 2035 2035;;;;N;;;;; -2037;REVERSED TRIPLE PRIME;Po;0;ON; 2035 2035 2035;;;;N;;;;; -2038;CARET;Po;0;ON;;;;;N;;;;; -2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;; -203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;; -203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;; -203C;DOUBLE EXCLAMATION MARK;Po;0;ON; 0021 0021;;;;N;;;;; -203D;INTERROBANG;Po;0;ON;;;;;N;;;;; -203E;OVERLINE;Po;0;ON; 0020 0305;;;;N;SPACING OVERSCORE;;;; -203F;UNDERTIE;Pc;0;ON;;;;;N;;Enotikon;;; -2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;; -2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; -2042;ASTERISM;Po;0;ON;;;;;N;;;;; -2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; -2044;FRACTION SLASH;Sm;0;ON;;;;;N;;;;; -2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; -2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; -2048;QUESTION EXCLAMATION MARK;Po;0;ON; 003F 0021;;;;N;;;;; -2049;EXCLAMATION QUESTION MARK;Po;0;ON; 0021 003F;;;;N;;;;; -204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;; -204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;; -204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;; -204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;; -206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; -206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; -206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; -206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; -206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; -206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; -2070;SUPERSCRIPT ZERO;No;0;EN; 0030;0;0;0;N;SUPERSCRIPT DIGIT ZERO;;;; -2074;SUPERSCRIPT FOUR;No;0;EN; 0034;4;4;4;N;SUPERSCRIPT DIGIT FOUR;;;; -2075;SUPERSCRIPT FIVE;No;0;EN; 0035;5;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; -2076;SUPERSCRIPT SIX;No;0;EN; 0036;6;6;6;N;SUPERSCRIPT DIGIT SIX;;;; -2077;SUPERSCRIPT SEVEN;No;0;EN; 0037;7;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; -2078;SUPERSCRIPT EIGHT;No;0;EN; 0038;8;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; -2079;SUPERSCRIPT NINE;No;0;EN; 0039;9;9;9;N;SUPERSCRIPT DIGIT NINE;;;; -207A;SUPERSCRIPT PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; -207B;SUPERSCRIPT MINUS;Sm;0;ET; 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; -207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; -207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; -207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; -207F;SUPERSCRIPT LATIN SMALL LETTER N;Ll;0;L; 006E;;;;N;;;;; -2080;SUBSCRIPT ZERO;No;0;EN; 0030;0;0;0;N;SUBSCRIPT DIGIT ZERO;;;; -2081;SUBSCRIPT ONE;No;0;EN; 0031;1;1;1;N;SUBSCRIPT DIGIT ONE;;;; -2082;SUBSCRIPT TWO;No;0;EN; 0032;2;2;2;N;SUBSCRIPT DIGIT TWO;;;; -2083;SUBSCRIPT THREE;No;0;EN; 0033;3;3;3;N;SUBSCRIPT DIGIT THREE;;;; -2084;SUBSCRIPT FOUR;No;0;EN; 0034;4;4;4;N;SUBSCRIPT DIGIT FOUR;;;; -2085;SUBSCRIPT FIVE;No;0;EN; 0035;5;5;5;N;SUBSCRIPT DIGIT FIVE;;;; -2086;SUBSCRIPT SIX;No;0;EN; 0036;6;6;6;N;SUBSCRIPT DIGIT SIX;;;; -2087;SUBSCRIPT SEVEN;No;0;EN; 0037;7;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; -2088;SUBSCRIPT EIGHT;No;0;EN; 0038;8;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; -2089;SUBSCRIPT NINE;No;0;EN; 0039;9;9;9;N;SUBSCRIPT DIGIT NINE;;;; -208A;SUBSCRIPT PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; -208B;SUBSCRIPT MINUS;Sm;0;ET; 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; -208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; -208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; -208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; -20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; -20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; -20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; -20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;; -20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;; -20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;; -20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;; -20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;; -20A8;RUPEE SIGN;Sc;0;ET; 0052 0073;;;;N;;;;; -20A9;WON SIGN;Sc;0;ET;;;;;N;;;;; -20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;; -20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;; -20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;; -20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;; -20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;; -20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; -20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; -20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; -20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; -20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;; -20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;; -20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;; -20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;; -20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;; -20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;; -20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;; -20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;; -20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;; -20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;; -20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;; -20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;; -20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;; -20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;; -20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;; -20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;; -20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;; -2100;ACCOUNT OF;So;0;ON; 0061 002F 0063;;;;N;;;;; -2101;ADDRESSED TO THE SUBJECT;So;0;ON; 0061 002F 0073;;;;N;;;;; -2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L; 0043;;;;N;DOUBLE-STRUCK C;;;; -2103;DEGREE CELSIUS;So;0;ON; 00B0 0043;;;;N;DEGREES CENTIGRADE;;;; -2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;; -2105;CARE OF;So;0;ON; 0063 002F 006F;;;;N;;;;; -2106;CADA UNA;So;0;ON; 0063 002F 0075;;;;N;;;;; -2107;EULER CONSTANT;Lu;0;L; 0190;;;;N;EULERS;;;; -2108;SCRUPLE;So;0;ON;;;;;N;;;;; -2109;DEGREE FAHRENHEIT;So;0;ON; 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;; -210A;SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; -210B;SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;SCRIPT H;;;; -210C;BLACK-LETTER CAPITAL H;Lu;0;L; 0048;;;;N;BLACK-LETTER H;;;; -210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L; 0048;;;;N;DOUBLE-STRUCK H;;;; -210E;PLANCK CONSTANT;Ll;0;L; 0068;;;;N;;;;; -210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L; 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;; -2110;SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;SCRIPT I;;;; -2111;BLACK-LETTER CAPITAL I;Lu;0;L; 0049;;;;N;BLACK-LETTER I;;;; -2112;SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;SCRIPT L;;;; -2113;SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; -2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;; -2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L; 004E;;;;N;DOUBLE-STRUCK N;;;; -2116;NUMERO SIGN;So;0;ON; 004E 006F;;;;N;NUMERO;;;; -2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;; -2118;SCRIPT CAPITAL P;So;0;ON;;;;;N;SCRIPT P;;;; -2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L; 0050;;;;N;DOUBLE-STRUCK P;;;; -211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L; 0051;;;;N;DOUBLE-STRUCK Q;;;; -211B;SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;SCRIPT R;;;; -211C;BLACK-LETTER CAPITAL R;Lu;0;L; 0052;;;;N;BLACK-LETTER R;;;; -211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L; 0052;;;;N;DOUBLE-STRUCK R;;;; -211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;; -211F;RESPONSE;So;0;ON;;;;;N;;;;; -2120;SERVICE MARK;So;0;ON; 0053 004D;;;;N;;;;; -2121;TELEPHONE SIGN;So;0;ON; 0054 0045 004C;;;;N;T E L SYMBOL;;;; -2122;TRADE MARK SIGN;So;0;ON; 0054 004D;;;;N;TRADEMARK;;;; -2123;VERSICLE;So;0;ON;;;;;N;;;;; -2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L; 005A;;;;N;DOUBLE-STRUCK Z;;;; -2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;; -2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9; -2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;; -2128;BLACK-LETTER CAPITAL Z;Lu;0;L; 005A;;;;N;BLACK-LETTER Z;;;; -2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;; -212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; -212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5; -212C;SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;SCRIPT B;;;; -212D;BLACK-LETTER CAPITAL C;Lu;0;L; 0043;;;;N;BLACK-LETTER C;;;; -212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;; -212F;SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; -2130;SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;SCRIPT E;;;; -2131;SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;SCRIPT F;;;; -2132;TURNED CAPITAL F;So;0;ON;;;;;N;TURNED F;;;; -2133;SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;SCRIPT M;;;; -2134;SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; -2135;ALEF SYMBOL;Lo;0;L; 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; -2136;BET SYMBOL;Lo;0;L; 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;; -2137;GIMEL SYMBOL;Lo;0;L; 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;; -2138;DALET SYMBOL;Lo;0;L; 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;; -2139;INFORMATION SOURCE;Ll;0;L; 0069;;;;N;;;;; -213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; -2153;VULGAR FRACTION ONE THIRD;No;0;ON; 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; -2154;VULGAR FRACTION TWO THIRDS;No;0;ON; 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; -2155;VULGAR FRACTION ONE FIFTH;No;0;ON; 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; -2156;VULGAR FRACTION TWO FIFTHS;No;0;ON; 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;; -2157;VULGAR FRACTION THREE FIFTHS;No;0;ON; 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;; -2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON; 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;; -2159;VULGAR FRACTION ONE SIXTH;No;0;ON; 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;; -215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON; 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;; -215B;VULGAR FRACTION ONE EIGHTH;No;0;ON; 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;; -215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON; 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;; -215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON; 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;; -215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON; 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;; -215F;FRACTION NUMERATOR ONE;No;0;ON; 0031 2044;;;1;N;;;;; -2160;ROMAN NUMERAL ONE;Nl;0;L; 0049;;;1;N;;;;2170; -2161;ROMAN NUMERAL TWO;Nl;0;L; 0049 0049;;;2;N;;;;2171; -2162;ROMAN NUMERAL THREE;Nl;0;L; 0049 0049 0049;;;3;N;;;;2172; -2163;ROMAN NUMERAL FOUR;Nl;0;L; 0049 0056;;;4;N;;;;2173; -2164;ROMAN NUMERAL FIVE;Nl;0;L; 0056;;;5;N;;;;2174; -2165;ROMAN NUMERAL SIX;Nl;0;L; 0056 0049;;;6;N;;;;2175; -2166;ROMAN NUMERAL SEVEN;Nl;0;L; 0056 0049 0049;;;7;N;;;;2176; -2167;ROMAN NUMERAL EIGHT;Nl;0;L; 0056 0049 0049 0049;;;8;N;;;;2177; -2168;ROMAN NUMERAL NINE;Nl;0;L; 0049 0058;;;9;N;;;;2178; -2169;ROMAN NUMERAL TEN;Nl;0;L; 0058;;;10;N;;;;2179; -216A;ROMAN NUMERAL ELEVEN;Nl;0;L; 0058 0049;;;11;N;;;;217A; -216B;ROMAN NUMERAL TWELVE;Nl;0;L; 0058 0049 0049;;;12;N;;;;217B; -216C;ROMAN NUMERAL FIFTY;Nl;0;L; 004C;;;50;N;;;;217C; -216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0043;;;100;N;;;;217D; -216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0044;;;500;N;;;;217E; -216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 004D;;;1000;N;;;;217F; -2170;SMALL ROMAN NUMERAL ONE;Nl;0;L; 0069;;;1;N;;;2160;;2160 -2171;SMALL ROMAN NUMERAL TWO;Nl;0;L; 0069 0069;;;2;N;;;2161;;2161 -2172;SMALL ROMAN NUMERAL THREE;Nl;0;L; 0069 0069 0069;;;3;N;;;2162;;2162 -2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L; 0069 0076;;;4;N;;;2163;;2163 -2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L; 0076;;;5;N;;;2164;;2164 -2175;SMALL ROMAN NUMERAL SIX;Nl;0;L; 0076 0069;;;6;N;;;2165;;2165 -2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L; 0076 0069 0069;;;7;N;;;2166;;2166 -2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L; 0076 0069 0069 0069;;;8;N;;;2167;;2167 -2178;SMALL ROMAN NUMERAL NINE;Nl;0;L; 0069 0078;;;9;N;;;2168;;2168 -2179;SMALL ROMAN NUMERAL TEN;Nl;0;L; 0078;;;10;N;;;2169;;2169 -217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L; 0078 0069;;;11;N;;;216A;;216A -217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L; 0078 0069 0069;;;12;N;;;216B;;216B -217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L; 006C;;;50;N;;;216C;;216C -217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0063;;;100;N;;;216D;;216D -217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0064;;;500;N;;;216E;;216E -217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 006D;;;1000;N;;;216F;;216F -2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; -2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; -2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; -2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Nl;0;L;;;;;N;;;;; -2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; -2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; -2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; -2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;; -2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; -2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;; -2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;; -2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;; -2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;; -2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;; -219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;; -219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;; -219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;; -219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;; -219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;; -219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;; -21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;; -21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;; -21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;; -21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;; -21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;; -21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;; -21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;; -21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;; -21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;; -21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;; -21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;; -21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;; -21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;; -21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;; -21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;; -21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;; -21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;; -21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;; -21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;; -21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;; -21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;; -21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;; -21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; -21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; -21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;; -21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;; -21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; -21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; -21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;; -21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;; -21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;; -21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;; -21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;; -21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;; -21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;; -21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;; -21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;; -21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;; -21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;; -21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;; -21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;; -21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;; -21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;; -21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;; -21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;; -21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;; -21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;; -21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;; -21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;; -21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;; -21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;; -21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;; -21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; -21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;; -21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;; -21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;; -21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;; -21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;; -21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;; -21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;; -21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;; -21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;; -21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;; -21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;; -21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;; -21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;; -21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;; -21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;; -21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;; -21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;; -21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;; -21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;; -21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;; -21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;; -21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;; -21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; -21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; -21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; -21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;; -21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; -21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;; -21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;; -21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;; -21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;; -2200;FOR ALL;Sm;0;ON;;;;;N;;;;; -2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;; -2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;; -2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;; -2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;; -2205;EMPTY SET;Sm;0;ON;;;;;N;;;;; -2206;INCREMENT;Sm;0;ON;;;;;N;;;;; -2207;NABLA;Sm;0;ON;;;;;N;;;;; -2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;; -2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;; -220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;; -220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; -220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;; -220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; -220E;END OF PROOF;Sm;0;ON;;;;;N;;;;; -220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; -2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; -2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; -2212;MINUS SIGN;Sm;0;ET;;;;;N;;;;; -2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; -2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; -2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; -2216;SET MINUS;Sm;0;ON;;;;;Y;;;;; -2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; -2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;; -2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;; -221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; -221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;; -221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;; -221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;; -221E;INFINITY;Sm;0;ON;;;;;N;;;;; -221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;; -2220;ANGLE;Sm;0;ON;;;;;Y;;;;; -2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;; -2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;; -2223;DIVIDES;Sm;0;ON;;;;;N;;;;; -2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;; -2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;; -2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;; -2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;; -2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;; -2229;INTERSECTION;Sm;0;ON;;;;;N;;;;; -222A;UNION;Sm;0;ON;;;;;N;;;;; -222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;; -222C;DOUBLE INTEGRAL;Sm;0;ON; 222B 222B;;;;Y;;;;; -222D;TRIPLE INTEGRAL;Sm;0;ON; 222B 222B 222B;;;;Y;;;;; -222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; -222F;SURFACE INTEGRAL;Sm;0;ON; 222E 222E;;;;Y;;;;; -2230;VOLUME INTEGRAL;Sm;0;ON; 222E 222E 222E;;;;Y;;;;; -2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2234;THEREFORE;Sm;0;ON;;;;;N;;;;; -2235;BECAUSE;Sm;0;ON;;;;;N;;;;; -2236;RATIO;Sm;0;ON;;;;;N;;;;; -2237;PROPORTION;Sm;0;ON;;;;;N;;;;; -2238;DOT MINUS;Sm;0;ON;;;;;N;;;;; -2239;EXCESS;Sm;0;ON;;;;;Y;;;;; -223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;; -223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;; -223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; -223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;lazy S;;; -223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;; -223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;; -2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;; -2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;; -2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;; -2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;; -2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;; -2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;; -224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;; -224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;; -224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; -224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; -224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;; -2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;; -2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;; -2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;; -2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;; -2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;; -2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;; -2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;; -2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;; -2259;ESTIMATES;Sm;0;ON;;;;;N;;;;; -225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;; -225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;; -225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;; -225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;; -225E;MEASURED BY;Sm;0;ON;;;;;N;;;;; -225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;; -2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;; -2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;; -2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; -2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;; -2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;; -2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;; -2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;; -2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;; -2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;; -226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;; -226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;; -226C;BETWEEN;Sm;0;ON;;;;;N;;;;; -226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;; -226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;; -226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;; -2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;; -2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;; -2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;; -2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;; -2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;; -2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;; -2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;; -2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;; -2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;; -2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;; -227A;PRECEDES;Sm;0;ON;;;;;Y;;;;; -227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;; -227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; -227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; -2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;; -2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;; -2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;; -2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;; -2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;; -2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;; -2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;; -2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;; -228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;; -228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;; -228C;MULTISET;Sm;0;ON;;;;;Y;;;;; -228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;; -228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;; -228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;; -2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; -2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;; -2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;; -2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; -2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;; -2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;; -2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; -2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; -229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;; -229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; -229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;; -229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;; -229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;; -229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;; -22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;; -22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; -22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;; -22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;; -22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;; -22A5;UP TACK;Sm;0;ON;;;;;N;;;;; -22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;; -22A7;MODELS;Sm;0;ON;;;;;Y;;;;; -22A8;TRUE;Sm;0;ON;;;;;Y;;;;; -22A9;FORCES;Sm;0;ON;;;;;Y;;;;; -22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; -22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; -22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;; -22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;; -22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;; -22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;; -22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;; -22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;; -22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;; -22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;; -22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; -22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;; -22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;; -22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;; -22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;; -22BB;XOR;Sm;0;ON;;;;;N;;;;; -22BC;NAND;Sm;0;ON;;;;;N;;;;; -22BD;NOR;Sm;0;ON;;;;;N;;;;; -22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;; -22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; -22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;; -22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;; -22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;; -22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;; -22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;; -22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;; -22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;; -22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;; -22C8;BOWTIE;Sm;0;ON;;;;;N;;;;; -22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; -22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; -22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; -22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; -22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;; -22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;; -22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;; -22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;; -22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;; -22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;; -22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;; -22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;; -22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;; -22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;; -22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;; -22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;; -22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;; -22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;; -22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;; -22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;; -22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;; -22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;; -22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;; -22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;; -22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;; -22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;; -22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;; -22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;; -22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;; -22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; -22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; -22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;; -22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;; -22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;; -22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;; -22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; -22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; -22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; -22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; -2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;; -2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;; -2302;HOUSE;So;0;ON;;;;;N;;;;; -2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;; -2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;; -2305;PROJECTIVE;So;0;ON;;;;;N;;;;; -2306;PERSPECTIVE;So;0;ON;;;;;N;;;;; -2307;WAVY LINE;So;0;ON;;;;;N;;;;; -2308;LEFT CEILING;Sm;0;ON;;;;;Y;;;;; -2309;RIGHT CEILING;Sm;0;ON;;;;;Y;;;;; -230A;LEFT FLOOR;Sm;0;ON;;;;;Y;;;;; -230B;RIGHT FLOOR;Sm;0;ON;;;;;Y;;;;; -230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;; -230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;; -230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;; -230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;; -2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;; -2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;; -2312;ARC;So;0;ON;;;;;N;;;;; -2313;SEGMENT;So;0;ON;;;;;N;;;;; -2314;SECTOR;So;0;ON;;;;;N;;;;; -2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;; -2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;; -2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;; -2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;; -2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;; -231A;WATCH;So;0;ON;;;;;N;;;;; -231B;HOURGLASS;So;0;ON;;;;;N;;;;; -231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;; -231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;; -231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;; -231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;; -2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2322;FROWN;So;0;ON;;;;;N;;;;; -2323;SMILE;So;0;ON;;;;;N;;;;; -2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;; -2325;OPTION KEY;So;0;ON;;;;;N;;;;; -2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;; -2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;; -2328;KEYBOARD;So;0;ON;;;;;N;;;;; -2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;; -232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;; -232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;; -232C;BENZENE RING;So;0;ON;;;;;N;;;;; -232D;CYLINDRICITY;So;0;ON;;;;;N;;;;; -232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;; -232F;SYMMETRY;So;0;ON;;;;;N;;;;; -2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;; -2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;; -2332;CONICAL TAPER;So;0;ON;;;;;N;;;;; -2333;SLOPE;So;0;ON;;;;;N;;;;; -2334;COUNTERBORE;So;0;ON;;;;;N;;;;; -2335;COUNTERSINK;So;0;ON;;;;;N;;;;; -2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;; -2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;; -2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;; -2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;; -233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;; -233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;; -233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;; -233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;; -233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;; -233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;; -2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;; -2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;; -2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;; -2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;; -2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;; -2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;; -2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;; -2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;; -2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;; -2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;; -234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;*;;; -234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;; -234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;; -234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;; -234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;*;;; -234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;; -2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;; -2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;*;;; -2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;; -2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;; -2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;; -2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;*;;; -2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;; -2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;; -2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;; -2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;; -235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;; -235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;; -235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;; -235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;; -235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;; -235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;; -2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;; -2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;*;;; -2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;; -2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;; -2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;; -2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;; -2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;; -2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;; -2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;; -2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;; -236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;; -236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;; -236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;; -236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;; -236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;; -236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;; -2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;; -2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;; -2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;; -2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;; -2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;; -2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;; -2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;; -2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;; -2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;; -2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;; -237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;; -237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;; -237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;; -237E;BELL SYMBOL;So;0;ON;;;;;N;;;;; -237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; -2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;; -2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; -2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; -2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;; -2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;; -2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;; -2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;; -2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;; -2388;HELM SYMBOL;So;0;ON;;;;;N;;;;; -2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;pause;;; -238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;break;;; -238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;escape;;; -238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;; -238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;; -238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;; -238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;; -2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;; -2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; -2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; -2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;; -2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;; -2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;; -2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;; -2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;; -2398;NEXT PAGE;So;0;ON;;;;;N;;;;; -2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;; -239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;; -2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; -2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; -2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; -2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;; -2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;; -2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;; -2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;; -2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;; -2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;; -2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;; -240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;; -240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;; -240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;; -240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;; -240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;; -240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;; -2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;; -2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;; -2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;; -2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;; -2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;; -2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;; -2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;; -2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;; -2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;; -2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;; -241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;; -241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;; -241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;; -241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;; -241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;; -241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;; -2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;; -2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;; -2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;; -2423;OPEN BOX;So;0;ON;;;;;N;;;;; -2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;; -2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;; -2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;; -2440;OCR HOOK;So;0;ON;;;;;N;;;;; -2441;OCR CHAIR;So;0;ON;;;;;N;;;;; -2442;OCR FORK;So;0;ON;;;;;N;;;;; -2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;; -2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;; -2445;OCR BOW TIE;So;0;ON;;;;;N;;;;; -2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;; -2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;; -2448;OCR DASH;So;0;ON;;;;;N;;;;; -2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; -244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; -2460;CIRCLED DIGIT ONE;No;0;EN; 0031;;1;1;N;;;;; -2461;CIRCLED DIGIT TWO;No;0;EN; 0032;;2;2;N;;;;; -2462;CIRCLED DIGIT THREE;No;0;EN; 0033;;3;3;N;;;;; -2463;CIRCLED DIGIT FOUR;No;0;EN; 0034;;4;4;N;;;;; -2464;CIRCLED DIGIT FIVE;No;0;EN; 0035;;5;5;N;;;;; -2465;CIRCLED DIGIT SIX;No;0;EN; 0036;;6;6;N;;;;; -2466;CIRCLED DIGIT SEVEN;No;0;EN; 0037;;7;7;N;;;;; -2467;CIRCLED DIGIT EIGHT;No;0;EN; 0038;;8;8;N;;;;; -2468;CIRCLED DIGIT NINE;No;0;EN; 0039;;9;9;N;;;;; -2469;CIRCLED NUMBER TEN;No;0;EN; 0031 0030;;;10;N;;;;; -246A;CIRCLED NUMBER ELEVEN;No;0;EN; 0031 0031;;;11;N;;;;; -246B;CIRCLED NUMBER TWELVE;No;0;EN; 0031 0032;;;12;N;;;;; -246C;CIRCLED NUMBER THIRTEEN;No;0;EN; 0031 0033;;;13;N;;;;; -246D;CIRCLED NUMBER FOURTEEN;No;0;EN; 0031 0034;;;14;N;;;;; -246E;CIRCLED NUMBER FIFTEEN;No;0;EN; 0031 0035;;;15;N;;;;; -246F;CIRCLED NUMBER SIXTEEN;No;0;EN; 0031 0036;;;16;N;;;;; -2470;CIRCLED NUMBER SEVENTEEN;No;0;EN; 0031 0037;;;17;N;;;;; -2471;CIRCLED NUMBER EIGHTEEN;No;0;EN; 0031 0038;;;18;N;;;;; -2472;CIRCLED NUMBER NINETEEN;No;0;EN; 0031 0039;;;19;N;;;;; -2473;CIRCLED NUMBER TWENTY;No;0;EN; 0032 0030;;;20;N;;;;; -2474;PARENTHESIZED DIGIT ONE;No;0;EN; 0028 0031 0029;;1;1;N;;;;; -2475;PARENTHESIZED DIGIT TWO;No;0;EN; 0028 0032 0029;;2;2;N;;;;; -2476;PARENTHESIZED DIGIT THREE;No;0;EN; 0028 0033 0029;;3;3;N;;;;; -2477;PARENTHESIZED DIGIT FOUR;No;0;EN; 0028 0034 0029;;4;4;N;;;;; -2478;PARENTHESIZED DIGIT FIVE;No;0;EN; 0028 0035 0029;;5;5;N;;;;; -2479;PARENTHESIZED DIGIT SIX;No;0;EN; 0028 0036 0029;;6;6;N;;;;; -247A;PARENTHESIZED DIGIT SEVEN;No;0;EN; 0028 0037 0029;;7;7;N;;;;; -247B;PARENTHESIZED DIGIT EIGHT;No;0;EN; 0028 0038 0029;;8;8;N;;;;; -247C;PARENTHESIZED DIGIT NINE;No;0;EN; 0028 0039 0029;;9;9;N;;;;; -247D;PARENTHESIZED NUMBER TEN;No;0;EN; 0028 0031 0030 0029;;;10;N;;;;; -247E;PARENTHESIZED NUMBER ELEVEN;No;0;EN; 0028 0031 0031 0029;;;11;N;;;;; -247F;PARENTHESIZED NUMBER TWELVE;No;0;EN; 0028 0031 0032 0029;;;12;N;;;;; -2480;PARENTHESIZED NUMBER THIRTEEN;No;0;EN; 0028 0031 0033 0029;;;13;N;;;;; -2481;PARENTHESIZED NUMBER FOURTEEN;No;0;EN; 0028 0031 0034 0029;;;14;N;;;;; -2482;PARENTHESIZED NUMBER FIFTEEN;No;0;EN; 0028 0031 0035 0029;;;15;N;;;;; -2483;PARENTHESIZED NUMBER SIXTEEN;No;0;EN; 0028 0031 0036 0029;;;16;N;;;;; -2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;EN; 0028 0031 0037 0029;;;17;N;;;;; -2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;EN; 0028 0031 0038 0029;;;18;N;;;;; -2486;PARENTHESIZED NUMBER NINETEEN;No;0;EN; 0028 0031 0039 0029;;;19;N;;;;; -2487;PARENTHESIZED NUMBER TWENTY;No;0;EN; 0028 0032 0030 0029;;;20;N;;;;; -2488;DIGIT ONE FULL STOP;No;0;EN; 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; -2489;DIGIT TWO FULL STOP;No;0;EN; 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; -248A;DIGIT THREE FULL STOP;No;0;EN; 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; -248B;DIGIT FOUR FULL STOP;No;0;EN; 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;; -248C;DIGIT FIVE FULL STOP;No;0;EN; 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;; -248D;DIGIT SIX FULL STOP;No;0;EN; 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;; -248E;DIGIT SEVEN FULL STOP;No;0;EN; 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;; -248F;DIGIT EIGHT FULL STOP;No;0;EN; 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;; -2490;DIGIT NINE FULL STOP;No;0;EN; 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;; -2491;NUMBER TEN FULL STOP;No;0;EN; 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;; -2492;NUMBER ELEVEN FULL STOP;No;0;EN; 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;; -2493;NUMBER TWELVE FULL STOP;No;0;EN; 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;; -2494;NUMBER THIRTEEN FULL STOP;No;0;EN; 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;; -2495;NUMBER FOURTEEN FULL STOP;No;0;EN; 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;; -2496;NUMBER FIFTEEN FULL STOP;No;0;EN; 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;; -2497;NUMBER SIXTEEN FULL STOP;No;0;EN; 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;; -2498;NUMBER SEVENTEEN FULL STOP;No;0;EN; 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;; -2499;NUMBER EIGHTEEN FULL STOP;No;0;EN; 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;; -249A;NUMBER NINETEEN FULL STOP;No;0;EN; 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;; -249B;NUMBER TWENTY FULL STOP;No;0;EN; 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;; -249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L; 0028 0061 0029;;;;N;;;;; -249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L; 0028 0062 0029;;;;N;;;;; -249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L; 0028 0063 0029;;;;N;;;;; -249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L; 0028 0064 0029;;;;N;;;;; -24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L; 0028 0065 0029;;;;N;;;;; -24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L; 0028 0066 0029;;;;N;;;;; -24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L; 0028 0067 0029;;;;N;;;;; -24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L; 0028 0068 0029;;;;N;;;;; -24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L; 0028 0069 0029;;;;N;;;;; -24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L; 0028 006A 0029;;;;N;;;;; -24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L; 0028 006B 0029;;;;N;;;;; -24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L; 0028 006C 0029;;;;N;;;;; -24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L; 0028 006D 0029;;;;N;;;;; -24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L; 0028 006E 0029;;;;N;;;;; -24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L; 0028 006F 0029;;;;N;;;;; -24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L; 0028 0070 0029;;;;N;;;;; -24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L; 0028 0071 0029;;;;N;;;;; -24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L; 0028 0072 0029;;;;N;;;;; -24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L; 0028 0073 0029;;;;N;;;;; -24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L; 0028 0074 0029;;;;N;;;;; -24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L; 0028 0075 0029;;;;N;;;;; -24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L; 0028 0076 0029;;;;N;;;;; -24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L; 0028 0077 0029;;;;N;;;;; -24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L; 0028 0078 0029;;;;N;;;;; -24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L; 0028 0079 0029;;;;N;;;;; -24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L; 0028 007A 0029;;;;N;;;;; -24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;24D0; -24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;24D1; -24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;24D2; -24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;24D3; -24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;24D4; -24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;24D5; -24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;24D6; -24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;24D7; -24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;24D8; -24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;24D9; -24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;24DA; -24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;24DB; -24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;24DC; -24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;24DD; -24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;24DE; -24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;24DF; -24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;24E0; -24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;24E1; -24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;24E2; -24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;24E3; -24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;24E4; -24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;24E5; -24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;24E6; -24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;24E7; -24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;24E8; -24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;24E9; -24D0;CIRCLED LATIN SMALL LETTER A;So;0;L; 0061;;;;N;;;24B6;;24B6 -24D1;CIRCLED LATIN SMALL LETTER B;So;0;L; 0062;;;;N;;;24B7;;24B7 -24D2;CIRCLED LATIN SMALL LETTER C;So;0;L; 0063;;;;N;;;24B8;;24B8 -24D3;CIRCLED LATIN SMALL LETTER D;So;0;L; 0064;;;;N;;;24B9;;24B9 -24D4;CIRCLED LATIN SMALL LETTER E;So;0;L; 0065;;;;N;;;24BA;;24BA -24D5;CIRCLED LATIN SMALL LETTER F;So;0;L; 0066;;;;N;;;24BB;;24BB -24D6;CIRCLED LATIN SMALL LETTER G;So;0;L; 0067;;;;N;;;24BC;;24BC -24D7;CIRCLED LATIN SMALL LETTER H;So;0;L; 0068;;;;N;;;24BD;;24BD -24D8;CIRCLED LATIN SMALL LETTER I;So;0;L; 0069;;;;N;;;24BE;;24BE -24D9;CIRCLED LATIN SMALL LETTER J;So;0;L; 006A;;;;N;;;24BF;;24BF -24DA;CIRCLED LATIN SMALL LETTER K;So;0;L; 006B;;;;N;;;24C0;;24C0 -24DB;CIRCLED LATIN SMALL LETTER L;So;0;L; 006C;;;;N;;;24C1;;24C1 -24DC;CIRCLED LATIN SMALL LETTER M;So;0;L; 006D;;;;N;;;24C2;;24C2 -24DD;CIRCLED LATIN SMALL LETTER N;So;0;L; 006E;;;;N;;;24C3;;24C3 -24DE;CIRCLED LATIN SMALL LETTER O;So;0;L; 006F;;;;N;;;24C4;;24C4 -24DF;CIRCLED LATIN SMALL LETTER P;So;0;L; 0070;;;;N;;;24C5;;24C5 -24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L; 0071;;;;N;;;24C6;;24C6 -24E1;CIRCLED LATIN SMALL LETTER R;So;0;L; 0072;;;;N;;;24C7;;24C7 -24E2;CIRCLED LATIN SMALL LETTER S;So;0;L; 0073;;;;N;;;24C8;;24C8 -24E3;CIRCLED LATIN SMALL LETTER T;So;0;L; 0074;;;;N;;;24C9;;24C9 -24E4;CIRCLED LATIN SMALL LETTER U;So;0;L; 0075;;;;N;;;24CA;;24CA -24E5;CIRCLED LATIN SMALL LETTER V;So;0;L; 0076;;;;N;;;24CB;;24CB -24E6;CIRCLED LATIN SMALL LETTER W;So;0;L; 0077;;;;N;;;24CC;;24CC -24E7;CIRCLED LATIN SMALL LETTER X;So;0;L; 0078;;;;N;;;24CD;;24CD -24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L; 0079;;;;N;;;24CE;;24CE -24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L; 007A;;;;N;;;24CF;;24CF -24EA;CIRCLED DIGIT ZERO;No;0;EN; 0030;;0;0;N;;;;; -2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;; -2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;; -2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;; -2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;; -2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;; -2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;; -2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;; -2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;; -2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;; -2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;; -250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;; -250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;; -250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;; -250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;; -250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;; -250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;; -2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;; -2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;; -2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;; -2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;; -2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;; -2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;; -2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;; -2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;; -2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;; -2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;; -251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;; -251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;; -251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;; -251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;; -251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;; -251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;; -2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;; -2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;; -2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;; -2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;; -2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;; -2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;; -2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;; -2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;; -2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;; -2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;; -252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;; -252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;; -252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;; -252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;; -252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;; -252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;; -2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;; -2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;; -2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;; -2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;; -2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;; -2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;; -2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;; -2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;; -2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;; -2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;; -253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;; -253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;; -253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;; -253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;; -253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;; -253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;; -2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;; -2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;; -2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;; -2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;; -2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;; -2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;; -2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;; -2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;; -2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;; -2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;; -254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;; -254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;; -254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;; -254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;; -254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;; -254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;; -2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;; -2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;; -2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;; -2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;; -2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;; -2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;; -2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;; -2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;; -2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;; -2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;; -255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;; -255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;; -255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;; -255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;; -255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;; -255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;; -2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;; -2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;; -2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;; -2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;; -2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;; -2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;; -2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;; -2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;; -2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;; -2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;; -256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;; -256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;; -256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;; -256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;; -256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;; -256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;; -2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;; -2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;; -2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;; -2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;; -2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;; -2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;; -2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;; -2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;; -2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;; -2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;; -257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;; -257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;; -257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;; -257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;; -257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;; -257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;; -2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;; -2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; -2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; -2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; -2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;; -2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -2588;FULL BLOCK;So;0;ON;;;;;N;;;;; -2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;; -258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;; -258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; -258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; -2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; -2591;LIGHT SHADE;So;0;ON;;;;;N;;;;; -2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;; -2593;DARK SHADE;So;0;ON;;;;;N;;;;; -2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; -2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; -25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;; -25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;; -25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; -25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; -25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;; -25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; -25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; -25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; -25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; -25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; -25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; -25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; -25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;; -25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;; -25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; -25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; -25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;; -25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;; -25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;; -25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;; -25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;; -25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;; -25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;; -25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;; -25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;; -25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;; -25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;; -25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;; -25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;; -25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;; -25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;; -25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;; -25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;; -25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;; -25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;; -25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;; -25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;; -25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;; -25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;; -25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;; -25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; -25C9;FISHEYE;So;0;ON;;;;;N;;;;; -25CA;LOZENGE;So;0;ON;;;;;N;;;;; -25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;; -25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;; -25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; -25CE;BULLSEYE;So;0;ON;;;;;N;;;;; -25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;; -25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; -25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; -25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;; -25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;; -25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;; -25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;; -25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; -25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; -25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;; -25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; -25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; -25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; -25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; -25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; -25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; -25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; -25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;; -25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;; -25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; -25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; -25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; -25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; -25E6;WHITE BULLET;So;0;ON;;;;;N;;;;; -25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; -25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; -25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; -25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; -25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;; -25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;; -25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;; -25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;; -25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;; -25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; -25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; -25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; -25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; -25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; -25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; -25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; -25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; -2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;; -2601;CLOUD;So;0;ON;;;;;N;;;;; -2602;UMBRELLA;So;0;ON;;;;;N;;;;; -2603;SNOWMAN;So;0;ON;;;;;N;;;;; -2604;COMET;So;0;ON;;;;;N;;;;; -2605;BLACK STAR;So;0;ON;;;;;N;;;;; -2606;WHITE STAR;So;0;ON;;;;;N;;;;; -2607;LIGHTNING;So;0;ON;;;;;N;;;;; -2608;THUNDERSTORM;So;0;ON;;;;;N;;;;; -2609;SUN;So;0;ON;;;;;N;;;;; -260A;ASCENDING NODE;So;0;ON;;;;;N;;;;; -260B;DESCENDING NODE;So;0;ON;;;;;N;;;;; -260C;CONJUNCTION;So;0;ON;;;;;N;;;;; -260D;OPPOSITION;So;0;ON;;;;;N;;;;; -260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;; -260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;; -2610;BALLOT BOX;So;0;ON;;;;;N;;;;; -2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;; -2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;; -2613;SALTIRE;So;0;ON;;;;;N;;;;; -2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; -261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; -261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; -261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; -261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; -261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; -261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; -2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; -2621;CAUTION SIGN;So;0;ON;;;;;N;;;;; -2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;; -2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;; -2624;CADUCEUS;So;0;ON;;;;;N;;;;; -2625;ANKH;So;0;ON;;;;;N;;;;; -2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;; -2627;CHI RHO;So;0;ON;;;;;N;;;;; -2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;; -2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;; -262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;; -262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;; -262C;ADI SHAKTI;So;0;ON;;;;;N;;;;; -262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;; -262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;; -262F;YIN YANG;So;0;ON;;;;;N;;;;; -2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;; -2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;; -2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;; -2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;; -2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;; -2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;; -2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;; -2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; -2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;; -2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;; -263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;; -263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;; -263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;; -263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;; -263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;; -263F;MERCURY;So;0;ON;;;;;N;;;;; -2640;FEMALE SIGN;So;0;ON;;;;;N;;;;; -2641;EARTH;So;0;ON;;;;;N;;;;; -2642;MALE SIGN;So;0;ON;;;;;N;;;;; -2643;JUPITER;So;0;ON;;;;;N;;;;; -2644;SATURN;So;0;ON;;;;;N;;;;; -2645;URANUS;So;0;ON;;;;;N;;;;; -2646;NEPTUNE;So;0;ON;;;;;N;;;;; -2647;PLUTO;So;0;ON;;;;;N;;;;; -2648;ARIES;So;0;ON;;;;;N;;;;; -2649;TAURUS;So;0;ON;;;;;N;;;;; -264A;GEMINI;So;0;ON;;;;;N;;;;; -264B;CANCER;So;0;ON;;;;;N;;;;; -264C;LEO;So;0;ON;;;;;N;;;;; -264D;VIRGO;So;0;ON;;;;;N;;;;; -264E;LIBRA;So;0;ON;;;;;N;;;;; -264F;SCORPIUS;So;0;ON;;;;;N;;;;; -2650;SAGITTARIUS;So;0;ON;;;;;N;;;;; -2651;CAPRICORN;So;0;ON;;;;;N;;;;; -2652;AQUARIUS;So;0;ON;;;;;N;;;;; -2653;PISCES;So;0;ON;;;;;N;;;;; -2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;; -2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;; -2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;; -2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;; -2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;; -2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;; -265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;; -265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;; -265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;; -265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;; -265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;; -265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;; -2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;; -2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;; -2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;; -2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;; -2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;; -2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;; -2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;; -2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;; -2668;HOT SPRINGS;So;0;ON;;;;;N;;;;; -2669;QUARTER NOTE;So;0;ON;;;;;N;;;;; -266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;; -266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;; -266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;; -266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;; -266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;; -266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;; -2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;; -2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;; -2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; -2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; -2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; -2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;; -2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;; -2707;TAPE DRIVE;So;0;ON;;;;;N;;;;; -2708;AIRPLANE;So;0;ON;;;;;N;;;;; -2709;ENVELOPE;So;0;ON;;;;;N;;;;; -270C;VICTORY HAND;So;0;ON;;;;;N;;;;; -270D;WRITING HAND;So;0;ON;;;;;N;;;;; -270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;; -270F;PENCIL;So;0;ON;;;;;N;;;;; -2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;; -2711;WHITE NIB;So;0;ON;;;;;N;;;;; -2712;BLACK NIB;So;0;ON;;;;;N;;;;; -2713;CHECK MARK;So;0;ON;;;;;N;;;;; -2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; -2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;; -2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;; -2717;BALLOT X;So;0;ON;;;;;N;;;;; -2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;; -2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;; -271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; -271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;; -271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;; -271D;LATIN CROSS;So;0;ON;;;;;N;;;;; -271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; -271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;; -2720;MALTESE CROSS;So;0;ON;;;;;N;;;;; -2721;STAR OF DAVID;So;0;ON;;;;;N;;;;; -2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;; -2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;; -2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; -272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;; -272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;; -272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;; -272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; -272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; -272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;; -2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;; -2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;; -2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;; -2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; -2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; -2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;; -273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;; -273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;; -273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;; -2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;; -2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;; -2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;; -2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;; -2744;SNOWFLAKE;So;0;ON;;;;;N;;;;; -2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;; -2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;; -2747;SPARKLE;So;0;ON;;;;;N;;;;; -2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;; -2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; -274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; -274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; -274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; -2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; -2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; -2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; -2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;; -2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;; -2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;; -275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;; -275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;; -2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;; -2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;; -2766;FLORAL HEART;So;0;ON;;;;;N;;;;; -2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; -2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;; -2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;; -2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;; -2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;; -277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;; -277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;; -277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;; -277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;; -277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;; -277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;; -2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;; -2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;; -2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;; -2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;; -2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;; -2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;; -2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;; -2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;; -2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;; -2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;; -278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;; -278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;; -278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;; -278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;; -278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;; -278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;; -2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;; -2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;; -2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;; -2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;; -2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;; -2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;; -2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;; -279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;; -279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;; -279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;; -279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;; -279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;; -279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;; -27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;; -27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;; -27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;; -27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;; -27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;; -27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;; -27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;; -27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;; -27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;; -27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;; -27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;; -27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;; -27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;; -27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; -27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; -27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; -27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; -27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;; -27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;; -27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;; -27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;; -27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;; -27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;; -27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;; -27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;; -27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;; -27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;; -27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; -27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; -27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; -2800;BRAILLE PATTERN BLANK;So;0;ON;;;;;N;;;;; -2801;BRAILLE PATTERN DOTS-1;So;0;ON;;;;;N;;;;; -2802;BRAILLE PATTERN DOTS-2;So;0;ON;;;;;N;;;;; -2803;BRAILLE PATTERN DOTS-12;So;0;ON;;;;;N;;;;; -2804;BRAILLE PATTERN DOTS-3;So;0;ON;;;;;N;;;;; -2805;BRAILLE PATTERN DOTS-13;So;0;ON;;;;;N;;;;; -2806;BRAILLE PATTERN DOTS-23;So;0;ON;;;;;N;;;;; -2807;BRAILLE PATTERN DOTS-123;So;0;ON;;;;;N;;;;; -2808;BRAILLE PATTERN DOTS-4;So;0;ON;;;;;N;;;;; -2809;BRAILLE PATTERN DOTS-14;So;0;ON;;;;;N;;;;; -280A;BRAILLE PATTERN DOTS-24;So;0;ON;;;;;N;;;;; -280B;BRAILLE PATTERN DOTS-124;So;0;ON;;;;;N;;;;; -280C;BRAILLE PATTERN DOTS-34;So;0;ON;;;;;N;;;;; -280D;BRAILLE PATTERN DOTS-134;So;0;ON;;;;;N;;;;; -280E;BRAILLE PATTERN DOTS-234;So;0;ON;;;;;N;;;;; -280F;BRAILLE PATTERN DOTS-1234;So;0;ON;;;;;N;;;;; -2810;BRAILLE PATTERN DOTS-5;So;0;ON;;;;;N;;;;; -2811;BRAILLE PATTERN DOTS-15;So;0;ON;;;;;N;;;;; -2812;BRAILLE PATTERN DOTS-25;So;0;ON;;;;;N;;;;; -2813;BRAILLE PATTERN DOTS-125;So;0;ON;;;;;N;;;;; -2814;BRAILLE PATTERN DOTS-35;So;0;ON;;;;;N;;;;; -2815;BRAILLE PATTERN DOTS-135;So;0;ON;;;;;N;;;;; -2816;BRAILLE PATTERN DOTS-235;So;0;ON;;;;;N;;;;; -2817;BRAILLE PATTERN DOTS-1235;So;0;ON;;;;;N;;;;; -2818;BRAILLE PATTERN DOTS-45;So;0;ON;;;;;N;;;;; -2819;BRAILLE PATTERN DOTS-145;So;0;ON;;;;;N;;;;; -281A;BRAILLE PATTERN DOTS-245;So;0;ON;;;;;N;;;;; -281B;BRAILLE PATTERN DOTS-1245;So;0;ON;;;;;N;;;;; -281C;BRAILLE PATTERN DOTS-345;So;0;ON;;;;;N;;;;; -281D;BRAILLE PATTERN DOTS-1345;So;0;ON;;;;;N;;;;; -281E;BRAILLE PATTERN DOTS-2345;So;0;ON;;;;;N;;;;; -281F;BRAILLE PATTERN DOTS-12345;So;0;ON;;;;;N;;;;; -2820;BRAILLE PATTERN DOTS-6;So;0;ON;;;;;N;;;;; -2821;BRAILLE PATTERN DOTS-16;So;0;ON;;;;;N;;;;; -2822;BRAILLE PATTERN DOTS-26;So;0;ON;;;;;N;;;;; -2823;BRAILLE PATTERN DOTS-126;So;0;ON;;;;;N;;;;; -2824;BRAILLE PATTERN DOTS-36;So;0;ON;;;;;N;;;;; -2825;BRAILLE PATTERN DOTS-136;So;0;ON;;;;;N;;;;; -2826;BRAILLE PATTERN DOTS-236;So;0;ON;;;;;N;;;;; -2827;BRAILLE PATTERN DOTS-1236;So;0;ON;;;;;N;;;;; -2828;BRAILLE PATTERN DOTS-46;So;0;ON;;;;;N;;;;; -2829;BRAILLE PATTERN DOTS-146;So;0;ON;;;;;N;;;;; -282A;BRAILLE PATTERN DOTS-246;So;0;ON;;;;;N;;;;; -282B;BRAILLE PATTERN DOTS-1246;So;0;ON;;;;;N;;;;; -282C;BRAILLE PATTERN DOTS-346;So;0;ON;;;;;N;;;;; -282D;BRAILLE PATTERN DOTS-1346;So;0;ON;;;;;N;;;;; -282E;BRAILLE PATTERN DOTS-2346;So;0;ON;;;;;N;;;;; -282F;BRAILLE PATTERN DOTS-12346;So;0;ON;;;;;N;;;;; -2830;BRAILLE PATTERN DOTS-56;So;0;ON;;;;;N;;;;; -2831;BRAILLE PATTERN DOTS-156;So;0;ON;;;;;N;;;;; -2832;BRAILLE PATTERN DOTS-256;So;0;ON;;;;;N;;;;; -2833;BRAILLE PATTERN DOTS-1256;So;0;ON;;;;;N;;;;; -2834;BRAILLE PATTERN DOTS-356;So;0;ON;;;;;N;;;;; -2835;BRAILLE PATTERN DOTS-1356;So;0;ON;;;;;N;;;;; -2836;BRAILLE PATTERN DOTS-2356;So;0;ON;;;;;N;;;;; -2837;BRAILLE PATTERN DOTS-12356;So;0;ON;;;;;N;;;;; -2838;BRAILLE PATTERN DOTS-456;So;0;ON;;;;;N;;;;; -2839;BRAILLE PATTERN DOTS-1456;So;0;ON;;;;;N;;;;; -283A;BRAILLE PATTERN DOTS-2456;So;0;ON;;;;;N;;;;; -283B;BRAILLE PATTERN DOTS-12456;So;0;ON;;;;;N;;;;; -283C;BRAILLE PATTERN DOTS-3456;So;0;ON;;;;;N;;;;; -283D;BRAILLE PATTERN DOTS-13456;So;0;ON;;;;;N;;;;; -283E;BRAILLE PATTERN DOTS-23456;So;0;ON;;;;;N;;;;; -283F;BRAILLE PATTERN DOTS-123456;So;0;ON;;;;;N;;;;; -2840;BRAILLE PATTERN DOTS-7;So;0;ON;;;;;N;;;;; -2841;BRAILLE PATTERN DOTS-17;So;0;ON;;;;;N;;;;; -2842;BRAILLE PATTERN DOTS-27;So;0;ON;;;;;N;;;;; -2843;BRAILLE PATTERN DOTS-127;So;0;ON;;;;;N;;;;; -2844;BRAILLE PATTERN DOTS-37;So;0;ON;;;;;N;;;;; -2845;BRAILLE PATTERN DOTS-137;So;0;ON;;;;;N;;;;; -2846;BRAILLE PATTERN DOTS-237;So;0;ON;;;;;N;;;;; -2847;BRAILLE PATTERN DOTS-1237;So;0;ON;;;;;N;;;;; -2848;BRAILLE PATTERN DOTS-47;So;0;ON;;;;;N;;;;; -2849;BRAILLE PATTERN DOTS-147;So;0;ON;;;;;N;;;;; -284A;BRAILLE PATTERN DOTS-247;So;0;ON;;;;;N;;;;; -284B;BRAILLE PATTERN DOTS-1247;So;0;ON;;;;;N;;;;; -284C;BRAILLE PATTERN DOTS-347;So;0;ON;;;;;N;;;;; -284D;BRAILLE PATTERN DOTS-1347;So;0;ON;;;;;N;;;;; -284E;BRAILLE PATTERN DOTS-2347;So;0;ON;;;;;N;;;;; -284F;BRAILLE PATTERN DOTS-12347;So;0;ON;;;;;N;;;;; -2850;BRAILLE PATTERN DOTS-57;So;0;ON;;;;;N;;;;; -2851;BRAILLE PATTERN DOTS-157;So;0;ON;;;;;N;;;;; -2852;BRAILLE PATTERN DOTS-257;So;0;ON;;;;;N;;;;; -2853;BRAILLE PATTERN DOTS-1257;So;0;ON;;;;;N;;;;; -2854;BRAILLE PATTERN DOTS-357;So;0;ON;;;;;N;;;;; -2855;BRAILLE PATTERN DOTS-1357;So;0;ON;;;;;N;;;;; -2856;BRAILLE PATTERN DOTS-2357;So;0;ON;;;;;N;;;;; -2857;BRAILLE PATTERN DOTS-12357;So;0;ON;;;;;N;;;;; -2858;BRAILLE PATTERN DOTS-457;So;0;ON;;;;;N;;;;; -2859;BRAILLE PATTERN DOTS-1457;So;0;ON;;;;;N;;;;; -285A;BRAILLE PATTERN DOTS-2457;So;0;ON;;;;;N;;;;; -285B;BRAILLE PATTERN DOTS-12457;So;0;ON;;;;;N;;;;; -285C;BRAILLE PATTERN DOTS-3457;So;0;ON;;;;;N;;;;; -285D;BRAILLE PATTERN DOTS-13457;So;0;ON;;;;;N;;;;; -285E;BRAILLE PATTERN DOTS-23457;So;0;ON;;;;;N;;;;; -285F;BRAILLE PATTERN DOTS-123457;So;0;ON;;;;;N;;;;; -2860;BRAILLE PATTERN DOTS-67;So;0;ON;;;;;N;;;;; -2861;BRAILLE PATTERN DOTS-167;So;0;ON;;;;;N;;;;; -2862;BRAILLE PATTERN DOTS-267;So;0;ON;;;;;N;;;;; -2863;BRAILLE PATTERN DOTS-1267;So;0;ON;;;;;N;;;;; -2864;BRAILLE PATTERN DOTS-367;So;0;ON;;;;;N;;;;; -2865;BRAILLE PATTERN DOTS-1367;So;0;ON;;;;;N;;;;; -2866;BRAILLE PATTERN DOTS-2367;So;0;ON;;;;;N;;;;; -2867;BRAILLE PATTERN DOTS-12367;So;0;ON;;;;;N;;;;; -2868;BRAILLE PATTERN DOTS-467;So;0;ON;;;;;N;;;;; -2869;BRAILLE PATTERN DOTS-1467;So;0;ON;;;;;N;;;;; -286A;BRAILLE PATTERN DOTS-2467;So;0;ON;;;;;N;;;;; -286B;BRAILLE PATTERN DOTS-12467;So;0;ON;;;;;N;;;;; -286C;BRAILLE PATTERN DOTS-3467;So;0;ON;;;;;N;;;;; -286D;BRAILLE PATTERN DOTS-13467;So;0;ON;;;;;N;;;;; -286E;BRAILLE PATTERN DOTS-23467;So;0;ON;;;;;N;;;;; -286F;BRAILLE PATTERN DOTS-123467;So;0;ON;;;;;N;;;;; -2870;BRAILLE PATTERN DOTS-567;So;0;ON;;;;;N;;;;; -2871;BRAILLE PATTERN DOTS-1567;So;0;ON;;;;;N;;;;; -2872;BRAILLE PATTERN DOTS-2567;So;0;ON;;;;;N;;;;; -2873;BRAILLE PATTERN DOTS-12567;So;0;ON;;;;;N;;;;; -2874;BRAILLE PATTERN DOTS-3567;So;0;ON;;;;;N;;;;; -2875;BRAILLE PATTERN DOTS-13567;So;0;ON;;;;;N;;;;; -2876;BRAILLE PATTERN DOTS-23567;So;0;ON;;;;;N;;;;; -2877;BRAILLE PATTERN DOTS-123567;So;0;ON;;;;;N;;;;; -2878;BRAILLE PATTERN DOTS-4567;So;0;ON;;;;;N;;;;; -2879;BRAILLE PATTERN DOTS-14567;So;0;ON;;;;;N;;;;; -287A;BRAILLE PATTERN DOTS-24567;So;0;ON;;;;;N;;;;; -287B;BRAILLE PATTERN DOTS-124567;So;0;ON;;;;;N;;;;; -287C;BRAILLE PATTERN DOTS-34567;So;0;ON;;;;;N;;;;; -287D;BRAILLE PATTERN DOTS-134567;So;0;ON;;;;;N;;;;; -287E;BRAILLE PATTERN DOTS-234567;So;0;ON;;;;;N;;;;; -287F;BRAILLE PATTERN DOTS-1234567;So;0;ON;;;;;N;;;;; -2880;BRAILLE PATTERN DOTS-8;So;0;ON;;;;;N;;;;; -2881;BRAILLE PATTERN DOTS-18;So;0;ON;;;;;N;;;;; -2882;BRAILLE PATTERN DOTS-28;So;0;ON;;;;;N;;;;; -2883;BRAILLE PATTERN DOTS-128;So;0;ON;;;;;N;;;;; -2884;BRAILLE PATTERN DOTS-38;So;0;ON;;;;;N;;;;; -2885;BRAILLE PATTERN DOTS-138;So;0;ON;;;;;N;;;;; -2886;BRAILLE PATTERN DOTS-238;So;0;ON;;;;;N;;;;; -2887;BRAILLE PATTERN DOTS-1238;So;0;ON;;;;;N;;;;; -2888;BRAILLE PATTERN DOTS-48;So;0;ON;;;;;N;;;;; -2889;BRAILLE PATTERN DOTS-148;So;0;ON;;;;;N;;;;; -288A;BRAILLE PATTERN DOTS-248;So;0;ON;;;;;N;;;;; -288B;BRAILLE PATTERN DOTS-1248;So;0;ON;;;;;N;;;;; -288C;BRAILLE PATTERN DOTS-348;So;0;ON;;;;;N;;;;; -288D;BRAILLE PATTERN DOTS-1348;So;0;ON;;;;;N;;;;; -288E;BRAILLE PATTERN DOTS-2348;So;0;ON;;;;;N;;;;; -288F;BRAILLE PATTERN DOTS-12348;So;0;ON;;;;;N;;;;; -2890;BRAILLE PATTERN DOTS-58;So;0;ON;;;;;N;;;;; -2891;BRAILLE PATTERN DOTS-158;So;0;ON;;;;;N;;;;; -2892;BRAILLE PATTERN DOTS-258;So;0;ON;;;;;N;;;;; -2893;BRAILLE PATTERN DOTS-1258;So;0;ON;;;;;N;;;;; -2894;BRAILLE PATTERN DOTS-358;So;0;ON;;;;;N;;;;; -2895;BRAILLE PATTERN DOTS-1358;So;0;ON;;;;;N;;;;; -2896;BRAILLE PATTERN DOTS-2358;So;0;ON;;;;;N;;;;; -2897;BRAILLE PATTERN DOTS-12358;So;0;ON;;;;;N;;;;; -2898;BRAILLE PATTERN DOTS-458;So;0;ON;;;;;N;;;;; -2899;BRAILLE PATTERN DOTS-1458;So;0;ON;;;;;N;;;;; -289A;BRAILLE PATTERN DOTS-2458;So;0;ON;;;;;N;;;;; -289B;BRAILLE PATTERN DOTS-12458;So;0;ON;;;;;N;;;;; -289C;BRAILLE PATTERN DOTS-3458;So;0;ON;;;;;N;;;;; -289D;BRAILLE PATTERN DOTS-13458;So;0;ON;;;;;N;;;;; -289E;BRAILLE PATTERN DOTS-23458;So;0;ON;;;;;N;;;;; -289F;BRAILLE PATTERN DOTS-123458;So;0;ON;;;;;N;;;;; -28A0;BRAILLE PATTERN DOTS-68;So;0;ON;;;;;N;;;;; -28A1;BRAILLE PATTERN DOTS-168;So;0;ON;;;;;N;;;;; -28A2;BRAILLE PATTERN DOTS-268;So;0;ON;;;;;N;;;;; -28A3;BRAILLE PATTERN DOTS-1268;So;0;ON;;;;;N;;;;; -28A4;BRAILLE PATTERN DOTS-368;So;0;ON;;;;;N;;;;; -28A5;BRAILLE PATTERN DOTS-1368;So;0;ON;;;;;N;;;;; -28A6;BRAILLE PATTERN DOTS-2368;So;0;ON;;;;;N;;;;; -28A7;BRAILLE PATTERN DOTS-12368;So;0;ON;;;;;N;;;;; -28A8;BRAILLE PATTERN DOTS-468;So;0;ON;;;;;N;;;;; -28A9;BRAILLE PATTERN DOTS-1468;So;0;ON;;;;;N;;;;; -28AA;BRAILLE PATTERN DOTS-2468;So;0;ON;;;;;N;;;;; -28AB;BRAILLE PATTERN DOTS-12468;So;0;ON;;;;;N;;;;; -28AC;BRAILLE PATTERN DOTS-3468;So;0;ON;;;;;N;;;;; -28AD;BRAILLE PATTERN DOTS-13468;So;0;ON;;;;;N;;;;; -28AE;BRAILLE PATTERN DOTS-23468;So;0;ON;;;;;N;;;;; -28AF;BRAILLE PATTERN DOTS-123468;So;0;ON;;;;;N;;;;; -28B0;BRAILLE PATTERN DOTS-568;So;0;ON;;;;;N;;;;; -28B1;BRAILLE PATTERN DOTS-1568;So;0;ON;;;;;N;;;;; -28B2;BRAILLE PATTERN DOTS-2568;So;0;ON;;;;;N;;;;; -28B3;BRAILLE PATTERN DOTS-12568;So;0;ON;;;;;N;;;;; -28B4;BRAILLE PATTERN DOTS-3568;So;0;ON;;;;;N;;;;; -28B5;BRAILLE PATTERN DOTS-13568;So;0;ON;;;;;N;;;;; -28B6;BRAILLE PATTERN DOTS-23568;So;0;ON;;;;;N;;;;; -28B7;BRAILLE PATTERN DOTS-123568;So;0;ON;;;;;N;;;;; -28B8;BRAILLE PATTERN DOTS-4568;So;0;ON;;;;;N;;;;; -28B9;BRAILLE PATTERN DOTS-14568;So;0;ON;;;;;N;;;;; -28BA;BRAILLE PATTERN DOTS-24568;So;0;ON;;;;;N;;;;; -28BB;BRAILLE PATTERN DOTS-124568;So;0;ON;;;;;N;;;;; -28BC;BRAILLE PATTERN DOTS-34568;So;0;ON;;;;;N;;;;; -28BD;BRAILLE PATTERN DOTS-134568;So;0;ON;;;;;N;;;;; -28BE;BRAILLE PATTERN DOTS-234568;So;0;ON;;;;;N;;;;; -28BF;BRAILLE PATTERN DOTS-1234568;So;0;ON;;;;;N;;;;; -28C0;BRAILLE PATTERN DOTS-78;So;0;ON;;;;;N;;;;; -28C1;BRAILLE PATTERN DOTS-178;So;0;ON;;;;;N;;;;; -28C2;BRAILLE PATTERN DOTS-278;So;0;ON;;;;;N;;;;; -28C3;BRAILLE PATTERN DOTS-1278;So;0;ON;;;;;N;;;;; -28C4;BRAILLE PATTERN DOTS-378;So;0;ON;;;;;N;;;;; -28C5;BRAILLE PATTERN DOTS-1378;So;0;ON;;;;;N;;;;; -28C6;BRAILLE PATTERN DOTS-2378;So;0;ON;;;;;N;;;;; -28C7;BRAILLE PATTERN DOTS-12378;So;0;ON;;;;;N;;;;; -28C8;BRAILLE PATTERN DOTS-478;So;0;ON;;;;;N;;;;; -28C9;BRAILLE PATTERN DOTS-1478;So;0;ON;;;;;N;;;;; -28CA;BRAILLE PATTERN DOTS-2478;So;0;ON;;;;;N;;;;; -28CB;BRAILLE PATTERN DOTS-12478;So;0;ON;;;;;N;;;;; -28CC;BRAILLE PATTERN DOTS-3478;So;0;ON;;;;;N;;;;; -28CD;BRAILLE PATTERN DOTS-13478;So;0;ON;;;;;N;;;;; -28CE;BRAILLE PATTERN DOTS-23478;So;0;ON;;;;;N;;;;; -28CF;BRAILLE PATTERN DOTS-123478;So;0;ON;;;;;N;;;;; -28D0;BRAILLE PATTERN DOTS-578;So;0;ON;;;;;N;;;;; -28D1;BRAILLE PATTERN DOTS-1578;So;0;ON;;;;;N;;;;; -28D2;BRAILLE PATTERN DOTS-2578;So;0;ON;;;;;N;;;;; -28D3;BRAILLE PATTERN DOTS-12578;So;0;ON;;;;;N;;;;; -28D4;BRAILLE PATTERN DOTS-3578;So;0;ON;;;;;N;;;;; -28D5;BRAILLE PATTERN DOTS-13578;So;0;ON;;;;;N;;;;; -28D6;BRAILLE PATTERN DOTS-23578;So;0;ON;;;;;N;;;;; -28D7;BRAILLE PATTERN DOTS-123578;So;0;ON;;;;;N;;;;; -28D8;BRAILLE PATTERN DOTS-4578;So;0;ON;;;;;N;;;;; -28D9;BRAILLE PATTERN DOTS-14578;So;0;ON;;;;;N;;;;; -28DA;BRAILLE PATTERN DOTS-24578;So;0;ON;;;;;N;;;;; -28DB;BRAILLE PATTERN DOTS-124578;So;0;ON;;;;;N;;;;; -28DC;BRAILLE PATTERN DOTS-34578;So;0;ON;;;;;N;;;;; -28DD;BRAILLE PATTERN DOTS-134578;So;0;ON;;;;;N;;;;; -28DE;BRAILLE PATTERN DOTS-234578;So;0;ON;;;;;N;;;;; -28DF;BRAILLE PATTERN DOTS-1234578;So;0;ON;;;;;N;;;;; -28E0;BRAILLE PATTERN DOTS-678;So;0;ON;;;;;N;;;;; -28E1;BRAILLE PATTERN DOTS-1678;So;0;ON;;;;;N;;;;; -28E2;BRAILLE PATTERN DOTS-2678;So;0;ON;;;;;N;;;;; -28E3;BRAILLE PATTERN DOTS-12678;So;0;ON;;;;;N;;;;; -28E4;BRAILLE PATTERN DOTS-3678;So;0;ON;;;;;N;;;;; -28E5;BRAILLE PATTERN DOTS-13678;So;0;ON;;;;;N;;;;; -28E6;BRAILLE PATTERN DOTS-23678;So;0;ON;;;;;N;;;;; -28E7;BRAILLE PATTERN DOTS-123678;So;0;ON;;;;;N;;;;; -28E8;BRAILLE PATTERN DOTS-4678;So;0;ON;;;;;N;;;;; -28E9;BRAILLE PATTERN DOTS-14678;So;0;ON;;;;;N;;;;; -28EA;BRAILLE PATTERN DOTS-24678;So;0;ON;;;;;N;;;;; -28EB;BRAILLE PATTERN DOTS-124678;So;0;ON;;;;;N;;;;; -28EC;BRAILLE PATTERN DOTS-34678;So;0;ON;;;;;N;;;;; -28ED;BRAILLE PATTERN DOTS-134678;So;0;ON;;;;;N;;;;; -28EE;BRAILLE PATTERN DOTS-234678;So;0;ON;;;;;N;;;;; -28EF;BRAILLE PATTERN DOTS-1234678;So;0;ON;;;;;N;;;;; -28F0;BRAILLE PATTERN DOTS-5678;So;0;ON;;;;;N;;;;; -28F1;BRAILLE PATTERN DOTS-15678;So;0;ON;;;;;N;;;;; -28F2;BRAILLE PATTERN DOTS-25678;So;0;ON;;;;;N;;;;; -28F3;BRAILLE PATTERN DOTS-125678;So;0;ON;;;;;N;;;;; -28F4;BRAILLE PATTERN DOTS-35678;So;0;ON;;;;;N;;;;; -28F5;BRAILLE PATTERN DOTS-135678;So;0;ON;;;;;N;;;;; -28F6;BRAILLE PATTERN DOTS-235678;So;0;ON;;;;;N;;;;; -28F7;BRAILLE PATTERN DOTS-1235678;So;0;ON;;;;;N;;;;; -28F8;BRAILLE PATTERN DOTS-45678;So;0;ON;;;;;N;;;;; -28F9;BRAILLE PATTERN DOTS-145678;So;0;ON;;;;;N;;;;; -28FA;BRAILLE PATTERN DOTS-245678;So;0;ON;;;;;N;;;;; -28FB;BRAILLE PATTERN DOTS-1245678;So;0;ON;;;;;N;;;;; -28FC;BRAILLE PATTERN DOTS-345678;So;0;ON;;;;;N;;;;; -28FD;BRAILLE PATTERN DOTS-1345678;So;0;ON;;;;;N;;;;; -28FE;BRAILLE PATTERN DOTS-2345678;So;0;ON;;;;;N;;;;; -28FF;BRAILLE PATTERN DOTS-12345678;So;0;ON;;;;;N;;;;; -2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; -2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; -2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; -2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;; -2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;; -2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;; -2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;; -2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;; -2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;; -2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;; -2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;; -2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;; -2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;; -2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;; -2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;; -2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;; -2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;; -2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;; -2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;; -2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;; -2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;; -2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;; -2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;; -2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;; -2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;; -2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;; -2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;; -2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;; -2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;; -2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;; -2E9F;CJK RADICAL MOTHER;So;0;ON; 6BCD;;;;N;;;;; -2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;; -2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;; -2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;; -2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;; -2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;; -2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;; -2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;; -2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;; -2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;; -2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;; -2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;; -2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;; -2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;; -2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;; -2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;; -2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;; -2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;; -2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;; -2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;; -2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;; -2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;; -2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;; -2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;; -2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;; -2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;; -2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;; -2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;; -2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;; -2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;; -2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;; -2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;; -2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;; -2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;; -2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;; -2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;; -2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;; -2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;; -2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;; -2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;; -2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;; -2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;; -2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;; -2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;; -2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;; -2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;; -2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;; -2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;; -2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;; -2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;; -2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;; -2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;; -2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;; -2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;; -2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;; -2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;; -2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;; -2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;; -2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;; -2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;; -2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;; -2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;; -2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;; -2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;; -2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;; -2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;; -2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;; -2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;; -2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;; -2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;; -2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;; -2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;; -2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;; -2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;; -2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;; -2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;; -2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; -2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; -2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; -2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; -2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; -2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; -2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;; -2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;; -2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON; 9F9F;;;;N;;;;; -2F00;KANGXI RADICAL ONE;So;0;ON; 4E00;;;;N;;;;; -2F01;KANGXI RADICAL LINE;So;0;ON; 4E28;;;;N;;;;; -2F02;KANGXI RADICAL DOT;So;0;ON; 4E36;;;;N;;;;; -2F03;KANGXI RADICAL SLASH;So;0;ON; 4E3F;;;;N;;;;; -2F04;KANGXI RADICAL SECOND;So;0;ON; 4E59;;;;N;;;;; -2F05;KANGXI RADICAL HOOK;So;0;ON; 4E85;;;;N;;;;; -2F06;KANGXI RADICAL TWO;So;0;ON; 4E8C;;;;N;;;;; -2F07;KANGXI RADICAL LID;So;0;ON; 4EA0;;;;N;;;;; -2F08;KANGXI RADICAL MAN;So;0;ON; 4EBA;;;;N;;;;; -2F09;KANGXI RADICAL LEGS;So;0;ON; 513F;;;;N;;;;; -2F0A;KANGXI RADICAL ENTER;So;0;ON; 5165;;;;N;;;;; -2F0B;KANGXI RADICAL EIGHT;So;0;ON; 516B;;;;N;;;;; -2F0C;KANGXI RADICAL DOWN BOX;So;0;ON; 5182;;;;N;;;;; -2F0D;KANGXI RADICAL COVER;So;0;ON; 5196;;;;N;;;;; -2F0E;KANGXI RADICAL ICE;So;0;ON; 51AB;;;;N;;;;; -2F0F;KANGXI RADICAL TABLE;So;0;ON; 51E0;;;;N;;;;; -2F10;KANGXI RADICAL OPEN BOX;So;0;ON; 51F5;;;;N;;;;; -2F11;KANGXI RADICAL KNIFE;So;0;ON; 5200;;;;N;;;;; -2F12;KANGXI RADICAL POWER;So;0;ON; 529B;;;;N;;;;; -2F13;KANGXI RADICAL WRAP;So;0;ON; 52F9;;;;N;;;;; -2F14;KANGXI RADICAL SPOON;So;0;ON; 5315;;;;N;;;;; -2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON; 531A;;;;N;;;;; -2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON; 5338;;;;N;;;;; -2F17;KANGXI RADICAL TEN;So;0;ON; 5341;;;;N;;;;; -2F18;KANGXI RADICAL DIVINATION;So;0;ON; 535C;;;;N;;;;; -2F19;KANGXI RADICAL SEAL;So;0;ON; 5369;;;;N;;;;; -2F1A;KANGXI RADICAL CLIFF;So;0;ON; 5382;;;;N;;;;; -2F1B;KANGXI RADICAL PRIVATE;So;0;ON; 53B6;;;;N;;;;; -2F1C;KANGXI RADICAL AGAIN;So;0;ON; 53C8;;;;N;;;;; -2F1D;KANGXI RADICAL MOUTH;So;0;ON; 53E3;;;;N;;;;; -2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON; 56D7;;;;N;;;;; -2F1F;KANGXI RADICAL EARTH;So;0;ON; 571F;;;;N;;;;; -2F20;KANGXI RADICAL SCHOLAR;So;0;ON; 58EB;;;;N;;;;; -2F21;KANGXI RADICAL GO;So;0;ON; 5902;;;;N;;;;; -2F22;KANGXI RADICAL GO SLOWLY;So;0;ON; 590A;;;;N;;;;; -2F23;KANGXI RADICAL EVENING;So;0;ON; 5915;;;;N;;;;; -2F24;KANGXI RADICAL BIG;So;0;ON; 5927;;;;N;;;;; -2F25;KANGXI RADICAL WOMAN;So;0;ON; 5973;;;;N;;;;; -2F26;KANGXI RADICAL CHILD;So;0;ON; 5B50;;;;N;;;;; -2F27;KANGXI RADICAL ROOF;So;0;ON; 5B80;;;;N;;;;; -2F28;KANGXI RADICAL INCH;So;0;ON; 5BF8;;;;N;;;;; -2F29;KANGXI RADICAL SMALL;So;0;ON; 5C0F;;;;N;;;;; -2F2A;KANGXI RADICAL LAME;So;0;ON; 5C22;;;;N;;;;; -2F2B;KANGXI RADICAL CORPSE;So;0;ON; 5C38;;;;N;;;;; -2F2C;KANGXI RADICAL SPROUT;So;0;ON; 5C6E;;;;N;;;;; -2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON; 5C71;;;;N;;;;; -2F2E;KANGXI RADICAL RIVER;So;0;ON; 5DDB;;;;N;;;;; -2F2F;KANGXI RADICAL WORK;So;0;ON; 5DE5;;;;N;;;;; -2F30;KANGXI RADICAL ONESELF;So;0;ON; 5DF1;;;;N;;;;; -2F31;KANGXI RADICAL TURBAN;So;0;ON; 5DFE;;;;N;;;;; -2F32;KANGXI RADICAL DRY;So;0;ON; 5E72;;;;N;;;;; -2F33;KANGXI RADICAL SHORT THREAD;So;0;ON; 5E7A;;;;N;;;;; -2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON; 5E7F;;;;N;;;;; -2F35;KANGXI RADICAL LONG STRIDE;So;0;ON; 5EF4;;;;N;;;;; -2F36;KANGXI RADICAL TWO HANDS;So;0;ON; 5EFE;;;;N;;;;; -2F37;KANGXI RADICAL SHOOT;So;0;ON; 5F0B;;;;N;;;;; -2F38;KANGXI RADICAL BOW;So;0;ON; 5F13;;;;N;;;;; -2F39;KANGXI RADICAL SNOUT;So;0;ON; 5F50;;;;N;;;;; -2F3A;KANGXI RADICAL BRISTLE;So;0;ON; 5F61;;;;N;;;;; -2F3B;KANGXI RADICAL STEP;So;0;ON; 5F73;;;;N;;;;; -2F3C;KANGXI RADICAL HEART;So;0;ON; 5FC3;;;;N;;;;; -2F3D;KANGXI RADICAL HALBERD;So;0;ON; 6208;;;;N;;;;; -2F3E;KANGXI RADICAL DOOR;So;0;ON; 6236;;;;N;;;;; -2F3F;KANGXI RADICAL HAND;So;0;ON; 624B;;;;N;;;;; -2F40;KANGXI RADICAL BRANCH;So;0;ON; 652F;;;;N;;;;; -2F41;KANGXI RADICAL RAP;So;0;ON; 6534;;;;N;;;;; -2F42;KANGXI RADICAL SCRIPT;So;0;ON; 6587;;;;N;;;;; -2F43;KANGXI RADICAL DIPPER;So;0;ON; 6597;;;;N;;;;; -2F44;KANGXI RADICAL AXE;So;0;ON; 65A4;;;;N;;;;; -2F45;KANGXI RADICAL SQUARE;So;0;ON; 65B9;;;;N;;;;; -2F46;KANGXI RADICAL NOT;So;0;ON; 65E0;;;;N;;;;; -2F47;KANGXI RADICAL SUN;So;0;ON; 65E5;;;;N;;;;; -2F48;KANGXI RADICAL SAY;So;0;ON; 66F0;;;;N;;;;; -2F49;KANGXI RADICAL MOON;So;0;ON; 6708;;;;N;;;;; -2F4A;KANGXI RADICAL TREE;So;0;ON; 6728;;;;N;;;;; -2F4B;KANGXI RADICAL LACK;So;0;ON; 6B20;;;;N;;;;; -2F4C;KANGXI RADICAL STOP;So;0;ON; 6B62;;;;N;;;;; -2F4D;KANGXI RADICAL DEATH;So;0;ON; 6B79;;;;N;;;;; -2F4E;KANGXI RADICAL WEAPON;So;0;ON; 6BB3;;;;N;;;;; -2F4F;KANGXI RADICAL DO NOT;So;0;ON; 6BCB;;;;N;;;;; -2F50;KANGXI RADICAL COMPARE;So;0;ON; 6BD4;;;;N;;;;; -2F51;KANGXI RADICAL FUR;So;0;ON; 6BDB;;;;N;;;;; -2F52;KANGXI RADICAL CLAN;So;0;ON; 6C0F;;;;N;;;;; -2F53;KANGXI RADICAL STEAM;So;0;ON; 6C14;;;;N;;;;; -2F54;KANGXI RADICAL WATER;So;0;ON; 6C34;;;;N;;;;; -2F55;KANGXI RADICAL FIRE;So;0;ON; 706B;;;;N;;;;; -2F56;KANGXI RADICAL CLAW;So;0;ON; 722A;;;;N;;;;; -2F57;KANGXI RADICAL FATHER;So;0;ON; 7236;;;;N;;;;; -2F58;KANGXI RADICAL DOUBLE X;So;0;ON; 723B;;;;N;;;;; -2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON; 723F;;;;N;;;;; -2F5A;KANGXI RADICAL SLICE;So;0;ON; 7247;;;;N;;;;; -2F5B;KANGXI RADICAL FANG;So;0;ON; 7259;;;;N;;;;; -2F5C;KANGXI RADICAL COW;So;0;ON; 725B;;;;N;;;;; -2F5D;KANGXI RADICAL DOG;So;0;ON; 72AC;;;;N;;;;; -2F5E;KANGXI RADICAL PROFOUND;So;0;ON; 7384;;;;N;;;;; -2F5F;KANGXI RADICAL JADE;So;0;ON; 7389;;;;N;;;;; -2F60;KANGXI RADICAL MELON;So;0;ON; 74DC;;;;N;;;;; -2F61;KANGXI RADICAL TILE;So;0;ON; 74E6;;;;N;;;;; -2F62;KANGXI RADICAL SWEET;So;0;ON; 7518;;;;N;;;;; -2F63;KANGXI RADICAL LIFE;So;0;ON; 751F;;;;N;;;;; -2F64;KANGXI RADICAL USE;So;0;ON; 7528;;;;N;;;;; -2F65;KANGXI RADICAL FIELD;So;0;ON; 7530;;;;N;;;;; -2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON; 758B;;;;N;;;;; -2F67;KANGXI RADICAL SICKNESS;So;0;ON; 7592;;;;N;;;;; -2F68;KANGXI RADICAL DOTTED TENT;So;0;ON; 7676;;;;N;;;;; -2F69;KANGXI RADICAL WHITE;So;0;ON; 767D;;;;N;;;;; -2F6A;KANGXI RADICAL SKIN;So;0;ON; 76AE;;;;N;;;;; -2F6B;KANGXI RADICAL DISH;So;0;ON; 76BF;;;;N;;;;; -2F6C;KANGXI RADICAL EYE;So;0;ON; 76EE;;;;N;;;;; -2F6D;KANGXI RADICAL SPEAR;So;0;ON; 77DB;;;;N;;;;; -2F6E;KANGXI RADICAL ARROW;So;0;ON; 77E2;;;;N;;;;; -2F6F;KANGXI RADICAL STONE;So;0;ON; 77F3;;;;N;;;;; -2F70;KANGXI RADICAL SPIRIT;So;0;ON; 793A;;;;N;;;;; -2F71;KANGXI RADICAL TRACK;So;0;ON; 79B8;;;;N;;;;; -2F72;KANGXI RADICAL GRAIN;So;0;ON; 79BE;;;;N;;;;; -2F73;KANGXI RADICAL CAVE;So;0;ON; 7A74;;;;N;;;;; -2F74;KANGXI RADICAL STAND;So;0;ON; 7ACB;;;;N;;;;; -2F75;KANGXI RADICAL BAMBOO;So;0;ON; 7AF9;;;;N;;;;; -2F76;KANGXI RADICAL RICE;So;0;ON; 7C73;;;;N;;;;; -2F77;KANGXI RADICAL SILK;So;0;ON; 7CF8;;;;N;;;;; -2F78;KANGXI RADICAL JAR;So;0;ON; 7F36;;;;N;;;;; -2F79;KANGXI RADICAL NET;So;0;ON; 7F51;;;;N;;;;; -2F7A;KANGXI RADICAL SHEEP;So;0;ON; 7F8A;;;;N;;;;; -2F7B;KANGXI RADICAL FEATHER;So;0;ON; 7FBD;;;;N;;;;; -2F7C;KANGXI RADICAL OLD;So;0;ON; 8001;;;;N;;;;; -2F7D;KANGXI RADICAL AND;So;0;ON; 800C;;;;N;;;;; -2F7E;KANGXI RADICAL PLOW;So;0;ON; 8012;;;;N;;;;; -2F7F;KANGXI RADICAL EAR;So;0;ON; 8033;;;;N;;;;; -2F80;KANGXI RADICAL BRUSH;So;0;ON; 807F;;;;N;;;;; -2F81;KANGXI RADICAL MEAT;So;0;ON; 8089;;;;N;;;;; -2F82;KANGXI RADICAL MINISTER;So;0;ON; 81E3;;;;N;;;;; -2F83;KANGXI RADICAL SELF;So;0;ON; 81EA;;;;N;;;;; -2F84;KANGXI RADICAL ARRIVE;So;0;ON; 81F3;;;;N;;;;; -2F85;KANGXI RADICAL MORTAR;So;0;ON; 81FC;;;;N;;;;; -2F86;KANGXI RADICAL TONGUE;So;0;ON; 820C;;;;N;;;;; -2F87;KANGXI RADICAL OPPOSE;So;0;ON; 821B;;;;N;;;;; -2F88;KANGXI RADICAL BOAT;So;0;ON; 821F;;;;N;;;;; -2F89;KANGXI RADICAL STOPPING;So;0;ON; 826E;;;;N;;;;; -2F8A;KANGXI RADICAL COLOR;So;0;ON; 8272;;;;N;;;;; -2F8B;KANGXI RADICAL GRASS;So;0;ON; 8278;;;;N;;;;; -2F8C;KANGXI RADICAL TIGER;So;0;ON; 864D;;;;N;;;;; -2F8D;KANGXI RADICAL INSECT;So;0;ON; 866B;;;;N;;;;; -2F8E;KANGXI RADICAL BLOOD;So;0;ON; 8840;;;;N;;;;; -2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON; 884C;;;;N;;;;; -2F90;KANGXI RADICAL CLOTHES;So;0;ON; 8863;;;;N;;;;; -2F91;KANGXI RADICAL WEST;So;0;ON; 897E;;;;N;;;;; -2F92;KANGXI RADICAL SEE;So;0;ON; 898B;;;;N;;;;; -2F93;KANGXI RADICAL HORN;So;0;ON; 89D2;;;;N;;;;; -2F94;KANGXI RADICAL SPEECH;So;0;ON; 8A00;;;;N;;;;; -2F95;KANGXI RADICAL VALLEY;So;0;ON; 8C37;;;;N;;;;; -2F96;KANGXI RADICAL BEAN;So;0;ON; 8C46;;;;N;;;;; -2F97;KANGXI RADICAL PIG;So;0;ON; 8C55;;;;N;;;;; -2F98;KANGXI RADICAL BADGER;So;0;ON; 8C78;;;;N;;;;; -2F99;KANGXI RADICAL SHELL;So;0;ON; 8C9D;;;;N;;;;; -2F9A;KANGXI RADICAL RED;So;0;ON; 8D64;;;;N;;;;; -2F9B;KANGXI RADICAL RUN;So;0;ON; 8D70;;;;N;;;;; -2F9C;KANGXI RADICAL FOOT;So;0;ON; 8DB3;;;;N;;;;; -2F9D;KANGXI RADICAL BODY;So;0;ON; 8EAB;;;;N;;;;; -2F9E;KANGXI RADICAL CART;So;0;ON; 8ECA;;;;N;;;;; -2F9F;KANGXI RADICAL BITTER;So;0;ON; 8F9B;;;;N;;;;; -2FA0;KANGXI RADICAL MORNING;So;0;ON; 8FB0;;;;N;;;;; -2FA1;KANGXI RADICAL WALK;So;0;ON; 8FB5;;;;N;;;;; -2FA2;KANGXI RADICAL CITY;So;0;ON; 9091;;;;N;;;;; -2FA3;KANGXI RADICAL WINE;So;0;ON; 9149;;;;N;;;;; -2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON; 91C6;;;;N;;;;; -2FA5;KANGXI RADICAL VILLAGE;So;0;ON; 91CC;;;;N;;;;; -2FA6;KANGXI RADICAL GOLD;So;0;ON; 91D1;;;;N;;;;; -2FA7;KANGXI RADICAL LONG;So;0;ON; 9577;;;;N;;;;; -2FA8;KANGXI RADICAL GATE;So;0;ON; 9580;;;;N;;;;; -2FA9;KANGXI RADICAL MOUND;So;0;ON; 961C;;;;N;;;;; -2FAA;KANGXI RADICAL SLAVE;So;0;ON; 96B6;;;;N;;;;; -2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON; 96B9;;;;N;;;;; -2FAC;KANGXI RADICAL RAIN;So;0;ON; 96E8;;;;N;;;;; -2FAD;KANGXI RADICAL BLUE;So;0;ON; 9751;;;;N;;;;; -2FAE;KANGXI RADICAL WRONG;So;0;ON; 975E;;;;N;;;;; -2FAF;KANGXI RADICAL FACE;So;0;ON; 9762;;;;N;;;;; -2FB0;KANGXI RADICAL LEATHER;So;0;ON; 9769;;;;N;;;;; -2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON; 97CB;;;;N;;;;; -2FB2;KANGXI RADICAL LEEK;So;0;ON; 97ED;;;;N;;;;; -2FB3;KANGXI RADICAL SOUND;So;0;ON; 97F3;;;;N;;;;; -2FB4;KANGXI RADICAL LEAF;So;0;ON; 9801;;;;N;;;;; -2FB5;KANGXI RADICAL WIND;So;0;ON; 98A8;;;;N;;;;; -2FB6;KANGXI RADICAL FLY;So;0;ON; 98DB;;;;N;;;;; -2FB7;KANGXI RADICAL EAT;So;0;ON; 98DF;;;;N;;;;; -2FB8;KANGXI RADICAL HEAD;So;0;ON; 9996;;;;N;;;;; -2FB9;KANGXI RADICAL FRAGRANT;So;0;ON; 9999;;;;N;;;;; -2FBA;KANGXI RADICAL HORSE;So;0;ON; 99AC;;;;N;;;;; -2FBB;KANGXI RADICAL BONE;So;0;ON; 9AA8;;;;N;;;;; -2FBC;KANGXI RADICAL TALL;So;0;ON; 9AD8;;;;N;;;;; -2FBD;KANGXI RADICAL HAIR;So;0;ON; 9ADF;;;;N;;;;; -2FBE;KANGXI RADICAL FIGHT;So;0;ON; 9B25;;;;N;;;;; -2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON; 9B2F;;;;N;;;;; -2FC0;KANGXI RADICAL CAULDRON;So;0;ON; 9B32;;;;N;;;;; -2FC1;KANGXI RADICAL GHOST;So;0;ON; 9B3C;;;;N;;;;; -2FC2;KANGXI RADICAL FISH;So;0;ON; 9B5A;;;;N;;;;; -2FC3;KANGXI RADICAL BIRD;So;0;ON; 9CE5;;;;N;;;;; -2FC4;KANGXI RADICAL SALT;So;0;ON; 9E75;;;;N;;;;; -2FC5;KANGXI RADICAL DEER;So;0;ON; 9E7F;;;;N;;;;; -2FC6;KANGXI RADICAL WHEAT;So;0;ON; 9EA5;;;;N;;;;; -2FC7;KANGXI RADICAL HEMP;So;0;ON; 9EBB;;;;N;;;;; -2FC8;KANGXI RADICAL YELLOW;So;0;ON; 9EC3;;;;N;;;;; -2FC9;KANGXI RADICAL MILLET;So;0;ON; 9ECD;;;;N;;;;; -2FCA;KANGXI RADICAL BLACK;So;0;ON; 9ED1;;;;N;;;;; -2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON; 9EF9;;;;N;;;;; -2FCC;KANGXI RADICAL FROG;So;0;ON; 9EFD;;;;N;;;;; -2FCD;KANGXI RADICAL TRIPOD;So;0;ON; 9F0E;;;;N;;;;; -2FCE;KANGXI RADICAL DRUM;So;0;ON; 9F13;;;;N;;;;; -2FCF;KANGXI RADICAL RAT;So;0;ON; 9F20;;;;N;;;;; -2FD0;KANGXI RADICAL NOSE;So;0;ON; 9F3B;;;;N;;;;; -2FD1;KANGXI RADICAL EVEN;So;0;ON; 9F4A;;;;N;;;;; -2FD2;KANGXI RADICAL TOOTH;So;0;ON; 9F52;;;;N;;;;; -2FD3;KANGXI RADICAL DRAGON;So;0;ON; 9F8D;;;;N;;;;; -2FD4;KANGXI RADICAL TURTLE;So;0;ON; 9F9C;;;;N;;;;; -2FD5;KANGXI RADICAL FLUTE;So;0;ON; 9FA0;;;;N;;;;; -2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;; -2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;; -2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;; -2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;; -2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;; -2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;; -2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;; -2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;; -2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;; -2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;; -2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;; -2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;; -3000;IDEOGRAPHIC SPACE;Zs;0;WS; 0020;;;;N;;;;; -3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;; -3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;; -3003;DITTO MARK;Po;0;ON;;;;;N;;;;; -3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;; -3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; -3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;; -3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;; -3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;; -3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;; -300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;; -300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;; -300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;; -300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;; -300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;; -300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;; -3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;; -3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;; -3012;POSTAL MARK;So;0;ON;;;;;N;;;;; -3013;GETA MARK;So;0;ON;;;;;N;;;;; -3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;; -3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;; -3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;; -3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;; -3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;; -3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;; -301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;; -301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;; -301C;WAVE DASH;Pd;0;ON;;;;;N;;;;; -301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;; -301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; -301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; -3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;; -3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;; -3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;; -3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; -3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;; -3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;; -3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;; -3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;; -3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;; -3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;; -302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; -302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; -302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; -302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; -302E;HANGUL SINGLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;; -302F;HANGUL DOUBLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;; -3030;WAVY DASH;Pd;0;ON;;;;;N;;;;; -3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;; -3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;; -3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;; -3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;; -3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;; -3036;CIRCLED POSTAL MARK;So;0;ON; 3012;;;;N;;;;; -3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;; -3038;HANGZHOU NUMERAL TEN;Nl;0;L; 5341;;;10;N;;;;; -3039;HANGZHOU NUMERAL TWENTY;Nl;0;L; 5344;;;20;N;;;;; -303A;HANGZHOU NUMERAL THIRTY;Nl;0;L; 5345;;;30;N;;;;; -303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;; -303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;; -3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; -3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;; -3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; -3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;; -3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; -3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;; -3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; -3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;; -3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; -304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;; -304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;; -304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;; -304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;; -304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;; -304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;; -3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;; -3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;; -3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;; -3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;; -3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;; -3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;; -3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;; -3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;; -3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;; -3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;; -305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;; -305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;; -305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;; -305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;; -305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;; -305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;; -3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;; -3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;; -3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;; -3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; -3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;; -3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;; -3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;; -3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;; -3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;; -3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;; -306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;; -306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;; -306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;; -306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;; -306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;; -306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;; -3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;; -3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;; -3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;; -3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;; -3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;; -3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;; -3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;; -3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;; -3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;; -3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;; -307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;; -307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;; -307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;; -307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;; -307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;; -307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;; -3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;; -3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;; -3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;; -3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; -3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;; -3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; -3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;; -3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; -3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;; -3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;; -308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;; -308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;; -308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;; -308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;; -308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; -308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;; -3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;; -3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;; -3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;; -3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;; -3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;; -3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; -309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;; -309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON; 0020 3099;;;;N;;;;; -309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON; 0020 309A;;;;N;;;;; -309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;; -309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;; -30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; -30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;; -30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; -30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;; -30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; -30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;; -30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; -30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;; -30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; -30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;; -30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;; -30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;; -30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;; -30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;; -30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;; -30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;; -30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;; -30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;; -30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;; -30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;; -30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;; -30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;; -30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;; -30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;; -30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;; -30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;; -30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;; -30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;; -30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;; -30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;; -30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;; -30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;; -30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;; -30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;; -30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; -30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;; -30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;; -30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;; -30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;; -30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;; -30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;; -30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;; -30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;; -30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;; -30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;; -30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;; -30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;; -30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;; -30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;; -30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;; -30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;; -30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;; -30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;; -30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;; -30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;; -30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;; -30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;; -30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;; -30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;; -30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;; -30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;; -30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;; -30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;; -30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;; -30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;; -30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;; -30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; -30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;; -30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; -30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;; -30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; -30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;; -30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;; -30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;; -30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;; -30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;; -30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;; -30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; -30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;; -30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;; -30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;; -30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;; -30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;; -30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;; -30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; -30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; -30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;; -30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; -30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; -30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; -30FB;KATAKANA MIDDLE DOT;Pc;0;ON;;;;;N;;;;; -30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; -30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; -30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; -3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;; -3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;; -3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;; -3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;; -3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;; -310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;; -310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;; -310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;; -310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;; -310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;; -310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;; -3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;; -3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;; -3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;; -3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;; -3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;; -3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;; -3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;; -3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;; -3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;; -3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;; -311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;; -311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;; -311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;; -311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;; -311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;; -311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;; -3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;; -3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;; -3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;; -3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;; -3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;; -3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;; -3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;; -3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;; -3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;; -3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;; -312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; -312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; -312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; -3131;HANGUL LETTER KIYEOK;Lo;0;L; 1100;;;;N;HANGUL LETTER GIYEOG;;;; -3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L; 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; -3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; -3134;HANGUL LETTER NIEUN;Lo;0;L; 1102;;;;N;;;;; -3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;; -3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;; -3137;HANGUL LETTER TIKEUT;Lo;0;L; 1103;;;;N;HANGUL LETTER DIGEUD;;;; -3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L; 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;; -3139;HANGUL LETTER RIEUL;Lo;0;L; 1105;;;;N;HANGUL LETTER LIEUL;;;; -313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;; -313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;; -313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;; -313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L; 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;; -313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;; -313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;; -3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;; -3141;HANGUL LETTER MIEUM;Lo;0;L; 1106;;;;N;;;;; -3142;HANGUL LETTER PIEUP;Lo;0;L; 1107;;;;N;HANGUL LETTER BIEUB;;;; -3143;HANGUL LETTER SSANGPIEUP;Lo;0;L; 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;; -3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L; 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;; -3145;HANGUL LETTER SIOS;Lo;0;L; 1109;;;;N;;;;; -3146;HANGUL LETTER SSANGSIOS;Lo;0;L; 110A;;;;N;HANGUL LETTER SSANG SIOS;;;; -3147;HANGUL LETTER IEUNG;Lo;0;L; 110B;;;;N;;;;; -3148;HANGUL LETTER CIEUC;Lo;0;L; 110C;;;;N;HANGUL LETTER JIEUJ;;;; -3149;HANGUL LETTER SSANGCIEUC;Lo;0;L; 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;; -314A;HANGUL LETTER CHIEUCH;Lo;0;L; 110E;;;;N;HANGUL LETTER CIEUC;;;; -314B;HANGUL LETTER KHIEUKH;Lo;0;L; 110F;;;;N;HANGUL LETTER KIYEOK;;;; -314C;HANGUL LETTER THIEUTH;Lo;0;L; 1110;;;;N;HANGUL LETTER TIEUT;;;; -314D;HANGUL LETTER PHIEUPH;Lo;0;L; 1111;;;;N;HANGUL LETTER PIEUP;;;; -314E;HANGUL LETTER HIEUH;Lo;0;L; 1112;;;;N;;;;; -314F;HANGUL LETTER A;Lo;0;L; 1161;;;;N;;;;; -3150;HANGUL LETTER AE;Lo;0;L; 1162;;;;N;;;;; -3151;HANGUL LETTER YA;Lo;0;L; 1163;;;;N;;;;; -3152;HANGUL LETTER YAE;Lo;0;L; 1164;;;;N;;;;; -3153;HANGUL LETTER EO;Lo;0;L; 1165;;;;N;;;;; -3154;HANGUL LETTER E;Lo;0;L; 1166;;;;N;;;;; -3155;HANGUL LETTER YEO;Lo;0;L; 1167;;;;N;;;;; -3156;HANGUL LETTER YE;Lo;0;L; 1168;;;;N;;;;; -3157;HANGUL LETTER O;Lo;0;L; 1169;;;;N;;;;; -3158;HANGUL LETTER WA;Lo;0;L; 116A;;;;N;;;;; -3159;HANGUL LETTER WAE;Lo;0;L; 116B;;;;N;;;;; -315A;HANGUL LETTER OE;Lo;0;L; 116C;;;;N;;;;; -315B;HANGUL LETTER YO;Lo;0;L; 116D;;;;N;;;;; -315C;HANGUL LETTER U;Lo;0;L; 116E;;;;N;;;;; -315D;HANGUL LETTER WEO;Lo;0;L; 116F;;;;N;;;;; -315E;HANGUL LETTER WE;Lo;0;L; 1170;;;;N;;;;; -315F;HANGUL LETTER WI;Lo;0;L; 1171;;;;N;;;;; -3160;HANGUL LETTER YU;Lo;0;L; 1172;;;;N;;;;; -3161;HANGUL LETTER EU;Lo;0;L; 1173;;;;N;;;;; -3162;HANGUL LETTER YI;Lo;0;L; 1174;;;;N;;;;; -3163;HANGUL LETTER I;Lo;0;L; 1175;;;;N;;;;; -3164;HANGUL FILLER;Lo;0;L; 1160;;;;N;HANGUL CAE OM;;;; -3165;HANGUL LETTER SSANGNIEUN;Lo;0;L; 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;; -3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L; 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;; -3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L; 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;; -3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L; 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;; -3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L; 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;; -316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L; 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;; -316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L; 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;; -316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L; 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;; -316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L; 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;; -316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L; 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;; -316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L; 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;; -3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L; 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;; -3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L; 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;; -3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L; 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;; -3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L; 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;; -3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L; 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;; -3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L; 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;; -3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L; 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;; -3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L; 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;; -3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L; 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;; -3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L; 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;; -317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L; 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;; -317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L; 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;; -317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L; 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;; -317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L; 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;; -317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L; 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;; -317F;HANGUL LETTER PANSIOS;Lo;0;L; 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;; -3180;HANGUL LETTER SSANGIEUNG;Lo;0;L; 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;; -3181;HANGUL LETTER YESIEUNG;Lo;0;L; 114C;;;;N;HANGUL LETTER NGIEUNG;;;; -3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L; 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;; -3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L; 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;; -3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L; 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;; -3185;HANGUL LETTER SSANGHIEUH;Lo;0;L; 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;; -3186;HANGUL LETTER YEORINHIEUH;Lo;0;L; 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;; -3187;HANGUL LETTER YO-YA;Lo;0;L; 1184;;;;N;HANGUL LETTER YOYA;;;; -3188;HANGUL LETTER YO-YAE;Lo;0;L; 1185;;;;N;HANGUL LETTER YOYAE;;;; -3189;HANGUL LETTER YO-I;Lo;0;L; 1188;;;;N;HANGUL LETTER YOI;;;; -318A;HANGUL LETTER YU-YEO;Lo;0;L; 1191;;;;N;HANGUL LETTER YUYEO;;;; -318B;HANGUL LETTER YU-YE;Lo;0;L; 1192;;;;N;HANGUL LETTER YUYE;;;; -318C;HANGUL LETTER YU-I;Lo;0;L; 1194;;;;N;HANGUL LETTER YUI;;;; -318D;HANGUL LETTER ARAEA;Lo;0;L; 119E;;;;N;HANGUL LETTER ALAE A;;;; -318E;HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; -3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;Kanbun Tateten;;; -3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;Kaeriten;;; -3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L; 4E00;;;1;N;KAERITEN ITI;Kaeriten;;; -3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L; 4E8C;;;2;N;KAERITEN NI;Kaeriten;;; -3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L; 4E09;;;3;N;KAERITEN SAN;Kaeriten;;; -3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L; 56DB;;;4;N;KAERITEN SI;Kaeriten;;; -3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L; 4E0A;;;;N;KAERITEN ZYOU;Kaeriten;;; -3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L; 4E2D;;;;N;KAERITEN TYUU;Kaeriten;;; -3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L; 4E0B;;;;N;KAERITEN GE;Kaeriten;;; -3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L; 7532;;;;N;KAERITEN KOU;Kaeriten;;; -319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L; 4E59;;;;N;KAERITEN OTU;Kaeriten;;; -319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L; 4E19;;;;N;KAERITEN HEI;Kaeriten;;; -319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L; 4E01;;;;N;KAERITEN TEI;Kaeriten;;; -319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L; 5929;;;;N;KAERITEN TEN;Kaeriten;;; -319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L; 5730;;;;N;KAERITEN TI;Kaeriten;;; -319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L; 4EBA;;;;N;KAERITEN ZIN;Kaeriten;;; -31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;; -31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;; -31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;; -31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;; -31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;; -31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;; -31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;; -31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;; -31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;; -31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;; -31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;; -31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;; -31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;; -31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;; -31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;; -31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;; -31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;; -31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;; -31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;; -31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;; -31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;; -31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; -31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; -31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; -3200;PARENTHESIZED HANGUL KIYEOK;So;0;L; 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;; -3201;PARENTHESIZED HANGUL NIEUN;So;0;L; 0028 1102 0029;;;;N;;;;; -3202;PARENTHESIZED HANGUL TIKEUT;So;0;L; 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;; -3203;PARENTHESIZED HANGUL RIEUL;So;0;L; 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;; -3204;PARENTHESIZED HANGUL MIEUM;So;0;L; 0028 1106 0029;;;;N;;;;; -3205;PARENTHESIZED HANGUL PIEUP;So;0;L; 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;; -3206;PARENTHESIZED HANGUL SIOS;So;0;L; 0028 1109 0029;;;;N;;;;; -3207;PARENTHESIZED HANGUL IEUNG;So;0;L; 0028 110B 0029;;;;N;;;;; -3208;PARENTHESIZED HANGUL CIEUC;So;0;L; 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;; -3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L; 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;; -320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L; 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;; -320B;PARENTHESIZED HANGUL THIEUTH;So;0;L; 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;; -320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L; 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;; -320D;PARENTHESIZED HANGUL HIEUH;So;0;L; 0028 1112 0029;;;;N;;;;; -320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L; 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;; -320F;PARENTHESIZED HANGUL NIEUN A;So;0;L; 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;; -3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L; 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;; -3211;PARENTHESIZED HANGUL RIEUL A;So;0;L; 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;; -3212;PARENTHESIZED HANGUL MIEUM A;So;0;L; 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;; -3213;PARENTHESIZED HANGUL PIEUP A;So;0;L; 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;; -3214;PARENTHESIZED HANGUL SIOS A;So;0;L; 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;; -3215;PARENTHESIZED HANGUL IEUNG A;So;0;L; 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;; -3216;PARENTHESIZED HANGUL CIEUC A;So;0;L; 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;; -3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L; 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;; -3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L; 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;; -3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L; 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;; -321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L; 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;; -321B;PARENTHESIZED HANGUL HIEUH A;So;0;L; 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;; -321C;PARENTHESIZED HANGUL CIEUC U;So;0;L; 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;; -3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L; 0028 4E00 0029;;;1;N;;;;; -3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L; 0028 4E8C 0029;;;2;N;;;;; -3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L; 0028 4E09 0029;;;3;N;;;;; -3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L; 0028 56DB 0029;;;4;N;;;;; -3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L; 0028 4E94 0029;;;5;N;;;;; -3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L; 0028 516D 0029;;;6;N;;;;; -3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L; 0028 4E03 0029;;;7;N;;;;; -3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L; 0028 516B 0029;;;8;N;;;;; -3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L; 0028 4E5D 0029;;;9;N;;;;; -3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L; 0028 5341 0029;;;10;N;;;;; -322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L; 0028 6708 0029;;;;N;;;;; -322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L; 0028 706B 0029;;;;N;;;;; -322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L; 0028 6C34 0029;;;;N;;;;; -322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L; 0028 6728 0029;;;;N;;;;; -322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L; 0028 91D1 0029;;;;N;;;;; -322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L; 0028 571F 0029;;;;N;;;;; -3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L; 0028 65E5 0029;;;;N;;;;; -3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L; 0028 682A 0029;;;;N;;;;; -3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L; 0028 6709 0029;;;;N;;;;; -3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L; 0028 793E 0029;;;;N;;;;; -3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L; 0028 540D 0029;;;;N;;;;; -3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L; 0028 7279 0029;;;;N;;;;; -3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L; 0028 8CA1 0029;;;;N;;;;; -3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L; 0028 795D 0029;;;;N;;;;; -3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L; 0028 52B4 0029;;;;N;;;;; -3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L; 0028 4EE3 0029;;;;N;;;;; -323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L; 0028 547C 0029;;;;N;;;;; -323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L; 0028 5B66 0029;;;;N;;;;; -323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L; 0028 76E3 0029;;;;N;;;;; -323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L; 0028 4F01 0029;;;;N;;;;; -323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L; 0028 8CC7 0029;;;;N;;;;; -323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L; 0028 5354 0029;;;;N;;;;; -3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L; 0028 796D 0029;;;;N;;;;; -3241;PARENTHESIZED IDEOGRAPH REST;So;0;L; 0028 4F11 0029;;;;N;;;;; -3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L; 0028 81EA 0029;;;;N;;;;; -3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L; 0028 81F3 0029;;;;N;;;;; -3260;CIRCLED HANGUL KIYEOK;So;0;L; 1100;;;;N;CIRCLED HANGUL GIYEOG;;;; -3261;CIRCLED HANGUL NIEUN;So;0;L; 1102;;;;N;;;;; -3262;CIRCLED HANGUL TIKEUT;So;0;L; 1103;;;;N;CIRCLED HANGUL DIGEUD;;;; -3263;CIRCLED HANGUL RIEUL;So;0;L; 1105;;;;N;CIRCLED HANGUL LIEUL;;;; -3264;CIRCLED HANGUL MIEUM;So;0;L; 1106;;;;N;;;;; -3265;CIRCLED HANGUL PIEUP;So;0;L; 1107;;;;N;CIRCLED HANGUL BIEUB;;;; -3266;CIRCLED HANGUL SIOS;So;0;L; 1109;;;;N;;;;; -3267;CIRCLED HANGUL IEUNG;So;0;L; 110B;;;;N;;;;; -3268;CIRCLED HANGUL CIEUC;So;0;L; 110C;;;;N;CIRCLED HANGUL JIEUJ;;;; -3269;CIRCLED HANGUL CHIEUCH;So;0;L; 110E;;;;N;CIRCLED HANGUL CIEUC;;;; -326A;CIRCLED HANGUL KHIEUKH;So;0;L; 110F;;;;N;CIRCLED HANGUL KIYEOK;;;; -326B;CIRCLED HANGUL THIEUTH;So;0;L; 1110;;;;N;CIRCLED HANGUL TIEUT;;;; -326C;CIRCLED HANGUL PHIEUPH;So;0;L; 1111;;;;N;CIRCLED HANGUL PIEUP;;;; -326D;CIRCLED HANGUL HIEUH;So;0;L; 1112;;;;N;;;;; -326E;CIRCLED HANGUL KIYEOK A;So;0;L; 1100 1161;;;;N;CIRCLED HANGUL GA;;;; -326F;CIRCLED HANGUL NIEUN A;So;0;L; 1102 1161;;;;N;CIRCLED HANGUL NA;;;; -3270;CIRCLED HANGUL TIKEUT A;So;0;L; 1103 1161;;;;N;CIRCLED HANGUL DA;;;; -3271;CIRCLED HANGUL RIEUL A;So;0;L; 1105 1161;;;;N;CIRCLED HANGUL LA;;;; -3272;CIRCLED HANGUL MIEUM A;So;0;L; 1106 1161;;;;N;CIRCLED HANGUL MA;;;; -3273;CIRCLED HANGUL PIEUP A;So;0;L; 1107 1161;;;;N;CIRCLED HANGUL BA;;;; -3274;CIRCLED HANGUL SIOS A;So;0;L; 1109 1161;;;;N;CIRCLED HANGUL SA;;;; -3275;CIRCLED HANGUL IEUNG A;So;0;L; 110B 1161;;;;N;CIRCLED HANGUL A;;;; -3276;CIRCLED HANGUL CIEUC A;So;0;L; 110C 1161;;;;N;CIRCLED HANGUL JA;;;; -3277;CIRCLED HANGUL CHIEUCH A;So;0;L; 110E 1161;;;;N;CIRCLED HANGUL CA;;;; -3278;CIRCLED HANGUL KHIEUKH A;So;0;L; 110F 1161;;;;N;CIRCLED HANGUL KA;;;; -3279;CIRCLED HANGUL THIEUTH A;So;0;L; 1110 1161;;;;N;CIRCLED HANGUL TA;;;; -327A;CIRCLED HANGUL PHIEUPH A;So;0;L; 1111 1161;;;;N;CIRCLED HANGUL PA;;;; -327B;CIRCLED HANGUL HIEUH A;So;0;L; 1112 1161;;;;N;CIRCLED HANGUL HA;;;; -327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; -3280;CIRCLED IDEOGRAPH ONE;No;0;L; 4E00;;;1;N;;;;; -3281;CIRCLED IDEOGRAPH TWO;No;0;L; 4E8C;;;2;N;;;;; -3282;CIRCLED IDEOGRAPH THREE;No;0;L; 4E09;;;3;N;;;;; -3283;CIRCLED IDEOGRAPH FOUR;No;0;L; 56DB;;;4;N;;;;; -3284;CIRCLED IDEOGRAPH FIVE;No;0;L; 4E94;;;5;N;;;;; -3285;CIRCLED IDEOGRAPH SIX;No;0;L; 516D;;;6;N;;;;; -3286;CIRCLED IDEOGRAPH SEVEN;No;0;L; 4E03;;;7;N;;;;; -3287;CIRCLED IDEOGRAPH EIGHT;No;0;L; 516B;;;8;N;;;;; -3288;CIRCLED IDEOGRAPH NINE;No;0;L; 4E5D;;;9;N;;;;; -3289;CIRCLED IDEOGRAPH TEN;No;0;L; 5341;;;10;N;;;;; -328A;CIRCLED IDEOGRAPH MOON;So;0;L; 6708;;;;N;;;;; -328B;CIRCLED IDEOGRAPH FIRE;So;0;L; 706B;;;;N;;;;; -328C;CIRCLED IDEOGRAPH WATER;So;0;L; 6C34;;;;N;;;;; -328D;CIRCLED IDEOGRAPH WOOD;So;0;L; 6728;;;;N;;;;; -328E;CIRCLED IDEOGRAPH METAL;So;0;L; 91D1;;;;N;;;;; -328F;CIRCLED IDEOGRAPH EARTH;So;0;L; 571F;;;;N;;;;; -3290;CIRCLED IDEOGRAPH SUN;So;0;L; 65E5;;;;N;;;;; -3291;CIRCLED IDEOGRAPH STOCK;So;0;L; 682A;;;;N;;;;; -3292;CIRCLED IDEOGRAPH HAVE;So;0;L; 6709;;;;N;;;;; -3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L; 793E;;;;N;;;;; -3294;CIRCLED IDEOGRAPH NAME;So;0;L; 540D;;;;N;;;;; -3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L; 7279;;;;N;;;;; -3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L; 8CA1;;;;N;;;;; -3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L; 795D;;;;N;;;;; -3298;CIRCLED IDEOGRAPH LABOR;So;0;L; 52B4;;;;N;;;;; -3299;CIRCLED IDEOGRAPH SECRET;So;0;L; 79D8;;;;N;;;;; -329A;CIRCLED IDEOGRAPH MALE;So;0;L; 7537;;;;N;;;;; -329B;CIRCLED IDEOGRAPH FEMALE;So;0;L; 5973;;;;N;;;;; -329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L; 9069;;;;N;;;;; -329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L; 512A;;;;N;;;;; -329E;CIRCLED IDEOGRAPH PRINT;So;0;L; 5370;;;;N;;;;; -329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L; 6CE8;;;;N;;;;; -32A0;CIRCLED IDEOGRAPH ITEM;So;0;L; 9805;;;;N;;;;; -32A1;CIRCLED IDEOGRAPH REST;So;0;L; 4F11;;;;N;;;;; -32A2;CIRCLED IDEOGRAPH COPY;So;0;L; 5199;;;;N;;;;; -32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L; 6B63;;;;N;;;;; -32A4;CIRCLED IDEOGRAPH HIGH;So;0;L; 4E0A;;;;N;;;;; -32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L; 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;; -32A6;CIRCLED IDEOGRAPH LOW;So;0;L; 4E0B;;;;N;;;;; -32A7;CIRCLED IDEOGRAPH LEFT;So;0;L; 5DE6;;;;N;;;;; -32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L; 53F3;;;;N;;;;; -32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L; 533B;;;;N;;;;; -32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L; 5B97;;;;N;;;;; -32AB;CIRCLED IDEOGRAPH STUDY;So;0;L; 5B66;;;;N;;;;; -32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L; 76E3;;;;N;;;;; -32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L; 4F01;;;;N;;;;; -32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L; 8CC7;;;;N;;;;; -32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L; 5354;;;;N;;;;; -32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L; 591C;;;;N;;;;; -32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L; 0031 6708;;;;N;;;;; -32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L; 0032 6708;;;;N;;;;; -32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L; 0033 6708;;;;N;;;;; -32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L; 0034 6708;;;;N;;;;; -32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L; 0035 6708;;;;N;;;;; -32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L; 0036 6708;;;;N;;;;; -32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L; 0037 6708;;;;N;;;;; -32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L; 0038 6708;;;;N;;;;; -32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L; 0039 6708;;;;N;;;;; -32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L; 0031 0030 6708;;;;N;;;;; -32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L; 0031 0031 6708;;;;N;;;;; -32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L; 0031 0032 6708;;;;N;;;;; -32D0;CIRCLED KATAKANA A;So;0;L; 30A2;;;;N;;;;; -32D1;CIRCLED KATAKANA I;So;0;L; 30A4;;;;N;;;;; -32D2;CIRCLED KATAKANA U;So;0;L; 30A6;;;;N;;;;; -32D3;CIRCLED KATAKANA E;So;0;L; 30A8;;;;N;;;;; -32D4;CIRCLED KATAKANA O;So;0;L; 30AA;;;;N;;;;; -32D5;CIRCLED KATAKANA KA;So;0;L; 30AB;;;;N;;;;; -32D6;CIRCLED KATAKANA KI;So;0;L; 30AD;;;;N;;;;; -32D7;CIRCLED KATAKANA KU;So;0;L; 30AF;;;;N;;;;; -32D8;CIRCLED KATAKANA KE;So;0;L; 30B1;;;;N;;;;; -32D9;CIRCLED KATAKANA KO;So;0;L; 30B3;;;;N;;;;; -32DA;CIRCLED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; -32DB;CIRCLED KATAKANA SI;So;0;L; 30B7;;;;N;;;;; -32DC;CIRCLED KATAKANA SU;So;0;L; 30B9;;;;N;;;;; -32DD;CIRCLED KATAKANA SE;So;0;L; 30BB;;;;N;;;;; -32DE;CIRCLED KATAKANA SO;So;0;L; 30BD;;;;N;;;;; -32DF;CIRCLED KATAKANA TA;So;0;L; 30BF;;;;N;;;;; -32E0;CIRCLED KATAKANA TI;So;0;L; 30C1;;;;N;;;;; -32E1;CIRCLED KATAKANA TU;So;0;L; 30C4;;;;N;;;;; -32E2;CIRCLED KATAKANA TE;So;0;L; 30C6;;;;N;;;;; -32E3;CIRCLED KATAKANA TO;So;0;L; 30C8;;;;N;;;;; -32E4;CIRCLED KATAKANA NA;So;0;L; 30CA;;;;N;;;;; -32E5;CIRCLED KATAKANA NI;So;0;L; 30CB;;;;N;;;;; -32E6;CIRCLED KATAKANA NU;So;0;L; 30CC;;;;N;;;;; -32E7;CIRCLED KATAKANA NE;So;0;L; 30CD;;;;N;;;;; -32E8;CIRCLED KATAKANA NO;So;0;L; 30CE;;;;N;;;;; -32E9;CIRCLED KATAKANA HA;So;0;L; 30CF;;;;N;;;;; -32EA;CIRCLED KATAKANA HI;So;0;L; 30D2;;;;N;;;;; -32EB;CIRCLED KATAKANA HU;So;0;L; 30D5;;;;N;;;;; -32EC;CIRCLED KATAKANA HE;So;0;L; 30D8;;;;N;;;;; -32ED;CIRCLED KATAKANA HO;So;0;L; 30DB;;;;N;;;;; -32EE;CIRCLED KATAKANA MA;So;0;L; 30DE;;;;N;;;;; -32EF;CIRCLED KATAKANA MI;So;0;L; 30DF;;;;N;;;;; -32F0;CIRCLED KATAKANA MU;So;0;L; 30E0;;;;N;;;;; -32F1;CIRCLED KATAKANA ME;So;0;L; 30E1;;;;N;;;;; -32F2;CIRCLED KATAKANA MO;So;0;L; 30E2;;;;N;;;;; -32F3;CIRCLED KATAKANA YA;So;0;L; 30E4;;;;N;;;;; -32F4;CIRCLED KATAKANA YU;So;0;L; 30E6;;;;N;;;;; -32F5;CIRCLED KATAKANA YO;So;0;L; 30E8;;;;N;;;;; -32F6;CIRCLED KATAKANA RA;So;0;L; 30E9;;;;N;;;;; -32F7;CIRCLED KATAKANA RI;So;0;L; 30EA;;;;N;;;;; -32F8;CIRCLED KATAKANA RU;So;0;L; 30EB;;;;N;;;;; -32F9;CIRCLED KATAKANA RE;So;0;L; 30EC;;;;N;;;;; -32FA;CIRCLED KATAKANA RO;So;0;L; 30ED;;;;N;;;;; -32FB;CIRCLED KATAKANA WA;So;0;L; 30EF;;;;N;;;;; -32FC;CIRCLED KATAKANA WI;So;0;L; 30F0;;;;N;;;;; -32FD;CIRCLED KATAKANA WE;So;0;L; 30F1;;;;N;;;;; -32FE;CIRCLED KATAKANA WO;So;0;L; 30F2;;;;N;;;;; -3300;SQUARE APAATO;So;0;L; 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; -3301;SQUARE ARUHUA;So;0;L; 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; -3302;SQUARE ANPEA;So;0;L; 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; -3303;SQUARE AARU;So;0;L; 30A2 30FC 30EB;;;;N;SQUARED AARU;;;; -3304;SQUARE ININGU;So;0;L; 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;; -3305;SQUARE INTI;So;0;L; 30A4 30F3 30C1;;;;N;SQUARED INTI;;;; -3306;SQUARE UON;So;0;L; 30A6 30A9 30F3;;;;N;SQUARED UON;;;; -3307;SQUARE ESUKUUDO;So;0;L; 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;; -3308;SQUARE EEKAA;So;0;L; 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;; -3309;SQUARE ONSU;So;0;L; 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;; -330A;SQUARE OOMU;So;0;L; 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;; -330B;SQUARE KAIRI;So;0;L; 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;; -330C;SQUARE KARATTO;So;0;L; 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;; -330D;SQUARE KARORII;So;0;L; 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;; -330E;SQUARE GARON;So;0;L; 30AC 30ED 30F3;;;;N;SQUARED GARON;;;; -330F;SQUARE GANMA;So;0;L; 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;; -3310;SQUARE GIGA;So;0;L; 30AE 30AC;;;;N;SQUARED GIGA;;;; -3311;SQUARE GINII;So;0;L; 30AE 30CB 30FC;;;;N;SQUARED GINII;;;; -3312;SQUARE KYURII;So;0;L; 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;; -3313;SQUARE GIRUDAA;So;0;L; 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;; -3314;SQUARE KIRO;So;0;L; 30AD 30ED;;;;N;SQUARED KIRO;;;; -3315;SQUARE KIROGURAMU;So;0;L; 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;; -3316;SQUARE KIROMEETORU;So;0;L; 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;; -3317;SQUARE KIROWATTO;So;0;L; 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;; -3318;SQUARE GURAMU;So;0;L; 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;; -3319;SQUARE GURAMUTON;So;0;L; 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;; -331A;SQUARE KURUZEIRO;So;0;L; 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;; -331B;SQUARE KUROONE;So;0;L; 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;; -331C;SQUARE KEESU;So;0;L; 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;; -331D;SQUARE KORUNA;So;0;L; 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;; -331E;SQUARE KOOPO;So;0;L; 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;; -331F;SQUARE SAIKURU;So;0;L; 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;; -3320;SQUARE SANTIIMU;So;0;L; 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;; -3321;SQUARE SIRINGU;So;0;L; 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;; -3322;SQUARE SENTI;So;0;L; 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;; -3323;SQUARE SENTO;So;0;L; 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;; -3324;SQUARE DAASU;So;0;L; 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;; -3325;SQUARE DESI;So;0;L; 30C7 30B7;;;;N;SQUARED DESI;;;; -3326;SQUARE DORU;So;0;L; 30C9 30EB;;;;N;SQUARED DORU;;;; -3327;SQUARE TON;So;0;L; 30C8 30F3;;;;N;SQUARED TON;;;; -3328;SQUARE NANO;So;0;L; 30CA 30CE;;;;N;SQUARED NANO;;;; -3329;SQUARE NOTTO;So;0;L; 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;; -332A;SQUARE HAITU;So;0;L; 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;; -332B;SQUARE PAASENTO;So;0;L; 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;; -332C;SQUARE PAATU;So;0;L; 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;; -332D;SQUARE BAARERU;So;0;L; 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;; -332E;SQUARE PIASUTORU;So;0;L; 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;; -332F;SQUARE PIKURU;So;0;L; 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;; -3330;SQUARE PIKO;So;0;L; 30D4 30B3;;;;N;SQUARED PIKO;;;; -3331;SQUARE BIRU;So;0;L; 30D3 30EB;;;;N;SQUARED BIRU;;;; -3332;SQUARE HUARADDO;So;0;L; 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;; -3333;SQUARE HUIITO;So;0;L; 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;; -3334;SQUARE BUSSYERU;So;0;L; 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;; -3335;SQUARE HURAN;So;0;L; 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;; -3336;SQUARE HEKUTAARU;So;0;L; 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;; -3337;SQUARE PESO;So;0;L; 30DA 30BD;;;;N;SQUARED PESO;;;; -3338;SQUARE PENIHI;So;0;L; 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;; -3339;SQUARE HERUTU;So;0;L; 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;; -333A;SQUARE PENSU;So;0;L; 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;; -333B;SQUARE PEEZI;So;0;L; 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;; -333C;SQUARE BEETA;So;0;L; 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;; -333D;SQUARE POINTO;So;0;L; 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;; -333E;SQUARE BORUTO;So;0;L; 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;; -333F;SQUARE HON;So;0;L; 30DB 30F3;;;;N;SQUARED HON;;;; -3340;SQUARE PONDO;So;0;L; 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;; -3341;SQUARE HOORU;So;0;L; 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;; -3342;SQUARE HOON;So;0;L; 30DB 30FC 30F3;;;;N;SQUARED HOON;;;; -3343;SQUARE MAIKURO;So;0;L; 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;; -3344;SQUARE MAIRU;So;0;L; 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;; -3345;SQUARE MAHHA;So;0;L; 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;; -3346;SQUARE MARUKU;So;0;L; 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;; -3347;SQUARE MANSYON;So;0;L; 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;; -3348;SQUARE MIKURON;So;0;L; 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;; -3349;SQUARE MIRI;So;0;L; 30DF 30EA;;;;N;SQUARED MIRI;;;; -334A;SQUARE MIRIBAARU;So;0;L; 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;; -334B;SQUARE MEGA;So;0;L; 30E1 30AC;;;;N;SQUARED MEGA;;;; -334C;SQUARE MEGATON;So;0;L; 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;; -334D;SQUARE MEETORU;So;0;L; 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;; -334E;SQUARE YAADO;So;0;L; 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;; -334F;SQUARE YAARU;So;0;L; 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;; -3350;SQUARE YUAN;So;0;L; 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;; -3351;SQUARE RITTORU;So;0;L; 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;; -3352;SQUARE RIRA;So;0;L; 30EA 30E9;;;;N;SQUARED RIRA;;;; -3353;SQUARE RUPII;So;0;L; 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;; -3354;SQUARE RUUBURU;So;0;L; 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;; -3355;SQUARE REMU;So;0;L; 30EC 30E0;;;;N;SQUARED REMU;;;; -3356;SQUARE RENTOGEN;So;0;L; 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;; -3357;SQUARE WATTO;So;0;L; 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;; -3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L; 0030 70B9;;;;N;;;;; -3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L; 0031 70B9;;;;N;;;;; -335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L; 0032 70B9;;;;N;;;;; -335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L; 0033 70B9;;;;N;;;;; -335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L; 0034 70B9;;;;N;;;;; -335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L; 0035 70B9;;;;N;;;;; -335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L; 0036 70B9;;;;N;;;;; -335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L; 0037 70B9;;;;N;;;;; -3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L; 0038 70B9;;;;N;;;;; -3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L; 0039 70B9;;;;N;;;;; -3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L; 0031 0030 70B9;;;;N;;;;; -3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L; 0031 0031 70B9;;;;N;;;;; -3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L; 0031 0032 70B9;;;;N;;;;; -3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L; 0031 0033 70B9;;;;N;;;;; -3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L; 0031 0034 70B9;;;;N;;;;; -3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L; 0031 0035 70B9;;;;N;;;;; -3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L; 0031 0036 70B9;;;;N;;;;; -3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L; 0031 0037 70B9;;;;N;;;;; -336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L; 0031 0038 70B9;;;;N;;;;; -336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L; 0031 0039 70B9;;;;N;;;;; -336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L; 0032 0030 70B9;;;;N;;;;; -336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L; 0032 0031 70B9;;;;N;;;;; -336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L; 0032 0032 70B9;;;;N;;;;; -336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L; 0032 0033 70B9;;;;N;;;;; -3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L; 0032 0034 70B9;;;;N;;;;; -3371;SQUARE HPA;So;0;L; 0068 0050 0061;;;;N;;;;; -3372;SQUARE DA;So;0;L; 0064 0061;;;;N;;;;; -3373;SQUARE AU;So;0;L; 0041 0055;;;;N;;;;; -3374;SQUARE BAR;So;0;L; 0062 0061 0072;;;;N;;;;; -3375;SQUARE OV;So;0;L; 006F 0056;;;;N;;;;; -3376;SQUARE PC;So;0;L; 0070 0063;;;;N;;;;; -337B;SQUARE ERA NAME HEISEI;So;0;L; 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;; -337C;SQUARE ERA NAME SYOUWA;So;0;L; 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;; -337D;SQUARE ERA NAME TAISYOU;So;0;L; 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;; -337E;SQUARE ERA NAME MEIZI;So;0;L; 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;; -337F;SQUARE CORPORATION;So;0;L; 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;; -3380;SQUARE PA AMPS;So;0;L; 0070 0041;;;;N;SQUARED PA AMPS;;;; -3381;SQUARE NA;So;0;L; 006E 0041;;;;N;SQUARED NA;;;; -3382;SQUARE MU A;So;0;L; 03BC 0041;;;;N;SQUARED MU A;;;; -3383;SQUARE MA;So;0;L; 006D 0041;;;;N;SQUARED MA;;;; -3384;SQUARE KA;So;0;L; 006B 0041;;;;N;SQUARED KA;;;; -3385;SQUARE KB;So;0;L; 004B 0042;;;;N;SQUARED KB;;;; -3386;SQUARE MB;So;0;L; 004D 0042;;;;N;SQUARED MB;;;; -3387;SQUARE GB;So;0;L; 0047 0042;;;;N;SQUARED GB;;;; -3388;SQUARE CAL;So;0;L; 0063 0061 006C;;;;N;SQUARED CAL;;;; -3389;SQUARE KCAL;So;0;L; 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;; -338A;SQUARE PF;So;0;L; 0070 0046;;;;N;SQUARED PF;;;; -338B;SQUARE NF;So;0;L; 006E 0046;;;;N;SQUARED NF;;;; -338C;SQUARE MU F;So;0;L; 03BC 0046;;;;N;SQUARED MU F;;;; -338D;SQUARE MU G;So;0;L; 03BC 0067;;;;N;SQUARED MU G;;;; -338E;SQUARE MG;So;0;L; 006D 0067;;;;N;SQUARED MG;;;; -338F;SQUARE KG;So;0;L; 006B 0067;;;;N;SQUARED KG;;;; -3390;SQUARE HZ;So;0;L; 0048 007A;;;;N;SQUARED HZ;;;; -3391;SQUARE KHZ;So;0;L; 006B 0048 007A;;;;N;SQUARED KHZ;;;; -3392;SQUARE MHZ;So;0;L; 004D 0048 007A;;;;N;SQUARED MHZ;;;; -3393;SQUARE GHZ;So;0;L; 0047 0048 007A;;;;N;SQUARED GHZ;;;; -3394;SQUARE THZ;So;0;L; 0054 0048 007A;;;;N;SQUARED THZ;;;; -3395;SQUARE MU L;So;0;L; 03BC 2113;;;;N;SQUARED MU L;;;; -3396;SQUARE ML;So;0;L; 006D 2113;;;;N;SQUARED ML;;;; -3397;SQUARE DL;So;0;L; 0064 2113;;;;N;SQUARED DL;;;; -3398;SQUARE KL;So;0;L; 006B 2113;;;;N;SQUARED KL;;;; -3399;SQUARE FM;So;0;L; 0066 006D;;;;N;SQUARED FM;;;; -339A;SQUARE NM;So;0;L; 006E 006D;;;;N;SQUARED NM;;;; -339B;SQUARE MU M;So;0;L; 03BC 006D;;;;N;SQUARED MU M;;;; -339C;SQUARE MM;So;0;L; 006D 006D;;;;N;SQUARED MM;;;; -339D;SQUARE CM;So;0;L; 0063 006D;;;;N;SQUARED CM;;;; -339E;SQUARE KM;So;0;L; 006B 006D;;;;N;SQUARED KM;;;; -339F;SQUARE MM SQUARED;So;0;L; 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;; -33A0;SQUARE CM SQUARED;So;0;L; 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;; -33A1;SQUARE M SQUARED;So;0;L; 006D 00B2;;;;N;SQUARED M SQUARED;;;; -33A2;SQUARE KM SQUARED;So;0;L; 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;; -33A3;SQUARE MM CUBED;So;0;L; 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;; -33A4;SQUARE CM CUBED;So;0;L; 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;; -33A5;SQUARE M CUBED;So;0;L; 006D 00B3;;;;N;SQUARED M CUBED;;;; -33A6;SQUARE KM CUBED;So;0;L; 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;; -33A7;SQUARE M OVER S;So;0;L; 006D 2215 0073;;;;N;SQUARED M OVER S;;;; -33A8;SQUARE M OVER S SQUARED;So;0;L; 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;; -33A9;SQUARE PA;So;0;L; 0050 0061;;;;N;SQUARED PA;;;; -33AA;SQUARE KPA;So;0;L; 006B 0050 0061;;;;N;SQUARED KPA;;;; -33AB;SQUARE MPA;So;0;L; 004D 0050 0061;;;;N;SQUARED MPA;;;; -33AC;SQUARE GPA;So;0;L; 0047 0050 0061;;;;N;SQUARED GPA;;;; -33AD;SQUARE RAD;So;0;L; 0072 0061 0064;;;;N;SQUARED RAD;;;; -33AE;SQUARE RAD OVER S;So;0;L; 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;; -33AF;SQUARE RAD OVER S SQUARED;So;0;L; 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;; -33B0;SQUARE PS;So;0;L; 0070 0073;;;;N;SQUARED PS;;;; -33B1;SQUARE NS;So;0;L; 006E 0073;;;;N;SQUARED NS;;;; -33B2;SQUARE MU S;So;0;L; 03BC 0073;;;;N;SQUARED MU S;;;; -33B3;SQUARE MS;So;0;L; 006D 0073;;;;N;SQUARED MS;;;; -33B4;SQUARE PV;So;0;L; 0070 0056;;;;N;SQUARED PV;;;; -33B5;SQUARE NV;So;0;L; 006E 0056;;;;N;SQUARED NV;;;; -33B6;SQUARE MU V;So;0;L; 03BC 0056;;;;N;SQUARED MU V;;;; -33B7;SQUARE MV;So;0;L; 006D 0056;;;;N;SQUARED MV;;;; -33B8;SQUARE KV;So;0;L; 006B 0056;;;;N;SQUARED KV;;;; -33B9;SQUARE MV MEGA;So;0;L; 004D 0056;;;;N;SQUARED MV MEGA;;;; -33BA;SQUARE PW;So;0;L; 0070 0057;;;;N;SQUARED PW;;;; -33BB;SQUARE NW;So;0;L; 006E 0057;;;;N;SQUARED NW;;;; -33BC;SQUARE MU W;So;0;L; 03BC 0057;;;;N;SQUARED MU W;;;; -33BD;SQUARE MW;So;0;L; 006D 0057;;;;N;SQUARED MW;;;; -33BE;SQUARE KW;So;0;L; 006B 0057;;;;N;SQUARED KW;;;; -33BF;SQUARE MW MEGA;So;0;L; 004D 0057;;;;N;SQUARED MW MEGA;;;; -33C0;SQUARE K OHM;So;0;L; 006B 03A9;;;;N;SQUARED K OHM;;;; -33C1;SQUARE M OHM;So;0;L; 004D 03A9;;;;N;SQUARED M OHM;;;; -33C2;SQUARE AM;So;0;L; 0061 002E 006D 002E;;;;N;SQUARED AM;;;; -33C3;SQUARE BQ;So;0;L; 0042 0071;;;;N;SQUARED BQ;;;; -33C4;SQUARE CC;So;0;L; 0063 0063;;;;N;SQUARED CC;;;; -33C5;SQUARE CD;So;0;L; 0063 0064;;;;N;SQUARED CD;;;; -33C6;SQUARE C OVER KG;So;0;L; 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;; -33C7;SQUARE CO;So;0;L; 0043 006F 002E;;;;N;SQUARED CO;;;; -33C8;SQUARE DB;So;0;L; 0064 0042;;;;N;SQUARED DB;;;; -33C9;SQUARE GY;So;0;L; 0047 0079;;;;N;SQUARED GY;;;; -33CA;SQUARE HA;So;0;L; 0068 0061;;;;N;SQUARED HA;;;; -33CB;SQUARE HP;So;0;L; 0048 0050;;;;N;SQUARED HP;;;; -33CC;SQUARE IN;So;0;L; 0069 006E;;;;N;SQUARED IN;;;; -33CD;SQUARE KK;So;0;L; 004B 004B;;;;N;SQUARED KK;;;; -33CE;SQUARE KM CAPITAL;So;0;L; 004B 004D;;;;N;SQUARED KM CAPITAL;;;; -33CF;SQUARE KT;So;0;L; 006B 0074;;;;N;SQUARED KT;;;; -33D0;SQUARE LM;So;0;L; 006C 006D;;;;N;SQUARED LM;;;; -33D1;SQUARE LN;So;0;L; 006C 006E;;;;N;SQUARED LN;;;; -33D2;SQUARE LOG;So;0;L; 006C 006F 0067;;;;N;SQUARED LOG;;;; -33D3;SQUARE LX;So;0;L; 006C 0078;;;;N;SQUARED LX;;;; -33D4;SQUARE MB SMALL;So;0;L; 006D 0062;;;;N;SQUARED MB SMALL;;;; -33D5;SQUARE MIL;So;0;L; 006D 0069 006C;;;;N;SQUARED MIL;;;; -33D6;SQUARE MOL;So;0;L; 006D 006F 006C;;;;N;SQUARED MOL;;;; -33D7;SQUARE PH;So;0;L; 0050 0048;;;;N;SQUARED PH;;;; -33D8;SQUARE PM;So;0;L; 0070 002E 006D 002E;;;;N;SQUARED PM;;;; -33D9;SQUARE PPM;So;0;L; 0050 0050 004D;;;;N;SQUARED PPM;;;; -33DA;SQUARE PR;So;0;L; 0050 0052;;;;N;SQUARED PR;;;; -33DB;SQUARE SR;So;0;L; 0073 0072;;;;N;SQUARED SR;;;; -33DC;SQUARE SV;So;0;L; 0053 0076;;;;N;SQUARED SV;;;; -33DD;SQUARE WB;So;0;L; 0057 0062;;;;N;SQUARED WB;;;; -33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L; 0031 65E5;;;;N;;;;; -33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L; 0032 65E5;;;;N;;;;; -33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L; 0033 65E5;;;;N;;;;; -33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L; 0034 65E5;;;;N;;;;; -33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L; 0035 65E5;;;;N;;;;; -33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L; 0036 65E5;;;;N;;;;; -33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L; 0037 65E5;;;;N;;;;; -33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L; 0038 65E5;;;;N;;;;; -33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L; 0039 65E5;;;;N;;;;; -33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L; 0031 0030 65E5;;;;N;;;;; -33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L; 0031 0031 65E5;;;;N;;;;; -33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L; 0031 0032 65E5;;;;N;;;;; -33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L; 0031 0033 65E5;;;;N;;;;; -33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L; 0031 0034 65E5;;;;N;;;;; -33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L; 0031 0035 65E5;;;;N;;;;; -33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L; 0031 0036 65E5;;;;N;;;;; -33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L; 0031 0037 65E5;;;;N;;;;; -33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L; 0031 0038 65E5;;;;N;;;;; -33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L; 0031 0039 65E5;;;;N;;;;; -33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L; 0032 0030 65E5;;;;N;;;;; -33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L; 0032 0031 65E5;;;;N;;;;; -33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L; 0032 0032 65E5;;;;N;;;;; -33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L; 0032 0033 65E5;;;;N;;;;; -33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L; 0032 0034 65E5;;;;N;;;;; -33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L; 0032 0035 65E5;;;;N;;;;; -33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L; 0032 0036 65E5;;;;N;;;;; -33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L; 0032 0037 65E5;;;;N;;;;; -33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L; 0032 0038 65E5;;;;N;;;;; -33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L; 0032 0039 65E5;;;;N;;;;; -33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L; 0033 0030 65E5;;;;N;;;;; -33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L; 0033 0031 65E5;;;;N;;;;; -3400;;Lo;0;L;;;;;N;;;;; -4DB5;;Lo;0;L;;;;;N;;;;; -4E00;;Lo;0;L;;;;;N;;;;; -9FA5;;Lo;0;L;;;;;N;;;;; -A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; -A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; -A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; -A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;; -A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;; -A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;; -A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;; -A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;; -A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;; -A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;; -A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;; -A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;; -A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;; -A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;; -A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;; -A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;; -A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;; -A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; -A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; -A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; -A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; -A015;YI SYLLABLE WU;Lo;0;L;;;;;N;;;;; -A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; -A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; -A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; -A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;; -A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;; -A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;; -A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;; -A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;; -A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;; -A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;; -A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;; -A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;; -A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;; -A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;; -A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;; -A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;; -A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;; -A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;; -A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;; -A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;; -A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;; -A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;; -A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;; -A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;; -A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;; -A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;; -A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;; -A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;; -A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;; -A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;; -A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;; -A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;; -A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;; -A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;; -A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;; -A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;; -A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;; -A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;; -A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;; -A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;; -A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;; -A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;; -A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;; -A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;; -A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;; -A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;; -A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;; -A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;; -A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;; -A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;; -A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;; -A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;; -A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;; -A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;; -A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;; -A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;; -A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;; -A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;; -A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;; -A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;; -A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;; -A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;; -A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;; -A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;; -A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;; -A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;; -A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;; -A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;; -A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;; -A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;; -A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;; -A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;; -A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;; -A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;; -A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;; -A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;; -A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;; -A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;; -A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;; -A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;; -A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;; -A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;; -A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;; -A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;; -A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;; -A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;; -A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;; -A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;; -A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;; -A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;; -A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;; -A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;; -A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;; -A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;; -A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;; -A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;; -A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;; -A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;; -A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;; -A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;; -A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;; -A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;; -A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;; -A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;; -A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;; -A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;; -A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;; -A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;; -A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;; -A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;; -A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;; -A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;; -A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;; -A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;; -A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;; -A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;; -A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;; -A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;; -A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;; -A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;; -A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;; -A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;; -A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;; -A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;; -A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;; -A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;; -A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;; -A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;; -A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;; -A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;; -A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;; -A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;; -A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;; -A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;; -A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;; -A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;; -A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;; -A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;; -A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;; -A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;; -A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;; -A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;; -A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;; -A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;; -A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;; -A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;; -A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;; -A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;; -A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;; -A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;; -A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;; -A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;; -A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;; -A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;; -A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;; -A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;; -A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;; -A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;; -A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;; -A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;; -A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;; -A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;; -A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;; -A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;; -A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;; -A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;; -A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;; -A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;; -A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;; -A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;; -A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;; -A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;; -A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;; -A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;; -A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;; -A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;; -A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;; -A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;; -A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;; -A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;; -A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;; -A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;; -A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;; -A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;; -A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;; -A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;; -A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;; -A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;; -A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;; -A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;; -A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;; -A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;; -A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;; -A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;; -A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;; -A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;; -A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;; -A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;; -A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;; -A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;; -A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;; -A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;; -A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;; -A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;; -A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;; -A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;; -A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;; -A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;; -A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;; -A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;; -A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;; -A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;; -A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;; -A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;; -A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;; -A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;; -A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;; -A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;; -A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;; -A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;; -A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;; -A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;; -A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;; -A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;; -A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;; -A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;; -A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;; -A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;; -A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;; -A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;; -A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;; -A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;; -A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;; -A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;; -A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;; -A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;; -A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;; -A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;; -A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;; -A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;; -A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;; -A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;; -A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;; -A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;; -A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;; -A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;; -A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;; -A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;; -A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;; -A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;; -A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;; -A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;; -A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;; -A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;; -A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;; -A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;; -A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;; -A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;; -A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;; -A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;; -A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;; -A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;; -A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;; -A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;; -A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;; -A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;; -A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;; -A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;; -A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;; -A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;; -A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;; -A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;; -A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;; -A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;; -A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;; -A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;; -A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;; -A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;; -A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;; -A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;; -A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;; -A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;; -A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;; -A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;; -A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;; -A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;; -A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;; -A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;; -A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;; -A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;; -A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;; -A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;; -A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;; -A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;; -A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;; -A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;; -A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;; -A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;; -A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;; -A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;; -A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;; -A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;; -A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;; -A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;; -A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;; -A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;; -A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;; -A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;; -A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;; -A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;; -A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;; -A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;; -A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;; -A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;; -A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;; -A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;; -A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;; -A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; -A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;; -A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;; -A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;; -A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;; -A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;; -A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; -A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;; -A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;; -A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;; -A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; -A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;; -A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;; -A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; -A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;; -A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;; -A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;; -A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; -A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;; -A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;; -A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;; -A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;; -A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;; -A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;; -A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;; -A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;; -A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;; -A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;; -A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;; -A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;; -A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;; -A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;; -A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;; -A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;; -A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;; -A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;; -A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;; -A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;; -A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;; -A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;; -A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;; -A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;; -A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;; -A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;; -A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;; -A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;; -A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;; -A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;; -A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;; -A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;; -A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;; -A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;; -A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;; -A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;; -A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;; -A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;; -A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;; -A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;; -A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;; -A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;; -A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;; -A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;; -A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;; -A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;; -A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;; -A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;; -A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;; -A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;; -A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;; -A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;; -A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;; -A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;; -A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;; -A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;; -A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;; -A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;; -A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;; -A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;; -A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;; -A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;; -A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;; -A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;; -A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;; -A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;; -A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;; -A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;; -A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;; -A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;; -A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;; -A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;; -A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;; -A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;; -A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;; -A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;; -A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;; -A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;; -A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;; -A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;; -A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;; -A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;; -A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;; -A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;; -A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;; -A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;; -A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;; -A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;; -A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;; -A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;; -A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;; -A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;; -A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;; -A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;; -A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;; -A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;; -A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;; -A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;; -A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;; -A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;; -A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;; -A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;; -A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;; -A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;; -A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;; -A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;; -A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;; -A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;; -A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;; -A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;; -A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;; -A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;; -A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;; -A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;; -A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;; -A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;; -A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;; -A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;; -A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;; -A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;; -A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;; -A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;; -A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;; -A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;; -A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;; -A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;; -A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;; -A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;; -A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;; -A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;; -A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;; -A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;; -A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;; -A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;; -A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;; -A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;; -A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;; -A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;; -A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;; -A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;; -A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;; -A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;; -A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;; -A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;; -A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;; -A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;; -A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;; -A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;; -A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;; -A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;; -A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;; -A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;; -A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;; -A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;; -A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;; -A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;; -A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;; -A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;; -A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;; -A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;; -A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;; -A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;; -A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;; -A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;; -A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;; -A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;; -A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;; -A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;; -A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;; -A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;; -A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;; -A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;; -A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;; -A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;; -A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;; -A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;; -A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;; -A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;; -A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;; -A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;; -A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;; -A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;; -A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;; -A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;; -A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;; -A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;; -A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;; -A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;; -A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;; -A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;; -A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;; -A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;; -A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;; -A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;; -A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;; -A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;; -A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;; -A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;; -A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;; -A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;; -A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;; -A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;; -A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;; -A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;; -A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;; -A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;; -A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;; -A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;; -A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;; -A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;; -A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;; -A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;; -A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;; -A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;; -A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;; -A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;; -A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;; -A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;; -A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;; -A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;; -A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;; -A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;; -A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;; -A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;; -A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;; -A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;; -A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;; -A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;; -A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;; -A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;; -A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;; -A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;; -A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;; -A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;; -A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;; -A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;; -A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;; -A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;; -A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;; -A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;; -A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;; -A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;; -A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;; -A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;; -A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;; -A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;; -A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;; -A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;; -A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;; -A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;; -A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;; -A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;; -A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;; -A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;; -A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;; -A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;; -A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;; -A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;; -A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;; -A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;; -A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;; -A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;; -A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;; -A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;; -A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;; -A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;; -A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;; -A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;; -A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;; -A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;; -A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;; -A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;; -A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;; -A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;; -A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;; -A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;; -A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;; -A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;; -A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;; -A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;; -A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;; -A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;; -A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;; -A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;; -A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;; -A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;; -A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;; -A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;; -A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;; -A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;; -A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;; -A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;; -A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;; -A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;; -A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;; -A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;; -A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;; -A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;; -A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; -A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;; -A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;; -A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;; -A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;; -A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;; -A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;; -A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; -A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;; -A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;; -A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;; -A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;; -A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;; -A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;; -A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; -A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;; -A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;; -A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; -A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;; -A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;; -A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;; -A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; -A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;; -A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;; -A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;; -A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;; -A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;; -A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;; -A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;; -A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;; -A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;; -A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;; -A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;; -A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;; -A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;; -A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;; -A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;; -A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;; -A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;; -A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;; -A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;; -A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;; -A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;; -A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;; -A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;; -A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;; -A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;; -A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;; -A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;; -A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;; -A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;; -A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;; -A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;; -A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;; -A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;; -A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;; -A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;; -A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;; -A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;; -A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;; -A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;; -A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;; -A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;; -A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;; -A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;; -A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;; -A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;; -A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; -A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;; -A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;; -A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;; -A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;; -A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;; -A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;; -A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;; -A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; -A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;; -A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;; -A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; -A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;; -A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;; -A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; -A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;; -A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;; -A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; -A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;; -A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;; -A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;; -A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;; -A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;; -A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;; -A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;; -A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;; -A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;; -A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;; -A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;; -A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;; -A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;; -A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;; -A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;; -A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;; -A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;; -A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;; -A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;; -A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;; -A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;; -A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;; -A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;; -A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;; -A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;; -A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;; -A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;; -A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;; -A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;; -A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;; -A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;; -A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;; -A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;; -A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;; -A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;; -A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;; -A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;; -A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;; -A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;; -A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;; -A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;; -A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;; -A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;; -A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;; -A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;; -A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;; -A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;; -A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;; -A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;; -A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;; -A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;; -A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;; -A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;; -A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;; -A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;; -A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;; -A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;; -A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;; -A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;; -A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;; -A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;; -A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;; -A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;; -A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;; -A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;; -A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;; -A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;; -A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;; -A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;; -A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;; -A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;; -A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;; -A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;; -A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;; -A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;; -A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;; -A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;; -A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;; -A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;; -A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;; -A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;; -A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;; -A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;; -A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;; -A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;; -A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;; -A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;; -A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;; -A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;; -A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;; -A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;; -A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;; -A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;; -A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;; -A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;; -A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;; -A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;; -A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;; -A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;; -A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;; -A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; -A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;; -A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;; -A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;; -A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;; -A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;; -A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;; -A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; -A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;; -A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;; -A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;; -A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; -A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;; -A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;; -A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;; -A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; -A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;; -A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;; -A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;; -A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;; -A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;; -A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;; -A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;; -A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;; -A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;; -A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;; -A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;; -A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;; -A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;; -A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;; -A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;; -A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;; -A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;; -A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;; -A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;; -A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;; -A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;; -A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;; -A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;; -A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;; -A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;; -A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;; -A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;; -A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;; -A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;; -A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;; -A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;; -A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;; -A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;; -A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;; -A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;; -A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;; -A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;; -A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;; -A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;; -A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;; -A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;; -A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;; -A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;; -A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;; -A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;; -A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;; -A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;; -A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;; -A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;; -A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;; -A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;; -A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;; -A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;; -A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;; -A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;; -A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;; -A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;; -A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;; -A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;; -A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;; -A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;; -A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;; -A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;; -A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;; -A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;; -A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;; -A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;; -A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;; -A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;; -A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;; -A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;; -A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;; -A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;; -A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;; -A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;; -A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;; -A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;; -A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;; -A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;; -A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;; -A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;; -A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;; -A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;; -A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;; -A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;; -A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; -A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;; -A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;; -A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;; -A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;; -A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;; -A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;; -A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; -A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;; -A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;; -A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;; -A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; -A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;; -A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;; -A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;; -A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; -A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;; -A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;; -A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;; -A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;; -A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;; -A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;; -A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;; -A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;; -A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;; -A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;; -A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;; -A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;; -A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;; -A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;; -A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;; -A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;; -A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;; -A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;; -A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;; -A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;; -A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;; -A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;; -A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;; -A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;; -A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;; -A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;; -A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;; -A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;; -A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;; -A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;; -A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;; -A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;; -A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;; -A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;; -A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;; -A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;; -A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;; -A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;; -A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;; -A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;; -A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;; -A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;; -A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;; -A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;; -A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;; -A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;; -A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;; -A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;; -A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;; -A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;; -A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;; -A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;; -A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;; -A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;; -A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;; -A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;; -A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;; -A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;; -A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;; -A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;; -A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;; -A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;; -A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;; -A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;; -A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;; -A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;; -A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;; -A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;; -A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;; -A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;; -A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;; -A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;; -A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;; -A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;; -A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;; -A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;; -A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;; -A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;; -A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;; -A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;; -A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;; -A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;; -A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;; -A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;; -A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;; -A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;; -A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;; -A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;; -A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;; -A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;; -A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;; -A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;; -A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;; -A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;; -A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;; -A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;; -A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;; -A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;; -A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;; -A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;; -A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;; -A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;; -A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;; -A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;; -A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;; -A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;; -A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;; -A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;; -A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;; -A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;; -A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;; -A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;; -A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;; -A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;; -A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;; -A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;; -A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;; -A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;; -A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; -A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;; -A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;; -A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;; -A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;; -A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;; -A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;; -A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;; -A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;; -A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;; -A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; -A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;; -A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;; -A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; -A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;; -A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;; -A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;; -A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;; -A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;; -A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;; -A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;; -A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;; -A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;; -A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;; -A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;; -A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; -A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;; -A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;; -A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;; -A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;; -A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;; -A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;; -A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;; -A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;; -A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;; -A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;; -A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; -A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;; -A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;; -A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;; -A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; -A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;; -A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;; -A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;; -A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;; -A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;; -A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;; -A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;; -A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;; -A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;; -A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;; -A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;; -A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;; -A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;; -A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;; -A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;; -A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;; -A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;; -A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;; -A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;; -A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;; -A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;; -A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;; -A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;; -A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;; -A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;; -A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;; -A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;; -A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;; -A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;; -A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;; -A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;; -A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;; -A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;; -A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;; -A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;; -A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;; -A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;; -A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;; -A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;; -A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;; -A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;; -A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;; -A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;; -A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;; -A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;; -A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;; -A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;; -A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;; -A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;; -A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;; -A491;YI RADICAL LI;So;0;ON;;;;;N;;;;; -A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;; -A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;; -A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;; -A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;; -A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;; -A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;; -A498;YI RADICAL MI;So;0;ON;;;;;N;;;;; -A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;; -A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;; -A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;; -A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;; -A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;; -A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;; -A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;; -A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;; -A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;; -A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;; -A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;; -A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;; -A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;; -A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;; -A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;; -A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;; -A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;; -A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;; -A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;; -A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;; -A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;; -A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;; -A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;; -A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;; -A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;; -A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;; -A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;; -A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;; -A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;; -A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;; -A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;; -A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;; -A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;; -A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;; -A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;; -A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;; -A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;; -A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;; -A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; -A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; -A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; -AC00;;Lo;0;L;;;;;N;;;;; -D7A3;;Lo;0;L;;;;;N;;;;; -D800;;Cs;0;L;;;;;N;;;;; -DB7F;;Cs;0;L;;;;;N;;;;; -DB80;;Cs;0;L;;;;;N;;;;; -DBFF;;Cs;0;L;;;;;N;;;;; -DC00;;Cs;0;L;;;;;N;;;;; -DFFF;;Cs;0;L;;;;;N;;;;; -E000;;Co;0;L;;;;;N;;;;; -F8FF;;Co;0;L;;;;;N;;;;; -F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; -F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; -F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; -F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;; -F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;; -F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;; -F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;; -F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;; -F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;; -F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;; -F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;; -F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;; -F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;; -F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;; -F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;; -F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;; -F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;; -F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;; -F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;; -F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;; -F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;; -F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;; -F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;; -F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;; -F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;; -F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;; -F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;; -F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;; -F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;; -F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;; -F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;; -F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;; -F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;; -F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;; -F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;; -F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;; -F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;; -F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;; -F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;; -F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;; -F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;; -F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;; -F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;; -F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;; -F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;; -F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;; -F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;; -F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;; -F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;; -F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;; -F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;; -F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;; -F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;; -F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;; -F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;; -F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;; -F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;; -F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;; -F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;; -F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;; -F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;; -F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;; -F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;; -F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;; -F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;; -F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;; -F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;; -F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;; -F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;; -F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;; -F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;; -F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;; -F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;; -F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;; -F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;; -F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;; -F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;; -F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;; -F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;; -F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;; -F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;; -F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;96FB;;;;N;;;;; -F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;; -F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;; -F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;; -F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;; -F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;; -F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;; -F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;; -F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;; -F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;; -F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;; -F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;; -F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;; -F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;; -F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;; -F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;; -F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;; -F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;; -F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;; -F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;; -F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;; -F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;; -F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; -F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; -F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; -F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; -F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;;N;;;;; -F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; -F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; -F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; -F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; -F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; -F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; -F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; -F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;;N;;;;; -F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; -F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; -F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; -F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; -F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;;N;;;;; -F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; -F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; -F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; -F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;; -F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;; -F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;; -F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;; -F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;; -F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;; -F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;; -F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;; -F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;; -F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;; -F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;; -F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;; -F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;; -F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;; -F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;; -F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;; -F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;; -F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;; -F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;; -F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;; -F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;; -F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;; -F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;; -F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;; -F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;; -F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;; -F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;; -F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;; -F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;; -F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;; -F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;; -F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;; -F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;; -F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;; -F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;; -F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;; -F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;; -F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;; -F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;; -F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;; -F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;; -F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;; -F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;; -F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;; -F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;; -F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;; -F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;; -F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;; -F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;; -F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;; -F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; -F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; -F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; -F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; -F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;;N;;;;; -F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; -F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; -F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; -F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;; -F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;; -F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;; -F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;; -F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;; -F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;; -F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;; -F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;; -F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;; -F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;; -F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;; -F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;; -F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;; -F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;; -F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;; -F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;; -F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;; -F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;; -F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;; -F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;; -F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;; -F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;; -F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;; -F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; -F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; -F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; -F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; -F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;;N;;;;; -F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; -F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;;N;;;;; -F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; -F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; -F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; -F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;; -F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;; -F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;; -F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;; -F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;; -F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;; -F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;; -F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;; -F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;; -F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;; -F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;; -F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;; -F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;; -F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;; -F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;; -F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;; -F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;; -F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;; -F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;; -F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;; -F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;; -F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;; -F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;; -F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;; -F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;; -F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;; -F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;; -F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;; -F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;; -F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;; -F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;; -F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;; -F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;; -F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;; -F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; -F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; -F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; -F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; -F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;;N;;;;; -F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; -F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; -FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; -FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;; -FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;; -FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;; -FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;; -FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;; -FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;; -FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;; -FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;; -FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;; -FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;; -FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;; -FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;; -FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;; -FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;; -FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;; -FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;; -FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;; -FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;; -FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;; -FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;; -FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;; -FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;; -FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;; -FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;; -FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;; -FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;; -FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;; -FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;; -FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;; -FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;; -FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;*;;; -FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;; -FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;; -FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;; -FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;*;;; -FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;; -FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;; -FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;; -FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;; -FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;; -FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;; -FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;; -FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;; -FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;; -FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;; -FB00;LATIN SMALL LIGATURE FF;Ll;0;L; 0066 0066;;;;N;;;;; -FB01;LATIN SMALL LIGATURE FI;Ll;0;L; 0066 0069;;;;N;;;;; -FB02;LATIN SMALL LIGATURE FL;Ll;0;L; 0066 006C;;;;N;;;;; -FB03;LATIN SMALL LIGATURE FFI;Ll;0;L; 0066 0066 0069;;;;N;;;;; -FB04;LATIN SMALL LIGATURE FFL;Ll;0;L; 0066 0066 006C;;;;N;;;;; -FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L; 017F 0074;;;;N;;;;; -FB06;LATIN SMALL LIGATURE ST;Ll;0;L; 0073 0074;;;;N;;;;; -FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L; 0574 0576;;;;N;;;;; -FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L; 0574 0565;;;;N;;;;; -FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L; 0574 056B;;;;N;;;;; -FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L; 057E 0576;;;;N;;;;; -FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L; 0574 056D;;;;N;;;;; -FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;; -FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;; -FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;; -FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R; 05E2;;;;N;;;;; -FB21;HEBREW LETTER WIDE ALEF;Lo;0;R; 05D0;;;;N;;;;; -FB22;HEBREW LETTER WIDE DALET;Lo;0;R; 05D3;;;;N;;;;; -FB23;HEBREW LETTER WIDE HE;Lo;0;R; 05D4;;;;N;;;;; -FB24;HEBREW LETTER WIDE KAF;Lo;0;R; 05DB;;;;N;;;;; -FB25;HEBREW LETTER WIDE LAMED;Lo;0;R; 05DC;;;;N;;;;; -FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R; 05DD;;;;N;;;;; -FB27;HEBREW LETTER WIDE RESH;Lo;0;R; 05E8;;;;N;;;;; -FB28;HEBREW LETTER WIDE TAV;Lo;0;R; 05EA;;;;N;;;;; -FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; -FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; -FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; -FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; -FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;; -FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;; -FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;; -FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;; -FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;; -FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;; -FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;; -FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;; -FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;; -FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;; -FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;; -FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;; -FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;; -FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;; -FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;; -FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;; -FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;; -FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;; -FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;; -FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;; -FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;; -FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;; -FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;; -FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;; -FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;; -FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;; -FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;; -FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;; -FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;; -FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R; 05D0 05DC;;;;N;;;;; -FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL; 0671;;;;N;;;;; -FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL; 0671;;;;N;;;;; -FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL; 067B;;;;N;;;;; -FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL; 067B;;;;N;;;;; -FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL; 067B;;;;N;;;;; -FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL; 067B;;;;N;;;;; -FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL; 067E;;;;N;;;;; -FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL; 067E;;;;N;;;;; -FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL; 067E;;;;N;;;;; -FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL; 067E;;;;N;;;;; -FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL; 0680;;;;N;;;;; -FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL; 0680;;;;N;;;;; -FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL; 0680;;;;N;;;;; -FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL; 0680;;;;N;;;;; -FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL; 067A;;;;N;;;;; -FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL; 067A;;;;N;;;;; -FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL; 067A;;;;N;;;;; -FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL; 067A;;;;N;;;;; -FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL; 067F;;;;N;;;;; -FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL; 067F;;;;N;;;;; -FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL; 067F;;;;N;;;;; -FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL; 067F;;;;N;;;;; -FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL; 0679;;;;N;;;;; -FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL; 0679;;;;N;;;;; -FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL; 0679;;;;N;;;;; -FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL; 0679;;;;N;;;;; -FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL; 06A4;;;;N;;;;; -FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL; 06A4;;;;N;;;;; -FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; -FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; -FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL; 06A6;;;;N;;;;; -FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL; 06A6;;;;N;;;;; -FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; -FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; -FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL; 0684;;;;N;;;;; -FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL; 0684;;;;N;;;;; -FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL; 0684;;;;N;;;;; -FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL; 0684;;;;N;;;;; -FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL; 0683;;;;N;;;;; -FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL; 0683;;;;N;;;;; -FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL; 0683;;;;N;;;;; -FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL; 0683;;;;N;;;;; -FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL; 0686;;;;N;;;;; -FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL; 0686;;;;N;;;;; -FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL; 0686;;;;N;;;;; -FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL; 0686;;;;N;;;;; -FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL; 0687;;;;N;;;;; -FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL; 0687;;;;N;;;;; -FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL; 0687;;;;N;;;;; -FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL; 0687;;;;N;;;;; -FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL; 068D;;;;N;;;;; -FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL; 068D;;;;N;;;;; -FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL; 068C;;;;N;;;;; -FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL; 068C;;;;N;;;;; -FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL; 068E;;;;N;;;;; -FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL; 068E;;;;N;;;;; -FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL; 0688;;;;N;;;;; -FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL; 0688;;;;N;;;;; -FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL; 0698;;;;N;;;;; -FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL; 0698;;;;N;;;;; -FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL; 0691;;;;N;;;;; -FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL; 0691;;;;N;;;;; -FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL; 06A9;;;;N;;;;; -FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL; 06A9;;;;N;;;;; -FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; -FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; -FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL; 06AF;;;;N;;;;; -FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL; 06AF;;;;N;;;;; -FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; -FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; -FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL; 06B3;;;;N;;;;; -FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL; 06B3;;;;N;;;;; -FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; -FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; -FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL; 06B1;;;;N;;;;; -FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL; 06B1;;;;N;;;;; -FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; -FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; -FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL; 06BA;;;;N;;;;; -FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL; 06BA;;;;N;;;;; -FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL; 06BB;;;;N;;;;; -FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL; 06BB;;;;N;;;;; -FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; -FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; -FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL; 06C0;;;;N;;;;; -FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL; 06C0;;;;N;;;;; -FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL; 06C1;;;;N;;;;; -FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL; 06C1;;;;N;;;;; -FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; -FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; -FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL; 06BE;;;;N;;;;; -FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL; 06BE;;;;N;;;;; -FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; -FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; -FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL; 06D2;;;;N;;;;; -FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL; 06D2;;;;N;;;;; -FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 06D3;;;;N;;;;; -FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 06D3;;;;N;;;;; -FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL; 06AD;;;;N;;;;; -FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL; 06AD;;;;N;;;;; -FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; -FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; -FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL; 06C7;;;;N;;;;; -FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL; 06C7;;;;N;;;;; -FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL; 06C6;;;;N;;;;; -FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL; 06C6;;;;N;;;;; -FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL; 06C8;;;;N;;;;; -FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL; 06C8;;;;N;;;;; -FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0677;;;;N;;;;; -FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL; 06CB;;;;N;;;;; -FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL; 06CB;;;;N;;;;; -FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL; 06C5;;;;N;;;;; -FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL; 06C5;;;;N;;;;; -FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL; 06C9;;;;N;;;;; -FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL; 06C9;;;;N;;;;; -FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL; 06D0;;;;N;;;;; -FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL; 06D0;;;;N;;;;; -FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; -FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; -FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0649;;;;N;;;;; -FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL; 0649;;;;N;;;;; -FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL; 0626 0627;;;;N;;;;; -FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL; 0626 0627;;;;N;;;;; -FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; -FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; -FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL; 0626 0648;;;;N;;;;; -FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL; 0626 0648;;;;N;;;;; -FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; -FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; -FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; -FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; -FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; -FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; -FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; -FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; -FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; -FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL; 06CC;;;;N;;;;; -FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL; 06CC;;;;N;;;;; -FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; -FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; -FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL; 0626 062C;;;;N;;;;; -FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL; 0626 062D;;;;N;;;;; -FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL; 0626 0645;;;;N;;;;; -FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL; 0626 064A;;;;N;;;;; -FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0628 062C;;;;N;;;;; -FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL; 0628 062D;;;;N;;;;; -FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0628 062E;;;;N;;;;; -FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0628 0645;;;;N;;;;; -FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0628 0649;;;;N;;;;; -FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL; 0628 064A;;;;N;;;;; -FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062A 062C;;;;N;;;;; -FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL; 062A 062D;;;;N;;;;; -FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL; 062A 062E;;;;N;;;;; -FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062A 0645;;;;N;;;;; -FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062A 0649;;;;N;;;;; -FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL; 062A 064A;;;;N;;;;; -FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062B 062C;;;;N;;;;; -FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062B 0645;;;;N;;;;; -FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062B 0649;;;;N;;;;; -FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL; 062B 064A;;;;N;;;;; -FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL; 062C 062D;;;;N;;;;; -FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 062C 0645;;;;N;;;;; -FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062D 062C;;;;N;;;;; -FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062D 0645;;;;N;;;;; -FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062E 062C;;;;N;;;;; -FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL; 062E 062D;;;;N;;;;; -FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062E 0645;;;;N;;;;; -FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0633 062C;;;;N;;;;; -FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0633 062D;;;;N;;;;; -FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0633 062E;;;;N;;;;; -FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0633 0645;;;;N;;;;; -FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL; 0635 062D;;;;N;;;;; -FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0635 0645;;;;N;;;;; -FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL; 0636 062C;;;;N;;;;; -FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL; 0636 062D;;;;N;;;;; -FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL; 0636 062E;;;;N;;;;; -FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0636 0645;;;;N;;;;; -FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL; 0637 062D;;;;N;;;;; -FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0637 0645;;;;N;;;;; -FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0638 0645;;;;N;;;;; -FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL; 0639 062C;;;;N;;;;; -FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL; 0639 0645;;;;N;;;;; -FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL; 063A 062C;;;;N;;;;; -FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL; 063A 0645;;;;N;;;;; -FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0641 062C;;;;N;;;;; -FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL; 0641 062D;;;;N;;;;; -FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0641 062E;;;;N;;;;; -FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0641 0645;;;;N;;;;; -FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0641 0649;;;;N;;;;; -FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL; 0641 064A;;;;N;;;;; -FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL; 0642 062D;;;;N;;;;; -FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0642 0645;;;;N;;;;; -FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0642 0649;;;;N;;;;; -FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL; 0642 064A;;;;N;;;;; -FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL; 0643 0627;;;;N;;;;; -FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL; 0643 062C;;;;N;;;;; -FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL; 0643 062D;;;;N;;;;; -FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL; 0643 062E;;;;N;;;;; -FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL; 0643 0644;;;;N;;;;; -FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0643 0645;;;;N;;;;; -FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0643 0649;;;;N;;;;; -FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL; 0643 064A;;;;N;;;;; -FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL; 0644 062C;;;;N;;;;; -FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL; 0644 062D;;;;N;;;;; -FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL; 0644 062E;;;;N;;;;; -FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL; 0644 0645;;;;N;;;;; -FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0644 0649;;;;N;;;;; -FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL; 0644 064A;;;;N;;;;; -FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL; 0645 062C;;;;N;;;;; -FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL; 0645 062D;;;;N;;;;; -FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL; 0645 062E;;;;N;;;;; -FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 0645 0645;;;;N;;;;; -FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0645 0649;;;;N;;;;; -FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL; 0645 064A;;;;N;;;;; -FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL; 0646 062C;;;;N;;;;; -FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL; 0646 062D;;;;N;;;;; -FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL; 0646 062E;;;;N;;;;; -FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL; 0646 0645;;;;N;;;;; -FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0646 0649;;;;N;;;;; -FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL; 0646 064A;;;;N;;;;; -FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0647 062C;;;;N;;;;; -FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0647 0645;;;;N;;;;; -FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0647 0649;;;;N;;;;; -FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL; 0647 064A;;;;N;;;;; -FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL; 064A 062C;;;;N;;;;; -FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL; 064A 062D;;;;N;;;;; -FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL; 064A 062E;;;;N;;;;; -FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL; 064A 0645;;;;N;;;;; -FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 064A 0649;;;;N;;;;; -FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL; 064A 064A;;;;N;;;;; -FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0630 0670;;;;N;;;;; -FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0631 0670;;;;N;;;;; -FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0649 0670;;;;N;;;;; -FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C 0651;;;;N;;;;; -FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D 0651;;;;N;;;;; -FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL; 0020 064E 0651;;;;N;;;;; -FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F 0651;;;;N;;;;; -FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL; 0020 0650 0651;;;;N;;;;; -FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0020 0651 0670;;;;N;;;;; -FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL; 0626 0631;;;;N;;;;; -FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL; 0626 0632;;;;N;;;;; -FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; -FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL; 0626 0646;;;;N;;;;; -FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL; 0626 064A;;;;N;;;;; -FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL; 0628 0631;;;;N;;;;; -FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL; 0628 0632;;;;N;;;;; -FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; -FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL; 0628 0646;;;;N;;;;; -FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0628 0649;;;;N;;;;; -FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL; 0628 064A;;;;N;;;;; -FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL; 062A 0631;;;;N;;;;; -FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL; 062A 0632;;;;N;;;;; -FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; -FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL; 062A 0646;;;;N;;;;; -FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0649;;;;N;;;;; -FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL; 062A 064A;;;;N;;;;; -FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL; 062B 0631;;;;N;;;;; -FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL; 062B 0632;;;;N;;;;; -FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; -FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL; 062B 0646;;;;N;;;;; -FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062B 0649;;;;N;;;;; -FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL; 062B 064A;;;;N;;;;; -FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0641 0649;;;;N;;;;; -FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL; 0641 064A;;;;N;;;;; -FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0642 0649;;;;N;;;;; -FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL; 0642 064A;;;;N;;;;; -FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL; 0643 0627;;;;N;;;;; -FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; -FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; -FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0643 0649;;;;N;;;;; -FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL; 0643 064A;;;;N;;;;; -FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; -FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 0649;;;;N;;;;; -FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL; 0644 064A;;;;N;;;;; -FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL; 0645 0627;;;;N;;;;; -FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; -FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL; 0646 0631;;;;N;;;;; -FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL; 0646 0632;;;;N;;;;; -FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; -FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL; 0646 0646;;;;N;;;;; -FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0649;;;;N;;;;; -FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL; 0646 064A;;;;N;;;;; -FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL; 0649 0670;;;;N;;;;; -FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL; 064A 0631;;;;N;;;;; -FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL; 064A 0632;;;;N;;;;; -FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; -FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL; 064A 0646;;;;N;;;;; -FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 064A 0649;;;;N;;;;; -FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL; 064A 064A;;;;N;;;;; -FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL; 0626 062C;;;;N;;;;; -FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL; 0626 062D;;;;N;;;;; -FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL; 0626 062E;;;;N;;;;; -FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; -FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; -FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL; 0628 062C;;;;N;;;;; -FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL; 0628 062D;;;;N;;;;; -FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL; 0628 062E;;;;N;;;;; -FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; -FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; -FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062C;;;;N;;;;; -FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL; 062A 062D;;;;N;;;;; -FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL; 062A 062E;;;;N;;;;; -FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; -FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; -FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; -FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 062D;;;;N;;;;; -FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062C 0645;;;;N;;;;; -FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062D 062C;;;;N;;;;; -FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062D 0645;;;;N;;;;; -FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 062E 062C;;;;N;;;;; -FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062E 0645;;;;N;;;;; -FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; -FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; -FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; -FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; -FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D;;;;N;;;;; -FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL; 0635 062E;;;;N;;;;; -FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645;;;;N;;;;; -FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL; 0636 062C;;;;N;;;;; -FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL; 0636 062D;;;;N;;;;; -FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL; 0636 062E;;;;N;;;;; -FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL; 0636 0645;;;;N;;;;; -FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL; 0637 062D;;;;N;;;;; -FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; -FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL; 0639 062C;;;;N;;;;; -FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645;;;;N;;;;; -FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL; 063A 062C;;;;N;;;;; -FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL; 063A 0645;;;;N;;;;; -FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL; 0641 062C;;;;N;;;;; -FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL; 0641 062D;;;;N;;;;; -FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL; 0641 062E;;;;N;;;;; -FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 0645;;;;N;;;;; -FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL; 0642 062D;;;;N;;;;; -FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL; 0642 0645;;;;N;;;;; -FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL; 0643 062C;;;;N;;;;; -FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL; 0643 062D;;;;N;;;;; -FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL; 0643 062E;;;;N;;;;; -FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; -FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; -FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C;;;;N;;;;; -FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL; 0644 062D;;;;N;;;;; -FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL; 0644 062E;;;;N;;;;; -FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; -FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL; 0644 0647;;;;N;;;;; -FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062C;;;;N;;;;; -FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062D;;;;N;;;;; -FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062E;;;;N;;;;; -FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; -FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL; 0646 062C;;;;N;;;;; -FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL; 0646 062D;;;;N;;;;; -FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL; 0646 062E;;;;N;;;;; -FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; -FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; -FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL; 0647 062C;;;;N;;;;; -FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645;;;;N;;;;; -FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL; 0647 0670;;;;N;;;;; -FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL; 064A 062C;;;;N;;;;; -FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL; 064A 062D;;;;N;;;;; -FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL; 064A 062E;;;;N;;;;; -FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; -FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; -FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; -FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; -FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; -FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; -FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; -FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; -FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; -FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL; 062B 0647;;;;N;;;;; -FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; -FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; -FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; -FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; -FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; -FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; -FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; -FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; -FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; -FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; -FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; -FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL; 0640 064E 0651;;;;N;;;;; -FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F 0651;;;;N;;;;; -FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL; 0640 0650 0651;;;;N;;;;; -FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0637 0649;;;;N;;;;; -FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL; 0637 064A;;;;N;;;;; -FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0639 0649;;;;N;;;;; -FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL; 0639 064A;;;;N;;;;; -FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 063A 0649;;;;N;;;;; -FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL; 063A 064A;;;;N;;;;; -FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0633 0649;;;;N;;;;; -FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0633 064A;;;;N;;;;; -FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0634 0649;;;;N;;;;; -FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0634 064A;;;;N;;;;; -FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062D 0649;;;;N;;;;; -FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL; 062D 064A;;;;N;;;;; -FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062C 0649;;;;N;;;;; -FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL; 062C 064A;;;;N;;;;; -FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062E 0649;;;;N;;;;; -FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL; 062E 064A;;;;N;;;;; -FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0635 0649;;;;N;;;;; -FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL; 0635 064A;;;;N;;;;; -FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0636 0649;;;;N;;;;; -FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL; 0636 064A;;;;N;;;;; -FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0634 062C;;;;N;;;;; -FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0634 062D;;;;N;;;;; -FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0634 062E;;;;N;;;;; -FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0634 0645;;;;N;;;;; -FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL; 0634 0631;;;;N;;;;; -FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL; 0633 0631;;;;N;;;;; -FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL; 0635 0631;;;;N;;;;; -FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL; 0636 0631;;;;N;;;;; -FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0637 0649;;;;N;;;;; -FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL; 0637 064A;;;;N;;;;; -FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0649;;;;N;;;;; -FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL; 0639 064A;;;;N;;;;; -FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0649;;;;N;;;;; -FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL; 063A 064A;;;;N;;;;; -FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 0649;;;;N;;;;; -FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL; 0633 064A;;;;N;;;;; -FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0634 0649;;;;N;;;;; -FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL; 0634 064A;;;;N;;;;; -FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0649;;;;N;;;;; -FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL; 062D 064A;;;;N;;;;; -FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0649;;;;N;;;;; -FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 064A;;;;N;;;;; -FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062E 0649;;;;N;;;;; -FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL; 062E 064A;;;;N;;;;; -FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0635 0649;;;;N;;;;; -FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL; 0635 064A;;;;N;;;;; -FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 0649;;;;N;;;;; -FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL; 0636 064A;;;;N;;;;; -FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; -FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; -FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; -FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; -FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL; 0634 0631;;;;N;;;;; -FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL; 0633 0631;;;;N;;;;; -FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL; 0635 0631;;;;N;;;;; -FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL; 0636 0631;;;;N;;;;; -FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; -FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; -FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; -FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; -FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; -FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; -FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; -FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; -FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; -FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; -FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; -FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; -FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; -FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; -FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; -FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL; 0627 064B;;;;N;;;;; -FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL; 0627 064B;;;;N;;;;; -FD3E;ORNATE LEFT PARENTHESIS;Ps;0;ON;;;;;N;;;;; -FD3F;ORNATE RIGHT PARENTHESIS;Pe;0;ON;;;;;N;;;;; -FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062C 0645;;;;N;;;;; -FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; -FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; -FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062D 0645;;;;N;;;;; -FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062E 0645;;;;N;;;;; -FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 062A 0645 062C;;;;N;;;;; -FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062A 0645 062D;;;;N;;;;; -FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 062A 0645 062E;;;;N;;;;; -FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; -FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; -FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 0645 064A;;;;N;;;;; -FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0645 0649;;;;N;;;;; -FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062D 062C;;;;N;;;;; -FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 062C 062D;;;;N;;;;; -FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062C 0649;;;;N;;;;; -FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; -FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; -FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0633 0645 062C;;;;N;;;;; -FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; -FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; -FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; -FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; -FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; -FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; -FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; -FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0634 062C 064A;;;;N;;;;; -FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; -FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; -FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; -FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; -FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 062D 0649;;;;N;;;;; -FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; -FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; -FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; -FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; -FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645 0645;;;;N;;;;; -FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0637 0645 064A;;;;N;;;;; -FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; -FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; -FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; -FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0645 0649;;;;N;;;;; -FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 063A 0645 0645;;;;N;;;;; -FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 063A 0645 064A;;;;N;;;;; -FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0645 0649;;;;N;;;;; -FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; -FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; -FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; -FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0642 0645 0645;;;;N;;;;; -FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; -FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0644 062D 064A;;;;N;;;;; -FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 062D 0649;;;;N;;;;; -FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; -FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; -FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; -FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; -FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; -FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; -FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062D 062C;;;;N;;;;; -FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062D 0645;;;;N;;;;; -FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062D 064A;;;;N;;;;; -FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062C 062D;;;;N;;;;; -FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062C 0645;;;;N;;;;; -FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062E 062C;;;;N;;;;; -FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062E 0645;;;;N;;;;; -FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062C 062E;;;;N;;;;; -FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0647 0645 062C;;;;N;;;;; -FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645 0645;;;;N;;;;; -FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062D 0645;;;;N;;;;; -FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062D 0649;;;;N;;;;; -FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; -FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; -FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062C 0649;;;;N;;;;; -FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 0645 064A;;;;N;;;;; -FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0645 0649;;;;N;;;;; -FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; -FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; -FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062E 064A;;;;N;;;;; -FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 062C 064A;;;;N;;;;; -FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062C 0649;;;;N;;;;; -FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 062A 062E 064A;;;;N;;;;; -FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062E 0649;;;;N;;;;; -FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 0645 064A;;;;N;;;;; -FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0645 0649;;;;N;;;;; -FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 0645 064A;;;;N;;;;; -FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 062D 0649;;;;N;;;;; -FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0645 0649;;;;N;;;;; -FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062E 0649;;;;N;;;;; -FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0635 062D 064A;;;;N;;;;; -FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0634 062D 064A;;;;N;;;;; -FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0636 062D 064A;;;;N;;;;; -FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 062C 064A;;;;N;;;;; -FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 0645 064A;;;;N;;;;; -FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 064A 062D 064A;;;;N;;;;; -FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 062C 064A;;;;N;;;;; -FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 0645 064A;;;;N;;;;; -FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 0645 064A;;;;N;;;;; -FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0642 0645 064A;;;;N;;;;; -FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0646 062D 064A;;;;N;;;;; -FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; -FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; -FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0639 0645 064A;;;;N;;;;; -FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0643 0645 064A;;;;N;;;;; -FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; -FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062E 064A;;;;N;;;;; -FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; -FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; -FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; -FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; -FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 062C 062D 064A;;;;N;;;;; -FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 062C 064A;;;;N;;;;; -FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 062C 064A;;;;N;;;;; -FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0641 0645 064A;;;;N;;;;; -FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062D 064A;;;;N;;;;; -FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; -FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; -FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; -FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0633 062E 064A;;;;N;;;;; -FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 062C 064A;;;;N;;;;; -FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0635 0644 06D2;;;;N;;;;; -FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0642 0644 06D2;;;;N;;;;; -FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL; 0627 0644 0644 0647;;;;N;;;;; -FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL; 0627 0643 0628 0631;;;;N;;;;; -FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL; 0645 062D 0645 062F;;;;N;;;;; -FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL; 0635 0644 0639 0645;;;;N;;;;; -FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL; 0631 0633 0648 0644;;;;N;;;;; -FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL; 0639 0644 064A 0647;;;;N;;;;; -FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL; 0648 0633 0644 0645;;;;N;;;;; -FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL; 0635 0644 0649;;;;N;;;;; -FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;; -FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL; 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;; -FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; -FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; -FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; -FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; -FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON; 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; -FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON; 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; -FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON; 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; -FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;; -FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;; -FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;; -FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;; -FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;; -FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;; -FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;; -FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;; -FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON; 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;; -FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON; 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;; -FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON; 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;; -FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON; 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;; -FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON; 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;; -FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON; 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;; -FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;; -FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;; -FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON; 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;; -FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON; 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;; -FE49;DASHED OVERLINE;Po;0;ON; 203E;;;;N;SPACING DASHED OVERSCORE;;;; -FE4A;CENTRELINE OVERLINE;Po;0;ON; 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;; -FE4B;WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING WAVY OVERSCORE;;;; -FE4C;DOUBLE WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;; -FE4D;DASHED LOW LINE;Pc;0;ON; 005F;;;;N;SPACING DASHED UNDERSCORE;;;; -FE4E;CENTRELINE LOW LINE;Pc;0;ON; 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;; -FE4F;WAVY LOW LINE;Pc;0;ON; 005F;;;;N;SPACING WAVY UNDERSCORE;;;; -FE50;SMALL COMMA;Po;0;CS; 002C;;;;N;;;;; -FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; -FE52;SMALL FULL STOP;Po;0;CS; 002E;;;;N;SMALL PERIOD;;;; -FE54;SMALL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; -FE55;SMALL COLON;Po;0;CS; 003A;;;;N;;;;; -FE56;SMALL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; -FE57;SMALL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; -FE58;SMALL EM DASH;Pd;0;ON; 2014;;;;N;;;;; -FE59;SMALL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;SMALL OPENING PARENTHESIS;;;; -FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;SMALL CLOSING PARENTHESIS;;;; -FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;SMALL OPENING CURLY BRACKET;;;; -FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;SMALL CLOSING CURLY BRACKET;;;; -FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;N;SMALL OPENING TORTOISE SHELL BRACKET;;;; -FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;N;SMALL CLOSING TORTOISE SHELL BRACKET;;;; -FE5F;SMALL NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; -FE60;SMALL AMPERSAND;Po;0;ON; 0026;;;;N;;;;; -FE61;SMALL ASTERISK;Po;0;ON; 002A;;;;N;;;;; -FE62;SMALL PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; -FE63;SMALL HYPHEN-MINUS;Pd;0;ET; 002D;;;;N;;;;; -FE64;SMALL LESS-THAN SIGN;Sm;0;ON; 003C;;;;N;;;;; -FE65;SMALL GREATER-THAN SIGN;Sm;0;ON; 003E;;;;N;;;;; -FE66;SMALL EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; -FE68;SMALL REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;SMALL BACKSLASH;;;; -FE69;SMALL DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; -FE6A;SMALL PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; -FE6B;SMALL COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; -FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL; 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;; -FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL; 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;; -FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;; -FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;; -FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL; 0020 064E;;;;N;ARABIC SPACING FATHAH;;;; -FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL; 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;; -FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;; -FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;; -FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL; 0020 0650;;;;N;ARABIC SPACING KASRAH;;;; -FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL; 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;; -FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL; 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;; -FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL; 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;; -FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL; 0020 0652;;;;N;ARABIC SPACING SUKUN;;;; -FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL; 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;; -FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL; 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;; -FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;; -FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;; -FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;; -FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;; -FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;; -FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;; -FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;; -FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;; -FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;; -FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;; -FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;; -FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;; -FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;; -FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;; -FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;; -FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;; -FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;; -FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;; -FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;; -FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;; -FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;; -FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;; -FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;; -FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;; -FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;; -FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;; -FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;; -FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;; -FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;; -FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;; -FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;; -FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;; -FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;; -FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;; -FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;; -FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;; -FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;; -FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;; -FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;; -FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;; -FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;; -FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;; -FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;; -FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;; -FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;; -FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;; -FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;; -FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;; -FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;; -FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;; -FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;; -FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;; -FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;; -FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;; -FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;; -FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;; -FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;; -FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;; -FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;; -FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;; -FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;; -FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;; -FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;; -FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;; -FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;; -FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;; -FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;; -FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;; -FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;; -FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;; -FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;; -FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;; -FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;; -FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;; -FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;; -FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;; -FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;; -FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;; -FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;; -FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;; -FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;; -FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;; -FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;; -FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;; -FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;; -FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;; -FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;; -FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;; -FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;; -FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;; -FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;; -FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;; -FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;; -FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;; -FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;; -FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;; -FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;; -FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;; -FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;; -FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;; -FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;; -FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;; -FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;; -FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;; -FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;; -FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;; -FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;; -FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;; -FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;; -FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;; -FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;; -FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;; -FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;; -FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;; -FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;; -FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;; -FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;; -FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;; -FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; -FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; -FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; -FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; -FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;; -FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;; -FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; -FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; -FF02;FULLWIDTH QUOTATION MARK;Po;0;ON; 0022;;;;N;;;;; -FF03;FULLWIDTH NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; -FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; -FF05;FULLWIDTH PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; -FF06;FULLWIDTH AMPERSAND;Po;0;ON; 0026;;;;N;;;;; -FF07;FULLWIDTH APOSTROPHE;Po;0;ON; 0027;;;;N;;;;; -FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;FULLWIDTH OPENING PARENTHESIS;;;; -FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;FULLWIDTH CLOSING PARENTHESIS;;;; -FF0A;FULLWIDTH ASTERISK;Po;0;ON; 002A;;;;N;;;;; -FF0B;FULLWIDTH PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; -FF0C;FULLWIDTH COMMA;Po;0;CS; 002C;;;;N;;;;; -FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ET; 002D;;;;N;;;;; -FF0E;FULLWIDTH FULL STOP;Po;0;CS; 002E;;;;N;FULLWIDTH PERIOD;;;; -FF0F;FULLWIDTH SOLIDUS;Po;0;ES; 002F;;;;N;FULLWIDTH SLASH;;;; -FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -FF11;FULLWIDTH DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -FF12;FULLWIDTH DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -FF13;FULLWIDTH DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -FF16;FULLWIDTH DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -FF19;FULLWIDTH DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -FF1A;FULLWIDTH COLON;Po;0;CS; 003A;;;;N;;;;; -FF1B;FULLWIDTH SEMICOLON;Po;0;ON; 003B;;;;N;;;;; -FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON; 003C;;;;N;;;;; -FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; -FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON; 003E;;;;N;;;;; -FF1F;FULLWIDTH QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; -FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; -FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L; 0041;;;;N;;;;FF41; -FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L; 0042;;;;N;;;;FF42; -FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L; 0043;;;;N;;;;FF43; -FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L; 0044;;;;N;;;;FF44; -FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L; 0045;;;;N;;;;FF45; -FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L; 0046;;;;N;;;;FF46; -FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L; 0047;;;;N;;;;FF47; -FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L; 0048;;;;N;;;;FF48; -FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L; 0049;;;;N;;;;FF49; -FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L; 004A;;;;N;;;;FF4A; -FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L; 004B;;;;N;;;;FF4B; -FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L; 004C;;;;N;;;;FF4C; -FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L; 004D;;;;N;;;;FF4D; -FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L; 004E;;;;N;;;;FF4E; -FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L; 004F;;;;N;;;;FF4F; -FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L; 0050;;;;N;;;;FF50; -FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L; 0051;;;;N;;;;FF51; -FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L; 0052;;;;N;;;;FF52; -FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L; 0053;;;;N;;;;FF53; -FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L; 0054;;;;N;;;;FF54; -FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L; 0055;;;;N;;;;FF55; -FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L; 0056;;;;N;;;;FF56; -FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L; 0057;;;;N;;;;FF57; -FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L; 0058;;;;N;;;;FF58; -FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L; 0059;;;;N;;;;FF59; -FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L; 005A;;;;N;;;;FF5A; -FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;N;FULLWIDTH OPENING SQUARE BRACKET;;;; -FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;FULLWIDTH BACKSLASH;;;; -FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;N;FULLWIDTH CLOSING SQUARE BRACKET;;;; -FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON; 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;; -FF3F;FULLWIDTH LOW LINE;Pc;0;ON; 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;; -FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON; 0060;;;;N;FULLWIDTH SPACING GRAVE;;;; -FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L; 0061;;;;N;;;FF21;;FF21 -FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L; 0062;;;;N;;;FF22;;FF22 -FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L; 0063;;;;N;;;FF23;;FF23 -FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L; 0064;;;;N;;;FF24;;FF24 -FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L; 0065;;;;N;;;FF25;;FF25 -FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L; 0066;;;;N;;;FF26;;FF26 -FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L; 0067;;;;N;;;FF27;;FF27 -FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L; 0068;;;;N;;;FF28;;FF28 -FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L; 0069;;;;N;;;FF29;;FF29 -FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L; 006A;;;;N;;;FF2A;;FF2A -FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L; 006B;;;;N;;;FF2B;;FF2B -FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L; 006C;;;;N;;;FF2C;;FF2C -FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L; 006D;;;;N;;;FF2D;;FF2D -FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L; 006E;;;;N;;;FF2E;;FF2E -FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L; 006F;;;;N;;;FF2F;;FF2F -FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L; 0070;;;;N;;;FF30;;FF30 -FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L; 0071;;;;N;;;FF31;;FF31 -FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L; 0072;;;;N;;;FF32;;FF32 -FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L; 0073;;;;N;;;FF33;;FF33 -FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L; 0074;;;;N;;;FF34;;FF34 -FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L; 0075;;;;N;;;FF35;;FF35 -FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L; 0076;;;;N;;;FF36;;FF36 -FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L; 0077;;;;N;;;FF37;;FF37 -FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L; 0078;;;;N;;;FF38;;FF38 -FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L; 0079;;;;N;;;FF39;;FF39 -FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L; 007A;;;;N;;;FF3A;;FF3A -FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;FULLWIDTH OPENING CURLY BRACKET;;;; -FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON; 007C;;;;N;FULLWIDTH VERTICAL BAR;;;; -FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;FULLWIDTH CLOSING CURLY BRACKET;;;; -FF5E;FULLWIDTH TILDE;Sm;0;ON; 007E;;;;N;FULLWIDTH SPACING TILDE;;;; -FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;; -FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;N;HALFWIDTH OPENING CORNER BRACKET;;;; -FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;N;HALFWIDTH CLOSING CORNER BRACKET;;;; -FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; -FF65;HALFWIDTH KATAKANA MIDDLE DOT;Pc;0;ON; 30FB;;;;N;;;;; -FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L; 30F2;;;;N;;;;; -FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L; 30A1;;;;N;;;;; -FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L; 30A3;;;;N;;;;; -FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L; 30A5;;;;N;;;;; -FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L; 30A7;;;;N;;;;; -FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L; 30A9;;;;N;;;;; -FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L; 30E3;;;;N;;;;; -FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L; 30E5;;;;N;;;;; -FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L; 30E7;;;;N;;;;; -FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L; 30C3;;;;N;;;;; -FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L; 30FC;;;;N;;;;; -FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L; 30A2;;;;N;;;;; -FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L; 30A4;;;;N;;;;; -FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L; 30A6;;;;N;;;;; -FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L; 30A8;;;;N;;;;; -FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L; 30AA;;;;N;;;;; -FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L; 30AB;;;;N;;;;; -FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L; 30AD;;;;N;;;;; -FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L; 30AF;;;;N;;;;; -FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L; 30B1;;;;N;;;;; -FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L; 30B3;;;;N;;;;; -FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L; 30B5;;;;N;;;;; -FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L; 30B7;;;;N;;;;; -FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L; 30B9;;;;N;;;;; -FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L; 30BB;;;;N;;;;; -FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L; 30BD;;;;N;;;;; -FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L; 30BF;;;;N;;;;; -FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L; 30C1;;;;N;;;;; -FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L; 30C4;;;;N;;;;; -FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L; 30C6;;;;N;;;;; -FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L; 30C8;;;;N;;;;; -FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L; 30CA;;;;N;;;;; -FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L; 30CB;;;;N;;;;; -FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L; 30CC;;;;N;;;;; -FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L; 30CD;;;;N;;;;; -FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L; 30CE;;;;N;;;;; -FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L; 30CF;;;;N;;;;; -FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L; 30D2;;;;N;;;;; -FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L; 30D5;;;;N;;;;; -FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L; 30D8;;;;N;;;;; -FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L; 30DB;;;;N;;;;; -FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L; 30DE;;;;N;;;;; -FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L; 30DF;;;;N;;;;; -FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L; 30E0;;;;N;;;;; -FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L; 30E1;;;;N;;;;; -FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L; 30E2;;;;N;;;;; -FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L; 30E4;;;;N;;;;; -FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L; 30E6;;;;N;;;;; -FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L; 30E8;;;;N;;;;; -FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L; 30E9;;;;N;;;;; -FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L; 30EA;;;;N;;;;; -FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L; 30EB;;;;N;;;;; -FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L; 30EC;;;;N;;;;; -FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L; 30ED;;;;N;;;;; -FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L; 30EF;;;;N;;;;; -FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L; 30F3;;;;N;;;;; -FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;halfwidth katakana-hiragana voiced sound mark;;; -FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;halfwidth katakana-hiragana semi-voiced sound mark;;; -FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L; 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;; -FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L; 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;; -FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L; 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;; -FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; -FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L; 3134;;;;N;;;;; -FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;; -FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;; -FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L; 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;; -FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L; 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;; -FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L; 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;; -FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;; -FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;; -FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;; -FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L; 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;; -FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;; -FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;; -FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;; -FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L; 3141;;;;N;;;;; -FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L; 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;; -FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L; 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;; -FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L; 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;; -FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L; 3145;;;;N;;;;; -FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L; 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;; -FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L; 3147;;;;N;;;;; -FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L; 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;; -FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L; 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;; -FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L; 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;; -FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L; 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;; -FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L; 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;; -FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L; 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;; -FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L; 314E;;;;N;;;;; -FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L; 314F;;;;N;;;;; -FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L; 3150;;;;N;;;;; -FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L; 3151;;;;N;;;;; -FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L; 3152;;;;N;;;;; -FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L; 3153;;;;N;;;;; -FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L; 3154;;;;N;;;;; -FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L; 3155;;;;N;;;;; -FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L; 3156;;;;N;;;;; -FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L; 3157;;;;N;;;;; -FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L; 3158;;;;N;;;;; -FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L; 3159;;;;N;;;;; -FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L; 315A;;;;N;;;;; -FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L; 315B;;;;N;;;;; -FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L; 315C;;;;N;;;;; -FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L; 315D;;;;N;;;;; -FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L; 315E;;;;N;;;;; -FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L; 315F;;;;N;;;;; -FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L; 3160;;;;N;;;;; -FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L; 3161;;;;N;;;;; -FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L; 3162;;;;N;;;;; -FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; -FFE0;FULLWIDTH CENT SIGN;Sc;0;ET; 00A2;;;;N;;;;; -FFE1;FULLWIDTH POUND SIGN;Sc;0;ET; 00A3;;;;N;;;;; -FFE2;FULLWIDTH NOT SIGN;Sm;0;ON; 00AC;;;;N;;;;; -FFE3;FULLWIDTH MACRON;Sk;0;ON; 00AF;;;;N;FULLWIDTH SPACING MACRON;*;;; -FFE4;FULLWIDTH BROKEN BAR;So;0;ON; 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;; -FFE5;FULLWIDTH YEN SIGN;Sc;0;ET; 00A5;;;;N;;;;; -FFE6;FULLWIDTH WON SIGN;Sc;0;ET; 20A9;;;;N;;;;; -FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON; 2502;;;;N;;;;; -FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON; 2190;;;;N;;;;; -FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON; 2191;;;;N;;;;; -FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON; 2192;;;;N;;;;; -FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON; 2193;;;;N;;;;; -FFED;HALFWIDTH BLACK SQUARE;So;0;ON; 25A0;;;;N;;;;; -FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON; 25CB;;;;N;;;;; -FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;BN;;;;;N;;;;; -FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;BN;;;;;N;;;;; -FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;BN;;;;;N;;;;; -FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; -FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; -10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;; -10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;; -10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;; -10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;; -10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;; -10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;; -10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;; -10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;; -10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;; -10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;; -1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;; -1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;; -1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;; -1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;; -1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;; -1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;Faliscan;;; -10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;; -10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;; -10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;; -10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;; -10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;; -10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;; -10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;; -10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;Faliscan;;; -10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;; -10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;; -1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;; -1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;Umbrian;;; -1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;Umbrian;;; -1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;Oscan;;; -1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;Oscan;;; -10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;; -10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;; -10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;; -10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;; -10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;; -10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;; -10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;; -10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;; -10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;; -10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;; -10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;; -10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;; -10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;; -10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;; -1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;; -1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;; -1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;; -1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;; -1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;; -1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;; -10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;; -10341;GOTHIC LETTER NINETY;Lo;0;L;;;;;N;;;;; -10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;; -10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;; -10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;; -10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;; -10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;; -10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;; -10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;; -10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;; -1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;;N;;;;; -10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; -10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429; -10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A; -10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B; -10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C; -10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D; -10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E; -10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F; -10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430; -10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431; -1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432; -1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433; -1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434; -1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435; -1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436; -1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437; -10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438; -10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439; -10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A; -10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B; -10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C; -10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D; -10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E; -10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F; -10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440; -10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441; -1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442; -1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443; -1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444; -1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445; -1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446; -1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447; -10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448; -10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449; -10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A; -10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B; -10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C; -10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D; -10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400 -10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401 -1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402 -1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403 -1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404 -1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405 -1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406 -1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407 -10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408 -10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409 -10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A -10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B -10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C -10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D -10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E -10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F -10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410 -10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411 -1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412 -1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413 -1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414 -1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415 -1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416 -1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417 -10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418 -10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419 -10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A -10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B -10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C -10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D -10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E -10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F -10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420 -10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421 -1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422 -1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423 -1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424 -1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425 -1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;; -1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;; -1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;; -1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;; -1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;; -1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;; -1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;; -1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;; -1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;; -1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;; -1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;; -1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;; -1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;; -1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;; -1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;; -1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;; -1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;; -1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;; -1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;; -1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;; -1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;; -1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;; -1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;; -1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;; -1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;; -1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;; -1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;; -1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;; -1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;; -1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;; -1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;; -1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;; -1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;; -1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;; -1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;; -1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;; -1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;; -1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;; -1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;; -1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;; -1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;; -1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;; -1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;; -1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;; -1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;; -1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;; -1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;; -1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;; -1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;; -1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;; -1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;; -1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;; -1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;; -1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;; -1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;; -1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;; -1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;; -1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;; -1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;; -1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;; -1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;; -1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;; -1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;; -1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;; -1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;; -1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;; -1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;; -1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;; -1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;; -1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;; -1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;; -1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;; -1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;; -1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;; -1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;; -1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;; -1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;; -1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;; -1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;; -1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;; -1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;; -1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;; -1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;; -1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;; -1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;; -1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;; -1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;; -1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;; -1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;; -1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;; -1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;; -1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;; -1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;; -1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;; -1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;; -1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;; -1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;; -1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;; -1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;; -1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;; -1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;; -1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;; -1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;; -1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;; -1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;; -1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;; -1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;; -1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;; -1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;; -1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;; -1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;; -1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;; -1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;; -1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;; -1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;; -1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;; -1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;; -1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;; -1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;; -1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;; -1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;; -1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;; -1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;; -1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;; -1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;; -1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;; -1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;; -1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;; -1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;; -1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;; -1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;; -1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;; -1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;; -1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;; -1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;; -1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;; -1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;; -1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;; -1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;; -1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;; -1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;; -1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;; -1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;; -1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;; -1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;; -1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; -1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;; -1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;; -1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;; -1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; -1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;; -1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;; -1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;; -1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;; -1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;; -1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;; -1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;; -1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;; -1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;; -1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;; -1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;; -1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;; -1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;; -1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;; -1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;; -1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;; -1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;; -1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;; -1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;; -1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;; -1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;; -1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;; -1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; -1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; -1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;; -1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;; -1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;; -1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;; -1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;; -1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;; -1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;; -1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;; -1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;; -1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;; -1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;; -1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;; -1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;; -1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;; -1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;; -1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;; -1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;; -1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;; -1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;; -1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;; -1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;; -1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;; -1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;; -1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;; -1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;; -1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;; -1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;; -1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;; -1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;; -1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;; -1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;; -1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;; -1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;; -1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;; -1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; -1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; -1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; -1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; -1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; -1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; -1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; -1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; -1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;; -1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;; -1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;; -1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;; -1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;; -1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;; -1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;; -1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;; -1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;; -1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;; -1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;; -1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;; -1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;; -1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;; -1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;; -1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;; -1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;; -1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;; -1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;; -1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;; -1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;; -1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;; -1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;; -1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;; -1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;; -1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;; -1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;; -1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;; -1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;; -1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;; -1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;; -1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;; -1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;; -1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;; -1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;; -1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;; -1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;; -1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;; -1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;; -1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;; -1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;; -1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;; -1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;; -1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;; -1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;; -1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;; -1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;; -1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;; -1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;; -1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;; -1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;; -1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;; -1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;; -1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;; -1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;; -1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;; -1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;; -1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;; -1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;; -1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;; -1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;; -1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; -1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; -1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;; -1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;; -1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; -1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; -1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; -1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; -1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; -1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; -1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;; -1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;; -1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;; -1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;; -1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;; -1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;; -1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;; -1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;; -1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;; -1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;; -1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;; -1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;; -1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;; -1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; -1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;; -1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;; -1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;; -1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;; -1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;; -1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;; -1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;; -1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;; -1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;; -1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;; -1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;; -1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;; -1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;; -1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;; -1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;; -1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;; -1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;; -1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;; -1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;; -1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;; -1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; -1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; -1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;; -1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;; -1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;; -1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;; -1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; -1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; -1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;; -1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;; -1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;; -1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;; -1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;; -1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;; -1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;; -1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;; -1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;; -1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;; -1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;; -1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;; -1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;; -1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;; -1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;; -1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;; -1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;; -1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;; -1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;; -1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;; -1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;; -1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;; -1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;; -1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;; -1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;; -1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;; -1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;; -1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;; -1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;; -1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;; -1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;; -1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;; -1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;; -1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;; -1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;; -1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;; -1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;; -1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;; -1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;; -1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;; -1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;; -1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;; -1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;; -1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;; -1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;; -1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;; -1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;; -1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;; -1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;; -1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;; -1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;; -1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;; -1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;; -1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;; -1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;; -1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;; -1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;; -1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;; -1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;; -1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;; -1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;; -1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;; -1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;; -1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;; -1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;; -1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;; -1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;; -1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;; -1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;; -1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;; -1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;; -1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;; -1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;; -1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;; -1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;; -1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;; -1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;; -1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;; -1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;; -1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;; -1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;; -1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;; -1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;; -1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;; -1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;; -1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;; -1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;; -1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;; -1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;; -1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;; -1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;; -1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;; -1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;; -1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;; -1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;; -1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;; -1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;; -1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;; -1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;; -1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;; -1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;; -1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;; -1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;; -1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;; -1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;; -1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;; -1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;; -1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;; -1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;; -1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;; -1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;; -1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;; -1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;; -1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; -1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; -1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; -1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; -1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; -1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; -1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;; -1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;; -1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;; -1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;; -1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;; -1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;; -1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;; -1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;; -1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;; -1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;; -1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;; -1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;; -1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;; -1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;; -1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; -1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; -1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; -1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L; 2207;;;;N;;;;; -1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;L; 2202;;;;N;;;;; -1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; -1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;L; 2202;;;;N;;;;; -1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; -1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L; 2202;;;;N;;;;; -1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L; 2207;;;;N;;;;; -1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;L; 2202;;;;N;;;;; -1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; -1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L; 2202;;;;N;;;;; -1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -20000;;Lo;0;L;;;;;N;;;;; -2A6D6;;Lo;0;L;;;;;N;;;;; -2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; -2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; -2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; -2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;; -2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;; -2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;; -2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;; -2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;; -2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;; -2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;; -2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;; -2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;; -2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;; -2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;; -2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;; -2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;; -2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;; -2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;; -2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;; -2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;; -2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;; -2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;; -2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;; -2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;; -2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;; -2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;; -2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;; -2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;; -2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;; -2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;; -2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;; -2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;; -2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;; -2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;; -2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;; -2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;; -2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;; -2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;; -2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;; -2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;; -2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;; -2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;; -2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;; -2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;; -2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;; -2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;; -2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;; -2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;; -2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;; -2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;; -2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;; -2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;; -2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;; -2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;; -2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;; -2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;; -2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;; -2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;; -2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;; -2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;; -2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;; -2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;; -2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;; -2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;; -2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;; -2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;; -2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;; -2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;; -2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;; -2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;; -2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;; -2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;; -2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;; -2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;; -2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;; -2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;; -2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;; -2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;; -2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;; -2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;; -2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;; -2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;; -2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;; -2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;; -2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;; -2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;; -2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;; -2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;; -2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;; -2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;; -2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;; -2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;; -2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;; -2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;; -2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;; -2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;; -2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;; -2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;; -2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;; -2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;; -2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;; -2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;; -2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;; -2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;; -2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;2136A;;;;N;;;;; -2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;; -2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;; -2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;; -2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;; -2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;; -2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;; -2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;; -2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;; -2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;; -2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;; -2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;; -2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F33;;;;N;;;;; -2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;; -2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;; -2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;; -2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;; -2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;; -2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;; -2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;; -2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;; -2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;; -2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;; -2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;; -2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;; -2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;; -2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;; -2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;; -2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;; -2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;; -2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;; -2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;; -2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;; -2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;; -2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;; -2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;; -2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;; -2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;; -2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;; -2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;; -2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;;N;;;;; -2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;; -2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;; -2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;; -2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;; -2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;; -2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;; -2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;; -2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;; -2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;; -2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;; -2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;; -2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;; -2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;; -2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;; -2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;; -2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;; -2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;; -2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;; -2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;; -2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;; -2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;; -2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;; -2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;; -2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;; -2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;; -2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;; -2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;; -2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;; -2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;; -2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;; -2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;; -2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;; -2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;; -2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;; -2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;; -2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;; -2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;; -2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;; -2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;; -2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;; -2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;; -2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;; -2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;; -2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;; -2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;; -2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;; -2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;; -2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;; -2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;; -2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;; -2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;; -2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;; -2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;; -2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;; -2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;; -2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;; -2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;; -2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;; -2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;; -2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;; -2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;; -2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;; -2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;; -2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;; -2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;; -2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;; -2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;; -2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;; -2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;; -2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;; -2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;; -2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;; -2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;; -2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;; -2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;; -2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;; -2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;; -2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;; -2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;; -2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;; -2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;; -2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;; -2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;; -2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;; -2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;; -2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;; -2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;; -2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;; -2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;; -2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;; -2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;; -2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;; -2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;; -2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;; -2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;; -2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;; -2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;; -2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;; -2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;; -2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;; -2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;; -2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;; -2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;; -2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;; -2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;; -2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;; -2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;; -2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;; -2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;; -2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;; -2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;; -2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;; -2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;; -2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;; -2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;; -2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;; -2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;; -2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;; -2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;; -2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;; -2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;; -2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;; -2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;; -2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;; -2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;; -2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;; -2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;; -2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;; -2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;; -2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;; -2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;; -2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;; -2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;; -2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;; -2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;; -2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;; -2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;; -2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;; -2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;; -2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;; -2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;; -2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;; -2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;43AB;;;;N;;;;; -2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;; -2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;; -2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;; -2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;; -2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;; -2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;; -2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;; -2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;; -2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;; -2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;; -2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;; -2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;; -2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;; -2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;; -2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;; -2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;; -2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;; -2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;; -2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;; -2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;; -2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;; -2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;; -2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;; -2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;; -2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;; -2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;; -2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;; -2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;; -2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;; -2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;; -2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;; -2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;; -2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;; -2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;; -2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;; -2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;; -2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;; -2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;; -2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;; -2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;; -2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;; -2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;; -2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;; -2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;; -2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;; -2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;; -2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;; -2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;; -2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;; -2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;; -2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;; -2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;; -2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;; -2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;; -2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;; -2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;; -2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;; -2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;; -2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;; -2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;; -2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;; -2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;; -2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;; -2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AAE;;;;N;;;;; -2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;; -2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;; -2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;; -2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;; -2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;; -2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;; -2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;; -2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;; -2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;; -2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;; -2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;; -2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;; -2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;; -2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;; -2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;; -2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;; -2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;; -2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;; -2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;; -2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;; -2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;; -2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;; -2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;; -2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;; -2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;; -2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;; -2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;; -2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;; -2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;; -2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;; -2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;; -2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;; -2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;; -2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;; -2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;; -2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;; -2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;; -2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;; -2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;; -2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;; -2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;; -2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;; -2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;; -2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;; -2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;; -2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;; -2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;; -2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;; -2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;; -2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;; -2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;; -2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;; -2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;; -2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;; -2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;; -2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;; -2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;; -2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;; -2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;; -2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;; -2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;; -2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;; -2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;; -2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;; -2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;; -2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;; -2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;; -2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;; -2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;; -2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;; -2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;; -2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;; -2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;; -2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;; -2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;; -2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;; -2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;; -2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;; -2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;; -2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;; -2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;; -2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;; -2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;; -2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;; -2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;; -2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;; -2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;; -2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;; -2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;; -2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;; -2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;; -2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;; -2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;; -2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;; -2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;; -2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;4D57;;;;N;;;;; -2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;; -2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;; -2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;; -2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;; -2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;; -2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;; -2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;; -2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;; -2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;; -2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;; -2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;; -2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;; -2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;; -2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;; -2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;; -2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;; -2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;; -2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;; -2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;; -2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;; -2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;; -2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;; -2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;; -2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;; -2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;; -2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;; -2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;; -2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;; -2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;; -2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;; -2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;; -2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;; -2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;; -2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;; -2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;; -2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;; -2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;; -2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;; -2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;; -2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;; -2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;; -2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;; -2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;; -2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;; -2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;; -2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;; -2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;; -2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;; -2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;; -2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;; -2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;; -2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;; -2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;; -2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;; -2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;; -2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;; -2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;; -2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;; -2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;; -2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;; -2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;; -2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;; -2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;; -2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;; -2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;; -2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;; -2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;; -2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;; -2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;; -2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;; -2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;; -2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;; -2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;; -2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;; -2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;; -2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;; -2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;; -2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;; -2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;; -2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;; -2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;; -2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;; -2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;; -2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;; -2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;; -2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;; -2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;; -2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;; -2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;; -2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;; -2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;; -2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;; -2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;; -2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;; -E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;; -E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;; -E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;; -E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;; -E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;; -E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;; -E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;; -E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;; -E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;; -E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;; -E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;; -E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;; -E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;; -E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;; -E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;; -E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;; -E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;; -E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;; -E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;; -E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;; -E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;; -E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;; -E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;; -E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;; -E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;; -E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;; -E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;; -E003A;TAG COLON;Cf;0;BN;;;;;N;;;;; -E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;; -E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;; -E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;; -E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;; -E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;; -E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;; -E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;; -E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;; -E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;; -E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;; -E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;; -E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;; -E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;; -E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;; -E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;; -E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;; -E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;; -E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;; -E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;; -E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;; -E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;; -E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;; -E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;; -E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;; -E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;; -E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;; -E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;; -E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;; -E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;; -E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;; -E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;; -E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;; -E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; -E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;; -E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; -E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;; -E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;; -E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;; -E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;; -E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;; -E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;; -E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;; -E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;; -E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;; -E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;; -E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;; -E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;; -E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;; -E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;; -E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;; -E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;; -E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;; -E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;; -E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;; -E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;; -E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;; -E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;; -E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;; -E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;; -E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;; -E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;; -E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;; -E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;; -E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;; -E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; -E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;; -E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; -E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;; -E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;; -F0000;;Co;0;L;;;;;N;;;;; -FFFFD;;Co;0;L;;;;;N;;;;; -100000;;Co;0;L;;;;;N;;;;; -10FFFD;;Co;0;L;;;;;N;;;;; - - From a9cc91df247e9caa5488b681b58cf8e1ec5443b2 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Thu, 5 Mar 2020 10:32:05 -0800 Subject: [PATCH 157/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200305.1 (#877) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.2.20155.1 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 3dcc7e7c85..18e84f4561 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime b3f81350c856cfd5079c52349024a8f55d0c009a - + https://github.com/dotnet/aspnetcore - d08ecf003ac2484351222be94cc0acb5d451a2c2 + 118ff3c40b2aae9e414011d4d4496b77b3f83021 diff --git a/eng/Versions.props b/eng/Versions.props index e9fb69cb7c..953168419a 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-preview.2.20152.11 - 5.0.0-preview.2.20152.3 + 5.0.0-preview.2.20155.1 From ebfdcd86d90f6efacb81af7f7b4f4a1e840f01b9 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Fri, 6 Mar 2020 20:28:44 -0800 Subject: [PATCH 158/243] Update build.yml to use OSX 10.14 (#874) * Update build.yml * try xcode version 9.4.1 * Try 10.3 * Fix print statements in lldbhelper.py * PR feedback * try to fix build --- eng/build.yml | 4 +++- src/SOS/SOS.UnitTests/Scripts/lldbhelper.py | 10 +++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/eng/build.yml b/eng/build.yml index a5c61a96f5..c51ac37d1a 100644 --- a/eng/build.yml +++ b/eng/build.yml @@ -56,7 +56,7 @@ jobs: # Official Build OSX Pool ${{ if and(eq(parameters.osGroup, 'MacOS'), eq(variables['System.TeamProject'], 'public')) }}: - vmImage: macOS-10.13 + vmImage: macOS-10.14 # Official Build Windows Pool ${{ if and(eq(parameters.osGroup, 'Windows_NT'), ne(variables['System.TeamProject'], 'public')) }}: @@ -136,6 +136,8 @@ jobs: condition: succeeded() - ${{ if eq(parameters.osGroup, 'MacOS') }}: + - ${{ if eq(variables['System.TeamProject'], 'public') }}: + - script: /bin/bash -c "sudo xcode-select -s /Applications/Xcode_10.3.app/Contents/Developer" - script: $(Build.SourcesDirectory)/eng/cibuild.sh --configuration $(_BuildConfig) --architecture $(_BuildArch) diff --git a/src/SOS/SOS.UnitTests/Scripts/lldbhelper.py b/src/SOS/SOS.UnitTests/Scripts/lldbhelper.py index 47581bcdda..6b3326a2b2 100644 --- a/src/SOS/SOS.UnitTests/Scripts/lldbhelper.py +++ b/src/SOS/SOS.UnitTests/Scripts/lldbhelper.py @@ -2,7 +2,7 @@ def __lldb_init_module(debugger, internal_dict): debugger.HandleCommand('command script add -f lldbhelper.runcommand runcommand') - print "" + print("") def runcommand(debugger, command, result, internal_dict): interpreter = debugger.GetCommandInterpreter() @@ -11,12 +11,12 @@ def runcommand(debugger, command, result, internal_dict): interpreter.HandleCommand(command, commandResult) if commandResult.GetOutputSize() > 0: - print commandResult.GetOutput() + print(commandResult.GetOutput()) if commandResult.GetErrorSize() > 0: - print commandResult.GetError() + print(commandResult.GetError()) if commandResult.Succeeded(): - print "" + print("") else: - print "" + print("") From cba123443c7f844884845b81deede272ab31ff8c Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Sun, 8 Mar 2020 12:24:38 -0700 Subject: [PATCH 159/243] Add symbol publishing property to disable the special indexing (#888) Fixes the "DUP" errors in the symbol publishing stage. --- diagnostics.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/diagnostics.yml b/diagnostics.yml index 8ab67db9cf..deb3d84a4b 100644 --- a/diagnostics.yml +++ b/diagnostics.yml @@ -387,6 +387,7 @@ stages: # as well as NuGet, SourceLink, and signing validation. # The variables get imported from group dotnet-diagnostics-sdl-params enableSourceLinkValidation: true + symbolPublishingAdditionalParameters: '/p:PublishSpecialClrFiles=false' SDLValidationParameters: enable: true continueOnError: false From f153e528cd86f1993ec1418797cff49f4f09cb33 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 9 Mar 2020 09:39:39 -0700 Subject: [PATCH 160/243] Update dependencies from https://github.com/dotnet/arcade build 20200308.2 (#890) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.20158.2 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.20158.2 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 8 +- eng/Versions.props | 2 +- eng/common/SigningValidation.proj | 83 ------------------- eng/common/build.ps1 | 5 ++ eng/common/cross/android/arm/toolchain.cmake | 41 --------- .../cross/android/arm64/toolchain.cmake | 42 ---------- eng/common/cross/build-android-rootfs.sh | 69 ++++++--------- eng/common/cross/toolchain.cmake | 30 +++++-- eng/common/darc-init.ps1 | 6 +- eng/common/pipeline-logging-functions.ps1 | 4 +- .../channels/generic-public-channel.yml | 5 ++ .../templates/post-build/post-build.yml | 6 ++ eng/common/tools.ps1 | 2 +- global.json | 2 +- 14 files changed, 80 insertions(+), 225 deletions(-) delete mode 100644 eng/common/SigningValidation.proj delete mode 100644 eng/common/cross/android/arm/toolchain.cmake delete mode 100644 eng/common/cross/android/arm64/toolchain.cmake diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 18e84f4561..bf08e83f79 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,15 +4,15 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - 8ccad075bbb0db445e03eed0a6073d27bdd4f31a + 527179abfbb5cd738035c4ac2d2566c571ce85db - + https://github.com/dotnet/arcade - 8ccad075bbb0db445e03eed0a6073d27bdd4f31a + 527179abfbb5cd738035c4ac2d2566c571ce85db https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 953168419a..ef0c8ac9e3 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -40,7 +40,7 @@ 4.5.3 2.4.1 2.0.3 - 5.0.0-beta.20151.1 + 5.0.0-beta.20158.2 10.0.18362 diff --git a/eng/common/SigningValidation.proj b/eng/common/SigningValidation.proj deleted file mode 100644 index 3d0ac80af3..0000000000 --- a/eng/common/SigningValidation.proj +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - netcoreapp2.1 - - - - - - - - $(NuGetPackageRoot)Microsoft.DotNet.SignCheck\$(SignCheckVersion)\tools\Microsoft.DotNet.SignCheck.exe - - $(PackageBasePath) - signcheck.log - signcheck.errors.log - signcheck.exclusions.txt - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/eng/common/build.ps1 b/eng/common/build.ps1 index 88814514d8..813d440d2a 100644 --- a/eng/common/build.ps1 +++ b/eng/common/build.ps1 @@ -26,6 +26,11 @@ Param( [Parameter(ValueFromRemainingArguments=$true)][String[]]$properties ) +# Unset 'Platform' environment variable to avoid unwanted collision in InstallDotNetCore.targets file +# some computer has this env var defined (e.g. Some HP) +if($env:Platform) { + $env:Platform="" +} function Print-Usage() { Write-Host "Common settings:" Write-Host " -configuration Build configuration: 'Debug' or 'Release' (short: -c)" diff --git a/eng/common/cross/android/arm/toolchain.cmake b/eng/common/cross/android/arm/toolchain.cmake deleted file mode 100644 index a7e1c73501..0000000000 --- a/eng/common/cross/android/arm/toolchain.cmake +++ /dev/null @@ -1,41 +0,0 @@ -set(CROSS_NDK_TOOLCHAIN $ENV{ROOTFS_DIR}/../) -set(CROSS_ROOTFS ${CROSS_NDK_TOOLCHAIN}/sysroot) -set(CLR_CMAKE_PLATFORM_ANDROID "Android") - -set(CMAKE_SYSTEM_NAME Linux) -set(CMAKE_SYSTEM_VERSION 1) -set(CMAKE_SYSTEM_PROCESSOR arm) - -## Specify the toolchain -set(TOOLCHAIN "arm-linux-androideabi") -set(CMAKE_PREFIX_PATH ${CROSS_NDK_TOOLCHAIN}) -set(TOOLCHAIN_PREFIX ${TOOLCHAIN}-) - -find_program(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}clang) -find_program(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}clang++) -find_program(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}clang) -find_program(CMAKE_AR ${TOOLCHAIN_PREFIX}ar) -find_program(CMAKE_LD ${TOOLCHAIN_PREFIX}ar) -find_program(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy) -find_program(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump) - -add_compile_options(--sysroot=${CROSS_ROOTFS}) -add_compile_options(-fPIE) -add_compile_options(-mfloat-abi=soft) -include_directories(SYSTEM ${CROSS_NDK_TOOLCHAIN}/include/c++/4.9.x/) -include_directories(SYSTEM ${CROSS_NDK_TOOLCHAIN}/include/c++/4.9.x/arm-linux-androideabi/) - -set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -B ${CROSS_ROOTFS}/usr/lib/gcc/${TOOLCHAIN}") -set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -L${CROSS_ROOTFS}/lib/${TOOLCHAIN}") -set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} --sysroot=${CROSS_ROOTFS}") -set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -fPIE -pie") - -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) -set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) -set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) - -set(CMAKE_FIND_ROOT_PATH "${CROSS_ROOTFS}") -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/eng/common/cross/android/arm64/toolchain.cmake b/eng/common/cross/android/arm64/toolchain.cmake deleted file mode 100644 index 29415899c1..0000000000 --- a/eng/common/cross/android/arm64/toolchain.cmake +++ /dev/null @@ -1,42 +0,0 @@ -set(CROSS_NDK_TOOLCHAIN $ENV{ROOTFS_DIR}/../) -set(CROSS_ROOTFS ${CROSS_NDK_TOOLCHAIN}/sysroot) -set(CLR_CMAKE_PLATFORM_ANDROID "Android") - -set(CMAKE_SYSTEM_NAME Linux) -set(CMAKE_SYSTEM_VERSION 1) -set(CMAKE_SYSTEM_PROCESSOR aarch64) - -## Specify the toolchain -set(TOOLCHAIN "aarch64-linux-android") -set(CMAKE_PREFIX_PATH ${CROSS_NDK_TOOLCHAIN}) -set(TOOLCHAIN_PREFIX ${TOOLCHAIN}-) - -find_program(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}clang) -find_program(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}clang++) -find_program(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}clang) -find_program(CMAKE_AR ${TOOLCHAIN_PREFIX}ar) -find_program(CMAKE_LD ${TOOLCHAIN_PREFIX}ar) -find_program(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy) -find_program(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump) - -add_compile_options(--sysroot=${CROSS_ROOTFS}) -add_compile_options(-fPIE) - -## Needed for Android or bionic specific conditionals -add_compile_options(-D__ANDROID__) -add_compile_options(-D__BIONIC__) - -set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -B ${CROSS_ROOTFS}/usr/lib/gcc/${TOOLCHAIN}") -set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -L${CROSS_ROOTFS}/lib/${TOOLCHAIN}") -set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} --sysroot=${CROSS_ROOTFS}") -set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -fPIE -pie") - -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) -set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) -set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) - -set(CMAKE_FIND_ROOT_PATH "${CROSS_ROOTFS}") -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/eng/common/cross/build-android-rootfs.sh b/eng/common/cross/build-android-rootfs.sh index adceda877a..5e74881eb2 100644 --- a/eng/common/cross/build-android-rootfs.sh +++ b/eng/common/cross/build-android-rootfs.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -e -__NDK_Version=r14 +__NDK_Version=r21 usage() { @@ -16,11 +16,11 @@ usage() echo. echo "By default, the NDK will be downloaded into the cross/android-rootfs/android-ndk-$__NDK_Version directory. If you already have an NDK installation," echo "you can set the NDK_DIR environment variable to have this script use that installation of the NDK." - echo "By default, this script will generate a file, android_platform, in the root of the ROOTFS_DIR directory that contains the RID for the supported and tested Android build: android.21-arm64. This file is to replace '/etc/os-release', which is not available for Android." + echo "By default, this script will generate a file, android_platform, in the root of the ROOTFS_DIR directory that contains the RID for the supported and tested Android build: android.28-arm64. This file is to replace '/etc/os-release', which is not available for Android." exit 1 } -__ApiLevel=21 # The minimum platform for arm64 is API level 21 +__ApiLevel=28 # The minimum platform for arm64 is API level 21 but the minimum version that support glob(3) is 28. See $ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/glob.h __BuildArch=arm64 __AndroidArch=aarch64 __AndroidToolchain=aarch64-linux-android @@ -54,12 +54,11 @@ done # Obtain the location of the bash script to figure out where the root of the repo is. __CrossDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +__Android_Cross_Dir="$(cd "$__CrossDir/../../../.tools/android-rootfs" && pwd)" -__Android_Cross_Dir="$__CrossDir/android-rootfs" __NDK_Dir="$__Android_Cross_Dir/android-ndk-$__NDK_Version" -__libunwind_Dir="$__Android_Cross_Dir/libunwind" __lldb_Dir="$__Android_Cross_Dir/lldb" -__ToolchainDir="$__Android_Cross_Dir/toolchain/$__BuildArch" +__ToolchainDir="$__Android_Cross_Dir/android-ndk-$__NDK_Version" if [[ -n "$TOOLCHAIN_DIR" ]]; then __ToolchainDir=$TOOLCHAIN_DIR @@ -89,49 +88,33 @@ if [ ! -d $__lldb_Dir ]; then unzip -q $__Android_Cross_Dir/lldb-2.3.3614996-linux-x86_64.zip -d $__lldb_Dir fi -# Create the RootFS for both arm64 as well as aarch -rm -rf $__Android_Cross_Dir/toolchain +echo "Download dependencies..." +mkdir -p $__Android_Cross_Dir/tmp/$arch/ -echo Generating the $__BuildArch toolchain -$__NDK_Dir/build/tools/make_standalone_toolchain.py --arch $__BuildArch --api $__ApiLevel --install-dir $__ToolchainDir +# combined dependencies for coreclr, installer and libraries +__AndroidPackages="libicu" +__AndroidPackages+=" libandroid-glob" +__AndroidPackages+=" liblzma" +__AndroidPackages+=" krb5" +__AndroidPackages+=" openssl" -# Install the required packages into the toolchain -# TODO: Add logic to get latest pkg version instead of specific version number -rm -rf $__Android_Cross_Dir/deb/ -rm -rf $__Android_Cross_Dir/tmp +for path in $(wget -qO- http://termux.net/dists/stable/main/binary-$__AndroidArch/Packages |\ + grep -A15 "Package: \(${__AndroidPackages// /\\|}\)" | grep -v "static\|tool" | grep Filename); do -mkdir -p $__Android_Cross_Dir/deb/ -mkdir -p $__Android_Cross_Dir/tmp/$arch/ -wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libicu_60.2_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libicu_60.2_$__AndroidArch.deb -wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libicu-dev_60.2_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libicu-dev_60.2_$__AndroidArch.deb - -wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-glob-dev_0.4_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-glob-dev_0.4_$__AndroidArch.deb -wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-glob_0.4_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-glob_0.4_$__AndroidArch.deb -wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-support-dev_22_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-support-dev_22_$__AndroidArch.deb -wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-support_22_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-support_22_$__AndroidArch.deb -wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/liblzma-dev_5.2.3_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/liblzma-dev_5.2.3_$__AndroidArch.deb -wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/liblzma_5.2.3_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/liblzma_5.2.3_$__AndroidArch.deb -wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libunwind-dev_1.2.20170304_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libunwind-dev_1.2.20170304_$__AndroidArch.deb -wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libunwind_1.2.20170304_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libunwind_1.2.20170304_$__AndroidArch.deb - -echo Unpacking Termux packages -dpkg -x $__Android_Cross_Dir/deb/libicu_60.2_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ -dpkg -x $__Android_Cross_Dir/deb/libicu-dev_60.2_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ -dpkg -x $__Android_Cross_Dir/deb/libandroid-glob-dev_0.4_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ -dpkg -x $__Android_Cross_Dir/deb/libandroid-glob_0.4_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ -dpkg -x $__Android_Cross_Dir/deb/libandroid-support-dev_22_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ -dpkg -x $__Android_Cross_Dir/deb/libandroid-support_22_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ -dpkg -x $__Android_Cross_Dir/deb/liblzma-dev_5.2.3_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ -dpkg -x $__Android_Cross_Dir/deb/liblzma_5.2.3_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ -dpkg -x $__Android_Cross_Dir/deb/libunwind-dev_1.2.20170304_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ -dpkg -x $__Android_Cross_Dir/deb/libunwind_1.2.20170304_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ + if [[ "$path" != "Filename:" ]]; then + echo "Working on: $path" + wget -qO- http://termux.net/$path | dpkg -x - $__Android_Cross_Dir/tmp/$__AndroidArch/ + fi +done cp -R $__Android_Cross_Dir/tmp/$__AndroidArch/data/data/com.termux/files/usr/* $__ToolchainDir/sysroot/usr/ # Generate platform file for build.sh script to assign to __DistroRid echo "Generating platform file..." +echo "RID=android.${__ApiLevel}-${__BuildArch}" > $__ToolchainDir/sysroot/android_platform -echo "RID=android.21-arm64" > $__ToolchainDir/sysroot/android_platform -echo Now run: -echo CONFIG_DIR=\`realpath cross/android/$__BuildArch\` ROOTFS_DIR=\`realpath $__ToolchainDir/sysroot\` ./build.sh cross $__BuildArch skipgenerateversion skipnuget cmakeargs -DENABLE_LLDBPLUGIN=0 - +echo "Now to build coreclr, libraries and installers; run:" +echo ROOTFS_DIR=\$\(realpath $__ToolchainDir/sysroot\) ./build.sh --cross --arch $__BuildArch \ + --subsetCategory coreclr \ + --subsetCategory libraries \ + --subsetCategory installer diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake index 556da2e135..1823804da4 100644 --- a/eng/common/cross/toolchain.cmake +++ b/eng/common/cross/toolchain.cmake @@ -43,10 +43,30 @@ if(TARGET_ARCH_NAME STREQUAL "armel") endif() endif() -set(CMAKE_SYSROOT "${CROSS_ROOTFS}") -set(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr") -set(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr") -set(CMAKE_ASM_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr") +if("$ENV{__DistroRid}" MATCHES "android.*") + if(TARGET_ARCH_NAME STREQUAL "arm") + set(ANDROID_ABI armeabi-v7a) + elseif(TARGET_ARCH_NAME STREQUAL "arm64") + set(ANDROID_ABI arm64-v8a) + endif() + + # extract platform number required by the NDK's toolchain + string(REGEX REPLACE ".*\\.([0-9]+)-.*" "\\1" ANDROID_PLATFORM "$ENV{__DistroRid}") + + set(ANDROID_TOOLCHAIN clang) + set(FEATURE_EVENT_TRACE 0) # disable event trace as there is no lttng-ust package in termux repository + set(CMAKE_SYSTEM_LIBRARY_PATH "${CROSS_ROOTFS}/usr/lib") + set(CMAKE_SYSTEM_INCLUDE_PATH "${CROSS_ROOTFS}/usr/include") + + # include official NDK toolchain script + include(${CROSS_ROOTFS}/../build/cmake/android.toolchain.cmake) +else() + set(CMAKE_SYSROOT "${CROSS_ROOTFS}") + + set(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr") + set(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr") + set(CMAKE_ASM_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr") +endif() # Specify link flags @@ -63,7 +83,7 @@ endif() # Specify compile options -if(TARGET_ARCH_NAME MATCHES "^(arm|armel|arm64)$") +if(TARGET_ARCH_NAME MATCHES "^(arm|armel|arm64)$" AND NOT "$ENV{__DistroRid}" MATCHES "android.*") set(CMAKE_C_COMPILER_TARGET ${TOOLCHAIN}) set(CMAKE_CXX_COMPILER_TARGET ${TOOLCHAIN}) set(CMAKE_ASM_COMPILER_TARGET ${TOOLCHAIN}) diff --git a/eng/common/darc-init.ps1 b/eng/common/darc-init.ps1 index 2a30ccfd74..435e764134 100644 --- a/eng/common/darc-init.ps1 +++ b/eng/common/darc-init.ps1 @@ -7,7 +7,7 @@ param ( . $PSScriptRoot\tools.ps1 -function InstallDarcCli ($darcVersion) { +function InstallDarcCli ($darcVersion, $toolpath) { $darcCliPackageName = 'microsoft.dotnet.darc' $dotnetRoot = InitializeDotNetCli -install:$true @@ -32,13 +32,13 @@ function InstallDarcCli ($darcVersion) { Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity -g" & "$dotnet" tool install $darcCliPackageName --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity -g }else { - Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity -g --tool-path '$toolpath'" + Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity --tool-path '$toolpath'" & "$dotnet" tool install $darcCliPackageName --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity --tool-path "$toolpath" } } try { - InstallDarcCli $darcVersion + InstallDarcCli $darcVersion $toolpath } catch { Write-Host $_.ScriptStackTrace diff --git a/eng/common/pipeline-logging-functions.ps1 b/eng/common/pipeline-logging-functions.ps1 index a3e1317ad4..5042baebf1 100644 --- a/eng/common/pipeline-logging-functions.ps1 +++ b/eng/common/pipeline-logging-functions.ps1 @@ -31,7 +31,9 @@ function Write-PipelineTelemetryError { $PSBoundParameters.Remove('Category') | Out-Null - $Message = "(NETCORE_ENGINEERING_TELEMETRY=$Category) $Message" + if($Force -Or ((Test-Path variable:ci) -And $ci)) { + $Message = "(NETCORE_ENGINEERING_TELEMETRY=$Category) $Message" + } $PSBoundParameters.Remove('Message') | Out-Null $PSBoundParameters.Add('Message', $Message) Write-PipelineTaskError @PSBoundParameters diff --git a/eng/common/templates/post-build/channels/generic-public-channel.yml b/eng/common/templates/post-build/channels/generic-public-channel.yml index 29bc1a941a..08853ec45e 100644 --- a/eng/common/templates/post-build/channels/generic-public-channel.yml +++ b/eng/common/templates/post-build/channels/generic-public-channel.yml @@ -10,6 +10,8 @@ parameters: transportFeed: '' shippingFeed: '' symbolsFeed: '' + # If the channel name is empty, no links will be generated + akaMSChannelName: '' stages: - stage: ${{ parameters.stageName }} @@ -161,6 +163,9 @@ stages: /p:AzureDevOpsStaticTransportFeedKey='$(dn-bot-dnceng-artifact-feeds-rw)' /p:AzureDevOpsStaticSymbolsFeed='${{ parameters.symbolsFeed }}' /p:AzureDevOpsStaticSymbolsFeedKey='$(dn-bot-dnceng-artifact-feeds-rw)' + /p:LatestLinkShortUrlPrefix=dotnet/'${{ parameters.akaMSChannelName }}' + /p:AkaMSClientId=$(akams-client-id) + /p:AkaMSClientSecret=$(akams-client-secret) ${{ parameters.artifactsPublishingAdditionalParameters }} - template: ../../steps/publish-logs.yml diff --git a/eng/common/templates/post-build/post-build.yml b/eng/common/templates/post-build/post-build.yml index 05ff3561fc..7be5b0bfad 100644 --- a/eng/common/templates/post-build/post-build.yml +++ b/eng/common/templates/post-build/post-build.yml @@ -199,6 +199,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'NetCore_Dev5_Publish' channelName: '.NET Core 5 Dev' + akaMSChannelName: 'net5/dev' channelId: ${{ parameters.NetCoreDev5ChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json' @@ -212,6 +213,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'Net5_Preview1_Publish' channelName: '.NET 5 Preview 1' + akaMSChannelName: 'net5/preview1' channelId: ${{ parameters.Net5Preview1ChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json' @@ -225,6 +227,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'Net5_Preview2_Publish' channelName: '.NET 5 Preview 2' + akaMSChannelName: 'net5/preview2' channelId: ${{ parameters.Net5Preview2ChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json' @@ -238,6 +241,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'Net_Eng_Latest_Publish' channelName: '.NET Eng - Latest' + akaMSChannelName: 'eng/daily' channelId: ${{ parameters.NetEngLatestChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' @@ -251,6 +255,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'Net_Eng_Validation_Publish' channelName: '.NET Eng - Validation' + akaMSChannelName: 'eng/validation' channelId: ${{ parameters.NetEngValidationChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' @@ -264,6 +269,7 @@ stages: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'General_Testing_Publish' channelName: 'General Testing' + akaMSChannelName: 'generaltesting' channelId: ${{ parameters.GeneralTestingChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/general-testing/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/general-testing/nuget/v3/index.json' diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index a45302b377..60c1cd8975 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -635,7 +635,7 @@ function MSBuild-Core() { $exitCode = Exec-Process $buildTool.Path $cmdArgs if ($exitCode -ne 0) { - Write-PipelineTelemetryError Category 'Build' -Message 'Build failed.' + Write-PipelineTelemetryError -Category 'Build' -Message 'Build failed.' $buildLog = GetMSBuildBinaryLogCommandLineArgument $args if ($buildLog -ne $null) { diff --git a/global.json b/global.json index 014ace9d8b..6be4623497 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "dotnet": "3.1.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20151.1" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20158.2" } } From c47d36d8ec3070962524f4012ebc86ddd8c04694 Mon Sep 17 00:00:00 2001 From: Wiktor Kopec Date: Mon, 9 Mar 2020 16:41:31 -0700 Subject: [PATCH 161/243] Create dotnet-monitor tool (#878) * Create dotnet-monitor tool * Listens for TraceEvent for logging and metrics. * Currently supports a console sink, and a Log Analytics metric sink * Designed to be used in an Aks sidecar to produce logging/metrics. --- diagnostics.sln | 129 ++++++ .../AuthModel.cs | 17 + .../AuthenticatingHandler.cs | 69 ++++ .../LogAnalyticsLogger.cs | 35 ++ .../LogAnalyticsLoggerProvider.cs | 23 ++ .../LogRestClient.cs | 13 + .../MetricsConfiguration.cs | 27 ++ .../MetricsLogger.cs | 135 +++++++ .../MetricsModel.cs | 38 ++ .../MetricsRestClient.cs | 70 ++++ ...Diagnostics.Monitoring.LogAnalytics.csproj | 23 ++ .../ContextConfiguration.cs | 21 + .../DiagnosticsMonitor.cs | 377 ++++++++++++++++++ .../IMetricsLogger.cs | 17 + .../LogObject.cs | 72 ++++ .../LogValuesFormatter.cs | 200 ++++++++++ .../LoggerException.cs | 48 +++ .../Metric.cs | 53 +++ .../Microsoft.Diagnostics.Monitoring.csproj | 24 ++ .../MonitoringSourceConfiguration.cs | 166 ++++++++ .../dotnet-monitor/ConsoleMetricsLogger.cs | 23 ++ .../DiagnosticsMonitorCommandHandler.cs | 139 +++++++ src/Tools/dotnet-monitor/Program.cs | 93 +++++ .../dotnet-monitor/dotnet-monitor.csproj | 29 ++ .../runtimeconfig.template.json | 3 + 25 files changed, 1844 insertions(+) create mode 100644 src/Microsoft.Diagnostics.Monitoring.LogAnalytics/AuthModel.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring.LogAnalytics/AuthenticatingHandler.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring.LogAnalytics/LogAnalyticsLogger.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring.LogAnalytics/LogAnalyticsLoggerProvider.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring.LogAnalytics/LogRestClient.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsConfiguration.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsLogger.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsModel.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsRestClient.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring.LogAnalytics/Microsoft.Diagnostics.Monitoring.LogAnalytics.csproj create mode 100644 src/Microsoft.Diagnostics.Monitoring/ContextConfiguration.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring/DiagnosticsMonitor.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring/IMetricsLogger.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring/LogObject.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring/LogValuesFormatter.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring/LoggerException.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring/Metric.cs create mode 100644 src/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.csproj create mode 100644 src/Microsoft.Diagnostics.Monitoring/MonitoringSourceConfiguration.cs create mode 100644 src/Tools/dotnet-monitor/ConsoleMetricsLogger.cs create mode 100644 src/Tools/dotnet-monitor/DiagnosticsMonitorCommandHandler.cs create mode 100644 src/Tools/dotnet-monitor/Program.cs create mode 100644 src/Tools/dotnet-monitor/dotnet-monitor.csproj create mode 100644 src/Tools/dotnet-monitor/runtimeconfig.template.json diff --git a/diagnostics.sln b/diagnostics.sln index 5f400e0e97..e273acca74 100644 --- a/diagnostics.sln +++ b/diagnostics.sln @@ -71,6 +71,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Commands", "Commands", "{C4 src\Tools\Common\Commands\ProcessStatus.cs = src\Tools\Common\Commands\ProcessStatus.cs EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dotnet-monitor", "src\Tools\dotnet-monitor\dotnet-monitor.csproj", "{C57F7656-6663-4A3C-BE38-B75C6C57E77D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.Monitoring", "src\Microsoft.Diagnostics.Monitoring\Microsoft.Diagnostics.Monitoring.csproj", "{CFCF90E5-91CF-44FD-819D-97F530AEF769}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.Monitoring.LogAnalytics", "src\Microsoft.Diagnostics.Monitoring.LogAnalytics\Microsoft.Diagnostics.Monitoring.LogAnalytics.csproj", "{E3629433-C28E-4D37-887D-4F244C55510B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Checked|Any CPU = Checked|Any CPU @@ -1024,6 +1030,126 @@ Global {CED9ABBA-861E-4C0A-9359-22351208EF27}.RelWithDebInfo|x64.Build.0 = Release|Any CPU {CED9ABBA-861E-4C0A-9359-22351208EF27}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU {CED9ABBA-861E-4C0A-9359-22351208EF27}.RelWithDebInfo|x86.Build.0 = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Checked|Any CPU.Build.0 = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Checked|ARM.ActiveCfg = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Checked|ARM.Build.0 = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Checked|ARM64.ActiveCfg = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Checked|ARM64.Build.0 = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Checked|x64.ActiveCfg = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Checked|x64.Build.0 = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Checked|x86.ActiveCfg = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Checked|x86.Build.0 = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Debug|ARM.ActiveCfg = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Debug|ARM.Build.0 = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Debug|ARM64.Build.0 = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Debug|x64.ActiveCfg = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Debug|x64.Build.0 = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Debug|x86.ActiveCfg = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Debug|x86.Build.0 = Debug|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Release|Any CPU.Build.0 = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Release|ARM.ActiveCfg = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Release|ARM.Build.0 = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Release|ARM64.ActiveCfg = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Release|ARM64.Build.0 = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Release|x64.ActiveCfg = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Release|x64.Build.0 = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Release|x86.ActiveCfg = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.Release|x86.Build.0 = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.RelWithDebInfo|x64.Build.0 = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU + {C57F7656-6663-4A3C-BE38-B75C6C57E77D}.RelWithDebInfo|x86.Build.0 = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Checked|Any CPU.Build.0 = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Checked|ARM.ActiveCfg = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Checked|ARM.Build.0 = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Checked|ARM64.ActiveCfg = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Checked|ARM64.Build.0 = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Checked|x64.ActiveCfg = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Checked|x64.Build.0 = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Checked|x86.ActiveCfg = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Checked|x86.Build.0 = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Debug|ARM.ActiveCfg = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Debug|ARM.Build.0 = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Debug|ARM64.Build.0 = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Debug|x64.ActiveCfg = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Debug|x64.Build.0 = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Debug|x86.ActiveCfg = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Debug|x86.Build.0 = Debug|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Release|Any CPU.Build.0 = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Release|ARM.ActiveCfg = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Release|ARM.Build.0 = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Release|ARM64.ActiveCfg = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Release|ARM64.Build.0 = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Release|x64.ActiveCfg = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Release|x64.Build.0 = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Release|x86.ActiveCfg = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.Release|x86.Build.0 = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.RelWithDebInfo|x64.Build.0 = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU + {CFCF90E5-91CF-44FD-819D-97F530AEF769}.RelWithDebInfo|x86.Build.0 = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Checked|Any CPU.Build.0 = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Checked|ARM.ActiveCfg = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Checked|ARM.Build.0 = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Checked|ARM64.ActiveCfg = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Checked|ARM64.Build.0 = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Checked|x64.ActiveCfg = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Checked|x64.Build.0 = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Checked|x86.ActiveCfg = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Checked|x86.Build.0 = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Debug|ARM.ActiveCfg = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Debug|ARM.Build.0 = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Debug|ARM64.Build.0 = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Debug|x64.ActiveCfg = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Debug|x64.Build.0 = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Debug|x86.ActiveCfg = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Debug|x86.Build.0 = Debug|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Release|Any CPU.Build.0 = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Release|ARM.ActiveCfg = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Release|ARM.Build.0 = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Release|ARM64.ActiveCfg = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Release|ARM64.Build.0 = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Release|x64.ActiveCfg = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Release|x64.Build.0 = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Release|x86.ActiveCfg = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.Release|x86.Build.0 = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.RelWithDebInfo|x64.Build.0 = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU + {E3629433-C28E-4D37-887D-4F244C55510B}.RelWithDebInfo|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1059,6 +1185,9 @@ Global {CED9ABBA-861E-4C0A-9359-22351208EF27} = {03479E19-3F18-49A6-910A-F5041E27E7C0} {298AE119-6625-4604-BDE5-0765DC34C856} = {B62728C8-1267-4043-B46F-5537BBAEC692} {C457CBCD-3A8D-4402-9A2B-693A0390D3F9} = {298AE119-6625-4604-BDE5-0765DC34C856} + {C57F7656-6663-4A3C-BE38-B75C6C57E77D} = {B62728C8-1267-4043-B46F-5537BBAEC692} + {CFCF90E5-91CF-44FD-819D-97F530AEF769} = {19FAB78C-3351-4911-8F0C-8C6056401740} + {E3629433-C28E-4D37-887D-4F244C55510B} = {19FAB78C-3351-4911-8F0C-8C6056401740} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {46465737-C938-44FC-BE1A-4CE139EBB5E0} diff --git a/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/AuthModel.cs b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/AuthModel.cs new file mode 100644 index 0000000000..7b61da2a47 --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/AuthModel.cs @@ -0,0 +1,17 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json.Serialization; + +namespace Microsoft.Diagnostics.Monitoring.LogAnalytics +{ + internal sealed class AuthResult + { + [JsonPropertyName("access_token")] + public string AccessToken { get; set; } + } +} diff --git a/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/AuthenticatingHandler.cs b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/AuthenticatingHandler.cs new file mode 100644 index 0000000000..07f9e71311 --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/AuthenticatingHandler.cs @@ -0,0 +1,69 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Diagnostics.Monitoring.LogAnalytics +{ + internal sealed class AuthenticationDelegatingHandler : DelegatingHandler + { + //TODO Storing a high value bearer token in plain text in memory + private AuthenticationHeaderValue _cachedBearerToken; + private readonly MetricsConfiguration _metricsConfiguration; + + public AuthenticationDelegatingHandler(MetricsConfiguration configuration) : base(new HttpClientHandler()) + { + _metricsConfiguration = configuration; + } + + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + if (request.Headers.Authorization == null) + { + if (_cachedBearerToken == null) + { + _cachedBearerToken = await AcquireBearerToken(cancellationToken); + } + request.Headers.Authorization = _cachedBearerToken; + } + + HttpResponseMessage response = await base.SendAsync(request, cancellationToken); + //Possible Token expired + if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized) + { + _cachedBearerToken = await AcquireBearerToken(cancellationToken); + request.Headers.Authorization = _cachedBearerToken; + response = await base.SendAsync(request, cancellationToken); + } + return response; + } + + private async Task AcquireBearerToken(CancellationToken cancellationToken) + { + using var httpclient = new HttpClient(); + + var formValues = new Dictionary(); + formValues.Add("grant_type", "client_credentials"); + formValues.Add("client_id", _metricsConfiguration.AadClientId); + formValues.Add("client_secret", _metricsConfiguration.AadClientSecret); + formValues.Add("resource", "https://monitoring.azure.com/"); + + FormUrlEncodedContent content = new FormUrlEncodedContent(formValues); + using HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, FormattableString.Invariant($"https://login.microsoftonline.com/{_metricsConfiguration.TenantId}/oauth2/token")); + requestMessage.Content = content; + + using HttpResponseMessage result = await httpclient.SendAsync(requestMessage, cancellationToken); + result.EnsureSuccessStatusCode(); + + AuthResult auth = await JsonSerializer.DeserializeAsync(await result.EnsureSuccessStatusCode().Content.ReadAsStreamAsync(), cancellationToken: cancellationToken); + return new AuthenticationHeaderValue("Bearer", auth.AccessToken); + } + } +} diff --git a/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/LogAnalyticsLogger.cs b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/LogAnalyticsLogger.cs new file mode 100644 index 0000000000..b4d31e320f --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/LogAnalyticsLogger.cs @@ -0,0 +1,35 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Microsoft.Diagnostics.Monitoring.LogAnalytics +{ + internal sealed class LogAnalyticsLogger : ILogger + { + private sealed class EmptyScopes : IDisposable + { + public void Dispose() {} + } + + + public IDisposable BeginScope(TState state) + { + return new EmptyScopes(); + } + + public bool IsEnabled(LogLevel logLevel) + { + return true; + } + + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + { + return; + } + } +} diff --git a/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/LogAnalyticsLoggerProvider.cs b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/LogAnalyticsLoggerProvider.cs new file mode 100644 index 0000000000..e7c2da1b73 --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/LogAnalyticsLoggerProvider.cs @@ -0,0 +1,23 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Microsoft.Diagnostics.Monitoring.LogAnalytics +{ + public sealed class LogAnalyticsLoggerProvider : ILoggerProvider + { + public ILogger CreateLogger(string categoryName) + { + return new LogAnalyticsLogger(); + } + + public void Dispose() + { + } + } +} diff --git a/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/LogRestClient.cs b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/LogRestClient.cs new file mode 100644 index 0000000000..a527b3fce4 --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/LogRestClient.cs @@ -0,0 +1,13 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Net.Http; + +namespace Microsoft.Diagnostics.Monitoring.LogAnalytics +{ + internal sealed class LogRestClient + { + } +} diff --git a/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsConfiguration.cs b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsConfiguration.cs new file mode 100644 index 0000000000..fdc547d20e --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsConfiguration.cs @@ -0,0 +1,27 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace Microsoft.Diagnostics.Monitoring.LogAnalytics +{ + /// + /// Do not rename these fields. These are used to bind to the app's configuration. + /// + public sealed class MetricsConfiguration + { + public string TenantId { get; set; } + public string AadClientId { get; set; } + public string AadClientSecret { get; set; } + } + + public sealed class ResourceConfiguration + { + public string AzureResourceId { get; set; } + public string AzureRegion { get; set; } + } +} diff --git a/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsLogger.cs b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsLogger.cs new file mode 100644 index 0000000000..4cee6aa2b2 --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsLogger.cs @@ -0,0 +1,135 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System; +using System.Threading; +using System.Threading.Channels; +using System.Threading.Tasks; + +namespace Microsoft.Diagnostics.Monitoring.LogAnalytics +{ + public sealed class MetricsLogger : IMetricsLogger, IAsyncDisposable + { + private readonly ILogger _logger; + private readonly MetricsConfiguration _metricConfig; + private readonly ResourceConfiguration _resourceConfig; + + private readonly Channel _metricChannel; + private readonly CancellationTokenSource _cancellationTokenSource; + private readonly MetricsRestClient _metricsRestClient; + private readonly Task _processingTask; + + private int _disposed = 0; + + public MetricsLogger(ILogger logger, + IOptions metricsConfig, + IOptions resourceConfig) + { + _logger = logger; + + _metricConfig = metricsConfig.Value; + if (string.IsNullOrEmpty(_metricConfig.AadClientId) || + string.IsNullOrEmpty(_metricConfig.AadClientSecret) || + string.IsNullOrEmpty(_metricConfig.TenantId)) + { + _logger.LogError("Failed to bind metrics configuration. Metrics will not be collected."); + return; + } + _resourceConfig = resourceConfig.Value; + + if (string.IsNullOrEmpty(_resourceConfig.AzureRegion) || + string.IsNullOrEmpty(_resourceConfig.AzureResourceId) || + string.IsNullOrEmpty(_metricConfig.TenantId)) + { + _logger.LogError("Failed to bind azure resource configuration. Metrics will not be collected."); + return; + } + + //TODO Limit this + _metricChannel = Channel.CreateUnbounded(); + _cancellationTokenSource = new CancellationTokenSource(); + _metricsRestClient = new MetricsRestClient(_metricConfig, _resourceConfig); + + _processingTask = Task.Run(() => ProcessAllData(_cancellationTokenSource.Token), _cancellationTokenSource.Token); + } + + public void LogMetrics(Metric metric) + { + //Sink was not configured properly, we do not log any data. + if (_processingTask == null) + { + return; + } + + //We're not locking here so it's possible we won't throw even if the object has begun disposal. + //We handle this gracefully. + ThrowIfDisposed(); + + //If the channel is complete, we will not be able to write to it. + _metricChannel.Writer.TryWrite(metric); + } + + private async Task ProcessAllData(CancellationToken token) + { + while (!token.IsCancellationRequested) + { + Metric metric = null; + try + { + metric = await _metricChannel.Reader.ReadAsync(token); + } + catch (ChannelClosedException) + { + return; + } + + try + { + await _metricsRestClient.SendMetric(metric, token); + } + catch (Exception e) when ((!(e is OperationCanceledException)) && (!(e is ObjectDisposedException))) + { + _logger.LogError(e, e.Message); + } + } + token.ThrowIfCancellationRequested(); + } + + private void ThrowIfDisposed() + { + if (Interlocked.CompareExchange(ref _disposed, value: 1, comparand: 1) == 1) + { + throw new ObjectDisposedException(nameof(MetricsLogger)); + } + } + + public void Dispose() + { + _ = DisposeAsync(); + } + + public async ValueTask DisposeAsync() + { + if (Interlocked.CompareExchange(ref _disposed, value: 1, comparand: 0) == 1) + { + return; + } + + //Do not allow any more entries. This should force ReadAsync to throw. + _metricChannel?.Writer.TryComplete(); + + //Finish processing + //TODO Consider limiting this to a certain amount of time. + if (_processingTask != null) + { + await _processingTask; + } + _cancellationTokenSource?.Cancel(); + _cancellationTokenSource?.Dispose(); + _metricsRestClient?.Dispose(); + } + } +} diff --git a/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsModel.cs b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsModel.cs new file mode 100644 index 0000000000..310393429a --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsModel.cs @@ -0,0 +1,38 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Text; + +namespace Microsoft.Diagnostics.Monitoring.LogAnalytics +{ + internal sealed class MetricSeries + { + public IReadOnlyList DimValues { get; set; } + public double Min { get; set; } + public double Max { get; set; } + public double Sum { get; set; } + public int Count { get; set; } + } + + internal sealed class MetricBaseData + { + public string Metric { get; set; } + public string Namespace { get; set; } + public IReadOnlyList DimNames { get; set; } + public IList Series { get; set; } = new List(); + } + + internal sealed class MetricData + { + public MetricBaseData BaseData { get; set; } = new MetricBaseData(); + } + + internal sealed class AggregatedMetric + { + public string Time { get; set; } + public MetricData Data { get; set; } = new MetricData(); + } +} diff --git a/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsRestClient.cs b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsRestClient.cs new file mode 100644 index 0000000000..d178f5840e --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/MetricsRestClient.cs @@ -0,0 +1,70 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Diagnostics.Monitoring.LogAnalytics +{ + internal class MetricsRestClient : IDisposable + { + private readonly HttpClient _client; + private readonly ResourceConfiguration _resourceConfig; + + private CancellationTokenSource _tokenSource = new CancellationTokenSource(); + + public MetricsRestClient(MetricsConfiguration config, ResourceConfiguration resourceConfig) + { + _resourceConfig = resourceConfig; + _client = new HttpClient(new AuthenticationDelegatingHandler(config)); + } + + public async Task SendMetric(Metric metric, CancellationToken token) + { + string uri = FormattableString.Invariant($"https://{_resourceConfig.AzureRegion}.monitoring.azure.com{_resourceConfig.AzureResourceId}/metrics"); + + using HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, uri); + + var aggregatedMetric = new AggregatedMetric(); + + aggregatedMetric.Data.BaseData.Namespace = metric.Namespace; + aggregatedMetric.Data.BaseData.Metric = metric.DisplayName + (string.IsNullOrEmpty(metric.Unit) ? string.Empty : $" ({metric.Unit})"); + + aggregatedMetric.Time = metric.Timestamp.ToString("o"); + aggregatedMetric.Data.BaseData.DimNames = metric.DimNames; + + var series = new MetricSeries + { + Count = 1, + Sum = metric.Value, + Min = metric.Value, + Max = metric.Value, + DimValues = metric.DimValues + }; + + aggregatedMetric.Data.BaseData.Series.Add(series); + + using var memoryStream = new MemoryStream(); + await JsonSerializer.SerializeAsync(memoryStream, aggregatedMetric, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }, token); + memoryStream.Position = 0L; + + StreamContent streamContent = new StreamContent(memoryStream); + streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); + request.Content = streamContent; + + await _client.SendAsync(request, token); + } + + public void Dispose() + { + _client?.Dispose(); + } + } +} diff --git a/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/Microsoft.Diagnostics.Monitoring.LogAnalytics.csproj b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/Microsoft.Diagnostics.Monitoring.LogAnalytics.csproj new file mode 100644 index 0000000000..baaeb84aa8 --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/Microsoft.Diagnostics.Monitoring.LogAnalytics.csproj @@ -0,0 +1,23 @@ + + + + netstandard2.0 + ;1591;1701 + Log Analytics Sink for dotnet monitoring + true + Diagnostic + $(Description) + false + true + true + + + + + + + + + + + diff --git a/src/Microsoft.Diagnostics.Monitoring/ContextConfiguration.cs b/src/Microsoft.Diagnostics.Monitoring/ContextConfiguration.cs new file mode 100644 index 0000000000..4823f9f648 --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring/ContextConfiguration.cs @@ -0,0 +1,21 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Text; + +namespace Microsoft.Diagnostics.Monitoring +{ + /// + /// Do not rename these fields. These are used to bind to the app's configuration. + /// + public class ContextConfiguration + { + public string Namespace { get; set; } + + public string Node { get; set; } + + } +} diff --git a/src/Microsoft.Diagnostics.Monitoring/DiagnosticsMonitor.cs b/src/Microsoft.Diagnostics.Monitoring/DiagnosticsMonitor.cs new file mode 100644 index 0000000000..1a8dee3821 --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring/DiagnosticsMonitor.cs @@ -0,0 +1,377 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Diagnostics.Tracing; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Diagnostics.Monitoring +{ + public sealed class DiagnosticsMonitor : IAsyncDisposable + { + private readonly IServiceProvider _services; + private readonly Microsoft.Extensions.Logging.ILogger _logger; + private readonly MonitoringSourceConfiguration _sourceConfig; + private readonly IEnumerable _metricLoggers; + + //These values don't change so we compute them only once + private readonly List _dimValues; + + public const string NamespaceName = "Namespace"; + public const string NodeName = "Node"; + private static readonly List DimNames = new List{ NamespaceName, NodeName}; + + private int _disposeState = 0; + + public DiagnosticsMonitor(IServiceProvider services, MonitoringSourceConfiguration sourceConfig) + { + _services = services; + _sourceConfig = sourceConfig; + IOptions contextConfig = _services.GetService>(); + _dimValues = new List { contextConfig.Value.Namespace, contextConfig.Value.Node }; + _metricLoggers = _services.GetServices(); + _logger = _services.GetService>(); + } + + public async Task ProcessEvents(int processId, CancellationToken cancellationToken) + { + var hasEventPipe = false; + + for (int i = 0; i < 10; ++i) + { + if (DiagnosticsClient.GetPublishedProcesses().Contains(processId)) + { + hasEventPipe = true; + break; + } + + cancellationToken.ThrowIfCancellationRequested(); + + await Task.Delay(500); + } + + if (!hasEventPipe) + { + _logger.LogInformation("Process id {PID}, does not support event pipe", processId); + return; + } + + _logger.LogInformation("Listening for event pipe events for {ServiceName} on process id {PID}", _dimValues[1], processId); + + while (!cancellationToken.IsCancellationRequested) + { + EventPipeSession session = null; + var client = new DiagnosticsClient(processId); + + try + { + session = client.StartEventPipeSession(_sourceConfig.GetProviders()); + } + catch (EndOfStreamException) + { + break; + } + catch (Exception ex) + { + if (!cancellationToken.IsCancellationRequested) + { + _logger.LogDebug(0, ex, "Failed to start the event pipe session"); + } + + // We can't even start the session, wait until the process boots up again to start another metrics thread + break; + } + + void StopSession() + { + try + { + session.Stop(); + } + catch (EndOfStreamException) + { + // If the app we're monitoring exits abruptly, this may throw in which case we just swallow the exception and exit gracefully. + } + // We may time out if the process ended before we sent StopTracing command. We can just exit in that case. + catch (TimeoutException) + { + } + // On Unix platforms, we may actually get a PNSE since the pipe is gone with the process, and Runtime Client Library + // does not know how to distinguish a situation where there is no pipe to begin with, or where the process has exited + // before dotnet-counters and got rid of a pipe that once existed. + // Since we are catching this in StopMonitor() we know that the pipe once existed (otherwise the exception would've + // been thrown in StartMonitor directly) + catch (PlatformNotSupportedException) + { + } + } + + using var _ = cancellationToken.Register(() => StopSession()); + + try + { + var source = new EventPipeEventSource(session.EventStream); + + // Metrics + HandleEventCounters(source); + + // Logging + HandleLoggingEvents(source); + + source.Process(); + } + catch (DiagnosticsClientException ex) + { + _logger.LogDebug(0, ex, "Failed to start the event pipe session"); + } + catch (Exception) + { + // This fails if stop is called or if the process dies + } + finally + { + session?.Dispose(); + } + } + + _logger.LogInformation("Event pipe collection completed for {ServiceName} on process id {PID}", _dimValues[1], processId); + } + + private void HandleLoggingEvents(EventPipeEventSource source) + { + string lastFormattedMessage = string.Empty; + + var logActivities = new Dictionary(); + var stack = new Stack(); + + source.Dynamic.AddCallbackForProviderEvent(MonitoringSourceConfiguration.MicrosoftExtensionsLoggingProviderName, "ActivityJsonStart/Start", (traceEvent) => + { + var factoryId = (int)traceEvent.PayloadByName("FactoryID"); + var categoryName = (string)traceEvent.PayloadByName("LoggerName"); + var argsJson = (string)traceEvent.PayloadByName("ArgumentsJson"); + + // TODO: Store this information by logger factory id + var item = new LogActivityItem + { + ActivityID = traceEvent.ActivityID, + ScopedObject = new LogObject(JsonDocument.Parse(argsJson).RootElement), + }; + + if (stack.Count > 0) + { + Guid parentId = stack.Peek(); + if (logActivities.TryGetValue(parentId, out var parentItem)) + { + item.Parent = parentItem; + } + } + + stack.Push(traceEvent.ActivityID); + logActivities[traceEvent.ActivityID] = item; + }); + + source.Dynamic.AddCallbackForProviderEvent(MonitoringSourceConfiguration.MicrosoftExtensionsLoggingProviderName, "ActivityJsonStop/Stop", (traceEvent) => + { + var factoryId = (int)traceEvent.PayloadByName("FactoryID"); + var categoryName = (string)traceEvent.PayloadByName("LoggerName"); + + stack.Pop(); + logActivities.Remove(traceEvent.ActivityID); + }); + + source.Dynamic.AddCallbackForProviderEvent(MonitoringSourceConfiguration.MicrosoftExtensionsLoggingProviderName, "MessageJson", (traceEvent) => + { + // Level, FactoryID, LoggerName, EventID, EventName, ExceptionJson, ArgumentsJson + var logLevel = (LogLevel)traceEvent.PayloadByName("Level"); + var factoryId = (int)traceEvent.PayloadByName("FactoryID"); + var categoryName = (string)traceEvent.PayloadByName("LoggerName"); + var eventId = (int)traceEvent.PayloadByName("EventId"); + var eventName = (string)traceEvent.PayloadByName("EventName"); + var exceptionJson = (string)traceEvent.PayloadByName("ExceptionJson"); + var argsJson = (string)traceEvent.PayloadByName("ArgumentsJson"); + + // There's a bug that causes some of the columns to get mixed up + if (eventName.StartsWith("{")) + { + argsJson = exceptionJson; + exceptionJson = eventName; + eventName = null; + } + + if (string.IsNullOrEmpty(argsJson)) + { + return; + } + + Exception exception = null; + + ILogger logger = _services.GetService().CreateLogger(categoryName); + + var scopes = new List(); + + if (logActivities.TryGetValue(traceEvent.ActivityID, out var logActivityItem)) + { + // REVIEW: Does order matter here? We're combining everything anyways. + while (logActivityItem != null) + { + scopes.Add(logger.BeginScope(logActivityItem.ScopedObject)); + + logActivityItem = logActivityItem.Parent; + } + } + + try + { + if (exceptionJson != "{}") + { + var exceptionMessage = JsonSerializer.Deserialize(exceptionJson); + exception = new LoggerException(exceptionMessage); + } + + var message = JsonSerializer.Deserialize(argsJson); + if (message.TryGetProperty("{OriginalFormat}", out var formatElement)) + { + var formatString = formatElement.GetString(); + var formatter = new LogValuesFormatter(formatString); + object[] args = new object[formatter.ValueNames.Count]; + for (int i = 0; i < args.Length; i++) + { + args[i] = message.GetProperty(formatter.ValueNames[i]).GetString(); + } + + logger.Log(logLevel, new EventId(eventId, eventName), exception, formatString, args); + } + else + { + var obj = new LogObject(message, lastFormattedMessage); + logger.Log(logLevel, new EventId(eventId, eventName), obj, exception, LogObject.Callback); + } + } + catch (Exception ex) + { + _logger.LogDebug(ex, "Error processing log entry for {ServiceName}", _dimValues[1]); + } + finally + { + scopes.ForEach(d => d.Dispose()); + } + }); + + source.Dynamic.AddCallbackForProviderEvent(MonitoringSourceConfiguration.MicrosoftExtensionsLoggingProviderName, "FormattedMessage", (traceEvent) => + { + // Level, FactoryID, LoggerName, EventID, EventName, FormattedMessage + var logLevel = (LogLevel)traceEvent.PayloadByName("Level"); + var factoryId = (int)traceEvent.PayloadByName("FactoryID"); + var categoryName = (string)traceEvent.PayloadByName("LoggerName"); + var eventId = (int)traceEvent.PayloadByName("EventId"); + var eventName = (string)traceEvent.PayloadByName("EventName"); + var formattedMessage = (string)traceEvent.PayloadByName("FormattedMessage"); + + if (string.IsNullOrEmpty(formattedMessage)) + { + formattedMessage = eventName; + eventName = string.Empty; + } + + lastFormattedMessage = formattedMessage; + }); + } + + private void HandleEventCounters(EventPipeEventSource source) + { + source.Dynamic.All += traceEvent => + { + try + { + // Metrics + if (traceEvent.EventName.Equals("EventCounters")) + { + IDictionary payloadVal = (IDictionary)(traceEvent.PayloadValue(0)); + IDictionary payloadFields = (IDictionary)(payloadVal["Payload"]); + + string counterName = payloadFields["Name"].ToString(); + string displayName = payloadFields["DisplayName"].ToString(); + string displayUnits = payloadFields["DisplayUnits"].ToString(); + double value = 0; + if (payloadFields["CounterType"].Equals("Mean")) + { + value = (double)payloadFields["Mean"]; + } + else if (payloadFields["CounterType"].Equals("Sum")) + { + value = (double)payloadFields["Increment"]; + if (string.IsNullOrEmpty(displayUnits)) + { + displayUnits = "count"; + } + displayUnits += "/sec"; + } + + PostMetric(new Metric(traceEvent.TimeStamp, traceEvent.ProviderName, counterName, displayName, displayUnits, value, dimNames: DimNames, dimValues: _dimValues)); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Error processing counter for {ProviderName}:{EventName}", traceEvent.ProviderName, traceEvent.EventName); + } + }; + } + + private void PostMetric(Metric metric) + { + foreach(IMetricsLogger metricLogger in _metricLoggers) + { + try + { + metricLogger.LogMetrics(metric); + } + catch (ObjectDisposedException) + { + } + catch (Exception e) + { + _logger.LogError($"Error from {metricLogger.GetType()}: {e.Message}"); + } + } + } + + public async ValueTask DisposeAsync() + { + if (Interlocked.CompareExchange(ref _disposeState, 1, 0) == 1) + { + return; + } + + foreach(IMetricsLogger logger in _metricLoggers) + { + if (logger is IAsyncDisposable asyncDisposable) + { + await asyncDisposable.DisposeAsync(); + } + else + { + logger?.Dispose(); + } + } + } + + private class LogActivityItem + { + public Guid ActivityID { get; set; } + + public LogObject ScopedObject { get; set; } + + public LogActivityItem Parent { get; set; } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Diagnostics.Monitoring/IMetricsLogger.cs b/src/Microsoft.Diagnostics.Monitoring/IMetricsLogger.cs new file mode 100644 index 0000000000..2279ec4136 --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring/IMetricsLogger.cs @@ -0,0 +1,17 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Diagnostics.Monitoring +{ + public interface IMetricsLogger : IDisposable + { + void LogMetrics(Metric metric); + } +} diff --git a/src/Microsoft.Diagnostics.Monitoring/LogObject.cs b/src/Microsoft.Diagnostics.Monitoring/LogObject.cs new file mode 100644 index 0000000000..974504a749 --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring/LogObject.cs @@ -0,0 +1,72 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Text.Json; + +namespace Microsoft.Diagnostics.Monitoring +{ + public class LogObject : IReadOnlyList> + { + public static readonly Func Callback = (state, exception) => ((LogObject)state).ToString(); + + private readonly string _formattedMessage; + private List> _items = new List>(); + + public LogObject(JsonElement element, string formattedMessage = null) + { + foreach (var item in element.EnumerateObject()) + { + switch (item.Value.ValueKind) + { + case JsonValueKind.Undefined: + break; + case JsonValueKind.Object: + break; + case JsonValueKind.Array: + break; + case JsonValueKind.String: + _items.Add(new KeyValuePair(item.Name, item.Value.GetString())); + break; + case JsonValueKind.Number: + _items.Add(new KeyValuePair(item.Name, item.Value.GetInt32())); + break; + case JsonValueKind.False: + case JsonValueKind.True: + _items.Add(new KeyValuePair(item.Name, item.Value.GetBoolean())); + break; + case JsonValueKind.Null: + _items.Add(new KeyValuePair(item.Name, null)); + break; + default: + break; + } + } + + _formattedMessage = formattedMessage; + } + + public KeyValuePair this[int index] => _items[index]; + + public int Count => _items.Count; + + public IEnumerator> GetEnumerator() + { + return _items.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public override string ToString() + { + return _formattedMessage ?? string.Empty; + } + } +} diff --git a/src/Microsoft.Diagnostics.Monitoring/LogValuesFormatter.cs b/src/Microsoft.Diagnostics.Monitoring/LogValuesFormatter.cs new file mode 100644 index 0000000000..59000d9de6 --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring/LogValuesFormatter.cs @@ -0,0 +1,200 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Globalization; +using System.Text; + +namespace Microsoft.Diagnostics.Monitoring +{ + /// + /// Formatter to convert the named format items like {NamedformatItem} to format. + /// + public class LogValuesFormatter + { + private const string NullValue = "(null)"; + private static readonly object[] EmptyArray = new object[0]; + private static readonly char[] FormatDelimiters = { ',', ':' }; + private readonly string _format; + private readonly List _valueNames = new List(); + + public LogValuesFormatter(string format) + { + OriginalFormat = format; + + var sb = new StringBuilder(); + var scanIndex = 0; + var endIndex = format.Length; + + while (scanIndex < endIndex) + { + var openBraceIndex = FindBraceIndex(format, '{', scanIndex, endIndex); + var closeBraceIndex = FindBraceIndex(format, '}', openBraceIndex, endIndex); + + if (closeBraceIndex == endIndex) + { + sb.Append(format, scanIndex, endIndex - scanIndex); + scanIndex = endIndex; + } + else + { + // Format item syntax : { index[,alignment][ :formatString] }. + var formatDelimiterIndex = FindIndexOfAny(format, FormatDelimiters, openBraceIndex, closeBraceIndex); + + sb.Append(format, scanIndex, openBraceIndex - scanIndex + 1); + sb.Append(_valueNames.Count.ToString(CultureInfo.InvariantCulture)); + _valueNames.Add(format.Substring(openBraceIndex + 1, formatDelimiterIndex - openBraceIndex - 1)); + sb.Append(format, formatDelimiterIndex, closeBraceIndex - formatDelimiterIndex + 1); + + scanIndex = closeBraceIndex + 1; + } + } + + _format = sb.ToString(); + } + + public string OriginalFormat { get; private set; } + public List ValueNames => _valueNames; + + private static int FindBraceIndex(string format, char brace, int startIndex, int endIndex) + { + // Example: {{prefix{{{Argument}}}suffix}}. + var braceIndex = endIndex; + var scanIndex = startIndex; + var braceOccurenceCount = 0; + + while (scanIndex < endIndex) + { + if (braceOccurenceCount > 0 && format[scanIndex] != brace) + { + if (braceOccurenceCount % 2 == 0) + { + // Even number of '{' or '}' found. Proceed search with next occurence of '{' or '}'. + braceOccurenceCount = 0; + braceIndex = endIndex; + } + else + { + // An unescaped '{' or '}' found. + break; + } + } + else if (format[scanIndex] == brace) + { + if (brace == '}') + { + if (braceOccurenceCount == 0) + { + // For '}' pick the first occurence. + braceIndex = scanIndex; + } + } + else + { + // For '{' pick the last occurence. + braceIndex = scanIndex; + } + + braceOccurenceCount++; + } + + scanIndex++; + } + + return braceIndex; + } + + private static int FindIndexOfAny(string format, char[] chars, int startIndex, int endIndex) + { + var findIndex = format.IndexOfAny(chars, startIndex, endIndex - startIndex); + return findIndex == -1 ? endIndex : findIndex; + } + + public string Format(object[] values) + { + if (values != null) + { + for (int i = 0; i < values.Length; i++) + { + values[i] = FormatArgument(values[i]); + } + } + + return string.Format(CultureInfo.InvariantCulture, _format, values ?? EmptyArray); + } + + internal string Format() + { + return _format; + } + + internal string Format(object arg0) + { + return string.Format(CultureInfo.InvariantCulture, _format, FormatArgument(arg0)); + } + + internal string Format(object arg0, object arg1) + { + return string.Format(CultureInfo.InvariantCulture, _format, FormatArgument(arg0), FormatArgument(arg1)); + } + + internal string Format(object arg0, object arg1, object arg2) + { + return string.Format(CultureInfo.InvariantCulture, _format, FormatArgument(arg0), FormatArgument(arg1), FormatArgument(arg2)); + } + + public KeyValuePair GetValue(object[] values, int index) + { + if (index < 0 || index > _valueNames.Count) + { + throw new IndexOutOfRangeException(nameof(index)); + } + + if (_valueNames.Count > index) + { + return new KeyValuePair(_valueNames[index], values[index]); + } + + return new KeyValuePair("{OriginalFormat}", OriginalFormat); + } + + public IEnumerable> GetValues(object[] values) + { + var valueArray = new KeyValuePair[values.Length + 1]; + for (var index = 0; index != _valueNames.Count; ++index) + { + valueArray[index] = new KeyValuePair(_valueNames[index], values[index]); + } + + valueArray[valueArray.Length - 1] = new KeyValuePair("{OriginalFormat}", OriginalFormat); + return valueArray; + } + + private object FormatArgument(object value) + { + if (value == null) + { + return NullValue; + } + + // since 'string' implements IEnumerable, special case it + if (value is string) + { + return value; + } + + // if the value implements IEnumerable, build a comma separated string. + var enumerable = value as IEnumerable; + if (enumerable != null) + { + return string.Join(", ", enumerable.Cast().Select(o => o ?? NullValue)); + } + + return value; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Diagnostics.Monitoring/LoggerException.cs b/src/Microsoft.Diagnostics.Monitoring/LoggerException.cs new file mode 100644 index 0000000000..6869fb3873 --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring/LoggerException.cs @@ -0,0 +1,48 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Text; +using System.Text.Json; + +namespace Microsoft.Diagnostics.Monitoring +{ + public class LoggerException : Exception + { + private readonly JsonElement _exceptionMessage; + + public LoggerException(JsonElement exceptionMessage) + { + _exceptionMessage = exceptionMessage; + } + + public override void GetObjectData(SerializationInfo info, StreamingContext context) + { + info.AddValue("ClassName", _exceptionMessage.GetProperty("TypeName").GetString(), typeof(string)); // Do not rename (binary serialization) + info.AddValue("Message", Message, typeof(string)); // Do not rename (binary serialization) + info.AddValue("Data", Data, typeof(IDictionary)); // Do not rename (binary serialization) + info.AddValue("InnerException", null, typeof(Exception)); // Do not rename (binary serialization) + info.AddValue("HelpURL", null, typeof(string)); // Do not rename (binary serialization) + info.AddValue("StackTraceString", StackTrace, typeof(string)); // Do not rename (binary serialization) + info.AddValue("RemoteStackTraceString", StackTrace, typeof(string)); // Do not rename (binary serialization) + info.AddValue("RemoteStackIndex", 0, typeof(int)); // Do not rename (binary serialization) + info.AddValue("ExceptionMethod", null, typeof(string)); // Do not rename (binary serialization) + info.AddValue("HResult", int.Parse(_exceptionMessage.GetProperty("HResult").GetString())); // Do not rename (binary serialization) + info.AddValue("Source", Source, typeof(string)); // Do not rename (binary serialization + info.AddValue("WatsonBuckets", null, typeof(byte[])); // Do not rename (binary serialization) + } + + public override string Message => _exceptionMessage.GetProperty("Message").GetString(); + + public override string StackTrace => _exceptionMessage.GetProperty("VerboseMessage").GetString(); + + public override string ToString() + { + return _exceptionMessage.GetProperty("VerboseMessage").GetString(); + } + } +} diff --git a/src/Microsoft.Diagnostics.Monitoring/Metric.cs b/src/Microsoft.Diagnostics.Monitoring/Metric.cs new file mode 100644 index 0000000000..7e40b6478b --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring/Metric.cs @@ -0,0 +1,53 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace Microsoft.Diagnostics.Monitoring +{ + public enum MetricType + { + Avg, + Sum, + Min, + Max + } + + public class Metric + { + public Metric(DateTime timestamp, string metricNamespace, string name, string displayName, string unit, double value, IReadOnlyList dimNames, IReadOnlyList dimValues, MetricType metricType = MetricType.Avg) + { + Timestamp = timestamp; + Name = name; + DisplayName = displayName; + Unit = unit; + Value = value; + MetricType = metricType; + Namespace = metricNamespace; + DimNames = dimNames; + DimValues = dimValues; + } + + public IReadOnlyList DimNames { get; } + + public IReadOnlyList DimValues { get; } + + public string Namespace { get; } + + public MetricType MetricType { get; } + + public string Name { get; } + + public string DisplayName { get; } + + public string Unit { get; } + + public double Value { get; } + + public DateTime Timestamp { get; } + } +} diff --git a/src/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.csproj b/src/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.csproj new file mode 100644 index 0000000000..4df6b32f6f --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.csproj @@ -0,0 +1,24 @@ + + + + netstandard2.0 + ;1591;1701 + Monitoring for dotnet + true + Diagnostic + $(Description) + false + true + true + + + + + + + + + + + + diff --git a/src/Microsoft.Diagnostics.Monitoring/MonitoringSourceConfiguration.cs b/src/Microsoft.Diagnostics.Monitoring/MonitoringSourceConfiguration.cs new file mode 100644 index 0000000000..82ae464eeb --- /dev/null +++ b/src/Microsoft.Diagnostics.Monitoring/MonitoringSourceConfiguration.cs @@ -0,0 +1,166 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Diagnostics.Tracing.Parsers; +using System; +using System.Collections.Generic; +using System.Diagnostics.Tracing; +using System.Globalization; +using System.Text; + +namespace Microsoft.Diagnostics.Monitoring +{ + public class MonitoringSourceConfiguration + { + public const string MicrosoftExtensionsLoggingProviderName = "Microsoft-Extensions-Logging"; + public const string SystemRuntimeEventSourceName = "System.Runtime"; + public const string MicrosoftAspNetCoreHostingEventSourceName = "Microsoft.AspNetCore.Hosting"; + public const string GrpcAspNetCoreServer = "Grpc.AspNetCore.Server"; + public const string DiagnosticSourceEventSource = "Microsoft-Diagnostics-DiagnosticSource"; + public const string TplEventSource = "System.Threading.Tasks.TplEventSource"; + + public const string DiagnosticFilterString = "\"" + + "Microsoft.AspNetCore/Microsoft.AspNetCore.Hosting.HttpRequestIn.Start@Activity1Start:-" + + "Request.Scheme" + + ";Request.Host" + + ";Request.PathBase" + + ";Request.QueryString" + + ";Request.Path" + + ";Request.Method" + + ";ActivityStartTime=*Activity.StartTimeUtc.Ticks" + + ";ActivityParentId=*Activity.ParentId" + + ";ActivityId=*Activity.Id" + + ";ActivitySpanId=*Activity.SpanId" + + ";ActivityTraceId=*Activity.TraceId" + + ";ActivityParentSpanId=*Activity.ParentSpanId" + + ";ActivityIdFormat=*Activity.IdFormat" + + "\r\n" + + "Microsoft.AspNetCore/Microsoft.AspNetCore.Hosting.HttpRequestIn.Stop@Activity1Stop:-" + + "Response.StatusCode" + + ";ActivityDuration=*Activity.Duration.Ticks" + + ";ActivityId=*Activity.Id" + + "\r\n" + + "HttpHandlerDiagnosticListener/System.Net.Http.HttpRequestOut@Event:-" + + "\r\n" + + "HttpHandlerDiagnosticListener/System.Net.Http.HttpRequestOut.Start@Activity2Start:-" + + "Request.RequestUri" + + ";Request.Method" + + ";Request.RequestUri.Host" + + ";Request.RequestUri.Port" + + ";ActivityStartTime=*Activity.StartTimeUtc.Ticks" + + ";ActivityId=*Activity.Id" + + ";ActivitySpanId=*Activity.SpanId" + + ";ActivityTraceId=*Activity.TraceId" + + ";ActivityParentSpanId=*Activity.ParentSpanId" + + ";ActivityIdFormat=*Activity.IdFormat" + + ";ActivityId=*Activity.Id" + + "\r\n" + + "HttpHandlerDiagnosticListener/System.Net.Http.HttpRequestOut.Stop@Activity2Stop:-" + + ";ActivityDuration=*Activity.Duration.Ticks" + + ";ActivityId=*Activity.Id" + + "\r\n" + + + "\""; + + public MonitoringSourceConfiguration(int metricIntervalSeconds = 60) + { + MetricIntervalSeconds = metricIntervalSeconds.ToString(CultureInfo.InvariantCulture); + } + + protected virtual string MetricIntervalSeconds { get; } + + public virtual IList GetProviders() + { + var providers = new List() + { + // Runtime Metrics + new EventPipeProvider( + SystemRuntimeEventSourceName, + EventLevel.Informational, + (long)ClrTraceEventParser.Keywords.None, + new Dictionary() { + { "EventCounterIntervalSec", MetricIntervalSeconds } + } + ), + new EventPipeProvider( + MicrosoftAspNetCoreHostingEventSourceName, + EventLevel.Informational, + (long)ClrTraceEventParser.Keywords.None, + new Dictionary() { + { "EventCounterIntervalSec", MetricIntervalSeconds } + } + ), + new EventPipeProvider( + GrpcAspNetCoreServer, + EventLevel.Informational, + (long)ClrTraceEventParser.Keywords.None, + new Dictionary() { + { "EventCounterIntervalSec", MetricIntervalSeconds } + } + ), + + // Application Metrics + //new EventPipeProvider( + // applicationName, + // EventLevel.Informational, + // (long)ClrTraceEventParser.Keywords.None, + // new Dictionary() { + // { "EventCounterIntervalSec", MetricIntervalSeconds } + // } + //), + + // Logging + new EventPipeProvider( + MicrosoftExtensionsLoggingProviderName, + EventLevel.LogAlways, + (long)(LoggingEventSource.Keywords.JsonMessage | LoggingEventSource.Keywords.FormattedMessage) + ), + + // Activity correlation + //new EventPipeProvider(TplEventSource, + // keywords: 0x80, + // eventLevel: EventLevel.LogAlways), + + // Diagnostic source events + new EventPipeProvider(DiagnosticSourceEventSource, + keywords: 0x1 | 0x2, + eventLevel: EventLevel.Verbose, + arguments: new Dictionary + { + { "FilterAndPayloadSpecs", DiagnosticFilterString } + }) + }; + + return providers; + } + + internal sealed class LoggingEventSource + { + /// + /// This is public from an EventSource consumer point of view, but since these defintions + /// are not needed outside this class + /// + public static class Keywords + { + /// + /// Meta events are events about the LoggingEventSource itself (that is they did not come from ILogger + /// + public const EventKeywords Meta = (EventKeywords)1; + /// + /// Turns on the 'Message' event when ILogger.Log() is called. It gives the information in a programmatic (not formatted) way + /// + public const EventKeywords Message = (EventKeywords)2; + /// + /// Turns on the 'FormatMessage' event when ILogger.Log() is called. It gives the formatted string version of the information. + /// + public const EventKeywords FormattedMessage = (EventKeywords)4; + /// + /// Turns on the 'MessageJson' event when ILogger.Log() is called. It gives JSON representation of the Arguments. + /// + public const EventKeywords JsonMessage = (EventKeywords)8; + } + } + } +} diff --git a/src/Tools/dotnet-monitor/ConsoleMetricsLogger.cs b/src/Tools/dotnet-monitor/ConsoleMetricsLogger.cs new file mode 100644 index 0000000000..aa7f8a02cf --- /dev/null +++ b/src/Tools/dotnet-monitor/ConsoleMetricsLogger.cs @@ -0,0 +1,23 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Diagnostics.Monitoring; +using System; +using System.Collections.Generic; +using System.Text.Json; + +namespace Microsoft.Diagnostics.Tools.Monitor +{ + internal sealed class ConsoleMetricsLogger : IMetricsLogger + { + public void LogMetrics(Metric metric) + { + string json = JsonSerializer.Serialize(metric, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = true }); + Console.WriteLine(json); + } + public void Dispose() + { + } + } +} diff --git a/src/Tools/dotnet-monitor/DiagnosticsMonitorCommandHandler.cs b/src/Tools/dotnet-monitor/DiagnosticsMonitorCommandHandler.cs new file mode 100644 index 0000000000..35cd99d0ab --- /dev/null +++ b/src/Tools/dotnet-monitor/DiagnosticsMonitorCommandHandler.cs @@ -0,0 +1,139 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Diagnostics.Monitoring; +using Microsoft.Diagnostics.Monitoring.LogAnalytics; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.CommandLine; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Diagnostics.Tools.Monitor +{ + internal sealed class DiagnosticsMonitorCommandHandler + { + private sealed class ConsoleLoggerAdapter : ILogger + { + private readonly IConsole _console; + + private sealed class EmptyScope : IDisposable + { + public static EmptyScope Instance { get; } = new EmptyScope(); + + public void Dispose() { } + } + + public ConsoleLoggerAdapter(IConsole console) + { + _console = console; + } + + public IDisposable BeginScope(TState state) + { + return EmptyScope.Instance; + } + + public bool IsEnabled(LogLevel logLevel) => true; + + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + { + _console.Out.WriteLine((formatter != null) ? formatter.Invoke(state, exception) : state?.ToString()); + } + } + + public async Task Start(CancellationToken token, IConsole console, int processId, int refreshInterval, SinkType sink, IEnumerable jsonConfigs, IEnumerable keyFileConfigs) + { + //CONSIDER The console sink uses the standard AddConsole, and therefore disregards IConsole. + + ServiceCollection services = new ServiceCollection(); + ConfigurationBuilder builder = new ConfigurationBuilder(); + + if (jsonConfigs != null) + { + foreach (FileInfo jsonFile in jsonConfigs) + { + builder.SetBasePath(jsonFile.DirectoryName).AddJsonFile(jsonFile.Name, optional: true); + } + } + if (keyFileConfigs != null) + { + foreach (FileInfo keyFileConfig in keyFileConfigs) + { + console.Out.WriteLine(keyFileConfig.FullName); + builder.AddKeyPerFile(keyFileConfig.FullName, optional: true); + } + } + + ConfigureNames(builder); + + IConfigurationRoot config = builder.Build(); + services.AddSingleton(config); + + //Specialized logger for diagnostic output from the service itself rather than as a sink for the data + services.AddSingleton>((sp) => new ConsoleLoggerAdapter(console)); + + if (sink.HasFlag(SinkType.Console)) + { + services.AddSingleton(); + } + if (sink.HasFlag(SinkType.LogAnalytics)) + { + services.AddSingleton(); + } + + services.AddLogging(builder => + { + if (sink.HasFlag(SinkType.Console)) + { + builder.AddConsole(); + } + if (sink.HasFlag(SinkType.LogAnalytics)) + { + builder.AddProvider(new LogAnalyticsLoggerProvider()); + } + }); + services.Configure(config); + if (sink.HasFlag(SinkType.LogAnalytics)) + { + services.Configure(config); + services.Configure(config); + } + + await using var monitor = new DiagnosticsMonitor(services.BuildServiceProvider(), new MonitoringSourceConfiguration(refreshInterval)); + await monitor.ProcessEvents(processId, token); + + return 0; + } + + private void ConfigureNames(IConfigurationBuilder builder) + { + string hostName = Environment.GetEnvironmentVariable("HOSTNAME"); + if (string.IsNullOrEmpty(hostName)) + { + hostName = Environment.MachineName; + } + string namespaceName = null; + try + { + namespaceName = File.ReadAllText(@"/var/run/secrets/kubernetes.io/serviceaccount/namespace"); + } + catch + { + } + + if (string.IsNullOrEmpty(namespaceName)) + { + namespaceName = "default"; + } + + builder.AddInMemoryCollection(new Dictionary { { DiagnosticsMonitor.NamespaceName, namespaceName }, { DiagnosticsMonitor.NodeName, hostName } }); + + } + } +} diff --git a/src/Tools/dotnet-monitor/Program.cs b/src/Tools/dotnet-monitor/Program.cs new file mode 100644 index 0000000000..7977cd7454 --- /dev/null +++ b/src/Tools/dotnet-monitor/Program.cs @@ -0,0 +1,93 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Internal.Common.Commands; +using Microsoft.Tools.Common; +using System; +using System.Collections.Generic; +using System.CommandLine; +using System.CommandLine.Builder; +using System.CommandLine.Invocation; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Diagnostics.Tools.Monitor +{ + [Flags] + internal enum SinkType + { + None = 0, + Console = 1, + LogAnalytics = 2, + All = 0xff + } + + class Program + { + private static Command CollectCommand() => + new Command( + name: "collect", + description: "Monitor logs and metrics in a .NET application send the results to a chosen destination.") + { + // Handler + CommandHandler.Create, IEnumerable>(new DiagnosticsMonitorCommandHandler().Start), + // Arguments and Options + ProcessIdOption(), RefreshIntervalOption(), SinkOption(), JsonConfigOption(), FileConfigOption() + }; + + private static Option ProcessIdOption() => + new Option( + aliases: new[] { "-p", "--process-id" }, + description: "The process id that will be monitored.") + { + Argument = new Argument(name: "processId") + }; + + private static Option RefreshIntervalOption() => + new Option( + alias: "--refresh-interval", + description: "The number of seconds to delay between updating the counters.") + { + Argument = new Argument(name: "refreshInterval", defaultValue: 10) + }; + + private static Option SinkOption() => + new Option( + alias: "--sink", + description: "Where to send the data") + { + Argument = new Argument(name: "sink", defaultValue: SinkType.Console) + }; + + private static Option JsonConfigOption() => + new Option( + alias: "--json-configs", + description: "Additonal configuration") + { + Argument = new Argument>(name: "jsonConfigs"), + Required = false, + }; + + private static Option FileConfigOption() => + new Option( + alias: "--keyfile-configs", + description: "Additonal configuration") + { + Argument = new Argument>(name: "keyFileConfigs"), + Required = false + }; + + + public static Task Main(string[] args) + { + var parser = new CommandLineBuilder() + .AddCommand(CollectCommand()) + .AddCommand(ProcessStatusCommandHandler.ProcessStatusCommand("Lists the dotnet processes that can be monitored")) + .UseDefaults() + .Build(); + return parser.InvokeAsync(args); + } + } +} diff --git a/src/Tools/dotnet-monitor/dotnet-monitor.csproj b/src/Tools/dotnet-monitor/dotnet-monitor.csproj new file mode 100644 index 0000000000..99d9b65fd0 --- /dev/null +++ b/src/Tools/dotnet-monitor/dotnet-monitor.csproj @@ -0,0 +1,29 @@ + + + + netcoreapp2.1 + Microsoft.Diagnostics.Tools.Monitor + dotnet-monitor + .NET Core Diagnostic Monitoring Tool + Diagnostic + $(Description) + + + + + + + + + + + + + + + + + + + + diff --git a/src/Tools/dotnet-monitor/runtimeconfig.template.json b/src/Tools/dotnet-monitor/runtimeconfig.template.json new file mode 100644 index 0000000000..f022b7ffce --- /dev/null +++ b/src/Tools/dotnet-monitor/runtimeconfig.template.json @@ -0,0 +1,3 @@ +{ + "rollForwardOnNoCandidateFx": 2 +} \ No newline at end of file From 38dea469f4f414f4642ffa19e2d9b60187e50e48 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Tue, 10 Mar 2020 15:55:10 +0100 Subject: [PATCH 162/243] bump trace event version to be able to use new file format --- eng/Versions.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/Versions.props b/eng/Versions.props index ef0c8ac9e3..d1bf29335c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -34,7 +34,7 @@ 1.0.55801 1.1.61812 1.7.0 - 2.0.44 + 2.0.50 0.3.0-alpha.19602.1 0.3.0-alpha.19602.1 4.5.3 From 74d3bbc75fdb95ed4cb017322a89db473b77216c Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Tue, 10 Mar 2020 16:04:40 +0100 Subject: [PATCH 163/243] handle the new file format --- .../dotnet-trace/TraceFileFormatConverter.cs | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/Tools/dotnet-trace/TraceFileFormatConverter.cs b/src/Tools/dotnet-trace/TraceFileFormatConverter.cs index 6b4d13451a..58017d5622 100644 --- a/src/Tools/dotnet-trace/TraceFileFormatConverter.cs +++ b/src/Tools/dotnet-trace/TraceFileFormatConverter.cs @@ -13,13 +13,14 @@ namespace Microsoft.Diagnostics.Tools.Trace { - internal enum TraceFileFormat { NetTrace, Speedscope }; + internal enum TraceFileFormat { NetTrace, Speedscope, Chromium }; internal static class TraceFileFormatConverter { - private static Dictionary TraceFileFormatExtensions = new Dictionary() { + private static IReadOnlyDictionary TraceFileFormatExtensions = new Dictionary() { { TraceFileFormat.NetTrace, "nettrace" }, - { TraceFileFormat.Speedscope, "speedscope.json" } + { TraceFileFormat.Speedscope, "speedscope.json" }, + { TraceFileFormat.Chromium, "chromium.json" } }; public static void ConvertToFormat(TraceFileFormat format, string fileToConvert, string outputFilename = "") @@ -35,9 +36,10 @@ public static void ConvertToFormat(TraceFileFormat format, string fileToConvert, case TraceFileFormat.NetTrace: break; case TraceFileFormat.Speedscope: + case TraceFileFormat.Chromium: try { - ConvertToSpeedscope(fileToConvert, outputFilename); + Convert(format, fileToConvert, outputFilename); } // TODO: On a broken/truncated trace, the exception we get from TraceEvent is a plain System.Exception type because it gets caught and rethrown inside TraceEvent. // We should probably modify TraceEvent to throw a better exception. @@ -46,7 +48,7 @@ public static void ConvertToFormat(TraceFileFormat format, string fileToConvert, if (ex.ToString().Contains("Read past end of stream.")) { Console.WriteLine("Detected a potentially broken trace. Continuing with best-efforts to convert the trace, but resulting speedscope file may contain broken stacks as a result."); - ConvertToSpeedscope(fileToConvert, outputFilename, true); + Convert(format, fileToConvert, outputFilename, true); } else { @@ -61,10 +63,10 @@ public static void ConvertToFormat(TraceFileFormat format, string fileToConvert, Console.Out.WriteLine("Conversion complete"); } - private static void ConvertToSpeedscope(string fileToConvert, string outputFilename, bool continueOnError=false) + private static void Convert(TraceFileFormat format, string fileToConvert, string outputFilename, bool continueOnError=false) { var etlxFilePath = TraceLog.CreateFromEventPipeDataFile(fileToConvert, null, new TraceLogOptions() { ContinueOnError = continueOnError } ); - using (var symbolReader = new SymbolReader(System.IO.TextWriter.Null) { SymbolPath = SymbolPath.MicrosoftSymbolServerPath }) + using (var symbolReader = new SymbolReader(TextWriter.Null) { SymbolPath = SymbolPath.MicrosoftSymbolServerPath }) using (var eventLog = new TraceLog(etlxFilePath)) { var stackSource = new MutableTraceEventStackSource(eventLog) @@ -78,14 +80,24 @@ private static void ConvertToSpeedscope(string fileToConvert, string outputFilen }; computer.GenerateThreadTimeStacks(stackSource); - SpeedScopeStackSourceWriter.WriteStackViewAsJson(stackSource, outputFilename); + switch (format) + { + case TraceFileFormat.Speedscope: + SpeedScopeStackSourceWriter.WriteStackViewAsJson(stackSource, outputFilename); + break; + case TraceFileFormat.Chromium: + ChromiumStackSourceWriter.WriteStackViewAsJson(stackSource, outputFilename, compress: false); + break; + default: + // we should never get here + throw new ArgumentException($"Invalid TraceFileFormat \"{format}\""); + } } if (File.Exists(etlxFilePath)) { File.Delete(etlxFilePath); } - } } } From d0991e19be955ef04d5be7960640ff55f6cfc204 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2020 10:44:58 -0700 Subject: [PATCH 164/243] [master] Update dependencies from dotnet/runtime (#876) * Update dependencies from https://github.com/dotnet/runtime build 20200304.1 - Microsoft.NETCore.App - 5.0.0-preview.2.20154.1 * Update dependencies from https://github.com/dotnet/runtime build 20200305.1 - Microsoft.NETCore.App - 5.0.0-preview.2.20155.1 * Update dependencies from https://github.com/dotnet/runtime build 20200305.3 - Microsoft.NETCore.App - 5.0.0-preview.2.20155.3 * Update dependencies from https://github.com/dotnet/runtime build 20200309.13 - Microsoft.NETCore.App - 5.0.0-preview.3.20159.13 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index bf08e83f79..a73714329d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -14,9 +14,9 @@ https://github.com/dotnet/arcade 527179abfbb5cd738035c4ac2d2566c571ce85db - + https://github.com/dotnet/runtime - b3f81350c856cfd5079c52349024a8f55d0c009a + 13e7f19e3d5f18b5408dbd90841cc283595bc89d https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index ef0c8ac9e3..18612dcd77 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -16,7 +16,7 @@ 3.1.0 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.2.20152.11 + 5.0.0-preview.3.20159.13 5.0.0-preview.2.20155.1 From ee8ed8048c825db6af021dc794e3ecc0d649df03 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2020 10:45:37 -0700 Subject: [PATCH 165/243] [master] Update dependencies from dotnet/aspnetcore (#886) * Update dependencies from https://github.com/dotnet/aspnetcore build 20200306.9 - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20156.9 * Update dependencies from https://github.com/dotnet/aspnetcore build 20200307.4 - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20157.4 * Update dependencies from https://github.com/dotnet/aspnetcore build 20200308.5 - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20158.5 * Update dependencies from https://github.com/dotnet/aspnetcore build 20200309.15 - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20159.15 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a73714329d..e22dad1dd4 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime 13e7f19e3d5f18b5408dbd90841cc283595bc89d - + https://github.com/dotnet/aspnetcore - 118ff3c40b2aae9e414011d4d4496b77b3f83021 + bc6bc2d22c42369627b5941e7c1dd98c4c8ad20a diff --git a/eng/Versions.props b/eng/Versions.props index 18612dcd77..4f998570ed 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-preview.3.20159.13 - 5.0.0-preview.2.20155.1 + 5.0.0-preview.3.20159.15 From a5125e47125d59e6474ff3af455b443843930d16 Mon Sep 17 00:00:00 2001 From: Juan Hoyos Date: Tue, 10 Mar 2020 11:36:16 -0700 Subject: [PATCH 166/243] Fix several issues in build and publishing (#889) * Make packages explicitly Shipping/Non-Shipping * Work around SDK bug that trips sourcelink validation * Cleanup properies in publishing These properties used to be needed, but they have been removed in arcade. The new workflow is to use pipeline publishing which this repo uses. * Make publishing explicit for test products that need it This will save us from hardcoding paths by making it more explicit. That way when we clean up and decouple builds we can have breaks when needed. It also brings down artifact size from 318 MB to 206 for xcopy tests needed for helix. * Correctly bubble up native build issues. --- diagnostics.yml | 18 +++++++++-- eng/Build-Native.cmd | 32 +++++++++++++------ eng/common-variables.yml | 32 ------------------- src/Directory.Build.targets | 14 ++++++-- ...Microsoft.Diagnostics.DebugServices.csproj | 2 +- ...icrosoft.Diagnostics.NETCore.Client.csproj | 2 +- .../Microsoft.Diagnostics.Repl.csproj | 2 +- .../Microsoft.Diagnostics.TestHelpers.csproj | 2 +- src/SOS/SOS.NETCore/SOS.NETCore.csproj | 3 +- src/SOS/SOS.Package/SOS.Package.csproj | 1 + .../Windows/Debugger.Tests.Config.txt | 2 +- src/SOS/SOS.UnitTests/SOS.UnitTests.csproj | 1 + src/Tools/Directory.Build.props | 1 + src/Tools/dotnet-dump/dotnet-dump.csproj | 1 + 14 files changed, 61 insertions(+), 52 deletions(-) delete mode 100644 eng/common-variables.yml diff --git a/diagnostics.yml b/diagnostics.yml index deb3d84a4b..8fe76a879f 100644 --- a/diagnostics.yml +++ b/diagnostics.yml @@ -13,7 +13,21 @@ pr: - LICENSE.TXT variables: -- template: /eng/common-variables.yml + - name: _TeamName + value: DotNetCore + - name: _InternalBuildArgs + value: '' + + - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - name: _SignType + value: real + # DotNet-Diagnostics-SDL-Params provides Tsa* variables for SDL checks. + - group: DotNet-Diagnostics-SDL-Params + - name: _InternalBuildArgs + value: /p:DotNetSignType=$(_SignType) + /p:TeamName=$(_TeamName) + /p:DotNetPublishUsingPipelines=$(PublishPackages) + /p:OfficialBuildId=$(BUILD.BUILDNUMBER) stages: - stage: build @@ -248,7 +262,7 @@ stages: - template: /eng/common/templates/job/job.yml parameters: name: Sign_Package_Publish - displayName: Sign, Package, and Publish to BAR + displayName: Sign, Package, and Generate BAR Manifests dependsOn: - Windows - CentOS_7 diff --git a/eng/Build-Native.cmd b/eng/Build-Native.cmd index 8ab3931944..3389991565 100644 --- a/eng/Build-Native.cmd +++ b/eng/Build-Native.cmd @@ -10,7 +10,7 @@ set __ThisScriptFull="%~f0" set __ThisScriptDir="%~dp0" call "%__ThisScriptDir%"\setup-vs-tools.cmd -if NOT '%ERRORLEVEL%' == '0' exit /b 1 +if NOT '%ERRORLEVEL%' == '0' goto ExitWithError if defined VS160COMNTOOLS ( set "__VSToolsRoot=%VS160COMNTOOLS%" @@ -150,7 +150,7 @@ REM ============================================================================ set __DotNetCli=%__ProjectDir%\.dotnet\dotnet.exe if not exist "%__DotNetCli%" ( echo %__MsgPrefix%Assertion failed: dotnet cli not found at path "%__DotNetCli%" - exit /b 1 + goto ExitWithError ) REM ========================================================================================= @@ -180,7 +180,7 @@ if /i %__BuildCrossArch% EQU 1 ( powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -File "%__ProjectDir%\eng\common\msbuild.ps1" "%__ProjectDir%\eng\CreateVersionFile.csproj" /bl:!__GenerateVersionLog! /t:GenerateVersionFiles /restore /p:FileVersionFile=%__RootBinDir%\bin\FileVersion.txt /p:GenerateVersionHeader=true /p:NativeVersionHeaderFile=%__CrossCompIntermediatesDir%\_version.h %__CommonBuildArgs% if not !errorlevel! == 0 ( echo Generate Version Header FAILED - exit /b 1 + goto ExitWithError ) if defined __SkipConfigure goto SkipConfigureCrossBuild @@ -199,7 +199,7 @@ if /i %__BuildCrossArch% EQU 1 ( :SkipConfigureCrossBuild if not exist "%__CrossCompIntermediatesDir%\install.vcxproj" ( echo %__MsgPrefix%Error: failed to generate cross-arch components build project! - exit /b 1 + goto ExitWithError ) if defined __ConfigureOnly goto SkipCrossCompBuild @@ -211,7 +211,7 @@ if /i %__BuildCrossArch% EQU 1 ( if not !ERRORLEVEL! == 0 ( echo %__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details: echo !__BuildLog! - exit /b 1 + goto ExitWithError ) :SkipCrossCompBuild @@ -250,7 +250,7 @@ if %__Build% EQU 1 ( if not defined VSINSTALLDIR ( echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined. - exit /b 1 + goto ExitWithError ) echo Generating Version Header @@ -258,7 +258,7 @@ if %__Build% EQU 1 ( powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -File "%__ProjectDir%\eng\common\msbuild.ps1" "%__ProjectDir%\eng\CreateVersionFile.csproj" /bl:!__GenerateVersionLog! /t:GenerateVersionFiles /restore /p:FileVersionFile=%__RootBinDir%\bin\FileVersion.txt /p:GenerateVersionHeader=true /p:NativeVersionHeaderFile=%__IntermediatesDir%\_version.h %__CommonBuildArgs% if not !errorlevel! == 0 ( echo Generate Version Header FAILED - exit /b 1 + goto ExitWithError ) if defined __SkipConfigure goto SkipConfigure @@ -278,7 +278,7 @@ if %__Build% EQU 1 ( if not exist "%__IntermediatesDir%\install.vcxproj" ( echo %__MsgPrefix%Error: failed to generate native component build project! - exit /b 1 + goto ExitWithError ) set __BuildLog="%__LogDir%\Native.Build.binlog" @@ -288,7 +288,7 @@ if %__Build% EQU 1 ( if not !ERRORLEVEL! == 0 ( echo %__MsgPrefix%Error: native component build failed. Refer to the build log files for details: echo !__BuildLog! - exit /b 1 + goto ExitWithError ) :SkipNativeBuild @@ -314,6 +314,18 @@ echo %__MsgPrefix%Product binaries are available at !__BinDir! exit /b 0 +REM ========================================================================================= +REM === These two routines are intended for the exit code to propagate to the parent process +REM === Like MSBuild or Powershell. If we directly goto ExitWithError from within a if statement in +REM === any of the routines, the exit code is not propagated due to quirks of nested conditonals +REM === in delayed expansion scripts. +REM ========================================================================================= +:ExitWithError +exit /b 1 + +:ExitWithCode +exit /b !__exitCode! + REM ========================================================================================= REM === REM === Helper routines @@ -333,4 +345,4 @@ echo.-? -h -help --help: view this message. echo -architecture echo -configuration echo -verbosity -exit /b 1 +goto ExitWithError diff --git a/eng/common-variables.yml b/eng/common-variables.yml deleted file mode 100644 index c98bd86fee..0000000000 --- a/eng/common-variables.yml +++ /dev/null @@ -1,32 +0,0 @@ - -variables: - - name: _TeamName - value: DotNetCore - - name: _DotNetArtifactsCategory - value: .NETCore - - name: _InternalBuildArgs - value: '' - - - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - - name: _SignType - value: real - - name: _PublishBlobFeedUrl - value: https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json - # DotNet-Blob-Feed provides: dotnetfeed-storage-access-key-1 - # DotNet-Diagnostics-SDL-Params provides Tsa* variables for SDL checks. - # DotNet-Symbol-Server-Pats provides: provides microsoft-symbol-server-pat and symweb-symbol-server-pat - # Publish-Build-Assets provides: MaestroAccessToken, BotAccount-dotnet-maestro-bot-PAT - - group: DotNet-Blob-Feed - - group: DotNet-Diagnostics-SDL-Params - - group: DotNet-Symbol-Server-Pats - - group: Publish-Build-Assets - - name: _InternalBuildArgs - value: /p:DotNetSignType=$(_SignType) /p:TeamName=$(_TeamName) - /p:DotNetArtifactsCategory=$(_DotNetArtifactsCategory) - /p:DotNetPublishBlobFeedKey=$(dotnetfeed-storage-access-key-1) - /p:DotNetPublishBlobFeedUrl=$(_PublishBlobFeedUrl) - /p:DotNetPublishToBlobFeed=$(PublishPackages) - /p:DotNetPublishUsingPipelines=$(PublishPackages) - /p:DotNetSymbolServerTokenMsdl=$(microsoft-symbol-server-pat) - /p:DotNetSymbolServerTokenSymWeb=$(symweb-symbol-server-pat) - /p:OfficialBuildId=$(BUILD.BUILDNUMBER) \ No newline at end of file diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index 1d48a1ff57..ffe4d76752 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -1,10 +1,20 @@ + + + + $([System.IO.Path]::Combine('$(IntermediateOutputPath)','$(TargetFrameworkMoniker).AssemblyAttributes$(DefaultLanguageSourceExtension)')) + + + + - + diff --git a/src/Microsoft.Diagnostics.DebugServices/Microsoft.Diagnostics.DebugServices.csproj b/src/Microsoft.Diagnostics.DebugServices/Microsoft.Diagnostics.DebugServices.csproj index 49aedc5efb..1ae1f70ac3 100644 --- a/src/Microsoft.Diagnostics.DebugServices/Microsoft.Diagnostics.DebugServices.csproj +++ b/src/Microsoft.Diagnostics.DebugServices/Microsoft.Diagnostics.DebugServices.csproj @@ -10,7 +10,7 @@ $(Description) true true - true + false diff --git a/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj b/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj index 7e530dc181..b9fb1b55e0 100644 --- a/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj +++ b/src/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.csproj @@ -10,6 +10,6 @@ $(Description) true true - true + true diff --git a/src/Microsoft.Diagnostics.Repl/Microsoft.Diagnostics.Repl.csproj b/src/Microsoft.Diagnostics.Repl/Microsoft.Diagnostics.Repl.csproj index e89e6cc018..bed51100c8 100644 --- a/src/Microsoft.Diagnostics.Repl/Microsoft.Diagnostics.Repl.csproj +++ b/src/Microsoft.Diagnostics.Repl/Microsoft.Diagnostics.Repl.csproj @@ -10,7 +10,7 @@ $(Description) true true - true + false diff --git a/src/Microsoft.Diagnostics.TestHelpers/Microsoft.Diagnostics.TestHelpers.csproj b/src/Microsoft.Diagnostics.TestHelpers/Microsoft.Diagnostics.TestHelpers.csproj index bea8108428..5d265b47fa 100644 --- a/src/Microsoft.Diagnostics.TestHelpers/Microsoft.Diagnostics.TestHelpers.csproj +++ b/src/Microsoft.Diagnostics.TestHelpers/Microsoft.Diagnostics.TestHelpers.csproj @@ -9,7 +9,7 @@ $(Description) tests true - true + false diff --git a/src/SOS/SOS.NETCore/SOS.NETCore.csproj b/src/SOS/SOS.NETCore/SOS.NETCore.csproj index d4487ca8a5..90f326bd72 100644 --- a/src/SOS/SOS.NETCore/SOS.NETCore.csproj +++ b/src/SOS/SOS.NETCore/SOS.NETCore.csproj @@ -3,10 +3,11 @@ netstandard2.0 SOS.NETCore + true true ;1591;1701 .NET Core SOS - true + false diff --git a/src/SOS/SOS.Package/SOS.Package.csproj b/src/SOS/SOS.Package/SOS.Package.csproj index d429cbbbe7..cf28fc298a 100644 --- a/src/SOS/SOS.Package/SOS.Package.csproj +++ b/src/SOS/SOS.Package/SOS.Package.csproj @@ -12,6 +12,7 @@ tools $(ArtifactsPackagesDir)\GalleryManifest.xml GenerateGalleryZip;GenerateSymbolsZip + false diff --git a/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt b/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt index 3ee2b5eded..e708ee7f3e 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt +++ b/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt @@ -118,7 +118,7 @@ diff --git a/src/SOS/SOS.UnitTests/SOS.UnitTests.csproj b/src/SOS/SOS.UnitTests/SOS.UnitTests.csproj index 5443f467eb..1474a15f87 100644 --- a/src/SOS/SOS.UnitTests/SOS.UnitTests.csproj +++ b/src/SOS/SOS.UnitTests/SOS.UnitTests.csproj @@ -8,6 +8,7 @@ false ;1591;1701 $(DefineConstants);CORE_CLR + true diff --git a/src/Tools/Directory.Build.props b/src/Tools/Directory.Build.props index 6ca593a9f2..0ddd89abc2 100644 --- a/src/Tools/Directory.Build.props +++ b/src/Tools/Directory.Build.props @@ -9,5 +9,6 @@ win-x64;win-x86;win-arm;osx-x64 $(OutputPath) false + true diff --git a/src/Tools/dotnet-dump/dotnet-dump.csproj b/src/Tools/dotnet-dump/dotnet-dump.csproj index 831bca3e4a..d8e22ed8cb 100644 --- a/src/Tools/dotnet-dump/dotnet-dump.csproj +++ b/src/Tools/dotnet-dump/dotnet-dump.csproj @@ -8,6 +8,7 @@ Microsoft.Diagnostic.Tools.Dump Diagnostic dump collect and analyze tool Diagnostic + true $(Description) tools/$(TargetFramework)/any From 8ca1ee4b4313622f65dd979d801949fc10186530 Mon Sep 17 00:00:00 2001 From: Wiktor Kopec Date: Tue, 10 Mar 2020 13:23:01 -0700 Subject: [PATCH 167/243] Change dotnet-monitor tool to non-shipping temporarily (#891) --- eng/Versions.props | 8 ++++++++ .../Microsoft.Diagnostics.Monitoring.LogAnalytics.csproj | 8 ++++---- .../Microsoft.Diagnostics.Monitoring.csproj | 8 ++++---- src/Tools/dotnet-monitor/dotnet-monitor.csproj | 7 ++++--- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index 4f998570ed..ec24124148 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,9 +35,17 @@ 1.1.61812 1.7.0 2.0.44 + + 3.1.2 + 3.1.2 + 3.1.2 + 3.1.2 + 0.3.0-alpha.19602.1 0.3.0-alpha.19602.1 4.5.3 + 4.7.1 + 4.7.0 2.4.1 2.0.3 5.0.0-beta.20158.2 diff --git a/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/Microsoft.Diagnostics.Monitoring.LogAnalytics.csproj b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/Microsoft.Diagnostics.Monitoring.LogAnalytics.csproj index baaeb84aa8..9165365057 100644 --- a/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/Microsoft.Diagnostics.Monitoring.LogAnalytics.csproj +++ b/src/Microsoft.Diagnostics.Monitoring.LogAnalytics/Microsoft.Diagnostics.Monitoring.LogAnalytics.csproj @@ -4,17 +4,17 @@ netstandard2.0 ;1591;1701 Log Analytics Sink for dotnet monitoring - true + false Diagnostic $(Description) false true - true + false - - + + diff --git a/src/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.csproj b/src/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.csproj index 4df6b32f6f..ee441c36a4 100644 --- a/src/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.csproj +++ b/src/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.csproj @@ -4,18 +4,18 @@ netstandard2.0 ;1591;1701 Monitoring for dotnet - true + false Diagnostic $(Description) false true - true + false - - + + diff --git a/src/Tools/dotnet-monitor/dotnet-monitor.csproj b/src/Tools/dotnet-monitor/dotnet-monitor.csproj index 99d9b65fd0..b31670b72c 100644 --- a/src/Tools/dotnet-monitor/dotnet-monitor.csproj +++ b/src/Tools/dotnet-monitor/dotnet-monitor.csproj @@ -6,13 +6,14 @@ dotnet-monitor .NET Core Diagnostic Monitoring Tool Diagnostic + false $(Description) - - - + + + From 59985fd16963e544a1d577a5630a2119004ad3ca Mon Sep 17 00:00:00 2001 From: Juan Hoyos Date: Tue, 10 Mar 2020 15:42:46 -0700 Subject: [PATCH 168/243] Revert "[master] Update dependencies from dotnet/aspnetcore (#886)" (#897) This reverts commit ee8ed8048c825db6af021dc794e3ecc0d649df03. This version of the AspNetCore runtime still works against a busted version of the runtime. --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e22dad1dd4..a73714329d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/runtime 13e7f19e3d5f18b5408dbd90841cc283595bc89d - + https://github.com/dotnet/aspnetcore - bc6bc2d22c42369627b5941e7c1dd98c4c8ad20a + 118ff3c40b2aae9e414011d4d4496b77b3f83021 diff --git a/eng/Versions.props b/eng/Versions.props index ec24124148..d4828323e5 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 5.0.0-preview.3.20159.13 - 5.0.0-preview.3.20159.15 + 5.0.0-preview.2.20155.1 From b05c095a57ad5ce76b6d6e022f0c2738ef980ebd Mon Sep 17 00:00:00 2001 From: Juan Hoyos Date: Tue, 10 Mar 2020 16:19:35 -0700 Subject: [PATCH 169/243] Add darc dependency to symstore (#898) * Update versions of older runtimes to test * Add symstore dependency for automated dependency flow --- eng/Version.Details.xml | 4 ++++ eng/Versions.props | 11 +++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a73714329d..003b3c0154 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -8,6 +8,10 @@ https://github.com/dotnet/arcade 527179abfbb5cd738035c4ac2d2566c571ce85db + + https://github.com/dotnet/symstore + 16544a43620dfc9d06a907fc1c8970b7f3b671cb + diff --git a/eng/Versions.props b/eng/Versions.props index d4828323e5..776109423e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -8,12 +8,14 @@ true + + 1.0.55801 - 2.1.12 + 2.1.16 $(MicrosoftNETCoreApp21Version) - 3.0.1 + 3.0.3 $(MicrosoftNETCoreApp30Version) - 3.1.0 + 3.1.2 $(MicrosoftNETCoreApp31Version) 5.0.0-preview.3.20159.13 @@ -31,16 +33,13 @@ 1.5.0 4.3.0 - 1.0.55801 1.1.61812 1.7.0 2.0.44 - 3.1.2 3.1.2 3.1.2 3.1.2 - 0.3.0-alpha.19602.1 0.3.0-alpha.19602.1 4.5.3 From 008236eb2268f2bc6d5698a45cdce9ad8c01dc31 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2020 02:04:33 +0000 Subject: [PATCH 170/243] Update dependencies from https://github.com/dotnet/arcade build 20200310.4 (#899) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.20160.4 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.20160.4 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 2 +- global.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 003b3c0154..ad8250cd3f 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,9 +4,9 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - 527179abfbb5cd738035c4ac2d2566c571ce85db + 9a9422d109520d942711e07fae8c662c20e7b6e9 https://github.com/dotnet/symstore @@ -14,9 +14,9 @@ - + https://github.com/dotnet/arcade - 527179abfbb5cd738035c4ac2d2566c571ce85db + 9a9422d109520d942711e07fae8c662c20e7b6e9 https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 776109423e..4669405771 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -47,7 +47,7 @@ 4.7.0 2.4.1 2.0.3 - 5.0.0-beta.20158.2 + 5.0.0-beta.20160.4 10.0.18362 diff --git a/global.json b/global.json index 6be4623497..46192f86c1 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "dotnet": "3.1.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20158.2" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20160.4" } } From ee24ddb367a6068cf92f04c414907cb87e926d66 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2020 03:23:25 +0000 Subject: [PATCH 171/243] Update dependencies from https://github.com/dotnet/symstore build 20200309.4 (#900) - Microsoft.SymbolStore - 1.0.115904 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ad8250cd3f..157ae62572 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -8,9 +8,9 @@ https://github.com/dotnet/arcade 9a9422d109520d942711e07fae8c662c20e7b6e9 - + https://github.com/dotnet/symstore - 16544a43620dfc9d06a907fc1c8970b7f3b671cb + 36e4c6d8ef6a5f5dcab4b21b29d307b686e4e7a9 diff --git a/eng/Versions.props b/eng/Versions.props index 4669405771..e7f330892e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -9,7 +9,7 @@ - 1.0.55801 + 1.0.115904 2.1.16 $(MicrosoftNETCoreApp21Version) From 213d6e75c188bac3cdc304edc19298b1bfbb42fc Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Wed, 11 Mar 2020 10:21:21 +0100 Subject: [PATCH 172/243] =?UTF-8?q?install=20latest=20version=20of=20Syste?= =?UTF-8?q?m.Runtime.CompilerServices.Unsafe=20to=20avoid=20"Could=20not?= =?UTF-8?q?=20load=20file=20or=20assembly=E2=80=9D=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Tools/dotnet-trace/dotnet-trace.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Tools/dotnet-trace/dotnet-trace.csproj b/src/Tools/dotnet-trace/dotnet-trace.csproj index 0739bc1ba9..fd7c06ad0c 100644 --- a/src/Tools/dotnet-trace/dotnet-trace.csproj +++ b/src/Tools/dotnet-trace/dotnet-trace.csproj @@ -13,6 +13,7 @@ + From cd4d228a56563a6b863f92f178ba0daf12ab886f Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2020 09:50:32 -0700 Subject: [PATCH 173/243] Update dependencies from https://github.com/dotnet/runtime build 20200310.8 (#901) - Microsoft.NETCore.App - 5.0.0-preview.3.20160.8 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 157ae62572..73e50a122a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 9a9422d109520d942711e07fae8c662c20e7b6e9 - + https://github.com/dotnet/runtime - 13e7f19e3d5f18b5408dbd90841cc283595bc89d + 73268c790b7ff31c98a292efbc583e25562074d7 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index e7f330892e..bd43cffe83 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.3.20159.13 + 5.0.0-preview.3.20160.8 5.0.0-preview.2.20155.1 From 44aa31d79239c1aa8e58626feb4e9ca5aadcdf37 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Wed, 11 Mar 2020 18:53:47 +0100 Subject: [PATCH 174/243] update TraceEvent and revert the workaround --- eng/Versions.props | 2 +- src/Tools/dotnet-trace/dotnet-trace.csproj | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index 2fb361b4a6..285fecbc3c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -35,7 +35,7 @@ 1.1.61812 1.7.0 - 2.0.50 + 2.0.51 3.1.2 3.1.2 3.1.2 diff --git a/src/Tools/dotnet-trace/dotnet-trace.csproj b/src/Tools/dotnet-trace/dotnet-trace.csproj index fd7c06ad0c..0739bc1ba9 100644 --- a/src/Tools/dotnet-trace/dotnet-trace.csproj +++ b/src/Tools/dotnet-trace/dotnet-trace.csproj @@ -13,7 +13,6 @@ - From 79c5b7aa9eab836a2461d82bfc9dae67f4ca67f3 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Thu, 12 Mar 2020 10:21:02 -0700 Subject: [PATCH 175/243] Change the "dotnet-dump collect" default to "full" dumps. (#903) The new "full" dump collection type includes all the module images on both Windows and Linux. The old default type "Heap" is still the same and can be used if the dump is too big. Full dumps are roughly 1.5 times bigger on Windows and 30% bigger on Linux for a simple webapp. Issue: https://github.com/dotnet/diagnostics/issues/808 --- src/Tools/dotnet-dump/Dumper.Windows.cs | 34 +++++++++++++++++++------ src/Tools/dotnet-dump/Dumper.cs | 34 ++++++++++++++++++++++--- src/Tools/dotnet-dump/Program.cs | 8 +++--- 3 files changed, 60 insertions(+), 16 deletions(-) diff --git a/src/Tools/dotnet-dump/Dumper.Windows.cs b/src/Tools/dotnet-dump/Dumper.Windows.cs index 1be0ba1afd..3fcc8f7b4c 100644 --- a/src/Tools/dotnet-dump/Dumper.Windows.cs +++ b/src/Tools/dotnet-dump/Dumper.Windows.cs @@ -24,14 +24,32 @@ internal static Task CollectDumpAsync(Process process, string outputFile, DumpTy using (var stream = new FileStream(outputFile, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) { var exceptionInfo = new NativeMethods.MINIDUMP_EXCEPTION_INFORMATION(); - var dumpType = type == DumpTypeOption.Mini ? NativeMethods.MINIDUMP_TYPE.MiniDumpWithThreadInfo : - NativeMethods.MINIDUMP_TYPE.MiniDumpWithDataSegs | - NativeMethods.MINIDUMP_TYPE.MiniDumpWithPrivateReadWriteMemory | - NativeMethods.MINIDUMP_TYPE.MiniDumpWithHandleData | - NativeMethods.MINIDUMP_TYPE.MiniDumpWithUnloadedModules | - NativeMethods.MINIDUMP_TYPE.MiniDumpWithFullMemoryInfo | - NativeMethods.MINIDUMP_TYPE.MiniDumpWithThreadInfo | - NativeMethods.MINIDUMP_TYPE.MiniDumpWithTokenInformation; + + NativeMethods.MINIDUMP_TYPE dumpType = NativeMethods.MINIDUMP_TYPE.MiniDumpNormal; + switch (type) + { + case DumpTypeOption.Full: + dumpType = NativeMethods.MINIDUMP_TYPE.MiniDumpWithFullMemory | + NativeMethods.MINIDUMP_TYPE.MiniDumpWithDataSegs | + NativeMethods.MINIDUMP_TYPE.MiniDumpWithHandleData | + NativeMethods.MINIDUMP_TYPE.MiniDumpWithUnloadedModules | + NativeMethods.MINIDUMP_TYPE.MiniDumpWithFullMemoryInfo | + NativeMethods.MINIDUMP_TYPE.MiniDumpWithThreadInfo | + NativeMethods.MINIDUMP_TYPE.MiniDumpWithTokenInformation; + break; + case DumpTypeOption.Heap: + dumpType = NativeMethods.MINIDUMP_TYPE.MiniDumpWithPrivateReadWriteMemory | + NativeMethods.MINIDUMP_TYPE.MiniDumpWithDataSegs | + NativeMethods.MINIDUMP_TYPE.MiniDumpWithHandleData | + NativeMethods.MINIDUMP_TYPE.MiniDumpWithUnloadedModules | + NativeMethods.MINIDUMP_TYPE.MiniDumpWithFullMemoryInfo | + NativeMethods.MINIDUMP_TYPE.MiniDumpWithThreadInfo | + NativeMethods.MINIDUMP_TYPE.MiniDumpWithTokenInformation; + break; + case DumpTypeOption.Mini: + dumpType = NativeMethods.MINIDUMP_TYPE.MiniDumpWithThreadInfo; + break; + } // Retry the write dump on ERROR_PARTIAL_COPY for (int i = 0; i < 5; i++) diff --git a/src/Tools/dotnet-dump/Dumper.cs b/src/Tools/dotnet-dump/Dumper.cs index bde84a83d1..99918d0e6d 100644 --- a/src/Tools/dotnet-dump/Dumper.cs +++ b/src/Tools/dotnet-dump/Dumper.cs @@ -20,9 +20,12 @@ public partial class Dumper /// public enum DumpTypeOption { + Full, // The largest dump containing all memory including the module images. + Heap, // A large and relatively comprehensive dump containing module lists, thread lists, all // stacks, exception information, handle information, and all memory except for mapped images. - Mini // A small dump containing module lists, thread lists, exception information and all stacks. + + Mini, // A small dump containing module lists, thread lists, exception information and all stacks. } public Dumper() @@ -49,7 +52,19 @@ public async Task Collect(IConsole console, int processId, string output, b output = Path.GetFullPath(output); // Display the type of dump and dump path - string dumpTypeMessage = type == DumpTypeOption.Mini ? "dump" : "dump with heap"; + string dumpTypeMessage = null; + switch (type) + { + case DumpTypeOption.Full: + dumpTypeMessage = "full"; + break; + case DumpTypeOption.Heap: + dumpTypeMessage = "dump with heap"; + break; + case DumpTypeOption.Mini: + dumpTypeMessage = "dump"; + break; + } console.Out.WriteLine($"Writing {dumpTypeMessage} to {output}"); if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) @@ -62,7 +77,20 @@ public async Task Collect(IConsole console, int processId, string output, b else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { var client = new DiagnosticsClient(processId); - DumpType dumpType = type == DumpTypeOption.Heap ? DumpType.WithHeap : DumpType.Normal; + + DumpType dumpType = DumpType.Normal; + switch (type) + { + case DumpTypeOption.Full: + dumpType = DumpType.Full; + break; + case DumpTypeOption.Heap: + dumpType = DumpType.WithHeap; + break; + case DumpTypeOption.Mini: + dumpType = DumpType.Normal; + break; + } // Send the command to the runtime to initiate the core dump client.WriteDump(dumpType, output, diag); diff --git a/src/Tools/dotnet-dump/Program.cs b/src/Tools/dotnet-dump/Program.cs index 117c73327c..0e36b7e589 100644 --- a/src/Tools/dotnet-dump/Program.cs +++ b/src/Tools/dotnet-dump/Program.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Diagnostics.NETCore.Client; using Microsoft.Internal.Common.Commands; using Microsoft.Tools.Common; using System.CommandLine; @@ -64,11 +63,10 @@ private static Option DiagnosticLoggingOption() => private static Option TypeOption() => new Option( alias: "--type", - description: @"The dump type determines the kinds of information that are collected from the process. There are two types: heap - A large and -relatively comprehensive dump containing module lists, thread lists, all stacks, exception information, handle information, and all memory except for mapped -images. mini - A small dump containing module lists, thread lists, exception information and all stacks. If not specified 'heap' is the default.") + description: @"The dump type determines the kinds of information that are collected from the process. There are several types: full - The largest dump containing all memory including the module images. heap - A large and relatively comprehensive dump containing module lists, thread lists, all stacks, exception information, handle information, and all memory except for mapped +images. mini - A small dump containing module lists, thread lists, exception information and all stacks. If not specified 'full' is the default.") { - Argument = new Argument(name: "dump_type", defaultValue: Dumper.DumpTypeOption.Heap) + Argument = new Argument(name: "dump_type", defaultValue: Dumper.DumpTypeOption.Full) }; private static Command AnalyzeCommand() => From 9f2dae6a7a7496eb8699eb8f2920ae625466af84 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 12 Mar 2020 10:33:32 -0700 Subject: [PATCH 176/243] Update dependencies from https://github.com/dotnet/runtime build 20200311.9 (#904) - Microsoft.NETCore.App - 5.0.0-preview.3.20161.9 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 73e50a122a..4b1f030adb 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 9a9422d109520d942711e07fae8c662c20e7b6e9 - + https://github.com/dotnet/runtime - 73268c790b7ff31c98a292efbc583e25562074d7 + 2b27323e4aa61f540b8c6600f4add5b29860a0a3 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index f793985f53..46991e85ed 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.3.20160.8 + 5.0.0-preview.3.20161.9 5.0.0-preview.2.20155.1 From 18cf5c235864596003fffa46d3b792687a32dc02 Mon Sep 17 00:00:00 2001 From: Juan Hoyos Date: Thu, 12 Mar 2020 14:48:00 -0700 Subject: [PATCH 177/243] Remove checking for python (#906) --- CMakeLists.txt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index df05370f0d..13ea079ef0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,12 +38,6 @@ endif(CORECLR_SET_RPATH) OPTION(CLR_CMAKE_ENABLE_CODE_COVERAGE "Enable code coverage" OFF) OPTION(CLR_CMAKE_WARNINGS_ARE_ERRORS "Warnings are errors" ON) -# Ensure that python is present -find_program(PYTHON NAMES python2.7 python2 python) -if (PYTHON STREQUAL "PYTHON-NOTFOUND") - message(FATAL_ERROR "PYTHON not found: Please install Python 2.7.9 or later from https://www.python.org/downloads/") -endif() - # Ensure other tools are present if (WIN32) if(CLR_CMAKE_HOST_ARCH STREQUAL arm) @@ -635,4 +629,3 @@ include(compileoptions.cmake) # Native Projects #----------------------------------------- add_subdirectory(src) - From c031315a024d5a801122d22fcfc30cf0b242818c Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 14 Mar 2020 18:05:13 +0000 Subject: [PATCH 178/243] Update dependencies from https://github.com/dotnet/symstore build 20200313.2 (#916) - Microsoft.SymbolStore - 1.0.116302 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4b1f030adb..06df150888 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -8,9 +8,9 @@ https://github.com/dotnet/arcade 9a9422d109520d942711e07fae8c662c20e7b6e9 - + https://github.com/dotnet/symstore - 36e4c6d8ef6a5f5dcab4b21b29d307b686e4e7a9 + 4e47b560cb35f0a247af5147e43178b3383d26fd diff --git a/eng/Versions.props b/eng/Versions.props index 46991e85ed..a53a730ae7 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -9,7 +9,7 @@ - 1.0.115904 + 1.0.116302 2.1.16 $(MicrosoftNETCoreApp21Version) From 37411c9d695d1854608504dcf6e6bbeb18f5a82a Mon Sep 17 00:00:00 2001 From: Mike Murkovic Date: Sat, 14 Mar 2020 15:31:53 -0400 Subject: [PATCH 179/243] Update diagnostics-client-library-instructions.md (#917) Missing semicolon. Excited to see this documentation :) --- documentation/diagnostics-client-library-instructions.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/documentation/diagnostics-client-library-instructions.md b/documentation/diagnostics-client-library-instructions.md index baeee40a5c..e403ba6bcc 100644 --- a/documentation/diagnostics-client-library-instructions.md +++ b/documentation/diagnostics-client-library-instructions.md @@ -33,7 +33,8 @@ public void PrintRuntimeGCEvents(int processId) source.Clr.All += (TraceEvent obj) => { Console.WriteLine(obj.EventName); - } + }; + try { source.Process(); From 0d19da59c784b2227bff0ff19136fbe69946a6ed Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Sun, 15 Mar 2020 11:51:37 -0700 Subject: [PATCH 180/243] Add .NET Core hosting location file support (#915) * Add .NET Core hosting location file support Look for the /etc/dotnet/install_location file on Linux/MacOS for the .NET Core runtime to host SOS's managed code. Didn't add the check for Windows registry key at this time because we may switch to the desktop CLR as the host. Issue #https://github.com/dotnet/diagnostics/issues/882 Add 5.0 to the list of hosting runtime versions. * Code review feedback --- src/SOS/Strike/hostcoreclr.cpp | 81 +++++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 26 deletions(-) diff --git a/src/SOS/Strike/hostcoreclr.cpp b/src/SOS/Strike/hostcoreclr.cpp index ea44f8431a..731401a481 100644 --- a/src/SOS/Strike/hostcoreclr.cpp +++ b/src/SOS/Strike/hostcoreclr.cpp @@ -275,13 +275,19 @@ static bool FindDotNetVersion(int majorFilter, int minorFilter, std::string& hos } #ifdef FEATURE_PAL + const char *g_linuxPaths[] = { +#if defined(__APPLE__) + "/usr/local/share/dotnet/shared/Microsoft.NETCore.App" +#else "/rh-dotnet31/root/usr/bin/dotnet/shared/Microsoft.NETCore.App", "/rh-dotnet30/root/usr/bin/dotnet/shared/Microsoft.NETCore.App", "/rh-dotnet21/root/usr/bin/dotnet/shared/Microsoft.NETCore.App", "/usr/share/dotnet/shared/Microsoft.NETCore.App", -}; #endif +}; + +#endif // FEATURE_PAL /**********************************************************************\ * Returns the path to the coreclr to use for hosting and it's @@ -294,22 +300,41 @@ static HRESULT GetHostRuntime(std::string& coreClrPath, std::string& hostRuntime if (g_hostRuntimeDirectory == nullptr) { #ifdef FEATURE_PAL -#if defined(__APPLE__) - hostRuntimeDirectory.assign("/usr/local/share/dotnet/shared/Microsoft.NETCore.App"); -#elif defined (__FreeBSD__) || defined(__NetBSD__) - ExtErr("FreeBSD or NetBSD not supported\n"); +#if defined (__FreeBSD__) || defined(__NetBSD__) + ExtErr("Hosting on FreeBSD or NetBSD not supported\n"); return E_FAIL; #else - // Start with the possible RHEL's locations, then the regular Linux path - for (int i = 0; i < _countof(g_linuxPaths); i++) + char* line = nullptr; + size_t lineLen = 0; + + // Start with Linux location file if exists + FILE* locationFile = fopen("/etc/dotnet/install_location", "r"); + if (locationFile != nullptr) { - hostRuntimeDirectory.assign(g_linuxPaths[i]); - if (access(hostRuntimeDirectory.c_str(), F_OK) == 0) + if (getline(&line, &lineLen, locationFile) != -1) { - break; + hostRuntimeDirectory.assign(line); + size_t newLinePostion = hostRuntimeDirectory.rfind('\n'); + if (newLinePostion != std::string::npos) { + hostRuntimeDirectory.erase(newLinePostion); + hostRuntimeDirectory.append("/shared/Microsoft.NETCore.App"); + } + free(line); } } -#endif + if (hostRuntimeDirectory.empty()) + { + // Now try the possible runtime locations + for (int i = 0; i < _countof(g_linuxPaths); i++) + { + hostRuntimeDirectory.assign(g_linuxPaths[i]); + if (access(hostRuntimeDirectory.c_str(), F_OK) == 0) + { + break; + } + } + } +#endif // defined (__FreeBSD__) || defined(__NetBSD__) #else ArrayHolder programFiles = new CHAR[MAX_LONGPATH]; if (GetEnvironmentVariableA("PROGRAMFILES", programFiles, MAX_LONGPATH) == 0) @@ -319,7 +344,7 @@ static HRESULT GetHostRuntime(std::string& coreClrPath, std::string& hostRuntime } hostRuntimeDirectory.assign(programFiles); hostRuntimeDirectory.append("\\dotnet\\shared\\Microsoft.NETCore.App"); -#endif +#endif // FEATURE_PAL hostRuntimeDirectory.append(DIRECTORY_SEPARATOR_STR_A); // First attempt find the highest 2.1.x version. We want to start with the LTS @@ -335,22 +360,26 @@ static HRESULT GetHostRuntime(std::string& coreClrPath, std::string& hostRuntime // Find highest 3.1.x version if (!FindDotNetVersion(3, 1, hostRuntimeDirectory)) { - HRESULT hr = CheckEEDll(); - if (FAILED(hr)) { - return hr; - } - // Don't use the desktop runtime to host - if (g_pRuntime->IsDesktop()) - { - return E_FAIL; - } - // If an installed runtime can not be found, use the target coreclr version - LPCSTR runtimeDirectory = g_pRuntime->GetRuntimeDirectory(); - if (runtimeDirectory == nullptr) + // Find highest 5.0.x version + if (!FindDotNetVersion(5, 0, hostRuntimeDirectory)) { - return E_FAIL; + HRESULT hr = CheckEEDll(); + if (FAILED(hr)) { + return hr; + } + // Don't use the desktop runtime to host + if (g_pRuntime->IsDesktop()) + { + return E_FAIL; + } + // If an installed runtime can not be found, use the target coreclr version + LPCSTR runtimeDirectory = g_pRuntime->GetRuntimeDirectory(); + if (runtimeDirectory == nullptr) + { + return E_FAIL; + } + hostRuntimeDirectory = runtimeDirectory; } - hostRuntimeDirectory = runtimeDirectory; } } } From 0efc5b874de2114c5314f480df03552ba97a1439 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Sun, 15 Mar 2020 13:25:35 -0700 Subject: [PATCH 181/243] Update to clrmd 1.1.116301 (#918) --- eng/Versions.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/Versions.props b/eng/Versions.props index a53a730ae7..b334a490ad 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -33,7 +33,7 @@ 1.5.0 4.3.0 - 1.1.61812 + 1.1.116301 1.7.0 2.0.51 3.1.2 From 96e572d7cc9e92847c09a2c622350a394866e882 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2020 09:42:48 -0700 Subject: [PATCH 182/243] Update dependencies from https://github.com/dotnet/arcade build 20200312.3 (#919) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.20162.3 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.20162.3 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 2 +- global.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 06df150888..6b793a1057 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,9 +4,9 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - 9a9422d109520d942711e07fae8c662c20e7b6e9 + 16d4350184cf362cd59807b589d1c93803025abc https://github.com/dotnet/symstore @@ -14,9 +14,9 @@ - + https://github.com/dotnet/arcade - 9a9422d109520d942711e07fae8c662c20e7b6e9 + 16d4350184cf362cd59807b589d1c93803025abc https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index b334a490ad..8a025fc4cd 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -47,7 +47,7 @@ 4.7.0 2.4.1 2.0.3 - 5.0.0-beta.20160.4 + 5.0.0-beta.20162.3 10.0.18362 diff --git a/global.json b/global.json index 46192f86c1..8660184328 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "dotnet": "3.1.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20160.4" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20162.3" } } From 0070279545e03136c9373883537262a4f5361512 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2020 12:53:39 +0000 Subject: [PATCH 183/243] Update dependencies from https://github.com/dotnet/symstore build 20200316.1 (#922) - Microsoft.SymbolStore - 1.0.116601 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6b793a1057..d7e8126849 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -8,9 +8,9 @@ https://github.com/dotnet/arcade 16d4350184cf362cd59807b589d1c93803025abc - + https://github.com/dotnet/symstore - 4e47b560cb35f0a247af5147e43178b3383d26fd + 3a38ddf37bbb3bb5c2d73b6fd9a0aabcec5532e8 diff --git a/eng/Versions.props b/eng/Versions.props index 8a025fc4cd..86746a149a 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -9,7 +9,7 @@ - 1.0.116302 + 1.0.116601 2.1.16 $(MicrosoftNETCoreApp21Version) From cedde648c05f516f8f89970184effb7cb92d869d Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Wed, 18 Mar 2020 11:09:15 -0400 Subject: [PATCH 184/243] Fix coreclr paths to match new runtime repo (#923) --- README.md | 2 +- documentation/building/linux-instructions.md | 2 +- documentation/debugging-coredump.md | 2 +- documentation/design-docs/diagnostics-client-library.md | 2 +- documentation/dotnet-dump-instructions.md | 2 +- documentation/privatebuildtesting.md | 2 +- .../tutorial/app_is_leaking_memory_eventual_crash.md | 2 +- eng/clang-compiler-override-arm.txt | 2 +- eng/clang-compiler-override.txt | 2 +- eng/setup-vs-tools.cmd | 2 +- src/inc/gcdecoder.cpp | 4 ++-- src/inc/gcdump.h | 4 ++-- src/inc/gcinfo.h | 4 ++-- src/inc/gcinfodecoder.h | 4 ++-- src/inc/gcinfodumper.h | 4 ++-- src/inc/gcinfotypes.h | 4 ++-- src/inc/stresslog.h | 4 ++-- src/inc/tls.h | 4 ++-- src/tests/eventpipe/README.md | 6 +++--- 19 files changed, 29 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 066162d2f7..0a70ed1196 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This repository contains the source code for various .NET Core runtime diagnosti Another goal to make it easier to obtain a version of lldb (currently 3.9) with scripts and documentation for platforms/distros like Centos, Alpine, Fedora, etc. that by default provide really old versions. -This repo will also allow out of band development of new SOS and lldb plugin features like symbol server support for the .NET Core runtime and solve the source build problem having SOS.NETCore (managed portion of SOS) in the coreclr repo. +This repo will also allow out of band development of new SOS and lldb plugin features like symbol server support for the .NET Core runtime and solve the source build problem having SOS.NETCore (managed portion of SOS) in the runtime repo. See the [GitHub Release tab](https://github.com/dotnet/diagnostics/releases) for notes on SOS and diagnostic tools releases. diff --git a/documentation/building/linux-instructions.md b/documentation/building/linux-instructions.md index f7a05da936..0980c43691 100644 --- a/documentation/building/linux-instructions.md +++ b/documentation/building/linux-instructions.md @@ -8,7 +8,7 @@ Toolchain Setup The following instructions will install the required packages. This only needs to be done once per machine. These instructions assume that you already have "sudo" installed. It is also recommended to create a github fork of the diagnostics repo and cloning that instead of https://github.com/dotnet/diagnostics.git directly. -To build or cross build for ARM on Windows or Linux see the instructions [here](https://github.com/dotnet/coreclr/blob/master/Documentation/building/cross-building.md#generating-the-rootfs) in the coreclr repo. You will need to clone the coreclr [repo](https://github.com/dotnet/coreclr.git) and build the appropriate "rootfs" for arm or arm64 using these instructions. You only need to do this once. +To build or cross build for ARM on Windows or Linux see the instructions [here](https://github.com/dotnet/runtime/blob/master/docs/workflow/building/coreclr/cross-building.md#generating-the-rootfs) in the runtime repo. You will need to clone the runtime [repo](https://github.com/dotnet/runtime.git) and build the appropriate "rootfs" for arm or arm64 using these instructions. You only need to do this once. #### Ubuntu 14.04 #### diff --git a/documentation/debugging-coredump.md b/documentation/debugging-coredump.md index 14b5291aaf..9a310af209 100644 --- a/documentation/debugging-coredump.md +++ b/documentation/debugging-coredump.md @@ -1,7 +1,7 @@ Debugging Linux or MacOS Core Dump ================================== -These instructions will lead you through getting symbols, loading and debugging a Linux or MacOS core dump. The best way to generate a core dump on Linux (only) is through the [createdump](https://github.com/dotnet/coreclr/blob/master/Documentation/botr/xplat-minidump-generation.md#configurationpolicy) facility. +These instructions will lead you through getting symbols, loading and debugging a Linux or MacOS core dump. The best way to generate a core dump on Linux (only) is through the [createdump](https://github.com/dotnet/runtime/blob/master/docs/design/coreclr/botr/xplat-minidump-generation.md#configurationpolicy) facility. Dumps created with gdb or gcore do not have all the managed state so various SOS or dotnet-dump commands may display "UNKNOWN" for type and function names. This can also happen with Linux system generated core dumps if the `coredump_filter` for the process is not set to at least 0x3f. See [core](http://man7.org/linux/man-pages/man5/core.5.html) for more information. diff --git a/documentation/design-docs/diagnostics-client-library.md b/documentation/design-docs/diagnostics-client-library.md index c4de878eb4..9a0c2c81a2 100644 --- a/documentation/design-docs/diagnostics-client-library.md +++ b/documentation/design-docs/diagnostics-client-library.md @@ -3,7 +3,7 @@ ## Intro The Diagnostics Client Library (currently named as "Runtime Client Library") - `Microsoft.Diagnostics.NetCore.Client.dll` - is a managed library that can be used to interact with the .NET runtime via the diagnostics IPC protocol as documented in https://github.com/dotnet/diagnostics/blob/master/documentation/design-docs/ipc-protocol.md. It provides managed classes for invoking the diagnostics IPC commands programmatically, and can be extended to write various diagnostics tools. It also comes with various classes that should facilitate interacting with the diagnostics IPC commands. -The name "Diagnostics Client Library" comes from the fact that we call the runtime (CoreCLR) component responsible for accepting and handling the diagnostics IPC commands the "diagnostics server" - https://github.com/dotnet/coreclr/blob/master/src/vm/diagnosticserver.h. Since this library is a managed library on the other side of the IPC protocol responsible for communicating with the runtime's "diagnostics server", calling this the "Diagnostics Client Library" made sense. +The name "Diagnostics Client Library" comes from the fact that we call the runtime (CoreCLR) component responsible for accepting and handling the diagnostics IPC commands the "diagnostics server" - https://github.com/dotnet/runtime/blob/master/src/coreclr/src/vm/diagnosticserver.h. Since this library is a managed library on the other side of the IPC protocol responsible for communicating with the runtime's "diagnostics server", calling this the "Diagnostics Client Library" made sense. ## Goals diff --git a/documentation/dotnet-dump-instructions.md b/documentation/dotnet-dump-instructions.md index b6b9684317..31d9a6b56f 100644 --- a/documentation/dotnet-dump-instructions.md +++ b/documentation/dotnet-dump-instructions.md @@ -19,7 +19,7 @@ If this is the first global tool installed or you get message `Could not execute ## Using dotnet-dump -The next step is to collect a dump. This can be skipped if a core dump has already been generated by the operating system or [createdump](https://github.com/dotnet/coreclr/blob/master/Documentation/botr/xplat-minidump-generation.md#configurationpolicy) on Linux. +The next step is to collect a dump. This can be skipped if a core dump has already been generated by the operating system or [createdump](https://github.com/dotnet/runtime/blob/master/docs/design/coreclr/botr/xplat-minidump-generation.md#configurationpolicy) on Linux. On Linux, the runtime version must be 3.0 or greater. On Windows, dotnet-dump collect will work with any version of the runtime. diff --git a/documentation/privatebuildtesting.md b/documentation/privatebuildtesting.md index 4a389c4f29..4750c8c232 100644 --- a/documentation/privatebuildtesting.md +++ b/documentation/privatebuildtesting.md @@ -24,7 +24,7 @@ On Linux/MacOS: ``` ~/diagnostics$ ./test.sh --privatebuildpath /home/user/runtime/artifacts/bin/coreclr/Linux.x64.Debug ``` -The private runtime will be copied to the diagnostics repo and the tests started. It can be just the coreclr binaries but this assumes that the private build is close to the latest published master build. If not, you can pass the runtime's testhost directory containing all the shared runtime bits i.e. `c:\runtime\artifacts\bin\testhost\netcoreapp5.0-Windows_NT-Debug-x64\shared\Microsoft.NETCore.App\5.0.0` or `/home/user/runtime/artifacts/bin/testhost/netcoreapp5.0-Linux-Release-x64/shared/Microsoft.NETCore.App/5.0.0` +The private runtime will be copied to the diagnostics repo and the tests started. It can be just the runtime binaries but this assumes that the private build is close to the latest published master build. If not, you can pass the runtime's testhost directory containing all the shared runtime bits i.e. `c:\runtime\artifacts\bin\coreclr\testhost\netcoreapp5.0-Windows_NT-Debug-x64\shared\Microsoft.NETCore.App\5.0.0` or `/home/user/runtime/artifacts/bin/coreclr/testhost/netcoreapp5.0-Linux-Release-x64/shared/Microsoft.NETCore.App/5.0.0` On Linux/MacOS it is recommended to test against Release runtime builds because of a benign assert in DAC (tracked by issue #[31897](https://github.com/dotnet/runtime/issues/31897)) that causes the tests to fail. diff --git a/documentation/tutorial/app_is_leaking_memory_eventual_crash.md b/documentation/tutorial/app_is_leaking_memory_eventual_crash.md index dc4cc43903..138ca0f3bf 100644 --- a/documentation/tutorial/app_is_leaking_memory_eventual_crash.md +++ b/documentation/tutorial/app_is_leaking_memory_eventual_crash.md @@ -56,7 +56,7 @@ Now that we have a core dump generated, what options do we have to analyze the c In both cases, you have to be careful to roughly match the environment up with the production server. For example, if I am running .net core preview 5 on Ubuntu 16.04 the core dump must be analyzed on the same architecture and environment. -For the LLDB/SOS experience, please see - https://github.com/dotnet/coreclr/blob/master/Documentation/building/debugging-instructions.md. +For the LLDB/SOS experience, please see - https://github.com/dotnet/runtime/blob/master/docs/workflow/building/coreclr/debugging-instructions.md. To use the dotnet-dump tool to analyze the dump please run: diff --git a/eng/clang-compiler-override-arm.txt b/eng/clang-compiler-override-arm.txt index da25715ade..5b6f546676 100644 --- a/eng/clang-compiler-override-arm.txt +++ b/eng/clang-compiler-override-arm.txt @@ -2,7 +2,7 @@ SET (CMAKE_C_FLAGS_INIT "-Wall -std=c11") SET (CMAKE_C_FLAGS_DEBUG_INIT "-g -O0") SET (CLR_C_FLAGS_CHECKED_INIT "-g -O1") # Refer to the below instruction to support __thread with -O2/-O3 on Linux/ARM -# https://github.com/dotnet/coreclr/blob/master/Documentation/building/linux-instructions.md +# https://github.com/dotnet/runtime/blob/master/docs/workflow/building/coreclr/linux-instructions.md SET (CMAKE_C_FLAGS_RELEASE_INIT "-g -O1") SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-g -O1") diff --git a/eng/clang-compiler-override.txt b/eng/clang-compiler-override.txt index ee1e63b63b..0a68fba52d 100644 --- a/eng/clang-compiler-override.txt +++ b/eng/clang-compiler-override.txt @@ -2,7 +2,7 @@ SET (CMAKE_C_FLAGS_INIT "-Wall -std=c11") SET (CMAKE_C_FLAGS_DEBUG_INIT "-g -O0") SET (CLR_C_FLAGS_CHECKED_INIT "-g -O2") # Refer to the below instruction to support __thread with -O2/-O3 on Linux/ARM -# https://github.com/dotnet/coreclr/blob/master/Documentation/building/linux-instructions.md +# https://github.com/dotnet/runtime/blob/master/docs/workflow/building/coreclr/linux-instructions.md SET (CMAKE_C_FLAGS_RELEASE_INIT "-g -O3") SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-g -O2") diff --git a/eng/setup-vs-tools.cmd b/eng/setup-vs-tools.cmd index 24e8b230ca..3ad7761fd5 100644 --- a/eng/setup-vs-tools.cmd +++ b/eng/setup-vs-tools.cmd @@ -31,7 +31,7 @@ echo Visual Studio 2017 or later not found :call_vs if not exist "%_VSCOMNTOOLS%" ( echo %__MsgPrefix%Error: Visual Studio 2017 or 2019 required. - echo Please see https://github.com/dotnet/coreclr/blob/master/Documentation/building/windows-instructions.md for build instructions. + echo Please see https://github.com/dotnet/runtime/blob/master/docs/workflow/building/coreclr/windows-instructions.md for build instructions. exit /b 1 ) echo %__MsgPrefix%"%_VSCOMNTOOLS%\VsDevCmd.bat" diff --git a/src/inc/gcdecoder.cpp b/src/inc/gcdecoder.cpp index bcbb5a1231..a9c2af235c 100644 --- a/src/inc/gcdecoder.cpp +++ b/src/inc/gcdecoder.cpp @@ -14,8 +14,8 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ // ****************************************************************************** -// WARNING!!!: This code is also used by the coreclr repo. -// See: https://github.com/dotnet/coreclr/blob/master/src/inc/gcdecoder.cpp +// WARNING!!!: This code is also used by the runtime repo. +// See: https://github.com/dotnet/runtime/blob/master/src/coreclr/src/inc/gcdecoder.cpp // ****************************************************************************** #ifdef _TARGET_X86_ diff --git a/src/inc/gcdump.h b/src/inc/gcdump.h index f8bffe7622..e4092a9c68 100644 --- a/src/inc/gcdump.h +++ b/src/inc/gcdump.h @@ -13,8 +13,8 @@ */ // ****************************************************************************** -// WARNING!!!: This header is also used by the coreclr repo. -// See: https://github.com/dotnet/coreclr/blob/master/src/inc/gcdump.h +// WARNING!!!: This header is also used by the runtime repo. +// See: https://github.com/dotnet/runtime/blob/master/src/coreclr/src/inc/gcdump.h // ****************************************************************************** /*****************************************************************************/ diff --git a/src/inc/gcinfo.h b/src/inc/gcinfo.h index 97ff737117..dff438992c 100644 --- a/src/inc/gcinfo.h +++ b/src/inc/gcinfo.h @@ -4,8 +4,8 @@ // ****************************************************************************** -// WARNING!!!: This header is also used by the coreclr repo. -// See: https://github.com/dotnet/coreclr/blob/master/src/inc/gcinfo.h +// WARNING!!!: This header is also used by the runtime repo. +// See: https://github.com/dotnet/runtime/blob/master/src/coreclr/src/inc/gcinfo.h // ****************************************************************************** /*****************************************************************************/ diff --git a/src/inc/gcinfodecoder.h b/src/inc/gcinfodecoder.h index b2c89d8538..dc7797409d 100644 --- a/src/inc/gcinfodecoder.h +++ b/src/inc/gcinfodecoder.h @@ -9,8 +9,8 @@ *****************************************************************/ // ****************************************************************************** -// WARNING!!!: This header is also used by the coreclr repo. -// See: https://github.com/dotnet/coreclr/blob/master/src/inc/gcinfodecoder.h +// WARNING!!!: This header is also used by the runtime repo. +// See: https://github.com/dotnet/runtime/blob/master/src/coreclr/src/inc/gcinfodecoder.h // ****************************************************************************** #ifndef _GC_INFO_DECODER_ diff --git a/src/inc/gcinfodumper.h b/src/inc/gcinfodumper.h index e3ad734da9..e8b3946a74 100644 --- a/src/inc/gcinfodumper.h +++ b/src/inc/gcinfodumper.h @@ -9,8 +9,8 @@ #include "gcinfodecoder.h" // ****************************************************************************** -// WARNING!!!: This header is also used by the coreclr repo. -// See: https://github.com/dotnet/coreclr/blob/master/src/inc/gcinfodumper.h +// WARNING!!!: This header is also used by the runtime repo. +// See: https://github.com/dotnet/runtime/blob/master/src/coreclr/src/inc/gcinfodumper.h // ****************************************************************************** // diff --git a/src/inc/gcinfotypes.h b/src/inc/gcinfotypes.h index 4a1992a7c9..3fc0f455a5 100644 --- a/src/inc/gcinfotypes.h +++ b/src/inc/gcinfotypes.h @@ -11,8 +11,8 @@ #endif // ****************************************************************************** -// WARNING!!!: This header is also used by the coreclr repo. -// See: https://github.com/dotnet/coreclr/blob/master/src/inc/gcinfotypes.h +// WARNING!!!: This header is also used by the runtime repo. +// See: https://github.com/dotnet/runtime/blob/master/src/coreclr/src/inc/gcinfotypes.h // ****************************************************************************** #define PARTIALLY_INTERRUPTIBLE_GC_SUPPORTED diff --git a/src/inc/stresslog.h b/src/inc/stresslog.h index 9ebb354ee2..4ced657a73 100644 --- a/src/inc/stresslog.h +++ b/src/inc/stresslog.h @@ -18,8 +18,8 @@ extention (eg. strike). There is no memory allocation system calls etc to purtub things */ // ****************************************************************************** -// WARNING!!!: This header is also used by the coreclr repo. -// See: https://github.com/dotnet/coreclr/blob/master/src/inc/stresslog.h +// WARNING!!!: This header is also used by the runtime repo. +// See: https://github.com/dotnet/runtime/blob/master/src/coreclr/src/inc/stresslog.h // Parser: https://github.com/dotnet/diagnostics/blob/master/src/SOS/Strike/stressLogDump.cpp // ****************************************************************************** diff --git a/src/inc/tls.h b/src/inc/tls.h index c5858845a2..1079b69a4d 100644 --- a/src/inc/tls.h +++ b/src/inc/tls.h @@ -9,8 +9,8 @@ // // ****************************************************************************** -// WARNING!!!: This header is also used by the coreclr repo. -// See: https://github.com/dotnet/coreclr/blob/master/src/inc/tls.h +// WARNING!!!: This header is also used by the runtime repo. +// See: https://github.com/dotnet/runtime/blob/master/src/coreclr/src/inc/tls.h // ****************************************************************************** #ifndef __tls_h__ diff --git a/src/tests/eventpipe/README.md b/src/tests/eventpipe/README.md index 335d4dafc3..11e127bba4 100644 --- a/src/tests/eventpipe/README.md +++ b/src/tests/eventpipe/README.md @@ -4,9 +4,9 @@ This directory contains the dotnet/diagnostics end of testing for EventPipe and | completed | functionality | location | | --------- | ---------------- | -------- | -| ✅ | IPC protocol | dotnet/coreclr | -| ✅ | EventPipe Provider Enable/Disable | dotnet/coreclr | -| ✅ | EventPipe Event-Provider coherence | dotnet/coreclr | +| ✅ | IPC protocol | dotnet/runtime/src/coreclr | +| ✅ | EventPipe Provider Enable/Disable | dotnet/runtime/src/coreclr | +| ✅ | EventPipe Event-Provider coherence | dotnet/runtime/src/coreclr | | ✅ | `dotnet trace` provider parsing | dotnet/diagnostics | | ✅ | `dotnet trace` provider-profile merging | dotnet/diagnostics | From 877e11bd7fc1f536710621c4dfd92d8dfd6c206c Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Wed, 18 Mar 2020 15:01:38 -0400 Subject: [PATCH 185/243] [dotnet-dump] Allow Linux core dumps to be loaded on WIndows (#927) * [dotnet-dump] Allow Linux core dumps to be loaded on WIndows * Respond to feedback --- src/Tools/dotnet-dump/Analyzer.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Tools/dotnet-dump/Analyzer.cs b/src/Tools/dotnet-dump/Analyzer.cs index 339901db54..500cfb965b 100644 --- a/src/Tools/dotnet-dump/Analyzer.cs +++ b/src/Tools/dotnet-dump/Analyzer.cs @@ -56,7 +56,19 @@ public async Task Analyze(FileInfo dump_path, string[] command) target = DataTarget.LoadCoreDump(dump_path.FullName); } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { - target = DataTarget.LoadCrashDump(dump_path.FullName, CrashDumpReader.ClrMD); + try + { + target = DataTarget.LoadCoreDump(dump_path.FullName); + } + catch (InvalidDataException) + { + // This condition occurs when we try to load a Windows dump as a Elf core dump. + } + + if (target == null) + { + target = DataTarget.LoadCrashDump(dump_path.FullName, CrashDumpReader.ClrMD); + } } else { throw new PlatformNotSupportedException($"Unsupported operating system: {RuntimeInformation.OSDescription}"); From 422684970d7dba46df6ee1f195aecf144876fa9a Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Wed, 18 Mar 2020 16:45:22 -0400 Subject: [PATCH 186/243] Fix dotnet-dump analyze -c exit (#924) * Fix dotnet-dump analyze -c exit The exit command would fail to exit the analyze process when executed from the command line. * Move fix to ConsoleProvider per feedback, simplify --- src/Microsoft.Diagnostics.Repl/Console/ConsoleProvider.cs | 4 +++- src/Tools/dotnet-dump/Analyzer.cs | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.Diagnostics.Repl/Console/ConsoleProvider.cs b/src/Microsoft.Diagnostics.Repl/Console/ConsoleProvider.cs index 2083ec063c..d59f743369 100644 --- a/src/Microsoft.Diagnostics.Repl/Console/ConsoleProvider.cs +++ b/src/Microsoft.Diagnostics.Repl/Console/ConsoleProvider.cs @@ -50,6 +50,7 @@ public ConsoleProvider(ConsoleColor errorColor = ConsoleColor.Red, ConsoleColor { m_history = new List(); m_activeLine = new StringBuilder(); + m_shutdown = false; m_consoleConverter = new CharToLineConverter(text => { NewOutput(text); @@ -77,7 +78,6 @@ public ConsoleProvider(ConsoleColor errorColor = ConsoleColor.Red, ConsoleColor public async Task Start(Func dispatchCommand) { m_lastCommandLine = null; - m_shutdown = false; m_interactiveConsole = !Console.IsInputRedirected; RefreshLine(); @@ -115,6 +115,8 @@ public async Task Start(Func dispatchCommand) } } + public bool Shutdown { get { return m_shutdown; } } + /// /// Stop input processing/dispatching /// diff --git a/src/Tools/dotnet-dump/Analyzer.cs b/src/Tools/dotnet-dump/Analyzer.cs index 500cfb965b..d630392ad4 100644 --- a/src/Tools/dotnet-dump/Analyzer.cs +++ b/src/Tools/dotnet-dump/Analyzer.cs @@ -100,6 +100,9 @@ public async Task Analyze(FileInfo dump_path, string[] command) foreach (string cmd in command) { await _commandProcessor.Parse(cmd); + + if (_consoleProvider.Shutdown) + break; } } From d097a4a9d8b000d466dc3dea55b50855d6a648f2 Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Thu, 19 Mar 2020 12:12:48 -0400 Subject: [PATCH 187/243] Fix cross-dac Runtime::CreateInstance() (#928) --- src/SOS/Strike/runtime.cpp | 9 +++++++++ src/SOS/Strike/runtime.h | 2 ++ 2 files changed, 11 insertions(+) diff --git a/src/SOS/Strike/runtime.cpp b/src/SOS/Strike/runtime.cpp index 94afc1fd0a..a84ea2fad6 100644 --- a/src/SOS/Strike/runtime.cpp +++ b/src/SOS/Strike/runtime.cpp @@ -57,6 +57,15 @@ HRESULT Runtime::CreateInstance(bool isDesktop, Runtime **ppRuntime) if (*ppRuntime == nullptr) { hr = g_ExtSymbols->GetModuleByModuleName(runtimeModuleName, 0, &moduleIndex, &moduleAddress); +#ifndef FEATURE_PAL + // On Windows, support loading a Linux core dump by checking for NETCORE_RUNTIME_MODULE_NAME_UNIX_A too + if (!SUCCEEDED(hr) && !isDesktop) + { + runtimeModuleName = NETCORE_RUNTIME_MODULE_NAME_UNIX_A; + + hr = g_ExtSymbols->GetModuleByModuleName(runtimeModuleName, 0, &moduleIndex, &moduleAddress); + } +#endif // !FEATURE_PAL if (SUCCEEDED(hr)) { #ifdef FEATURE_PAL diff --git a/src/SOS/Strike/runtime.h b/src/SOS/Strike/runtime.h index 1693201982..fdae98432b 100644 --- a/src/SOS/Strike/runtime.h +++ b/src/SOS/Strike/runtime.h @@ -24,6 +24,8 @@ #else +#define NETCORE_RUNTIME_MODULE_NAME_UNIX_A "libcoreclr" + #define NETCORE_RUNTIME_MODULE_NAME_W W("coreclr") #define NETCORE_RUNTIME_MODULE_NAME_A "coreclr" #define NETCORE_RUNTIME_DLL_NAME_W MAKEDLLNAME_W(NETCORE_RUNTIME_MODULE_NAME_W) From 3c99b4b11744158c1660d17b193c6f3f271de770 Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Thu, 19 Mar 2020 17:10:36 -0400 Subject: [PATCH 188/243] Fix LoadNativeSymbols for cross-dac (#929) --- src/SOS/SOS.NETCore/SymbolReader.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/SOS/SOS.NETCore/SymbolReader.cs b/src/SOS/SOS.NETCore/SymbolReader.cs index 2cd025443e..1ee6180939 100644 --- a/src/SOS/SOS.NETCore/SymbolReader.cs +++ b/src/SOS/SOS.NETCore/SymbolReader.cs @@ -282,7 +282,16 @@ public static void LoadNativeSymbols(SymbolFileCallback callback, IntPtr paramet else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { var peFile = new PEFile(new StreamAddressSpace(stream), true); - generator = new PEFileKeyGenerator(s_tracer, peFile, moduleFilePath); + if (peFile.IsValid()) + { + generator = new PEFileKeyGenerator(s_tracer, peFile, moduleFilePath); + } + else + { + // Support loading ELF files on Windows for the cross-dac + var elfFile = new ELFFile(new StreamAddressSpace(stream), 0, true); + generator = new ELFFileKeyGenerator(s_tracer, elfFile, moduleFilePath); + } } else { return; From 59eed07673f95c01f98048a28d57ce5ca8c9d1f6 Mon Sep 17 00:00:00 2001 From: Juan Hoyos Date: Thu, 19 Mar 2020 18:03:22 -0700 Subject: [PATCH 189/243] Update NuGet.configto include dotnet5, eng, and tools feeds (#932) --- NuGet.config | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/NuGet.config b/NuGet.config index ce7270fafd..fa43230fd7 100644 --- a/NuGet.config +++ b/NuGet.config @@ -3,11 +3,17 @@ - + + + + + + + From d366deb72b8dc114e2c74075134bf300224fa1ff Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2020 12:53:54 +0000 Subject: [PATCH 190/243] [master] Update dependencies from dotnet/aspnetcore (#902) * Update dependencies from https://github.com/dotnet/aspnetcore build 20200310.1 - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20160.1 * Update dependencies from https://github.com/dotnet/aspnetcore build 20200311.8 - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20161.8 * Update dependencies from https://github.com/dotnet/aspnetcore build 20200312.5 - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20162.5 * Update dependencies from https://github.com/dotnet/aspnetcore build 20200314.1 - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20164.1 * Update dependencies from https://github.com/dotnet/aspnetcore build 20200314.4 - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20164.4 * Update dependencies from https://github.com/dotnet/aspnetcore build 20200317.1 - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20167.1 * Update dependencies from https://github.com/dotnet/aspnetcore build 20200318.5 - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20168.5 * Update dependencies from https://github.com/dotnet/aspnetcore build 20200320.1 - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20170.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index d7e8126849..bb6f2463c7 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -22,9 +22,9 @@ https://github.com/dotnet/runtime 2b27323e4aa61f540b8c6600f4add5b29860a0a3 - + https://github.com/dotnet/aspnetcore - 118ff3c40b2aae9e414011d4d4496b77b3f83021 + c4ce65e2dc4a2f77fe872670b8813442df91711d diff --git a/eng/Versions.props b/eng/Versions.props index 86746a149a..5b6f5b79e0 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -20,7 +20,7 @@ 5.0.0-preview.3.20161.9 - 5.0.0-preview.2.20155.1 + 5.0.0-preview.3.20170.1 From 4dd2878d0c679482ad9beefb349a3f0f7e9975e8 Mon Sep 17 00:00:00 2001 From: Juan Hoyos Date: Fri, 20 Mar 2020 23:17:29 -0700 Subject: [PATCH 191/243] Disable Microsoft.Diagnostics.NETCore.Client.WriteAllDumpTypesTest (#934) Given dotnet/diagnostics#913 I'm disabling this test until it can get investigated. This path is exerted in @d366deb src/Tools/dotnet-dump/Dumper.cs:77 and dotnet-dump has several tests for collecting dump types, so even if we disable the test, we will still get some coverage. --- .../Microsoft.Diagnostics.NETCore.Client/WriteDumpTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/WriteDumpTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/WriteDumpTests.cs index f438f882c1..fb06c15282 100644 --- a/src/tests/Microsoft.Diagnostics.NETCore.Client/WriteDumpTests.cs +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/WriteDumpTests.cs @@ -54,7 +54,7 @@ public void BasicWriteDumpTest() /// /// A test that writes all the different types of dump file /// - [Fact] + [Fact(Skip = "Test often times out in official builds/PRs. See https://github.com/dotnet/diagnostics/issues/913")] public void WriteAllDumpTypesTest() { var normalDumpPath = "./myDump-normal.dmp"; From c5349794fa601f646b1d90a0b14d5c67a0ab4a79 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 21 Mar 2020 12:42:58 +0000 Subject: [PATCH 192/243] [master] Update dependencies from dotnet/runtime (#925) * Update dependencies from https://github.com/dotnet/runtime build 20200317.12 - Microsoft.NETCore.App - 5.0.0-preview.3.20167.12 * Update dependencies from https://github.com/dotnet/runtime build 20200318.9 - Microsoft.NETCore.App - 5.0.0-preview.3.20168.9 * Update dependencies from https://github.com/dotnet/runtime build 20200319.13 - Microsoft.NETCore.App - 5.0.0-preview.3.20169.13 * Update dependencies from https://github.com/dotnet/runtime build 20200320.8 - Microsoft.NETCore.App - 5.0.0-preview.3.20170.8 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index bb6f2463c7..ca48afe05a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 16d4350184cf362cd59807b589d1c93803025abc - + https://github.com/dotnet/runtime - 2b27323e4aa61f540b8c6600f4add5b29860a0a3 + b0351370ccd132d95c97b75312fc36adaacc2664 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 5b6f5b79e0..4751bc6a8e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.3.20161.9 + 5.0.0-preview.3.20170.8 5.0.0-preview.3.20170.1 From 7b60f2578a4f80df1386842cc8d35cb3133a8279 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 21 Mar 2020 12:53:52 +0000 Subject: [PATCH 193/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200321.1 (#935) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20171.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ca48afe05a..2d86d2aef5 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -22,9 +22,9 @@ https://github.com/dotnet/runtime b0351370ccd132d95c97b75312fc36adaacc2664 - + https://github.com/dotnet/aspnetcore - c4ce65e2dc4a2f77fe872670b8813442df91711d + 44230d36a7a6c41d823915b11e83c26447cead7f diff --git a/eng/Versions.props b/eng/Versions.props index 4751bc6a8e..0bdd34a9c0 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -20,7 +20,7 @@ 5.0.0-preview.3.20170.8 - 5.0.0-preview.3.20170.1 + 5.0.0-preview.3.20171.1 From b15b3c99d036e075387c648c412988ac5baf50f8 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sun, 22 Mar 2020 12:50:20 +0000 Subject: [PATCH 194/243] Update dependencies from https://github.com/dotnet/runtime build 20200321.6 (#937) - Microsoft.NETCore.App - 5.0.0-preview.3.20171.6 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2d86d2aef5..761f2c03b6 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 16d4350184cf362cd59807b589d1c93803025abc - + https://github.com/dotnet/runtime - b0351370ccd132d95c97b75312fc36adaacc2664 + 7afaac39836b0940337937ddafef09c57d512a69 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 0bdd34a9c0..19f5c56307 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.3.20170.8 + 5.0.0-preview.3.20171.6 5.0.0-preview.3.20171.1 From 835205b6186578c4a5a44c6b714a53e0b8afac57 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2020 17:24:25 +0000 Subject: [PATCH 195/243] Update dependencies from https://github.com/dotnet/runtime build 20200322.1 (#939) - Microsoft.NETCore.App - 5.0.0-preview.3.20172.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 761f2c03b6..28d308abcb 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 16d4350184cf362cd59807b589d1c93803025abc - + https://github.com/dotnet/runtime - 7afaac39836b0940337937ddafef09c57d512a69 + 963b1587b48ec2fa09cb5bcd0a53460762a459e4 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 19f5c56307..1f377a04ed 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.3.20171.6 + 5.0.0-preview.3.20172.1 5.0.0-preview.3.20171.1 From 008a652e132bc0b3a9ff1a7ab93aee6a09cb379e Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:04:38 +0000 Subject: [PATCH 196/243] Update dependencies from https://github.com/dotnet/arcade build 20200321.1 (#938) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.20171.1 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.20171.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 8 ++-- eng/Versions.props | 2 +- eng/common/cross/build-android-rootfs.sh | 39 ++++++++++++------- .../templates/job/publish-build-assets.yml | 6 +++ .../templates/post-build/common-variables.yml | 7 ++++ global.json | 2 +- 6 files changed, 44 insertions(+), 20 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 28d308abcb..09776dab38 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,9 +4,9 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - 16d4350184cf362cd59807b589d1c93803025abc + 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd https://github.com/dotnet/symstore @@ -14,9 +14,9 @@ - + https://github.com/dotnet/arcade - 16d4350184cf362cd59807b589d1c93803025abc + 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 1f377a04ed..c84e42496c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -47,7 +47,7 @@ 4.7.0 2.4.1 2.0.3 - 5.0.0-beta.20162.3 + 5.0.0-beta.20171.1 10.0.18362 diff --git a/eng/common/cross/build-android-rootfs.sh b/eng/common/cross/build-android-rootfs.sh index 5e74881eb2..e7f12edb56 100644 --- a/eng/common/cross/build-android-rootfs.sh +++ b/eng/common/cross/build-android-rootfs.sh @@ -53,12 +53,20 @@ for i in "$@" done # Obtain the location of the bash script to figure out where the root of the repo is. -__CrossDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -__Android_Cross_Dir="$(cd "$__CrossDir/../../../.tools/android-rootfs" && pwd)" +__ScriptBaseDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -__NDK_Dir="$__Android_Cross_Dir/android-ndk-$__NDK_Version" -__lldb_Dir="$__Android_Cross_Dir/lldb" -__ToolchainDir="$__Android_Cross_Dir/android-ndk-$__NDK_Version" +__CrossDir="$__ScriptBaseDir/../../../.tools/android-rootfs" + +if [[ ! -f "$__CrossDir" ]]; then + mkdir -p "$__CrossDir" +fi + +# Resolve absolute path to avoid `../` in build logs +__CrossDir="$( cd "$__CrossDir" && pwd )" + +__NDK_Dir="$__CrossDir/android-ndk-$__NDK_Version" +__lldb_Dir="$__CrossDir/lldb" +__ToolchainDir="$__CrossDir/android-ndk-$__NDK_Version" if [[ -n "$TOOLCHAIN_DIR" ]]; then __ToolchainDir=$TOOLCHAIN_DIR @@ -77,19 +85,20 @@ echo "Target Toolchain location: $__ToolchainDir" if [ ! -d $__NDK_Dir ]; then echo Downloading the NDK into $__NDK_Dir mkdir -p $__NDK_Dir - wget -nv -nc --show-progress https://dl.google.com/android/repository/android-ndk-$__NDK_Version-linux-x86_64.zip -O $__Android_Cross_Dir/android-ndk-$__NDK_Version-linux-x86_64.zip - unzip -q $__Android_Cross_Dir/android-ndk-$__NDK_Version-linux-x86_64.zip -d $__Android_Cross_Dir + wget -q --progress=bar:force:noscroll --show-progress https://dl.google.com/android/repository/android-ndk-$__NDK_Version-linux-x86_64.zip -O $__CrossDir/android-ndk-$__NDK_Version-linux-x86_64.zip + unzip -q $__CrossDir/android-ndk-$__NDK_Version-linux-x86_64.zip -d $__CrossDir fi if [ ! -d $__lldb_Dir ]; then mkdir -p $__lldb_Dir echo Downloading LLDB into $__lldb_Dir - wget -nv -nc --show-progress https://dl.google.com/android/repository/lldb-2.3.3614996-linux-x86_64.zip -O $__Android_Cross_Dir/lldb-2.3.3614996-linux-x86_64.zip - unzip -q $__Android_Cross_Dir/lldb-2.3.3614996-linux-x86_64.zip -d $__lldb_Dir + wget -q --progress=bar:force:noscroll --show-progress https://dl.google.com/android/repository/lldb-2.3.3614996-linux-x86_64.zip -O $__CrossDir/lldb-2.3.3614996-linux-x86_64.zip + unzip -q $__CrossDir/lldb-2.3.3614996-linux-x86_64.zip -d $__lldb_Dir fi echo "Download dependencies..." -mkdir -p $__Android_Cross_Dir/tmp/$arch/ +__TmpDir=$__CrossDir/tmp/$__BuildArch/ +mkdir -p "$__TmpDir" # combined dependencies for coreclr, installer and libraries __AndroidPackages="libicu" @@ -103,11 +112,11 @@ for path in $(wget -qO- http://termux.net/dists/stable/main/binary-$__AndroidArc if [[ "$path" != "Filename:" ]]; then echo "Working on: $path" - wget -qO- http://termux.net/$path | dpkg -x - $__Android_Cross_Dir/tmp/$__AndroidArch/ + wget -qO- http://termux.net/$path | dpkg -x - "$__TmpDir" fi done -cp -R $__Android_Cross_Dir/tmp/$__AndroidArch/data/data/com.termux/files/usr/* $__ToolchainDir/sysroot/usr/ +cp -R "$__TmpDir/data/data/com.termux/files/usr/"* "$__ToolchainDir/sysroot/usr/" # Generate platform file for build.sh script to assign to __DistroRid echo "Generating platform file..." @@ -115,6 +124,8 @@ echo "RID=android.${__ApiLevel}-${__BuildArch}" > $__ToolchainDir/sysroot/androi echo "Now to build coreclr, libraries and installers; run:" echo ROOTFS_DIR=\$\(realpath $__ToolchainDir/sysroot\) ./build.sh --cross --arch $__BuildArch \ - --subsetCategory coreclr \ - --subsetCategory libraries \ + --subsetCategory coreclr +echo ROOTFS_DIR=\$\(realpath $__ToolchainDir/sysroot\) ./build.sh --cross --arch $__BuildArch \ + --subsetCategory libraries +echo ROOTFS_DIR=\$\(realpath $__ToolchainDir/sysroot\) ./build.sh --cross --arch $__BuildArch \ --subsetCategory installer diff --git a/eng/common/templates/job/publish-build-assets.yml b/eng/common/templates/job/publish-build-assets.yml index b722975f9c..055304ad89 100644 --- a/eng/common/templates/job/publish-build-assets.yml +++ b/eng/common/templates/job/publish-build-assets.yml @@ -37,6 +37,12 @@ jobs: - name: _BuildConfig value: ${{ parameters.configuration }} - group: Publish-Build-Assets + # Skip component governance and codesign validation for SDL. These jobs + # create no content. + - name: skipComponentGovernanceDetection + value: true + - name: runCodesignValidationInjection + value: false steps: - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: diff --git a/eng/common/templates/post-build/common-variables.yml b/eng/common/templates/post-build/common-variables.yml index 9505cf170f..61488fd767 100644 --- a/eng/common/templates/post-build/common-variables.yml +++ b/eng/common/templates/post-build/common-variables.yml @@ -90,3 +90,10 @@ variables: value: https://dotnetclimsrc.blob.core.windows.net/dotnet/index.json - name: InternalInstallersBlobFeedKey value: $(dotnetclimsrc-access-key) + + # Skip component governance and codesign validation for SDL. These jobs + # create no content. + - name: skipComponentGovernanceDetection + value: true + - name: runCodesignValidationInjection + value: false \ No newline at end of file diff --git a/global.json b/global.json index 8660184328..7d58ad57ad 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "dotnet": "3.1.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20162.3" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20171.1" } } From 0669422a056b68e7517759ff61b8efb39de49219 Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Mon, 23 Mar 2020 15:04:17 -0400 Subject: [PATCH 197/243] Fix Runtime::GetRuntime*Name() for cross-dac (#930) * Fix Runtime::GetRuntime*Name() for cross-dac * Refactor GetRuntime*Name() Add IRuntime::RuntimeConfiguration Add IRuntime::GetRuntimeConfiguration() Remove IRuntime::IsDesktop() Remove NETCORE_RUNTIME* Remove DESKTOP_RUNTIME* --- .../SOS.UnitTests/Scripts/DualRuntimes.script | 2 +- src/SOS/Strike/EventCallbacks.cpp | 15 ++- src/SOS/Strike/exts.h | 4 +- src/SOS/Strike/hostcoreclr.cpp | 6 +- src/SOS/Strike/runtime.cpp | 31 ++--- src/SOS/Strike/runtime.h | 112 ++++++++++++------ src/SOS/Strike/strike.cpp | 4 +- 7 files changed, 109 insertions(+), 65 deletions(-) diff --git a/src/SOS/SOS.UnitTests/Scripts/DualRuntimes.script b/src/SOS/SOS.UnitTests/Scripts/DualRuntimes.script index 954d5fea3d..32368122f2 100644 --- a/src/SOS/SOS.UnitTests/Scripts/DualRuntimes.script +++ b/src/SOS/SOS.UnitTests/Scripts/DualRuntimes.script @@ -69,7 +69,7 @@ VERIFY:\s*Total\s+\s+objects\s+ # SOSCOMMAND:SOSStatus -VERIFY:.*\.NET Core runtime at.*\s+ +VERIFY:.*\.NET Core .*runtime at.*\s+ IFDEF:TRIAGE_DUMP SOSCOMMAND:setclrpath %DESKTOP_RUNTIME_PATH% diff --git a/src/SOS/Strike/EventCallbacks.cpp b/src/SOS/Strike/EventCallbacks.cpp index bdef2f9e65..2c5813af57 100644 --- a/src/SOS/Strike/EventCallbacks.cpp +++ b/src/SOS/Strike/EventCallbacks.cpp @@ -135,12 +135,19 @@ HRESULT __stdcall EventCallbacks::LoadModule(ULONG64 ImageFileHandle, { HRESULT handleEventStatus = DEBUG_STATUS_NO_CHANGE; - if (ModuleName != NULL) + if (ModuleName != NULL) { - bool isNetCore = _stricmp(ModuleName, NETCORE_RUNTIME_MODULE_NAME_A) == 0; - bool isDesktop = _stricmp(ModuleName, DESKTOP_RUNTIME_MODULE_NAME_A) == 0; + bool isRuntimeModule = false; + for (int runtime = 0; runtime < IRuntime::ConfigurationEnd; ++runtime) + { + if (_stricmp(ModuleName, GetRuntimeModuleName((IRuntime::RuntimeConfiguration)runtime)) == 0) + { + isRuntimeModule = true; + break; + } + } - if (isNetCore || isDesktop) + if (isRuntimeModule) { if (g_breakOnRuntimeModuleLoad) { diff --git a/src/SOS/Strike/exts.h b/src/SOS/Strike/exts.h index 2d630b87bd..d109637a16 100644 --- a/src/SOS/Strike/exts.h +++ b/src/SOS/Strike/exts.h @@ -197,9 +197,9 @@ class __ExtensionCleanUp inline void EENotLoadedMessage(HRESULT Status) { #ifdef FEATURE_PAL - ExtOut("Failed to find runtime module (%s), 0x%08x\n", NETCORE_RUNTIME_DLL_NAME_A, Status); + ExtOut("Failed to find runtime module (%s), 0x%08x\n", GetRuntimeDllName(IRuntime::Core), Status); #else - ExtOut("Failed to find runtime module (%s or %s), 0x%08x\n", NETCORE_RUNTIME_DLL_NAME_A, DESKTOP_RUNTIME_DLL_NAME_A, Status); + ExtOut("Failed to find runtime module (%s or %s or %s), 0x%08x\n", GetRuntimeDllName(IRuntime::Core), GetRuntimeDllName(IRuntime::WindowsDesktop), GetRuntimeDllName(IRuntime::UnixCore), Status); #endif ExtOut("Extension commands need it in order to have something to do.\n"); } diff --git a/src/SOS/Strike/hostcoreclr.cpp b/src/SOS/Strike/hostcoreclr.cpp index 731401a481..1e791369cb 100644 --- a/src/SOS/Strike/hostcoreclr.cpp +++ b/src/SOS/Strike/hostcoreclr.cpp @@ -368,7 +368,7 @@ static HRESULT GetHostRuntime(std::string& coreClrPath, std::string& hostRuntime return hr; } // Don't use the desktop runtime to host - if (g_pRuntime->IsDesktop()) + if (g_pRuntime->GetRuntimeConfiguration() == IRuntime::WindowsDesktop) { return E_FAIL; } @@ -391,7 +391,7 @@ static HRESULT GetHostRuntime(std::string& coreClrPath, std::string& hostRuntime hostRuntimeDirectory.assign(g_hostRuntimeDirectory); coreClrPath.assign(g_hostRuntimeDirectory); coreClrPath.append(DIRECTORY_SEPARATOR_STR_A); - coreClrPath.append(NETCORE_RUNTIME_DLL_NAME_A); + coreClrPath.append(GetRuntimeDllName(IRuntime::Core)); return S_OK; } @@ -732,7 +732,7 @@ void InitializeSymbolStoreFromSymPath() // static void SymbolFileCallback(void* param, const char* moduleFileName, const char* symbolFilePath) { - if (strcmp(moduleFileName, NETCORE_RUNTIME_DLL_NAME_A) == 0) { + if (strcmp(moduleFileName, GetRuntimeDllName(IRuntime::Core)) == 0) { return; } if (strcmp(moduleFileName, NETCORE_DAC_DLL_NAME_A) == 0) { diff --git a/src/SOS/Strike/runtime.cpp b/src/SOS/Strike/runtime.cpp index a84ea2fad6..60004e8e12 100644 --- a/src/SOS/Strike/runtime.cpp +++ b/src/SOS/Strike/runtime.cpp @@ -33,7 +33,7 @@ Runtime* Runtime::s_desktop = nullptr; #endif // Used to initialize the runtime instance with values from the host when under dotnet-dump -bool Runtime::s_isDesktop = false; +IRuntime::RuntimeConfiguration Runtime::s_configuration = IRuntime::Core; LPCSTR Runtime::s_dacFilePath = nullptr; LPCSTR Runtime::s_dbiFilePath = nullptr; @@ -46,9 +46,9 @@ IRuntime* g_pRuntime = nullptr; /**********************************************************************\ * Creates a desktop or .NET Core instance of the runtime class \**********************************************************************/ -HRESULT Runtime::CreateInstance(bool isDesktop, Runtime **ppRuntime) +HRESULT Runtime::CreateInstance(RuntimeConfiguration configuration, Runtime **ppRuntime) { - PCSTR runtimeModuleName = isDesktop ? DESKTOP_RUNTIME_MODULE_NAME_A : NETCORE_RUNTIME_MODULE_NAME_A; + PCSTR runtimeModuleName = GetRuntimeModuleName(configuration); ULONG moduleIndex = 0; ULONG64 moduleAddress = 0; ULONG64 moduleSize = 0; @@ -57,15 +57,6 @@ HRESULT Runtime::CreateInstance(bool isDesktop, Runtime **ppRuntime) if (*ppRuntime == nullptr) { hr = g_ExtSymbols->GetModuleByModuleName(runtimeModuleName, 0, &moduleIndex, &moduleAddress); -#ifndef FEATURE_PAL - // On Windows, support loading a Linux core dump by checking for NETCORE_RUNTIME_MODULE_NAME_UNIX_A too - if (!SUCCEEDED(hr) && !isDesktop) - { - runtimeModuleName = NETCORE_RUNTIME_MODULE_NAME_UNIX_A; - - hr = g_ExtSymbols->GetModuleByModuleName(runtimeModuleName, 0, &moduleIndex, &moduleAddress); - } -#endif // !FEATURE_PAL if (SUCCEEDED(hr)) { #ifdef FEATURE_PAL @@ -99,7 +90,7 @@ HRESULT Runtime::CreateInstance(bool isDesktop, Runtime **ppRuntime) { if (moduleSize > 0) { - *ppRuntime = new Runtime(isDesktop, moduleIndex, moduleAddress, moduleSize); + *ppRuntime = new Runtime(configuration, moduleIndex, moduleAddress, moduleSize); OnUnloadTask::Register(CleanupRuntimes); } else @@ -124,13 +115,17 @@ HRESULT Runtime::CreateInstance() HRESULT hr = S_OK; if (g_pRuntime == nullptr) { - hr = CreateInstance(false, &s_netcore); + hr = CreateInstance(IRuntime::Core, &s_netcore); #ifdef FEATURE_PAL g_pRuntime = s_netcore; #else if (FAILED(hr)) { - hr = CreateInstance(true, &s_desktop); + hr = CreateInstance(IRuntime::UnixCore, &s_netcore); + } + if (FAILED(hr)) + { + hr = CreateInstance(IRuntime::WindowsDesktop, &s_desktop); } g_pRuntime = s_netcore != nullptr ? s_netcore : s_desktop; #endif @@ -146,7 +141,7 @@ HRESULT Runtime::CreateInstance() bool Runtime::SwitchRuntime(bool desktop) { if (desktop) { - CreateInstance(true, &s_desktop); + CreateInstance(IRuntime::WindowsDesktop, &s_desktop); } IRuntime* runtime = desktop ? s_desktop : s_netcore; if (runtime == nullptr) { @@ -477,7 +472,7 @@ HRESULT Runtime::GetCorDebugInterface(ICorDebugProcess** ppCorDebugProcess) GUID skuId = CLR_ID_CORECLR; #endif #ifndef FEATURE_PAL - if (IsDesktop()) + if (GetRuntimeConfiguration() == IRuntime::WindowsDesktop) { skuId = CLR_ID_V4_DESKTOP; } @@ -530,7 +525,7 @@ HRESULT Runtime::GetCorDebugInterface(ICorDebugProcess** ppCorDebugProcess) \**********************************************************************/ void Runtime::DisplayStatus() { - ExtOut("%s runtime at %p (%08x)\n", m_isDesktop ? "Desktop" : ".NET Core", m_address, m_size); + ExtOut("%s runtime at %p (%08x)\n", GetRuntimeConfigurationName(GetRuntimeConfiguration()), m_address, m_size); if (m_runtimeDirectory != nullptr) { ExtOut("Runtime directory: %s\n", m_runtimeDirectory); } diff --git a/src/SOS/Strike/runtime.h b/src/SOS/Strike/runtime.h index fdae98432b..561b9416d6 100644 --- a/src/SOS/Strike/runtime.h +++ b/src/SOS/Strike/runtime.h @@ -7,11 +7,6 @@ #ifdef FEATURE_PAL -#define NETCORE_RUNTIME_MODULE_NAME_W MAKEDLLNAME_W(W("coreclr")) -#define NETCORE_RUNTIME_MODULE_NAME_A MAKEDLLNAME_A("coreclr") -#define NETCORE_RUNTIME_DLL_NAME_W NETCORE_RUNTIME_MODULE_NAME_W -#define NETCORE_RUNTIME_DLL_NAME_A NETCORE_RUNTIME_MODULE_NAME_A - #define NETCORE_DAC_MODULE_NAME_W MAKEDLLNAME_W(W("mscordaccore")) #define NETCORE_DAC_MODULE_NAME_A MAKEDLLNAME_A("mscordaccore") #define NETCORE_DAC_DLL_NAME_W NETCORE_DAC_MODULE_NAME_W @@ -24,13 +19,6 @@ #else -#define NETCORE_RUNTIME_MODULE_NAME_UNIX_A "libcoreclr" - -#define NETCORE_RUNTIME_MODULE_NAME_W W("coreclr") -#define NETCORE_RUNTIME_MODULE_NAME_A "coreclr" -#define NETCORE_RUNTIME_DLL_NAME_W MAKEDLLNAME_W(NETCORE_RUNTIME_MODULE_NAME_W) -#define NETCORE_RUNTIME_DLL_NAME_A MAKEDLLNAME_A(NETCORE_RUNTIME_MODULE_NAME_A) - #define NETCORE_DAC_MODULE_NAME_W W("mscordaccore") #define NETCORE_DAC_MODULE_NAME_A "mscordaccore" #define NETCORE_DAC_DLL_NAME_W MAKEDLLNAME_W(NETCORE_DAC_MODULE_NAME_W) @@ -43,11 +31,6 @@ #endif // FEATURE_PAL -#define DESKTOP_RUNTIME_MODULE_NAME_W W("clr") -#define DESKTOP_RUNTIME_MODULE_NAME_A "clr" -#define DESKTOP_RUNTIME_DLL_NAME_W MAKEDLLNAME_W(DESKTOP_RUNTIME_MODULE_NAME_W) -#define DESKTOP_RUNTIME_DLL_NAME_A MAKEDLLNAME_A(DESKTOP_RUNTIME_MODULE_NAME_A) - #define DESKTOP_DAC_MODULE_NAME_W W("mscordacwks") #define DESKTOP_DAC_MODULE_NAME_A "mscordacwks" #define DESKTOP_DAC_DLL_NAME_W MAKEDLLNAME_W(W("mscordacwks")) @@ -59,8 +42,26 @@ class IRuntime { public: - // Returns true if desktop CLR; false if .NET Core - virtual bool IsDesktop() const = 0; + enum RuntimeConfiguration + { + WindowsDesktop, + WindowsCore, + UnixCore, + OSXCore, + ConfigurationEnd, +#ifdef FEATURE_PAL +#ifdef __APPLE__ + Core = OSXCore +#else + Core = UnixCore +#endif +#else + Core = WindowsCore +#endif + }; + + // Returns the runtime configuration + virtual RuntimeConfiguration GetRuntimeConfiguration() const = 0; // Returns the runtime module index virtual ULONG GetModuleIndex() const = 0; @@ -90,6 +91,47 @@ class IRuntime virtual void DisplayStatus() = 0; }; +// Returns the runtime configuration as a string +inline static const char* GetRuntimeConfigurationName(IRuntime::RuntimeConfiguration config) +{ + static const char* name[IRuntime::ConfigurationEnd] = { + "Desktop", + ".NET Core (Windows)", + ".NET Core (Unix)", + ".NET Core (Mac)" + }; + return (config < IRuntime::ConfigurationEnd) ? name[config] : nullptr; +} + +// Returns the runtime module DLL name (clr.dll, coreclr.dll, libcoreclr.so, libcoreclr.dylib) +inline static const char* GetRuntimeDllName(IRuntime::RuntimeConfiguration config) +{ + static const char* name[IRuntime::ConfigurationEnd] = { + "clr.dll", + "coreclr.dll", + "libcoreclr.so", + "libcoreclr.dylib" + }; + return (config < IRuntime::ConfigurationEnd) ? name[config] : nullptr; +} + +// Returns the runtime module name (clr, coreclr, libcoreclr.so, libcoreclr.dylib). +inline static const char* GetRuntimeModuleName(IRuntime::RuntimeConfiguration config) +{ +#ifdef FEATURE_PAL + return GetRuntimeDllName(config); +#else + // On a windows host the module name does not include the extension. + static const char* name[IRuntime::ConfigurationEnd] = { + "clr", + "coreclr", + "libcoreclr", + "libcoreclr" + }; + return (config < IRuntime::ConfigurationEnd) ? name[config] : nullptr; +#endif +} + extern LPCSTR g_runtimeModulePath; extern IRuntime* g_pRuntime; @@ -99,7 +141,7 @@ extern IRuntime* g_pRuntime; class Runtime : public IRuntime { private: - bool m_isDesktop; + RuntimeConfiguration m_configuration; ULONG m_index; ULONG64 m_address; ULONG64 m_size; @@ -113,12 +155,12 @@ class Runtime : public IRuntime #ifndef FEATURE_PAL static Runtime* s_desktop; #endif - static bool s_isDesktop; + static RuntimeConfiguration s_configuration; static LPCSTR s_dacFilePath; static LPCSTR s_dbiFilePath; - Runtime(bool isDesktop, ULONG index, ULONG64 address, ULONG64 size) : - m_isDesktop(isDesktop), + Runtime(RuntimeConfiguration configuration,ULONG index, ULONG64 address, ULONG64 size) : + m_configuration(configuration), m_index(index), m_address(address), m_size(size), @@ -131,7 +173,7 @@ class Runtime : public IRuntime _ASSERTE(index != -1); _ASSERTE(address != 0); _ASSERTE(size != 0); - if (isDesktop == s_isDesktop) { + if (configuration == s_configuration) { SetDacFilePath(s_dacFilePath); SetDbiFilePath(s_dbiFilePath); } @@ -139,7 +181,7 @@ class Runtime : public IRuntime virtual Runtime::~Runtime(); - static HRESULT CreateInstance(bool isDesktop, Runtime** ppRuntime); + static HRESULT CreateInstance(RuntimeConfiguration configuration, Runtime** ppRuntime); HRESULT GetRuntimeDirectory(std::string& runtimeDirectory); @@ -177,7 +219,7 @@ class Runtime : public IRuntime static void SetDacDbiPath(bool isDesktop, LPCSTR dacFilePath, LPCSTR dbiFilePath) { - s_isDesktop = isDesktop; + s_configuration = isDesktop ? IRuntime::WindowsDesktop : IRuntime::Core; if (dacFilePath != nullptr) { s_dacFilePath = _strdup(dacFilePath); } @@ -188,7 +230,7 @@ class Runtime : public IRuntime static void Flush(); - virtual bool IsDesktop() const { return m_isDesktop; } + virtual RuntimeConfiguration GetRuntimeConfiguration() const { return m_configuration; } virtual ULONG GetModuleIndex() const { return m_index; } @@ -211,50 +253,50 @@ class Runtime : public IRuntime // Returns the runtime module DLL name (clr.dll, coreclr.dll, libcoreclr.so, libcoreclr.dylib) inline const char* GetRuntimeDllName() const { - return IsDesktop() ? DESKTOP_RUNTIME_DLL_NAME_A : NETCORE_RUNTIME_DLL_NAME_A; + return ::GetRuntimeDllName(GetRuntimeConfiguration()); } // Returns the DAC module name (mscordacwks.dll, mscordaccore.dll, libmscordaccore.so, libmscordaccore.dylib) inline const char* GetDacDllName() const { - return IsDesktop() ? DESKTOP_DAC_DLL_NAME_A : NETCORE_DAC_DLL_NAME_A; + return (GetRuntimeConfiguration() == IRuntime::WindowsDesktop) ? DESKTOP_DAC_DLL_NAME_A : NETCORE_DAC_DLL_NAME_A; } // Returns the DAC module name (mscordacwks, mscordaccore, libmscordaccore.so, libmscordaccore.dylib) inline const WCHAR* GetDacModuleNameW() const { - return IsDesktop() ? DESKTOP_DAC_MODULE_NAME_W : NETCORE_DAC_MODULE_NAME_W; + return (GetRuntimeConfiguration() == IRuntime::WindowsDesktop) ? DESKTOP_DAC_MODULE_NAME_W : NETCORE_DAC_MODULE_NAME_W; } // Returns the DAC module name (mscordacwks.dll, mscordaccore.dll, libmscordaccore.so, libmscordaccore.dylib) inline const WCHAR* GetDacDllNameW() const { - return IsDesktop() ? DESKTOP_DAC_DLL_NAME_W : NETCORE_DAC_DLL_NAME_W; + return (GetRuntimeConfiguration() == IRuntime::WindowsDesktop) ? DESKTOP_DAC_DLL_NAME_W : NETCORE_DAC_DLL_NAME_W; } }; // Returns the runtime module name (clr, coreclr, libcoreclr.so, libcoreclr.dylib). inline const char* GetRuntimeModuleName() { - return g_pRuntime->IsDesktop() ? DESKTOP_RUNTIME_MODULE_NAME_A : NETCORE_RUNTIME_MODULE_NAME_A; + return GetRuntimeModuleName(g_pRuntime->GetRuntimeConfiguration()); } // Returns the runtime module DLL name (clr.dll, coreclr.dll, libcoreclr.so, libcoreclr.dylib) inline const char* GetRuntimeDllName() { - return g_pRuntime->IsDesktop() ? DESKTOP_RUNTIME_DLL_NAME_A : NETCORE_RUNTIME_DLL_NAME_A; + return GetRuntimeDllName(g_pRuntime->GetRuntimeConfiguration()); } // Returns the DAC module name (mscordacwks, mscordaccore, libmscordaccore.so, libmscordaccore.dylib) inline const char* GetDacModuleName() { - return g_pRuntime->IsDesktop() ? DESKTOP_DAC_MODULE_NAME_A : NETCORE_DAC_MODULE_NAME_A; + return (g_pRuntime->GetRuntimeConfiguration() == IRuntime::WindowsDesktop) ? DESKTOP_DAC_MODULE_NAME_A : NETCORE_DAC_MODULE_NAME_A; } // Returns the DAC module name (mscordacwks.dll, mscordaccore.dll, libmscordaccore.so, libmscordaccore.dylib) inline const char* GetDacDllName() { - return g_pRuntime->IsDesktop() ? DESKTOP_DAC_DLL_NAME_A : NETCORE_DAC_DLL_NAME_A; + return (g_pRuntime->GetRuntimeConfiguration() == IRuntime::WindowsDesktop) ? DESKTOP_DAC_DLL_NAME_A : NETCORE_DAC_DLL_NAME_A; } #endif // __runtime_h__ diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 8e18d42c25..fb44ec32af 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -7624,7 +7624,7 @@ class CNotification : public IXCLRDataExceptionNotification5 // This is only needed for desktop runtime because OnCodeGenerated2 // isn't supported by the desktop DAC. - if (g_pRuntime->IsDesktop()) + if (g_pRuntime->GetRuntimeConfiguration() == IRuntime::WindowsDesktop) { // Some method has been generated, make a breakpoint and remove it. ULONG32 len = mdNameLen; @@ -9872,7 +9872,7 @@ DECLARE_API(DumpLog) _ASSERTE(g_pRuntime != nullptr); // Not supported on desktop runtime - if (g_pRuntime->IsDesktop()) + if (g_pRuntime->GetRuntimeConfiguration() == IRuntime::WindowsDesktop) { ExtErr("DumpLog not supported on desktop runtime\n"); return E_FAIL; From c3f4f433029b85d5b9503b49d76052fca3ec6803 Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Mon, 23 Mar 2020 21:40:50 -0400 Subject: [PATCH 198/243] Fix dotnet-dump analyze clrmd CreateRuntime (#940) --- src/Tools/dotnet-dump/Analyzer.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Tools/dotnet-dump/Analyzer.cs b/src/Tools/dotnet-dump/Analyzer.cs index d630392ad4..ead2bad85d 100644 --- a/src/Tools/dotnet-dump/Analyzer.cs +++ b/src/Tools/dotnet-dump/Analyzer.cs @@ -201,7 +201,7 @@ private ClrRuntime CreateRuntime(DataTarget target) // Ignore the DAC version mismatch that can happen on Linux because the clrmd ELF dump // reader returns 0.0.0.0 for the runtime module that the DAC is matched against. This // will be fixed in clrmd 2.0 but not 1.1. - runtime = clrInfo.CreateRuntime(dacFilePath, ignoreMismatch: RuntimeInformation.IsOSPlatform(OSPlatform.Linux)); + runtime = clrInfo.CreateRuntime(dacFilePath, ignoreMismatch: clrInfo.ModuleInfo.BuildId != null); } catch (DllNotFoundException ex) { @@ -241,6 +241,14 @@ private string GetDacFile(ClrInfo clrInfo) KeyTypeFlags.ClrKeys, clrInfo.ModuleInfo.FileName, clrInfo.ModuleInfo.BuildId, symbolFile: false, symbolFileName: null); key = keys.SingleOrDefault((k) => Path.GetFileName(k.FullPathName) == dacFileName); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + // We are opening a Linux dump on Windows + // We need to use the Windows index and filename + key = new SymbolStoreKey(key.Index.Replace("libmscordaccore.so", "mscordaccore.dll"), + key.FullPathName.Replace("libmscordaccore.so", "mscordaccore.dll")); + } } else { From 86214d6e4c511e0a9c795aa5e96e4c4651381435 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2020 12:42:01 +0000 Subject: [PATCH 199/243] Update dependencies from https://github.com/dotnet/runtime build 20200324.1 (#945) - Microsoft.NETCore.App - 5.0.0-preview.3.20174.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 09776dab38..3b6988e07c 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd - + https://github.com/dotnet/runtime - 963b1587b48ec2fa09cb5bcd0a53460762a459e4 + 6adb31375f575f63652ded66dabb33fcb01492fb https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index c84e42496c..b19b99027e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.3.20172.1 + 5.0.0-preview.3.20174.1 5.0.0-preview.3.20171.1 From d44542f1ac12307370360c562c682beef0b7150c Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2020 12:44:06 +0000 Subject: [PATCH 200/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200323.4 (#946) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20173.4 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 3b6988e07c..6a41e45523 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -22,9 +22,9 @@ https://github.com/dotnet/runtime 6adb31375f575f63652ded66dabb33fcb01492fb - + https://github.com/dotnet/aspnetcore - 44230d36a7a6c41d823915b11e83c26447cead7f + 49f23649918407f72acce29f143e3c402e040c59 diff --git a/eng/Versions.props b/eng/Versions.props index b19b99027e..80f745fb05 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -20,7 +20,7 @@ 5.0.0-preview.3.20174.1 - 5.0.0-preview.3.20171.1 + 5.0.0-preview.3.20173.4 From 692e30744e35acf90f386bd58bee80878c044d77 Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Tue, 24 Mar 2020 12:16:34 -0400 Subject: [PATCH 201/243] dotnet-dump analyze dso (#944) Fix dso for cross dac case --- src/SOS/Strike/strike.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index fb44ec32af..61b30ef010 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -642,15 +642,19 @@ HRESULT DumpStackObjectsRaw(size_t nArg, __in_z LPSTR exprBottom, __in_z LPSTR e } #ifndef FEATURE_PAL - NT_TIB teb; - ULONG64 dwTebAddr=0; - HRESULT hr = g_ExtSystem->GetCurrentThreadTeb(&dwTebAddr); - if (SUCCEEDED(hr) && SafeReadMemory (TO_TADDR(dwTebAddr), &teb, sizeof (NT_TIB), NULL)) + if ((g_pRuntime->GetRuntimeConfiguration() == IRuntime::WindowsCore) || + (g_pRuntime->GetRuntimeConfiguration() == IRuntime::WindowsDesktop)) { - if (StackTop > TO_TADDR(teb.StackLimit) && StackTop <= TO_TADDR(teb.StackBase)) + NT_TIB teb; + ULONG64 dwTebAddr = 0; + HRESULT hr = g_ExtSystem->GetCurrentThreadTeb(&dwTebAddr); + if (SUCCEEDED(hr) && SafeReadMemory(TO_TADDR(dwTebAddr), &teb, sizeof(NT_TIB), NULL)) { - if (StackBottom == 0 || StackBottom > TO_TADDR(teb.StackBase)) - StackBottom = TO_TADDR(teb.StackBase); + if (StackTop > TO_TADDR(teb.StackLimit) && StackTop <= TO_TADDR(teb.StackBase)) + { + if (StackBottom == 0 || StackBottom > TO_TADDR(teb.StackBase)) + StackBottom = TO_TADDR(teb.StackBase); + } } } #endif From 93ffbb87d498c33dbfdff2c04ef370d687c33088 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2020 16:33:33 +0000 Subject: [PATCH 202/243] Update dependencies from https://github.com/dotnet/symstore build 20200323.1 (#947) - Microsoft.SymbolStore - 1.0.117301 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6a41e45523..c8e078fc9f 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -8,9 +8,9 @@ https://github.com/dotnet/arcade 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd - + https://github.com/dotnet/symstore - 3a38ddf37bbb3bb5c2d73b6fd9a0aabcec5532e8 + f1b42731f9c33a8690b805bd1e80f2de2fc4c2de diff --git a/eng/Versions.props b/eng/Versions.props index 80f745fb05..f6c1a4613e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -9,7 +9,7 @@ - 1.0.116601 + 1.0.117301 2.1.16 $(MicrosoftNETCoreApp21Version) From 88af87eee4dcf56fc1624b0bced9b5c8f3b95d9a Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Tue, 24 Mar 2020 13:25:33 -0400 Subject: [PATCH 203/243] dotnet-dump analyze clrthreads -special (#943) * dotnet-dump analyze clrthreads -special Detect support at runtime --- src/SOS/Strike/strike.cpp | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 61b30ef010..0a3c3b1983 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -6892,25 +6892,37 @@ DECLARE_API(Threads) // We need to support minidumps for this command. BOOL bMiniDump = IsMiniDumpFile(); - if (bMiniDump && bPrintSpecialThreads) - { - Print("Special thread information is not available in mini dumps.\n"); - } - EnableDMLHolder dmlHolder(dml); try { Status = PrintThreadsFromThreadStore(bMiniDump, bPrintLiveThreadsOnly); - if (!bMiniDump && bPrintSpecialThreads) + if (bPrintSpecialThreads) { #ifdef FEATURE_PAL Print("\n-special not supported.\n"); -#else //FEATURE_PAL - HRESULT Status2 = PrintSpecialThreads(); - if (!SUCCEEDED(Status2)) - Status = Status2; -#endif //FEATURE_PAL +#else //FEATURE_PAL + BOOL bSupported = true; + + if (((g_pRuntime->GetRuntimeConfiguration() != IRuntime::WindowsCore) && + (g_pRuntime->GetRuntimeConfiguration() != IRuntime::WindowsDesktop))) + { + Print("Special thread information is only supported on Windows targets.\n"); + bSupported = false; + } + else if (bMiniDump) + { + Print("Special thread information is not available in mini dumps.\n"); + bSupported = false; + } + + if (bSupported) + { + HRESULT Status2 = PrintSpecialThreads(); + if (!SUCCEEDED(Status2)) + Status = Status2; + } +#endif // FEATURE_PAL } } catch (sos::Exception &e) From 3943f01ba82bb83cff15dd656e47638b06b707e7 Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Tue, 24 Mar 2020 16:09:52 -0400 Subject: [PATCH 204/243] Add ONLY_SUPPORTED_ON_WINDOWS_TARGET() (#948) Some commands are not included in Linux support. Add ONLY_SUPPORTED_ON_WINDOWS_TARGET() to disable these commands when working with Linux dumps on Windows. --- src/SOS/Strike/strike.cpp | 41 +++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 0a3c3b1983..262f93e35e 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -203,6 +203,7 @@ HMODULE g_hInstance = NULL; #ifdef FEATURE_PAL #define MINIDUMP_NOT_SUPPORTED() +#define ONLY_SUPPORTED_ON_WINDOWS_TARGET() #else // !FEATURE_PAL @@ -254,6 +255,14 @@ DECLARE_API (MinidumpMode) return Status; } +#define ONLY_SUPPORTED_ON_WINDOWS_TARGET() \ + if ((g_pRuntime->GetRuntimeConfiguration() != IRuntime::WindowsCore) && \ + (g_pRuntime->GetRuntimeConfiguration() != IRuntime::WindowsDesktop)) \ + { \ + ExtOut("This command is only supported for Windows targets\n"); \ + return Status; \ + } + #endif // FEATURE_PAL /**********************************************************************\ @@ -2997,7 +3006,8 @@ DECLARE_API(DumpVC) DECLARE_API(DumpRCW) { INIT_API(); - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); + BOOL dml = FALSE; StringHolder strObject; @@ -3103,7 +3113,8 @@ DECLARE_API(DumpRCW) DECLARE_API(DumpCCW) { INIT_API(); - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); + BOOL dml = FALSE; StringHolder strObject; @@ -3340,7 +3351,8 @@ DECLARE_API(DumpCCW) DECLARE_API(DumpPermissionSet) { INIT_API(); - MINIDUMP_NOT_SUPPORTED(); + MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); DWORD_PTR p_Object = NULL; @@ -3599,8 +3611,9 @@ void PrintGCStat(HeapStat *inStat, const char* label=NULL) DECLARE_API(TraverseHeap) { INIT_API(); - MINIDUMP_NOT_SUPPORTED(); - + MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); + BOOL bXmlFormat = FALSE; BOOL bVerify = FALSE; StringHolder Filename; @@ -5048,7 +5061,8 @@ DECLARE_API(AnalyzeOOM) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); + #ifndef FEATURE_PAL if (!InitializeHeapData ()) @@ -5125,6 +5139,7 @@ DECLARE_API(VerifyObj) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); TADDR taddrObj = 0; TADDR taddrMT; @@ -5187,6 +5202,7 @@ DECLARE_API(ListNearObj) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); #if !defined(FEATURE_PAL) @@ -5384,7 +5400,7 @@ DECLARE_API(GCHeapStat) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); #ifndef FEATURE_PAL @@ -6943,6 +6959,7 @@ DECLARE_API(Threads) DECLARE_API(WatsonBuckets) { INIT_API(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); // We don't need to support minidumps for this command. if (IsMiniDumpFile()) @@ -8388,6 +8405,7 @@ DECLARE_API(ThreadPool) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); DacpThreadpoolData threadpool; @@ -8794,7 +8812,7 @@ DECLARE_API(COMState) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); ULONG numThread; ULONG maxId; @@ -11732,7 +11750,8 @@ DECLARE_API(GCHandles) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); + try { GCHandlesImpl gchandles(args); @@ -12085,7 +12104,8 @@ DECLARE_API(ObjSize) #ifndef FEATURE_PAL INIT_API(); MINIDUMP_NOT_SUPPORTED(); - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); + BOOL dml = FALSE; StringHolder str_Object; @@ -12139,6 +12159,7 @@ DECLARE_API(GCHandleLeaks) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); ExtOut("-------------------------------------------------------------------------------\n"); ExtOut("GCHandleLeaks will report any GCHandles that couldn't be found in memory. \n"); From e8b55b588009abaabe33babba8df579f6c45ab77 Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Tue, 24 Mar 2020 19:17:38 -0400 Subject: [PATCH 205/243] Mark more APIs ONLY_SUPPORTED_ON_WINDOWS_TARGET (#949) * Mark more APIs ONLY_SUPPORTED_ON_WINDOWS_TARGET Mark all commands not reachable from Linux LLVM or dotnet-dump analyze on Linux ONLY_SUPPORTED_ON_WINDOWS_TARGET --- src/SOS/Strike/strike.cpp | 55 +++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 262f93e35e..0699aedbfd 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -215,11 +215,20 @@ HMODULE g_hInstance = NULL; return Status; \ } +#define ONLY_SUPPORTED_ON_WINDOWS_TARGET() \ + if ((g_pRuntime->GetRuntimeConfiguration() != IRuntime::WindowsCore) && \ + (g_pRuntime->GetRuntimeConfiguration() != IRuntime::WindowsDesktop)) \ + { \ + ExtOut("This command is only supported for Windows targets\n"); \ + return Status; \ + } + #include "safemath.h" DECLARE_API (MinidumpMode) { INIT_API (); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); DWORD_PTR Value=0; CMDValue arg[] = @@ -255,14 +264,6 @@ DECLARE_API (MinidumpMode) return Status; } -#define ONLY_SUPPORTED_ON_WINDOWS_TARGET() \ - if ((g_pRuntime->GetRuntimeConfiguration() != IRuntime::WindowsCore) && \ - (g_pRuntime->GetRuntimeConfiguration() != IRuntime::WindowsDesktop)) \ - { \ - ExtOut("This command is only supported for Windows targets\n"); \ - return Status; \ - } - #endif // FEATURE_PAL /**********************************************************************\ @@ -1067,7 +1068,8 @@ DECLARE_API(DumpSig) INIT_API(); MINIDUMP_NOT_SUPPORTED(); - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); + // // Fetch arguments // @@ -1114,7 +1116,7 @@ DECLARE_API(DumpSigElem) INIT_API(); MINIDUMP_NOT_SUPPORTED(); - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); // // Fetch arguments @@ -3749,6 +3751,7 @@ DECLARE_API(DumpRuntimeTypes) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); BOOL dml = FALSE; @@ -4926,7 +4929,8 @@ DECLARE_API(VerifyHeap) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); + if (!g_snapshot.Build()) { ExtOut("Unable to build snapshot of the garbage collector state\n"); @@ -5820,6 +5824,7 @@ DECLARE_API(RCWCleanupList) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); DWORD_PTR p_CleanupList = GetExpression(args); @@ -8717,7 +8722,8 @@ DECLARE_API(FindAppDomain) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); + DWORD_PTR p_Object = NULL; BOOL dml = FALSE; @@ -8987,7 +8993,8 @@ DECLARE_API(EHInfo) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); + DWORD_PTR dwStartAddr = NULL; BOOL dml = FALSE; @@ -9068,7 +9075,7 @@ DECLARE_API(GCInfo) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); TADDR taStartAddr = NULL; TADDR taGCInfoAddr; @@ -9365,8 +9372,8 @@ DECLARE_API(u) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); - - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); + DWORD_PTR dwStartAddr = NULL; BOOL fWithGCInfo = FALSE; BOOL fWithEHInfo = FALSE; @@ -9988,7 +9995,8 @@ DECLARE_API (DumpGCLog) { INIT_API_NODAC(); MINIDUMP_NOT_SUPPORTED(); - + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); + const char* fileName = "GCLog.txt"; while (isspace (*args)) @@ -10088,6 +10096,7 @@ DECLARE_API (DumpGCConfigLog) INIT_API(); #ifdef GC_CONFIG_DRIVEN MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); const char* fileName = "GCConfigLog.txt"; @@ -10304,6 +10313,7 @@ DECLARE_API(DumpGCData) #ifdef GC_CONFIG_DRIVEN MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); if (!InitializeHeapData ()) { @@ -10533,6 +10543,7 @@ DECLARE_API (ProcInfo) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); if (IsDumpFile()) { @@ -10812,6 +10823,7 @@ DECLARE_API(Token2EE) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); StringHolder DllName; ULONG64 token = 0; @@ -11030,6 +11042,7 @@ DECLARE_API(PathTo) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); DWORD_PTR root = NULL; DWORD_PTR target = NULL; @@ -11248,6 +11261,7 @@ DECLARE_API(FindRoots) #ifndef FEATURE_PAL INIT_API(); MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); if (IsDumpFile()) { @@ -11773,6 +11787,7 @@ DECLARE_API(GCHandles) DECLARE_API(TraceToCode) { INIT_API_NODAC(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); _ASSERTE(g_pRuntime != nullptr); while(true) @@ -11864,6 +11879,7 @@ DECLARE_API(TraceToCode) DECLARE_API(GetCodeTypeFlags) { INIT_API(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); _ASSERTE(g_pRuntime != nullptr); char buffer[100+mdNameLen]; @@ -14413,6 +14429,7 @@ DECLARE_API(SaveModule) { INIT_API(); MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); StringHolder Location; DWORD_PTR moduleAddr = NULL; @@ -15372,6 +15389,7 @@ HRESULT ImplementEFNGetManagedExcepStack( DECLARE_API(VerifyStackTrace) { INIT_API(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); BOOL bVerifyManagedExcepStack = FALSE; CMDOption option[] = @@ -15577,6 +15595,7 @@ DECLARE_API(SaveState) { INIT_API_NOEE(); MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); StringHolder filePath; CMDValue arg[] = @@ -15616,6 +15635,7 @@ DECLARE_API(SuppressJitOptimization) { INIT_API_NOEE(); MINIDUMP_NOT_SUPPORTED(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); StringHolder onOff; CMDValue arg[] = @@ -15924,6 +15944,7 @@ DECLARE_API(VerifyGMT) HRESULT hr = _EFN_GetManagedThread(client, osThreadId, &managedThread); { INIT_API(); + ONLY_SUPPORTED_ON_WINDOWS_TARGET(); if (SUCCEEDED(hr)) { ExtOut("%08x %p\n", osThreadId, managedThread); From 7310001c01c1f414dea24f858902af8cc6ef4722 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Tue, 24 Mar 2020 17:51:54 -0700 Subject: [PATCH 206/243] Support testing internal service releases (#926) Support testing internal service releases Adds 3 pipeline variables that need to be set testing an internal service release: InternalRuntimeSourceVersion - the service release version i.e. 2.1.17, 3.1.3, etc. InternalRuntimeSourceFeed - the service release internal feed InternalRuntimeSourceFeedKey - the service release feed PAT No longer runs the tests on desktop framework if private build or internal service release. Remove dailytest option --- diagnostics.yml | 3 +- eng/InstallRuntimes.proj | 81 ++++++++++++++----- eng/build.ps1 | 27 +++++-- eng/build.sh | 59 +++++++++++--- eng/build.yml | 13 +++ .../Unix/Debugger.Tests.Config.txt | 43 +++++----- .../Windows/Debugger.Tests.Config.txt | 54 ++++++++----- 7 files changed, 201 insertions(+), 79 deletions(-) diff --git a/diagnostics.yml b/diagnostics.yml index 8fe76a879f..34c0cd89e6 100644 --- a/diagnostics.yml +++ b/diagnostics.yml @@ -17,7 +17,6 @@ variables: value: DotNetCore - name: _InternalBuildArgs value: '' - - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - name: _SignType value: real @@ -26,7 +25,7 @@ variables: - name: _InternalBuildArgs value: /p:DotNetSignType=$(_SignType) /p:TeamName=$(_TeamName) - /p:DotNetPublishUsingPipelines=$(PublishPackages) + /p:DotNetPublishUsingPipelines=true /p:OfficialBuildId=$(BUILD.BUILDNUMBER) stages: diff --git a/eng/InstallRuntimes.proj b/eng/InstallRuntimes.proj index 4b4b6255ff..20e687a735 100644 --- a/eng/InstallRuntimes.proj +++ b/eng/InstallRuntimes.proj @@ -2,8 +2,14 @@ - false $(Platform) x64 + false + true + false + true + -runtimesourcefeed '$(RuntimeSourceFeed)' -runtimesourcefeedkey '$(RuntimeSourceFeedKey)' @@ -58,12 +68,24 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - diff --git a/eng/build.ps1 b/eng/build.ps1 index 820720139b..6d3769d8f3 100644 --- a/eng/build.ps1 +++ b/eng/build.ps1 @@ -7,9 +7,12 @@ Param( [switch] $ci, [switch] $skipmanaged, [switch] $skipnative, - [switch] $dailytest, [string] $privatebuildpath = "", [switch] $cleanupprivatebuild, + [ValidatePattern("(default|\d+\.\d+.\d+(-[a-z0-9\.]+)?)")][string] $dotnetruntimeversion = 'default', + [ValidatePattern("(default|\d+\.\d+.\d+(-[a-z0-9\.]+)?)")][string] $dotnetruntimedownloadversion= 'default', + [string] $runtimesourcefeed = '', + [string] $runtimesourcefeedkey = '', [Parameter(ValueFromRemainingArguments=$true)][String[]] $remainingargs ) @@ -47,16 +50,11 @@ $engroot = Join-Path $reporoot "eng" $artifactsdir = Join-Path $reporoot "artifacts" $logdir = Join-Path $artifactsdir "log" $logdir = Join-Path $logdir Windows_NT.$architecture.$configuration -$dailytestproperty = "false" if ($ci) { $remainingargs = "-ci " + $remainingargs } -if ($dailytest -or $privatebuildpath -ne "") { - $dailytestproperty = "true" -} - # Remove the private build registry keys if ($cleanupprivatebuild) { Invoke-Expression "& `"$engroot\common\msbuild.ps1`" $engroot\CleanupPrivateBuild.csproj /v:$verbosity /t:CleanupPrivateBuild /p:BuildArch=$architecture /p:TestArchitectures=$architecture" @@ -80,9 +78,22 @@ if (-not $skipnative) { } # Run the xunit tests -if ($test -or $dailytest) { +if ($test) { if (-not $crossbuild) { - & "$engroot\common\build.ps1" -test -configuration $configuration -verbosity $verbosity -ci:$ci /bl:$logdir\Test.binlog /p:BuildArch=$architecture /p:TestArchitectures=$architecture /p:DailyTest=$dailytestproperty /p:PrivateBuildPath=$privatebuildpath + & "$engroot\common\build.ps1" ` + -test ` + -configuration $configuration ` + -verbosity $verbosity ` + -ci:$ci ` + /bl:$logdir\Test.binlog ` + /p:BuildArch=$architecture ` + /p:TestArchitectures=$architecture ` + /p:PrivateBuildPath="$privatebuildpath" ` + /p:DotnetRuntimeVersion="$dotnetruntimeversion" ` + /p:DotnetRuntimeDownloadVersion="$dotnetruntimedownloadversion" ` + /p:RuntimeSourceFeed="$runtimesourcefeed" ` + /p:RuntimeSourceFeedKey="$runtimesourcefeedkey" + if ($lastExitCode -ne 0) { exit $lastExitCode } diff --git a/eng/build.sh b/eng/build.sh index bf621c9791..da7042e180 100755 --- a/eng/build.sh +++ b/eng/build.sh @@ -29,13 +29,16 @@ __ManagedBuild=true __NativeBuild=true __CrossBuild=false __Test=false -__DailyTest=false __PrivateBuildPath="" __CI=false __Verbosity=minimal __ManagedBuildArgs= __TestArgs= __UnprocessedBuildArgs= +__DotnetRuntimeVersion='default' +__DotnetRuntimeDownloadVersion='default' +__RuntimeSourceFeed='' +__RuntimeSourceFeedKey='' usage() { @@ -43,7 +46,6 @@ usage() echo "--skipmanaged- Skip building managed components" echo "--skipnative - Skip building native components" echo "--test - run xunit tests" - echo "--dailytest - test components for daily build job" echo "--privatebuildpath - path to local private runtime build to test" echo "--architecture " echo "--configuration " @@ -175,13 +177,28 @@ while :; do __Test=true ;; - -dailytest) - __DailyTest=true + -privatebuildpath) + __PrivateBuildPath="$2" + shift ;; - -privatebuildpath) - __PrivateBuildPath=$2 - __DailyTest=true + -dotnetruntimeversion) + __DotnetRuntimeVersion="$2" + shift + ;; + + -dotnetruntimedownloadversion) + __DotnetRuntimeDownloadVersion="$2" + shift + ;; + + -runtimesourcefeed) + __RuntimeSourceFeed="$2" + shift + ;; + + -runtimesourcefeedkey) + __RuntimeSourceFeedKey="$2" shift ;; @@ -451,7 +468,19 @@ fi if [ $__NativeBuild == true ]; then echo "Generating Version Source File" __GenerateVersionLog="$__LogDir/GenerateVersion.binlog" - "$__ProjectRoot/eng/common/msbuild.sh" $__ProjectRoot/eng/CreateVersionFile.csproj /v:$__Verbosity /bl:$__GenerateVersionLog /t:GenerateVersionFiles /restore /p:GenerateVersionSourceFile=true /p:NativeVersionSourceFile="$__IntermediatesDir/version.cpp" /p:Configuration="$__BuildType" /p:Platform="$__BuildArch" $__UnprocessedBuildArgs + + "$__ProjectRoot/eng/common/msbuild.sh" \ + $__ProjectRoot/eng/CreateVersionFile.csproj \ + /v:$__Verbosity \ + /bl:$__GenerateVersionLog \ + /t:GenerateVersionFiles \ + /restore \ + /p:GenerateVersionSourceFile=true \ + /p:NativeVersionSourceFile="$__IntermediatesDir/version.cpp" \ + /p:Configuration="$__BuildType" \ + /p:Platform="$__BuildArch" \ + $__UnprocessedBuildArgs + if [ $? != 0 ]; then echo "Generating Version Source File FAILED" exit 1 @@ -506,7 +535,19 @@ if [ $__Test == true ]; then echo "lldb: '$LLDB_PATH' gdb: '$GDB_PATH'" - "$__ProjectRoot/eng/common/build.sh" --test --configuration "$__BuildType" --verbosity "$__Verbosity" /bl:$__LogDir/Test.binlog /p:BuildArch=$__BuildArch /p:DailyTest=$__DailyTest /p:PrivateBuildPath=$__PrivateBuildPath $__TestArgs + "$__ProjectRoot/eng/common/build.sh" \ + --test \ + --configuration "$__BuildType" \ + --verbosity "$__Verbosity" \ + /bl:$__LogDir/Test.binlog \ + /p:BuildArch="$__BuildArch" \ + /p:PrivateBuildPath="$__PrivateBuildPath" \ + /p:DotnetRuntimeVersion="$__DotnetRuntimeVersion" \ + /p:DotnetRuntimeDownloadVersion="$__DotnetRuntimeDownloadVersion" \ + /p:RuntimeSourceFeed="$__RuntimeSourceFeed" \ + /p:RuntimeSourceFeedKey="$__RuntimeSourceFeedKey" \ + $__TestArgs + if [ $? != 0 ]; then exit 1 fi diff --git a/eng/build.yml b/eng/build.yml index c51ac37d1a..ba780b413f 100644 --- a/eng/build.yml +++ b/eng/build.yml @@ -85,6 +85,16 @@ jobs: - _HelixType: build/product - _HelixBuildConfig: $(_BuildConfig) - _Pipeline_StreamDumpDir: $(Build.SourcesDirectory)/artifacts/tmp/$(_BuildConfig)/streams + - _InternalInstallArgs: '' + + # For testing msrc's and service releases. The RuntimeSourceVersion is either "default" or the service release version to test + - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - group: DotNet-MSRC-Storage + - _InternalInstallArgs: + -dotnetruntimeversion '$(DotnetRuntimeVersion)' + -dotnetruntimedownloadversion '$(DotnetRuntimeDownloadVersion)' + -runtimesourcefeed '$(dotnetfeedmsrc-private-feed-url)' + -runtimesourcefeedkey '$(dotnetclimsrc-read-sas-token-base64)' # Only enable publishing in non-public, non PR scenarios. - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: @@ -110,6 +120,7 @@ jobs: -architecture $(_BuildArch) -prepareMachine /p:OfficialBuildId=$(BUILD.BUILDNUMBER) + $(_InternalInstallArgs) displayName: Build / Test condition: succeeded() @@ -132,6 +143,7 @@ jobs: --prepareMachine /p:OfficialBuildId=$(BUILD.BUILDNUMBER) /p:BUILD_BUILDNUMBER=$(BUILD.BUILDNUMBER) + $(_InternalInstallArgs) displayName: Docker Build / Test condition: succeeded() @@ -143,6 +155,7 @@ jobs: --architecture $(_BuildArch) --prepareMachine /p:OfficialBuildId=$(BUILD.BUILDNUMBER) + $(_InternalInstallArgs) displayName: Build / Test condition: succeeded() diff --git a/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt b/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt index 1a57d4fd46..e937c4aa4a 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt +++ b/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt @@ -21,6 +21,18 @@ $(RootBinDir)/TestResults/$(TargetConfiguration)/sos.unittests_$(Timestamp) $(RootBinDir)/tmp/$(TargetConfiguration)\dumps + false + true + true + + true + false + + + netcoreapp3.0 + netcoreapp3.0 + netcoreapp2.1 + $(RepoRootDir)/src/SOS/SOS.UnitTests/Debuggees sdk.prebuilt $(RootBinDir) @@ -36,20 +48,19 @@ Default (prebuilt) --> - - - @@ -62,25 +73,20 @@ SOS.StackAndOtherTests - - - @@ -88,22 +94,21 @@ - - + https://github.com/dotnet/runtime - 6adb31375f575f63652ded66dabb33fcb01492fb + c39af4fc45c05e862815c34239b33de3b0259705 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index f6c1a4613e..184b481a0d 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.3.20174.1 + 5.0.0-preview.3.20174.7 5.0.0-preview.3.20173.4 From 03c0f226e1bdc91fbc7fd27007a7f79727ee3e13 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 25 Mar 2020 12:43:36 +0000 Subject: [PATCH 209/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200324.9 (#953) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20174.9 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1a10c43d44..4a7f5c2e31 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -22,9 +22,9 @@ https://github.com/dotnet/runtime c39af4fc45c05e862815c34239b33de3b0259705 - + https://github.com/dotnet/aspnetcore - 49f23649918407f72acce29f143e3c402e040c59 + bd651695ffc326e8a8be4de0fd399571656d153f diff --git a/eng/Versions.props b/eng/Versions.props index 184b481a0d..6f66119f55 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -20,7 +20,7 @@ 5.0.0-preview.3.20174.7 - 5.0.0-preview.3.20173.4 + 5.0.0-preview.3.20174.9 From 8fe68a327b6cc9819580cf5d9c6e6442d1bffe5b Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Wed, 25 Mar 2020 17:45:52 -0400 Subject: [PATCH 210/243] dotnet-dump analyze enable cross DAC lookup (#954) * Fix SOSHost.IsCoreClrRuntimeModule() * Fix cross DAC LoadNativeSymbols() This allows the SOSHost to find the cross DAC in the symbol cache * Feedback When creating a SymbolStoreKey semi-clone copy all the fields --- src/SOS/SOS.Hosting/SOSHost.cs | 26 +++++++++++++------------- src/SOS/SOS.NETCore/SymbolReader.cs | 12 +++++++++++- src/Tools/dotnet-dump/Analyzer.cs | 4 +++- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/SOS/SOS.Hosting/SOSHost.cs b/src/SOS/SOS.Hosting/SOSHost.cs index 115bdeb236..b117953d57 100644 --- a/src/SOS/SOS.Hosting/SOSHost.cs +++ b/src/SOS/SOS.Hosting/SOSHost.cs @@ -154,8 +154,6 @@ struct SOSNetCoreCallbacks const string DesktopRuntimeModuleName = "clr"; - private static readonly string s_coreclrModuleName; - internal readonly IDataReader DataReader; internal readonly AnalyzeContext AnalyzeContext; @@ -174,16 +172,6 @@ struct SOSNetCoreCallbacks static SOSHost() { AssemblyResolver.Enable(); - - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { - s_coreclrModuleName = "coreclr"; - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { - s_coreclrModuleName = "libcoreclr.so"; - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { - s_coreclrModuleName = "libcoreclr.dylib"; - } } /// @@ -1110,7 +1098,19 @@ internal int GetRegister( internal static bool IsCoreClrRuntimeModule(ModuleInfo module) { - return IsModuleEqual(module, s_coreclrModuleName); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return IsModuleEqual(module, "coreclr") || IsModuleEqual(module, "libcoreclr"); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + return IsModuleEqual(module, "libcoreclr.so"); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + return IsModuleEqual(module, "libcoreclr.dylib"); + } + return false; } internal static bool IsDesktopRuntimeModule(ModuleInfo module) diff --git a/src/SOS/SOS.NETCore/SymbolReader.cs b/src/SOS/SOS.NETCore/SymbolReader.cs index 1ee6180939..b7af5278a4 100644 --- a/src/SOS/SOS.NETCore/SymbolReader.cs +++ b/src/SOS/SOS.NETCore/SymbolReader.cs @@ -300,8 +300,18 @@ public static void LoadNativeSymbols(SymbolFileCallback callback, IntPtr paramet try { IEnumerable keys = generator.GetKeys(flags); - foreach (SymbolStoreKey key in keys) + foreach (SymbolStoreKey forKey in keys) { + SymbolStoreKey key = forKey; + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && key.FullPathName.Equals("libmscordaccore.so")) + { + // We are opening a Linux dump on Windows + // We need to use the Windows index and filename + key = new SymbolStoreKey(key.Index.Replace("libmscordaccore.so", "mscordaccore.dll"), + "mscordaccore.dll", + key.IsClrSpecialFile, + key.PdbChecksums); + } string moduleFileName = Path.GetFileName(key.FullPathName); s_tracer.Verbose("{0} {1}", key.FullPathName, key.Index); diff --git a/src/Tools/dotnet-dump/Analyzer.cs b/src/Tools/dotnet-dump/Analyzer.cs index ead2bad85d..ed93268e0c 100644 --- a/src/Tools/dotnet-dump/Analyzer.cs +++ b/src/Tools/dotnet-dump/Analyzer.cs @@ -247,7 +247,9 @@ private string GetDacFile(ClrInfo clrInfo) // We are opening a Linux dump on Windows // We need to use the Windows index and filename key = new SymbolStoreKey(key.Index.Replace("libmscordaccore.so", "mscordaccore.dll"), - key.FullPathName.Replace("libmscordaccore.so", "mscordaccore.dll")); + key.FullPathName.Replace("libmscordaccore.so", "mscordaccore.dll"), + key.IsClrSpecialFile, + key.PdbChecksums); } } else From 00332d8d72c4690f0bce7f5ae55cc25ff3c0f69d Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2020 12:43:33 +0000 Subject: [PATCH 211/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200325.16 (#957) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20175.16 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4a7f5c2e31..340d301789 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -22,9 +22,9 @@ https://github.com/dotnet/runtime c39af4fc45c05e862815c34239b33de3b0259705 - + https://github.com/dotnet/aspnetcore - bd651695ffc326e8a8be4de0fd399571656d153f + 8e3029fb225ee1b4d409eddcdc937c4e786560e0 diff --git a/eng/Versions.props b/eng/Versions.props index 6f66119f55..df671b17d8 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -20,7 +20,7 @@ 5.0.0-preview.3.20174.7 - 5.0.0-preview.3.20174.9 + 5.0.0-preview.3.20175.16 From 4705360f35598b5aa646526fe93a453c6b8db778 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2020 13:06:42 +0000 Subject: [PATCH 212/243] Update dependencies from https://github.com/dotnet/symstore build 20200325.1 (#958) - Microsoft.SymbolStore - 1.0.117501 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 340d301789..5cc9c822f7 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -8,9 +8,9 @@ https://github.com/dotnet/arcade 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd - + https://github.com/dotnet/symstore - f1b42731f9c33a8690b805bd1e80f2de2fc4c2de + 6d6176230f6fbe8b6605decd28ec4a245675a6a1 diff --git a/eng/Versions.props b/eng/Versions.props index df671b17d8..dd78d41a5b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -9,7 +9,7 @@ - 1.0.117301 + 1.0.117501 2.1.16 $(MicrosoftNETCoreApp21Version) From eb8893e389ade2ca67ae59f54ae23841e2b1d1a7 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2020 12:36:28 +0000 Subject: [PATCH 213/243] [master] Update dependencies from dotnet/runtime (#956) * Update dependencies from https://github.com/dotnet/runtime build 20200325.10 - Microsoft.NETCore.App - 5.0.0-preview.3.20175.10 * Update dependencies from https://github.com/dotnet/runtime build 20200326.12 - Microsoft.NETCore.App - 5.0.0-preview.3.20176.12 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 5cc9c822f7..054ab65f6a 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd - + https://github.com/dotnet/runtime - c39af4fc45c05e862815c34239b33de3b0259705 + bd30e154150b8568c684e223af1f623d26bd68b6 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index dd78d41a5b..0c457f2f4e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.3.20174.7 + 5.0.0-preview.3.20176.12 5.0.0-preview.3.20175.16 From 94ad4a910fbc81c8d9dcd4fee8343c81c300c4a3 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Fri, 27 Mar 2020 18:25:17 -0700 Subject: [PATCH 214/243] Update core dump debugging workflow (#962) --- documentation/debugging-coredump.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/documentation/debugging-coredump.md b/documentation/debugging-coredump.md index 9a310af209..ef9fe4e26c 100644 --- a/documentation/debugging-coredump.md +++ b/documentation/debugging-coredump.md @@ -25,14 +25,18 @@ Copy the core dump to a tmp directory. ~$ mkdir /tmp/dump ~$ cp ~/coredump.32232 /tmp/dump -Download the host program for the core dump: +Download the host program, modules and symbols for the core dump: + + ~$ dotnet-symbol /tmp/dump/coredump.32232 + +If your project/program binaries are not on the machine the core dump is being loaded on, copy them to a temporary directory. You can use the lldb/SOS command `setsymbolserver -directory ` to add this directory to the search path. + +Alternatively, you can download just the host program for the core dump (this all lldb needs) if you only need symbols for the managed modules. The `loadsymbols` command in SOS will attempt to download the native runtime symbols, but this currently doesn't work on 5.0. ~$ dotnet-symbol --host-only /tmp/dump/coredump.32232 If the `--host-only` option is not found, update dotnet-symbol to the latest with the above step. -If your project/program binaries are not on the machine the core dump is being loaded on, copy them to a temporary directory. You can use the lldb/SOS command `setsymbolserver -directory ` to add this directory to the search path. - ### Install lldb ### See the instructions on the main [README.md](../README.md) under "Getting lldb". From b1a157905bc97f635b951f3d844fa00ba6146e11 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 28 Mar 2020 12:36:18 +0000 Subject: [PATCH 215/243] Update dependencies from https://github.com/dotnet/runtime build 20200328.1 (#963) - Microsoft.NETCore.App - 5.0.0-preview.3.20178.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 054ab65f6a..a6631fdba3 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd - + https://github.com/dotnet/runtime - bd30e154150b8568c684e223af1f623d26bd68b6 + 65d5a72c5d13a4d69225a72bb4dcd4e6dce44034 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 0c457f2f4e..e534553ded 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.3.20176.12 + 5.0.0-preview.3.20178.1 5.0.0-preview.3.20175.16 From 4d4fca0614ff07e0dcb0f19618e4ed593ba9dc91 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 28 Mar 2020 12:42:18 +0000 Subject: [PATCH 216/243] [master] Update dependencies from dotnet/aspnetcore (#960) * Update dependencies from https://github.com/dotnet/aspnetcore build 20200326.15 - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20176.15 * Update dependencies from https://github.com/dotnet/aspnetcore build 20200327.8 - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20177.8 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a6631fdba3..3cc2dc96c8 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -22,9 +22,9 @@ https://github.com/dotnet/runtime 65d5a72c5d13a4d69225a72bb4dcd4e6dce44034 - + https://github.com/dotnet/aspnetcore - 8e3029fb225ee1b4d409eddcdc937c4e786560e0 + 2766f202a23f069bc7fae82e2e003007b1976c8d diff --git a/eng/Versions.props b/eng/Versions.props index e534553ded..c90d2fb448 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -20,7 +20,7 @@ 5.0.0-preview.3.20178.1 - 5.0.0-preview.3.20175.16 + 5.0.0-preview.3.20177.8 From e3867243db95f44193aefcdc030fdb641d89c12b Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sun, 29 Mar 2020 12:35:12 +0000 Subject: [PATCH 217/243] Update dependencies from https://github.com/dotnet/runtime build 20200329.1 (#964) - Microsoft.NETCore.App - 5.0.0-preview.3.20179.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 3cc2dc96c8..cdcd466b24 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd - + https://github.com/dotnet/runtime - 65d5a72c5d13a4d69225a72bb4dcd4e6dce44034 + 5eda36ed557d789d888647745782b261472b9fa3 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index c90d2fb448..66b532eb4c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.3.20178.1 + 5.0.0-preview.3.20179.1 5.0.0-preview.3.20177.8 From 8fa2c7b98e8fca315f36ce8df2b426479d6004e1 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sun, 29 Mar 2020 12:41:53 +0000 Subject: [PATCH 218/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200328.11 (#965) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20178.11 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index cdcd466b24..a8382e31e8 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -22,9 +22,9 @@ https://github.com/dotnet/runtime 5eda36ed557d789d888647745782b261472b9fa3 - + https://github.com/dotnet/aspnetcore - 2766f202a23f069bc7fae82e2e003007b1976c8d + e0231dadcaeb14f6babe8743a2e296bf03e09eea diff --git a/eng/Versions.props b/eng/Versions.props index 66b532eb4c..6665487e50 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -20,7 +20,7 @@ 5.0.0-preview.3.20179.1 - 5.0.0-preview.3.20177.8 + 5.0.0-preview.3.20178.11 From 20421df1a3d734d73bf86e742ed5ea48181878a8 Mon Sep 17 00:00:00 2001 From: Mohammad Mustakim Ali Date: Sun, 29 Mar 2020 17:16:32 +0100 Subject: [PATCH 219/243] Update dotnet-tools.md --- documentation/design-docs/dotnet-tools.md | 52 ++++++++++++----------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/documentation/design-docs/dotnet-tools.md b/documentation/design-docs/dotnet-tools.md index 506644b045..e3d228d1ea 100644 --- a/documentation/design-docs/dotnet-tools.md +++ b/documentation/design-docs/dotnet-tools.md @@ -666,34 +666,36 @@ Examples: REPORT - dotnet-gcdump report -f|--file + dotnet-gcdump report Generate report into stdout from a previously generated gcdump or from a running process. Usage: - dotnet-gcdump report [options] - + dotnet-gcdump report [options] [] + + Arguments: + The file to read gcdump from. + Options: - -f, --file The file to read gcdump from. - -p, --process-id The process id to collect the trace. - -t, --report-type The type of report to generate. Available options: heapstat (default) + -p, --process-id The process id to collect the trace. + -t, --report-type The type of report to generate. Available options: heapstat (default) Examples: - $ dotnet gcdump report -f 20200207_094403_19847.gcdump | head -9 + $ dotnet gcdump report 20200207_094403_19847.gcdump | head -9 5,080,860 GC Heap bytes 66,289 GC Heap objects Object Bytes Type - 131,096 System.Byte[] (Bytes > 100K) [System.Private.CoreLib.dll] - 57,756 System.String (Bytes > 10K) [System.Private.CoreLib.dll] - 31,128 System.Int32[] (Bytes > 10K) [System.Private.CoreLib.dll] - 28,605 System.Byte[] (Bytes > 10K) [System.Private.CoreLib.dll] - 22,432 System.Object[] (Bytes > 10K) [System.Private.CoreLib.dll] - 12,476 System.Char[] (Bytes > 10K) [System.Private.CoreLib.dll] - 8,216 System.Char[] (Bytes > 1K) [System.Private.CoreLib.dll] - 8,216 System.Byte[] (Bytes > 1K) [System.Private.CoreLib.dll] - 8,216 System.UInt32[] (Bytes > 1K) [System.Private.CoreLib.dll] + 131,096 System.Byte[] (Bytes > 100K) [System.Private.CoreLib.dll] + 57,756 System.String (Bytes > 10K) [System.Private.CoreLib.dll] + 31,128 System.Int32[] (Bytes > 10K) [System.Private.CoreLib.dll] + 28,605 System.Byte[] (Bytes > 10K) [System.Private.CoreLib.dll] + 22,432 System.Object[] (Bytes > 10K) [System.Private.CoreLib.dll] + 12,476 System.Char[] (Bytes > 10K) [System.Private.CoreLib.dll] + 8,216 System.Char[] (Bytes > 1K) [System.Private.CoreLib.dll] + 8,216 System.Byte[] (Bytes > 1K) [System.Private.CoreLib.dll] + 8,216 System.UInt32[] (Bytes > 1K) [System.Private.CoreLib.dll] $ dotnet gcdump report -p 1752 | head -9 @@ -701,15 +703,15 @@ Examples: 66,289 GC Heap objects Object Bytes Type - 131,096 System.Byte[] (Bytes > 100K) [System.Private.CoreLib.dll] - 57,756 System.String (Bytes > 10K) [System.Private.CoreLib.dll] - 31,128 System.Int32[] (Bytes > 10K) [System.Private.CoreLib.dll] - 28,605 System.Byte[] (Bytes > 10K) [System.Private.CoreLib.dll] - 22,432 System.Object[] (Bytes > 10K) [System.Private.CoreLib.dll] - 12,476 System.Char[] (Bytes > 10K) [System.Private.CoreLib.dll] - 8,216 System.Char[] (Bytes > 1K) [System.Private.CoreLib.dll] - 8,216 System.Byte[] (Bytes > 1K) [System.Private.CoreLib.dll] - 8,216 System.UInt32[] (Bytes > 1K) [System.Private.CoreLib.dll] + 131,096 System.Byte[] (Bytes > 100K) [System.Private.CoreLib.dll] + 57,756 System.String (Bytes > 10K) [System.Private.CoreLib.dll] + 31,128 System.Int32[] (Bytes > 10K) [System.Private.CoreLib.dll] + 28,605 System.Byte[] (Bytes > 10K) [System.Private.CoreLib.dll] + 22,432 System.Object[] (Bytes > 10K) [System.Private.CoreLib.dll] + 12,476 System.Char[] (Bytes > 10K) [System.Private.CoreLib.dll] + 8,216 System.Char[] (Bytes > 1K) [System.Private.CoreLib.dll] + 8,216 System.Byte[] (Bytes > 1K) [System.Private.CoreLib.dll] + 8,216 System.UInt32[] (Bytes > 1K) [System.Private.CoreLib.dll] ## Future suggestions From 07e291d8f01e9dda21d58e35cfaba7c81fb25cc7 Mon Sep 17 00:00:00 2001 From: Mohammad Mustakim Ali Date: Sun, 29 Mar 2020 17:29:46 +0100 Subject: [PATCH 220/243] Update dotnet-tools.md --- documentation/design-docs/dotnet-tools.md | 50 ++++++++++------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/documentation/design-docs/dotnet-tools.md b/documentation/design-docs/dotnet-tools.md index e3d228d1ea..fc632a95dd 100644 --- a/documentation/design-docs/dotnet-tools.md +++ b/documentation/design-docs/dotnet-tools.md @@ -1,4 +1,4 @@ -# Dotnet Diagnostic Tools CLI Design +# Dotnet Diagnostic Tools CLI Design ## User workflows @@ -682,36 +682,30 @@ REPORT Examples: - $ dotnet gcdump report 20200207_094403_19847.gcdump | head -9 - 5,080,860 GC Heap bytes - 66,289 GC Heap objects - - Object Bytes Type - 131,096 System.Byte[] (Bytes > 100K) [System.Private.CoreLib.dll] - 57,756 System.String (Bytes > 10K) [System.Private.CoreLib.dll] - 31,128 System.Int32[] (Bytes > 10K) [System.Private.CoreLib.dll] - 28,605 System.Byte[] (Bytes > 10K) [System.Private.CoreLib.dll] - 22,432 System.Object[] (Bytes > 10K) [System.Private.CoreLib.dll] - 12,476 System.Char[] (Bytes > 10K) [System.Private.CoreLib.dll] - 8,216 System.Char[] (Bytes > 1K) [System.Private.CoreLib.dll] - 8,216 System.Byte[] (Bytes > 1K) [System.Private.CoreLib.dll] - 8,216 System.UInt32[] (Bytes > 1K) [System.Private.CoreLib.dll] + $ dotnet gcdump report 20200207_094403_19847.gcdump + 4,786,378 GC Heap bytes + 63,201 GC Heap objects + Object Bytes Count Type + 131,096 1 System.Byte[] (Bytes > 100K) [System.Private.CoreLib.dll] + 57,756 1 System.String (Bytes > 10K) [System.Private.CoreLib.dll] + 31,128 1 System.Int32[] (Bytes > 10K) [System.Private.CoreLib.dll] + 28,605 5 System.Byte[] (Bytes > 10K) [System.Private.CoreLib.dll] + 22,432 9 System.Object[] (Bytes > 10K) [System.Private.CoreLib.dll] + ... $ dotnet gcdump report -p 1752 | head -9 - 5,080,860 GC Heap bytes - 66,289 GC Heap objects - - Object Bytes Type - 131,096 System.Byte[] (Bytes > 100K) [System.Private.CoreLib.dll] - 57,756 System.String (Bytes > 10K) [System.Private.CoreLib.dll] - 31,128 System.Int32[] (Bytes > 10K) [System.Private.CoreLib.dll] - 28,605 System.Byte[] (Bytes > 10K) [System.Private.CoreLib.dll] - 22,432 System.Object[] (Bytes > 10K) [System.Private.CoreLib.dll] - 12,476 System.Char[] (Bytes > 10K) [System.Private.CoreLib.dll] - 8,216 System.Char[] (Bytes > 1K) [System.Private.CoreLib.dll] - 8,216 System.Byte[] (Bytes > 1K) [System.Private.CoreLib.dll] - 8,216 System.UInt32[] (Bytes > 1K) [System.Private.CoreLib.dll] + 1,302,804 GC Heap bytes + 16,211 GC Heap objects + 27,858 Total references + + Object Bytes Count Type + 31,128 1 System.Int32[] (Bytes > 10K) [System.Private.CoreLib.dll] + 24,468 1 System.String (Bytes > 10K) [System.Private.CoreLib.dll] + 12,800 3 System.Object[] (Bytes > 10K) [System.Private.CoreLib.dll] + 7,904 1 Entry[] (Bytes > 1K) [System.Private.CoreLib.dll] + 7,074 4 System.String (Bytes > 1K) [System.Private.CoreLib.dll] + ... ## Future suggestions From d372c87f103e6c581ff82460904d338a41875eba Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2020 12:40:59 +0000 Subject: [PATCH 221/243] Update dependencies from https://github.com/dotnet/runtime build 20200330.1 (#967) - Microsoft.NETCore.App - 5.0.0-preview.3.20180.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a8382e31e8..6112adf882 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd - + https://github.com/dotnet/runtime - 5eda36ed557d789d888647745782b261472b9fa3 + 38bef8c60e9483eeb16d85850ad6109c4bc47f5d https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 6665487e50..b71f6dae69 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.3.20179.1 + 5.0.0-preview.3.20180.1 5.0.0-preview.3.20178.11 From be95023693573280cd7ae57e5d357287e5fd1efe Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2020 12:42:42 +0000 Subject: [PATCH 222/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200329.3 (#968) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.3.20179.3 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6112adf882..4aaf59ff03 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -22,9 +22,9 @@ https://github.com/dotnet/runtime 38bef8c60e9483eeb16d85850ad6109c4bc47f5d - + https://github.com/dotnet/aspnetcore - e0231dadcaeb14f6babe8743a2e296bf03e09eea + 34fc4064af5743bf91499593635b720271dab3b5 diff --git a/eng/Versions.props b/eng/Versions.props index b71f6dae69..1c7a49ca08 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -20,7 +20,7 @@ 5.0.0-preview.3.20180.1 - 5.0.0-preview.3.20178.11 + 5.0.0-preview.3.20179.3 From 62aeebd022c1190fa40f18b3d1690c1513b8a0f3 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Mon, 30 Mar 2020 09:49:27 -0700 Subject: [PATCH 223/243] Fix some misc SOS issues (#966) * Display some more MT info * Issue https://github.com/dotnet/diagnostics/issues/816 * Issue https://github.com/dotnet/diagnostics/issues/941 * Issue https://github.com/dotnet/diagnostics/issues/942 * Fix sosstatus runtime size display --- src/SOS/SOS.Hosting/SOSHost.cs | 2 + src/SOS/Strike/hostcoreclr.cpp | 26 ++++-- src/SOS/Strike/runtime.cpp | 2 +- src/SOS/Strike/strike.cpp | 2 + src/Tools/dotnet-dump/Analyzer.cs | 82 +++++++++++-------- src/Tools/dotnet-dump/Commands/ExitCommand.cs | 1 + src/Tools/dotnet-dump/Commands/SOSCommand.cs | 1 - .../dotnet-dump/Commands/SetClrPathCommand.cs | 2 +- 8 files changed, 74 insertions(+), 44 deletions(-) diff --git a/src/SOS/SOS.Hosting/SOSHost.cs b/src/SOS/SOS.Hosting/SOSHost.cs index b117953d57..e6ede145ab 100644 --- a/src/SOS/SOS.Hosting/SOSHost.cs +++ b/src/SOS/SOS.Hosting/SOSHost.cs @@ -38,6 +38,7 @@ private delegate int SOSInitializeDelegate( [In, MarshalAs(UnmanagedType.Struct)] ref SOSNetCoreCallbacks callbacks, int callbacksSize, [In, MarshalAs(UnmanagedType.LPStr)] string tempDirectory, + [In, MarshalAs(UnmanagedType.LPStr)] string runtimeModulePath, bool isDesktop, [In, MarshalAs(UnmanagedType.LPStr)] string dacFilePath, [In, MarshalAs(UnmanagedType.LPStr)] string dbiFilePath, @@ -258,6 +259,7 @@ public void InitializeSOSHost(string tempDirectory, bool isDesktop, string dacFi ref s_callbacks, Marshal.SizeOf(), tempDirectory, + AnalyzeContext.RuntimeModuleDirectory, isDesktop, dacFilePath, dbiFilePath, diff --git a/src/SOS/Strike/hostcoreclr.cpp b/src/SOS/Strike/hostcoreclr.cpp index 1e791369cb..894a802303 100644 --- a/src/SOS/Strike/hostcoreclr.cpp +++ b/src/SOS/Strike/hostcoreclr.cpp @@ -347,18 +347,18 @@ static HRESULT GetHostRuntime(std::string& coreClrPath, std::string& hostRuntime #endif // FEATURE_PAL hostRuntimeDirectory.append(DIRECTORY_SEPARATOR_STR_A); - // First attempt find the highest 2.1.x version. We want to start with the LTS + // First attempt find the highest LTS version. We want to start with the LTSs // and only use the higher versions if it isn't installed. - if (!FindDotNetVersion(2, 1, hostRuntimeDirectory)) + if (!FindDotNetVersion(3, 1, hostRuntimeDirectory)) { - // Find highest 2.2.x version - if (!FindDotNetVersion(2, 2, hostRuntimeDirectory)) + // Find highest 2.1 LTS version + if (!FindDotNetVersion(2, 1, hostRuntimeDirectory)) { // Find highest 3.0.x version if (!FindDotNetVersion(3, 0, hostRuntimeDirectory)) { - // Find highest 3.1.x version - if (!FindDotNetVersion(3, 1, hostRuntimeDirectory)) + // Find highest 2.2.x version + if (!FindDotNetVersion(2, 2, hostRuntimeDirectory)) { // Find highest 5.0.x version if (!FindDotNetVersion(5, 0, hostRuntimeDirectory)) @@ -458,7 +458,15 @@ void CleanupTempDirectory() /**********************************************************************\ * Called when the managed SOS Host loads/initializes SOS. \**********************************************************************/ -extern "C" HRESULT SOSInitializeByHost(SOSNetCoreCallbacks* callbacks, int callbacksSize, LPCSTR tempDirectory, bool isDesktop, LPCSTR dacFilePath, LPCSTR dbiFilePath, bool symbolStoreEnabled) +extern "C" HRESULT SOSInitializeByHost( + SOSNetCoreCallbacks* callbacks, + int callbacksSize, + LPCSTR tempDirectory, + LPCSTR runtimeModulePath, + bool isDesktop, + LPCSTR dacFilePath, + LPCSTR dbiFilePath, + bool symbolStoreEnabled) { if (memcpy_s(&g_SOSNetCoreCallbacks, sizeof(g_SOSNetCoreCallbacks), callbacks, callbacksSize) != 0) { @@ -468,6 +476,10 @@ extern "C" HRESULT SOSInitializeByHost(SOSNetCoreCallbacks* callbacks, int callb { g_tmpPath = _strdup(tempDirectory); } + if (runtimeModulePath != nullptr) + { + g_runtimeModulePath = _strdup(runtimeModulePath); + } Runtime::SetDacDbiPath(isDesktop, dacFilePath, dbiFilePath); #ifndef FEATURE_PAL // When SOS is hosted on dotnet-dump, the ExtensionApis are not set so diff --git a/src/SOS/Strike/runtime.cpp b/src/SOS/Strike/runtime.cpp index 60004e8e12..940863c20d 100644 --- a/src/SOS/Strike/runtime.cpp +++ b/src/SOS/Strike/runtime.cpp @@ -525,7 +525,7 @@ HRESULT Runtime::GetCorDebugInterface(ICorDebugProcess** ppCorDebugProcess) \**********************************************************************/ void Runtime::DisplayStatus() { - ExtOut("%s runtime at %p (%08x)\n", GetRuntimeConfigurationName(GetRuntimeConfiguration()), m_address, m_size); + ExtOut("%s runtime at %p size %08llx\n", GetRuntimeConfigurationName(GetRuntimeConfiguration()), m_address, m_size); if (m_runtimeDirectory != nullptr) { ExtOut("Runtime directory: %s\n", m_runtimeDirectory); } diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 899edb07e6..091a42e83b 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -1359,6 +1359,8 @@ DECLARE_API(DumpMT) table.WriteRow("BaseSize:", PrefixHex(vMethTable.BaseSize)); table.WriteRow("ComponentSize:", PrefixHex(vMethTable.ComponentSize)); + table.WriteRow("DynamicStatics:", vMethTable.bIsDynamic ? "true" : "false"); + table.WriteRow("ContainsPointers:", vMethTable.bContainsPointers ? "true" : "false"); table.WriteRow("Slots in VTable:", Decimal(vMethTable.wNumMethods)); table.SetColWidth(0, 29); diff --git a/src/Tools/dotnet-dump/Analyzer.cs b/src/Tools/dotnet-dump/Analyzer.cs index ed93268e0c..f01feec475 100644 --- a/src/Tools/dotnet-dump/Analyzer.cs +++ b/src/Tools/dotnet-dump/Analyzer.cs @@ -222,53 +222,67 @@ private ClrRuntime CreateRuntime(DataTarget target) private string GetDacFile(ClrInfo clrInfo) { if (_dacFilePath == null) - { - string dac = clrInfo.LocalMatchingDac; - if (dac != null && File.Exists(dac)) + { + Debug.Assert(!string.IsNullOrEmpty(clrInfo.DacInfo.FileName)); + var analyzeContext = _serviceProvider.GetService(); + string dacFilePath = null; + if (!string.IsNullOrEmpty(analyzeContext.RuntimeModuleDirectory)) { - _dacFilePath = dac; + dacFilePath = Path.Combine(analyzeContext.RuntimeModuleDirectory, clrInfo.DacInfo.FileName); + if (File.Exists(dacFilePath)) + { + _dacFilePath = dacFilePath; + } } - else if (SymbolReader.IsSymbolStoreEnabled()) + if (_dacFilePath == null) { - string dacFileName = Path.GetFileName(dac ?? clrInfo.DacInfo.FileName); - if (dacFileName != null) + dacFilePath = clrInfo.LocalMatchingDac; + if (!string.IsNullOrEmpty(dacFilePath) && File.Exists(dacFilePath)) { - SymbolStoreKey key = null; - - if (clrInfo.ModuleInfo.BuildId != null) + _dacFilePath = dacFilePath; + } + else if (SymbolReader.IsSymbolStoreEnabled()) + { + string dacFileName = Path.GetFileName(dacFilePath ?? clrInfo.DacInfo.FileName); + if (dacFileName != null) { - IEnumerable keys = ELFFileKeyGenerator.GetKeys( - KeyTypeFlags.ClrKeys, clrInfo.ModuleInfo.FileName, clrInfo.ModuleInfo.BuildId, symbolFile: false, symbolFileName: null); + SymbolStoreKey key = null; + + if (clrInfo.ModuleInfo.BuildId != null) + { + IEnumerable keys = ELFFileKeyGenerator.GetKeys( + KeyTypeFlags.ClrKeys, clrInfo.ModuleInfo.FileName, clrInfo.ModuleInfo.BuildId, symbolFile: false, symbolFileName: null); - key = keys.SingleOrDefault((k) => Path.GetFileName(k.FullPathName) == dacFileName); + key = keys.SingleOrDefault((k) => Path.GetFileName(k.FullPathName) == dacFileName); - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + // We are opening a Linux dump on Windows + // We need to use the Windows index and filename + key = new SymbolStoreKey(key.Index.Replace("libmscordaccore.so", "mscordaccore.dll"), + key.FullPathName.Replace("libmscordaccore.so", "mscordaccore.dll"), + key.IsClrSpecialFile, + key.PdbChecksums); + } + } + else { - // We are opening a Linux dump on Windows - // We need to use the Windows index and filename - key = new SymbolStoreKey(key.Index.Replace("libmscordaccore.so", "mscordaccore.dll"), - key.FullPathName.Replace("libmscordaccore.so", "mscordaccore.dll"), - key.IsClrSpecialFile, - key.PdbChecksums); + // Use the coreclr.dll's id (timestamp/filesize) to download the the dac module. + key = PEFileKeyGenerator.GetKey(dacFileName, clrInfo.ModuleInfo.TimeStamp, clrInfo.ModuleInfo.FileSize); } - } - else - { - // Use the coreclr.dll's id (timestamp/filesize) to download the the dac module. - key = PEFileKeyGenerator.GetKey(dacFileName, clrInfo.ModuleInfo.TimeStamp, clrInfo.ModuleInfo.FileSize); - } - if (key != null) - { - // Now download the DAC module from the symbol server - _dacFilePath = SymbolReader.GetSymbolFile(key); + if (key != null) + { + // Now download the DAC module from the symbol server + _dacFilePath = SymbolReader.GetSymbolFile(key); + } } } - } - if (_dacFilePath == null) - { - throw new FileNotFoundException($"Could not find matching DAC for this runtime: {clrInfo.ModuleInfo.FileName}"); + if (_dacFilePath == null) + { + throw new FileNotFoundException($"Could not find matching DAC for this runtime: {clrInfo.ModuleInfo.FileName}"); + } } _isDesktop = clrInfo.Flavor == ClrFlavor.Desktop; } diff --git a/src/Tools/dotnet-dump/Commands/ExitCommand.cs b/src/Tools/dotnet-dump/Commands/ExitCommand.cs index 1c249c4242..d0acc7aac0 100644 --- a/src/Tools/dotnet-dump/Commands/ExitCommand.cs +++ b/src/Tools/dotnet-dump/Commands/ExitCommand.cs @@ -10,6 +10,7 @@ namespace Microsoft.Diagnostics.Tools.Dump { [Command(Name = "exit", Help = "Exit interactive mode.")] [CommandAlias(Name = "quit")] + [CommandAlias(Name = "q")] public class ExitCommand : CommandBase { public override void Invoke() diff --git a/src/Tools/dotnet-dump/Commands/SOSCommand.cs b/src/Tools/dotnet-dump/Commands/SOSCommand.cs index 2bb9c8d60a..639693eb5d 100644 --- a/src/Tools/dotnet-dump/Commands/SOSCommand.cs +++ b/src/Tools/dotnet-dump/Commands/SOSCommand.cs @@ -48,7 +48,6 @@ namespace Microsoft.Diagnostics.Tools.Dump [Command(Name = "histobjfind", AliasExpansion = "HistObjFind", Help = "Displays all the log entries that reference an object at the specified address.")] [Command(Name = "histroot", AliasExpansion = "HistRoot", Help = "Displays information related to both promotions and relocations of the specified root.")] [Command(Name = "setsymbolserver", AliasExpansion = "SetSymbolServer", Help = "Enables the symbol server support ")] - [Command(Name = "setclrpath", AliasExpansion = "setclrpath", Platform = CommandPlatform.Windows, Help = "Set the path to load the runtime DAC/DBI files.")] [Command(Name = "dumprcw", AliasExpansion = "DumpRCW", Platform = CommandPlatform.Windows, Help = "Displays information about a Runtime Callable Wrapper.")] [Command(Name = "dumpccw", AliasExpansion = "DumpCCW", Platform = CommandPlatform.Windows, Help = "Displays information about a COM Callable Wrapper.")] [Command(Name = "dumppermissionset",AliasExpansion = "DumpPermissionSet", Platform = CommandPlatform.Windows, Help = "Displays a PermissionSet object (debug build only).")] diff --git a/src/Tools/dotnet-dump/Commands/SetClrPathCommand.cs b/src/Tools/dotnet-dump/Commands/SetClrPathCommand.cs index e59fd3bef8..250b1b2deb 100644 --- a/src/Tools/dotnet-dump/Commands/SetClrPathCommand.cs +++ b/src/Tools/dotnet-dump/Commands/SetClrPathCommand.cs @@ -8,7 +8,7 @@ namespace Microsoft.Diagnostics.Tools.Dump { - [Command(Name = "setclrpath", Platform = CommandPlatform.Linux | CommandPlatform.OSX, Help = "Set the path to load coreclr DAC/DBI files.")] + [Command(Name = "setclrpath", Help = "Set the path to load coreclr DAC/DBI files.")] public class SetClrPath: CommandBase { public AnalyzeContext AnalyzeContext { get; set; } From f165686dbf00b0fad06c835513622e17b7e0da34 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2020 12:41:54 +0000 Subject: [PATCH 224/243] Update dependencies from https://github.com/dotnet/runtime build 20200330.15 (#969) - Microsoft.NETCore.App - 5.0.0-preview.3.20180.15 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4aaf59ff03..486c29c3b7 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd - + https://github.com/dotnet/runtime - 38bef8c60e9483eeb16d85850ad6109c4bc47f5d + c74407fcaff466a17b6e98f1dcc969248de506fe https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 1c7a49ca08..161769f85f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.3.20180.1 + 5.0.0-preview.3.20180.15 5.0.0-preview.3.20179.3 From 3e710e20a72150d1fefe778230a09070ef858fc2 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2020 17:20:06 +0000 Subject: [PATCH 225/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200330.11 (#970) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.4.20180.11 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 486c29c3b7..a92db82960 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -22,9 +22,9 @@ https://github.com/dotnet/runtime c74407fcaff466a17b6e98f1dcc969248de506fe - + https://github.com/dotnet/aspnetcore - 34fc4064af5743bf91499593635b720271dab3b5 + cffd4da47625a2754b7e6085b38910d22e5da8ae diff --git a/eng/Versions.props b/eng/Versions.props index 161769f85f..346e2ab58a 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -20,7 +20,7 @@ 5.0.0-preview.3.20180.15 - 5.0.0-preview.3.20179.3 + 5.0.0-preview.4.20180.11 From 61d68d0eb0580cdc37660bbdbdbac20351b5c5e6 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2020 12:43:26 +0000 Subject: [PATCH 226/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200331.16 (#972) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.4.20181.16 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a92db82960..7da2ecfc4b 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -22,9 +22,9 @@ https://github.com/dotnet/runtime c74407fcaff466a17b6e98f1dcc969248de506fe - + https://github.com/dotnet/aspnetcore - cffd4da47625a2754b7e6085b38910d22e5da8ae + b73e221c64397487cc1846bf14b72d128e97b3ca diff --git a/eng/Versions.props b/eng/Versions.props index 346e2ab58a..8670bce236 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -20,7 +20,7 @@ 5.0.0-preview.3.20180.15 - 5.0.0-preview.4.20180.11 + 5.0.0-preview.4.20181.16 From 0d7f98f115c20639f0825f13b33646e8f81a2075 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2020 14:38:19 +0000 Subject: [PATCH 227/243] Update dependencies from https://github.com/dotnet/runtime build 20200401.1 (#971) - Microsoft.NETCore.App - 5.0.0-preview.4.20201.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 7da2ecfc4b..2a857e0130 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd - + https://github.com/dotnet/runtime - c74407fcaff466a17b6e98f1dcc969248de506fe + e1fa5d7648d46f067e265211fc2c695d409fe788 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 8670bce236..838889491d 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.3.20180.15 + 5.0.0-preview.4.20201.1 5.0.0-preview.4.20181.16 From ebbb068590f1b60ba4ef3c2efaa88c4fbbf82536 Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Wed, 1 Apr 2020 20:07:55 -0400 Subject: [PATCH 228/243] Report missing DAC error for cross DAC clrstack -i (#973) * Report missing DAC error for cross DAC clrstack -i * Feedback --- src/SOS/Strike/strike.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 091a42e83b..8bbe15f064 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -13311,7 +13311,11 @@ class ClrStackImplWithICorDebug HRESULT Status; ICorDebugProcess* pCorDebugProcess; - IfFailRet(g_pRuntime->GetCorDebugInterface(&pCorDebugProcess)); + if (FAILED(Status = g_pRuntime->GetCorDebugInterface(&pCorDebugProcess))) + { + ExtOut("\n" SOSPrefix "clrstack -i is unsupported on this target.\nThe ICorDebug interface cannot be constructed.\n\n"); + return Status; + } ExtOut("\n\n\nDumping managed stack and managed variables using ICorDebug.\n"); ExtOut("=============================================================================\n"); From 548e62c247e407371bc15e3ae87c1b0a279bb8db Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Wed, 1 Apr 2020 22:35:02 -0400 Subject: [PATCH 229/243] Report stack walk failures (#975) --- src/SOS/Strike/strike.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 8bbe15f064..5893b53d5d 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -13709,8 +13709,21 @@ class ClrStackImpl if (bDisplayRegVals) PrintManagedFrameContext(pStackWalk); - } while (pStackWalk->Next() == S_OK); + hr = pStackWalk->Next(); + } while (hr == S_OK); + if (FAILED(hr)) + { + // Normal stack walk ends with S_FALSE + // Failure means the stalk walk did not complete normally + ExtOut("\nStack Walk failed. Reported stack incomplete.\n"); +#ifndef FEATURE_PAL + if (!IsWindowsTarget()) + { + ExtOut("Native stack walking is not supported on this target.\nStack walk will terminate at the first native frame.\n"); + } +#endif // FEATURE_PAL + } #ifdef DEBUG_STACK_CONTEXT while (numNativeFrames > 0) { From 0be62a0c395fb394ed20d5e177b6689e1e7354a0 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Wed, 1 Apr 2020 20:30:28 -0700 Subject: [PATCH 230/243] Fix description list command (#974) * cleanup unused field, fix description of GC collection counts in list command * Fix build --- src/Tools/dotnet-counters/CounterProvider.cs | 8 ---- .../Exporters/ConsoleWriter.cs | 2 +- src/Tools/dotnet-counters/KnownData.cs | 46 +++++++++---------- 3 files changed, 24 insertions(+), 32 deletions(-) diff --git a/src/Tools/dotnet-counters/CounterProvider.cs b/src/Tools/dotnet-counters/CounterProvider.cs index 07400071b3..5bcdf2edef 100644 --- a/src/Tools/dotnet-counters/CounterProvider.cs +++ b/src/Tools/dotnet-counters/CounterProvider.cs @@ -29,13 +29,6 @@ public CounterProvider(string name, string description, string keywords, string } } - public string TryGetDisplayName(string counterName) - { - if (Counters.ContainsKey(counterName)) - return Counters[counterName].DisplayName; - return null; - } - public string ToProviderString(int interval) { return $"{Name}:{Keywords}:{Level}:EventCounterIntervalSec={interval}"; @@ -53,7 +46,6 @@ public static string SerializeUnknownProviderName(string unknownCounterProviderN public class CounterProfile { public string Name { get; set; } - public string DisplayName { get; set; } public string Description { get; set; } } } diff --git a/src/Tools/dotnet-counters/Exporters/ConsoleWriter.cs b/src/Tools/dotnet-counters/Exporters/ConsoleWriter.cs index 29720b64ee..a17d9c3c62 100644 --- a/src/Tools/dotnet-counters/Exporters/ConsoleWriter.cs +++ b/src/Tools/dotnet-counters/Exporters/ConsoleWriter.cs @@ -118,7 +118,7 @@ public void CounterPayloadReceived(string providerName, ICounterPayload payload, if (!provider.Counters.TryGetValue(name, out ObservedCounter counter)) { - string displayName = provider.KnownProvider?.TryGetDisplayName(name) ?? (string.IsNullOrWhiteSpace(payload.GetDisplay()) ? name : payload.GetDisplay()); + string displayName = payload.GetDisplay(); provider.Counters[name] = counter = new ObservedCounter(displayName); maxNameLength = Math.Max(maxNameLength, displayName.Length); redraw = true; diff --git a/src/Tools/dotnet-counters/KnownData.cs b/src/Tools/dotnet-counters/KnownData.cs index b9f5f08c55..b27f54bec1 100644 --- a/src/Tools/dotnet-counters/KnownData.cs +++ b/src/Tools/dotnet-counters/KnownData.cs @@ -23,25 +23,25 @@ private static IEnumerable CreateKnownProviders() "0xffffffff", // Keywords "5", // Level new[] { // Counters - new CounterProfile{ Name="cpu-usage", Description="Amount of time the process has utilized the CPU (ms)", DisplayName="CPU Usage (%)" }, - new CounterProfile{ Name="working-set", Description="Amount of working set used by the process (MB)", DisplayName="Working Set (MB)" }, - new CounterProfile{ Name="gc-heap-size", Description="Total heap size reported by the GC (MB)", DisplayName="GC Heap Size (MB)" }, - new CounterProfile{ Name="gen-0-gc-count", Description="Number of Gen 0 GCs / sec", DisplayName="Gen 0 GC / sec" }, - new CounterProfile{ Name="gen-1-gc-count", Description="Number of Gen 1 GCs / sec", DisplayName="Gen 1 GC / sec" }, - new CounterProfile{ Name="gen-2-gc-count", Description="Number of Gen 2 GCs / sec", DisplayName="Gen 2 GC / sec" }, - new CounterProfile{ Name="time-in-gc", Description="% time in GC since the last GC", DisplayName="% Time in GC (since last GC)" }, - new CounterProfile{ Name="gen-0-size", Description="Gen 0 Heap Size", DisplayName="Gen 0 Size (B)" }, - new CounterProfile{ Name="gen-1-size", Description="Gen 1 Heap Size", DisplayName="Gen 1 Size (B)" }, - new CounterProfile{ Name="gen-2-size", Description="Gen 2 Heap Size", DisplayName="Gen 2 Size (B)" }, - new CounterProfile{ Name="loh-size", Description="LOH Heap Size", DisplayName="LOH Size (B)" }, - new CounterProfile{ Name="alloc-rate", Description="Allocation Rate", DisplayName="Allocation Rate (Bytes / sec)" }, - new CounterProfile{ Name="assembly-count", Description="Number of Assemblies Loaded", DisplayName="# of Assemblies Loaded" }, - new CounterProfile{ Name="exception-count", Description="Number of Exceptions / sec", DisplayName="Exceptions / sec" }, - new CounterProfile{ Name="threadpool-thread-count", Description="Number of ThreadPool Threads", DisplayName="ThreadPool Threads Count" }, - new CounterProfile{ Name="monitor-lock-contention-count", Description="Monitor Lock Contention Count", DisplayName="Monitor Lock Contention Count / sec" }, - new CounterProfile{ Name="threadpool-queue-length", Description="ThreadPool Work Items Queue Length", DisplayName="ThreadPool Queue Length" }, - new CounterProfile{ Name="threadpool-completed-items-count", Description="ThreadPool Completed Work Items Count", DisplayName="ThreadPool Completed Work Items / sec" }, - new CounterProfile{ Name="active-timer-count", Description="Active Timers Count", DisplayName="Number of Active Timers" }, + new CounterProfile{ Name="cpu-usage", Description="Amount of time the process has utilized the CPU (ms)" }, + new CounterProfile{ Name="working-set", Description="Amount of working set used by the process (MB)" }, + new CounterProfile{ Name="gc-heap-size", Description="Total heap size reported by the GC (MB)" }, + new CounterProfile{ Name="gen-0-gc-count", Description="Number of Gen 0 GCs / min" }, + new CounterProfile{ Name="gen-1-gc-count", Description="Number of Gen 1 GCs / min" }, + new CounterProfile{ Name="gen-2-gc-count", Description="Number of Gen 2 GCs / min" }, + new CounterProfile{ Name="time-in-gc", Description="% time in GC since the last GC" }, + new CounterProfile{ Name="gen-0-size", Description="Gen 0 Heap Size" }, + new CounterProfile{ Name="gen-1-size", Description="Gen 1 Heap Size" }, + new CounterProfile{ Name="gen-2-size", Description="Gen 2 Heap Size" }, + new CounterProfile{ Name="loh-size", Description="LOH Heap Size" }, + new CounterProfile{ Name="alloc-rate", Description="Allocation Rate" }, + new CounterProfile{ Name="assembly-count", Description="Number of Assemblies Loaded" }, + new CounterProfile{ Name="exception-count", Description="Number of Exceptions / sec" }, + new CounterProfile{ Name="threadpool-thread-count", Description="Number of ThreadPool Threads" }, + new CounterProfile{ Name="monitor-lock-contention-count", Description="Monitor Lock Contention Count" }, + new CounterProfile{ Name="threadpool-queue-length", Description="ThreadPool Work Items Queue Length" }, + new CounterProfile{ Name="threadpool-completed-items-count", Description="ThreadPool Completed Work Items Count" }, + new CounterProfile{ Name="active-timer-count", Description="Active Timers Count" }, }); yield return new CounterProvider( "Microsoft.AspNetCore.Hosting", // Name @@ -49,10 +49,10 @@ private static IEnumerable CreateKnownProviders() "0x0", // Keywords "4", // Level new[] { // Counters - new CounterProfile{ Name="requests-per-second", Description="Request rate", DisplayName="Request / sec" }, - new CounterProfile{ Name="total-requests", Description="Total number of requests", DisplayName="Total Requests" }, - new CounterProfile{ Name="current-requests", Description="Current number of requests", DisplayName="Current Requests" }, - new CounterProfile{ Name="failed-requests", Description="Failed number of requests", DisplayName="Failed Requests" }, + new CounterProfile{ Name="requests-per-second", Description="Request rate" }, + new CounterProfile{ Name="total-requests", Description="Total number of requests" }, + new CounterProfile{ Name="current-requests", Description="Current number of requests" }, + new CounterProfile{ Name="failed-requests", Description="Failed number of requests" }, }); } From 9d5ba02a140ac4aaef3986a529ab536b6ca69897 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2020 12:51:27 +0000 Subject: [PATCH 231/243] Update dependencies from https://github.com/dotnet/runtime build 20200401.19 (#977) - Microsoft.NETCore.App - 5.0.0-preview.4.20201.19 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2a857e0130..fba36f4d19 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd - + https://github.com/dotnet/runtime - e1fa5d7648d46f067e265211fc2c695d409fe788 + 907b5ae697841b0308fb321315991939474f9d7e https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 838889491d..3e89088ae1 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.4.20201.1 + 5.0.0-preview.4.20201.19 5.0.0-preview.4.20181.16 From b086b031cea4be419320a0f1024b1a6845d6ef49 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2020 19:45:41 +0000 Subject: [PATCH 232/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200401.16 (#978) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.4.20201.16 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index fba36f4d19..3abdce95b4 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -22,9 +22,9 @@ https://github.com/dotnet/runtime 907b5ae697841b0308fb321315991939474f9d7e - + https://github.com/dotnet/aspnetcore - b73e221c64397487cc1846bf14b72d128e97b3ca + 0518cb5107372d6057708837cec6650fb962d2b1 diff --git a/eng/Versions.props b/eng/Versions.props index 3e89088ae1..6afb2bbde8 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -20,7 +20,7 @@ 5.0.0-preview.4.20201.19 - 5.0.0-preview.4.20181.16 + 5.0.0-preview.4.20201.16 From 4049def7505377aef3875538428cb261117831a9 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Thu, 2 Apr 2020 16:36:25 -0700 Subject: [PATCH 233/243] Link Code of Conduct (#980) --- CODE-OF-CONDUCT.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 CODE-OF-CONDUCT.md diff --git a/CODE-OF-CONDUCT.md b/CODE-OF-CONDUCT.md new file mode 100644 index 0000000000..775f221c98 --- /dev/null +++ b/CODE-OF-CONDUCT.md @@ -0,0 +1,6 @@ +# Code of Conduct + +This project has adopted the code of conduct defined by the Contributor Covenant +to clarify expected behavior in our community. + +For more information, see the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct). From 3bd1c90bcc843b1a9848995f0dc8e3d50872e0e4 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 3 Apr 2020 12:43:06 +0000 Subject: [PATCH 234/243] Update dependencies from https://github.com/dotnet/runtime build 20200402.18 (#981) - Microsoft.NETCore.App - 5.0.0-preview.4.20202.18 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 3abdce95b4..aec09979f1 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd - + https://github.com/dotnet/runtime - 907b5ae697841b0308fb321315991939474f9d7e + 0375524a91a47ca4db3ee1be548f74bab7e26e76 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 6afb2bbde8..f0453ba419 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.4.20201.19 + 5.0.0-preview.4.20202.18 5.0.0-preview.4.20201.16 From 7c935601648b21af2d56e3f1db68c071a5a29b88 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 3 Apr 2020 12:44:03 +0000 Subject: [PATCH 235/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200402.13 (#982) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.4.20202.13 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index aec09979f1..9002628326 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -22,9 +22,9 @@ https://github.com/dotnet/runtime 0375524a91a47ca4db3ee1be548f74bab7e26e76 - + https://github.com/dotnet/aspnetcore - 0518cb5107372d6057708837cec6650fb962d2b1 + c01c8dd47624326a452b8e6ae5f85eddae36f30d diff --git a/eng/Versions.props b/eng/Versions.props index f0453ba419..babe4d8910 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -20,7 +20,7 @@ 5.0.0-preview.4.20202.18 - 5.0.0-preview.4.20201.16 + 5.0.0-preview.4.20202.13 From 9ea065bd0d1403ac4cc281f21873f7ba5939e9e9 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 4 Apr 2020 12:35:11 +0000 Subject: [PATCH 236/243] Update dependencies from https://github.com/dotnet/runtime build 20200404.1 (#984) - Microsoft.NETCore.App - 5.0.0-preview.4.20204.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 9002628326..32a57f6c26 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd - + https://github.com/dotnet/runtime - 0375524a91a47ca4db3ee1be548f74bab7e26e76 + 121659c7dbc711afe981ee129480cf484e9779a8 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index babe4d8910..407cb309f7 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.4.20202.18 + 5.0.0-preview.4.20204.1 5.0.0-preview.4.20202.13 From a5c9939e5cf302107524e5ba6bb3ccff1c6d8050 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 4 Apr 2020 12:39:01 +0000 Subject: [PATCH 237/243] Update dependencies from https://github.com/dotnet/symstore build 20200403.1 (#986) - Microsoft.SymbolStore - 1.0.120301 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 32a57f6c26..83449371b8 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -8,9 +8,9 @@ https://github.com/dotnet/arcade 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd - + https://github.com/dotnet/symstore - 6d6176230f6fbe8b6605decd28ec4a245675a6a1 + b99d7d1db9016e954191c997f8e890921a8c4366 diff --git a/eng/Versions.props b/eng/Versions.props index 407cb309f7..6d1b2daf38 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -9,7 +9,7 @@ - 1.0.117501 + 1.0.120301 2.1.16 $(MicrosoftNETCoreApp21Version) From 1f65399994b3a1e7947222194d57291984dfd0cc Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 4 Apr 2020 12:41:11 +0000 Subject: [PATCH 238/243] Update dependencies from https://github.com/dotnet/aspnetcore build 20200403.11 (#985) - Microsoft.AspNetCore.App.Ref - 5.0.0-preview.4.20203.11 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 83449371b8..da49d8afb0 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -22,9 +22,9 @@ https://github.com/dotnet/runtime 121659c7dbc711afe981ee129480cf484e9779a8 - + https://github.com/dotnet/aspnetcore - c01c8dd47624326a452b8e6ae5f85eddae36f30d + 75bdd71ebc81ca0bcba456e011b46bb4310ddd03 diff --git a/eng/Versions.props b/eng/Versions.props index 6d1b2daf38..7278f8d57c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -20,7 +20,7 @@ 5.0.0-preview.4.20204.1 - 5.0.0-preview.4.20202.13 + 5.0.0-preview.4.20203.11 From ef2f711b631d02e38fdd63208870686cc2b69132 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Sat, 4 Apr 2020 20:35:11 -0700 Subject: [PATCH 239/243] Filter the tools' own PID out of ps command result (#983) --- src/Tools/Common/Commands/ProcessStatus.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Tools/Common/Commands/ProcessStatus.cs b/src/Tools/Common/Commands/ProcessStatus.cs index 19ff7bec41..1a8adf54ba 100644 --- a/src/Tools/Common/Commands/ProcessStatus.cs +++ b/src/Tools/Common/Commands/ProcessStatus.cs @@ -34,8 +34,15 @@ public static void PrintProcessStatus(IConsole console) .OrderBy(process => process.ProcessName) .ThenBy(process => process.Id); + var currentPid = Process.GetCurrentProcess().Id; + foreach (var process in processes) { + if (process.Id == currentPid) + { + continue; + } + try { sb.Append($"{process.Id, 10} {process.ProcessName, -10} {process.MainModule.FileName}\n"); From 2322e00ff47a4b7c8265e2404d9780b49a9cf311 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sun, 5 Apr 2020 13:00:50 +0000 Subject: [PATCH 240/243] Update dependencies from https://github.com/dotnet/runtime build 20200404.15 (#988) - Microsoft.NETCore.App - 5.0.0-preview.4.20204.15 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index da49d8afb0..e59f9f885f 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd - + https://github.com/dotnet/runtime - 121659c7dbc711afe981ee129480cf484e9779a8 + e253ff3b39badd44317b6d56adba46a48169201d https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 7278f8d57c..2e391784be 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.4.20204.1 + 5.0.0-preview.4.20204.15 5.0.0-preview.4.20203.11 From 30fb50e01551825edabe3d332068107565f7c767 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 6 Apr 2020 12:35:22 +0000 Subject: [PATCH 241/243] Update dependencies from https://github.com/dotnet/arcade build 20200401.2 (#989) - Microsoft.DotNet.Arcade.Sdk - 5.0.0-beta.20201.2 - Microsoft.DotNet.RemoteExecutor - 5.0.0-beta.20201.2 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 8 +- eng/Versions.props | 2 +- eng/common/cross/build-rootfs.sh | 79 +++++++++++++------ eng/common/cross/toolchain.cmake | 15 +++- eng/common/performance/performance-setup.ps1 | 7 ++ eng/common/performance/performance-setup.sh | 7 ++ eng/common/pipeline-logging-functions.ps1 | 6 +- eng/common/sdl/execute-all-sdl-tools.ps1 | 4 + eng/common/sdl/extract-artifact-packages.ps1 | 8 +- eng/common/sdl/init-sdl.ps1 | 6 +- eng/common/sdl/push-gdn.ps1 | 6 +- eng/common/sdl/run-sdl.ps1 | 8 +- eng/common/templates/job/job.yml | 4 + .../templates/post-build/common-variables.yml | 6 +- .../templates/post-build/post-build.yml | 54 ++++++++++--- eng/common/tools.sh | 4 +- global.json | 2 +- 17 files changed, 167 insertions(+), 59 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e59f9f885f..a9d7369881 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -4,9 +4,9 @@ https://github.com/dotnet/command-line-api 166610c56ff732093f0145a2911d4f6c40b786da - + https://github.com/dotnet/arcade - 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd + bce0a98620c1c5a110b2bba9912f3d5929069c6b https://github.com/dotnet/symstore @@ -14,9 +14,9 @@ - + https://github.com/dotnet/arcade - 7dbc907fa03eacf4c57f827cb4235d77b7ed4fcd + bce0a98620c1c5a110b2bba9912f3d5929069c6b https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 2e391784be..237c0e26b3 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -47,7 +47,7 @@ 4.7.0 2.4.1 2.0.3 - 5.0.0-beta.20171.1 + 5.0.0-beta.20201.2 10.0.18362 diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh index a23f895ba1..2cdd82d30d 100644 --- a/eng/common/cross/build-rootfs.sh +++ b/eng/common/cross/build-rootfs.sh @@ -2,15 +2,16 @@ usage() { - echo "Usage: $0 [BuildArch] [LinuxCodeName] [lldbx.y] [--skipunmount] --rootfsdir ]" + echo "Usage: $0 [BuildArch] [CodeName] [lldbx.y] [--skipunmount] --rootfsdir ]" echo "BuildArch can be: arm(default), armel, arm64, x86" - echo "LinuxCodeName - optional, Code name for Linux, can be: trusty, xenial(default), zesty, bionic, alpine. If BuildArch is armel, LinuxCodeName is jessie(default) or tizen." - echo "lldbx.y - optional, LLDB version, can be: lldb3.9(default), lldb4.0, lldb5.0, lldb6.0 no-lldb. Ignored for alpine" + echo "CodeName - optional, Code name for Linux, can be: trusty, xenial(default), zesty, bionic, alpine. If BuildArch is armel, LinuxCodeName is jessie(default) or tizen." + echo " for FreeBSD can be: freebsd11 or freebsd12." + echo "lldbx.y - optional, LLDB version, can be: lldb3.9(default), lldb4.0, lldb5.0, lldb6.0 no-lldb. Ignored for alpine and FReeBSD" echo "--skipunmount - optional, will skip the unmount of rootfs folder." exit 1 } -__LinuxCodeName=xenial +__CodeName=xenial __CrossDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) __InitialDir=$PWD __BuildArch=arm @@ -53,6 +54,15 @@ __AlpinePackages+=" krb5-dev" __AlpinePackages+=" openssl-dev" __AlpinePackages+=" zlib-dev" +__FreeBSDBase="12.1-RELEASE" +__FreeBSDPkg="1.10.5" +__FreeBSDPackages="libunwind" +__FreeBSDPackages+=" icu" +__FreeBSDPackages+=" libinotify" +__FreeBSDPackages+=" lttng-ust" +__FreeBSDPackages+=" llvm-90" +__FreeBSDPackages+=" krb5" + __UnprocessedBuildArgs= while :; do if [ $# -le 0 ]; then @@ -81,7 +91,7 @@ while :; do __BuildArch=armel __UbuntuArch=armel __UbuntuRepo="http://ftp.debian.org/debian/" - __LinuxCodeName=jessie + __CodeName=jessie ;; x86) __BuildArch=x86 @@ -110,36 +120,36 @@ while :; do unset __LLDB_Package ;; trusty) # Ubuntu 14.04 - if [ "$__LinuxCodeName" != "jessie" ]; then - __LinuxCodeName=trusty + if [ "$__CodeName" != "jessie" ]; then + __CodeName=trusty fi ;; xenial) # Ubuntu 16.04 - if [ "$__LinuxCodeName" != "jessie" ]; then - __LinuxCodeName=xenial + if [ "$__CodeName" != "jessie" ]; then + __CodeName=xenial fi ;; zesty) # Ubuntu 17.04 - if [ "$__LinuxCodeName" != "jessie" ]; then - __LinuxCodeName=zesty + if [ "$__CodeName" != "jessie" ]; then + __CodeName=zesty fi ;; bionic) # Ubuntu 18.04 - if [ "$__LinuxCodeName" != "jessie" ]; then - __LinuxCodeName=bionic + if [ "$__CodeName" != "jessie" ]; then + __CodeName=bionic fi ;; jessie) # Debian 8 - __LinuxCodeName=jessie + __CodeName=jessie __UbuntuRepo="http://ftp.debian.org/debian/" ;; stretch) # Debian 9 - __LinuxCodeName=stretch + __CodeName=stretch __UbuntuRepo="http://ftp.debian.org/debian/" __LLDB_Package="liblldb-6.0-dev" ;; buster) # Debian 10 - __LinuxCodeName=buster + __CodeName=buster __UbuntuRepo="http://ftp.debian.org/debian/" __LLDB_Package="liblldb-6.0-dev" ;; @@ -149,14 +159,22 @@ while :; do usage; exit 1; fi - __LinuxCodeName= + __CodeName= __UbuntuRepo= __Tizen=tizen ;; alpine) - __LinuxCodeName=alpine + __CodeName=alpine __UbuntuRepo= ;; + freebsd11) + __FreeBSDBase="11.3-RELEASE" + ;& + freebsd12) + __CodeName=freebsd + __BuildArch=x64 + __SkipUnmount=1 + ;; --skipunmount) __SkipUnmount=1 ;; @@ -192,7 +210,7 @@ if [ -d "$__RootfsDir" ]; then rm -rf $__RootfsDir fi -if [[ "$__LinuxCodeName" == "alpine" ]]; then +if [[ "$__CodeName" == "alpine" ]]; then __ApkToolsVersion=2.9.1 __AlpineVersion=3.9 __ApkToolsDir=$(mktemp -d) @@ -218,9 +236,24 @@ if [[ "$__LinuxCodeName" == "alpine" ]]; then add $__AlpinePackagesEdgeTesting rm -r $__ApkToolsDir -elif [[ -n $__LinuxCodeName ]]; then - qemu-debootstrap --arch $__UbuntuArch $__LinuxCodeName $__RootfsDir $__UbuntuRepo - cp $__CrossDir/$__BuildArch/sources.list.$__LinuxCodeName $__RootfsDir/etc/apt/sources.list +elif [[ "$__CodeName" == "freebsd" ]]; then + mkdir -p $__RootfsDir/usr/local/etc + wget -O - https://download.freebsd.org/ftp/releases/amd64/${__FreeBSDBase}/base.txz | tar -C $__RootfsDir -Jxf - ./lib ./usr/lib ./usr/libdata ./usr/include ./usr/share/keys ./etc ./bin/freebsd-version + # For now, ask for 11 ABI even on 12. This can be revisited later. + echo "ABI = \"FreeBSD:11:amd64\"; FINGERPRINTS = \"${__RootfsDir}/usr/share/keys\"; REPOS_DIR = [\"${__RootfsDir}/etc/pkg\"]; REPO_AUTOUPDATE = NO; RUN_SCRIPTS = NO;" > ${__RootfsDir}/usr/local/etc/pkg.conf + echo "FreeBSD: { url: "pkg+http://pkg.FreeBSD.org/\${ABI}/quarterly", mirror_type: \"srv\", signature_type: \"fingerprints\", fingerprints: \"${__RootfsDir}/usr/share/keys/pkg\", enabled: yes }" > ${__RootfsDir}/etc/pkg/FreeBSD.conf + mkdir -p $__RootfsDir/tmp + # get and build package manager + wget -O - https://github.com/freebsd/pkg/archive/${__FreeBSDPkg}.tar.gz | tar -C $__RootfsDir/tmp -zxf - + cd $__RootfsDir/tmp/pkg-${__FreeBSDPkg} + ./autogen.sh && ./configure --prefix=$__RootfsDir/host && make install + rm -rf $__RootfsDir/tmp/pkg-${__FreeBSDPkg} + # install packages we need. + $__RootfsDir/host/sbin/pkg -r $__RootfsDir -C $__RootfsDir/usr/local/etc/pkg.conf update + $__RootfsDir/host/sbin/pkg -r $__RootfsDir -C $__RootfsDir/usr/local/etc/pkg.conf install --yes $__FreeBSDPackages +elif [[ -n $__CodeName ]]; then + qemu-debootstrap --arch $__UbuntuArch $__CodeName $__RootfsDir $__UbuntuRepo + cp $__CrossDir/$__BuildArch/sources.list.$__CodeName $__RootfsDir/etc/apt/sources.list chroot $__RootfsDir apt-get update chroot $__RootfsDir apt-get -f -y install chroot $__RootfsDir apt-get -y install $__UbuntuPackages @@ -230,7 +263,7 @@ elif [[ -n $__LinuxCodeName ]]; then umount $__RootfsDir/* fi - if [[ "$__BuildArch" == "arm" && "$__LinuxCodeName" == "trusty" ]]; then + if [[ "$__BuildArch" == "arm" && "$__CodeName" == "trusty" ]]; then pushd $__RootfsDir patch -p1 < $__CrossDir/$__BuildArch/trusty.patch patch -p1 < $__CrossDir/$__BuildArch/trusty-lttng-2.4.patch diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake index 1823804da4..534f1d19de 100644 --- a/eng/common/cross/toolchain.cmake +++ b/eng/common/cross/toolchain.cmake @@ -1,7 +1,11 @@ set(CROSS_ROOTFS $ENV{ROOTFS_DIR}) set(TARGET_ARCH_NAME $ENV{TARGET_BUILD_ARCH}) -set(CMAKE_SYSTEM_NAME Linux) +if(EXISTS ${CROSS_ROOTFS}/bin/freebsd-version) + set(CMAKE_SYSTEM_NAME FreeBSD) +else() + set(CMAKE_SYSTEM_NAME Linux) +endif() set(CMAKE_SYSTEM_VERSION 1) if(TARGET_ARCH_NAME STREQUAL "armel") @@ -27,6 +31,9 @@ elseif(TARGET_ARCH_NAME STREQUAL "arm64") elseif(TARGET_ARCH_NAME STREQUAL "x86") set(CMAKE_SYSTEM_PROCESSOR i686) set(TOOLCHAIN "i686-linux-gnu") +elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + set(CMAKE_SYSTEM_PROCESSOR "x86_64") + set(triple "x86_64-unknown-freebsd11") else() message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only armel, arm, arm64 and x86 are supported!") endif() @@ -60,6 +67,12 @@ if("$ENV{__DistroRid}" MATCHES "android.*") # include official NDK toolchain script include(${CROSS_ROOTFS}/../build/cmake/android.toolchain.cmake) +elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + # we cross-compile by instructing clang + set(CMAKE_C_COMPILER_TARGET ${triple}) + set(CMAKE_CXX_COMPILER_TARGET ${triple}) + set(CMAKE_ASM_COMPILER_TARGET ${triple}) + set(CMAKE_SYSROOT "${CROSS_ROOTFS}") else() set(CMAKE_SYSROOT "${CROSS_ROOTFS}") diff --git a/eng/common/performance/performance-setup.ps1 b/eng/common/performance/performance-setup.ps1 index e337669929..1763a1a97b 100644 --- a/eng/common/performance/performance-setup.ps1 +++ b/eng/common/performance/performance-setup.ps1 @@ -53,6 +53,13 @@ if ($Internal) { $CommonSetupArguments="--channel master --queue $Queue --build-number $BuildNumber --build-configs $Configurations --architecture $Architecture" $SetupArguments = "--repository https://github.com/$Repository --branch $Branch --get-perf-hash --commit-sha $CommitSha $CommonSetupArguments" + +#This grabs the LKG version number of dotnet and passes it to our scripts +$VersionJSON = Get-Content global.json | ConvertFrom-Json +$DotNetVersion = $VersionJSON.tools.dotnet +$SetupArguments = "--dotnet-versions $DotNetVersion $SetupArguments" + + if ($RunFromPerformanceRepo) { $SetupArguments = "--perf-hash $CommitSha $CommonSetupArguments" diff --git a/eng/common/performance/performance-setup.sh b/eng/common/performance/performance-setup.sh index 94a04e0fe5..b9eecf94bd 100644 --- a/eng/common/performance/performance-setup.sh +++ b/eng/common/performance/performance-setup.sh @@ -167,6 +167,13 @@ fi common_setup_arguments="--channel master --queue $queue --build-number $build_number --build-configs $configurations --architecture $architecture" setup_arguments="--repository https://github.com/$repository --branch $branch --get-perf-hash --commit-sha $commit_sha $common_setup_arguments" + +# Get the tools section from the global.json. +# This grabs the LKG version number of dotnet and passes it to our scripts +dotnet_version=`cat global.json | python3 -c 'import json,sys;obj=json.load(sys.stdin);print(obj["tools"]["dotnet"])'` +setup_arguments="--dotnet-versions $dotnet_version $setup_arguments" + + if [[ "$run_from_perf_repo" = true ]]; then payload_directory= workitem_directory=$source_directory diff --git a/eng/common/pipeline-logging-functions.ps1 b/eng/common/pipeline-logging-functions.ps1 index 5042baebf1..8484451f3a 100644 --- a/eng/common/pipeline-logging-functions.ps1 +++ b/eng/common/pipeline-logging-functions.ps1 @@ -67,12 +67,12 @@ function Write-PipelineTaskError { } if(($Type -ne 'error') -and ($Type -ne 'warning')) { - Write-Host $Message - return + Write-Host $Message + return } $PSBoundParameters.Remove('Force') | Out-Null if(-not $PSBoundParameters.ContainsKey('Type')) { - $PSBoundParameters.Add('Type', 'error') + $PSBoundParameters.Add('Type', 'error') } Write-LogIssue @PSBoundParameters } diff --git a/eng/common/sdl/execute-all-sdl-tools.ps1 b/eng/common/sdl/execute-all-sdl-tools.ps1 index 9db582f279..b7f61f9a2f 100644 --- a/eng/common/sdl/execute-all-sdl-tools.ps1 +++ b/eng/common/sdl/execute-all-sdl-tools.ps1 @@ -33,6 +33,10 @@ try { $disableConfigureToolsetImport = $true $LASTEXITCODE = 0 + # `tools.ps1` checks $ci to perform some actions. Since the SDL + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true . $PSScriptRoot\..\tools.ps1 #Replace repo names to the format of org/repo diff --git a/eng/common/sdl/extract-artifact-packages.ps1 b/eng/common/sdl/extract-artifact-packages.ps1 index 3c9bf10678..9e5f3cb43c 100644 --- a/eng/common/sdl/extract-artifact-packages.ps1 +++ b/eng/common/sdl/extract-artifact-packages.ps1 @@ -6,10 +6,6 @@ param( $ErrorActionPreference = 'Stop' Set-StrictMode -Version 2.0 -# `tools.ps1` checks $ci to perform some actions. Since the post-build -# scripts don't necessarily execute in the same agent that run the -# build.ps1/sh script this variable isn't automatically set. -$ci = $true $disableConfigureToolsetImport = $true function ExtractArtifacts { @@ -29,6 +25,10 @@ function ExtractArtifacts { } try { + # `tools.ps1` checks $ci to perform some actions. Since the SDL + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true . $PSScriptRoot\..\tools.ps1 $ExtractPackage = { diff --git a/eng/common/sdl/init-sdl.ps1 b/eng/common/sdl/init-sdl.ps1 index 285f1ccdb0..1a91bbbc5a 100644 --- a/eng/common/sdl/init-sdl.ps1 +++ b/eng/common/sdl/init-sdl.ps1 @@ -12,6 +12,10 @@ Set-StrictMode -Version 2.0 $disableConfigureToolsetImport = $true $LASTEXITCODE = 0 +# `tools.ps1` checks $ci to perform some actions. Since the SDL +# scripts don't necessarily execute in the same agent that run the +# build.ps1/sh script this variable isn't automatically set. +$ci = $true . $PSScriptRoot\..\tools.ps1 # Don't display the console progress UI - it's a huge perf hit @@ -58,6 +62,6 @@ try { } catch { Write-Host $_.ScriptStackTrace - Write-PipelineTelemetryError -Category 'Sdl' -Message $_ + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ ExitWithExitCode 1 } diff --git a/eng/common/sdl/push-gdn.ps1 b/eng/common/sdl/push-gdn.ps1 index 79d3d355c7..d8fd2d82a6 100644 --- a/eng/common/sdl/push-gdn.ps1 +++ b/eng/common/sdl/push-gdn.ps1 @@ -12,6 +12,10 @@ $disableConfigureToolsetImport = $true $LASTEXITCODE = 0 try { + # `tools.ps1` checks $ci to perform some actions. Since the SDL + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true . $PSScriptRoot\..\tools.ps1 # We create the temp directory where we'll store the sdl-config repository @@ -62,4 +66,4 @@ catch { Write-Host $_.ScriptStackTrace Write-PipelineTelemetryError -Category 'Sdl' -Message $_ ExitWithExitCode 1 -} \ No newline at end of file +} diff --git a/eng/common/sdl/run-sdl.ps1 b/eng/common/sdl/run-sdl.ps1 index 40a084f796..fe95ab35aa 100644 --- a/eng/common/sdl/run-sdl.ps1 +++ b/eng/common/sdl/run-sdl.ps1 @@ -16,6 +16,10 @@ $disableConfigureToolsetImport = $true $LASTEXITCODE = 0 try { + # `tools.ps1` checks $ci to perform some actions. Since the SDL + # scripts don't necessarily execute in the same agent that run the + # build.ps1/sh script this variable isn't automatically set. + $ci = $true . $PSScriptRoot\..\tools.ps1 # We store config files in the r directory of .gdn @@ -64,6 +68,6 @@ try { } catch { Write-Host $_.ScriptStackTrace - Write-PipelineTelemetryError -Category 'Sdl' -Message $_ + Write-PipelineTelemetryError -Force -Category 'Sdl' -Message $_ ExitWithExitCode 1 -} \ No newline at end of file +} diff --git a/eng/common/templates/job/job.yml b/eng/common/templates/job/job.yml index ecebd0f03e..536c15c464 100644 --- a/eng/common/templates/job/job.yml +++ b/eng/common/templates/job/job.yml @@ -24,6 +24,8 @@ parameters: enablePublishBuildAssets: false enablePublishTestResults: false enablePublishUsingPipelines: false + mergeTestResults: false + testRunTitle: $(AgentOsName)-$(BuildConfiguration)-xunit name: '' preSteps: [] runAsPublic: false @@ -194,6 +196,8 @@ jobs: testResultsFormat: 'xUnit' testResultsFiles: '*.xml' searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)' + testRunTitle: ${{ parameters.testRunTitle }} + mergeTestResults: ${{ parameters.mergeTestResults }} continueOnError: true condition: always() diff --git a/eng/common/templates/post-build/common-variables.yml b/eng/common/templates/post-build/common-variables.yml index 61488fd767..867f37cd87 100644 --- a/eng/common/templates/post-build/common-variables.yml +++ b/eng/common/templates/post-build/common-variables.yml @@ -9,8 +9,8 @@ variables: - name: PublicDevRelease_31_Channel_Id value: 128 - # .NET Core 5 Dev - - name: NetCore_5_Dev_Channel_Id + # .NET 5 Dev + - name: Net_5_Dev_Channel_Id value: 131 # .NET Eng - Validation @@ -96,4 +96,4 @@ variables: - name: skipComponentGovernanceDetection value: true - name: runCodesignValidationInjection - value: false \ No newline at end of file + value: false diff --git a/eng/common/templates/post-build/post-build.yml b/eng/common/templates/post-build/post-build.yml index 7be5b0bfad..fbab4cb5dc 100644 --- a/eng/common/templates/post-build/post-build.yml +++ b/eng/common/templates/post-build/post-build.yml @@ -27,7 +27,7 @@ parameters: # needs to be updated with the new channel ID NetEngLatestChannelId: 2 NetEngValidationChannelId: 9 - NetCoreDev5ChannelId: 131 + NetDev5ChannelId: 131 GeneralTestingChannelId: 529 NETCoreToolingDevChannelId: 548 NETCoreToolingReleaseChannelId: 549 @@ -35,8 +35,10 @@ parameters: NETCoreExperimentalChannelId: 562 NetEngServicesIntChannelId: 678 NetEngServicesProdChannelId: 679 - Net5Preview1ChannelId: 737 Net5Preview2ChannelId: 738 + Net5Preview3ChannelId: 739 + NetCoreSDK313xxChannelId: 759 + NetCoreSDK313xxInternalChannelId: 760 stages: - stage: Validate @@ -63,7 +65,7 @@ stages: inputs: filePath: $(Build.SourcesDirectory)/eng/common/post-build/check-channel-consistency.ps1 arguments: -PromoteToChannels "$(InitialChannels)[$(PromoteToMaestroChannelId)]" - -AvailableChannelIds ${{parameters.NetEngLatestChannelId}},${{parameters.NetEngValidationChannelId}},${{parameters.NetCoreDev5ChannelId}},${{parameters.GeneralTestingChannelId}},${{parameters.NETCoreToolingDevChannelId}},${{parameters.NETCoreToolingReleaseChannelId}},${{parameters.NETInternalToolingChannelId}},${{parameters.NETCoreExperimentalChannelId}},${{parameters.NetEngServicesIntChannelId}},${{parameters.NetEngServicesProdChannelId}},${{parameters.Net5Preview1ChannelId}},${{parameters.Net5Preview2ChannelId}} + -AvailableChannelIds ${{parameters.NetEngLatestChannelId}},${{parameters.NetEngValidationChannelId}},${{parameters.NetDev5ChannelId}},${{parameters.GeneralTestingChannelId}},${{parameters.NETCoreToolingDevChannelId}},${{parameters.NETCoreToolingReleaseChannelId}},${{parameters.NETInternalToolingChannelId}},${{parameters.NETCoreExperimentalChannelId}},${{parameters.NetEngServicesIntChannelId}},${{parameters.NetEngServicesProdChannelId}},${{parameters.Net5Preview2ChannelId}},${{parameters.Net5Preview3ChannelId}},${{parameters.NetCoreSDK313xxChannelId}},${{parameters.NetCoreSDK313xxInternalChannelId}} - job: displayName: NuGet Validation @@ -198,9 +200,9 @@ stages: publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} stageName: 'NetCore_Dev5_Publish' - channelName: '.NET Core 5 Dev' + channelName: '.NET 5 Dev' akaMSChannelName: 'net5/dev' - channelId: ${{ parameters.NetCoreDev5ChannelId }} + channelId: ${{ parameters.NetDev5ChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json' @@ -211,10 +213,10 @@ stages: dependsOn: ${{ parameters.publishDependsOn }} publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} - stageName: 'Net5_Preview1_Publish' - channelName: '.NET 5 Preview 1' - akaMSChannelName: 'net5/preview1' - channelId: ${{ parameters.Net5Preview1ChannelId }} + stageName: 'Net5_Preview2_Publish' + channelName: '.NET 5 Preview 2' + akaMSChannelName: 'net5/preview2' + channelId: ${{ parameters.Net5Preview2ChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json' @@ -225,10 +227,10 @@ stages: dependsOn: ${{ parameters.publishDependsOn }} publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} - stageName: 'Net5_Preview2_Publish' - channelName: '.NET 5 Preview 2' - akaMSChannelName: 'net5/preview2' - channelId: ${{ parameters.Net5Preview2ChannelId }} + stageName: 'Net5_Preview3_Publish' + channelName: '.NET 5 Preview 3' + akaMSChannelName: 'net5/preview3' + channelId: ${{ parameters.Net5Preview3ChannelId }} transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json' @@ -352,3 +354,29 @@ stages: transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng-symbols/nuget/v3/index.json' + +- template: \eng\common\templates\post-build\channels\generic-public-channel.yml + parameters: + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + dependsOn: ${{ parameters.publishDependsOn }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + stageName: 'NETCore_SDK_313xx_Publishing' + channelName: '.NET Core SDK 3.1.3xx' + channelId: ${{ parameters.NetCoreSDK313xxChannelId }} + transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet3.1-transport/nuget/v3/index.json' + shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet3.1/nuget/v3/index.json' + symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet3.1-symbols/nuget/v3/index.json' + +- template: \eng\common\templates\post-build\channels\generic-internal-channel.yml + parameters: + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + dependsOn: ${{ parameters.publishDependsOn }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + stageName: 'NETCore_SDK_313xx_Internal_Publishing' + channelName: '.NET Core SDK 3.1.3xx Internal' + channelId: ${{ parameters.NetCoreSDK313xxInternalChannelId }} + transportFeed: 'https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal-transport/nuget/v3/index.json' + shippingFeed: 'https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal/nuget/v3/index.json' + symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal-symbols/nuget/v3/index.json' diff --git a/eng/common/tools.sh b/eng/common/tools.sh index 664ac1055b..caae1dbdb2 100644 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -77,7 +77,7 @@ function ResolvePath { function ReadGlobalVersion { local key=$1 - local line=`grep -m 1 "$key" "$global_json_file"` + local line=$(awk "/$key/ {print; exit}" "$global_json_file") local pattern="\"$key\" *: *\"(.*)\"" if [[ ! $line =~ $pattern ]]; then @@ -438,7 +438,7 @@ temp_dir="$artifacts_dir/tmp/$configuration" global_json_file="$repo_root/global.json" # determine if global.json contains a "runtimes" entry global_json_has_runtimes=false -dotnetlocal_key=`grep -m 1 "runtimes" "$global_json_file"` || true +dotnetlocal_key=$(awk "/runtimes/ {print; exit}" "$global_json_file") || true if [[ -n "$dotnetlocal_key" ]]; then global_json_has_runtimes=true fi diff --git a/global.json b/global.json index 7d58ad57ad..57a28d4c9b 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "dotnet": "3.1.101" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20171.1" + "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20201.2" } } From 3404f7d985197aff5db1c46005f2fdb6e3e586a3 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 6 Apr 2020 12:35:49 +0000 Subject: [PATCH 242/243] Update dependencies from https://github.com/dotnet/runtime build 20200405.13 (#990) - Microsoft.NETCore.App - 5.0.0-preview.4.20205.13 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a9d7369881..834a213e5e 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -18,9 +18,9 @@ https://github.com/dotnet/arcade bce0a98620c1c5a110b2bba9912f3d5929069c6b - + https://github.com/dotnet/runtime - e253ff3b39badd44317b6d56adba46a48169201d + 59ca590949ade88c712e4ca8c6835acd0e9cbf46 https://github.com/dotnet/aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 237c0e26b3..e6da2c09bb 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -18,7 +18,7 @@ 3.1.2 $(MicrosoftNETCoreApp31Version) - 5.0.0-preview.4.20204.15 + 5.0.0-preview.4.20205.13 5.0.0-preview.4.20203.11 From 84cd20ebb41944a5c3a14ef5b97d8da34e568a05 Mon Sep 17 00:00:00 2001 From: Sung Yoon Whang Date: Mon, 6 Apr 2020 16:45:43 -0700 Subject: [PATCH 243/243] Remove dotnet-counters' unnecessary dependencies (#992) --- src/Tools/dotnet-counters/dotnet-counters.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Tools/dotnet-counters/dotnet-counters.csproj b/src/Tools/dotnet-counters/dotnet-counters.csproj index 7e9887f6bc..1631f6bb1b 100644 --- a/src/Tools/dotnet-counters/dotnet-counters.csproj +++ b/src/Tools/dotnet-counters/dotnet-counters.csproj @@ -17,16 +17,16 @@ - + - \ No newline at end of file +