From 42172ba0fe9c960450432bad84416aca8c49099e Mon Sep 17 00:00:00 2001 From: ImgBotApp Date: Sun, 23 Sep 2018 19:26:54 +0000 Subject: [PATCH 01/32] [ImgBot] optimizes images *Total -- 61.18kb -> 44.41kb (27.42%) /demos/headless/icon.png -- 4.26kb -> 1.80kb (57.72%) /demos/interpreter/icon.png -- 3.13kb -> 1.71kb (45.13%) /tests/media/g.png -- 1.14kb -> 0.66kb (42.17%) /tests/media/50px.png -- 1.55kb -> 0.93kb (40.31%) /demos/graph/icon.png -- 1.72kb -> 1.03kb (40.01%) /tests/media/30px.png -- 1.10kb -> 0.67kb (39.4%) /media/sprites.png -- 4.05kb -> 2.53kb (37.41%) /tests/media/m.png -- 1.02kb -> 0.65kb (36.49%) /tests/media/c.png -- 0.84kb -> 0.59kb (29.21%) /tests/media/b.png -- 0.75kb -> 0.55kb (26.79%) /demos/accessible/icon.png -- 1.38kb -> 1.01kb (26.69%) /demos/generator/icon.png -- 3.52kb -> 2.61kb (25.64%) /tests/media/a.png -- 0.76kb -> 0.57kb (25.45%) /demos/fixed/icon.png -- 2.06kb -> 1.57kb (24.08%) /tests/media/d.png -- 0.72kb -> 0.55kb (23.58%) /demos/resizable/icon.png -- 3.18kb -> 2.47kb (22.27%) /demos/toolbox/icon.png -- 2.76kb -> 2.16kb (21.83%) /demos/rtl/icon.png -- 3.07kb -> 2.41kb (21.46%) /tests/media/200px.png -- 2.11kb -> 1.67kb (21.06%) /appengine/apple-touch-icon.png -- 3.93kb -> 3.15kb (19.78%) /demos/code/icon.png -- 3.95kb -> 3.19kb (19.44%) /demos/blockfactory_old/icon.png -- 4.34kb -> 3.55kb (18.17%) /demos/maxBlocks/icon.png -- 1.96kb -> 1.61kb (17.87%) /tests/media/k.png -- 0.60kb -> 0.50kb (16.18%) /demos/plane/icon.png -- 3.32kb -> 2.80kb (15.63%) /demos/storage/icon.png -- 3.19kb -> 2.71kb (14.99%) /media/quote0.png -- 0.78kb -> 0.75kb (3.14%) --- appengine/apple-touch-icon.png | Bin 4025 -> 3229 bytes demos/accessible/icon.png | Bin 1416 -> 1038 bytes demos/blockfactory_old/icon.png | Bin 4441 -> 3634 bytes demos/code/icon.png | Bin 4049 -> 3262 bytes demos/fixed/icon.png | Bin 2114 -> 1605 bytes demos/generator/icon.png | Bin 3600 -> 2677 bytes demos/graph/icon.png | Bin 1762 -> 1057 bytes demos/headless/icon.png | Bin 4359 -> 1843 bytes demos/interpreter/icon.png | Bin 3200 -> 1756 bytes demos/maxBlocks/icon.png | Bin 2003 -> 1645 bytes demos/plane/icon.png | Bin 3397 -> 2866 bytes demos/resizable/icon.png | Bin 3260 -> 2534 bytes demos/rtl/icon.png | Bin 3140 -> 2466 bytes demos/storage/icon.png | Bin 3268 -> 2778 bytes demos/toolbox/icon.png | Bin 2827 -> 2210 bytes media/quote0.png | Bin 796 -> 771 bytes media/sprites.png | Bin 4146 -> 2595 bytes tests/media/200px.png | Bin 2165 -> 1709 bytes tests/media/30px.png | Bin 1127 -> 683 bytes tests/media/50px.png | Bin 1590 -> 949 bytes tests/media/a.png | Bin 778 -> 580 bytes tests/media/b.png | Bin 769 -> 563 bytes tests/media/c.png | Bin 856 -> 606 bytes tests/media/d.png | Bin 738 -> 564 bytes tests/media/g.png | Bin 1169 -> 676 bytes tests/media/k.png | Bin 612 -> 513 bytes tests/media/m.png | Bin 1044 -> 663 bytes 27 files changed, 0 insertions(+), 0 deletions(-) diff --git a/appengine/apple-touch-icon.png b/appengine/apple-touch-icon.png index 455abac2d717691105ebaf44f37a13e5a726bc9b..38dc7ba1d44f16b8df8a3e754b5269919ea2822c 100644 GIT binary patch delta 2966 zcmV;H3u*MZADtPHBsm0UK}|sb0I`n?{9y$E001CkNK#Dz0D2|>0Dy!50Qvv`0D$NK z0Cg|`0P0`>06Lfe02gqax=}olAv}Kzj7da6RCwC$o%>r8R~pCjx9lI0x^=hPeIB>l zZJTPhT19L7RHxPoYP+Jn$W2gGh%0F=))KTKf)WK6i3TN5U@1^8LL17Zp(!E;sA*us zMXveo4?r@LObEe{sQu=7KEIGTGbb~jIp;m^IWs5#C3vp2Cdr2xB5UPXO-uk6mM?(|TwC!D`-{{%{v0HsR6me?f3C7iZ;R5!GSCYampR-Cx_jaRVj8J5oxkD{ z=HcX|;(Xx^yt3ycVv;XP%BKq{+OYE@%*@RAIbk1iVAtW(cy)gkHYeyj-J?<^;D4iIp-pyQtF}mFdHa88;j${3 zl3NaSK{e9zDzQEF@`?q!GqEVxJsb?7Y@T&|@p7Rs3W9l#zubDOn=rCas6oE4l5+e4Ms&xhPn)crNAu zlqvytEZqo}F>sE!)_s*uj`oIn2ulUxRwrhBip@-npw53>xop7%T^o8G zBN!YUfn)dqinRuR!PM30a*Qr)GX#BrnzljXTg}{Sa*?` zF4uw;q0!~ttiPdLeh_~oIzL?|V;B;v7ok)Mcyr&8$P4y?=K5nG*c|$8Hk8#`(d+YF zZc~uzG*>1#`RI3h@YXUsg$U z1)Ft3pDq5r2Oz+@NgY!t=W(&NRK+9cgyonbyMOE8Pejr)}=vUxA_ zNN2rl3$`=ABd}b7VlZ`s=WoEIU%Dl$)%$I@;hy2nkhy;d{(?!n9C2$WM%y{=-J7iuTT@D;j$>LB45lF2J#+=cX>-5LUqspZqfNUF7~~wqT;J#+U1!R&36{i}DC2z91vW zO_$%7p!>-q%b2y^r`#k8)$*gtwERkF@++aqH$jjb-}isxl>Z$81dA`dC)-WNWQ)4T z5R=eL3bxQiCaH5GFW85ll}1mniNM2s@x@#Wbo~SqUBIRGCFzzX?jl}X4o;j+4>b?x zA44`>D+(b^@eTS#-Sc91pVjQGmBUgUwsXEENgqAI4t;Us@yLU%M6eVSEUvlWxhaug zGmdV=rI>$Uae0M1nDVHC0hoP&%n`CvRh>qeHoWIOqFtmo20MJN?6GXY zycb{^rP=^7n7Y9mt1Tf|oWUkaJJkD>^9~|>yT}AxIWl$S$kZAAx=2T7Betg0U{IV^ zvDPnJu$>00Xmr~FK{Rg(mo2140Lx*`hTV|~@&SJ+KEG1y5iIqBIf_C4Buca8wlSl3 z7Jef}xfskMy6fflRe(HEkUwT^^eH!o3Y|>uD7!sykS~&1l6DZqi@`JbCiF~sN54&? zl!|=%Soy!hsaK?NHbolw-Y+0cFWS1e~az3d+yBV#9mW%FN&Q{#{S z+ykXbz%#Gz!p4uaVH3NO6L(p3EuYFYWY}BcI0Um#Zl-iFu-bwM>U^c5KV^*5|YFypr!k`^o` zIUg^_W@62T-5$Ai95{xa-hKd3eBWb7lJ+*#1=TpFtHk!yOJV!*aoLs7n_GWST4h0L zRUQ<__rdjmwfgyR;F-=0+5n8=*IphkXR8oyl74O+2+S!Q5`QqO#eFU1>VJ_+C2JZrbM& z>)F@d!`Frzn4O*TZ2wc=uVH^$GEL-HP6QqWhxN&#Ltmh>*@`?V(R#dl;;NrmDY@m?b@Hkt4p*uKSVDd1!S9WjFV9T69S$DlX4F)lP&=$e+46if)NTv2n8b)j8HH_C>V)0{|CL8wz+2y zZv6lN03~!qSaf7zbY(hYa%Ew3WdJfTF*q$SIW00XR53X^GB!FiHY+eNIxsLu|JnZl z001R)MObuXVRU6WZEs|0W_bWIFflkSFgYzUGgL7-Ix;poG&UPx# delta 3740 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 delta 1382 zcmai!i8~Z{7{`CHu7@^zW8;QVMTJYY}FoG=Q$Q&4$fy07$7hJJ@;QxV*8z2ow@3vo_u7yy`E4uV7+! zrxpy3`p2}7)kQuNHr3XW3GY-d6k;onhqdSVPgea^eF`~;RG2y zJ43W4?55v@v-n(eYiw|XuWz&uGRXy!&8N1vzqVC%lmHJ~TQ`i|F5Bn62yVD21?Cbh zoMEbSkzc#T18l(+T<6p;_t1K`$7;e*D3s>~Dx9_1jJ3}d{;FQk;0rGXR}LuTP%#*c zJK-LUN~Qif^u6T%eN9R)!qn7ZJyjS2bYj}lXgKWwI7=DmBqb&7^LsK%1>kA;V3~<2 zLnEhGO5&Z3 z6!!K(VC(70Hp}^abr*%WdsdmkP9Z3Pt`G5(z5xL=4|eiNXxY+9MW~_^9*^IJyJ6$v z)?_M&aUM@bm$F{W_%L?1bd>Ypl3>kB)V|S7+yh9%uv0r9eNm_c75lN99foqccd{Yf zrvuxvAvM^^(NU)A1e)QPGIz0{_o0_P{k8I9e{FsJuG#9D!!H3?5Tp?H$CRV;W6enoLmr$-bD%B9XpcJ?!NM>uzy-eZ%x-Xj6> zdqbhkjQHoJ6kMc1wh>ve{u~U=`VbEXwg_U~`|I*Ajc%NWsRm_aXevl&wJ7L6KWh*I zUuCw$ZLQ5#kzjm%$>-6|D$%jA1aC<8&z8xn>GNGzCA}Dn zi-bie35M5m9vP`Pb?u{hf}MTEPy&a;DVDt2^_Wc7ukP+?2w{3Pjh7};C$+6$DJ%(aJ8WBx=keT~vQxRW zvQWHNGN8P7^V>K7Ct{8!Lr>J1nVB8Kyvuw~%OLhNmWKMN z*Lr_SHZd`wk1S-^OcT}A)PfL1f@SLZvYwkal7q_Bc|Uv7@CfUx8jqbvvV*ap%stG@ h{27DX{}GUeP>z?FPH{TpGbC0iaCUTesJ9Qw{09M@p&I}I diff --git a/demos/blockfactory_old/icon.png b/demos/blockfactory_old/icon.png index d4d19b45768cf9740aec1d68b9ad9b21bb87fb6d..4f8b72f41ed08a623502a97f09813f5dff5c9069 100644 GIT binary patch delta 3576 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 delta 4392 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 COb(#{ delta 4015 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 V%>jr)k(K}e002ovPDHLkV1hsf%o6|r diff --git a/demos/fixed/icon.png b/demos/fixed/icon.png index 1158acf01762bff32a93f320e694882ff80f81ca..0a80ef9a3b8bca5d1765fb924f1c076598623bd8 100644 GIT binary patch delta 1599 zcmZ`&doS$M`o5#-1=xAp~L)V9_t9o>md2G_ubO}Q}W@@5>(l$SoHcU~J zq;zZIRaWXXS{W)?q!og&Fd>OrJd)T?36Uo2cd>K!=l;0op3mpp&$;*9`?)Mr&aNUW zcpC&klM^;G`m{a9!`}mfS_(~c;XCx$=7JB_AA-^kKu|_D1ijKz8H*5JzT}b)Mh9QD zq4_N0`Z2%gPtRR~v5B-(!KwG#`AN4sLo@21@4 zWR6G;fL2)mH=MsxQ~QWHIsGC$or=aL@J1&o^uD;f)|i`3S@(Jf^m&bb3a}|hRLI&Z zjY3q&Unh{cGOeCOsBpcq2I z3|4N{<8%g#KxU@F4KbI0z+an20H_kYluQ0d?^;kPUZjz^nuW>!+F|)tzx5Wlo~w8* zVz&eJs!*~doI_MvAfMoebjU||!&R&~DeozsER>0+5G~+6V&{@!j#Ld)3li2mkn+0e za6KZK5HhPmnwEe)XUSA$Lj!04!Vs z=`5vYVLFe$j!1?I1!~#Yc=tRAx=aUJjZC3m{%T$SBH@lmCYtFK{KYKeh}biLGAv8>AOR@OL$(U)+m#rNBMw}80bets)= zs*^iGEq}o18m(jUtKcb(bhy_qhB7|05JD<>xu&{Bdyw8F5lU9zieE!B8zOU>3Tg)m z${$=UZSCR)r|CUrK*9!`g-*>+MsI-#-!t9@z|cvo2gXF7^GOh7V!jmy(A`Q)J!wS3 z_@6dq1-pi%-N2^*$mt;HR0zdRA58V6Z{FN_ z#`kaQ?E5u4)h@9PrMa$w2L`-p?O1asQhV&UUAAp}1uC3Ep z)&}|SAkDPKda8{}A~w<3&Fbvc)N?Csj=|5y1%lWpYJjoJwz5^4^I!upd}Gj!sz41@ z6z(WBHEE%|<&2LSDRM`R9&{F#f9)C6*S(MT?7NRrgM-5C9c+X8hQ50kodo*}A10$G zo-~JgUTnT-cg$+0BG9Wi$SA|9I(zaip73P%FBhAhrxZ_T-ZP8%D$$r$v@E`5-5NF= zYP3PW>~6n(k5p=V%?k*tTV~D?E%A209UU(|LsVH7lpG`q!W~cKESH)-G$dBSkqq_o z*q@3HCnqOI9cO;yiDP5QdZv&;qq}VS_^WkXfpGU--Cwe)b6xODRjZ#j?mpAsT4;{~OC&RAtGk)7n#{IZ? zXs;EW`9%QKrUP1QVBfCB^mQVQE77{24EY593_i(5^?(A0Kr@q0lIl k5BLN8D>(k2B0eE9HahM96>f}h{pUas=5&B}lV@1gKgDNS`Tzg` delta 2087 zcmV+?2-x?<48jnQ85#xv008d^(C+{M00v@9M??UC0Du61L@1L@limUzf8Gia00=a% zn1LAp00+-WL_t(|+U=ZsP*m3)fWL+1;exW5Rgowx0W?~P;-f*UwVhz4ElEg?O?{-3 zNm83>ZENi#Bh!X;VrF8-HqF#YNs~IZX8O?1q^Yl>gmx+_sfdf9BJ3(JVP#PlaMuNQ z+5T~t<*`d$1PrmiZ|2T2fA`$I_uO;Nch2v3?+zdcf*=TjAP9mW2m>(~3?7fi^THbfX*#1Jt=5JSWeK@1T?1TjPm5ktffF+>azLj*BI3=zZ-F+{j0 zhNuQJBrh*7sLuPvACJo`)*xB^*c=k3#Pl}4O6Ax7A%VUaY-b2Vf8#*m3E$saw{B%r z4KY?XNsIpvTAR!~wR|=k);%GHj70`BBxEQD3nRy1gI)~zv>DRe+Rht${>@K!9%j$s zGuUr+`O5nKEkH}dMQTnLQg^-tNBfO_WzG&;P=j85Cqs^WY$h}`lFoHJekF&bPXr}{1@J?3cLH(@jOW0 zmL;U9ukq%#BFY97kJxp*xLvntYiZyIFRW%wP9_)44Q$_a2&Za109{>9=BLdZz9E)t z9ZC;(-UguCqvE{}&+yXgAMoCXr8t~jIGn+l5{h!$omg#lf2=k;wwua1wQ+hjZA|wa zr)oS(B3qz|7?7?0W6nJic%;EtkrP2=x#@dE)R5 z=?Tnkb@p#`yVC_gb$#oQD&E!Fz~-H2de1*&F~3j}wm#HbupnA-cCGnTZJ z2yA8x4ME(OH946yS**mzO}e8Y>cI@@>6Fk=WfXO}x<_T+?XK!n z8qVdW4He-7%2%#h$@;Vjy*n1Bl2u#H=H2B=V}5QKf4M8-dZ)sLsXV^4f!BULU^?|o zCvQszDUr}+xyakiJ^N>~>DhTq!olAS2iWKByzhSRF*0;2OvMM;TIdMsUgpo4F=$!e z&gdER27}>~kFvs}r;z*Ha%FpQ1@F9)j25t(>ZurL#-m^Gc19=VrAFRA)`$(5q@TgI z?8$gMe{=YWw=wTDoE|E;qM553^M+E!AB?g{s%1p zBna)i=wDJf(xo{CogFu9p#3i=!xHcklw zuJlHi<0ATx zmafiQceki(6WG2n%eUqKJd;_`03Dq8hqd3a1vPB|%*}e5A7`iX)s>$oci98Vf4X8U z;q1vKY=BljpY7`xux?c*-${!EIyrx=&1X^~9(Ltlzy^ft^yFpg{KYbwFgbn0kP9VM zL%J_b^u$5SF4VS+oFQ=!D4AwtM3^rly<#e-uJSmJ*2_c5WxcCbIPtpizAZ`(cAJ$w z`3E`VTR`2u^`PMLO(24~3+M5Tf5lUX0_rMD*-;V>EoXT5s1-X9pYjk{X|aUkrmpfl zzqf?=!f6L8RH{mLpHcFYl#EA6>{}-Q)fGxEdk2}bh5bX!-Xk>8lvP&u+qdtZmAv}9 zA`YFXVgIpnK^bz#_aV)#?fl`ek!Gt6Q%w!mn=TU>5y~q+e2zu)KEp5ne{}q=62zgP zN={;RY7AkxsWX;SYzgs848OEAnlP1{`eKt`_#7-N*FDMl)NtyI|KewVvkpC8v0P$* z{>z-ZWZ}T^YSi8w&gFJUBvqISQ7Lxe?(#99m5fdhY{{3Pn*biO(ZV28|w`RR$B)xjb>im_!J8t zndvjcU@)kLyoLZwh>oIY?^_h@eT&T-p7C|Y{lcV_IA-Z%lm77^1HQ6~i(@bk8H1euYcX$D#z5O8$}Gc=CY@a_oYy-(eq53=zZ-F+>nU z#1KIY5kmwqL<|u_#1KIY5kmwqLzNyz71cdEY$-0#Z^_(fM3{|HXaBB zTi9Cwz|(y2Pn;m{u6ohh#U20>jsQSP1_12vLMh7ta1{mst9}50yaNF8k!2muCIxCH zMBxA%OAEKS*KG2dtE&y<1#{LsfclcW+vwSRq5>K=Q|+pzuae%=Rj3f0EqWXmFVT?W zXJGJ7ONg0AIOn^Oy8xkA3)an_lFERB)(bk9Enb62uF6CVdMJAl?Fro<+Dvhj`Hfy{f2!d z%(0g#scW}+Yhy!1<6CN}FjE%qG+dlNMJs&hJ@uZ0Vc4incDnFdj0)iATQHFE z9D9!KxP_i?kUhE{mv8}{kmFZ;;s?FBzBw6&Ra4z=fU;?7^-F8`8+%%3_3t`C;=nHt zwAT0(&e9(h`!5f#_@>KebxT3lGO80Fc6`E;KM@x~Jh}YcJ(iixrm9d8{fdWa!qgK2 zfKW0P6G$hZ>+O!s|M}Rc>k$bJe4Z&B>rs#A9%hN<^|-3&vF9_Gk2($kK<`A@auL)!hAb#Bb8L>;s<9H^VJLi8O%387)+HABg4> zGvf!mOCy;R$%r5@;P)f{XniQvwq+miYx|<-{f?(VPE;%tRXi&>pmv3Qd6&7Fo>Cc8dXUf?g4N2IJ<#u1z+a66CXKAt>c+v-l8 zU@EjfOZs7cTcK=f^ra_HBSkK4W6Q)Qt*$COef2=LorT#^mt2F}i* zMv|-yMMCWSWu_Wa6MBOYvT=92EB}~08Em*# zk%kLbhS;_SGwxx`pLKLNF+K=s#&-C{L2r*p%g7iLcSvJFuC;Env$OZgo0^(zs|$yg zqT0RMz042@8?!&h$K7k);H6{wP?h|TktfR>j#e-z2xe!eNt&ve1~kV~{r1T6TK$tJ zq@p5K;>5(n@HNV$jbui!l#HU{O61AmMa8Qm66pzz#!V4abE8gUFqp5wYmT~c4RCE1 zi$#<~rJg=ro9N6{FR%^@3Q`t7zcEmY0>8n3^7p^cT;5aR0t4 z5=kBju)<)fDU{N&po$hPUrenVfk4P5TB`Gs3k#$7ekFgMifBcH`uh3~nZ%ub+KgW? z1L5%adM2CD?seh91xeIX?5A2oLqiz|L`aR!WaE28#KhPfPPU|h!i{(Da7S+2>=fO- zyRs63LhZB1-YYC9kdkyyN-|;5ZXb1=NF8_=X;Q(fv5KN}QwUWvxzZWFL5wp2y_=*s z9x_ePxINO_*XOKWRkIR<1XWr+sLZNlvh{Rys5IJ^{F%wgNl6qW4`V1wrBdY~kiU=L z8f6J(WRjYuL%qGds}F70P%0~NQBfN|xnJ(JSgK29+!7V!w0TXCFE0A0sot?WvZHhvUU~#tq*Ov8g*<|F`Q#gMldd^9j5mkP zEcYdFH#J4H90e^GSkYY13(De0O-vI0a?NG;=3?7GIZ z6CGJTzD2P#U&z0C^Pp*hn|i_h^R~9OA-$X2+XMdG^h~>&=}=+}g|NGG6@=rp2_yCo z1*~IaB#Vk$8oXIuU0rI7uhJ#Cq1QSeKMuv=a0G(;gMaQ9bt14r>1yWYd*9ehy^=7V z29mk4sd6$hOZvZiEKsnKFog3{uC{X}5c{W&s{y+3~@ zc{B_T4arDLW1$cWNg9n7-9G0U9~g+KpUJaShvaEWfovb6oUp56Zv~_ecQEJ); z#Z^qUKfmjXO$}_Cb$VVwCU1T?fj}H98AT|I6Z3~$wTtIj1MlB!ybjLJ&Nk0$!dY1G zWx$ZggviK9w7$5wxYe06Xb>0-HZMv4nkTP66?(!W;;Tflu(0rQ@!Xu(rpn5d_N&Wm z_BkzC-kut5H8nQMiU>aDY{-c{XY@9}prYWu-v6>8tToqsLqy*{SiTlN$otDRV=&m5 z09;HU@?vx#4*&z$@sqkRgsy?1+i?Wa0FE?*>%d@07|eQacJF@(;rM_{LGk~efT+Tu Pc?7@)<6!v&<(Kv^vx3Yo delta 3553 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 bfL;6>0#dKt^*kWi00000NkvXXu0mjf0MF}# diff --git a/demos/graph/icon.png b/demos/graph/icon.png index ad8b582f69db7b102629ff4086ec495c5369d966..7828463dee6708147350f6920901c5e4534dc16c 100644 GIT binary patch delta 1047 zcmaFFyO3joWIZzj1H+B$3U`4NOS+@4BLl<6e(pbstU$g(vPY0F14ES>14Ba#1H&(% zP{RubhEf9thF1v;3|2E37{m+a>!op=t0e)9CG{ zF*{7$iq@@L=i%XTz5e=jCnqN#A0HPNm*V1L78aK1`pYq=gSvs1GbVYvyD)UH%6b4f zoCO|{#S9GG!XV7ZFl&wkP>{XE)7O>#5vRDYl%A^WcV`9$CTC9<$B>A_TW{o6UosG3 zd%#?&Q<;n%J%;9shc}!lzt&Egz~B^m$lXT{4-K zzPoyTXoXUaisO1`cM~4jjSY*H*;Zbd$Wv=I$(d93qQnKk)el~D91M7If`e1m(?HD1 zsBxh(>y)L+nl+{0US8b%qhmMsk~y}0{TVzhy-!{{m`(UEad)ovyvHejCy99$%6nM; zRx+D(cd3|h>)BTu>VpMWPq;8qv+aJ*pc$AFy^CbHCPwDj!w`ae?5$WbfjNY3?j7X`z^ylkG-ZSL?0 zx_12Igx-5yvY}c_J0@P4#VTi;s2sMiqvwy^zs+mDhxvUlcgkOCB&Ag7pf~01sxM(B zdqWm2*}y6z`%&6do_XbRF;2s;c}(n*xgo!JR92cC&N#8;+Wm(L>x%wfns6}ed{cwQ zllqb+@p~UfdUV;z7B(zZPWzqR-=8!0o5uRdP`( zkYX@0FtpG$u+%j&4l%T}GBUF=G1E3Mure_4_Q zKr$MM8*a%irdwQgv!KRAj6$4QVkT=ngGkJG&^H zAuXjJ=kzV|{4d{g`u6nwfAxKy=Y8IDo&zBOwY9Yga!9UzckSA>B(C?3vR{Ra;-|v> z28$2{5>qv`JHR^yr0A8{7%zZ;L;w%~$ltRD00;<6jq=l|Zyo^vWbe=r5Z3zk$qbA% z4K~EBBp|G1dOQpO$VtY0FA#UU?COF&qw=HUT}IQFKFfJA~b=bZx5Q&plfCm;;;(Xn9A4|O-$6hanyUG`fdqs>R28hLA|Mj0wUfuinr8rjb0-r6HdO>fLUr24 z@j+!b0H7#8e=eY?ihxM0zQIYnTk!{Yr-0lnt=|hk0wPmH^DBvMv7jEtL2;g%2g2%Ibig1xPDW57z88;RhtG;RT~Y!?K4gvO^^%*0SP#)?MGM7 zgcwbQ>c9y|kWo~%X+V6iCPAmbiPw1?%adoX$SaVpf37YVjYcSyO1NAuT)A=u27_T) zfoN)XpuS}UO%{jPR+Jxy!hO0$w_zm*a_ZD6l$Ms_$dMzsb?X+&%F58t(C|_NXtR!? ztJ{TE>ll9O_y@dG5Rc_%X;G9HAN1-wWFRdqEx32@9snRGCkIBOF(OS#zkSj@qq|*j zIREuHe@9qXfNImAN4sNe3Rc^=yPu&6^bbvWoRgwgB7e^s9Lm&6>a-UVCkTQtzfr5z zqNk?^8jS`HhXcvU$rv6UMn*;klff61@qpR@PO}YoB?(;2M(Mx9X#<=#2#yYb?*KP3 zz~r}joguq-?}piIMnORV%w{t(Gcy4I*REX)f7@Lgqx>|!doqH$$HQV|Ggk>Z1vbRG zO~|XsDrjOnlMdIbs!>v0Si`tlz8Qu@fk?0bG8aaQ zUWso$PhHmjf;o^&cc0Cf8JohIk{}@Se-~+W1L9LeSIajO43wAR>ey2SMh)g$!nd|e>}9K zf5@Fmr>Kgt$r|OS#qxFU7p|kx4R(f{IdcXT6%|k@6tLUv&}bHR!oF&J)cv>uymKW| zH%udH%!)wDj8F}g8TopR!u-R&UenM!Fd<|VKNT{Hp9&p+x#)EjLG~+It&`b$P`O!J z%2mnbL;S6EGPlZq5$*i3cj`3{f9>MzSdMp!L==#@kyY+%S{hN-K<1Xsrqp@_0P$5e zn-pdsinURWyREfjs)z4I?*8OU^tJ9)QfQ%xNJg akNyMRIE1ga|0S9L0000 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 diff --git a/demos/interpreter/icon.png b/demos/interpreter/icon.png index 02962833bd88cedf9ef75ecbafaf745832ee079f..b70d1b03595c140780326fed3509a5bfffdadeb8 100644 GIT binary patch delta 1712 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 diff --git a/demos/maxBlocks/icon.png b/demos/maxBlocks/icon.png index 13bf65a9c8f88792396a023a4131e21a10aa24b8..b90c79615013a248f06deff22ceb89516657ab6b 100644 GIT binary patch literal 1645 zcmZ`&dsGu=79T5!_}Ihq(6z2!bpxl!!|N+%H)1;)R08v4lwhLh5pN7MeBhOA1bL#dczbESP=Mik003I8 zmLTp2$CcT6aW?B@VT#8(IJ!|Y1&K?4*{yD&BCEAR2e`mTmT0Am_bu% z^CnpBNr;jG7HVFFQ+7W_}*}U6hpzLg;rg zG~@EYpw8}ve$GMDvoP>Thw7bfgP(QSXJoA1LNmf#k7$(w5Kg;!%3>S!LdZKlz{nXp zWA(T`R?%#LGXupm4 z=gc|)AT(k4ISjS=odyOSvXd3yfyED@(*xl=&9bb^#j?&B05lkWX3kXR7Ve;f0syr> zn)m$6kPMR+?#K@_gvUj%Sf3Qn=Lzb?3&pvm<%715 z%w^HJF^VIH-wln7L6bYmR3SA5F;A8E+^o(kZI5MAfc;cwZ0u|gp2fZT9Z&f0P;ckl zJxgY+OdM{KPrd!Z4;$-<$)iVz?0lJIbySCVl}r+>4@rrbZr->nE?4nmj)ypvf6QHd zye%S}S%c)XMTLJAkDSQtPucfv<&Bnw`Dw8J;HnjWTm-gn?M==Rmvuh3sQ5-lRP=Yx z?mqOV-tMm2`;m41p)cPm){Mj7-$?E}o6s{~e=rnzy~<>sm8w019d9JcZ-qYi{=g4h z@Mg$sXOt~6&&6|V#ur@78!me3VpCM6wD2Dh7Hw*1&Jpg!gto8Dp&pH`KknnAb1JW< zMkK8{H~q`1K-KE7Wo@6FmN0wM_9xfJcWseVi`Rz9p0-w|b*?T*JWV~>8ng5D$m;Fg zNgvh>zgO2aa=GrVxM=GI<+`0!$_tx5-B_D>ucB|)q2Gmwxsdw{E-L=Cff2LMV7KO?6OJp{8!eHNW{HNZCtmj{dND@cx-jJ9T zUt~{Nw@!0=t>SuYd&%dExq(|tWXGS_5;^-~V?_I|rPJ$E7K_8Rg~yU*dD+X#&pdrS zCgbwTup+rynpO6c*j2trZm92-sH_K*kdw(Z17mX2zuj@?LyySL?CXAWF6yg2oU5~C z*X=ha3qN_W>YZ;)1pZ5U&A?&b%%zhh{f1wc$2OG3O?P!uwyco}={eeL+2%OQe?8es zng%ytz2A_%QbyIZzper&_~4Xyij$22|9Cw{i2dFAHFuDA`d(zm!+u~_+M;}?2d-S&(GJ2|oUxXlq`9zx1-mzyJUM literal 2003 zcmaKti9Ztx0LM4E_sDA|_fZikR0`WNLYT9foXe3V&B*4cXs(2ug*R%3hoVxk7|qO) zqw$hCa||s?+U6b~cOyZGD+wG@2Yt^8fgx- z>D}aQbCw!~%>=<_ag3p4qUQg(_)^}EqDx=wIP1qX8JtL~3Ltedmv_EY&dSQ_%t==v zI48sWO1RIP{tR=SD2aFD(H6>L82ZH;Sixk%zFN{imkNZw^F__WDwNX{oF=PUgfAu}FjcZUS!q2po}z9^Tm?OLzQ&SG}+d zT0JQ;BdI~l0PNGJpzyw#)Z%U@oB*c2-Q|Wl)pmcfvTEL?qc*wxy8~&6_IL$ zW^UM>-cNzET)hLcZlr#dErO|P4DtC5V=r343n{xQ)LkfY7SWnK6AI6_k5L`i&;zY7 zkL)9>LY+twj^IJuQ%YzeXyC|7`~sHDgg*?U({^?gpFO-lkqFM@7{ut*zau8~r)L*@ z97{(SZy!MCpKXuW(2$EmJ^yO9ru4T~*ibG_^7U@IFv4`LO;?LnG-LJLw~a*kx<0`I zr=SfrQ#guzZ%y|yH zl);uGW0e&bJRg6=3_C%b>gc{cS2an@{qYyOAAe-joi>F?7ur0Yhd8#VNwTkQbNJ!+ z`~FJu&#~|D9Gt2UeRtcu4-~}FVl-H{wh)Vn);IO&0=10<5quu(5@2X8tZ5%(17$RF zxd{=TGPJ!AyAhRmsAO}@Qlq^>Io|&69M1en`e_q0mwwSa$rHaXzk>mgY#Zj4z~NfU;1VJ>uJ9hf{V&+snw{G| zc;U_JjDd^4%&3ufy!<@UX4R#hWuAdQn0Y>HaM_KH*1k|GnxoB(g^(ZODxg5t-?GUS z70BJQC#w0Ts1y;!f?P!*hH1|CYHoj|NQI~8s>OSQwu#bmh_xn!X znZXbC4$BNs0M%+Ejm+4(DnWoE0_I~ucK-edM0cYscz23|!8i!oEIM40)Y!i&mN2*U z3%|J>D0U?kLEMb3r2 z+9x|gYKUmHEH`9rrnjpSj=gQX>ef6q-?c8xF3Q5N5`X>?zS*YqiGt%=3v5&Y*XvJ7 zgBLd>OqG@ds7(DgXWddiM8a|s68iAaF{{AoKl(Hf*B4l9GQ$rQ1NlxHxDFP}8Cc^` z&enLmnv*XNwHVup#BU=pkPZjP`kN;F+kjA6e@I$B0?=BgcA1zpb zUd~Nh_A}|34;r63_$%38LO5Vq zTAki8`lc`#b{21zRkza|FfugMF+E*^pXLgK2+3Q({+X8z@rl24%4H|-{h4Lf>Vck~ zTt2pix;kU75?cCw?j+FHsBPNMOmV>>KTo)Ozg~mOo48Y;9VHEaago^?2Mp*o Wb?0tV@9o_$z~08$`t^Cg#D4+qHO?de diff --git a/demos/plane/icon.png b/demos/plane/icon.png index 0ebac70c65873f278497d0f332032d638947ad69..816cc75f8fb0101ead08a44b35dd3610ef6fbb88 100644 GIT binary patch delta 2802 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 delta 3340 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 diff --git a/demos/resizable/icon.png b/demos/resizable/icon.png index 4355275854b9c4ac35a3d0ef3b86adb15586348c..c4eaf81aef9a4ba22cdc26ae1d605e294173e1e6 100644 GIT binary patch delta 2467 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 diff --git a/demos/rtl/icon.png b/demos/rtl/icon.png index e177e32a3070392bae539bfc71ca5d995aed0cbf..284c1efa894b8725b2b2fda794d5a92b572ee532 100644 GIT binary patch delta 2399 zcmV-l3841G7@`x9Bsm0UK}|sb0I`n?{9y$E001CkNK#Dz0D2|>0Dy!50Qvv`0D$NK z0Cg|`0P0`>06Lfe02gqax=}olAv}Kwkx4{BRCwC$oY_-Tc^1d>Crs7MbN9va`F_<7}R5aoOL1>F5$|Yc@5yfVa9kQ^5H4s!N z3`;->GoYlwbkhBuhr5tKmK!7x$nRTq9{AmGe^tNFJ?H$EbFV-^L_|bHL_~i?L_`#N zO3QDAj8cb;T`O+G^KlFO8KdXp7F;WC^Lg*fie_Z1+A%schjjx9B^b_DSlNYT+pk^+ zZeei=g_Ygwy8lh38t(-pPV!*K+m{y~;LNRRZqTmYZ-st%%I&~u2PQbLxN@%rXKq#d zy#LYkawO-}a`%_y)q()wVex-b6(o1-xq-_o@4&17E2*zJ6Am^tJ?pjK29pa@b zzwUoDy&RVcn~{=Rhp!|>AV7H9N!b%zxz_?2rN(ut1_eL0KvmlgRc$-UsNvYuTmy-`0$-;p{OTuNt^@(%M;Mdk)k2cmfdl(GA&fV8w4+A`@b7;EI-D0bBRTUS z?>-`q$zYzDh2KD8L=^VKOR;NT0(R|7z`=8h9S`LD>`Fv@+5myTxW@kY@emR|9&&pv z_VadJxb=uvA5o|Ba6PZoKOp-Pv#>iV3E|O+D0x_iH;Yyj*YxaY7)cprIQ^a4?SKme zMjXlQM`LcE$Lk`A8p3~6rO$q1L=?V0ca0yA7ZY=k+%7{{q!4GNau?Sc8hgF7z2i;= zB0lZ(IN(K^Zs;}L_=_iCM>-(7UCyhoPYx#fm)zaOIO~!P=|xRQ&Z!Oj0LjNN4-c~2 zU>Y9cep@rP1OPA@x?JwjFl`6$4lVafc=efER*yq52KPWdFhYN$*F&$@#VRLFf-#SPCuB!ne?OUf@GsoLIyycLr zN4;xd)b!xbTb)A|7MCES)VNgGyrn=6QPVE%t(M;byhDFIle{a(Yz&YE9 z0OSu_4dnT_h2A8)TfezLdK*^Fz@}V0q;+;xt`OJ3xJWax&5XVukUtsG#6Zy0^nh}L zbMC{TzyoQ+D3cJhDb0Q7o29x=&0pg`ChaUr)Bum5Lt`KKQ$x*(&}ytbY*Rk*8P0s$=5eL&%Pw4O!&f}EPSy{^ z>AZm5mQKrW+|k=7>GGcu@sE1HVZ?l4K0A3fI)Rdhb@<}UZJfGM2^po{oCB}z3`8Ih z2;MAOk&t@VqqjJF#aXEwZx*e7ZFmPp>1V|8QbZRc-!d6fN3B?5|0YZQT z1_)cw;7&HX4I>7oE=#OI|NQSOCy5IB1kuVK=_)2+1z_%NLY!EGk!1kO(@1tMw3~l$ ztQ6WQOdbmN9I#qm;oco(XacF3w)-fbbI=1Q)?j#fv8~Z*KpoI3DXw&g1#)A+wW5WsR53c8 zzq8dW)y&iHws22AL>J`EkA*Ift5ttv&>Eg2!$;Xr<(LD21I>4o_>y_T=U)!e=j{V@ zA)TqWi3x=Zu7!2tI?lt`v-;H#>EC%MvIr$0Iy&0WPrer*?BAx5*GvTp8_sl0rK3}b zVyjf<$LVUw3!`+-aLOxO#bj@jTOgUC>LD(n$O{nH34jB}wkJ%rJRP2_Ge&=>fz@yW zo8gqJMs!ZQ2MRh5StpGI$a;XV18AFhNhk7>7cedU#+8|_4lxbWG&s{srpj*BtSe5e zgL!pDBmv?F5cvo*Rb45r0{|?}u7Q!9qk(qvol{-#0v@wdS+NeL<=-)qXv5mF;iCGAX z6!P~D0wnOBaaJlPpNZWni~c4b5yxcM9hKz2XRs=I(u0)j$39$IXW9MHaavnD=;uRFfgCh RYWDyD002ovPDHLkV1i)wUMc_p delta 3080 zcmV+j4EOV*6T}#hB#~e_e+$t`L_t(|+U=Zca8%_P$A2e#vbSWj3CUtEge4GTLLmsn zOOR9>+oB^rhYlS&bm%za zA$0?80J-=i~^J zB4qQn8Z{YLW_E^&b)Q>;#bg{&aQR&hF@hpD(7so$FT$lO|;Up<`z}2`MSy z$h47{V*{YKx0kBrfAd*hHs?6Gym_EmedB-&K@gA?1&=R+yDK>A^UX#PM^+ly_A~&3 zp)i|nStaO%i~*yVLSb$uHmex`nl;_&%Zp)%(pMWE0sGx1b#`pHB z_yb`|7H2Xm(??4nKCXG*tZk*WtwSxyn=MR;5JisD+4d1ZZ#w{m3(v=BvYgSRlw@0Y zWrxVFYTNOSfB#~Yb-*8A9V$mV?0_$?Gc&)!O=DMV%sEUJ8{40GIk8_G=|e%E8&}<4 z;z19$-+UF-+wNt}C5zAONXx3y)sn@o>b!*auUs$l#r27`VB7W#db_f*3d-1oSkpPw z*fKss)>M`f>};j|qgqxhEn(~LH*nn-J}cO5>B7>Ie}Xfb5J!fIgYS==gI%&%CS$R} zCq}s6>Pp2i%QWUZ1~HYxA0;N_IFnT}S4&{}ZQSOK-yFE-%*~{%$U!I~(c%tFuXJWF z=YiXb$V_xkmT)yRuwna$09=3LYE~6laDDI}Hay)pFzn`AzCcx;!fRXq!6OZ0yUUze z>CDO+f59Zrg|kgsinjh-l@0rk_sRBj3)%KGT%BXfCLHM*A0hon@kLa+;)W!~U!F#y(b$TEH^L;Q#rHR`BcF7vcc?^@rIvi5Z{W ze`sL&)mEBfqmUUBc>IeNuHPso8zIBtIvmnWNxyIVjFWs3j{WClHoT>kGxBrHAb0Zk z_NK{C)C|{LWZ|vW1m?(_!n%tr{Lv*$>AOvc5PvYD0!Wg4N(m7}!!Vt>tZWt#qpseK zYj-s}8>In@Y~{pjrP2u3z0*-&o5)~ye^*%3RQV(mA`iFas=s%*kW>MPa-c7gdh&_a zs0#t2ottm{p;b6bEPo26aVv_SyD$1ncuV#{q#(sCDY*UE!zu9@6-Uv-Cqe+_7Q zBb96JNCn{b`(!4osbAHOiHf7+`mTyaqeS5_|4zQ|K=lPVf$Z0#Zt?wR@CU(I51 zUMIEfAA*-?+&D=!^=KIlH;y@)*0G&!5m#>(>TQZ62b56H5>$e`Ek7Jrd3B z{xiCsRo4+_>E{F%E%kD!)`Y{6HsV-CQ3*xE6qm+OGJP}!PCVEd7a@||%Lhl?Bnz7S zA*{wAOIDf4&a#ed5rHmWm^N=W;lR{vOXwR^BUuAgpur>2;E~2Ldg}IwQgqSJEQpEx zgpL_R$Ym90^V@B&VGvWtfBg_ej?>=sKOzCosN;;5bS$! zDWYI@7M+3c^lx~bu7m(wcFB1{AQ)2bx$kdu#jOdoWvEtEUa*9Xe|O%9-IhLPN?ckz zcVNsPwpOblMIqasMt3N7`s6p$nL3R%Ad$8V)ruc}`=&9qVl+JX)SGHV>LnJBQ`hK8 z8o`g0sgFyLfnZ4e>HUA=^>^MMxHb{37z;mr?BA-zWWv?v#}|wwH6i25LlO!7ot-eW z0pdhZ=A2DadjNa7e<^7QnbCR3x#wtoP!_YEr_KmM`p-_7Qd4z8^g#182zzHT=3ZLG z&npw}S4gr%bNz>Gdb$DB0>1n03d%DBJoMuisF{BOTW)Yd`w?#4vJd80u;qq11orRY z?j1&c^!*hS)5bl&s-eH9@aC^xO;w?+HQM#A;DH;Q33|m8f5Kib|9JWpUT8NYpN4#@ z*gkS4Kr~XksGP4CYh`ewc`z0cL?fv{ny9_9;4qN}AR2)PaTze%xo}8RM5-kPFp(;% zl$XsKp>fYZTFzOly=rN4YRJ}ycCdAXd#l&3W^I`T$GluI^XBw*+^JbO z(zR}ux_(nMuzZII-`!0_1~Ri)IR!08rzIhk%ZsR3e^f$c>FCWC4gMHlVBTk{cJBw$NhC*FUHIFoiTz}It@VQf{(S>Z z-gP*Ne+1Zb&eEf-$)LGWLaGGXoA~OMcM;Axm!I9W0B3p%$enE6Qae~Z5?VRp0cW0# zwKrXkGf#w`HXf@UQaL!{!b=|cx%sT5mKp?|kO?6aCIV#U7V_wZd42s{K*+;Gn_n3w z(899{uqZLWgmYdx$N`>x;#FEOfLh4UzJES>f1;{+4>4T}6za7^wm+R6Xw*wKLgI0u z&mj+g`GLl|ejD%h5|E3@6b%@W@OZmvsBhrGms$n|m*8NKzrBfvx4cU&nll&9agt|F z8Fb~cpSSA=s|s;AzEN+I5N3pFar@N2zw{xJB=f(fj*}a)t@2n|0{UTr4J#$1dBciM$tzBB)5Q>rPIOT-=_4)Tz zgTa6#$w|K#a>@zWSASG(@o257t)6aloI*nW^4vc4#l1%`7z}gW`{* z&0d<1`EmOq7z_qFd_j(Rf;tl;5i*@We_;0Vdrev*l`0}hGOeC&T{BLlhD3TKqOrK% zgEbjKlJWPlP8Jk7KC|(*51gq&&weQvx*4{`04RSAFo>ZFIg$*vjRqlc)xUp%4sDsvBYZk^=+L1G*}~Y3eX<+tNQ1F6ma%miBcnt^Q`8;8HBs48 z*+NM~W`t{OU0YHSlFvEcU*Gxe^Urh6d(Q7Y?>X=Lob&cdv!G;UBd$tfCX8**aHB`ssKO+5dhdfE@gZM0PtD>z^Xq0fG7t5B(L3RcRpXDaGt$uZ zQHr`Ne(%OsT{+l%>2}<;J6y6i49Q}~@$1CSbwf2Ab|9X8-cD3B6uWL3elR27CiL;+ z$C1`FbB^k!@1^%5SEhD%zwQyJb4J~v$~ z9+8~fE#N8HPCH>0)#r{4Ov5VBuqSEje|$PvE~rvWb7mANP_d!(I>w|rL4;8SA@n!hIb+c(d7zI<{;7~hL z%!}~=V@~UE_wRx+X~>aL=Ug3I$vT;|zYLT8v0rLX^J3oRZ;U8Y8q_F1 zYB;>EN|-T=PX>x1lmG-i5&iq!c)660&hSd!wVCun`{zOuj z(=;z@-O2~8*%<$w)@PEh`VoNLF#W&+J{y}V5)HCa)LJ?D%;|VM3ECN0mva|0M`HJ` zA~A7tQzmP6OmC^Fqj!qK7Ojck?5Sh@5GK8x7koLzw!#%D-Z^W=>;!T5+nL?=NzTUL zeYU>)IPzWYO$7!$OC_|TrHOR0Cp)lq&}CGFF@u9H*|((Q5(V8)Eyy^g9@rbMYw zs0tLfKe9v0opyL>*bJu-B}$qFd{~9jbs3&=WxG4FB}*a4#p_E!j3=fGwCSI`fh^j~ zyKB%v(dnvA^@T`?4$Uf2@DH?L=}7oF$dE5&1q!3krltrS3Dx=zYn$>pbUi>9le_*L z_{iV$oRrA7o#I!cf0xZoA8&VLhP10@`OwVvam$a0&6a=kkNl-{^=V;hl(eLF(^Q)~ z8b@mB{p>8-EI(^8oB1Ai+yxa0aP#PJcK?{e=3*iXnt`*w-yaBB!^Cr=uL(f)i+@#- z?9>Xs5FkUcNYa_7?E!cmx6m^i&lRN5zqIK!6VjcU0Tyq@6XYZ#@Ap%t$8RKw3{@#m z1cyysr_Nv7Z>-hZ(oYb4@!>>9g9-R3O+YD7DBAjWwn>v-p=95ifNk@$6+U71G3jI* zRhh+$N)(d@Xdz}hrwdsLs(S9c`Sa9RfS0DxT>^KZ5s|SrmK#}dh`Xiv%(4b= z2~{mY;i|xriBJTJgMnfh-3Lmoss0-E+;bn^ZnKfe*hC6|4iX)g=>@`4^_g zW}P3#OteOa$sUY&Z!HG^NjLQagMTeAMk*~BEN~98d-pSCz2S6)p zC9NHvdJr#>(-!apZ=Fl}$V{yxvO0_qsy~-=Cz&IMH6xPUM?SY>VN7diBkiK`0I*RgL|6L7Su;{A*1{U~GEQ z2gy%l^z~LFt}p3fy&du=?)#pGN4Y#>I$)`%{3p?6yQ$HGMhvok=jK6s z%A*T%abnf*)n=z?4c1%DsUJlGe6raeatR#-$gXc&lqJbGaufIWAUe&yV)4?I`XNF=KnkORA0d zz?Gqbqa=+c&h|R*;G@kv2p31aFgobs)AywD&_Y9dyX*1nD|&qOh;agsVqVabUAXC~ z65yULQ^3|3Cgv1>Mr7;zbpN35V>`&!;@ZlBq2IhWa}EaPyxHv`2IV{Y>(YxiE5GYT zZKe2jsE%7cw%7KrJECABkvL)X97dT7tf$&fxIj1@FB=yM@{ zN#0_o%KY^#D&vzdDbT|dpM|p!Qn?_Yk$HS8o~%Hf=1wr#HsSOz609tGm6DOK5N-3C+N z@KFVgu?Gl)hiK(f8>pWf!`+nHE}l+?MZQDIT-)6ZtWOYZ_P4VU`64fo!DL&g(B+6} z<_n2Oh0=uco|$fyLh}Rl`twY`ZVptJ+;Q@tp{x5`YaTq6{5+9?c~aQ;&-NtZm+{II zck5&9n3Hi10;Sr_^v1^}xSH^op2wDl5no292!fqI4}3h^15M&j8fMa(Wq3hpOSPp3 z10T*(m4g^~O$m-08XJhHaaZBvTnl8sVzUqZk@HA?7^8L{J*M*W$mVIjgNKQ7WP&yy zvQjj+DFwG@ay!{t$30TmIM;%+jS0ksUcHy1v$nYWib9vNu-Y>0(}N3j$dF z&!lt*D~0N`Q$&y0s9&<0I{Tr0^phUp1+^j<&z0*eky7>BAR?jWjEMY*Xe_1SZAy`` z;h^^Y5hlOSTXCp4)G5UFmU~S+eWa*ex#~KZ4wIcFrvi#S-%)7lLKH6|BcXRC558Fg z*Tdg?wfwTI|LO;p+K7-hD>>lFZg5qB@awkJRvDGA^5kzKwDq-rPJT|Z`=ml3px0to zrGtBjjFr|45QN7SGImMGVKoUII-a&qWyP*n@?r*fF=gzMXU;f-VL_ZjX}G@P1^r%Y zxUnTXhS06JRQh8k{KMjATj zT(yl5I{FA*gVS1C2raG6{4v}AA)=y#!$Xq(OZ*#9JrS{c3;=8_9V{Bn{ImW8MHl6} delta 3209 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 TpVeyj00000NkvXXu0mjfpM%Ly delta 2765 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 Te{wHz00000NkvXXu0mjf)SgK( diff --git a/media/quote0.png b/media/quote0.png index b2fd10f69a2b61e3bb106b85a7e1d5a9afdc22b9..c7820d6077e6d346b9015c22996745fbc4586fd4 100644 GIT binary patch delta 707 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 literal 4146 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 diff --git a/tests/media/200px.png b/tests/media/200px.png index a08e2fa6854355fe5008f404c00475076506d08b..8671954e8c5e8f1cd08b3f241ed34b3957af5a90 100644 GIT binary patch literal 1709 zcmZ`(dpy$%6#tQ;A-Nu97V=1unb%_Um@He`G=^qnG>?$?lu`1Q<# zx2=>{$o1H|9_isRMk&o(*ZujFTm5nWIN$R*kMB9>pYu&QOt6)OKp_AC$l|az4xn#Z zF)0ZUC5hfjpp)=HosGg`S|v_2S14g&ybg%uM6SUH=)q$C}O$4I_kzexdVbVq67 zApoqsiL*hIB6>gcxBJ7qV2z*UoOdO;nfl)DJZPALm(jefgI-eT=AW<1i`;=B`e{8E zVxUlwyA_FPeGsmk?`j>LTQ;<@!vX!tFP?b<&noOWY2=%uR$G!r&jOKn|&6qDU7BEbTG_xf?|SQ^?!uP$Wn;k`2r%i%508^iBZ zXcQ6w1&MA3&uxA)JC%N}JB!~E z8Pqf8y@;ED*`Zh?hMcpqTCrM0?cjuM2;ZSJyKMYG#!u3SzIb3FkRc5Urdk9?T_!B z?4OKzIc6^?8uEpxPCEp0PwgCiU~D$~aujcXV(X|dRdr^9oT(+dgQcVByxs;3Q*}?H zLE_O@W6W8re1)3Q>#p5v1bY2dq9>i5EsEwxPf==OA2E&9InR>}kkxLHeZ$5Ln{b)ZW=P~8)K+DOi7nveUdzUgN zf^(%0oK;jtQ?$ggRUS`S+Xfa0n~V9a^~zs|`viLR>|EQl^{DuI!^gNS(&ew!Q;b)~Ma*+?Wwi zxiCL|mVOZFnqRlV!jbEUuGo)5SL7n*CSycHRPI>RS5m`k}^5!q(R zMO0^52#)Jrh*Alk11Hfbf=UDHW0w}85OXY={ zALDrUdy$)^eD^&C#3aCXT?KLQdx4)}wXoWfuu^4{sLD0RD9)K}oM;3*eK?6Wk*$*( z;)ybXS-RtVU}U^v6GX$U4*88WD%DApSlROK)=SKmZ`)idWZ>KMGgHJ>Bn$MP(4IZ? zugz=_c=TYmJ-8H;$uoyhUNZ*cWLM5v(GhU#FPDHv{CxIz(fQHxO@4l~d>;VmIdO5P z{RKPaChZl(&UXnTT#t(HgV>i0`i7*4{YU#*#K0-5;lu=jtLNbn?NnE{R4j1`!DX&0 z+nCc{jY%Y=OY$^9fbo4VMwQ@T) z&f3Ou*-{Y)=P=`7OvFKqgfz|1d7j_zoaa2hzs~cV_jxbR=b!g|-p?PO_s#S`Ix5Pk z$pHYMh;Xv^+O8eHhphB=uJxrp+%7w!?GWCw+m<97l(CI>MmYIJ1AzRV-vb1YOJD#X ztBSC<^^Pl95V%)rUftKejDsJ#%RqZGLx-NytKkz@N_|c^`AVyebJ3&1gb)Y)~E{|btGw(W^pUiR`u7Q^iSw27>2T~B zwv@U5uabkp706)u%dxh#i0cc%_-h>WFRdilbF&Y6$C z9__ynLo;3)V=rh`s&o_5JIaO?l=IciSUv)Yg^&Y`;QmG0y(9z}*UlytZGw!0oKOfQ z$M8I44avlR0tULNU5vfhQXbnYvC`Kt(FQ+u2kPIE=mfeE9ivmAw^SYZH(K{ z`Xn7=jnFGacHf!v5XE^V5bCjW)81p;sfjxZ>1rW+@^Q-5k!s`Ii08}?$@R=HQcIVF z>6~H{QRy?w&M<_GP>fi&K@sK&N6pkJw1h!oKSx9y2U$b#4(u9%Ljk!Lq6J3Aj;0mb z6u9T>qp8tm5wN)1(-js4!!De4VlIdl=GRtG6eE6H{w7Li!>(;LKylP@CDAB+IGfY_ zZL4*pd!12RIUjltS~AD|bopaSGYweO7wi*R!UmW~xrs4Xw?sl2(pMsaL1S*5n!UAo zVD|Z((Z`7f&CjNmS~;O&y`_7u;faJ}AZrkQrxg%T?00tV^?MF$-)Y#unw!@yN>P2; zCmv=tB4-5AS3vZNJj$WpS8`yK>IyV?do?VQP9CMmk0%>GNK}rKGq?Q`wk0E^ZQ|Ie zW&mzHV9SjoLtO8}=iQwlDgnLE1CZol{BTNC$)RKcyR~hND%AqE8jLEgaJp0=9c{5d zwdeuL4hfEz@UcQ<-yl7liuf|b_mxfqjgmi!2G6%}j4v)6%hIX8HDpQN0 z>fU`Dvm=iDDRT)o+#4k>>V8k=-3V)oaV`z8r56)atE^$?ogmtqdUVnW`Y8T6_sdyI zab~0CqSw{+{tpG0z0BA0)6^55a!iJG~Zm{Z)lGkK!BBg+lRz|J>dLy8?Ul$ib3TX#QD-!eN{ zOO6eCeTs9zWF$T=Yt?0ok-h0*vF=^ySH8jW(I;9uY08VO7B)hIU(7^+53UM#EfZri z7m{oC|72haHUi2bSyiv!{q&96iO@BQ@vRGYqHFW10u-^2D&MOKdpKTo^`D0k5tEOGGK4V)q zroY~FUD3kMmKLFr0|qw@=mA<{AINV}XrIA3cFfen7nLNJ?-RH3a=C#8RqtPu-?K|l z3;`|r(iqM5OHxpr_sYuAF#KuMDIlt?P*UY*(cBT^6F&*Sc?*M$$3>tG&)oTwfh#Mc z&6z1zB+UcTvyu)ENl|?B;^8)(wHj#;Gf?n|O3ZwRp+8)n&c_Zg@vz|5P;GyG&ULZ; z^}gCC3m{Yif4JHRL@XVrp?6`RbzXEnvJbBPGP0iBp=nQVQJQI%Jf8lliy8L(i}d|t zApe@~&m|!hvO}|crbJOFW6pYXVimsox5sdO;ohG`_K&jpg?KPBy~Vx4hjt9}DrZ>R z+Hum(RD1T=(>cRc<9811y~nk^I0Ppm=BfO@A=!B7BHWkb{)b`*rcT9^T3&7L_*1;S zt~$6eJ=ugl1=*5sFdPNTKsN9_%Q?Zk@)KQ^&hG)sJR72+wQDHpsrtne`5Y->*>KeLdIQgwQq!U5WZA4(DJmeve%g> zuJa>DBJeL`w>OKunAqo?29>4cS;_r?V?KeA0x>8yK`LLKC{BRJE9y!qWc-&<5ae%z zPwkP_DtVyU+(~Z)sJ$xRM5Ds_&trVRux<-*#57Fa^Z(Ux`)>dc4oG{d-Njq~0oVH2 ACjbBd diff --git a/tests/media/30px.png b/tests/media/30px.png index bf2532b79776a92488d1cef9ba8ec828c1fcf21b..adf98a5f6068af334224ed798991b31258614239 100644 GIT binary patch delta 650 zcmaFPv6^*)WDpAj1H(kiG)*AIlJ4m1$iT3%pZiZDE0C{{>=ES4z)+>ez|hdb!0-zw z)bN6Vq11qZ;Z*_ygVhWM2JwP9y8>;15==?n?k)`f+xyS#pQtBZ&%j>d>Fdh=h*Mlx z%5a6~uWbwrjPpEQ978NlZ@s!PJ2+6}_{a0rFSElI_HK1<4Y;(iL_mhCcWE}e`dyao zQJcQRPsnricGP~P6$ZV6|)*- zi;2{Hw+amI;;Z>4@_p}zJGME$r!4&t&~ji(x!#^2;p`bg3a6}ouF8LBQF?uad|X;{ z+8J%FUztaD&XV5obo%SAXJ=#Xz3sfQ^7g)}7v76vu5Np?_r}SmbNgpb3%?dOadnn+j&5M^1NJ0e_Ip{Gm5&{Qb5v#d3|1~$^!CiE z(DYkcTI*5`Q}dkb76{1n~Hv`XAM&c6~| Q1=PXd>FVdQ&MBb@02eU|?*IS* literal 1127 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 U@Wm>r`=G+y)78&qol`;+0ODY>x&QzG diff --git a/tests/media/a.png b/tests/media/a.png index b0706daac5fe77d8ed98cd8f76aea2cc7c4ccbd1..24c848373bad70399bfa7643cef055ea27d523e5 100644 GIT binary patch literal 580 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10qA0*8#8t6LQLbE8GE0)p zklo(iUO_?O@87>29UVN5JS$eLsH>|J3KV?y>=_d;qe6}R-Me@D`ue_o`<9=dFB~Dv zEX~aC$#?zw_4xRBu{hBkJ9ZpDew;;}W!}7b5~Fdh=h*Mlx%5a6~uWdk~^PVn_Ar_~vPP{49 ztRTRms&Q|Y#=VaokN(#uCj>H1{JunfOICT-fop|zJSD;r%r{tVQf}UlVfxXyRzZX@ zX{E!xZR&wFk{o|*CoGw{RbjvVjm;YROod0jZ+T>EYWh8L)`6FcR%G@%MCN=yE?fP* zS#W{rZ2Oswg^xVHui2d2XXxTw!^LB(zwB1xved$@Ir~27>U=+YXh!_9{LIKjKc`Jo zU6mhr!T0pJ*)R4TG@5xVc|x7Z{X<3TezeOg)lNTpDnP&0#xAn_J|o+e^Q+EWjQ`Af z`4yjFr0q^qpx0DOTq8sEeWq|E?dV;k-rX1~82(`ip&tL?SiwVzC%XO6lSOv`i6%kh*z<5a_Eq zPLED54!|_3@PF_6A&MduS5+1B^Yf@wDrYg4Wid4|jl-bzOifIK zWmzh|va*6st`nY)7JRw(6|yW-Iw1twR`Krv^bPyF-+v$6KQo-}y9^c=7pWYc=Mf5o zP|lan4`5_Vh>k|VahwIfd((S%-WF^}YC8o*QK&pY5Ku^K=LgWXtdCwMlfh!I v)6xa}$X9H&Kj*T24FBi2^#6h@fGdEXjdmre#@0iD00000NkvXXu0mjfuH|MA diff --git a/tests/media/b.png b/tests/media/b.png index 3798fe746ca476ae27e057e1ea76fdd5b1866a41..416276c56ce35c51786e0386827ce3e7d5d179a6 100644 GIT binary patch literal 563 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10qA0*8#8t96PPiygDBD-G zB8OGD!Bs#F N44$rjF6*2UngF#O#CZS! delta 756 zcmVY4Rsc^G((5N zs0cQN$;xUJTfB6L!ioy%pd=+l5d^XA!IdEJ;9-LyHNr#CF{4N#wh1!A#0D)$p++He zrF2wCT$i;&uwbjZ8C9jE7ZzVtkN6ib0b1X^04FpzH;4S}c00kZV^Q<1`4}dqSjZ~h zi=rs8#jh0rAh-}f5QHThQRKe!F56yz!>2rBZge940F8}}SS*&%S5;L-Q&ST@pAYyu1N!>F|E6dwm);og0Zp6)kDk_3Rm;Xn`sx~eNkyLO7il<;zK zX+dh9jepFNVlq!04x0y(ByqIl01K0|%f`la4CgKVR m2ltpR9;>YTyI=!g1K!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10qA|cH#8s-URid(9AUc7= z!I@Rxh>?d6D8nQr!{Zk$n3yhBTqPhN5FZ~uckbN1d-uM1^XAW=KX>ljsjI8=_xI;? z_f}9)Xm4+4R@KPJ$oTs8YehxH*|TTYu3gJ!VZD6$a(jDw;q=_?+qaA6mhgo{<>%-3 z_V()Q>rbCP{o1u_PoF;h|Nnnt_B<<~m5fQ=?k-xv`>xCba@b2eeO=ifaf%B|8Lklh zwGAkA%hSa%#NzbTNwU@xDyFTQz%nW~)Qj?m+4}L7Nx7Ya1cxk)nla@C36SowE-2~oLFSM0>I47F5*3il8 zZT6CthFrfn!Xy^fNT2=U{>n;X%iCQIa;ui_zL1yy;kKucP|C%cyZVQ#_#H04+NZ^E z;*LSxCzV5|&AU%7eWw)rB+@#2*N+G5KQVCj2|2m){q6+%Qnkc2q9i4;B-JXpC>2OC z7#SE^=o(n+8X1QeT3Q*IS(#XB8yHv_80_1=QVc~yZhlH;S|x4`=U)k~0%~CJboFyt I=akR{01E=+KkV4rhH4rEiDT^P_Qv=?XQm8qURZ2q$ZZ5$~OJXc;4uO_5aYB&V zM9IWjh;3m<(Yk0IKe}YyHJcoQqK>n>Zeo%{p5ybr?>s+dn1BEO&8htA>=Rz0Y_Br> z4FG^W+reZaPHbE!HaWp#!(io~zj^ZiA^^6^{p6OGA-Jk>>@6X`>a7svZaN#8$Vn2 zNs@#lNyxH{s(-3nKhtK}n-M@V5ohM=Wtu$4==|vlf*@>%JEhVBtcJHWd`x?L`<6YL zrV$E-0MKBRmt}gCOMaVyR=-C5{ideZnO8l2!De(Dd zZEejS;L*f5AC{MF8SeM{3H0{iJW)@%T(RYR^7sdQKYx5Ldw|6|Dy`?fGx>o)fIx2_ zrKe6~bL3gh+Z=g_bw@}ThINlsVI>-+DiNc;zTQ*|27~PNev&eLy&R&reSrA%6tXOv z{O;~sqfGBWcY;c$3^FG&*3-j6T_2X+Z$q zNGKFq`&>?^6Iqt=dc8=J#K|*lmis_jfJ`7#NmbR902!SF4pF4!^Jc#I<}7}{pGYLK zEr?Xg_#kqKB4v#}&j0xr``y^Yf;^XtOf<1e>+GkVgM_Ktdbdun(?E z*F|;o**S#T_sOq*+j23@3ShGmhCwpEyur)eU6j#!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10qBOuK#8ob-RVJ=pEFjn3 z-X18%u4yggmhk7#pS5e(#>dAq3&|Wme*D_CYx(*4bLY;jsHk9;(hzir;xcd+5D@tK z^(&i_5s#U7Mn(oBJKy&0+eN(7{r&x=BC8Y>6!z}j+uPeK5nA%*&70}dr?+9<; zU%veR|No(FYrTP%F(!GtyQoER%-9ODxx~}gmHiQ?xUiJr3ejKNfI@pbT^vI!PT#%s zmaj=cf;C~^6^)Y%0$f5i?fM^`b0AEw@!z&{`;F)I9{kPpLAxI9D`^du3Q2x(}HJIVVz0fGN zM!6WV1`oe)@d zmEX$zT~?sgc7EZh--;8Lg{PUFI(shir{8JbAG>WB-%RJXS!;9>7#R$zC9V-ADTyVi zR>?)FK#IZ0z|cb1z*5)9IK%E-*h#8TV9z{nC}Q!>*kacemLN^liW O1B0ilpUXO@geCw#CCD-W delta 725 zcmV;`0xJEq1mXpd8Gi-<0047(dh`GQ0;x$vK~z|U?UzkR(_tLPKaRPabGFTa4oZgQ zNQ~j3T`IK0u5Gj3}gwTQ7(HC=3N53jQlXkqBEP zzQi^r4IQE#B4O^ovEjxpeviMm=kxrYAJ4;6(RlU2Hf5BeoPUe&0{|%Hj9Z&2Qi*6m zg{lk<#REtsqO`<57gQ)TKFooZQ)mu1Q*)?!Zvg)_F)>jPL?93#7!2}!{0Rq7*z*D@ z>I^uYPDV#ZnST3jZSzrbiT;_-Oc*w{#m@9*#D zcGo#pre9~RSx^TgNupA3-I@3*Ljzh`*|MJI(d0+s@msjvZY&l{8bmxEXKd~(+NRcw znnjrbg;Is#_({g*5)2IuW%%80H}RP_vhz^XA=Eat@_+382Sia!vs)|{x-Oq5x%8v7 z006ZuHUvS)u(!9jv%d1P^Z=^bI>O;_hTUv7vzdsM9zdzqu&}U@cYM(S)}u>wbaa#t zAi4M*hr^L!4+ev18jqD0Ahj0bPk1WhW`uw5gxX{-9YAU=#&Yl}j|T_P>2zs6uh+|p z?g&b?CVwNZpqo%m$>j*iU*Bln{>{C?0eX6R()^+*a`*m2Oc!p*<`)Fe+uMsE2!zIm zcWh3l6Gz__*|v+Kh#&~m**j%-Uoe2n<-+B1QeEGeHEz#Guv?)} z2*2OY%c(EaJFcP9>T|~D1PFyfc`YhQ5|K!RKu#dQqQXGUQ7a8+F6Nb6A@?y!t;L9b zn#`*JfXZm1vicxulR4{IXOnCPR9b!BJJ_qr{x8@E*a!Fv>(12JVO8iZ00000NkvXX Hu0mjf+9Y31 diff --git a/tests/media/g.png b/tests/media/g.png index 5a6c6eb26a934165d9d1f318a3d49f08ba9c42ca..aad1e576dc37112e730ad2cfe68512095db419c4 100644 GIT binary patch literal 676 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10q9wp5#MMfxRYxveR@hsR z%ZP_f11PL09;~mBYob~uDd^11$mj3x-`m@}ckkY_XV3om^QW$^&feahokhl6yesARw@P`*sz{C=HneeSQ7> z{QPUzuB~0WcKPz&pI!Q(Rce zaE0ivZ9r*RPZ!4!i_=#p-L7gf5NHvc74fU<>|2L>gD`Y&~H&^?_ne8|K z?4I|1`Se^m>YSb z3s`09u7-=O@NxKYET(rE)Bb?9J1v#&9=-DFViBYC0r%qMS-iDvvoiR$m|jU=_tDL= zJfzaRao1gzB?~@g?~*)lL1|vYgQ+K$Hx%qRB9idaEx~>xSJLO}k$NtDuO8lw@pI0u zO7MPr;ZWeW6unojH@)jBe@xuh_egPe<(7tjb96TZr9Sw)FlmZ_(@fc1R~gQ;3I{(g z7kI?k|7+cgSySCUJNZ<3{I6XaQ5*m5b76{FKbJO57UGzY<&p)WG2B>gTe~DWM4f?!^jq delta 1160 zcmV;31b6$S1(6Am8Gi-<0047(dh`GQ1XxK#K~z|U?U!9lTV)u>e=8pa+QF$n%g2Bs zO6IDT3=Iwy6q1oFlSY?pCK4_r$C7xZyV(V8yqFiuh`Vqx#jqI2ZWN6>W{Wd^BsI=p zs*7hxCXh{FOr*eiiUr!PO}&^@&Q8ISkZ`kq@?Mi`VOA_{!&$6*gcN9w#Fsdqe-bHhTrLi&shH z{({r#L=;5?L4QbVRREKdll1rZbEfw^wyIaj(VJ50WmFWmzH`4Y9*=V4_E)@gw3>l| z0S+EKNKQ_U##okR#>U0~G~@(9prxe+v&Fzi=TDKJTZulqK;t9j5ls7kpzF=&IeGG= zX3ppH;qiEoB#GEc30awWtVI2k?#ZOHvlFM&iN#_`>VJ!(h}CN4@S$VaAAUo#6Pg|H z2Szz`q>SF)UQO_xo*ueI7t8ZCl$+WpE!t19u#d9Br_r;Q;UBN_sq{WNosRnY`lMYb z6hfb) zR-xK~NNfhH)v8fa6orhk)T^IeyviSQpKU2-^7c01uvV8e9k^?GS-ZB2gH)z#s2 zIyFxj{yk1zW%65kN{=leaZarofuX5zICvZ3%D*4>p9DRL#lovIq zO9PlK230<{*=!s*aDe&XuYY`T*~8sflyEdaXmys*>MRSv>x|EQ!qJXr zaJgIE5e)fY?h@z-jrJ^WElEl>1R8m$|RfWUh(3Is! zB*O9I$B{mspt`h0<7>l)BpeAae(NF~ufKrH&;zXaf3nGP;bu^60S{_iW; z?e>)Inb+$@pScHfft_OEu?_RamI>UCa3nxH9?{6t?S$83OKtfY(pg!$*zq5e2LyJU az(1v;qaWQ1)Z+jE002ovPDHLkU;%=sz(^qg diff --git a/tests/media/k.png b/tests/media/k.png index 5f80a823045ce992e41c6e610bfe98bb1dccaab4..a9ea5a7bd17001b020b3d4aea0da1ab197718ad1 100644 GIT binary patch literal 513 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 Ef{|F{_W%F@ From ca035d4dc8e5201d030f40671dc45f7991795f77 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Tue, 30 Oct 2018 10:39:38 -0700 Subject: [PATCH 02/32] Update version number for release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 37bbdc631..2211f8f34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blockly", - "version": "1.20180904.0-develop", + "version": "1.20181030.0", "description": "Blockly is a library for building visual programming editors.", "main": "blockly_node_javascript_en.js", "keywords": [ From f17c14729032d4d4f8213df06b9186e83521bd06 Mon Sep 17 00:00:00 2001 From: Erik Pasternak Date: Tue, 30 Oct 2018 15:09:08 -0700 Subject: [PATCH 03/32] Fix bad xml element when generating next node Fixes #2096 We were creating a text node to wrap any block connected to next when we should have just been attaching the generated dom. --- core/xml.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/xml.js b/core/xml.js index fcae31d5d..6a8ba6e15 100644 --- a/core/xml.js +++ b/core/xml.js @@ -261,8 +261,7 @@ Blockly.Xml.blockToDom = function(block, opt_noId) { var nextBlock = block.getNextBlock(); if (nextBlock) { var container = Blockly.Xml.utils.createElement('next'); - container.appendChild(Blockly.Xml.utils.createTextNode( - Blockly.Xml.blockToDom(nextBlock, opt_noId))); + container.appendChild(Blockly.Xml.blockToDom(nextBlock, opt_noId)); element.appendChild(container); } var shadow = block.nextConnection && block.nextConnection.getShadowDom(); From d9fd6b7e81acd42805219a5e0da07d2d1b37b500 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Mon, 5 Nov 2018 10:40:46 -0800 Subject: [PATCH 04/32] Rebuild to incorporate blockToDom fix in compressed files --- blockly_accessible_compressed.js | 2 +- blockly_compressed.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blockly_accessible_compressed.js b/blockly_accessible_compressed.js index d0d753591..4e9e2fcc8 100644 --- a/blockly_accessible_compressed.js +++ b/blockly_accessible_compressed.js @@ -948,7 +948,7 @@ Blockly.Xml.fieldToDom_=function(a){if(a.name&&a.EDITABLE){if(a.referencesVariab Blockly.Xml.blockToDom=function(a,b){var c=Blockly.Xml.utils.createElement(a.isShadow()?"shadow":"block");c.setAttribute("type",a.type);b||c.setAttribute("id",a.id);if(a.mutationToDom){var d=a.mutationToDom();d&&(d.hasChildNodes()||d.hasAttributes())&&c.appendChild(d)}Blockly.Xml.allFieldsToDom_(a,c);var e=a.getCommentText();e&&(d=Blockly.Xml.utils.createElement("comment"),d.appendChild(Blockly.Xml.utils.createTextNode(e)),"object"==typeof a.comment&&(d.setAttribute("pinned",a.comment.isVisible()), e=a.comment.getBubbleSize(),d.setAttribute("h",e.height),d.setAttribute("w",e.width)),c.appendChild(d));a.data&&(d=Blockly.Xml.utils.createElement("data"),d.appendChild(Blockly.Xml.utils.createTextNode(a.data)),c.appendChild(d));e=0;for(var f;f=a.inputList[e];e++){var g,h=!0;if(f.type!=Blockly.DUMMY_INPUT){var k=f.connection.targetBlock();f.type==Blockly.INPUT_VALUE?g=Blockly.Xml.utils.createElement("value"):f.type==Blockly.NEXT_STATEMENT&&(g=Blockly.Xml.utils.createElement("statement"));d=f.connection.getShadowDom(); !d||k&&k.isShadow()||g.appendChild(Blockly.Xml.cloneShadow_(d));k&&(g.appendChild(Blockly.Xml.blockToDom(k,b)),h=!1);g.setAttribute("name",f.name);h||c.appendChild(g)}}a.inputsInlineDefault!=a.inputsInline&&c.setAttribute("inline",a.inputsInline);a.isCollapsed()&&c.setAttribute("collapsed",!0);a.disabled&&c.setAttribute("disabled",!0);a.isDeletable()||a.isShadow()||c.setAttribute("deletable",!1);a.isMovable()||a.isShadow()||c.setAttribute("movable",!1);a.isEditable()||c.setAttribute("editable",!1); -if(e=a.getNextBlock())g=Blockly.Xml.utils.createElement("next"),g.appendChild(Blockly.Xml.utils.createTextNode(Blockly.Xml.blockToDom(e,b))),c.appendChild(g);d=a.nextConnection&&a.nextConnection.getShadowDom();!d||e&&e.isShadow()||g.appendChild(Blockly.Xml.cloneShadow_(d));return c}; +if(e=a.getNextBlock())g=Blockly.Xml.utils.createElement("next"),g.appendChild(Blockly.Xml.blockToDom(e,b)),c.appendChild(g);d=a.nextConnection&&a.nextConnection.getShadowDom();!d||e&&e.isShadow()||g.appendChild(Blockly.Xml.cloneShadow_(d));return c}; Blockly.Xml.cloneShadow_=function(a){for(var b=a=a.cloneNode(!0),c;b;)if(b.firstChild)b=b.firstChild;else{for(;b&&!b.nextSibling;)c=b,b=b.parentNode,3==c.nodeType&&""==c.data.trim()&&b.firstChild!=c&&Blockly.utils.removeNode(c);b&&(c=b,b=b.nextSibling,3==c.nodeType&&""==c.data.trim()&&Blockly.utils.removeNode(c))}return a};Blockly.Xml.domToText=function(a){return Blockly.Xml.utils.domToText(a)}; Blockly.Xml.domToPrettyText=function(a){a=Blockly.Xml.domToText(a).split("<");for(var b="",c=1;c"!=d.slice(-2)&&(b+=" ")}a=a.join("\n");a=a.replace(/(<(\w+)\b[^>]*>[^\n]*)\n *<\/\2>/g,"$1");return a.replace(/^\n/,"")}; Blockly.Xml.textToDom=function(a){a=Blockly.Xml.utils.textToDomDocument(a);if(!a||!a.documentElement||"xml"!=a.documentElement.nodeName.toLowerCase())throw TypeError("Blockly.Xml.textToDom expected an document.");return a.documentElement};Blockly.Xml.clearWorkspaceAndLoadFromXml=function(a,b){b.setResizesEnabled(!1);b.clear();a=Blockly.Xml.domToWorkspace(a,b);b.setResizesEnabled(!0);return a}; diff --git a/blockly_compressed.js b/blockly_compressed.js index 863e9169b..dd919a2b2 100644 --- a/blockly_compressed.js +++ b/blockly_compressed.js @@ -952,7 +952,7 @@ Blockly.Xml.fieldToDom_=function(a){if(a.name&&a.EDITABLE){if(a.referencesVariab Blockly.Xml.blockToDom=function(a,b){var c=Blockly.Xml.utils.createElement(a.isShadow()?"shadow":"block");c.setAttribute("type",a.type);b||c.setAttribute("id",a.id);if(a.mutationToDom){var d=a.mutationToDom();d&&(d.hasChildNodes()||d.hasAttributes())&&c.appendChild(d)}Blockly.Xml.allFieldsToDom_(a,c);var e=a.getCommentText();e&&(d=Blockly.Xml.utils.createElement("comment"),d.appendChild(Blockly.Xml.utils.createTextNode(e)),"object"==typeof a.comment&&(d.setAttribute("pinned",a.comment.isVisible()), e=a.comment.getBubbleSize(),d.setAttribute("h",e.height),d.setAttribute("w",e.width)),c.appendChild(d));a.data&&(d=Blockly.Xml.utils.createElement("data"),d.appendChild(Blockly.Xml.utils.createTextNode(a.data)),c.appendChild(d));e=0;for(var f;f=a.inputList[e];e++){var g,h=!0;if(f.type!=Blockly.DUMMY_INPUT){var k=f.connection.targetBlock();f.type==Blockly.INPUT_VALUE?g=Blockly.Xml.utils.createElement("value"):f.type==Blockly.NEXT_STATEMENT&&(g=Blockly.Xml.utils.createElement("statement"));d=f.connection.getShadowDom(); !d||k&&k.isShadow()||g.appendChild(Blockly.Xml.cloneShadow_(d));k&&(g.appendChild(Blockly.Xml.blockToDom(k,b)),h=!1);g.setAttribute("name",f.name);h||c.appendChild(g)}}a.inputsInlineDefault!=a.inputsInline&&c.setAttribute("inline",a.inputsInline);a.isCollapsed()&&c.setAttribute("collapsed",!0);a.disabled&&c.setAttribute("disabled",!0);a.isDeletable()||a.isShadow()||c.setAttribute("deletable",!1);a.isMovable()||a.isShadow()||c.setAttribute("movable",!1);a.isEditable()||c.setAttribute("editable",!1); -if(e=a.getNextBlock())g=Blockly.Xml.utils.createElement("next"),g.appendChild(Blockly.Xml.utils.createTextNode(Blockly.Xml.blockToDom(e,b))),c.appendChild(g);d=a.nextConnection&&a.nextConnection.getShadowDom();!d||e&&e.isShadow()||g.appendChild(Blockly.Xml.cloneShadow_(d));return c}; +if(e=a.getNextBlock())g=Blockly.Xml.utils.createElement("next"),g.appendChild(Blockly.Xml.blockToDom(e,b)),c.appendChild(g);d=a.nextConnection&&a.nextConnection.getShadowDom();!d||e&&e.isShadow()||g.appendChild(Blockly.Xml.cloneShadow_(d));return c}; Blockly.Xml.cloneShadow_=function(a){for(var b=a=a.cloneNode(!0),c;b;)if(b.firstChild)b=b.firstChild;else{for(;b&&!b.nextSibling;)c=b,b=b.parentNode,3==c.nodeType&&""==c.data.trim()&&b.firstChild!=c&&Blockly.utils.removeNode(c);b&&(c=b,b=b.nextSibling,3==c.nodeType&&""==c.data.trim()&&Blockly.utils.removeNode(c))}return a};Blockly.Xml.domToText=function(a){return Blockly.Xml.utils.domToText(a)}; Blockly.Xml.domToPrettyText=function(a){a=Blockly.Xml.domToText(a).split("<");for(var b="",c=1;c"!=d.slice(-2)&&(b+=" ")}a=a.join("\n");a=a.replace(/(<(\w+)\b[^>]*>[^\n]*)\n *<\/\2>/g,"$1");return a.replace(/^\n/,"")}; Blockly.Xml.textToDom=function(a){a=Blockly.Xml.utils.textToDomDocument(a);if(!a||!a.documentElement||"xml"!=a.documentElement.nodeName.toLowerCase())throw TypeError("Blockly.Xml.textToDom expected an document.");return a.documentElement};Blockly.Xml.clearWorkspaceAndLoadFromXml=function(a,b){b.setResizesEnabled(!1);b.clear();var c=Blockly.Xml.domToWorkspace(a,b);b.setResizesEnabled(!0);return c}; From 4aa5a2c6c654892ddebe273eb30afaee1d55a738 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Mon, 5 Nov 2018 10:42:17 -0800 Subject: [PATCH 05/32] Update version number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2211f8f34..a99d67155 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blockly", - "version": "1.20181030.0", + "version": "1.20181105.0", "description": "Blockly is a library for building visual programming editors.", "main": "blockly_node_javascript_en.js", "keywords": [ From a272e52a867cb305b28d428b16b03eb5cadb11b0 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Fri, 14 Dec 2018 15:46:56 -0800 Subject: [PATCH 06/32] Bump version to 1.20181214 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 17c9eb88d..71de502d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blockly", - "version": "1.20181030.0-develop", + "version": "1.20181214", "description": "Blockly is a library for building visual programming editors.", "main": "blockly_node_javascript_en.js", "keywords": [ From 17ab169772b9dc46b724d7876b38d45f5b4de372 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Fri, 14 Dec 2018 17:23:11 -0800 Subject: [PATCH 07/32] Fix bad version number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 71de502d3..777792cee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blockly", - "version": "1.20181214", + "version": "1.20181214.0", "description": "Blockly is a library for building visual programming editors.", "main": "blockly_node_javascript_en.js", "keywords": [ From da94697e939c5dcca3fe33b2ece0156d8a9bb0f8 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Mon, 17 Dec 2018 14:24:59 -0800 Subject: [PATCH 08/32] Rebuild --- blockly_accessible_compressed.js | 197 ++++++++++++++++--------------- blockly_compressed.js | 197 ++++++++++++++++--------------- blocks_compressed.js | 21 ++-- dart_compressed.js | 4 +- javascript_compressed.js | 4 +- lua_compressed.js | 4 +- php_compressed.js | 4 +- python_compressed.js | 4 +- 8 files changed, 230 insertions(+), 205 deletions(-) diff --git a/blockly_accessible_compressed.js b/blockly_accessible_compressed.js index 4e9e2fcc8..4ac170080 100644 --- a/blockly_accessible_compressed.js +++ b/blockly_accessible_compressed.js @@ -5,7 +5,7 @@ var $jscomp=$jscomp||{};$jscomp.scope={};var COMPILED=!0,goog=goog||{};goog.glob goog.exportPath_=function(a,b,c){a=a.split(".");c=c||goog.global;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}}; goog.define=function(a,b){if(!COMPILED){var c=goog.global.CLOSURE_UNCOMPILED_DEFINES,d=goog.global.CLOSURE_DEFINES;c&&void 0===c.nodeType&&Object.prototype.hasOwnProperty.call(c,a)?b=c[a]:d&&void 0===d.nodeType&&Object.prototype.hasOwnProperty.call(d,a)&&(b=d[a])}goog.exportPath_(a,b)};goog.DEBUG=!1;goog.LOCALE="en";goog.TRUSTED_SITE=!0;goog.STRICT_MODE_COMPATIBLE=!1;goog.DISALLOW_TEST_ONLY_CODE=COMPILED&&!goog.DEBUG;goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING=!1; goog.provide=function(a){if(goog.isInModuleLoader_())throw Error("goog.provide cannot be used within a module.");if(!COMPILED&&goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');goog.constructNamespace_(a)};goog.constructNamespace_=function(a,b){if(!COMPILED){delete goog.implicitNamespaces_[a];for(var c=a;(c=c.substring(0,c.lastIndexOf(".")))&&!goog.getObjectByName(c);)goog.implicitNamespaces_[c]=!0}goog.exportPath_(a,b)}; -goog.getScriptNonce=function(){null===goog.cspNonce_&&(goog.cspNonce_=goog.getScriptNonce_(goog.global.document)||"");return goog.cspNonce_};goog.NONCE_PATTERN_=/^[\w+/_-]+[=]{0,2}$/;goog.cspNonce_=null;goog.getScriptNonce_=function(a){return(a=a.querySelector&&a.querySelector("script[nonce]"))&&(a=a.nonce||a.getAttribute("nonce"))&&goog.NONCE_PATTERN_.test(a)?a:null};goog.VALID_MODULE_RE_=/^[a-zA-Z_$][a-zA-Z0-9._$]*$/; +goog.getScriptNonce=function(a){if(a&&a!=goog.global)return goog.getScriptNonce_(a.document);null===goog.cspNonce_&&(goog.cspNonce_=goog.getScriptNonce_(goog.global.document));return goog.cspNonce_};goog.NONCE_PATTERN_=/^[\w+/_-]+[=]{0,2}$/;goog.cspNonce_=null;goog.getScriptNonce_=function(a){return(a=a.querySelector&&a.querySelector("script[nonce]"))&&(a=a.nonce||a.getAttribute("nonce"))&&goog.NONCE_PATTERN_.test(a)?a:""};goog.VALID_MODULE_RE_=/^[a-zA-Z_$][a-zA-Z0-9._$]*$/; goog.module=function(a){if(!goog.isString(a)||!a||-1==a.search(goog.VALID_MODULE_RE_))throw Error("Invalid module identifier");if(!goog.isInGoogModuleLoader_())throw Error("Module "+a+" has been loaded incorrectly. Note, modules cannot be loaded as normal scripts. They require some kind of pre-processing step. You're likely trying to load a module via a script tag or as a part of a concatenated bundle without rewriting the module. For more info see: https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide."); if(goog.moduleLoaderState_.moduleName)throw Error("goog.module may only be called once per module.");goog.moduleLoaderState_.moduleName=a;if(!COMPILED){if(goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');delete goog.implicitNamespaces_[a]}};goog.module.get=function(a){return goog.module.getInternal_(a)}; goog.module.getInternal_=function(a){if(!COMPILED){if(a in goog.loadedModules_)return goog.loadedModules_[a].exports;if(!goog.implicitNamespaces_[a])return a=goog.getObjectByName(a),null!=a?a:null}return null};goog.ModuleType={ES6:"es6",GOOG:"goog"};goog.moduleLoaderState_=null;goog.isInModuleLoader_=function(){return goog.isInGoogModuleLoader_()||goog.isInEs6ModuleLoader_()};goog.isInGoogModuleLoader_=function(){return!!goog.moduleLoaderState_&&goog.moduleLoaderState_.type==goog.ModuleType.GOOG}; @@ -129,8 +129,8 @@ goog.color.prependZeroIfNecessaryHelper=function(a){return 1==a.length?"0"+a:a}; goog.color.hsvToRgb=function(a,b,c){var d=0,e=0,f=0;if(0==b)f=e=d=c;else{var g=Math.floor(a/60),h=a/60-g;a=c*(1-b);var k=c*(1-b*h);b=c*(1-b*(1-h));switch(g){case 1:d=k;e=c;f=a;break;case 2:d=a;e=c;f=b;break;case 3:d=a;e=k;f=c;break;case 4:d=b;e=a;f=c;break;case 5:d=c;e=a;f=k;break;case 6:case 0:d=c,e=b,f=a}}return[Math.floor(d),Math.floor(e),Math.floor(f)]}; goog.color.rgbToHsv=function(a,b,c){var d=Math.max(Math.max(a,b),c),e=Math.min(Math.min(a,b),c);if(e==d)e=a=0;else{var f=d-e;e=f/d;a=60*(a==d?(b-c)/f:b==d?2+(c-a)/f:4+(a-b)/f);0>a&&(a+=360);360=a[2]?a[1]*a[2]:a[1]*(1-a[2]);var d=.5>=b[2]?b[1]*b[2]:b[1]*(1-b[2]);return(a[2]-b[2])*(a[2]-b[2])+c*c+d*d-2*c*d*Math.cos(2*(a[0]/360-b[0]/360)*Math.PI)};goog.color.blend=function(a,b,c){c=goog.math.clamp(c,0,1);return[Math.round(c*a[0]+(1-c)*b[0]),Math.round(c*a[1]+(1-c)*b[1]),Math.round(c*a[2]+(1-c)*b[2])]};goog.color.darken=function(a,b){return goog.color.blend([0,0,0],a,b)};goog.color.lighten=function(a,b){return goog.color.blend([255,255,255],a,b)}; -goog.color.highContrast=function(a,b){for(var c=[],d=0;d=a[2]?a[1]*a[2]:a[1]*(1-a[2]);var d=.5>=b[2]?b[1]*b[2]:b[1]*(1-b[2]);return(a[2]-b[2])*(a[2]-b[2])+c*c+d*d-2*c*d*Math.cos(2*(a[0]/360-b[0]/360)*Math.PI)};goog.color.blend=function(a,b,c){c=goog.math.clamp(c,0,1);return[Math.round(b[0]+c*(a[0]-b[0])),Math.round(b[1]+c*(a[1]-b[1])),Math.round(b[2]+c*(a[2]-b[2]))]};goog.color.darken=function(a,b){return goog.color.blend([0,0,0],a,b)}; +goog.color.lighten=function(a,b){return goog.color.blend([255,255,255],a,b)};goog.color.highContrast=function(a,b){for(var c=[],d=0;d=a.keyCode)a.keyCode=-1}catch(b){}};goog.events.BrowserEvent.prototype.getBrowserEvent=function(){return this.event_}; @@ -290,13 +290,14 @@ goog.functions.create=function(a,b){var c=function(){};c.prototype=a.prototype;c goog.functions.debounce=function(a,b,c){var d=0;return function(e){goog.global.clearTimeout(d);var f=arguments;d=goog.global.setTimeout(function(){a.apply(c,f)},b)}};goog.functions.throttle=function(a,b,c){var d=0,e=!1,f=[],g=function(){d=0;e&&(e=!1,h())},h=function(){d=goog.global.setTimeout(g,b);a.apply(c,f)};return function(a){f=arguments;d?e=!0:h()}};goog.functions.rateLimit=function(a,b,c){var d=0,e=function(){d=0};return function(f){d||(d=goog.global.setTimeout(e,b),a.apply(c,arguments))}};goog.dom.tags={};goog.dom.tags.VOID_TAGS_={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0};goog.dom.tags.isVoidTag=function(a){return!0===goog.dom.tags.VOID_TAGS_[a]};goog.string.TypedString=function(){};goog.string.Const=function(a,b){this.stringConstValueWithSecurityContract__googStringSecurityPrivate_=a===goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_&&b||"";this.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_=goog.string.Const.TYPE_MARKER_};goog.string.Const.prototype.implementsGoogStringTypedString=!0;goog.string.Const.prototype.getTypedStringValue=function(){return this.stringConstValueWithSecurityContract__googStringSecurityPrivate_}; goog.string.Const.prototype.toString=function(){return"Const{"+this.stringConstValueWithSecurityContract__googStringSecurityPrivate_+"}"};goog.string.Const.unwrap=function(a){if(a instanceof goog.string.Const&&a.constructor===goog.string.Const&&a.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_===goog.string.Const.TYPE_MARKER_)return a.stringConstValueWithSecurityContract__googStringSecurityPrivate_;goog.asserts.fail("expected object of type Const, got '"+a+"'");return"type_error:Const"}; goog.string.Const.from=function(a){return new goog.string.Const(goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_,a)};goog.string.Const.TYPE_MARKER_={};goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_={};goog.string.Const.EMPTY=goog.string.Const.from("");goog.html={};goog.html.SafeScript=function(){this.privateDoNotAccessOrElseSafeScriptWrappedValue_="";this.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_};goog.html.SafeScript.prototype.implementsGoogStringTypedString=!0;goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={};goog.html.SafeScript.fromConstant=function(a){a=goog.string.Const.unwrap(a);return 0===a.length?goog.html.SafeScript.EMPTY:goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(a)}; -goog.html.SafeScript.fromConstantAndArgs=function(a,b){for(var c=[],d=1;da?goog.i18n.bidi.Dir.RTL:b?null:goog.i18n.bidi.Dir.NEUTRAL:null==a?null:a?goog.i18n.bidi.Dir.RTL:goog.i18n.bidi.Dir.LTR};goog.i18n.bidi.ltrChars_="A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0900-\u1fff\u200e\u2c00-\ud801\ud804-\ud839\ud83c-\udbff\uf900-\ufb1c\ufe00-\ufe6f\ufefd-\uffff";goog.i18n.bidi.rtlChars_="\u0591-\u06ef\u06fa-\u08ff\u200f\ud802-\ud803\ud83a-\ud83b\ufb1d-\ufdff\ufe70-\ufefc"; goog.i18n.bidi.htmlSkipReg_=/<[^>]*>|&[^;]+;/g;goog.i18n.bidi.stripHtmlIfNeeded_=function(a,b){return b?a.replace(goog.i18n.bidi.htmlSkipReg_,""):a};goog.i18n.bidi.rtlCharReg_=new RegExp("["+goog.i18n.bidi.rtlChars_+"]");goog.i18n.bidi.ltrCharReg_=new RegExp("["+goog.i18n.bidi.ltrChars_+"]");goog.i18n.bidi.hasAnyRtl=function(a,b){return goog.i18n.bidi.rtlCharReg_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.hasRtlChar=goog.i18n.bidi.hasAnyRtl; @@ -304,7 +305,7 @@ goog.i18n.bidi.hasAnyLtr=function(a,b){return goog.i18n.bidi.ltrCharReg_.test(go goog.i18n.bidi.ltrDirCheckRe_=new RegExp("^[^"+goog.i18n.bidi.rtlChars_+"]*["+goog.i18n.bidi.ltrChars_+"]");goog.i18n.bidi.rtlDirCheckRe_=new RegExp("^[^"+goog.i18n.bidi.ltrChars_+"]*["+goog.i18n.bidi.rtlChars_+"]");goog.i18n.bidi.startsWithRtl=function(a,b){return goog.i18n.bidi.rtlDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isRtlText=goog.i18n.bidi.startsWithRtl; goog.i18n.bidi.startsWithLtr=function(a,b){return goog.i18n.bidi.ltrDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isLtrText=goog.i18n.bidi.startsWithLtr;goog.i18n.bidi.isRequiredLtrRe_=/^http:\/\/.*/;goog.i18n.bidi.isNeutralText=function(a,b){a=goog.i18n.bidi.stripHtmlIfNeeded_(a,b);return goog.i18n.bidi.isRequiredLtrRe_.test(a)||!goog.i18n.bidi.hasAnyLtr(a)&&!goog.i18n.bidi.hasAnyRtl(a)}; goog.i18n.bidi.ltrExitDirCheckRe_=new RegExp("["+goog.i18n.bidi.ltrChars_+"][^"+goog.i18n.bidi.rtlChars_+"]*$");goog.i18n.bidi.rtlExitDirCheckRe_=new RegExp("["+goog.i18n.bidi.rtlChars_+"][^"+goog.i18n.bidi.ltrChars_+"]*$");goog.i18n.bidi.endsWithLtr=function(a,b){return goog.i18n.bidi.ltrExitDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isLtrExitText=goog.i18n.bidi.endsWithLtr; -goog.i18n.bidi.endsWithRtl=function(a,b){return goog.i18n.bidi.rtlExitDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isRtlExitText=goog.i18n.bidi.endsWithRtl;goog.i18n.bidi.rtlLocalesRe_=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Thaa|Nkoo|Tfng))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;goog.i18n.bidi.isRtlLanguage=function(a){return goog.i18n.bidi.rtlLocalesRe_.test(a)};goog.i18n.bidi.bracketGuardTextRe_=/(\(.*?\)+)|(\[.*?\]+)|(\{.*?\}+)|(<.*?>+)/g; +goog.i18n.bidi.endsWithRtl=function(a,b){return goog.i18n.bidi.rtlExitDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isRtlExitText=goog.i18n.bidi.endsWithRtl;goog.i18n.bidi.rtlLocalesRe_=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;goog.i18n.bidi.isRtlLanguage=function(a){return goog.i18n.bidi.rtlLocalesRe_.test(a)};goog.i18n.bidi.bracketGuardTextRe_=/(\(.*?\)+)|(\[.*?\]+)|(\{.*?\}+)|(<.*?>+)/g; goog.i18n.bidi.guardBracketInText=function(a,b){b=(void 0===b?goog.i18n.bidi.hasAnyRtl(a):b)?goog.i18n.bidi.Format.RLM:goog.i18n.bidi.Format.LRM;return a.replace(goog.i18n.bidi.bracketGuardTextRe_,b+"$&"+b)};goog.i18n.bidi.enforceRtlInHtml=function(a){return"<"==a.charAt(0)?a.replace(/<\w+/,"$& dir=rtl"):"\n"+a+""};goog.i18n.bidi.enforceRtlInText=function(a){return goog.i18n.bidi.Format.RLE+a+goog.i18n.bidi.Format.PDF}; goog.i18n.bidi.enforceLtrInHtml=function(a){return"<"==a.charAt(0)?a.replace(/<\w+/,"$& dir=ltr"):"\n"+a+""};goog.i18n.bidi.enforceLtrInText=function(a){return goog.i18n.bidi.Format.LRE+a+goog.i18n.bidi.Format.PDF};goog.i18n.bidi.dimensionsRe_=/:\s*([.\d][.\w]*)\s+([.\d][.\w]*)\s+([.\d][.\w]*)\s+([.\d][.\w]*)/g;goog.i18n.bidi.leftRe_=/left/gi;goog.i18n.bidi.rightRe_=/right/gi;goog.i18n.bidi.tempRe_=/%%%%/g; goog.i18n.bidi.mirrorCSS=function(a){return a.replace(goog.i18n.bidi.dimensionsRe_,":$1 $4 $3 $2").replace(goog.i18n.bidi.leftRe_,"%%%%").replace(goog.i18n.bidi.rightRe_,goog.i18n.bidi.LEFT).replace(goog.i18n.bidi.tempRe_,goog.i18n.bidi.RIGHT)};goog.i18n.bidi.doubleQuoteSubstituteRe_=/([\u0591-\u05f2])"/g;goog.i18n.bidi.singleQuoteSubstituteRe_=/([\u0591-\u05f2])'/g; @@ -317,9 +318,10 @@ goog.html.TrustedResourceUrl.prototype.cloneWithParams=function(a,b){var c=goog. goog.DEBUG&&(goog.html.TrustedResourceUrl.prototype.toString=function(){return"TrustedResourceUrl{"+this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_+"}"}); goog.html.TrustedResourceUrl.unwrap=function(a){if(a instanceof goog.html.TrustedResourceUrl&&a.constructor===goog.html.TrustedResourceUrl&&a.TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_;goog.asserts.fail("expected object of type TrustedResourceUrl, got '"+a+"' of type "+goog.typeOf(a));return"type_error:TrustedResourceUrl"}; goog.html.TrustedResourceUrl.format=function(a,b){var c=goog.string.Const.unwrap(a);if(!goog.html.TrustedResourceUrl.BASE_URL_.test(c))throw Error("Invalid TrustedResourceUrl format: "+c);a=c.replace(goog.html.TrustedResourceUrl.FORMAT_MARKER_,function(a,e){if(!Object.prototype.hasOwnProperty.call(b,e))throw Error('Found marker, "'+e+'", in format string, "'+c+'", but no valid label mapping found in args: '+JSON.stringify(b));a=b[e];return a instanceof goog.string.Const?goog.string.Const.unwrap(a): -encodeURIComponent(String(a))});return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.TrustedResourceUrl.FORMAT_MARKER_=/%{(\w+)}/g;goog.html.TrustedResourceUrl.BASE_URL_=/^(?:https:)?\/\/[0-9a-z.:[\]-]+\/|^\/[^\/\\]|^about:blank#/i;goog.html.TrustedResourceUrl.URL_PARAM_PARSER_=/^([^?#]*)(\?[^#]*)?(#[\s\S]*)?/;goog.html.TrustedResourceUrl.formatWithParams=function(a,b,c,d){return goog.html.TrustedResourceUrl.format(a,b).cloneWithParams(c,d)}; -goog.html.TrustedResourceUrl.fromConstant=function(a){return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(goog.string.Const.unwrap(a))};goog.html.TrustedResourceUrl.fromConstants=function(a){for(var b="",c=0;ca.length?"&":"")+encodeURIComponent(d)+"="+encodeURIComponent(String(g)))}}return b};goog.html.SafeUrl=function(){this.privateDoNotAccessOrElseSafeHtmlWrappedValue_="";this.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_};goog.html.SafeUrl.INNOCUOUS_STRING="about:invalid#zClosurez";goog.html.SafeUrl.prototype.implementsGoogStringTypedString=!0;goog.html.SafeUrl.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_}; goog.html.SafeUrl.prototype.implementsGoogI18nBidiDirectionalString=!0;goog.html.SafeUrl.prototype.getDirection=function(){return goog.i18n.bidi.Dir.LTR};goog.DEBUG&&(goog.html.SafeUrl.prototype.toString=function(){return"SafeUrl{"+this.privateDoNotAccessOrElseSafeHtmlWrappedValue_+"}"}); goog.html.SafeUrl.unwrap=function(a){if(a instanceof goog.html.SafeUrl&&a.constructor===goog.html.SafeUrl&&a.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseSafeHtmlWrappedValue_;goog.asserts.fail("expected object of type SafeUrl, got '"+a+"' of type "+goog.typeOf(a));return"type_error:SafeUrl"};goog.html.SafeUrl.fromConstant=function(a){return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(goog.string.Const.unwrap(a))}; goog.html.SAFE_MIME_TYPE_PATTERN_=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-wav|wav|webm)|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|text\/csv|video\/(?:mpeg|mp4|ogg|webm|quicktime))$/i;goog.html.SafeUrl.fromBlob=function(a){a=goog.html.SAFE_MIME_TYPE_PATTERN_.test(a.type)?goog.fs.url.createObjectUrl(a):goog.html.SafeUrl.INNOCUOUS_STRING;return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.DATA_URL_PATTERN_=/^data:([^;,]*);base64,[a-z0-9+\/]+=*$/i; @@ -329,7 +331,7 @@ goog.html.SafeUrl.fromSmsUrl=function(a){goog.string.caseInsensitiveStartsWith(a goog.html.SafeUrl.sanitizeChromeExtensionUrl=function(a,b){return goog.html.SafeUrl.sanitizeExtensionUrl_(/^chrome-extension:\/\/([^\/]+)\//,a,b)};goog.html.SafeUrl.sanitizeFirefoxExtensionUrl=function(a,b){return goog.html.SafeUrl.sanitizeExtensionUrl_(/^moz-extension:\/\/([^\/]+)\//,a,b)};goog.html.SafeUrl.sanitizeEdgeExtensionUrl=function(a,b){return goog.html.SafeUrl.sanitizeExtensionUrl_(/^ms-browser-extension:\/\/([^\/]+)\//,a,b)}; goog.html.SafeUrl.sanitizeExtensionUrl_=function(a,b,c){(a=a.exec(b))?(a=a[1],-1==(c instanceof goog.string.Const?[goog.string.Const.unwrap(c)]:c.map(function(a){return goog.string.Const.unwrap(a)})).indexOf(a)&&(b=goog.html.SafeUrl.INNOCUOUS_STRING)):b=goog.html.SafeUrl.INNOCUOUS_STRING;return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(b)};goog.html.SafeUrl.fromTrustedResourceUrl=function(a){return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(goog.html.TrustedResourceUrl.unwrap(a))}; goog.html.SAFE_URL_PATTERN_=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;goog.html.SafeUrl.SAFE_URL_PATTERN=goog.html.SAFE_URL_PATTERN_;goog.html.SafeUrl.sanitize=function(a){if(a instanceof goog.html.SafeUrl)return a;a="object"==typeof a&&a.implementsGoogStringTypedString?a.getTypedStringValue():String(a);goog.html.SAFE_URL_PATTERN_.test(a)||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)}; -goog.html.SafeUrl.sanitizeAssertUnchanged=function(a){if(a instanceof goog.html.SafeUrl)return a;a="object"==typeof a&&a.implementsGoogStringTypedString?a.getTypedStringValue():String(a);goog.asserts.assert(goog.html.SAFE_URL_PATTERN_.test(a))||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={}; +goog.html.SafeUrl.sanitizeAssertUnchanged=function(a){if(a instanceof goog.html.SafeUrl)return a;a="object"==typeof a&&a.implementsGoogStringTypedString?a.getTypedStringValue():String(a);goog.asserts.assert(goog.html.SAFE_URL_PATTERN_.test(a),"%s does not match the safe URL pattern",a)||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={}; goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse=function(a){var b=new goog.html.SafeUrl;b.privateDoNotAccessOrElseSafeHtmlWrappedValue_=a;return b};goog.html.SafeUrl.ABOUT_BLANK=goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse("about:blank");goog.html.SafeStyle=function(){this.privateDoNotAccessOrElseSafeStyleWrappedValue_="";this.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_};goog.html.SafeStyle.prototype.implementsGoogStringTypedString=!0;goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={}; goog.html.SafeStyle.fromConstant=function(a){a=goog.string.Const.unwrap(a);if(0===a.length)return goog.html.SafeStyle.EMPTY;goog.html.SafeStyle.checkStyle_(a);goog.asserts.assert(goog.string.endsWith(a,";"),"Last character of style string is not ';': "+a);goog.asserts.assert(goog.string.contains(a,":"),"Style string must contain at least one ':', to specify a \"name: value\" pair: "+a);return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(a)}; goog.html.SafeStyle.checkStyle_=function(a){goog.asserts.assert(!/[<>]/.test(a),"Forbidden characters in style string: "+a)};goog.html.SafeStyle.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeStyleWrappedValue_};goog.DEBUG&&(goog.html.SafeStyle.prototype.toString=function(){return"SafeStyle{"+this.privateDoNotAccessOrElseSafeStyleWrappedValue_+"}"}); @@ -587,8 +589,9 @@ goog.events.KeyHandler.prototype.handleKeyDown_=function(a){(goog.userAgent.WEBK a.keyCode!=goog.events.KeyCodes.META&&(this.lastKey_=goog.events.KeyCodes.META));goog.events.KeyHandler.USES_KEYDOWN_&&!goog.events.KeyCodes.firesKeyPressEvent(a.keyCode,this.lastKey_,a.shiftKey,a.ctrlKey,a.altKey,a.metaKey)?this.handleEvent(a):(this.keyCode_=goog.events.KeyCodes.normalizeKeyCode(a.keyCode),goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_&&(this.altKey_=a.altKey))};goog.events.KeyHandler.prototype.resetState=function(){this.keyCode_=this.lastKey_=-1}; goog.events.KeyHandler.prototype.handleKeyup_=function(a){this.resetState();this.altKey_=a.altKey}; goog.events.KeyHandler.prototype.handleEvent=function(a){var b=a.getBrowserEvent(),c=b.altKey;if(goog.userAgent.IE&&a.type==goog.events.EventType.KEYPRESS){var d=this.keyCode_;var e=d!=goog.events.KeyCodes.ENTER&&d!=goog.events.KeyCodes.ESC?b.keyCode:0}else(goog.userAgent.WEBKIT||goog.userAgent.EDGE)&&a.type==goog.events.EventType.KEYPRESS?(d=this.keyCode_,e=0<=b.charCode&&63232>b.charCode&&goog.events.KeyCodes.isCharacterKey(d)?b.charCode:0):goog.userAgent.OPERA&&!goog.userAgent.WEBKIT?(d=this.keyCode_, -e=goog.events.KeyCodes.isCharacterKey(d)?b.keyCode:0):(d=b.keyCode||this.keyCode_,e=b.charCode||0,goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_&&a.type==goog.events.EventType.KEYPRESS&&(c=this.altKey_),goog.userAgent.MAC&&e==goog.events.KeyCodes.QUESTION_MARK&&d==goog.events.KeyCodes.WIN_KEY&&(d=goog.events.KeyCodes.SLASH));var f=d=goog.events.KeyCodes.normalizeKeyCode(d);d?63232<=d&&d in goog.events.KeyHandler.safariKey_?f=goog.events.KeyHandler.safariKey_[d]:25==d&&a.shiftKey&&(f=9):b.keyIdentifier&& -b.keyIdentifier in goog.events.KeyHandler.keyIdentifier_&&(f=goog.events.KeyHandler.keyIdentifier_[b.keyIdentifier]);goog.userAgent.GECKO&&goog.events.KeyHandler.USES_KEYDOWN_&&a.type==goog.events.EventType.KEYPRESS&&!goog.events.KeyCodes.firesKeyPressEvent(f,this.lastKey_,a.shiftKey,a.ctrlKey,c,a.metaKey)||(a=f==this.lastKey_,this.lastKey_=f,b=new goog.events.KeyEvent(f,e,a,b),b.altKey=c,this.dispatchEvent(b))};goog.events.KeyHandler.prototype.getElement=function(){return this.element_}; +e=goog.events.KeyCodes.isCharacterKey(d)?b.keyCode:0):(a.type==goog.events.EventType.KEYPRESS?(goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_&&(c=this.altKey_),b.keyCode==b.charCode?32>b.keyCode?(d=b.keyCode,e=0):(d=this.keyCode_,e=b.charCode):(d=b.keyCode||this.keyCode_,e=b.charCode||0)):(d=b.keyCode||this.keyCode_,e=b.charCode||0),goog.userAgent.MAC&&e==goog.events.KeyCodes.QUESTION_MARK&&d==goog.events.KeyCodes.WIN_KEY&&(d=goog.events.KeyCodes.SLASH));var f=d=goog.events.KeyCodes.normalizeKeyCode(d); +d?63232<=d&&d in goog.events.KeyHandler.safariKey_?f=goog.events.KeyHandler.safariKey_[d]:25==d&&a.shiftKey&&(f=9):b.keyIdentifier&&b.keyIdentifier in goog.events.KeyHandler.keyIdentifier_&&(f=goog.events.KeyHandler.keyIdentifier_[b.keyIdentifier]);goog.userAgent.GECKO&&goog.events.KeyHandler.USES_KEYDOWN_&&a.type==goog.events.EventType.KEYPRESS&&!goog.events.KeyCodes.firesKeyPressEvent(f,this.lastKey_,a.shiftKey,a.ctrlKey,c,a.metaKey)||(a=f==this.lastKey_,this.lastKey_=f,b=new goog.events.KeyEvent(f, +e,a,b),b.altKey=c,this.dispatchEvent(b))};goog.events.KeyHandler.prototype.getElement=function(){return this.element_}; goog.events.KeyHandler.prototype.attach=function(a,b){this.keyUpKey_&&this.detach();this.element_=a;this.keyPressKey_=goog.events.listen(this.element_,goog.events.EventType.KEYPRESS,this,b);this.keyDownKey_=goog.events.listen(this.element_,goog.events.EventType.KEYDOWN,this.handleKeyDown_,b,this);this.keyUpKey_=goog.events.listen(this.element_,goog.events.EventType.KEYUP,this.handleKeyup_,b,this)}; goog.events.KeyHandler.prototype.detach=function(){this.keyPressKey_&&(goog.events.unlistenByKey(this.keyPressKey_),goog.events.unlistenByKey(this.keyDownKey_),goog.events.unlistenByKey(this.keyUpKey_),this.keyUpKey_=this.keyDownKey_=this.keyPressKey_=null);this.element_=null;this.keyCode_=this.lastKey_=-1};goog.events.KeyHandler.prototype.disposeInternal=function(){goog.events.KeyHandler.superClass_.disposeInternal.call(this);this.detach()}; goog.events.KeyEvent=function(a,b,c,d){goog.events.BrowserEvent.call(this,d);this.type=goog.events.KeyHandler.EventType.KEY;this.keyCode=a;this.charCode=b;this.repeat=c};goog.inherits(goog.events.KeyEvent,goog.events.BrowserEvent);goog.ui.ComponentUtil={};goog.ui.ComponentUtil.getMouseEventType=function(a){return a.pointerEventsEnabled()?goog.events.PointerAsMouseEventType:goog.events.EventType};goog.dom.classlist={};goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST=!1;goog.dom.classlist.get=function(a){if(goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST||a.classList)return a.classList;a=a.className;return goog.isString(a)&&a.match(/\S+/g)||[]};goog.dom.classlist.set=function(a,b){a.className=b};goog.dom.classlist.contains=function(a,b){return goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST||a.classList?a.classList.contains(b):goog.array.contains(goog.dom.classlist.get(a),b)}; @@ -750,7 +753,7 @@ goog.debug.Logger.prototype.callPublish_=function(a){if(this.handlers_)for(var b goog.debug.LogManager.initialize=function(){goog.debug.LogManager.rootLogger_||(goog.debug.LogManager.rootLogger_=new goog.debug.Logger(goog.debug.Logger.ROOT_LOGGER_NAME),goog.debug.LogManager.loggers_[goog.debug.Logger.ROOT_LOGGER_NAME]=goog.debug.LogManager.rootLogger_,goog.debug.LogManager.rootLogger_.setLevel(goog.debug.Logger.Level.CONFIG))};goog.debug.LogManager.getLoggers=function(){return goog.debug.LogManager.loggers_}; goog.debug.LogManager.getRoot=function(){goog.debug.LogManager.initialize();return goog.debug.LogManager.rootLogger_};goog.debug.LogManager.getLogger=function(a){goog.debug.LogManager.initialize();return goog.debug.LogManager.loggers_[a]||goog.debug.LogManager.createLogger_(a)};goog.debug.LogManager.createFunctionForCatchErrors=function(a){return function(b){(a||goog.debug.LogManager.getRoot()).severe("Error: "+b.message+" ("+b.fileName+" @ Line: "+b.line+")")}}; goog.debug.LogManager.createLogger_=function(a){var b=new goog.debug.Logger(a);if(goog.debug.Logger.ENABLE_HIERARCHY){var c=a.lastIndexOf("."),d=a.substr(0,c);c=a.substr(c+1);d=goog.debug.LogManager.getLogger(d);d.addChild_(c,b);b.setParent_(d)}return goog.debug.LogManager.loggers_[a]=b};goog.log={};goog.log.ENABLED=goog.debug.LOGGING_ENABLED;goog.log.ROOT_LOGGER_NAME=goog.debug.Logger.ROOT_LOGGER_NAME;goog.log.Logger=goog.debug.Logger;goog.log.Level=goog.debug.Logger.Level;goog.log.LogRecord=goog.debug.LogRecord;goog.log.getLogger=function(a,b){return goog.log.ENABLED?(a=goog.debug.LogManager.getLogger(a),b&&a&&a.setLevel(b),a):null};goog.log.addHandler=function(a,b){goog.log.ENABLED&&a&&a.addHandler(b)}; -goog.log.removeHandler=function(a,b){return goog.log.ENABLED&&a?a.removeHandler(b):!1};goog.log.log=function(a,b,c,d){goog.log.ENABLED&&a&&a.log(b,c,d)};goog.log.error=function(a,b,c){goog.log.ENABLED&&a&&a.severe(b,c)};goog.log.warning=function(a,b,c){goog.log.ENABLED&&a&&a.warning(b,c)};goog.log.info=function(a,b,c){goog.log.ENABLED&&a&&a.info(b,c)};goog.log.fine=function(a,b,c){goog.log.ENABLED&&a&&a.fine(b,c)};goog.Thenable=function(){};goog.Thenable.prototype.then=function(a,b,c){};goog.Thenable.IMPLEMENTED_BY_PROP="$goog_Thenable";goog.Thenable.addImplementation=function(a){a.prototype.then=a.prototype.then;COMPILED?a.prototype[goog.Thenable.IMPLEMENTED_BY_PROP]=!0:a.prototype.$goog_Thenable=!0};goog.Thenable.isImplementedBy=function(a){if(!a)return!1;try{return COMPILED?!!a[goog.Thenable.IMPLEMENTED_BY_PROP]:!!a.$goog_Thenable}catch(b){return!1}};goog.async={};goog.async.FreeList=function(a,b,c){this.limit_=c;this.create_=a;this.reset_=b;this.occupants_=0;this.head_=null};goog.async.FreeList.prototype.get=function(){if(0this.remainingCapacityOfType(c))return!1;b+=a[c]}return b>this.remainingCapacity()?!1:!0};Blockly.Workspace.prototype.hasBlockLimits=function(){return Infinity!=this.options.maxBlocks||!!this.options.maxInstances}; Blockly.Workspace.prototype.undo=function(a){var b=a?this.redoStack_:this.undoStack_,c=a?this.undoStack_:this.redoStack_,d=b.pop();if(d){for(var e=[d];b.length&&d.group&&d.group==b[b.length-1].group;)e.push(b.pop());for(b=0;d=e[b];b++)c.push(d);e=Blockly.Events.filter(e,a);Blockly.Events.recordUndo=!1;try{for(b=0;d=e[b];b++)d.run(a)}finally{Blockly.Events.recordUndo=!0}}};Blockly.Workspace.prototype.clearUndo=function(){this.undoStack_.length=0;this.redoStack_.length=0;Blockly.Events.clearPendingUndo()}; Blockly.Workspace.prototype.addChangeListener=function(a){this.listeners_.push(a);return a};Blockly.Workspace.prototype.removeChangeListener=function(a){Blockly.utils.arrayRemove(this.listeners_,a)};Blockly.Workspace.prototype.fireChangeListener=function(a){if(a.recordUndo)for(this.undoStack_.push(a),this.redoStack_.length=0;this.undoStack_.length>this.MAX_UNDO&&0<=this.MAX_UNDO;)this.undoStack_.shift();for(var b=0,c;c=this.listeners_[b];b++)c(a)}; Blockly.Workspace.prototype.getBlockById=function(a){return this.blockDB_[a]||null};Blockly.Workspace.prototype.getCommentById=function(a){return this.commentDB_[a]||null};Blockly.Workspace.prototype.allInputsFilled=function(a){for(var b=this.getTopBlocks(!1),c=0,d;d=b[c];c++)if(!d.allInputsFilled(a))return!1;return!0};Blockly.Workspace.prototype.getPotentialVariableMap=function(){return this.potentialVariableMap_}; @@ -1022,7 +1029,7 @@ Blockly.Bubble.prototype.getRelativeToSurfaceXY=function(){return new goog.math. Blockly.Events.Ui.prototype.toJson=function(){var a=Blockly.Events.Ui.superClass_.toJson.call(this);a.element=this.element;void 0!==this.newValue&&(a.newValue=this.newValue);this.blockId&&(a.blockId=this.blockId);return a};Blockly.Events.Ui.prototype.fromJson=function(a){Blockly.Events.Ui.superClass_.fromJson.call(this,a);this.element=a.element;this.newValue=a.newValue;this.blockId=a.blockId};Blockly.Icon=function(a){this.block_=a};Blockly.Icon.prototype.collapseHidden=!0;Blockly.Icon.prototype.SIZE=17;Blockly.Icon.prototype.bubble_=null;Blockly.Icon.prototype.iconXY_=null; Blockly.Icon.prototype.createIcon=function(){this.iconGroup_||(this.iconGroup_=Blockly.utils.createSvgElement("g",{"class":"blocklyIconGroup"},null),this.block_.isInFlyout&&Blockly.utils.addClass(this.iconGroup_,"blocklyIconGroupReadonly"),this.drawIcon_(this.iconGroup_),this.block_.getSvgRoot().appendChild(this.iconGroup_),Blockly.bindEventWithChecks_(this.iconGroup_,"mouseup",this,this.iconClick_),this.updateEditable())}; Blockly.Icon.prototype.dispose=function(){Blockly.utils.removeNode(this.iconGroup_);this.iconGroup_=null;this.setVisible(!1);this.block_=null};Blockly.Icon.prototype.updateEditable=function(){};Blockly.Icon.prototype.isVisible=function(){return!!this.bubble_};Blockly.Icon.prototype.iconClick_=function(a){this.block_.workspace.isDragging()||this.block_.isInFlyout||Blockly.utils.isRightButton(a)||this.setVisible(!this.isVisible())};Blockly.Icon.prototype.updateColour=function(){this.isVisible()&&this.bubble_.setColour(this.block_.getColour())}; -Blockly.Icon.prototype.renderIcon=function(a){if(this.collapseHidden&&this.block_.isCollapsed())return this.iconGroup_.setAttribute("display","none"),a;this.iconGroup_.setAttribute("display","block");var b=this.SIZE;this.block_.RTL&&(a-=b);this.iconGroup_.setAttribute("transform","translate("+a+",5)");this.computeIconLocation();return a=this.block_.RTL?a-Blockly.BlockSvg.SEP_SPACE_X:a+(b+Blockly.BlockSvg.SEP_SPACE_X)}; +Blockly.Icon.prototype.renderIcon=function(a){if(this.collapseHidden&&this.block_.isCollapsed()||this.block_.isInsertionMarker())return this.iconGroup_.setAttribute("display","none"),a;this.iconGroup_.setAttribute("display","block");var b=this.SIZE;this.block_.RTL&&(a-=b);this.iconGroup_.setAttribute("transform","translate("+a+",5)");this.computeIconLocation();return a=this.block_.RTL?a-Blockly.BlockSvg.SEP_SPACE_X:a+(b+Blockly.BlockSvg.SEP_SPACE_X)}; Blockly.Icon.prototype.setIconLocation=function(a){this.iconXY_=a;this.isVisible()&&this.bubble_.setAnchorLocation(a)};Blockly.Icon.prototype.computeIconLocation=function(){var a=this.block_.getRelativeToSurfaceXY(),b=Blockly.utils.getRelativeXY(this.iconGroup_);a=new goog.math.Coordinate(a.x+b.x+this.SIZE/2,a.y+b.y+this.SIZE/2);goog.math.Coordinate.equals(this.getIconLocation(),a)||this.setIconLocation(a)};Blockly.Icon.prototype.getIconLocation=function(){return this.iconXY_}; Blockly.Comment=function(a){Blockly.Comment.superClass_.constructor.call(this,a);this.createIcon()};goog.inherits(Blockly.Comment,Blockly.Icon);Blockly.Comment.prototype.text_="";Blockly.Comment.prototype.width_=160;Blockly.Comment.prototype.height_=80; Blockly.Comment.prototype.drawIcon_=function(a){Blockly.utils.createSvgElement("circle",{"class":"blocklyIconShape",r:"8",cx:"8",cy:"8"},a);Blockly.utils.createSvgElement("path",{"class":"blocklyIconSymbol",d:"m6.8,10h2c0.003,-0.617 0.271,-0.962 0.633,-1.266 2.875,-2.4050.607,-5.534 -3.765,-3.874v1.7c3.12,-1.657 3.698,0.118 2.336,1.25-1.201,0.998 -1.201,1.528 -1.204,2.19z"},a);Blockly.utils.createSvgElement("rect",{"class":"blocklyIconSymbol",x:"6.8",y:"10.78",height:"2",width:"2"},a)}; @@ -1042,8 +1049,9 @@ Blockly.Connection.prototype.canConnectWithReason_=function(a){if(!a)return Bloc Blockly.Connection.CAN_CONNECT:Blockly.Connection.REASON_CHECKS_FAILED}; Blockly.Connection.prototype.checkConnection_=function(a){switch(this.canConnectWithReason_(a)){case Blockly.Connection.CAN_CONNECT:break;case Blockly.Connection.REASON_SELF_CONNECTION:throw Error("Attempted to connect a block to itself.");case Blockly.Connection.REASON_DIFFERENT_WORKSPACES:throw Error("Blocks not on same workspace.");case Blockly.Connection.REASON_WRONG_TYPE:throw Error("Attempt to connect incompatible types.");case Blockly.Connection.REASON_TARGET_NULL:throw Error("Target connection is null."); case Blockly.Connection.REASON_CHECKS_FAILED:throw Error("Connection checks failed. "+(this+" expected "+this.check_+", found "+a.check_));case Blockly.Connection.REASON_SHADOW_PARENT:throw Error("Connecting non-shadow to shadow block.");default:throw Error("Unknown connection failure: this should never happen!");}}; -Blockly.Connection.prototype.isConnectionAllowed=function(a){if(this.canConnectWithReason_(a)!=Blockly.Connection.CAN_CONNECT)return!1;switch(a.type){case Blockly.PREVIOUS_STATEMENT:if(a.isConnected()||this.isConnected())return!1;break;case Blockly.OUTPUT_VALUE:if(a.isConnected()||this.isConnected())return!1;break;case Blockly.INPUT_VALUE:if(a.targetConnection&&!a.targetBlock().isMovable()&&!a.targetBlock().isShadow())return!1;break;case Blockly.NEXT_STATEMENT:if(a.isConnected()&&!this.sourceBlock_.nextConnection&& -!a.targetBlock().isShadow()&&a.targetBlock().nextConnection)return!1;break;default:throw Error("Unknown connection type in isConnectionAllowed");}return-1!=Blockly.draggingConnections_.indexOf(a)?!1:!0};Blockly.Connection.prototype.connect=function(a){this.targetConnection!=a&&(this.checkConnection_(a),this.isSuperior()?this.connect_(a):a.connect_(this))}; +Blockly.Connection.prototype.canConnectToPrevious_=function(a){if(this.targetConnection||-1!=Blockly.draggingConnections_.indexOf(a))return!1;if(!a.targetConnection)return!0;a=a.targetBlock();return a.isInsertionMarker()?!a.getPreviousBlock():!1}; +Blockly.Connection.prototype.isConnectionAllowed=function(a){if(a.sourceBlock_.isInsertionMarker()||this.canConnectWithReason_(a)!=Blockly.Connection.CAN_CONNECT)return!1;switch(a.type){case Blockly.PREVIOUS_STATEMENT:return this.canConnectToPrevious_(a);case Blockly.OUTPUT_VALUE:if(a.isConnected()||this.isConnected())return!1;break;case Blockly.INPUT_VALUE:if(a.isConnected()&&!a.targetBlock().isMovable()&&!a.targetBlock().isShadow())return!1;break;case Blockly.NEXT_STATEMENT:if(a.isConnected()&& +!this.sourceBlock_.nextConnection&&!a.targetBlock().isShadow()&&a.targetBlock().nextConnection)return!1;break;default:throw Error("Unknown connection type in isConnectionAllowed");}return-1!=Blockly.draggingConnections_.indexOf(a)?!1:!0};Blockly.Connection.prototype.connect=function(a){this.targetConnection!=a&&(this.checkConnection_(a),this.isSuperior()?this.connect_(a):a.connect_(this))}; Blockly.Connection.connectReciprocally_=function(a,b){if(!a||!b)throw Error("Cannot connect null connections.");a.targetConnection=b;b.targetConnection=a};Blockly.Connection.singleConnection_=function(a,b){for(var c=!1,d=0;da.y_)c=d;else{b=d;break}}return b};Blockly.ConnectionDB.prototype.removeConnection_=function(a){if(!a.inDB_)throw Error("Connection not in database.");var b=this.findConnection(a);if(-1==b)throw Error("Unable to find connection in connectionDB.");a.inDB_=!1;this.splice(b,1)}; Blockly.ConnectionDB.prototype.getNeighbours=function(a,b){function c(a){var c=e-d[a].x_,g=f-d[a].y_;Math.sqrt(c*c+g*g)<=b&&k.push(d[a]);return gc)){var d=b.getSvgXY(a.getSvgRoot());a.outputConnection?(d.x+=(a.RTL?3:-3)*c,d.y+=13*c):a.previousConnection&&(d.x+=(a.RTL?-23:23)*c,d.y+=3*c);a=Blockly.utils.createSvgElement("circle",{cx:d.x,cy:d.y,r:0,fill:"none",stroke:"#888","stroke-width":10},b.getParentSvg());Blockly.BlockAnimations.connectionUiStep_(a,new Date,c)}}; Blockly.BlockAnimations.connectionUiStep_=function(a,b,c){var d=(new Date-b)/150;1a.workspace.scale)){var b=a.getHeightWidth().height;b=Math.atan(10/b)/Math.PI*180;a.RTL||(b*=-1);Blockly.BlockAnimations.disconnectUiStep_(a.getSvgRoot(),b,new Date)}}; Blockly.BlockAnimations.disconnectUiStep_=function(a,b,c){var d=(new Date-c)/200;1'+goog.string.htmlEscape(a.name)+""}; Blockly.Variables.generateVariableFieldDom=function(a){a=Blockly.Variables.generateVariableFieldXmlString(a);return Blockly.Xml.textToDom(""+a+"").firstChild};Blockly.Variables.getOrCreateVariablePackage=function(a,b,c,d){var e=Blockly.Variables.getVariable(a,b,c,d);e||(e=Blockly.Variables.createVariable_(a,b,c,d));return e}; -Blockly.Variables.getVariable=function(a,b,c,d){var e=a.getPotentialVariableMap();if(b){var f=a.getVariableById(b);!f&&e&&(f=e.getVariableById(b))}else if(c){if(void 0==d)throw Error("Tried to look up a variable by name without a type");f=a.getVariable(c,d);!f&&e&&(f=e.getVariable(c,d))}return f}; +Blockly.Variables.getVariable=function(a,b,c,d){var e=a.getPotentialVariableMap();if(b){var f=a.getVariableById(b);!f&&e&&(f=e.getVariableById(b));if(f)return f}if(c){if(void 0==d)throw Error("Tried to look up a variable by name without a type");f=a.getVariable(c,d);!f&&e&&(f=e.getVariable(c,d))}return f}; Blockly.Variables.createVariable_=function(a,b,c,d){var e=a.getPotentialVariableMap();c||(c=Blockly.Variables.generateUniqueName(a.isFlyout?a.targetWorkspace:a));return e?e.createVariable(c,d,b):a.createVariable(c,d,b)};Blockly.Variables.getAddedVariables=function(a,b){a=a.getAllVariables();var c=[];if(b.length!=a.length)for(var d=0;d";c=Blockly.Xml.textToDom(c).firstChild;b.push(c)}if(Blockly.Blocks.variables_get_dynamic)for(var d=0;c=a[d];d++)c=''+Blockly.Variables.generateVariableFieldXmlString(c)+ "",c=Blockly.Xml.textToDom(c).firstChild,b.push(c)}return b};Blockly.WorkspaceAudio=function(a){this.parentWorkspace_=a;this.SOUNDS_=Object.create(null)};Blockly.WorkspaceAudio.prototype.lastSound_=null;Blockly.WorkspaceAudio.prototype.dispose=function(){this.SOUNDS_=this.parentWorkspace_=null};Blockly.WorkspaceAudio.prototype.load=function(a,b){if(a.length){try{var c=new window.Audio}catch(h){return}for(var d,e=0;eb.bottomRight.x&&(b.bottomRight.x=d.bottomRight.x);d.topLeft.yb.bottomRight.y&&(b.bottomRight.y=d.bottomRight.y)}return{x:b.topLeft.x, -y:b.topLeft.y,width:b.bottomRight.x-b.topLeft.x,height:b.bottomRight.y-b.topLeft.y}};Blockly.WorkspaceSvg.prototype.cleanUp=function(){this.setResizesEnabled(!1);Blockly.Events.setGroup(!0);for(var a=this.getTopBlocks(!0),b=0,c=0,d;d=a[c];c++){var e=d.getRelativeToSurfaceXY();d.moveBy(-e.x,b-e.y);d.snapToGrid();b=d.getRelativeToSurfaceXY().y+d.getHeightWidth().height+Blockly.BlockSvg.MIN_BLOCK_Y}Blockly.Events.setGroup(!1);this.setResizesEnabled(!0)}; +y:b.topLeft.y,width:b.bottomRight.x-b.topLeft.x,height:b.bottomRight.y-b.topLeft.y}};Blockly.WorkspaceSvg.prototype.cleanUp=function(){this.setResizesEnabled(!1);Blockly.Events.setGroup(!0);for(var a=this.getTopBlocks(!0),b=0,c=0,d;d=a[c];c++)if(d.isMovable()){var e=d.getRelativeToSurfaceXY();d.moveBy(-e.x,b-e.y);d.snapToGrid();b=d.getRelativeToSurfaceXY().y+d.getHeightWidth().height+Blockly.BlockSvg.MIN_BLOCK_Y}Blockly.Events.setGroup(!1);this.setResizesEnabled(!0)}; Blockly.WorkspaceSvg.prototype.showContextMenu_=function(a){function b(a){if(a.isDeletable())p=p.concat(a.getDescendants(!1));else{a=a.getChildren(!1);for(var c=0;cp.length?c():Blockly.confirm(Blockly.Msg.DELETE_ALL_BLOCKS.replace("%1",p.length),function(a){a&& @@ -1362,11 +1371,11 @@ Blockly.Warning.textToDom_=function(a){var b=Blockly.utils.createSvgElement("tex Blockly.Warning.prototype.setVisible=function(a){if(a!=this.isVisible())if(Blockly.Events.fire(new Blockly.Events.Ui(this.block_,"warningOpen",!a,a)),a){a=Blockly.Warning.textToDom_(this.getText());this.bubble_=new Blockly.Bubble(this.block_.workspace,a,this.block_.svgPath_,this.iconXY_,null,null);this.bubble_.setSvgId(this.block_.id);if(this.block_.RTL)for(var b=a.getBBox().width,c=0,d;d=a.childNodes[c];c++)d.setAttribute("text-anchor","end"),d.setAttribute("x",b+Blockly.Bubble.BORDER_WIDTH);this.updateColour(); a=this.bubble_.getBubbleSize();this.bubble_.setBubbleSize(a.width,a.height)}else this.bubble_.dispose(),this.body_=this.bubble_=null};Blockly.Warning.prototype.bodyFocus_=function(a){this.bubble_.promote_()};Blockly.Warning.prototype.setText=function(a,b){this.text_[b]!=a&&(a?this.text_[b]=a:delete this.text_[b],this.isVisible()&&(this.setVisible(!1),this.setVisible(!0)))};Blockly.Warning.prototype.getText=function(){var a=[],b;for(b in this.text_)a.push(this.text_[b]);return a.join("\n")}; Blockly.Warning.prototype.dispose=function(){this.block_.warning=null;Blockly.Icon.prototype.dispose.call(this)};Blockly.Block=function(a,b,c){if("undefined"!==typeof Blockly.Generator.prototype[b])throw Error('Block prototypeName "'+b+'" conflicts with Blockly.Generator members.');this.id=c&&!a.getBlockById(c)?c:Blockly.utils.genUid();a.blockDB_[this.id]=this;this.previousConnection=this.nextConnection=this.outputConnection=null;this.inputList=[];this.inputsInline=void 0;this.disabled=!1;this.tooltip="";this.contextMenu=!0;this.parentBlock_=null;this.childBlocks_=[];this.editable_=this.movable_=this.deletable_= -!0;this.collapsed_=this.isShadow_=!1;this.comment=null;this.xy_=new goog.math.Coordinate(0,0);this.workspace=a;this.isInFlyout=a.isFlyout;this.isInMutator=a.isMutator;this.RTL=a.RTL;this.isInsertionMarker_=!1;if(b){this.type=b;c=Blockly.Blocks[b];if(!c||"object"!=typeof c)throw TypeError("Unknown block type: "+b);goog.mixin(this,c)}a.addTopBlock(this);"function"==typeof this.init&&this.init();this.inputsInlineDefault=this.inputsInline;if(Blockly.Events.isEnabled()){(a=Blockly.Events.getGroup())|| +!0;this.collapsed_=this.isShadow_=!1;this.comment=null;this.xy_=new goog.math.Coordinate(0,0);this.workspace=a;this.isInFlyout=a.isFlyout;this.isInMutator=a.isMutator;this.RTL=a.RTL;this.isInsertionMarker_=!1;if(b){this.type=b;c=Blockly.Blocks[b];if(!c||"object"!=typeof c)throw TypeError("Unknown block type: "+b);goog.mixin(this,c)}a.addTopBlock(this);a.addTypedBlock(this);"function"==typeof this.init&&this.init();this.inputsInlineDefault=this.inputsInline;if(Blockly.Events.isEnabled()){(a=Blockly.Events.getGroup())|| Blockly.Events.setGroup(!0);try{Blockly.Events.fire(new Blockly.Events.BlockCreate(this))}finally{a||Blockly.Events.setGroup(!1)}}"function"==typeof this.onchange&&this.setOnChange(this.onchange)};Blockly.Block.obtain=function(a,b){console.warn("Deprecated call to Blockly.Block.obtain, use workspace.newBlock instead.");return a.newBlock(b)};Blockly.Block.prototype.data=null;Blockly.Block.prototype.colour_="#000000";Blockly.Block.prototype.hue_=null; -Blockly.Block.prototype.dispose=function(a){if(this.workspace){this.onchangeWrapper_&&this.workspace.removeChangeListener(this.onchangeWrapper_);this.unplug(a);Blockly.Events.isEnabled()&&Blockly.Events.fire(new Blockly.Events.BlockDelete(this));Blockly.Events.disable();try{this.workspace&&(this.workspace.removeTopBlock(this),delete this.workspace.blockDB_[this.id],this.workspace=null);Blockly.selected==this&&(Blockly.selected=null);for(var b=this.childBlocks_.length-1;0<=b;b--)this.childBlocks_[b].dispose(!1); -b=0;for(var c;c=this.inputList[b];b++)c.dispose();this.inputList.length=0;var d=this.getConnections_(!0);for(b=0;b=c)this.hue_=c,this.colour_=Blockly.hueToRgb(c);else if("string"==typeof b&&/^#[0-9a-fA-F]{6}$/.test(b))this.colour_=b,this.hue_=null;else throw c='Invalid colour: "'+b+'"',a!=b&&(c+=' (from "'+a+'")'),c;}; @@ -1412,7 +1421,7 @@ Blockly.ContextMenu.position_=function(a,b,c){var d=Blockly.utils.getViewportBBo Blockly.ContextMenu.createWidget_=function(a){a.render(Blockly.WidgetDiv.DIV);var b=a.getElement();Blockly.utils.addClass(b,"blocklyContextMenu");Blockly.bindEventWithChecks_(b,"contextmenu",null,Blockly.utils.noEvent);a.setAllowAutoFocus(!0)};Blockly.ContextMenu.hide=function(){Blockly.WidgetDiv.hideIfOwner(Blockly.ContextMenu);Blockly.ContextMenu.currentBlock=null;Blockly.ContextMenu.eventWrapper_&&Blockly.unbindEvent_(Blockly.ContextMenu.eventWrapper_)}; Blockly.ContextMenu.callbackFactory=function(a,b){return function(){Blockly.Events.disable();try{var c=Blockly.Xml.domToBlock(b,a.workspace),d=a.getRelativeToSurfaceXY();d.x=a.RTL?d.x-Blockly.SNAP_RADIUS:d.x+Blockly.SNAP_RADIUS;d.y+=2*Blockly.SNAP_RADIUS;c.moveBy(d.x,d.y)}finally{Blockly.Events.enable()}Blockly.Events.isEnabled()&&!c.isShadow()&&Blockly.Events.fire(new Blockly.Events.BlockCreate(c));c.select()}}; Blockly.ContextMenu.blockDeleteOption=function(a){var b=a.getDescendants(!1).length,c=a.getNextBlock();c&&(b-=c.getDescendants(!1).length);return{text:1==b?Blockly.Msg.DELETE_BLOCK:Blockly.Msg.DELETE_X_BLOCKS.replace("%1",String(b)),enabled:!0,callback:function(){Blockly.Events.setGroup(!0);a.dispose(!0,!0);Blockly.Events.setGroup(!1)}}};Blockly.ContextMenu.blockHelpOption=function(a){return{enabled:!("function"==typeof a.helpUrl?!a.helpUrl():!a.helpUrl),text:Blockly.Msg.HELP,callback:function(){a.showHelp_()}}}; -Blockly.ContextMenu.blockDuplicateOption=function(a){var b=!0;a.getDescendants(!1).length>a.workspace.remainingCapacity()&&(b=!1);return{text:Blockly.Msg.DUPLICATE_BLOCK,enabled:b,callback:function(){Blockly.duplicate_(a)}}};Blockly.ContextMenu.blockCommentOption=function(a){var b={enabled:!goog.userAgent.IE};a.comment?(b.text=Blockly.Msg.REMOVE_COMMENT,b.callback=function(){a.setCommentText(null)}):(b.text=Blockly.Msg.ADD_COMMENT,b.callback=function(){a.setCommentText("")});return b}; +Blockly.ContextMenu.blockDuplicateOption=function(a){var b=a.isDuplicatable();return{text:Blockly.Msg.DUPLICATE_BLOCK,enabled:b,callback:function(){Blockly.duplicate_(a)}}};Blockly.ContextMenu.blockCommentOption=function(a){var b={enabled:!goog.userAgent.IE};a.comment?(b.text=Blockly.Msg.REMOVE_COMMENT,b.callback=function(){a.setCommentText(null)}):(b.text=Blockly.Msg.ADD_COMMENT,b.callback=function(){a.setCommentText("")});return b}; Blockly.ContextMenu.commentDeleteOption=function(a){return{text:Blockly.Msg.REMOVE_COMMENT,enabled:!0,callback:function(){Blockly.Events.setGroup(!0);a.dispose(!0,!0);Blockly.Events.setGroup(!1)}}};Blockly.ContextMenu.commentDuplicateOption=function(a){return{text:Blockly.Msg.DUPLICATE_COMMENT,enabled:!0,callback:function(){Blockly.duplicate_(a)}}}; Blockly.ContextMenu.workspaceCommentOption=function(a,b){var c={enabled:!goog.userAgent.IE};c.text=Blockly.Msg.ADD_COMMENT;c.callback=function(){var c=new Blockly.WorkspaceCommentSvg(a,Blockly.Msg.WORKSPACE_COMMENT_DEFAULT_TEXT,Blockly.WorkspaceCommentSvg.DEFAULT_SIZE,Blockly.WorkspaceCommentSvg.DEFAULT_SIZE),e=a.getInjectionDiv().getBoundingClientRect();e=new goog.math.Coordinate(b.clientX-e.left,b.clientY-e.top);var f=a.getOriginOffsetInPixels();e=goog.math.Coordinate.difference(e,f).scale(1/a.scale); c.moveBy(e.x,e.y);a.rendered&&(c.initSvg(),c.render(!1),c.select())};return c};Blockly.BlockSvg=function(a,b,c){this.svgGroup_=Blockly.utils.createSvgElement("g",{},null);this.svgGroup_.translate_="";this.svgPathDark_=Blockly.utils.createSvgElement("path",{"class":"blocklyPathDark",transform:"translate(1,1)"},this.svgGroup_);this.svgPath_=Blockly.utils.createSvgElement("path",{"class":"blocklyPath"},this.svgGroup_);this.svgPathLight_=Blockly.utils.createSvgElement("path",{"class":"blocklyPathLight"},this.svgGroup_);this.svgPath_.tooltip=this;this.rendered=!1;this.useDragSurface_= @@ -1463,10 +1472,11 @@ Blockly.BlockSvg.INNER_TOP_LEFT_CORNER=Blockly.BlockSvg.NOTCH_PATH_RIGHT+" h -"+ Blockly.BlockSvg.INNER_TOP_LEFT_CORNER_HIGHLIGHT_RTL="a "+Blockly.BlockSvg.CORNER_RADIUS+","+Blockly.BlockSvg.CORNER_RADIUS+" 0 0,0 "+(-Blockly.BlockSvg.DISTANCE_45_OUTSIDE-.5)+","+(Blockly.BlockSvg.CORNER_RADIUS-Blockly.BlockSvg.DISTANCE_45_OUTSIDE);Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_RTL="a "+(Blockly.BlockSvg.CORNER_RADIUS+.5)+","+(Blockly.BlockSvg.CORNER_RADIUS+.5)+" 0 0,0 "+(Blockly.BlockSvg.CORNER_RADIUS+.5)+","+(Blockly.BlockSvg.CORNER_RADIUS+.5); Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_LTR="a "+(Blockly.BlockSvg.CORNER_RADIUS+.5)+","+(Blockly.BlockSvg.CORNER_RADIUS+.5)+" 0 0,0 "+(Blockly.BlockSvg.CORNER_RADIUS-Blockly.BlockSvg.DISTANCE_45_OUTSIDE)+","+(Blockly.BlockSvg.DISTANCE_45_OUTSIDE+.5);Blockly.BlockSvg.prototype.getHeightWidth=function(){var a=this.height,b=this.width,c=this.getNextBlock();c?(c=c.getHeightWidth(),a+=c.height-4,b=Math.max(b,c.width)):this.nextConnection||this.outputConnection||(a+=2);return{height:a,width:b}}; Blockly.BlockSvg.prototype.render=function(a){Blockly.Field.startCache();this.rendered=!0;var b=Blockly.BlockSvg.SEP_SPACE_X;this.RTL&&(b=-b);for(var c=this.getIcons(),d=0;da)}};Blockly.Flyout.prototype.reflow=function(){this.reflowWrapper_&&this.workspace_.removeChangeListener(this.reflowWrapper_);this.reflowInternal_();this.reflowWrapper_&&this.workspace_.addChangeListener(this.reflowWrapper_)}; +Blockly.Flyout.prototype.filterForCapacity_=function(){for(var a=this.workspace_.getTopBlocks(!1),b=0,c;c=a[b];b++)-1==this.permanentlyDisabled_.indexOf(c)&&c.setDisabled(!this.targetWorkspace_.isCapacityAvailable(Blockly.utils.getBlockTypeCounts(c)))};Blockly.Flyout.prototype.reflow=function(){this.reflowWrapper_&&this.workspace_.removeChangeListener(this.reflowWrapper_);this.reflowInternal_();this.reflowWrapper_&&this.workspace_.addChangeListener(this.reflowWrapper_)}; Blockly.Flyout.prototype.isScrollable=function(){return this.scrollbar_?this.scrollbar_.isVisible():!1}; Blockly.Flyout.prototype.placeNewBlock_=function(a){var b=this.targetWorkspace_;if(!a.getSvgRoot())throw Error("oldBlock is not rendered.");var c=Blockly.Xml.blockToDom(a);b.setResizesEnabled(!1);c=Blockly.Xml.domToBlock(c,b);if(!c.getSvgRoot())throw Error("block is not rendered.");var d=b.getOriginOffsetInPixels(),e=this.workspace_.getOriginOffsetInPixels();a=a.getRelativeToSurfaceXY().scale(this.workspace_.scale);a=goog.math.Coordinate.sum(e,a);b=goog.math.Coordinate.difference(a,d).scale(1/b.scale); c.moveBy(b.x,b.y);return c};Blockly.HorizontalFlyout=function(a){a.getMetrics=this.getMetrics_.bind(this);a.setMetrics=this.setMetrics_.bind(this);Blockly.HorizontalFlyout.superClass_.constructor.call(this,a);this.horizontalLayout_=!0};goog.inherits(Blockly.HorizontalFlyout,Blockly.Flyout); @@ -1658,25 +1668,26 @@ Blockly.Css.CONTENT=[".blocklySvg {","background-color: #fff;","outline: none;", "color: #000;","display: none;","font-family: sans-serif;","font-size: 9pt;","opacity: .9;","padding: 2px;","position: absolute;","z-index: 100000;","}",".blocklyResizeSE {","cursor: se-resize;","fill: #aaa;","}",".blocklyResizeSW {","cursor: sw-resize;","fill: #aaa;","}",".blocklyResizeLine {","stroke: #515A5A;","stroke-width: 1;","}",".blocklyHighlightedConnectionPath {","fill: none;","stroke: #fc3;","stroke-width: 4px;","}",".blocklyPathLight {","fill: none;","stroke-linecap: round;","stroke-width: 1;", "}",".blocklySelected>.blocklyPath {","stroke: #fc3;","stroke-width: 3px;","}",".blocklySelected>.blocklyPathLight {","display: none;","}",".blocklyDraggable {",'cursor: url("<<>>/handopen.cur"), auto;',"cursor: grab;","cursor: -webkit-grab;","}",".blocklyDragging {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;","}",".blocklyDraggable:active {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;", "}",".blocklyBlockDragSurface .blocklyDraggable {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;","}",".blocklyDragging.blocklyDraggingDelete {",'cursor: url("<<>>/handdelete.cur"), auto;',"}",".blocklyToolboxDelete {",'cursor: url("<<>>/handdelete.cur"), auto;',"}",".blocklyToolboxGrab {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;","}",".blocklyDragging>.blocklyPath,",".blocklyDragging>.blocklyPathLight {", -"fill-opacity: .8;","stroke-opacity: .8;","}",".blocklyDragging>.blocklyPathDark {","display: none;","}",".blocklyDisabled>.blocklyPath {","fill-opacity: .5;","stroke-opacity: .5;","}",".blocklyDisabled>.blocklyPathLight,",".blocklyDisabled>.blocklyPathDark {","display: none;","}",".blocklyText {","cursor: default;","fill: #fff;","font-family: sans-serif;","font-size: 11pt;","}",".blocklyNonEditableText>text {","pointer-events: none;","}",".blocklyNonEditableText>rect,",".blocklyEditableText>rect {", -"fill: #fff;","fill-opacity: .6;","}",".blocklyNonEditableText>text,",".blocklyEditableText>text {","fill: #000;","}",".blocklyEditableText:hover>rect {","stroke: #fff;","stroke-width: 2;","}",".blocklyBubbleText {","fill: #000;","}",".blocklyFlyout {","position: absolute;","z-index: 20;","}",".blocklyFlyoutButton {","fill: #888;","cursor: default;","}",".blocklyFlyoutButtonShadow {","fill: #666;","}",".blocklyFlyoutButton:hover {","fill: #aaa;","}",".blocklyFlyoutLabel {","cursor: default;","}", -".blocklyFlyoutLabelBackground {","opacity: 0;","}",".blocklyFlyoutLabelText {","fill: #000;","}",".blocklySvg text, .blocklyBlockDragSurface text {","user-select: none;","-moz-user-select: none;","-ms-user-select: none;","-webkit-user-select: none;","cursor: inherit;","}",".blocklyHidden {","display: none;","}",".blocklyFieldDropdown:not(.blocklyHidden) {","display: block;","}",".blocklyIconGroup {","cursor: default;","}",".blocklyIconGroup:not(:hover),",".blocklyIconGroupReadonly {","opacity: .6;", -"}",".blocklyIconShape {","fill: #00f;","stroke: #fff;","stroke-width: 1px;","}",".blocklyIconSymbol {","fill: #fff;","}",".blocklyMinimalBody {","margin: 0;","padding: 0;","}",".blocklyCommentForeignObject {","position: relative;","z-index: 0;","}",".blocklyCommentRect {","fill: #E7DE8E;","stroke: #bcA903;","stroke-width: 1px","}",".blocklyCommentTarget {","fill: transparent;","stroke: #bcA903;","}",".blocklyCommentTargetFocused {","fill: none;","}",".blocklyCommentHandleTarget {","fill: none;", -"}",".blocklyCommentHandleTargetFocused {","fill: transparent;","}",".blocklyFocused>.blocklyCommentRect {","fill: #B9B272;","stroke: #B9B272;","}",".blocklySelected>.blocklyCommentTarget {","stroke: #fc3;","stroke-width: 3px;","}",".blocklyCommentTextarea {","background-color: #fef49c;","border: 0;","outline: 0;","margin: 0;","padding: 3px;","resize: none;","display: block;","overflow: hidden;","}",".blocklyCommentDeleteIcon {","cursor: pointer;","fill: #000;","display: none","}",".blocklySelected > .blocklyCommentDeleteIcon {", -"display: block","}",".blocklyDeleteIconShape {","fill: #000;","stroke: #000;","stroke-width: 1px;","}",".blocklyDeleteIconShape.blocklyDeleteIconHighlighted {","stroke: #fc3;","}",".blocklyHtmlInput {","border: none;","border-radius: 4px;","font-family: sans-serif;","height: 100%;","margin: 0;","outline: none;","padding: 0 1px;","width: 100%","}",".blocklyMainBackground {","stroke-width: 1;","stroke: #c6c6c6;","}",".blocklyMutatorBackground {","fill: #fff;","stroke: #ddd;","stroke-width: 1;","}", -".blocklyFlyoutBackground {","fill: #ddd;","fill-opacity: .8;","}",".blocklyTransparentBackground {","opacity: 0;","}",".blocklyMainWorkspaceScrollbar {","z-index: 20;","}",".blocklyFlyoutScrollbar {","z-index: 30;","}",".blocklyScrollbarHorizontal, .blocklyScrollbarVertical {","position: absolute;","outline: none;","}",".blocklyScrollbarBackground {","opacity: 0;","}",".blocklyScrollbarHandle {","fill: #ccc;","}",".blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,",".blocklyScrollbarHandle:hover {", -"fill: #bbb;","}",".blocklyZoom>image {","opacity: .4;","}",".blocklyZoom>image:hover {","opacity: .6;","}",".blocklyZoom>image:active {","opacity: .8;","}",".blocklyFlyout .blocklyScrollbarHandle {","fill: #bbb;","}",".blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,",".blocklyFlyout .blocklyScrollbarHandle:hover {","fill: #aaa;","}",".blocklyInvalidInput {","background: #faa;","}",".blocklyAngleCircle {","stroke: #444;","stroke-width: 1;","fill: #ddd;","fill-opacity: .8;", -"}",".blocklyAngleMarks {","stroke: #444;","stroke-width: 1;","}",".blocklyAngleGauge {","fill: #f88;","fill-opacity: .8;","}",".blocklyAngleLine {","stroke: #f00;","stroke-width: 2;","stroke-linecap: round;","pointer-events: none;","}",".blocklyContextMenu {","border-radius: 4px;","}",".blocklyDropdownMenu {","padding: 0 !important;","}",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-icon {","background: url(<<>>/sprites.png) no-repeat -48px -16px !important;", -"}",".blocklyToolboxDiv {","background-color: #ddd;","overflow-x: visible;","overflow-y: auto;","position: absolute;","user-select: none;","-moz-user-select: none;","-ms-user-select: none;","-webkit-user-select: none;","z-index: 70;","-webkit-tap-highlight-color: transparent;","}",".blocklyTreeRoot {","padding: 4px 0;","}",".blocklyTreeRoot:focus {","outline: none;","}",".blocklyTreeRow {","height: 22px;","line-height: 22px;","margin-bottom: 3px;","padding-right: 8px;","white-space: nowrap;","}", -".blocklyHorizontalTree {","float: left;","margin: 1px 5px 8px 0;","}",".blocklyHorizontalTreeRtl {","float: right;","margin: 1px 0 8px 5px;","}",'.blocklyToolboxDiv[dir="RTL"] .blocklyTreeRow {',"margin-left: 8px;","}",".blocklyTreeRow:not(.blocklyTreeSelected):hover {","background-color: #e4e4e4;","}",".blocklyTreeSeparator {","border-bottom: solid #e5e5e5 1px;","height: 0;","margin: 5px 0;","}",".blocklyTreeSeparatorHorizontal {","border-right: solid #e5e5e5 1px;","width: 0;","padding: 5px 0;", -"margin: 0 5px;","}",".blocklyTreeIcon {","background-image: url(<<>>/sprites.png);","height: 16px;","vertical-align: middle;","width: 16px;","}",".blocklyTreeIconClosedLtr {","background-position: -32px -1px;","}",".blocklyTreeIconClosedRtl {","background-position: 0 -1px;","}",".blocklyTreeIconOpen {","background-position: -16px -1px;","}",".blocklyTreeSelected>.blocklyTreeIconClosedLtr {","background-position: -32px -17px;","}",".blocklyTreeSelected>.blocklyTreeIconClosedRtl {","background-position: 0 -17px;", -"}",".blocklyTreeSelected>.blocklyTreeIconOpen {","background-position: -16px -17px;","}",".blocklyTreeIconNone,",".blocklyTreeSelected>.blocklyTreeIconNone {","background-position: -48px -1px;","}",".blocklyTreeLabel {","cursor: default;","font-family: sans-serif;","font-size: 16px;","padding: 0 3px;","vertical-align: middle;","}",".blocklyToolboxDelete .blocklyTreeLabel {",'cursor: url("<<>>/handdelete.cur"), auto;',"}",".blocklyTreeSelected .blocklyTreeLabel {","color: #fff;","}",".blocklyColourTable {", -"border-collapse: collapse;","}",".blocklyColourTable>tr>td {","border: 1px solid #666;","padding: 0;","}",".blocklyColourTable>tr>td>div {","border: 1px solid #666;","height: 13px;","width: 15px;","}",".blocklyColourTable>tr>td>div:hover {","border: 1px solid #fff;","}",".blocklyColourSelected, .blocklyColourSelected:hover {","border: 1px solid #000 !important;","}",".blocklyWidgetDiv .goog-menu {","background: #fff;","border-color: #ccc #666 #666 #ccc;","border-style: solid;","border-width: 1px;", -"cursor: default;","font: normal 13px Arial, sans-serif;","margin: 0;","outline: none;","padding: 4px 0;","position: absolute;","overflow-y: auto;","overflow-x: hidden;","max-height: 100%;","z-index: 20000;","}",".blocklyWidgetDiv .goog-menuitem {","color: #000;","font: normal 13px Arial, sans-serif;","list-style: none;","margin: 0;","padding: 4px 7em 4px 28px;","white-space: nowrap;","}",".blocklyWidgetDiv .goog-menuitem.goog-menuitem-rtl {","padding-left: 7em;","padding-right: 28px;","}",".blocklyWidgetDiv .goog-menu-nocheckbox .goog-menuitem,", -".blocklyWidgetDiv .goog-menu-noicon .goog-menuitem {","padding-left: 12px;","}",".blocklyWidgetDiv .goog-menu-noaccel .goog-menuitem {","padding-right: 20px;","}",".blocklyWidgetDiv .goog-menuitem-content {","color: #000;","font: normal 13px Arial, sans-serif;","}",".blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-accel,",".blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-content {","color: #ccc !important;","}",".blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-icon {","opacity: 0.3;", -"filter: alpha(opacity=30);","}",".blocklyWidgetDiv .goog-menuitem-highlight,",".blocklyWidgetDiv .goog-menuitem-hover {","background-color: #d6e9f8;","border-color: #d6e9f8;","border-style: dotted;","border-width: 1px 0;","padding-bottom: 3px;","padding-top: 3px;","}",".blocklyWidgetDiv .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-menuitem-icon {","background-repeat: no-repeat;","height: 16px;","left: 6px;","position: absolute;","right: auto;","vertical-align: middle;","width: 16px;","}",".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-checkbox,", -".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-icon {","left: auto;","right: 6px;","}",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-icon {","background: url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -512px 0;","}",".blocklyWidgetDiv .goog-menuitem-accel {","color: #999;","direction: ltr;","left: auto;","padding: 0 6px;","position: absolute;","right: 0;","text-align: right;","}",".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-accel {", -"left: 0;","right: auto;","text-align: left;","}",".blocklyWidgetDiv .goog-menuitem-mnemonic-hint {","text-decoration: underline;","}",".blocklyWidgetDiv .goog-menuitem-mnemonic-separator {","color: #999;","font-size: 12px;","padding-left: 4px;","}",".blocklyWidgetDiv .goog-menuseparator {","border-top: 1px solid #ccc;","margin: 4px 0;","padding: 0;","}",""];Blockly.WidgetDiv={};Blockly.WidgetDiv.DIV=null;Blockly.WidgetDiv.owner_=null;Blockly.WidgetDiv.dispose_=null;Blockly.WidgetDiv.createDom=function(){Blockly.WidgetDiv.DIV||(Blockly.WidgetDiv.DIV=document.createElement("div"),Blockly.WidgetDiv.DIV.className="blocklyWidgetDiv",document.body.appendChild(Blockly.WidgetDiv.DIV))}; +"fill-opacity: .8;","stroke-opacity: .8;","}",".blocklyDragging>.blocklyPathDark {","display: none;","}",".blocklyDisabled>.blocklyPath {","fill-opacity: .5;","stroke-opacity: .5;","}",".blocklyDisabled>.blocklyPathLight,",".blocklyDisabled>.blocklyPathDark {","display: none;","}",".blocklyInsertionMarker>.blocklyPath,",".blocklyInsertionMarker>.blocklyPathLight,",".blocklyInsertionMarker>.blocklyPathDark {","fill-opacity: .2;","stroke: none","}",".blocklyReplaceable .blocklyPath {","fill-opacity: 0.5;", +"}",".blocklyReplaceable .blocklyPathLight,",".blocklyReplaceable .blocklyPathDark {","display: none;","}",".blocklyText {","cursor: default;","fill: #fff;","font-family: sans-serif;","font-size: 11pt;","}",".blocklyNonEditableText>text {","pointer-events: none;","}",".blocklyNonEditableText>rect,",".blocklyEditableText>rect {","fill: #fff;","fill-opacity: .6;","}",".blocklyNonEditableText>text,",".blocklyEditableText>text {","fill: #000;","}",".blocklyEditableText:hover>rect {","stroke: #fff;","stroke-width: 2;", +"}",".blocklyBubbleText {","fill: #000;","}",".blocklyFlyout {","position: absolute;","z-index: 20;","}",".blocklyFlyoutButton {","fill: #888;","cursor: default;","}",".blocklyFlyoutButtonShadow {","fill: #666;","}",".blocklyFlyoutButton:hover {","fill: #aaa;","}",".blocklyFlyoutLabel {","cursor: default;","}",".blocklyFlyoutLabelBackground {","opacity: 0;","}",".blocklyFlyoutLabelText {","fill: #000;","}",".blocklySvg text, .blocklyBlockDragSurface text {","user-select: none;","-moz-user-select: none;", +"-ms-user-select: none;","-webkit-user-select: none;","cursor: inherit;","}",".blocklyHidden {","display: none;","}",".blocklyFieldDropdown:not(.blocklyHidden) {","display: block;","}",".blocklyIconGroup {","cursor: default;","}",".blocklyIconGroup:not(:hover),",".blocklyIconGroupReadonly {","opacity: .6;","}",".blocklyIconShape {","fill: #00f;","stroke: #fff;","stroke-width: 1px;","}",".blocklyIconSymbol {","fill: #fff;","}",".blocklyMinimalBody {","margin: 0;","padding: 0;","}",".blocklyCommentForeignObject {", +"position: relative;","z-index: 0;","}",".blocklyCommentRect {","fill: #E7DE8E;","stroke: #bcA903;","stroke-width: 1px","}",".blocklyCommentTarget {","fill: transparent;","stroke: #bcA903;","}",".blocklyCommentTargetFocused {","fill: none;","}",".blocklyCommentHandleTarget {","fill: none;","}",".blocklyCommentHandleTargetFocused {","fill: transparent;","}",".blocklyFocused>.blocklyCommentRect {","fill: #B9B272;","stroke: #B9B272;","}",".blocklySelected>.blocklyCommentTarget {","stroke: #fc3;","stroke-width: 3px;", +"}",".blocklyCommentTextarea {","background-color: #fef49c;","border: 0;","outline: 0;","margin: 0;","padding: 3px;","resize: none;","display: block;","overflow: hidden;","}",".blocklyCommentDeleteIcon {","cursor: pointer;","fill: #000;","display: none","}",".blocklySelected > .blocklyCommentDeleteIcon {","display: block","}",".blocklyDeleteIconShape {","fill: #000;","stroke: #000;","stroke-width: 1px;","}",".blocklyDeleteIconShape.blocklyDeleteIconHighlighted {","stroke: #fc3;","}",".blocklyHtmlInput {", +"border: none;","border-radius: 4px;","font-family: sans-serif;","height: 100%;","margin: 0;","outline: none;","padding: 0 1px;","width: 100%","}",".blocklyMainBackground {","stroke-width: 1;","stroke: #c6c6c6;","}",".blocklyMutatorBackground {","fill: #fff;","stroke: #ddd;","stroke-width: 1;","}",".blocklyFlyoutBackground {","fill: #ddd;","fill-opacity: .8;","}",".blocklyTransparentBackground {","opacity: 0;","}",".blocklyMainWorkspaceScrollbar {","z-index: 20;","}",".blocklyFlyoutScrollbar {","z-index: 30;", +"}",".blocklyScrollbarHorizontal, .blocklyScrollbarVertical {","position: absolute;","outline: none;","}",".blocklyScrollbarBackground {","opacity: 0;","}",".blocklyScrollbarHandle {","fill: #ccc;","}",".blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,",".blocklyScrollbarHandle:hover {","fill: #bbb;","}",".blocklyZoom>image, .blocklyZoom>svg>image {","opacity: .4;","}",".blocklyZoom>image:hover, .blocklyZoom>svg>image:hover {","opacity: .6;","}",".blocklyZoom>image:active, .blocklyZoom>svg>image:active {", +"opacity: .8;","}",".blocklyFlyout .blocklyScrollbarHandle {","fill: #bbb;","}",".blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,",".blocklyFlyout .blocklyScrollbarHandle:hover {","fill: #aaa;","}",".blocklyInvalidInput {","background: #faa;","}",".blocklyAngleCircle {","stroke: #444;","stroke-width: 1;","fill: #ddd;","fill-opacity: .8;","}",".blocklyAngleMarks {","stroke: #444;","stroke-width: 1;","}",".blocklyAngleGauge {","fill: #f88;","fill-opacity: .8;","}",".blocklyAngleLine {", +"stroke: #f00;","stroke-width: 2;","stroke-linecap: round;","pointer-events: none;","}",".blocklyContextMenu {","border-radius: 4px;","}",".blocklyDropdownMenu {","padding: 0 !important;","}",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-icon {","background: url(<<>>/sprites.png) no-repeat -48px -16px !important;","}",".blocklyToolboxDiv {","background-color: #ddd;","overflow-x: visible;","overflow-y: auto;","position: absolute;", +"user-select: none;","-moz-user-select: none;","-ms-user-select: none;","-webkit-user-select: none;","z-index: 70;","-webkit-tap-highlight-color: transparent;","}",".blocklyTreeRoot {","padding: 4px 0;","}",".blocklyTreeRoot:focus {","outline: none;","}",".blocklyTreeRow {","height: 22px;","line-height: 22px;","margin-bottom: 3px;","padding-right: 8px;","white-space: nowrap;","}",".blocklyHorizontalTree {","float: left;","margin: 1px 5px 8px 0;","}",".blocklyHorizontalTreeRtl {","float: right;","margin: 1px 0 8px 5px;", +"}",'.blocklyToolboxDiv[dir="RTL"] .blocklyTreeRow {',"margin-left: 8px;","}",".blocklyTreeRow:not(.blocklyTreeSelected):hover {","background-color: #e4e4e4;","}",".blocklyTreeSeparator {","border-bottom: solid #e5e5e5 1px;","height: 0;","margin: 5px 0;","}",".blocklyTreeSeparatorHorizontal {","border-right: solid #e5e5e5 1px;","width: 0;","padding: 5px 0;","margin: 0 5px;","}",".blocklyTreeIcon {","background-image: url(<<>>/sprites.png);","height: 16px;","vertical-align: middle;","width: 16px;", +"}",".blocklyTreeIconClosedLtr {","background-position: -32px -1px;","}",".blocklyTreeIconClosedRtl {","background-position: 0 -1px;","}",".blocklyTreeIconOpen {","background-position: -16px -1px;","}",".blocklyTreeSelected>.blocklyTreeIconClosedLtr {","background-position: -32px -17px;","}",".blocklyTreeSelected>.blocklyTreeIconClosedRtl {","background-position: 0 -17px;","}",".blocklyTreeSelected>.blocklyTreeIconOpen {","background-position: -16px -17px;","}",".blocklyTreeIconNone,",".blocklyTreeSelected>.blocklyTreeIconNone {", +"background-position: -48px -1px;","}",".blocklyTreeLabel {","cursor: default;","font-family: sans-serif;","font-size: 16px;","padding: 0 3px;","vertical-align: middle;","}",".blocklyToolboxDelete .blocklyTreeLabel {",'cursor: url("<<>>/handdelete.cur"), auto;',"}",".blocklyTreeSelected .blocklyTreeLabel {","color: #fff;","}",".blocklyColourTable {","border-collapse: collapse;","}",".blocklyColourTable>tr>td {","border: 1px solid #666;","padding: 0;","}",".blocklyColourTable>tr>td>div {","border: 1px solid #666;", +"height: 13px;","width: 15px;","}",".blocklyColourTable>tr>td>div:hover {","border: 1px solid #fff;","}",".blocklyColourSelected, .blocklyColourSelected:hover {","border: 1px solid #000 !important;","}",".blocklyWidgetDiv .goog-menu {","background: #fff;","border-color: #ccc #666 #666 #ccc;","border-style: solid;","border-width: 1px;","cursor: default;","font: normal 13px Arial, sans-serif;","margin: 0;","outline: none;","padding: 4px 0;","position: absolute;","overflow-y: auto;","overflow-x: hidden;", +"max-height: 100%;","z-index: 20000;","}",".blocklyWidgetDiv .goog-menuitem {","color: #000;","font: normal 13px Arial, sans-serif;","list-style: none;","margin: 0;","padding: 4px 7em 4px 28px;","white-space: nowrap;","}",".blocklyWidgetDiv .goog-menuitem.goog-menuitem-rtl {","padding-left: 7em;","padding-right: 28px;","}",".blocklyWidgetDiv .goog-menu-nocheckbox .goog-menuitem,",".blocklyWidgetDiv .goog-menu-noicon .goog-menuitem {","padding-left: 12px;","}",".blocklyWidgetDiv .goog-menu-noaccel .goog-menuitem {", +"padding-right: 20px;","}",".blocklyWidgetDiv .goog-menuitem-content {","color: #000;","font: normal 13px Arial, sans-serif;","}",".blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-accel,",".blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-content {","color: #ccc !important;","}",".blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-icon {","opacity: 0.3;","filter: alpha(opacity=30);","}",".blocklyWidgetDiv .goog-menuitem-highlight,",".blocklyWidgetDiv .goog-menuitem-hover {","background-color: #d6e9f8;", +"border-color: #d6e9f8;","border-style: dotted;","border-width: 1px 0;","padding-bottom: 3px;","padding-top: 3px;","}",".blocklyWidgetDiv .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-menuitem-icon {","background-repeat: no-repeat;","height: 16px;","left: 6px;","position: absolute;","right: auto;","vertical-align: middle;","width: 16px;","}",".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-icon {","left: auto;","right: 6px;", +"}",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-icon {","background: url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -512px 0;","}",".blocklyWidgetDiv .goog-menuitem-accel {","color: #999;","direction: ltr;","left: auto;","padding: 0 6px;","position: absolute;","right: 0;","text-align: right;","}",".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-accel {","left: 0;","right: auto;","text-align: left;","}",".blocklyWidgetDiv .goog-menuitem-mnemonic-hint {", +"text-decoration: underline;","}",".blocklyWidgetDiv .goog-menuitem-mnemonic-separator {","color: #999;","font-size: 12px;","padding-left: 4px;","}",".blocklyWidgetDiv .goog-menuseparator {","border-top: 1px solid #ccc;","margin: 4px 0;","padding: 0;","}",""];Blockly.WidgetDiv={};Blockly.WidgetDiv.DIV=null;Blockly.WidgetDiv.owner_=null;Blockly.WidgetDiv.dispose_=null;Blockly.WidgetDiv.createDom=function(){Blockly.WidgetDiv.DIV||(Blockly.WidgetDiv.DIV=document.createElement("div"),Blockly.WidgetDiv.DIV.className="blocklyWidgetDiv",document.body.appendChild(Blockly.WidgetDiv.DIV))}; Blockly.WidgetDiv.show=function(a,b,c){Blockly.WidgetDiv.hide();Blockly.WidgetDiv.owner_=a;Blockly.WidgetDiv.dispose_=c;a=goog.style.getViewportPageOffset(document);Blockly.WidgetDiv.DIV.style.top=a.y+"px";Blockly.WidgetDiv.DIV.style.direction=b?"rtl":"ltr";Blockly.WidgetDiv.DIV.style.display="block"}; Blockly.WidgetDiv.hide=function(){Blockly.WidgetDiv.owner_&&(Blockly.WidgetDiv.owner_=null,Blockly.WidgetDiv.DIV.style.display="none",Blockly.WidgetDiv.DIV.style.left="",Blockly.WidgetDiv.DIV.style.top="",Blockly.WidgetDiv.dispose_&&Blockly.WidgetDiv.dispose_(),Blockly.WidgetDiv.dispose_=null,Blockly.WidgetDiv.DIV.innerHTML="")};Blockly.WidgetDiv.isVisible=function(){return!!Blockly.WidgetDiv.owner_};Blockly.WidgetDiv.hideIfOwner=function(a){Blockly.WidgetDiv.owner_==a&&Blockly.WidgetDiv.hide()}; Blockly.WidgetDiv.position=function(a,b,c,d,e){bc.width+d.x&&(a=c.width+d.x):aa.viewHeight+d||a.contentLeft<(b.RTL?a.viewLeft:c)||a.contentLeft+a.contentWidth>(b.RTL?a.viewWidth:a.viewWidth+c))for(var k=e.getTopBlocks(!1),l=0,n;n=k[l];l++){var m=n.getRelativeToSurfaceXY(),p=n.getHeightWidth(),q=d+25-p.height-m.y;0q&&n.moveBy(0,q);q=25+c-m.x-(b.RTL?0:p.width);0m&&n.moveBy(m,0)}}});Blockly.svgResize(e);Blockly.WidgetDiv.createDom();Blockly.Tooltip.createDom(); -return e}; -Blockly.init_=function(a){var b=a.options,c=a.getParentSvg();Blockly.bindEventWithChecks_(c.parentNode,"contextmenu",null,function(a){Blockly.utils.isTargetInput(a)||a.preventDefault()});c=Blockly.bindEventWithChecks_(window,"resize",null,function(){Blockly.hideChaff(!0);Blockly.svgResize(a)});a.setResizeHandlerWrapper(c);Blockly.inject.bindDocumentEvents_();b.languageTree&&(a.toolbox_?a.toolbox_.init(a):a.flyout_&&(a.flyout_.init(a),a.flyout_.show(b.languageTree.childNodes),a.flyout_.scrollToStart(),a.scrollX= -a.flyout_.width_,b.toolboxPosition==Blockly.TOOLBOX_AT_RIGHT&&(a.scrollX*=-1),a.translate(a.scrollX,0)));b.hasScrollbars&&(a.scrollbar=new Blockly.ScrollbarPair(a),a.scrollbar.resize());b.hasSounds&&Blockly.inject.loadSounds_(b.pathToMedia,a)}; +Blockly.createMainWorkspace_=function(a,b,c,d){b.parentWorkspace=null;var e=new Blockly.WorkspaceSvg(b,c,d);e.scale=b.zoomOptions.startScale;a.appendChild(e.createDom("blocklyMainBackground"));!b.hasCategories&&b.languageTree&&(c=e.addFlyout_("svg"),Blockly.utils.insertAfter(c,a));e.translate(0,0);Blockly.mainWorkspace=e;b.readOnly||b.hasScrollbars||e.addChangeListener(function(a){if(!e.isDragging()){var c=e.getMetrics(),d=c.viewLeft+c.absoluteLeft,f=c.viewTop+c.absoluteTop;if(c.contentTopc.viewHeight+f||c.contentLeft<(b.RTL?c.viewLeft:d)||c.contentLeft+c.contentWidth>(b.RTL?c.viewWidth:c.viewWidth+d)){var l=e.getTopBlocks(!1),n=null;a&&(n=Blockly.Events.getGroup(),Blockly.Events.setGroup(a.group));for(var m=!1,p=0,q;q=l[p];p++){var r=q.getRelativeToSurfaceXY(),t=q.getHeightWidth(),u=f+25-t.height-r.y;0u&&(q.moveBy(0,u),m=!0);u=25+d-r.x-(b.RTL?0:t.width);0r&&(q.moveBy(r,0),m=!0)}a&&(!a.group&&m&&console.log("WARNING: Moved blocks in bounds but there was no event group. This may break undo."),Blockly.Events.setGroup(n))}}});Blockly.svgResize(e);Blockly.WidgetDiv.createDom();Blockly.Tooltip.createDom();return e}; +Blockly.init_=function(a){var b=a.options,c=a.getParentSvg();Blockly.bindEventWithChecks_(c.parentNode,"contextmenu",null,function(a){Blockly.utils.isTargetInput(a)||a.preventDefault()});c=Blockly.bindEventWithChecks_(window,"resize",null,function(){Blockly.hideChaff(!0);Blockly.svgResize(a)});a.setResizeHandlerWrapper(c);Blockly.inject.bindDocumentEvents_();b.languageTree&&(a.toolbox_?a.toolbox_.init(a):a.flyout_&&(a.flyout_.init(a),a.flyout_.show(b.languageTree.childNodes),a.flyout_.scrollToStart(), +a.scrollX=a.flyout_.width_,b.toolboxPosition==Blockly.TOOLBOX_AT_RIGHT&&(a.scrollX*=-1),a.translate(a.scrollX,0)));b.hasScrollbars&&(a.scrollbar=new Blockly.ScrollbarPair(a),a.scrollbar.resize());b.hasSounds&&Blockly.inject.loadSounds_(b.pathToMedia,a)}; Blockly.inject.bindDocumentEvents_=function(){Blockly.documentEventsBound_||(Blockly.bindEventWithChecks_(document,"keydown",null,Blockly.onKeyDown_),Blockly.bindEvent_(document,"touchend",null,Blockly.longStop_),Blockly.bindEvent_(document,"touchcancel",null,Blockly.longStop_),goog.userAgent.IPAD&&Blockly.bindEventWithChecks_(window,"orientationchange",document,function(){Blockly.svgResize(Blockly.getMainWorkspace())}));Blockly.documentEventsBound_=!0}; Blockly.inject.loadSounds_=function(a,b){var c=b.getAudioManager();c.load([a+"click.mp3",a+"click.wav",a+"click.ogg"],"click");c.load([a+"disconnect.wav",a+"disconnect.mp3",a+"disconnect.ogg"],"disconnect");c.load([a+"delete.mp3",a+"delete.ogg",a+"delete.wav"],"delete");var d=[];a=function(){for(;d.length;)Blockly.unbindEvent_(d.pop());c.preload()};d.push(Blockly.bindEventWithChecks_(document,"mousemove",null,a,!0));d.push(Blockly.bindEventWithChecks_(document,"touchstart",null,a,!0))}; -Blockly.updateToolbox=function(a){console.warn("Deprecated call to Blockly.updateToolbox, use workspace.updateToolbox instead.");Blockly.getMainWorkspace().updateToolbox(a)};var CLOSURE_DEFINES={"goog.DEBUG":!1};Blockly.mainWorkspace=null;Blockly.selected=null;Blockly.draggingConnections_=[];Blockly.clipboardXml_=null;Blockly.clipboardSource_=null;Blockly.cache3dSupported_=null;Blockly.hueToRgb=function(a){return goog.color.hsvToHex(a,Blockly.HSV_SATURATION,255*Blockly.HSV_VALUE)};Blockly.svgSize=function(a){return{width:a.cachedWidth_,height:a.cachedHeight_}};Blockly.resizeSvgContents=function(a){a.resizeContents()}; +Blockly.updateToolbox=function(a){console.warn("Deprecated call to Blockly.updateToolbox, use workspace.updateToolbox instead.");Blockly.getMainWorkspace().updateToolbox(a)};var CLOSURE_DEFINES={"goog.DEBUG":!1};Blockly.mainWorkspace=null;Blockly.selected=null;Blockly.draggingConnections_=[];Blockly.clipboardXml_=null;Blockly.clipboardSource_=null;Blockly.clipboardTypeCounts_=null;Blockly.cache3dSupported_=null;Blockly.hueToRgb=function(a){return goog.color.hsvToHex(a,Blockly.HSV_SATURATION,255*Blockly.HSV_VALUE)};Blockly.svgSize=function(a){return{width:a.cachedWidth_,height:a.cachedHeight_}};Blockly.resizeSvgContents=function(a){a.resizeContents()}; Blockly.svgResize=function(a){for(;a.options.parentWorkspace;)a=a.options.parentWorkspace;var b=a.getParentSvg(),c=b.parentNode;if(c){var d=c.offsetWidth;c=c.offsetHeight;b.cachedWidth_!=d&&(b.setAttribute("width",d+"px"),b.cachedWidth_=d);b.cachedHeight_!=c&&(b.setAttribute("height",c+"px"),b.cachedHeight_=c);a.resize()}}; Blockly.onKeyDown_=function(a){var b=Blockly.mainWorkspace;if(!(b.options.readOnly||Blockly.utils.isTargetInput(a)||b.rendered&&!b.isVisible())){var c=!1;if(27==a.keyCode)Blockly.hideChaff();else if(8==a.keyCode||46==a.keyCode){a.preventDefault();if(b.isDragging())return;Blockly.selected&&Blockly.selected.isDeletable()&&(c=!0)}else if(a.altKey||a.ctrlKey||a.metaKey){if(b.isDragging())return;Blockly.selected&&Blockly.selected.isDeletable()&&Blockly.selected.isMovable()&&(67==a.keyCode?(Blockly.hideChaff(), -Blockly.copy_(Blockly.selected)):88!=a.keyCode||Blockly.selected.workspace.isFlyout||(Blockly.copy_(Blockly.selected),c=!0));86==a.keyCode?Blockly.clipboardXml_&&(Blockly.Events.setGroup(!0),b=Blockly.clipboardSource_,b.isFlyout&&(b=b.targetWorkspace),b.paste(Blockly.clipboardXml_),Blockly.Events.setGroup(!1)):90==a.keyCode&&(Blockly.hideChaff(),b.undo(a.shiftKey))}c&&!Blockly.selected.workspace.isFlyout&&(Blockly.Events.setGroup(!0),Blockly.hideChaff(),Blockly.selected.dispose(!0,!0),Blockly.Events.setGroup(!1))}}; -Blockly.copy_=function(a){if(a.isComment)var b=a.toXmlWithXY();else{b=Blockly.Xml.blockToDom(a);Blockly.Xml.deleteNext(b);var c=a.getRelativeToSurfaceXY();b.setAttribute("x",a.RTL?-c.x:c.x);b.setAttribute("y",c.y)}Blockly.clipboardXml_=b;Blockly.clipboardSource_=a.workspace};Blockly.duplicate_=function(a){var b=Blockly.clipboardXml_,c=Blockly.clipboardSource_;Blockly.copy_(a);a.workspace.paste(Blockly.clipboardXml_);Blockly.clipboardXml_=b;Blockly.clipboardSource_=c}; -Blockly.onContextMenu_=function(a){Blockly.utils.isTargetInput(a)||a.preventDefault()};Blockly.hideChaff=function(a){Blockly.Tooltip.hide();Blockly.WidgetDiv.hide();a||(a=Blockly.getMainWorkspace(),a.toolbox_&&a.toolbox_.flyout_&&a.toolbox_.flyout_.autoClose&&a.toolbox_.clearSelection())};Blockly.addChangeListener=function(a){console.warn("Deprecated call to Blockly.addChangeListener, use workspace.addChangeListener instead.");return Blockly.getMainWorkspace().addChangeListener(a)}; -Blockly.getMainWorkspace=function(){return Blockly.mainWorkspace};Blockly.alert=function(a,b){window.alert(a);b&&b()};Blockly.confirm=function(a,b){b(window.confirm(a))};Blockly.prompt=function(a,b,c){c(window.prompt(a,b))};Blockly.jsonInitFactory_=function(a){return function(){this.jsonInit(a)}}; +Blockly.copy_(Blockly.selected)):88!=a.keyCode||Blockly.selected.workspace.isFlyout||(Blockly.copy_(Blockly.selected),c=!0));86==a.keyCode?Blockly.clipboardXml_&&(b=Blockly.clipboardSource_,b.isFlyout&&(b=b.targetWorkspace),Blockly.clipboardTypeCounts_&&b.isCapacityAvailable(Blockly.clipboardTypeCounts_)&&(Blockly.Events.setGroup(!0),b.paste(Blockly.clipboardXml_),Blockly.Events.setGroup(!1))):90==a.keyCode&&(Blockly.hideChaff(),b.undo(a.shiftKey))}c&&!Blockly.selected.workspace.isFlyout&&(Blockly.Events.setGroup(!0), +Blockly.hideChaff(),Blockly.selected.dispose(!0,!0),Blockly.Events.setGroup(!1))}};Blockly.copy_=function(a){if(a.isComment)var b=a.toXmlWithXY();else{b=Blockly.Xml.blockToDom(a);Blockly.Xml.deleteNext(b);var c=a.getRelativeToSurfaceXY();b.setAttribute("x",a.RTL?-c.x:c.x);b.setAttribute("y",c.y)}Blockly.clipboardXml_=b;Blockly.clipboardSource_=a.workspace;Blockly.clipboardTypeCounts_=a.isComment?null:Blockly.utils.getBlockTypeCounts(a,!0)}; +Blockly.duplicate_=function(a){var b=Blockly.clipboardXml_,c=Blockly.clipboardSource_;Blockly.copy_(a);a.workspace.paste(Blockly.clipboardXml_);Blockly.clipboardXml_=b;Blockly.clipboardSource_=c};Blockly.onContextMenu_=function(a){Blockly.utils.isTargetInput(a)||a.preventDefault()};Blockly.hideChaff=function(a){Blockly.Tooltip.hide();Blockly.WidgetDiv.hide();a||(a=Blockly.getMainWorkspace(),a.toolbox_&&a.toolbox_.flyout_&&a.toolbox_.flyout_.autoClose&&a.toolbox_.clearSelection())}; +Blockly.addChangeListener=function(a){console.warn("Deprecated call to Blockly.addChangeListener, use workspace.addChangeListener instead.");return Blockly.getMainWorkspace().addChangeListener(a)};Blockly.getMainWorkspace=function(){return Blockly.mainWorkspace};Blockly.alert=function(a,b){window.alert(a);b&&b()};Blockly.confirm=function(a,b){b(window.confirm(a))};Blockly.prompt=function(a,b,c){c(window.prompt(a,b))};Blockly.jsonInitFactory_=function(a){return function(){this.jsonInit(a)}}; Blockly.defineBlocksWithJsonArray=function(a){for(var b=0;ba&&(a+=360);360=a[2]?a[1]*a[2]:a[1]*(1-a[2]);var d=.5>=b[2]?b[1]*b[2]:b[1]*(1-b[2]);return(a[2]-b[2])*(a[2]-b[2])+c*c+d*d-2*c*d*Math.cos(2*(a[0]/360-b[0]/360)*Math.PI)};goog.color.blend=function(a,b,c){c=goog.math.clamp(c,0,1);return[Math.round(c*a[0]+(1-c)*b[0]),Math.round(c*a[1]+(1-c)*b[1]),Math.round(c*a[2]+(1-c)*b[2])]};goog.color.darken=function(a,b){return goog.color.blend([0,0,0],a,b)};goog.color.lighten=function(a,b){return goog.color.blend([255,255,255],a,b)}; -goog.color.highContrast=function(a,b){for(var c=[],d=0;d=a[2]?a[1]*a[2]:a[1]*(1-a[2]);var d=.5>=b[2]?b[1]*b[2]:b[1]*(1-b[2]);return(a[2]-b[2])*(a[2]-b[2])+c*c+d*d-2*c*d*Math.cos(2*(a[0]/360-b[0]/360)*Math.PI)};goog.color.blend=function(a,b,c){c=goog.math.clamp(c,0,1);return[Math.round(b[0]+c*(a[0]-b[0])),Math.round(b[1]+c*(a[1]-b[1])),Math.round(b[2]+c*(a[2]-b[2]))]};goog.color.darken=function(a,b){return goog.color.blend([0,0,0],a,b)}; +goog.color.lighten=function(a,b){return goog.color.blend([255,255,255],a,b)};goog.color.highContrast=function(a,b){for(var c=[],d=0;d=a.keyCode)a.keyCode=-1}catch(b){}};goog.events.BrowserEvent.prototype.getBrowserEvent=function(){return this.event_}; @@ -290,13 +290,14 @@ goog.functions.create=function(a,b){var c=function(){};c.prototype=a.prototype;c goog.functions.debounce=function(a,b,c){var d=0;return function(e){goog.global.clearTimeout(d);var f=arguments;d=goog.global.setTimeout(function(){a.apply(c,f)},b)}};goog.functions.throttle=function(a,b,c){var d=0,e=!1,f=[],g=function(){d=0;e&&(e=!1,h())},h=function(){d=goog.global.setTimeout(g,b);a.apply(c,f)};return function(a){f=arguments;d?e=!0:h()}};goog.functions.rateLimit=function(a,b,c){var d=0,e=function(){d=0};return function(f){d||(d=goog.global.setTimeout(e,b),a.apply(c,arguments))}};goog.dom.tags={};goog.dom.tags.VOID_TAGS_={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0};goog.dom.tags.isVoidTag=function(a){return!0===goog.dom.tags.VOID_TAGS_[a]};goog.string.TypedString=function(){};goog.string.Const=function(a,b){this.stringConstValueWithSecurityContract__googStringSecurityPrivate_=a===goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_&&b||"";this.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_=goog.string.Const.TYPE_MARKER_};goog.string.Const.prototype.implementsGoogStringTypedString=!0;goog.string.Const.prototype.getTypedStringValue=function(){return this.stringConstValueWithSecurityContract__googStringSecurityPrivate_}; goog.string.Const.prototype.toString=function(){return"Const{"+this.stringConstValueWithSecurityContract__googStringSecurityPrivate_+"}"};goog.string.Const.unwrap=function(a){if(a instanceof goog.string.Const&&a.constructor===goog.string.Const&&a.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_===goog.string.Const.TYPE_MARKER_)return a.stringConstValueWithSecurityContract__googStringSecurityPrivate_;goog.asserts.fail("expected object of type Const, got '"+a+"'");return"type_error:Const"}; goog.string.Const.from=function(a){return new goog.string.Const(goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_,a)};goog.string.Const.TYPE_MARKER_={};goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_={};goog.string.Const.EMPTY=goog.string.Const.from("");goog.html={};goog.html.SafeScript=function(){this.privateDoNotAccessOrElseSafeScriptWrappedValue_="";this.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_};goog.html.SafeScript.prototype.implementsGoogStringTypedString=!0;goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={};goog.html.SafeScript.fromConstant=function(a){a=goog.string.Const.unwrap(a);return 0===a.length?goog.html.SafeScript.EMPTY:goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(a)}; -goog.html.SafeScript.fromConstantAndArgs=function(a,b){for(var c=[],d=1;da?goog.i18n.bidi.Dir.RTL:b?null:goog.i18n.bidi.Dir.NEUTRAL:null==a?null:a?goog.i18n.bidi.Dir.RTL:goog.i18n.bidi.Dir.LTR};goog.i18n.bidi.ltrChars_="A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0900-\u1fff\u200e\u2c00-\ud801\ud804-\ud839\ud83c-\udbff\uf900-\ufb1c\ufe00-\ufe6f\ufefd-\uffff";goog.i18n.bidi.rtlChars_="\u0591-\u06ef\u06fa-\u08ff\u200f\ud802-\ud803\ud83a-\ud83b\ufb1d-\ufdff\ufe70-\ufefc"; goog.i18n.bidi.htmlSkipReg_=/<[^>]*>|&[^;]+;/g;goog.i18n.bidi.stripHtmlIfNeeded_=function(a,b){return b?a.replace(goog.i18n.bidi.htmlSkipReg_,""):a};goog.i18n.bidi.rtlCharReg_=new RegExp("["+goog.i18n.bidi.rtlChars_+"]");goog.i18n.bidi.ltrCharReg_=new RegExp("["+goog.i18n.bidi.ltrChars_+"]");goog.i18n.bidi.hasAnyRtl=function(a,b){return goog.i18n.bidi.rtlCharReg_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.hasRtlChar=goog.i18n.bidi.hasAnyRtl; @@ -304,7 +305,7 @@ goog.i18n.bidi.hasAnyLtr=function(a,b){return goog.i18n.bidi.ltrCharReg_.test(go goog.i18n.bidi.ltrDirCheckRe_=new RegExp("^[^"+goog.i18n.bidi.rtlChars_+"]*["+goog.i18n.bidi.ltrChars_+"]");goog.i18n.bidi.rtlDirCheckRe_=new RegExp("^[^"+goog.i18n.bidi.ltrChars_+"]*["+goog.i18n.bidi.rtlChars_+"]");goog.i18n.bidi.startsWithRtl=function(a,b){return goog.i18n.bidi.rtlDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isRtlText=goog.i18n.bidi.startsWithRtl; goog.i18n.bidi.startsWithLtr=function(a,b){return goog.i18n.bidi.ltrDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isLtrText=goog.i18n.bidi.startsWithLtr;goog.i18n.bidi.isRequiredLtrRe_=/^http:\/\/.*/;goog.i18n.bidi.isNeutralText=function(a,b){a=goog.i18n.bidi.stripHtmlIfNeeded_(a,b);return goog.i18n.bidi.isRequiredLtrRe_.test(a)||!goog.i18n.bidi.hasAnyLtr(a)&&!goog.i18n.bidi.hasAnyRtl(a)}; goog.i18n.bidi.ltrExitDirCheckRe_=new RegExp("["+goog.i18n.bidi.ltrChars_+"][^"+goog.i18n.bidi.rtlChars_+"]*$");goog.i18n.bidi.rtlExitDirCheckRe_=new RegExp("["+goog.i18n.bidi.rtlChars_+"][^"+goog.i18n.bidi.ltrChars_+"]*$");goog.i18n.bidi.endsWithLtr=function(a,b){return goog.i18n.bidi.ltrExitDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isLtrExitText=goog.i18n.bidi.endsWithLtr; -goog.i18n.bidi.endsWithRtl=function(a,b){return goog.i18n.bidi.rtlExitDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isRtlExitText=goog.i18n.bidi.endsWithRtl;goog.i18n.bidi.rtlLocalesRe_=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Thaa|Nkoo|Tfng))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;goog.i18n.bidi.isRtlLanguage=function(a){return goog.i18n.bidi.rtlLocalesRe_.test(a)};goog.i18n.bidi.bracketGuardTextRe_=/(\(.*?\)+)|(\[.*?\]+)|(\{.*?\}+)|(<.*?>+)/g; +goog.i18n.bidi.endsWithRtl=function(a,b){return goog.i18n.bidi.rtlExitDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isRtlExitText=goog.i18n.bidi.endsWithRtl;goog.i18n.bidi.rtlLocalesRe_=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;goog.i18n.bidi.isRtlLanguage=function(a){return goog.i18n.bidi.rtlLocalesRe_.test(a)};goog.i18n.bidi.bracketGuardTextRe_=/(\(.*?\)+)|(\[.*?\]+)|(\{.*?\}+)|(<.*?>+)/g; goog.i18n.bidi.guardBracketInText=function(a,b){var c=(void 0===b?goog.i18n.bidi.hasAnyRtl(a):b)?goog.i18n.bidi.Format.RLM:goog.i18n.bidi.Format.LRM;return a.replace(goog.i18n.bidi.bracketGuardTextRe_,c+"$&"+c)};goog.i18n.bidi.enforceRtlInHtml=function(a){return"<"==a.charAt(0)?a.replace(/<\w+/,"$& dir=rtl"):"\n"+a+""};goog.i18n.bidi.enforceRtlInText=function(a){return goog.i18n.bidi.Format.RLE+a+goog.i18n.bidi.Format.PDF}; goog.i18n.bidi.enforceLtrInHtml=function(a){return"<"==a.charAt(0)?a.replace(/<\w+/,"$& dir=ltr"):"\n"+a+""};goog.i18n.bidi.enforceLtrInText=function(a){return goog.i18n.bidi.Format.LRE+a+goog.i18n.bidi.Format.PDF};goog.i18n.bidi.dimensionsRe_=/:\s*([.\d][.\w]*)\s+([.\d][.\w]*)\s+([.\d][.\w]*)\s+([.\d][.\w]*)/g;goog.i18n.bidi.leftRe_=/left/gi;goog.i18n.bidi.rightRe_=/right/gi;goog.i18n.bidi.tempRe_=/%%%%/g; goog.i18n.bidi.mirrorCSS=function(a){return a.replace(goog.i18n.bidi.dimensionsRe_,":$1 $4 $3 $2").replace(goog.i18n.bidi.leftRe_,"%%%%").replace(goog.i18n.bidi.rightRe_,goog.i18n.bidi.LEFT).replace(goog.i18n.bidi.tempRe_,goog.i18n.bidi.RIGHT)};goog.i18n.bidi.doubleQuoteSubstituteRe_=/([\u0591-\u05f2])"/g;goog.i18n.bidi.singleQuoteSubstituteRe_=/([\u0591-\u05f2])'/g; @@ -317,9 +318,10 @@ goog.html.TrustedResourceUrl.prototype.cloneWithParams=function(a,b){var c=goog. goog.DEBUG&&(goog.html.TrustedResourceUrl.prototype.toString=function(){return"TrustedResourceUrl{"+this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_+"}"}); goog.html.TrustedResourceUrl.unwrap=function(a){if(a instanceof goog.html.TrustedResourceUrl&&a.constructor===goog.html.TrustedResourceUrl&&a.TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_;goog.asserts.fail("expected object of type TrustedResourceUrl, got '"+a+"' of type "+goog.typeOf(a));return"type_error:TrustedResourceUrl"}; goog.html.TrustedResourceUrl.format=function(a,b){var c=goog.string.Const.unwrap(a);if(!goog.html.TrustedResourceUrl.BASE_URL_.test(c))throw Error("Invalid TrustedResourceUrl format: "+c);var d=c.replace(goog.html.TrustedResourceUrl.FORMAT_MARKER_,function(a,d){if(!Object.prototype.hasOwnProperty.call(b,d))throw Error('Found marker, "'+d+'", in format string, "'+c+'", but no valid label mapping found in args: '+JSON.stringify(b));var e=b[d];return e instanceof goog.string.Const?goog.string.Const.unwrap(e): -encodeURIComponent(String(e))});return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(d)};goog.html.TrustedResourceUrl.FORMAT_MARKER_=/%{(\w+)}/g;goog.html.TrustedResourceUrl.BASE_URL_=/^(?:https:)?\/\/[0-9a-z.:[\]-]+\/|^\/[^\/\\]|^about:blank#/i;goog.html.TrustedResourceUrl.URL_PARAM_PARSER_=/^([^?#]*)(\?[^#]*)?(#[\s\S]*)?/;goog.html.TrustedResourceUrl.formatWithParams=function(a,b,c,d){return goog.html.TrustedResourceUrl.format(a,b).cloneWithParams(c,d)}; -goog.html.TrustedResourceUrl.fromConstant=function(a){return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(goog.string.Const.unwrap(a))};goog.html.TrustedResourceUrl.fromConstants=function(a){for(var b="",c=0;ca.length?"&":"")+encodeURIComponent(d)+"="+encodeURIComponent(String(g)))}}return b};goog.html.SafeUrl=function(){this.privateDoNotAccessOrElseSafeHtmlWrappedValue_="";this.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_};goog.html.SafeUrl.INNOCUOUS_STRING="about:invalid#zClosurez";goog.html.SafeUrl.prototype.implementsGoogStringTypedString=!0;goog.html.SafeUrl.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_}; goog.html.SafeUrl.prototype.implementsGoogI18nBidiDirectionalString=!0;goog.html.SafeUrl.prototype.getDirection=function(){return goog.i18n.bidi.Dir.LTR};goog.DEBUG&&(goog.html.SafeUrl.prototype.toString=function(){return"SafeUrl{"+this.privateDoNotAccessOrElseSafeHtmlWrappedValue_+"}"}); goog.html.SafeUrl.unwrap=function(a){if(a instanceof goog.html.SafeUrl&&a.constructor===goog.html.SafeUrl&&a.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseSafeHtmlWrappedValue_;goog.asserts.fail("expected object of type SafeUrl, got '"+a+"' of type "+goog.typeOf(a));return"type_error:SafeUrl"};goog.html.SafeUrl.fromConstant=function(a){return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(goog.string.Const.unwrap(a))}; goog.html.SAFE_MIME_TYPE_PATTERN_=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-wav|wav|webm)|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|text\/csv|video\/(?:mpeg|mp4|ogg|webm|quicktime))$/i;goog.html.SafeUrl.fromBlob=function(a){a=goog.html.SAFE_MIME_TYPE_PATTERN_.test(a.type)?goog.fs.url.createObjectUrl(a):goog.html.SafeUrl.INNOCUOUS_STRING;return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.DATA_URL_PATTERN_=/^data:([^;,]*);base64,[a-z0-9+\/]+=*$/i; @@ -329,7 +331,7 @@ goog.html.SafeUrl.fromSmsUrl=function(a){goog.string.caseInsensitiveStartsWith(a goog.html.SafeUrl.sanitizeChromeExtensionUrl=function(a,b){return goog.html.SafeUrl.sanitizeExtensionUrl_(/^chrome-extension:\/\/([^\/]+)\//,a,b)};goog.html.SafeUrl.sanitizeFirefoxExtensionUrl=function(a,b){return goog.html.SafeUrl.sanitizeExtensionUrl_(/^moz-extension:\/\/([^\/]+)\//,a,b)};goog.html.SafeUrl.sanitizeEdgeExtensionUrl=function(a,b){return goog.html.SafeUrl.sanitizeExtensionUrl_(/^ms-browser-extension:\/\/([^\/]+)\//,a,b)}; goog.html.SafeUrl.sanitizeExtensionUrl_=function(a,b,c){(a=a.exec(b))?(a=a[1],-1==(c instanceof goog.string.Const?[goog.string.Const.unwrap(c)]:c.map(function(a){return goog.string.Const.unwrap(a)})).indexOf(a)&&(b=goog.html.SafeUrl.INNOCUOUS_STRING)):b=goog.html.SafeUrl.INNOCUOUS_STRING;return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(b)};goog.html.SafeUrl.fromTrustedResourceUrl=function(a){return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(goog.html.TrustedResourceUrl.unwrap(a))}; goog.html.SAFE_URL_PATTERN_=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;goog.html.SafeUrl.SAFE_URL_PATTERN=goog.html.SAFE_URL_PATTERN_;goog.html.SafeUrl.sanitize=function(a){if(a instanceof goog.html.SafeUrl)return a;a="object"==typeof a&&a.implementsGoogStringTypedString?a.getTypedStringValue():String(a);goog.html.SAFE_URL_PATTERN_.test(a)||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)}; -goog.html.SafeUrl.sanitizeAssertUnchanged=function(a){if(a instanceof goog.html.SafeUrl)return a;a="object"==typeof a&&a.implementsGoogStringTypedString?a.getTypedStringValue():String(a);goog.asserts.assert(goog.html.SAFE_URL_PATTERN_.test(a))||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={}; +goog.html.SafeUrl.sanitizeAssertUnchanged=function(a){if(a instanceof goog.html.SafeUrl)return a;a="object"==typeof a&&a.implementsGoogStringTypedString?a.getTypedStringValue():String(a);goog.asserts.assert(goog.html.SAFE_URL_PATTERN_.test(a),"%s does not match the safe URL pattern",a)||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={}; goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse=function(a){var b=new goog.html.SafeUrl;b.privateDoNotAccessOrElseSafeHtmlWrappedValue_=a;return b};goog.html.SafeUrl.ABOUT_BLANK=goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse("about:blank");goog.html.SafeStyle=function(){this.privateDoNotAccessOrElseSafeStyleWrappedValue_="";this.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_};goog.html.SafeStyle.prototype.implementsGoogStringTypedString=!0;goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={}; goog.html.SafeStyle.fromConstant=function(a){a=goog.string.Const.unwrap(a);if(0===a.length)return goog.html.SafeStyle.EMPTY;goog.html.SafeStyle.checkStyle_(a);goog.asserts.assert(goog.string.endsWith(a,";"),"Last character of style string is not ';': "+a);goog.asserts.assert(goog.string.contains(a,":"),"Style string must contain at least one ':', to specify a \"name: value\" pair: "+a);return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(a)}; goog.html.SafeStyle.checkStyle_=function(a){goog.asserts.assert(!/[<>]/.test(a),"Forbidden characters in style string: "+a)};goog.html.SafeStyle.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeStyleWrappedValue_};goog.DEBUG&&(goog.html.SafeStyle.prototype.toString=function(){return"SafeStyle{"+this.privateDoNotAccessOrElseSafeStyleWrappedValue_+"}"}); @@ -590,8 +592,9 @@ goog.events.KeyHandler.prototype.handleKeyDown_=function(a){(goog.userAgent.WEBK a.keyCode!=goog.events.KeyCodes.META&&(this.lastKey_=goog.events.KeyCodes.META));goog.events.KeyHandler.USES_KEYDOWN_&&!goog.events.KeyCodes.firesKeyPressEvent(a.keyCode,this.lastKey_,a.shiftKey,a.ctrlKey,a.altKey,a.metaKey)?this.handleEvent(a):(this.keyCode_=goog.events.KeyCodes.normalizeKeyCode(a.keyCode),goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_&&(this.altKey_=a.altKey))};goog.events.KeyHandler.prototype.resetState=function(){this.keyCode_=this.lastKey_=-1}; goog.events.KeyHandler.prototype.handleKeyup_=function(a){this.resetState();this.altKey_=a.altKey}; goog.events.KeyHandler.prototype.handleEvent=function(a){var b=a.getBrowserEvent(),c=b.altKey;if(goog.userAgent.IE&&a.type==goog.events.EventType.KEYPRESS){var d=this.keyCode_;var e=d!=goog.events.KeyCodes.ENTER&&d!=goog.events.KeyCodes.ESC?b.keyCode:0}else(goog.userAgent.WEBKIT||goog.userAgent.EDGE)&&a.type==goog.events.EventType.KEYPRESS?(d=this.keyCode_,e=0<=b.charCode&&63232>b.charCode&&goog.events.KeyCodes.isCharacterKey(d)?b.charCode:0):goog.userAgent.OPERA&&!goog.userAgent.WEBKIT?(d=this.keyCode_, -e=goog.events.KeyCodes.isCharacterKey(d)?b.keyCode:0):(d=b.keyCode||this.keyCode_,e=b.charCode||0,goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_&&a.type==goog.events.EventType.KEYPRESS&&(c=this.altKey_),goog.userAgent.MAC&&e==goog.events.KeyCodes.QUESTION_MARK&&d==goog.events.KeyCodes.WIN_KEY&&(d=goog.events.KeyCodes.SLASH));var f=d=goog.events.KeyCodes.normalizeKeyCode(d);d?63232<=d&&d in goog.events.KeyHandler.safariKey_?f=goog.events.KeyHandler.safariKey_[d]:25==d&&a.shiftKey&&(f=9):b.keyIdentifier&& -b.keyIdentifier in goog.events.KeyHandler.keyIdentifier_&&(f=goog.events.KeyHandler.keyIdentifier_[b.keyIdentifier]);goog.userAgent.GECKO&&goog.events.KeyHandler.USES_KEYDOWN_&&a.type==goog.events.EventType.KEYPRESS&&!goog.events.KeyCodes.firesKeyPressEvent(f,this.lastKey_,a.shiftKey,a.ctrlKey,c,a.metaKey)||(a=f==this.lastKey_,this.lastKey_=f,b=new goog.events.KeyEvent(f,e,a,b),b.altKey=c,this.dispatchEvent(b))};goog.events.KeyHandler.prototype.getElement=function(){return this.element_}; +e=goog.events.KeyCodes.isCharacterKey(d)?b.keyCode:0):(a.type==goog.events.EventType.KEYPRESS?(goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_&&(c=this.altKey_),b.keyCode==b.charCode?32>b.keyCode?(d=b.keyCode,e=0):(d=this.keyCode_,e=b.charCode):(d=b.keyCode||this.keyCode_,e=b.charCode||0)):(d=b.keyCode||this.keyCode_,e=b.charCode||0),goog.userAgent.MAC&&e==goog.events.KeyCodes.QUESTION_MARK&&d==goog.events.KeyCodes.WIN_KEY&&(d=goog.events.KeyCodes.SLASH));var f=d=goog.events.KeyCodes.normalizeKeyCode(d); +d?63232<=d&&d in goog.events.KeyHandler.safariKey_?f=goog.events.KeyHandler.safariKey_[d]:25==d&&a.shiftKey&&(f=9):b.keyIdentifier&&b.keyIdentifier in goog.events.KeyHandler.keyIdentifier_&&(f=goog.events.KeyHandler.keyIdentifier_[b.keyIdentifier]);goog.userAgent.GECKO&&goog.events.KeyHandler.USES_KEYDOWN_&&a.type==goog.events.EventType.KEYPRESS&&!goog.events.KeyCodes.firesKeyPressEvent(f,this.lastKey_,a.shiftKey,a.ctrlKey,c,a.metaKey)||(a=f==this.lastKey_,this.lastKey_=f,b=new goog.events.KeyEvent(f, +e,a,b),b.altKey=c,this.dispatchEvent(b))};goog.events.KeyHandler.prototype.getElement=function(){return this.element_}; goog.events.KeyHandler.prototype.attach=function(a,b){this.keyUpKey_&&this.detach();this.element_=a;this.keyPressKey_=goog.events.listen(this.element_,goog.events.EventType.KEYPRESS,this,b);this.keyDownKey_=goog.events.listen(this.element_,goog.events.EventType.KEYDOWN,this.handleKeyDown_,b,this);this.keyUpKey_=goog.events.listen(this.element_,goog.events.EventType.KEYUP,this.handleKeyup_,b,this)}; goog.events.KeyHandler.prototype.detach=function(){this.keyPressKey_&&(goog.events.unlistenByKey(this.keyPressKey_),goog.events.unlistenByKey(this.keyDownKey_),goog.events.unlistenByKey(this.keyUpKey_),this.keyUpKey_=this.keyDownKey_=this.keyPressKey_=null);this.element_=null;this.keyCode_=this.lastKey_=-1};goog.events.KeyHandler.prototype.disposeInternal=function(){goog.events.KeyHandler.superClass_.disposeInternal.call(this);this.detach()}; goog.events.KeyEvent=function(a,b,c,d){goog.events.BrowserEvent.call(this,d);this.type=goog.events.KeyHandler.EventType.KEY;this.keyCode=a;this.charCode=b;this.repeat=c};goog.inherits(goog.events.KeyEvent,goog.events.BrowserEvent);goog.ui.ComponentUtil={};goog.ui.ComponentUtil.getMouseEventType=function(a){return a.pointerEventsEnabled()?goog.events.PointerAsMouseEventType:goog.events.EventType};goog.dom.classlist={};goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST=!1;goog.dom.classlist.get=function(a){if(goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST||a.classList)return a.classList;a=a.className;return goog.isString(a)&&a.match(/\S+/g)||[]};goog.dom.classlist.set=function(a,b){a.className=b};goog.dom.classlist.contains=function(a,b){return goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST||a.classList?a.classList.contains(b):goog.array.contains(goog.dom.classlist.get(a),b)}; @@ -754,7 +757,7 @@ goog.debug.Logger.prototype.callPublish_=function(a){if(this.handlers_)for(var b goog.debug.LogManager.initialize=function(){goog.debug.LogManager.rootLogger_||(goog.debug.LogManager.rootLogger_=new goog.debug.Logger(goog.debug.Logger.ROOT_LOGGER_NAME),goog.debug.LogManager.loggers_[goog.debug.Logger.ROOT_LOGGER_NAME]=goog.debug.LogManager.rootLogger_,goog.debug.LogManager.rootLogger_.setLevel(goog.debug.Logger.Level.CONFIG))};goog.debug.LogManager.getLoggers=function(){return goog.debug.LogManager.loggers_}; goog.debug.LogManager.getRoot=function(){goog.debug.LogManager.initialize();return goog.debug.LogManager.rootLogger_};goog.debug.LogManager.getLogger=function(a){goog.debug.LogManager.initialize();return goog.debug.LogManager.loggers_[a]||goog.debug.LogManager.createLogger_(a)};goog.debug.LogManager.createFunctionForCatchErrors=function(a){return function(b){(a||goog.debug.LogManager.getRoot()).severe("Error: "+b.message+" ("+b.fileName+" @ Line: "+b.line+")")}}; goog.debug.LogManager.createLogger_=function(a){var b=new goog.debug.Logger(a);if(goog.debug.Logger.ENABLE_HIERARCHY){var c=a.lastIndexOf("."),d=a.substr(0,c);c=a.substr(c+1);d=goog.debug.LogManager.getLogger(d);d.addChild_(c,b);b.setParent_(d)}return goog.debug.LogManager.loggers_[a]=b};goog.log={};goog.log.ENABLED=goog.debug.LOGGING_ENABLED;goog.log.ROOT_LOGGER_NAME=goog.debug.Logger.ROOT_LOGGER_NAME;goog.log.Logger=goog.debug.Logger;goog.log.Level=goog.debug.Logger.Level;goog.log.LogRecord=goog.debug.LogRecord;goog.log.getLogger=function(a,b){if(goog.log.ENABLED){var c=goog.debug.LogManager.getLogger(a);b&&c&&c.setLevel(b);return c}return null};goog.log.addHandler=function(a,b){goog.log.ENABLED&&a&&a.addHandler(b)}; -goog.log.removeHandler=function(a,b){return goog.log.ENABLED&&a?a.removeHandler(b):!1};goog.log.log=function(a,b,c,d){goog.log.ENABLED&&a&&a.log(b,c,d)};goog.log.error=function(a,b,c){goog.log.ENABLED&&a&&a.severe(b,c)};goog.log.warning=function(a,b,c){goog.log.ENABLED&&a&&a.warning(b,c)};goog.log.info=function(a,b,c){goog.log.ENABLED&&a&&a.info(b,c)};goog.log.fine=function(a,b,c){goog.log.ENABLED&&a&&a.fine(b,c)};goog.Thenable=function(){};goog.Thenable.prototype.then=function(a,b,c){};goog.Thenable.IMPLEMENTED_BY_PROP="$goog_Thenable";goog.Thenable.addImplementation=function(a){a.prototype.then=a.prototype.then;COMPILED?a.prototype[goog.Thenable.IMPLEMENTED_BY_PROP]=!0:a.prototype.$goog_Thenable=!0};goog.Thenable.isImplementedBy=function(a){if(!a)return!1;try{return COMPILED?!!a[goog.Thenable.IMPLEMENTED_BY_PROP]:!!a.$goog_Thenable}catch(b){return!1}};goog.async={};goog.async.FreeList=function(a,b,c){this.limit_=c;this.create_=a;this.reset_=b;this.occupants_=0;this.head_=null};goog.async.FreeList.prototype.get=function(){if(0this.remainingCapacityOfType(c))return!1;b+=a[c]}return b>this.remainingCapacity()?!1:!0};Blockly.Workspace.prototype.hasBlockLimits=function(){return Infinity!=this.options.maxBlocks||!!this.options.maxInstances}; Blockly.Workspace.prototype.undo=function(a){var b=a?this.redoStack_:this.undoStack_,c=a?this.undoStack_:this.redoStack_,d=b.pop();if(d){for(var e=[d];b.length&&d.group&&d.group==b[b.length-1].group;)e.push(b.pop());for(b=0;d=e[b];b++)c.push(d);e=Blockly.Events.filter(e,a);Blockly.Events.recordUndo=!1;try{for(b=0;d=e[b];b++)d.run(a)}finally{Blockly.Events.recordUndo=!0}}};Blockly.Workspace.prototype.clearUndo=function(){this.undoStack_.length=0;this.redoStack_.length=0;Blockly.Events.clearPendingUndo()}; Blockly.Workspace.prototype.addChangeListener=function(a){this.listeners_.push(a);return a};Blockly.Workspace.prototype.removeChangeListener=function(a){Blockly.utils.arrayRemove(this.listeners_,a)};Blockly.Workspace.prototype.fireChangeListener=function(a){if(a.recordUndo)for(this.undoStack_.push(a),this.redoStack_.length=0;this.undoStack_.length>this.MAX_UNDO&&0<=this.MAX_UNDO;)this.undoStack_.shift();for(var b=0,c;c=this.listeners_[b];b++)c(a)}; Blockly.Workspace.prototype.getBlockById=function(a){return this.blockDB_[a]||null};Blockly.Workspace.prototype.getCommentById=function(a){return this.commentDB_[a]||null};Blockly.Workspace.prototype.allInputsFilled=function(a){for(var b=this.getTopBlocks(!1),c=0,d;d=b[c];c++)if(!d.allInputsFilled(a))return!1;return!0};Blockly.Workspace.prototype.getPotentialVariableMap=function(){return this.potentialVariableMap_}; @@ -1026,7 +1033,7 @@ Blockly.Bubble.prototype.getRelativeToSurfaceXY=function(){return new goog.math. Blockly.Events.Ui.prototype.toJson=function(){var a=Blockly.Events.Ui.superClass_.toJson.call(this);a.element=this.element;void 0!==this.newValue&&(a.newValue=this.newValue);this.blockId&&(a.blockId=this.blockId);return a};Blockly.Events.Ui.prototype.fromJson=function(a){Blockly.Events.Ui.superClass_.fromJson.call(this,a);this.element=a.element;this.newValue=a.newValue;this.blockId=a.blockId};Blockly.Icon=function(a){this.block_=a};Blockly.Icon.prototype.collapseHidden=!0;Blockly.Icon.prototype.SIZE=17;Blockly.Icon.prototype.bubble_=null;Blockly.Icon.prototype.iconXY_=null; Blockly.Icon.prototype.createIcon=function(){this.iconGroup_||(this.iconGroup_=Blockly.utils.createSvgElement("g",{"class":"blocklyIconGroup"},null),this.block_.isInFlyout&&Blockly.utils.addClass(this.iconGroup_,"blocklyIconGroupReadonly"),this.drawIcon_(this.iconGroup_),this.block_.getSvgRoot().appendChild(this.iconGroup_),Blockly.bindEventWithChecks_(this.iconGroup_,"mouseup",this,this.iconClick_),this.updateEditable())}; Blockly.Icon.prototype.dispose=function(){Blockly.utils.removeNode(this.iconGroup_);this.iconGroup_=null;this.setVisible(!1);this.block_=null};Blockly.Icon.prototype.updateEditable=function(){};Blockly.Icon.prototype.isVisible=function(){return!!this.bubble_};Blockly.Icon.prototype.iconClick_=function(a){this.block_.workspace.isDragging()||this.block_.isInFlyout||Blockly.utils.isRightButton(a)||this.setVisible(!this.isVisible())};Blockly.Icon.prototype.updateColour=function(){this.isVisible()&&this.bubble_.setColour(this.block_.getColour())}; -Blockly.Icon.prototype.renderIcon=function(a){if(this.collapseHidden&&this.block_.isCollapsed())return this.iconGroup_.setAttribute("display","none"),a;this.iconGroup_.setAttribute("display","block");var b=this.SIZE;this.block_.RTL&&(a-=b);this.iconGroup_.setAttribute("transform","translate("+a+",5)");this.computeIconLocation();return a=this.block_.RTL?a-Blockly.BlockSvg.SEP_SPACE_X:a+(b+Blockly.BlockSvg.SEP_SPACE_X)}; +Blockly.Icon.prototype.renderIcon=function(a){if(this.collapseHidden&&this.block_.isCollapsed()||this.block_.isInsertionMarker())return this.iconGroup_.setAttribute("display","none"),a;this.iconGroup_.setAttribute("display","block");var b=this.SIZE;this.block_.RTL&&(a-=b);this.iconGroup_.setAttribute("transform","translate("+a+",5)");this.computeIconLocation();return a=this.block_.RTL?a-Blockly.BlockSvg.SEP_SPACE_X:a+(b+Blockly.BlockSvg.SEP_SPACE_X)}; Blockly.Icon.prototype.setIconLocation=function(a){this.iconXY_=a;this.isVisible()&&this.bubble_.setAnchorLocation(a)};Blockly.Icon.prototype.computeIconLocation=function(){var a=this.block_.getRelativeToSurfaceXY(),b=Blockly.utils.getRelativeXY(this.iconGroup_);a=new goog.math.Coordinate(a.x+b.x+this.SIZE/2,a.y+b.y+this.SIZE/2);goog.math.Coordinate.equals(this.getIconLocation(),a)||this.setIconLocation(a)};Blockly.Icon.prototype.getIconLocation=function(){return this.iconXY_}; Blockly.Comment=function(a){Blockly.Comment.superClass_.constructor.call(this,a);this.createIcon()};goog.inherits(Blockly.Comment,Blockly.Icon);Blockly.Comment.prototype.text_="";Blockly.Comment.prototype.width_=160;Blockly.Comment.prototype.height_=80; Blockly.Comment.prototype.drawIcon_=function(a){Blockly.utils.createSvgElement("circle",{"class":"blocklyIconShape",r:"8",cx:"8",cy:"8"},a);Blockly.utils.createSvgElement("path",{"class":"blocklyIconSymbol",d:"m6.8,10h2c0.003,-0.617 0.271,-0.962 0.633,-1.266 2.875,-2.4050.607,-5.534 -3.765,-3.874v1.7c3.12,-1.657 3.698,0.118 2.336,1.25-1.201,0.998 -1.201,1.528 -1.204,2.19z"},a);Blockly.utils.createSvgElement("rect",{"class":"blocklyIconSymbol",x:"6.8",y:"10.78",height:"2",width:"2"},a)}; @@ -1046,8 +1053,9 @@ Blockly.Connection.prototype.canConnectWithReason_=function(a){if(!a)return Bloc Blockly.Connection.CAN_CONNECT:Blockly.Connection.REASON_CHECKS_FAILED}; Blockly.Connection.prototype.checkConnection_=function(a){switch(this.canConnectWithReason_(a)){case Blockly.Connection.CAN_CONNECT:break;case Blockly.Connection.REASON_SELF_CONNECTION:throw Error("Attempted to connect a block to itself.");case Blockly.Connection.REASON_DIFFERENT_WORKSPACES:throw Error("Blocks not on same workspace.");case Blockly.Connection.REASON_WRONG_TYPE:throw Error("Attempt to connect incompatible types.");case Blockly.Connection.REASON_TARGET_NULL:throw Error("Target connection is null."); case Blockly.Connection.REASON_CHECKS_FAILED:throw Error("Connection checks failed. "+(this+" expected "+this.check_+", found "+a.check_));case Blockly.Connection.REASON_SHADOW_PARENT:throw Error("Connecting non-shadow to shadow block.");default:throw Error("Unknown connection failure: this should never happen!");}}; -Blockly.Connection.prototype.isConnectionAllowed=function(a){if(this.canConnectWithReason_(a)!=Blockly.Connection.CAN_CONNECT)return!1;switch(a.type){case Blockly.PREVIOUS_STATEMENT:if(a.isConnected()||this.isConnected())return!1;break;case Blockly.OUTPUT_VALUE:if(a.isConnected()||this.isConnected())return!1;break;case Blockly.INPUT_VALUE:if(a.targetConnection&&!a.targetBlock().isMovable()&&!a.targetBlock().isShadow())return!1;break;case Blockly.NEXT_STATEMENT:if(a.isConnected()&&!this.sourceBlock_.nextConnection&& -!a.targetBlock().isShadow()&&a.targetBlock().nextConnection)return!1;break;default:throw Error("Unknown connection type in isConnectionAllowed");}return-1!=Blockly.draggingConnections_.indexOf(a)?!1:!0};Blockly.Connection.prototype.connect=function(a){this.targetConnection!=a&&(this.checkConnection_(a),this.isSuperior()?this.connect_(a):a.connect_(this))}; +Blockly.Connection.prototype.canConnectToPrevious_=function(a){if(this.targetConnection||-1!=Blockly.draggingConnections_.indexOf(a))return!1;if(!a.targetConnection)return!0;a=a.targetBlock();return a.isInsertionMarker()?!a.getPreviousBlock():!1}; +Blockly.Connection.prototype.isConnectionAllowed=function(a){if(a.sourceBlock_.isInsertionMarker()||this.canConnectWithReason_(a)!=Blockly.Connection.CAN_CONNECT)return!1;switch(a.type){case Blockly.PREVIOUS_STATEMENT:return this.canConnectToPrevious_(a);case Blockly.OUTPUT_VALUE:if(a.isConnected()||this.isConnected())return!1;break;case Blockly.INPUT_VALUE:if(a.isConnected()&&!a.targetBlock().isMovable()&&!a.targetBlock().isShadow())return!1;break;case Blockly.NEXT_STATEMENT:if(a.isConnected()&& +!this.sourceBlock_.nextConnection&&!a.targetBlock().isShadow()&&a.targetBlock().nextConnection)return!1;break;default:throw Error("Unknown connection type in isConnectionAllowed");}return-1!=Blockly.draggingConnections_.indexOf(a)?!1:!0};Blockly.Connection.prototype.connect=function(a){this.targetConnection!=a&&(this.checkConnection_(a),this.isSuperior()?this.connect_(a):a.connect_(this))}; Blockly.Connection.connectReciprocally_=function(a,b){if(!a||!b)throw Error("Cannot connect null connections.");a.targetConnection=b;b.targetConnection=a};Blockly.Connection.singleConnection_=function(a,b){for(var c=!1,d=0;da.y_)c=d;else{b=d;break}}return b};Blockly.ConnectionDB.prototype.removeConnection_=function(a){if(!a.inDB_)throw Error("Connection not in database.");var b=this.findConnection(a);if(-1==b)throw Error("Unable to find connection in connectionDB.");a.inDB_=!1;this.splice(b,1)}; Blockly.ConnectionDB.prototype.getNeighbours=function(a,b){function c(a){var c=e-d[a].x_,g=f-d[a].y_;Math.sqrt(c*c+g*g)<=b&&l.push(d[a]);return gc)){var d=b.getSvgXY(a.getSvgRoot());a.outputConnection?(d.x+=(a.RTL?3:-3)*c,d.y+=13*c):a.previousConnection&&(d.x+=(a.RTL?-23:23)*c,d.y+=3*c);a=Blockly.utils.createSvgElement("circle",{cx:d.x,cy:d.y,r:0,fill:"none",stroke:"#888","stroke-width":10},b.getParentSvg());Blockly.BlockAnimations.connectionUiStep_(a,new Date,c)}}; Blockly.BlockAnimations.connectionUiStep_=function(a,b,c){var d=(new Date-b)/150;1a.workspace.scale)){var b=a.getHeightWidth().height;b=Math.atan(10/b)/Math.PI*180;a.RTL||(b*=-1);Blockly.BlockAnimations.disconnectUiStep_(a.getSvgRoot(),b,new Date)}}; Blockly.BlockAnimations.disconnectUiStep_=function(a,b,c){var d=(new Date-c)/200;1'+goog.string.htmlEscape(a.name)+""}; Blockly.Variables.generateVariableFieldDom=function(a){a=Blockly.Variables.generateVariableFieldXmlString(a);return Blockly.Xml.textToDom(""+a+"").firstChild};Blockly.Variables.getOrCreateVariablePackage=function(a,b,c,d){var e=Blockly.Variables.getVariable(a,b,c,d);e||(e=Blockly.Variables.createVariable_(a,b,c,d));return e}; -Blockly.Variables.getVariable=function(a,b,c,d){var e=a.getPotentialVariableMap();if(b){var f=a.getVariableById(b);!f&&e&&(f=e.getVariableById(b))}else if(c){if(void 0==d)throw Error("Tried to look up a variable by name without a type");f=a.getVariable(c,d);!f&&e&&(f=e.getVariable(c,d))}return f}; +Blockly.Variables.getVariable=function(a,b,c,d){var e=a.getPotentialVariableMap();if(b){var f=a.getVariableById(b);!f&&e&&(f=e.getVariableById(b));if(f)return f}if(c){if(void 0==d)throw Error("Tried to look up a variable by name without a type");f=a.getVariable(c,d);!f&&e&&(f=e.getVariable(c,d))}return f}; Blockly.Variables.createVariable_=function(a,b,c,d){var e=a.getPotentialVariableMap();c||(c=Blockly.Variables.generateUniqueName(a.isFlyout?a.targetWorkspace:a));return e?e.createVariable(c,d,b):a.createVariable(c,d,b)};Blockly.Variables.getAddedVariables=function(a,b){var c=a.getAllVariables(),d=[];if(b.length!=c.length)for(var e=0;e";c=Blockly.Xml.textToDom(c).firstChild;b.push(c)}if(Blockly.Blocks.variables_get_dynamic)for(var d=0;c=a[d];d++)c=''+Blockly.Variables.generateVariableFieldXmlString(c)+ "",c=Blockly.Xml.textToDom(c).firstChild,b.push(c)}return b};Blockly.WorkspaceAudio=function(a){this.parentWorkspace_=a;this.SOUNDS_=Object.create(null)};Blockly.WorkspaceAudio.prototype.lastSound_=null;Blockly.WorkspaceAudio.prototype.dispose=function(){this.SOUNDS_=this.parentWorkspace_=null};Blockly.WorkspaceAudio.prototype.load=function(a,b){if(a.length){try{var c=new window.Audio}catch(h){return}for(var d,e=0;eb.bottomRight.x&&(b.bottomRight.x=d.bottomRight.x);d.topLeft.yb.bottomRight.y&&(b.bottomRight.y=d.bottomRight.y)}return{x:b.topLeft.x, -y:b.topLeft.y,width:b.bottomRight.x-b.topLeft.x,height:b.bottomRight.y-b.topLeft.y}};Blockly.WorkspaceSvg.prototype.cleanUp=function(){this.setResizesEnabled(!1);Blockly.Events.setGroup(!0);for(var a=this.getTopBlocks(!0),b=0,c=0,d;d=a[c];c++){var e=d.getRelativeToSurfaceXY();d.moveBy(-e.x,b-e.y);d.snapToGrid();b=d.getRelativeToSurfaceXY().y+d.getHeightWidth().height+Blockly.BlockSvg.MIN_BLOCK_Y}Blockly.Events.setGroup(!1);this.setResizesEnabled(!0)}; +y:b.topLeft.y,width:b.bottomRight.x-b.topLeft.x,height:b.bottomRight.y-b.topLeft.y}};Blockly.WorkspaceSvg.prototype.cleanUp=function(){this.setResizesEnabled(!1);Blockly.Events.setGroup(!0);for(var a=this.getTopBlocks(!0),b=0,c=0,d;d=a[c];c++)if(d.isMovable()){var e=d.getRelativeToSurfaceXY();d.moveBy(-e.x,b-e.y);d.snapToGrid();b=d.getRelativeToSurfaceXY().y+d.getHeightWidth().height+Blockly.BlockSvg.MIN_BLOCK_Y}Blockly.Events.setGroup(!1);this.setResizesEnabled(!0)}; Blockly.WorkspaceSvg.prototype.showContextMenu_=function(a){function b(a){if(a.isDeletable())p=p.concat(a.getDescendants(!1));else{a=a.getChildren(!1);for(var c=0;cp.length?c():Blockly.confirm(Blockly.Msg.DELETE_ALL_BLOCKS.replace("%1",p.length),function(a){a&& @@ -1366,11 +1375,11 @@ Blockly.Warning.textToDom_=function(a){var b=Blockly.utils.createSvgElement("tex Blockly.Warning.prototype.setVisible=function(a){if(a!=this.isVisible())if(Blockly.Events.fire(new Blockly.Events.Ui(this.block_,"warningOpen",!a,a)),a){a=Blockly.Warning.textToDom_(this.getText());this.bubble_=new Blockly.Bubble(this.block_.workspace,a,this.block_.svgPath_,this.iconXY_,null,null);this.bubble_.setSvgId(this.block_.id);if(this.block_.RTL)for(var b=a.getBBox().width,c=0,d;d=a.childNodes[c];c++)d.setAttribute("text-anchor","end"),d.setAttribute("x",b+Blockly.Bubble.BORDER_WIDTH);this.updateColour(); a=this.bubble_.getBubbleSize();this.bubble_.setBubbleSize(a.width,a.height)}else this.bubble_.dispose(),this.body_=this.bubble_=null};Blockly.Warning.prototype.bodyFocus_=function(a){this.bubble_.promote_()};Blockly.Warning.prototype.setText=function(a,b){this.text_[b]!=a&&(a?this.text_[b]=a:delete this.text_[b],this.isVisible()&&(this.setVisible(!1),this.setVisible(!0)))};Blockly.Warning.prototype.getText=function(){var a=[],b;for(b in this.text_)a.push(this.text_[b]);return a.join("\n")}; Blockly.Warning.prototype.dispose=function(){this.block_.warning=null;Blockly.Icon.prototype.dispose.call(this)};Blockly.Block=function(a,b,c){if("undefined"!==typeof Blockly.Generator.prototype[b])throw Error('Block prototypeName "'+b+'" conflicts with Blockly.Generator members.');this.id=c&&!a.getBlockById(c)?c:Blockly.utils.genUid();a.blockDB_[this.id]=this;this.previousConnection=this.nextConnection=this.outputConnection=null;this.inputList=[];this.inputsInline=void 0;this.disabled=!1;this.tooltip="";this.contextMenu=!0;this.parentBlock_=null;this.childBlocks_=[];this.editable_=this.movable_=this.deletable_= -!0;this.collapsed_=this.isShadow_=!1;this.comment=null;this.xy_=new goog.math.Coordinate(0,0);this.workspace=a;this.isInFlyout=a.isFlyout;this.isInMutator=a.isMutator;this.RTL=a.RTL;this.isInsertionMarker_=!1;if(b){this.type=b;c=Blockly.Blocks[b];if(!c||"object"!=typeof c)throw TypeError("Unknown block type: "+b);goog.mixin(this,c)}a.addTopBlock(this);"function"==typeof this.init&&this.init();this.inputsInlineDefault=this.inputsInline;if(Blockly.Events.isEnabled()){(a=Blockly.Events.getGroup())|| +!0;this.collapsed_=this.isShadow_=!1;this.comment=null;this.xy_=new goog.math.Coordinate(0,0);this.workspace=a;this.isInFlyout=a.isFlyout;this.isInMutator=a.isMutator;this.RTL=a.RTL;this.isInsertionMarker_=!1;if(b){this.type=b;c=Blockly.Blocks[b];if(!c||"object"!=typeof c)throw TypeError("Unknown block type: "+b);goog.mixin(this,c)}a.addTopBlock(this);a.addTypedBlock(this);"function"==typeof this.init&&this.init();this.inputsInlineDefault=this.inputsInline;if(Blockly.Events.isEnabled()){(a=Blockly.Events.getGroup())|| Blockly.Events.setGroup(!0);try{Blockly.Events.fire(new Blockly.Events.BlockCreate(this))}finally{a||Blockly.Events.setGroup(!1)}}"function"==typeof this.onchange&&this.setOnChange(this.onchange)};Blockly.Block.obtain=function(a,b){console.warn("Deprecated call to Blockly.Block.obtain, use workspace.newBlock instead.");return a.newBlock(b)};Blockly.Block.prototype.data=null;Blockly.Block.prototype.colour_="#000000";Blockly.Block.prototype.hue_=null; -Blockly.Block.prototype.dispose=function(a){if(this.workspace){this.onchangeWrapper_&&this.workspace.removeChangeListener(this.onchangeWrapper_);this.unplug(a);Blockly.Events.isEnabled()&&Blockly.Events.fire(new Blockly.Events.BlockDelete(this));Blockly.Events.disable();try{this.workspace&&(this.workspace.removeTopBlock(this),delete this.workspace.blockDB_[this.id],this.workspace=null);Blockly.selected==this&&(Blockly.selected=null);for(var b=this.childBlocks_.length-1;0<=b;b--)this.childBlocks_[b].dispose(!1); -b=0;for(var c;c=this.inputList[b];b++)c.dispose();this.inputList.length=0;var d=this.getConnections_(!0);for(b=0;b=c)this.hue_=c,this.colour_=Blockly.hueToRgb(c);else if("string"==typeof b&&/^#[0-9a-fA-F]{6}$/.test(b))this.colour_=b,this.hue_=null;else throw c='Invalid colour: "'+b+'"',a!=b&&(c+=' (from "'+a+'")'),c;}; @@ -1421,7 +1430,7 @@ Blockly.ContextMenu.position_=function(a,b,c){var d=Blockly.utils.getViewportBBo Blockly.ContextMenu.createWidget_=function(a){a.render(Blockly.WidgetDiv.DIV);var b=a.getElement();Blockly.utils.addClass(b,"blocklyContextMenu");Blockly.bindEventWithChecks_(b,"contextmenu",null,Blockly.utils.noEvent);a.setAllowAutoFocus(!0)};Blockly.ContextMenu.hide=function(){Blockly.WidgetDiv.hideIfOwner(Blockly.ContextMenu);Blockly.ContextMenu.currentBlock=null;Blockly.ContextMenu.eventWrapper_&&Blockly.unbindEvent_(Blockly.ContextMenu.eventWrapper_)}; Blockly.ContextMenu.callbackFactory=function(a,b){return function(){Blockly.Events.disable();try{var c=Blockly.Xml.domToBlock(b,a.workspace),d=a.getRelativeToSurfaceXY();d.x=a.RTL?d.x-Blockly.SNAP_RADIUS:d.x+Blockly.SNAP_RADIUS;d.y+=2*Blockly.SNAP_RADIUS;c.moveBy(d.x,d.y)}finally{Blockly.Events.enable()}Blockly.Events.isEnabled()&&!c.isShadow()&&Blockly.Events.fire(new Blockly.Events.BlockCreate(c));c.select()}}; Blockly.ContextMenu.blockDeleteOption=function(a){var b=a.getDescendants(!1).length,c=a.getNextBlock();c&&(b-=c.getDescendants(!1).length);return{text:1==b?Blockly.Msg.DELETE_BLOCK:Blockly.Msg.DELETE_X_BLOCKS.replace("%1",String(b)),enabled:!0,callback:function(){Blockly.Events.setGroup(!0);a.dispose(!0,!0);Blockly.Events.setGroup(!1)}}};Blockly.ContextMenu.blockHelpOption=function(a){return{enabled:!("function"==typeof a.helpUrl?!a.helpUrl():!a.helpUrl),text:Blockly.Msg.HELP,callback:function(){a.showHelp_()}}}; -Blockly.ContextMenu.blockDuplicateOption=function(a){var b=!0;a.getDescendants(!1).length>a.workspace.remainingCapacity()&&(b=!1);return{text:Blockly.Msg.DUPLICATE_BLOCK,enabled:b,callback:function(){Blockly.duplicate_(a)}}};Blockly.ContextMenu.blockCommentOption=function(a){var b={enabled:!goog.userAgent.IE};a.comment?(b.text=Blockly.Msg.REMOVE_COMMENT,b.callback=function(){a.setCommentText(null)}):(b.text=Blockly.Msg.ADD_COMMENT,b.callback=function(){a.setCommentText("")});return b}; +Blockly.ContextMenu.blockDuplicateOption=function(a){var b=a.isDuplicatable();return{text:Blockly.Msg.DUPLICATE_BLOCK,enabled:b,callback:function(){Blockly.duplicate_(a)}}};Blockly.ContextMenu.blockCommentOption=function(a){var b={enabled:!goog.userAgent.IE};a.comment?(b.text=Blockly.Msg.REMOVE_COMMENT,b.callback=function(){a.setCommentText(null)}):(b.text=Blockly.Msg.ADD_COMMENT,b.callback=function(){a.setCommentText("")});return b}; Blockly.ContextMenu.commentDeleteOption=function(a){return{text:Blockly.Msg.REMOVE_COMMENT,enabled:!0,callback:function(){Blockly.Events.setGroup(!0);a.dispose(!0,!0);Blockly.Events.setGroup(!1)}}};Blockly.ContextMenu.commentDuplicateOption=function(a){return{text:Blockly.Msg.DUPLICATE_COMMENT,enabled:!0,callback:function(){Blockly.duplicate_(a)}}}; Blockly.ContextMenu.workspaceCommentOption=function(a,b){var c={enabled:!goog.userAgent.IE};c.text=Blockly.Msg.ADD_COMMENT;c.callback=function(){var c=new Blockly.WorkspaceCommentSvg(a,Blockly.Msg.WORKSPACE_COMMENT_DEFAULT_TEXT,Blockly.WorkspaceCommentSvg.DEFAULT_SIZE,Blockly.WorkspaceCommentSvg.DEFAULT_SIZE),e=a.getInjectionDiv().getBoundingClientRect();e=new goog.math.Coordinate(b.clientX-e.left,b.clientY-e.top);var f=a.getOriginOffsetInPixels();e=goog.math.Coordinate.difference(e,f).scale(1/a.scale); c.moveBy(e.x,e.y);a.rendered&&(c.initSvg(),c.render(!1),c.select())};return c};Blockly.BlockSvg=function(a,b,c){this.svgGroup_=Blockly.utils.createSvgElement("g",{},null);this.svgGroup_.translate_="";this.svgPathDark_=Blockly.utils.createSvgElement("path",{"class":"blocklyPathDark",transform:"translate(1,1)"},this.svgGroup_);this.svgPath_=Blockly.utils.createSvgElement("path",{"class":"blocklyPath"},this.svgGroup_);this.svgPathLight_=Blockly.utils.createSvgElement("path",{"class":"blocklyPathLight"},this.svgGroup_);this.svgPath_.tooltip=this;this.rendered=!1;this.useDragSurface_= @@ -1472,10 +1481,11 @@ Blockly.BlockSvg.INNER_TOP_LEFT_CORNER=Blockly.BlockSvg.NOTCH_PATH_RIGHT+" h -"+ Blockly.BlockSvg.INNER_TOP_LEFT_CORNER_HIGHLIGHT_RTL="a "+Blockly.BlockSvg.CORNER_RADIUS+","+Blockly.BlockSvg.CORNER_RADIUS+" 0 0,0 "+(-Blockly.BlockSvg.DISTANCE_45_OUTSIDE-.5)+","+(Blockly.BlockSvg.CORNER_RADIUS-Blockly.BlockSvg.DISTANCE_45_OUTSIDE);Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_RTL="a "+(Blockly.BlockSvg.CORNER_RADIUS+.5)+","+(Blockly.BlockSvg.CORNER_RADIUS+.5)+" 0 0,0 "+(Blockly.BlockSvg.CORNER_RADIUS+.5)+","+(Blockly.BlockSvg.CORNER_RADIUS+.5); Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_LTR="a "+(Blockly.BlockSvg.CORNER_RADIUS+.5)+","+(Blockly.BlockSvg.CORNER_RADIUS+.5)+" 0 0,0 "+(Blockly.BlockSvg.CORNER_RADIUS-Blockly.BlockSvg.DISTANCE_45_OUTSIDE)+","+(Blockly.BlockSvg.DISTANCE_45_OUTSIDE+.5);Blockly.BlockSvg.prototype.getHeightWidth=function(){var a=this.height,b=this.width,c=this.getNextBlock();c?(c=c.getHeightWidth(),a+=c.height-4,b=Math.max(b,c.width)):this.nextConnection||this.outputConnection||(a+=2);return{height:a,width:b}}; Blockly.BlockSvg.prototype.render=function(a){Blockly.Field.startCache();this.rendered=!0;var b=Blockly.BlockSvg.SEP_SPACE_X;this.RTL&&(b=-b);for(var c=this.getIcons(),d=0;da)}};Blockly.Flyout.prototype.reflow=function(){this.reflowWrapper_&&this.workspace_.removeChangeListener(this.reflowWrapper_);this.reflowInternal_();this.reflowWrapper_&&this.workspace_.addChangeListener(this.reflowWrapper_)}; +Blockly.Flyout.prototype.filterForCapacity_=function(){for(var a=this.workspace_.getTopBlocks(!1),b=0,c;c=a[b];b++)-1==this.permanentlyDisabled_.indexOf(c)&&c.setDisabled(!this.targetWorkspace_.isCapacityAvailable(Blockly.utils.getBlockTypeCounts(c)))};Blockly.Flyout.prototype.reflow=function(){this.reflowWrapper_&&this.workspace_.removeChangeListener(this.reflowWrapper_);this.reflowInternal_();this.reflowWrapper_&&this.workspace_.addChangeListener(this.reflowWrapper_)}; Blockly.Flyout.prototype.isScrollable=function(){return this.scrollbar_?this.scrollbar_.isVisible():!1}; Blockly.Flyout.prototype.placeNewBlock_=function(a){var b=this.targetWorkspace_;if(!a.getSvgRoot())throw Error("oldBlock is not rendered.");var c=Blockly.Xml.blockToDom(a);b.setResizesEnabled(!1);c=Blockly.Xml.domToBlock(c,b);if(!c.getSvgRoot())throw Error("block is not rendered.");var d=b.getOriginOffsetInPixels(),e=this.workspace_.getOriginOffsetInPixels();a=a.getRelativeToSurfaceXY().scale(this.workspace_.scale);a=goog.math.Coordinate.sum(e,a);b=goog.math.Coordinate.difference(a,d).scale(1/b.scale); c.moveBy(b.x,b.y);return c};Blockly.HorizontalFlyout=function(a){a.getMetrics=this.getMetrics_.bind(this);a.setMetrics=this.setMetrics_.bind(this);Blockly.HorizontalFlyout.superClass_.constructor.call(this,a);this.horizontalLayout_=!0};goog.inherits(Blockly.HorizontalFlyout,Blockly.Flyout); @@ -1667,25 +1677,26 @@ Blockly.Css.CONTENT=[".blocklySvg {","background-color: #fff;","outline: none;", "color: #000;","display: none;","font-family: sans-serif;","font-size: 9pt;","opacity: .9;","padding: 2px;","position: absolute;","z-index: 100000;","}",".blocklyResizeSE {","cursor: se-resize;","fill: #aaa;","}",".blocklyResizeSW {","cursor: sw-resize;","fill: #aaa;","}",".blocklyResizeLine {","stroke: #515A5A;","stroke-width: 1;","}",".blocklyHighlightedConnectionPath {","fill: none;","stroke: #fc3;","stroke-width: 4px;","}",".blocklyPathLight {","fill: none;","stroke-linecap: round;","stroke-width: 1;", "}",".blocklySelected>.blocklyPath {","stroke: #fc3;","stroke-width: 3px;","}",".blocklySelected>.blocklyPathLight {","display: none;","}",".blocklyDraggable {",'cursor: url("<<>>/handopen.cur"), auto;',"cursor: grab;","cursor: -webkit-grab;","}",".blocklyDragging {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;","}",".blocklyDraggable:active {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;", "}",".blocklyBlockDragSurface .blocklyDraggable {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;","}",".blocklyDragging.blocklyDraggingDelete {",'cursor: url("<<>>/handdelete.cur"), auto;',"}",".blocklyToolboxDelete {",'cursor: url("<<>>/handdelete.cur"), auto;',"}",".blocklyToolboxGrab {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;","}",".blocklyDragging>.blocklyPath,",".blocklyDragging>.blocklyPathLight {", -"fill-opacity: .8;","stroke-opacity: .8;","}",".blocklyDragging>.blocklyPathDark {","display: none;","}",".blocklyDisabled>.blocklyPath {","fill-opacity: .5;","stroke-opacity: .5;","}",".blocklyDisabled>.blocklyPathLight,",".blocklyDisabled>.blocklyPathDark {","display: none;","}",".blocklyText {","cursor: default;","fill: #fff;","font-family: sans-serif;","font-size: 11pt;","}",".blocklyNonEditableText>text {","pointer-events: none;","}",".blocklyNonEditableText>rect,",".blocklyEditableText>rect {", -"fill: #fff;","fill-opacity: .6;","}",".blocklyNonEditableText>text,",".blocklyEditableText>text {","fill: #000;","}",".blocklyEditableText:hover>rect {","stroke: #fff;","stroke-width: 2;","}",".blocklyBubbleText {","fill: #000;","}",".blocklyFlyout {","position: absolute;","z-index: 20;","}",".blocklyFlyoutButton {","fill: #888;","cursor: default;","}",".blocklyFlyoutButtonShadow {","fill: #666;","}",".blocklyFlyoutButton:hover {","fill: #aaa;","}",".blocklyFlyoutLabel {","cursor: default;","}", -".blocklyFlyoutLabelBackground {","opacity: 0;","}",".blocklyFlyoutLabelText {","fill: #000;","}",".blocklySvg text, .blocklyBlockDragSurface text {","user-select: none;","-moz-user-select: none;","-ms-user-select: none;","-webkit-user-select: none;","cursor: inherit;","}",".blocklyHidden {","display: none;","}",".blocklyFieldDropdown:not(.blocklyHidden) {","display: block;","}",".blocklyIconGroup {","cursor: default;","}",".blocklyIconGroup:not(:hover),",".blocklyIconGroupReadonly {","opacity: .6;", -"}",".blocklyIconShape {","fill: #00f;","stroke: #fff;","stroke-width: 1px;","}",".blocklyIconSymbol {","fill: #fff;","}",".blocklyMinimalBody {","margin: 0;","padding: 0;","}",".blocklyCommentForeignObject {","position: relative;","z-index: 0;","}",".blocklyCommentRect {","fill: #E7DE8E;","stroke: #bcA903;","stroke-width: 1px","}",".blocklyCommentTarget {","fill: transparent;","stroke: #bcA903;","}",".blocklyCommentTargetFocused {","fill: none;","}",".blocklyCommentHandleTarget {","fill: none;", -"}",".blocklyCommentHandleTargetFocused {","fill: transparent;","}",".blocklyFocused>.blocklyCommentRect {","fill: #B9B272;","stroke: #B9B272;","}",".blocklySelected>.blocklyCommentTarget {","stroke: #fc3;","stroke-width: 3px;","}",".blocklyCommentTextarea {","background-color: #fef49c;","border: 0;","outline: 0;","margin: 0;","padding: 3px;","resize: none;","display: block;","overflow: hidden;","}",".blocklyCommentDeleteIcon {","cursor: pointer;","fill: #000;","display: none","}",".blocklySelected > .blocklyCommentDeleteIcon {", -"display: block","}",".blocklyDeleteIconShape {","fill: #000;","stroke: #000;","stroke-width: 1px;","}",".blocklyDeleteIconShape.blocklyDeleteIconHighlighted {","stroke: #fc3;","}",".blocklyHtmlInput {","border: none;","border-radius: 4px;","font-family: sans-serif;","height: 100%;","margin: 0;","outline: none;","padding: 0 1px;","width: 100%","}",".blocklyMainBackground {","stroke-width: 1;","stroke: #c6c6c6;","}",".blocklyMutatorBackground {","fill: #fff;","stroke: #ddd;","stroke-width: 1;","}", -".blocklyFlyoutBackground {","fill: #ddd;","fill-opacity: .8;","}",".blocklyTransparentBackground {","opacity: 0;","}",".blocklyMainWorkspaceScrollbar {","z-index: 20;","}",".blocklyFlyoutScrollbar {","z-index: 30;","}",".blocklyScrollbarHorizontal, .blocklyScrollbarVertical {","position: absolute;","outline: none;","}",".blocklyScrollbarBackground {","opacity: 0;","}",".blocklyScrollbarHandle {","fill: #ccc;","}",".blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,",".blocklyScrollbarHandle:hover {", -"fill: #bbb;","}",".blocklyZoom>image {","opacity: .4;","}",".blocklyZoom>image:hover {","opacity: .6;","}",".blocklyZoom>image:active {","opacity: .8;","}",".blocklyFlyout .blocklyScrollbarHandle {","fill: #bbb;","}",".blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,",".blocklyFlyout .blocklyScrollbarHandle:hover {","fill: #aaa;","}",".blocklyInvalidInput {","background: #faa;","}",".blocklyAngleCircle {","stroke: #444;","stroke-width: 1;","fill: #ddd;","fill-opacity: .8;", -"}",".blocklyAngleMarks {","stroke: #444;","stroke-width: 1;","}",".blocklyAngleGauge {","fill: #f88;","fill-opacity: .8;","}",".blocklyAngleLine {","stroke: #f00;","stroke-width: 2;","stroke-linecap: round;","pointer-events: none;","}",".blocklyContextMenu {","border-radius: 4px;","}",".blocklyDropdownMenu {","padding: 0 !important;","}",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-icon {","background: url(<<>>/sprites.png) no-repeat -48px -16px !important;", -"}",".blocklyToolboxDiv {","background-color: #ddd;","overflow-x: visible;","overflow-y: auto;","position: absolute;","user-select: none;","-moz-user-select: none;","-ms-user-select: none;","-webkit-user-select: none;","z-index: 70;","-webkit-tap-highlight-color: transparent;","}",".blocklyTreeRoot {","padding: 4px 0;","}",".blocklyTreeRoot:focus {","outline: none;","}",".blocklyTreeRow {","height: 22px;","line-height: 22px;","margin-bottom: 3px;","padding-right: 8px;","white-space: nowrap;","}", -".blocklyHorizontalTree {","float: left;","margin: 1px 5px 8px 0;","}",".blocklyHorizontalTreeRtl {","float: right;","margin: 1px 0 8px 5px;","}",'.blocklyToolboxDiv[dir="RTL"] .blocklyTreeRow {',"margin-left: 8px;","}",".blocklyTreeRow:not(.blocklyTreeSelected):hover {","background-color: #e4e4e4;","}",".blocklyTreeSeparator {","border-bottom: solid #e5e5e5 1px;","height: 0;","margin: 5px 0;","}",".blocklyTreeSeparatorHorizontal {","border-right: solid #e5e5e5 1px;","width: 0;","padding: 5px 0;", -"margin: 0 5px;","}",".blocklyTreeIcon {","background-image: url(<<>>/sprites.png);","height: 16px;","vertical-align: middle;","width: 16px;","}",".blocklyTreeIconClosedLtr {","background-position: -32px -1px;","}",".blocklyTreeIconClosedRtl {","background-position: 0 -1px;","}",".blocklyTreeIconOpen {","background-position: -16px -1px;","}",".blocklyTreeSelected>.blocklyTreeIconClosedLtr {","background-position: -32px -17px;","}",".blocklyTreeSelected>.blocklyTreeIconClosedRtl {","background-position: 0 -17px;", -"}",".blocklyTreeSelected>.blocklyTreeIconOpen {","background-position: -16px -17px;","}",".blocklyTreeIconNone,",".blocklyTreeSelected>.blocklyTreeIconNone {","background-position: -48px -1px;","}",".blocklyTreeLabel {","cursor: default;","font-family: sans-serif;","font-size: 16px;","padding: 0 3px;","vertical-align: middle;","}",".blocklyToolboxDelete .blocklyTreeLabel {",'cursor: url("<<>>/handdelete.cur"), auto;',"}",".blocklyTreeSelected .blocklyTreeLabel {","color: #fff;","}",".blocklyColourTable {", -"border-collapse: collapse;","}",".blocklyColourTable>tr>td {","border: 1px solid #666;","padding: 0;","}",".blocklyColourTable>tr>td>div {","border: 1px solid #666;","height: 13px;","width: 15px;","}",".blocklyColourTable>tr>td>div:hover {","border: 1px solid #fff;","}",".blocklyColourSelected, .blocklyColourSelected:hover {","border: 1px solid #000 !important;","}",".blocklyWidgetDiv .goog-menu {","background: #fff;","border-color: #ccc #666 #666 #ccc;","border-style: solid;","border-width: 1px;", -"cursor: default;","font: normal 13px Arial, sans-serif;","margin: 0;","outline: none;","padding: 4px 0;","position: absolute;","overflow-y: auto;","overflow-x: hidden;","max-height: 100%;","z-index: 20000;","}",".blocklyWidgetDiv .goog-menuitem {","color: #000;","font: normal 13px Arial, sans-serif;","list-style: none;","margin: 0;","padding: 4px 7em 4px 28px;","white-space: nowrap;","}",".blocklyWidgetDiv .goog-menuitem.goog-menuitem-rtl {","padding-left: 7em;","padding-right: 28px;","}",".blocklyWidgetDiv .goog-menu-nocheckbox .goog-menuitem,", -".blocklyWidgetDiv .goog-menu-noicon .goog-menuitem {","padding-left: 12px;","}",".blocklyWidgetDiv .goog-menu-noaccel .goog-menuitem {","padding-right: 20px;","}",".blocklyWidgetDiv .goog-menuitem-content {","color: #000;","font: normal 13px Arial, sans-serif;","}",".blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-accel,",".blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-content {","color: #ccc !important;","}",".blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-icon {","opacity: 0.3;", -"filter: alpha(opacity=30);","}",".blocklyWidgetDiv .goog-menuitem-highlight,",".blocklyWidgetDiv .goog-menuitem-hover {","background-color: #d6e9f8;","border-color: #d6e9f8;","border-style: dotted;","border-width: 1px 0;","padding-bottom: 3px;","padding-top: 3px;","}",".blocklyWidgetDiv .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-menuitem-icon {","background-repeat: no-repeat;","height: 16px;","left: 6px;","position: absolute;","right: auto;","vertical-align: middle;","width: 16px;","}",".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-checkbox,", -".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-icon {","left: auto;","right: 6px;","}",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-icon {","background: url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -512px 0;","}",".blocklyWidgetDiv .goog-menuitem-accel {","color: #999;","direction: ltr;","left: auto;","padding: 0 6px;","position: absolute;","right: 0;","text-align: right;","}",".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-accel {", -"left: 0;","right: auto;","text-align: left;","}",".blocklyWidgetDiv .goog-menuitem-mnemonic-hint {","text-decoration: underline;","}",".blocklyWidgetDiv .goog-menuitem-mnemonic-separator {","color: #999;","font-size: 12px;","padding-left: 4px;","}",".blocklyWidgetDiv .goog-menuseparator {","border-top: 1px solid #ccc;","margin: 4px 0;","padding: 0;","}",""];Blockly.WidgetDiv={};Blockly.WidgetDiv.DIV=null;Blockly.WidgetDiv.owner_=null;Blockly.WidgetDiv.dispose_=null;Blockly.WidgetDiv.createDom=function(){Blockly.WidgetDiv.DIV||(Blockly.WidgetDiv.DIV=document.createElement("div"),Blockly.WidgetDiv.DIV.className="blocklyWidgetDiv",document.body.appendChild(Blockly.WidgetDiv.DIV))}; +"fill-opacity: .8;","stroke-opacity: .8;","}",".blocklyDragging>.blocklyPathDark {","display: none;","}",".blocklyDisabled>.blocklyPath {","fill-opacity: .5;","stroke-opacity: .5;","}",".blocklyDisabled>.blocklyPathLight,",".blocklyDisabled>.blocklyPathDark {","display: none;","}",".blocklyInsertionMarker>.blocklyPath,",".blocklyInsertionMarker>.blocklyPathLight,",".blocklyInsertionMarker>.blocklyPathDark {","fill-opacity: .2;","stroke: none","}",".blocklyReplaceable .blocklyPath {","fill-opacity: 0.5;", +"}",".blocklyReplaceable .blocklyPathLight,",".blocklyReplaceable .blocklyPathDark {","display: none;","}",".blocklyText {","cursor: default;","fill: #fff;","font-family: sans-serif;","font-size: 11pt;","}",".blocklyNonEditableText>text {","pointer-events: none;","}",".blocklyNonEditableText>rect,",".blocklyEditableText>rect {","fill: #fff;","fill-opacity: .6;","}",".blocklyNonEditableText>text,",".blocklyEditableText>text {","fill: #000;","}",".blocklyEditableText:hover>rect {","stroke: #fff;","stroke-width: 2;", +"}",".blocklyBubbleText {","fill: #000;","}",".blocklyFlyout {","position: absolute;","z-index: 20;","}",".blocklyFlyoutButton {","fill: #888;","cursor: default;","}",".blocklyFlyoutButtonShadow {","fill: #666;","}",".blocklyFlyoutButton:hover {","fill: #aaa;","}",".blocklyFlyoutLabel {","cursor: default;","}",".blocklyFlyoutLabelBackground {","opacity: 0;","}",".blocklyFlyoutLabelText {","fill: #000;","}",".blocklySvg text, .blocklyBlockDragSurface text {","user-select: none;","-moz-user-select: none;", +"-ms-user-select: none;","-webkit-user-select: none;","cursor: inherit;","}",".blocklyHidden {","display: none;","}",".blocklyFieldDropdown:not(.blocklyHidden) {","display: block;","}",".blocklyIconGroup {","cursor: default;","}",".blocklyIconGroup:not(:hover),",".blocklyIconGroupReadonly {","opacity: .6;","}",".blocklyIconShape {","fill: #00f;","stroke: #fff;","stroke-width: 1px;","}",".blocklyIconSymbol {","fill: #fff;","}",".blocklyMinimalBody {","margin: 0;","padding: 0;","}",".blocklyCommentForeignObject {", +"position: relative;","z-index: 0;","}",".blocklyCommentRect {","fill: #E7DE8E;","stroke: #bcA903;","stroke-width: 1px","}",".blocklyCommentTarget {","fill: transparent;","stroke: #bcA903;","}",".blocklyCommentTargetFocused {","fill: none;","}",".blocklyCommentHandleTarget {","fill: none;","}",".blocklyCommentHandleTargetFocused {","fill: transparent;","}",".blocklyFocused>.blocklyCommentRect {","fill: #B9B272;","stroke: #B9B272;","}",".blocklySelected>.blocklyCommentTarget {","stroke: #fc3;","stroke-width: 3px;", +"}",".blocklyCommentTextarea {","background-color: #fef49c;","border: 0;","outline: 0;","margin: 0;","padding: 3px;","resize: none;","display: block;","overflow: hidden;","}",".blocklyCommentDeleteIcon {","cursor: pointer;","fill: #000;","display: none","}",".blocklySelected > .blocklyCommentDeleteIcon {","display: block","}",".blocklyDeleteIconShape {","fill: #000;","stroke: #000;","stroke-width: 1px;","}",".blocklyDeleteIconShape.blocklyDeleteIconHighlighted {","stroke: #fc3;","}",".blocklyHtmlInput {", +"border: none;","border-radius: 4px;","font-family: sans-serif;","height: 100%;","margin: 0;","outline: none;","padding: 0 1px;","width: 100%","}",".blocklyMainBackground {","stroke-width: 1;","stroke: #c6c6c6;","}",".blocklyMutatorBackground {","fill: #fff;","stroke: #ddd;","stroke-width: 1;","}",".blocklyFlyoutBackground {","fill: #ddd;","fill-opacity: .8;","}",".blocklyTransparentBackground {","opacity: 0;","}",".blocklyMainWorkspaceScrollbar {","z-index: 20;","}",".blocklyFlyoutScrollbar {","z-index: 30;", +"}",".blocklyScrollbarHorizontal, .blocklyScrollbarVertical {","position: absolute;","outline: none;","}",".blocklyScrollbarBackground {","opacity: 0;","}",".blocklyScrollbarHandle {","fill: #ccc;","}",".blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,",".blocklyScrollbarHandle:hover {","fill: #bbb;","}",".blocklyZoom>image, .blocklyZoom>svg>image {","opacity: .4;","}",".blocklyZoom>image:hover, .blocklyZoom>svg>image:hover {","opacity: .6;","}",".blocklyZoom>image:active, .blocklyZoom>svg>image:active {", +"opacity: .8;","}",".blocklyFlyout .blocklyScrollbarHandle {","fill: #bbb;","}",".blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,",".blocklyFlyout .blocklyScrollbarHandle:hover {","fill: #aaa;","}",".blocklyInvalidInput {","background: #faa;","}",".blocklyAngleCircle {","stroke: #444;","stroke-width: 1;","fill: #ddd;","fill-opacity: .8;","}",".blocklyAngleMarks {","stroke: #444;","stroke-width: 1;","}",".blocklyAngleGauge {","fill: #f88;","fill-opacity: .8;","}",".blocklyAngleLine {", +"stroke: #f00;","stroke-width: 2;","stroke-linecap: round;","pointer-events: none;","}",".blocklyContextMenu {","border-radius: 4px;","}",".blocklyDropdownMenu {","padding: 0 !important;","}",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-icon {","background: url(<<>>/sprites.png) no-repeat -48px -16px !important;","}",".blocklyToolboxDiv {","background-color: #ddd;","overflow-x: visible;","overflow-y: auto;","position: absolute;", +"user-select: none;","-moz-user-select: none;","-ms-user-select: none;","-webkit-user-select: none;","z-index: 70;","-webkit-tap-highlight-color: transparent;","}",".blocklyTreeRoot {","padding: 4px 0;","}",".blocklyTreeRoot:focus {","outline: none;","}",".blocklyTreeRow {","height: 22px;","line-height: 22px;","margin-bottom: 3px;","padding-right: 8px;","white-space: nowrap;","}",".blocklyHorizontalTree {","float: left;","margin: 1px 5px 8px 0;","}",".blocklyHorizontalTreeRtl {","float: right;","margin: 1px 0 8px 5px;", +"}",'.blocklyToolboxDiv[dir="RTL"] .blocklyTreeRow {',"margin-left: 8px;","}",".blocklyTreeRow:not(.blocklyTreeSelected):hover {","background-color: #e4e4e4;","}",".blocklyTreeSeparator {","border-bottom: solid #e5e5e5 1px;","height: 0;","margin: 5px 0;","}",".blocklyTreeSeparatorHorizontal {","border-right: solid #e5e5e5 1px;","width: 0;","padding: 5px 0;","margin: 0 5px;","}",".blocklyTreeIcon {","background-image: url(<<>>/sprites.png);","height: 16px;","vertical-align: middle;","width: 16px;", +"}",".blocklyTreeIconClosedLtr {","background-position: -32px -1px;","}",".blocklyTreeIconClosedRtl {","background-position: 0 -1px;","}",".blocklyTreeIconOpen {","background-position: -16px -1px;","}",".blocklyTreeSelected>.blocklyTreeIconClosedLtr {","background-position: -32px -17px;","}",".blocklyTreeSelected>.blocklyTreeIconClosedRtl {","background-position: 0 -17px;","}",".blocklyTreeSelected>.blocklyTreeIconOpen {","background-position: -16px -17px;","}",".blocklyTreeIconNone,",".blocklyTreeSelected>.blocklyTreeIconNone {", +"background-position: -48px -1px;","}",".blocklyTreeLabel {","cursor: default;","font-family: sans-serif;","font-size: 16px;","padding: 0 3px;","vertical-align: middle;","}",".blocklyToolboxDelete .blocklyTreeLabel {",'cursor: url("<<>>/handdelete.cur"), auto;',"}",".blocklyTreeSelected .blocklyTreeLabel {","color: #fff;","}",".blocklyColourTable {","border-collapse: collapse;","}",".blocklyColourTable>tr>td {","border: 1px solid #666;","padding: 0;","}",".blocklyColourTable>tr>td>div {","border: 1px solid #666;", +"height: 13px;","width: 15px;","}",".blocklyColourTable>tr>td>div:hover {","border: 1px solid #fff;","}",".blocklyColourSelected, .blocklyColourSelected:hover {","border: 1px solid #000 !important;","}",".blocklyWidgetDiv .goog-menu {","background: #fff;","border-color: #ccc #666 #666 #ccc;","border-style: solid;","border-width: 1px;","cursor: default;","font: normal 13px Arial, sans-serif;","margin: 0;","outline: none;","padding: 4px 0;","position: absolute;","overflow-y: auto;","overflow-x: hidden;", +"max-height: 100%;","z-index: 20000;","}",".blocklyWidgetDiv .goog-menuitem {","color: #000;","font: normal 13px Arial, sans-serif;","list-style: none;","margin: 0;","padding: 4px 7em 4px 28px;","white-space: nowrap;","}",".blocklyWidgetDiv .goog-menuitem.goog-menuitem-rtl {","padding-left: 7em;","padding-right: 28px;","}",".blocklyWidgetDiv .goog-menu-nocheckbox .goog-menuitem,",".blocklyWidgetDiv .goog-menu-noicon .goog-menuitem {","padding-left: 12px;","}",".blocklyWidgetDiv .goog-menu-noaccel .goog-menuitem {", +"padding-right: 20px;","}",".blocklyWidgetDiv .goog-menuitem-content {","color: #000;","font: normal 13px Arial, sans-serif;","}",".blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-accel,",".blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-content {","color: #ccc !important;","}",".blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-icon {","opacity: 0.3;","filter: alpha(opacity=30);","}",".blocklyWidgetDiv .goog-menuitem-highlight,",".blocklyWidgetDiv .goog-menuitem-hover {","background-color: #d6e9f8;", +"border-color: #d6e9f8;","border-style: dotted;","border-width: 1px 0;","padding-bottom: 3px;","padding-top: 3px;","}",".blocklyWidgetDiv .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-menuitem-icon {","background-repeat: no-repeat;","height: 16px;","left: 6px;","position: absolute;","right: auto;","vertical-align: middle;","width: 16px;","}",".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-icon {","left: auto;","right: 6px;", +"}",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-icon {","background: url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -512px 0;","}",".blocklyWidgetDiv .goog-menuitem-accel {","color: #999;","direction: ltr;","left: auto;","padding: 0 6px;","position: absolute;","right: 0;","text-align: right;","}",".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-accel {","left: 0;","right: auto;","text-align: left;","}",".blocklyWidgetDiv .goog-menuitem-mnemonic-hint {", +"text-decoration: underline;","}",".blocklyWidgetDiv .goog-menuitem-mnemonic-separator {","color: #999;","font-size: 12px;","padding-left: 4px;","}",".blocklyWidgetDiv .goog-menuseparator {","border-top: 1px solid #ccc;","margin: 4px 0;","padding: 0;","}",""];Blockly.WidgetDiv={};Blockly.WidgetDiv.DIV=null;Blockly.WidgetDiv.owner_=null;Blockly.WidgetDiv.dispose_=null;Blockly.WidgetDiv.createDom=function(){Blockly.WidgetDiv.DIV||(Blockly.WidgetDiv.DIV=document.createElement("div"),Blockly.WidgetDiv.DIV.className="blocklyWidgetDiv",document.body.appendChild(Blockly.WidgetDiv.DIV))}; Blockly.WidgetDiv.show=function(a,b,c){Blockly.WidgetDiv.hide();Blockly.WidgetDiv.owner_=a;Blockly.WidgetDiv.dispose_=c;a=goog.style.getViewportPageOffset(document);Blockly.WidgetDiv.DIV.style.top=a.y+"px";Blockly.WidgetDiv.DIV.style.direction=b?"rtl":"ltr";Blockly.WidgetDiv.DIV.style.display="block"}; Blockly.WidgetDiv.hide=function(){Blockly.WidgetDiv.owner_&&(Blockly.WidgetDiv.owner_=null,Blockly.WidgetDiv.DIV.style.display="none",Blockly.WidgetDiv.DIV.style.left="",Blockly.WidgetDiv.DIV.style.top="",Blockly.WidgetDiv.dispose_&&Blockly.WidgetDiv.dispose_(),Blockly.WidgetDiv.dispose_=null,Blockly.WidgetDiv.DIV.innerHTML="")};Blockly.WidgetDiv.isVisible=function(){return!!Blockly.WidgetDiv.owner_};Blockly.WidgetDiv.hideIfOwner=function(a){Blockly.WidgetDiv.owner_==a&&Blockly.WidgetDiv.hide()}; Blockly.WidgetDiv.position=function(a,b,c,d,e){bc.width+d.x&&(a=c.width+d.x):aa.viewHeight+d||a.contentLeft<(b.RTL?a.viewLeft:c)||a.contentLeft+a.contentWidth>(b.RTL?a.viewWidth:a.viewWidth+c))for(var k=e.getTopBlocks(!1),l=0,n;n=k[l];l++){var m=n.getRelativeToSurfaceXY(),p=n.getHeightWidth(),q=d+25-p.height-m.y;0q&&n.moveBy(0,q);q=25+c-m.x-(b.RTL?0:p.width);0m&&n.moveBy(m,0)}}});Blockly.svgResize(e);Blockly.WidgetDiv.createDom();Blockly.Tooltip.createDom(); -return e}; -Blockly.init_=function(a){var b=a.options,c=a.getParentSvg();Blockly.bindEventWithChecks_(c.parentNode,"contextmenu",null,function(a){Blockly.utils.isTargetInput(a)||a.preventDefault()});c=Blockly.bindEventWithChecks_(window,"resize",null,function(){Blockly.hideChaff(!0);Blockly.svgResize(a)});a.setResizeHandlerWrapper(c);Blockly.inject.bindDocumentEvents_();b.languageTree&&(a.toolbox_?a.toolbox_.init(a):a.flyout_&&(a.flyout_.init(a),a.flyout_.show(b.languageTree.childNodes),a.flyout_.scrollToStart(),a.scrollX= -a.flyout_.width_,b.toolboxPosition==Blockly.TOOLBOX_AT_RIGHT&&(a.scrollX*=-1),a.translate(a.scrollX,0)));b.hasScrollbars&&(a.scrollbar=new Blockly.ScrollbarPair(a),a.scrollbar.resize());b.hasSounds&&Blockly.inject.loadSounds_(b.pathToMedia,a)}; +Blockly.createMainWorkspace_=function(a,b,c,d){b.parentWorkspace=null;var e=new Blockly.WorkspaceSvg(b,c,d);e.scale=b.zoomOptions.startScale;a.appendChild(e.createDom("blocklyMainBackground"));!b.hasCategories&&b.languageTree&&(c=e.addFlyout_("svg"),Blockly.utils.insertAfter(c,a));e.translate(0,0);Blockly.mainWorkspace=e;b.readOnly||b.hasScrollbars||e.addChangeListener(function(a){if(!e.isDragging()){var c=e.getMetrics(),d=c.viewLeft+c.absoluteLeft,f=c.viewTop+c.absoluteTop;if(c.contentTopc.viewHeight+f||c.contentLeft<(b.RTL?c.viewLeft:d)||c.contentLeft+c.contentWidth>(b.RTL?c.viewWidth:c.viewWidth+d)){var l=e.getTopBlocks(!1),n=null;a&&(n=Blockly.Events.getGroup(),Blockly.Events.setGroup(a.group));for(var m=!1,p=0,q;q=l[p];p++){var r=q.getRelativeToSurfaceXY(),t=q.getHeightWidth(),u=f+25-t.height-r.y;0u&&(q.moveBy(0,u),m=!0);u=25+d-r.x-(b.RTL?0:t.width);0r&&(q.moveBy(r,0),m=!0)}a&&(!a.group&&m&&console.log("WARNING: Moved blocks in bounds but there was no event group. This may break undo."),Blockly.Events.setGroup(n))}}});Blockly.svgResize(e);Blockly.WidgetDiv.createDom();Blockly.Tooltip.createDom();return e}; +Blockly.init_=function(a){var b=a.options,c=a.getParentSvg();Blockly.bindEventWithChecks_(c.parentNode,"contextmenu",null,function(a){Blockly.utils.isTargetInput(a)||a.preventDefault()});c=Blockly.bindEventWithChecks_(window,"resize",null,function(){Blockly.hideChaff(!0);Blockly.svgResize(a)});a.setResizeHandlerWrapper(c);Blockly.inject.bindDocumentEvents_();b.languageTree&&(a.toolbox_?a.toolbox_.init(a):a.flyout_&&(a.flyout_.init(a),a.flyout_.show(b.languageTree.childNodes),a.flyout_.scrollToStart(), +a.scrollX=a.flyout_.width_,b.toolboxPosition==Blockly.TOOLBOX_AT_RIGHT&&(a.scrollX*=-1),a.translate(a.scrollX,0)));b.hasScrollbars&&(a.scrollbar=new Blockly.ScrollbarPair(a),a.scrollbar.resize());b.hasSounds&&Blockly.inject.loadSounds_(b.pathToMedia,a)}; Blockly.inject.bindDocumentEvents_=function(){Blockly.documentEventsBound_||(Blockly.bindEventWithChecks_(document,"keydown",null,Blockly.onKeyDown_),Blockly.bindEvent_(document,"touchend",null,Blockly.longStop_),Blockly.bindEvent_(document,"touchcancel",null,Blockly.longStop_),goog.userAgent.IPAD&&Blockly.bindEventWithChecks_(window,"orientationchange",document,function(){Blockly.svgResize(Blockly.getMainWorkspace())}));Blockly.documentEventsBound_=!0}; Blockly.inject.loadSounds_=function(a,b){var c=b.getAudioManager();c.load([a+"click.mp3",a+"click.wav",a+"click.ogg"],"click");c.load([a+"disconnect.wav",a+"disconnect.mp3",a+"disconnect.ogg"],"disconnect");c.load([a+"delete.mp3",a+"delete.ogg",a+"delete.wav"],"delete");var d=[],e=function(){for(;d.length;)Blockly.unbindEvent_(d.pop());c.preload()};d.push(Blockly.bindEventWithChecks_(document,"mousemove",null,e,!0));d.push(Blockly.bindEventWithChecks_(document,"touchstart",null,e,!0))}; -Blockly.updateToolbox=function(a){console.warn("Deprecated call to Blockly.updateToolbox, use workspace.updateToolbox instead.");Blockly.getMainWorkspace().updateToolbox(a)};var CLOSURE_DEFINES={"goog.DEBUG":!1};Blockly.mainWorkspace=null;Blockly.selected=null;Blockly.draggingConnections_=[];Blockly.clipboardXml_=null;Blockly.clipboardSource_=null;Blockly.cache3dSupported_=null;Blockly.hueToRgb=function(a){return goog.color.hsvToHex(a,Blockly.HSV_SATURATION,255*Blockly.HSV_VALUE)};Blockly.svgSize=function(a){return{width:a.cachedWidth_,height:a.cachedHeight_}};Blockly.resizeSvgContents=function(a){a.resizeContents()}; +Blockly.updateToolbox=function(a){console.warn("Deprecated call to Blockly.updateToolbox, use workspace.updateToolbox instead.");Blockly.getMainWorkspace().updateToolbox(a)};var CLOSURE_DEFINES={"goog.DEBUG":!1};Blockly.mainWorkspace=null;Blockly.selected=null;Blockly.draggingConnections_=[];Blockly.clipboardXml_=null;Blockly.clipboardSource_=null;Blockly.clipboardTypeCounts_=null;Blockly.cache3dSupported_=null;Blockly.hueToRgb=function(a){return goog.color.hsvToHex(a,Blockly.HSV_SATURATION,255*Blockly.HSV_VALUE)};Blockly.svgSize=function(a){return{width:a.cachedWidth_,height:a.cachedHeight_}};Blockly.resizeSvgContents=function(a){a.resizeContents()}; Blockly.svgResize=function(a){for(;a.options.parentWorkspace;)a=a.options.parentWorkspace;var b=a.getParentSvg(),c=b.parentNode;if(c){var d=c.offsetWidth;c=c.offsetHeight;b.cachedWidth_!=d&&(b.setAttribute("width",d+"px"),b.cachedWidth_=d);b.cachedHeight_!=c&&(b.setAttribute("height",c+"px"),b.cachedHeight_=c);a.resize()}}; Blockly.onKeyDown_=function(a){var b=Blockly.mainWorkspace;if(!(b.options.readOnly||Blockly.utils.isTargetInput(a)||b.rendered&&!b.isVisible())){var c=!1;if(27==a.keyCode)Blockly.hideChaff();else if(8==a.keyCode||46==a.keyCode){a.preventDefault();if(b.isDragging())return;Blockly.selected&&Blockly.selected.isDeletable()&&(c=!0)}else if(a.altKey||a.ctrlKey||a.metaKey){if(b.isDragging())return;Blockly.selected&&Blockly.selected.isDeletable()&&Blockly.selected.isMovable()&&(67==a.keyCode?(Blockly.hideChaff(), -Blockly.copy_(Blockly.selected)):88!=a.keyCode||Blockly.selected.workspace.isFlyout||(Blockly.copy_(Blockly.selected),c=!0));86==a.keyCode?Blockly.clipboardXml_&&(Blockly.Events.setGroup(!0),b=Blockly.clipboardSource_,b.isFlyout&&(b=b.targetWorkspace),b.paste(Blockly.clipboardXml_),Blockly.Events.setGroup(!1)):90==a.keyCode&&(Blockly.hideChaff(),b.undo(a.shiftKey))}c&&!Blockly.selected.workspace.isFlyout&&(Blockly.Events.setGroup(!0),Blockly.hideChaff(),Blockly.selected.dispose(!0,!0),Blockly.Events.setGroup(!1))}}; -Blockly.copy_=function(a){if(a.isComment)var b=a.toXmlWithXY();else{b=Blockly.Xml.blockToDom(a);Blockly.Xml.deleteNext(b);var c=a.getRelativeToSurfaceXY();b.setAttribute("x",a.RTL?-c.x:c.x);b.setAttribute("y",c.y)}Blockly.clipboardXml_=b;Blockly.clipboardSource_=a.workspace};Blockly.duplicate_=function(a){var b=Blockly.clipboardXml_,c=Blockly.clipboardSource_;Blockly.copy_(a);a.workspace.paste(Blockly.clipboardXml_);Blockly.clipboardXml_=b;Blockly.clipboardSource_=c}; -Blockly.onContextMenu_=function(a){Blockly.utils.isTargetInput(a)||a.preventDefault()};Blockly.hideChaff=function(a){Blockly.Tooltip.hide();Blockly.WidgetDiv.hide();a||(a=Blockly.getMainWorkspace(),a.toolbox_&&a.toolbox_.flyout_&&a.toolbox_.flyout_.autoClose&&a.toolbox_.clearSelection())};Blockly.addChangeListener=function(a){console.warn("Deprecated call to Blockly.addChangeListener, use workspace.addChangeListener instead.");return Blockly.getMainWorkspace().addChangeListener(a)}; -Blockly.getMainWorkspace=function(){return Blockly.mainWorkspace};Blockly.alert=function(a,b){window.alert(a);b&&b()};Blockly.confirm=function(a,b){b(window.confirm(a))};Blockly.prompt=function(a,b,c){c(window.prompt(a,b))};Blockly.jsonInitFactory_=function(a){return function(){this.jsonInit(a)}}; +Blockly.copy_(Blockly.selected)):88!=a.keyCode||Blockly.selected.workspace.isFlyout||(Blockly.copy_(Blockly.selected),c=!0));86==a.keyCode?Blockly.clipboardXml_&&(b=Blockly.clipboardSource_,b.isFlyout&&(b=b.targetWorkspace),Blockly.clipboardTypeCounts_&&b.isCapacityAvailable(Blockly.clipboardTypeCounts_)&&(Blockly.Events.setGroup(!0),b.paste(Blockly.clipboardXml_),Blockly.Events.setGroup(!1))):90==a.keyCode&&(Blockly.hideChaff(),b.undo(a.shiftKey))}c&&!Blockly.selected.workspace.isFlyout&&(Blockly.Events.setGroup(!0), +Blockly.hideChaff(),Blockly.selected.dispose(!0,!0),Blockly.Events.setGroup(!1))}};Blockly.copy_=function(a){if(a.isComment)var b=a.toXmlWithXY();else{b=Blockly.Xml.blockToDom(a);Blockly.Xml.deleteNext(b);var c=a.getRelativeToSurfaceXY();b.setAttribute("x",a.RTL?-c.x:c.x);b.setAttribute("y",c.y)}Blockly.clipboardXml_=b;Blockly.clipboardSource_=a.workspace;Blockly.clipboardTypeCounts_=a.isComment?null:Blockly.utils.getBlockTypeCounts(a,!0)}; +Blockly.duplicate_=function(a){var b=Blockly.clipboardXml_,c=Blockly.clipboardSource_;Blockly.copy_(a);a.workspace.paste(Blockly.clipboardXml_);Blockly.clipboardXml_=b;Blockly.clipboardSource_=c};Blockly.onContextMenu_=function(a){Blockly.utils.isTargetInput(a)||a.preventDefault()};Blockly.hideChaff=function(a){Blockly.Tooltip.hide();Blockly.WidgetDiv.hide();a||(a=Blockly.getMainWorkspace(),a.toolbox_&&a.toolbox_.flyout_&&a.toolbox_.flyout_.autoClose&&a.toolbox_.clearSelection())}; +Blockly.addChangeListener=function(a){console.warn("Deprecated call to Blockly.addChangeListener, use workspace.addChangeListener instead.");return Blockly.getMainWorkspace().addChangeListener(a)};Blockly.getMainWorkspace=function(){return Blockly.mainWorkspace};Blockly.alert=function(a,b){window.alert(a);b&&b()};Blockly.confirm=function(a,b){b(window.confirm(a))};Blockly.prompt=function(a,b,c){c(window.prompt(a,b))};Blockly.jsonInitFactory_=function(a){return function(){this.jsonInit(a)}}; Blockly.defineBlocksWithJsonArray=function(a){for(var b=0;bc&&(a=a+" - "+-c,g=Blockly.Dart.ORDER_ADDITIVE); d&&(a=c?"-("+a+")":"-"+a,g=Blockly.Dart.ORDER_UNARY_PREFIX);g=Math.floor(g);e=Math.floor(e);g&&e>=g&&(a="("+a+")")}return a};Blockly.Dart.colour={};Blockly.Dart.addReservedWords("Math");Blockly.Dart.colour_picker=function(a){return["'"+a.getFieldValue("COLOUR")+"'",Blockly.Dart.ORDER_ATOMIC]}; Blockly.Dart.colour_random=function(a){Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";return[Blockly.Dart.provideFunction_("colour_random",["String "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"() {"," String hex = '0123456789abcdef';"," var rnd = new Math.Random();"," return '#${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}'"," '${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}'"," '${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}';","}"])+"()",Blockly.Dart.ORDER_UNARY_POSTFIX]}; diff --git a/javascript_compressed.js b/javascript_compressed.js index 4cca24e3e..dec1616c1 100644 --- a/javascript_compressed.js +++ b/javascript_compressed.js @@ -11,8 +11,8 @@ Blockly.JavaScript.ORDER_ADDITION],[Blockly.JavaScript.ORDER_LOGICAL_AND,Blockly Blockly.JavaScript.init=function(a){Blockly.JavaScript.definitions_=Object.create(null);Blockly.JavaScript.functionNames_=Object.create(null);Blockly.JavaScript.variableDB_?Blockly.JavaScript.variableDB_.reset():Blockly.JavaScript.variableDB_=new Blockly.Names(Blockly.JavaScript.RESERVED_WORDS_);Blockly.JavaScript.variableDB_.setVariableMap(a.getVariableMap());for(var b=[],c=Blockly.Variables.allDeveloperVariables(a),d=0;dc?Blockly.JavaScript.valueToCode(a,b,Blockly.JavaScript.ORDER_SUBTRACTION)||f:d?Blockly.JavaScript.valueToCode(a,b,Blockly.JavaScript.ORDER_UNARY_NEGATION)||f:Blockly.JavaScript.valueToCode(a,b,e)||f;if(Blockly.isNumber(a))a=parseFloat(a)+c, d&&(a=-a);else{if(0c&&(a=a+" - "+-c,g=Blockly.JavaScript.ORDER_SUBTRACTION);d&&(a=c?"-("+a+")":"-"+a,g=Blockly.JavaScript.ORDER_UNARY_NEGATION);g=Math.floor(g);e=Math.floor(e);g&&e>=g&&(a="("+a+")")}return a};Blockly.JavaScript.colour={};Blockly.JavaScript.colour_picker=function(a){return["'"+a.getFieldValue("COLOUR")+"'",Blockly.JavaScript.ORDER_ATOMIC]};Blockly.JavaScript.colour_random=function(a){return[Blockly.JavaScript.provideFunction_("colourRandom",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"() {"," var num = Math.floor(Math.random() * Math.pow(2, 24));"," return '#' + ('00000' + num.toString(16)).substr(-6);","}"])+"()",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; Blockly.JavaScript.colour_rgb=function(a){var b=Blockly.JavaScript.valueToCode(a,"RED",Blockly.JavaScript.ORDER_COMMA)||0,c=Blockly.JavaScript.valueToCode(a,"GREEN",Blockly.JavaScript.ORDER_COMMA)||0;a=Blockly.JavaScript.valueToCode(a,"BLUE",Blockly.JavaScript.ORDER_COMMA)||0;return[Blockly.JavaScript.provideFunction_("colourRgb",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(r, g, b) {"," r = Math.max(Math.min(Number(r), 100), 0) * 2.55;"," g = Math.max(Math.min(Number(g), 100), 0) * 2.55;", diff --git a/lua_compressed.js b/lua_compressed.js index 0fdd2334c..c5282fef3 100644 --- a/lua_compressed.js +++ b/lua_compressed.js @@ -6,8 +6,8 @@ Blockly.Lua=new Blockly.Generator("Lua");Blockly.Lua.addReservedWords("_,__inext Blockly.Lua.ORDER_ATOMIC=0;Blockly.Lua.ORDER_HIGH=1;Blockly.Lua.ORDER_EXPONENTIATION=2;Blockly.Lua.ORDER_UNARY=3;Blockly.Lua.ORDER_MULTIPLICATIVE=4;Blockly.Lua.ORDER_ADDITIVE=5;Blockly.Lua.ORDER_CONCATENATION=6;Blockly.Lua.ORDER_RELATIONAL=7;Blockly.Lua.ORDER_AND=8;Blockly.Lua.ORDER_OR=9;Blockly.Lua.ORDER_NONE=99; Blockly.Lua.init=function(a){Blockly.Lua.definitions_=Object.create(null);Blockly.Lua.functionNames_=Object.create(null);Blockly.Lua.variableDB_?Blockly.Lua.variableDB_.reset():Blockly.Lua.variableDB_=new Blockly.Names(Blockly.Lua.RESERVED_WORDS_);Blockly.Lua.variableDB_.setVariableMap(a.getVariableMap())}; Blockly.Lua.finish=function(a){var b=[],c;for(c in Blockly.Lua.definitions_)b.push(Blockly.Lua.definitions_[c]);delete Blockly.Lua.definitions_;delete Blockly.Lua.functionNames_;Blockly.Lua.variableDB_.reset();return b.join("\n\n")+"\n\n\n"+a};Blockly.Lua.scrubNakedValue=function(a){return"local _ = "+a+"\n"};Blockly.Lua.quote_=function(a){a=a.replace(/\\/g,"\\\\").replace(/\n/g,"\\\n").replace(/'/g,"\\'");return"'"+a+"'"}; -Blockly.Lua.scrub_=function(a,b){var c="";if(!a.outputConnection||!a.outputConnection.targetConnection){var d=a.getCommentText();(d=Blockly.utils.wrap(d,Blockly.Lua.COMMENT_WRAP-3))&&(c+=Blockly.Lua.prefixLines(d,"-- ")+"\n");for(var e=0;ec?Blockly.PHP.valueToCode(a,b,Blockly.PHP.ORDER_SUBTRACTION)||f:d?Blockly.PHP.valueToCode(a,b,Blockly.PHP.ORDER_UNARY_NEGATION)||f:Blockly.PHP.valueToCode(a,b,e)||f;if(Blockly.isNumber(a))a=parseFloat(a)+c,d&&(a=-a);else{if(0c&& (a=a+" - "+-c,g=Blockly.PHP.ORDER_SUBTRACTION);d&&(a=c?"-("+a+")":"-"+a,g=Blockly.PHP.ORDER_UNARY_NEGATION);g=Math.floor(g);e=Math.floor(e);g&&e>=g&&(a="("+a+")")}return a};Blockly.PHP.colour={};Blockly.PHP.colour_picker=function(a){return["'"+a.getFieldValue("COLOUR")+"'",Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.colour_random=function(a){return[Blockly.PHP.provideFunction_("colour_random",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"() {"," return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);","}"])+"()",Blockly.PHP.ORDER_FUNCTION_CALL]}; Blockly.PHP.colour_rgb=function(a){var b=Blockly.PHP.valueToCode(a,"RED",Blockly.PHP.ORDER_COMMA)||0,c=Blockly.PHP.valueToCode(a,"GREEN",Blockly.PHP.ORDER_COMMA)||0;a=Blockly.PHP.valueToCode(a,"BLUE",Blockly.PHP.ORDER_COMMA)||0;return[Blockly.PHP.provideFunction_("colour_rgb",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($r, $g, $b) {"," $r = round(max(min($r, 100), 0) * 2.55);"," $g = round(max(min($g, 100), 0) * 2.55);"," $b = round(max(min($b, 100), 0) * 2.55);"," $hex = '#';"," $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);", diff --git a/python_compressed.js b/python_compressed.js index 92000d619..66959ddd6 100644 --- a/python_compressed.js +++ b/python_compressed.js @@ -10,8 +10,8 @@ Blockly.Python.init=function(a){Blockly.Python.PASS=this.INDENT+"pass\n";Blockly " = None");a=Blockly.Variables.allUsedVarModels(a);for(d=0;dc?"int("+a+" - "+-c+")":"int("+a+")",d&&(a="-"+a));return a};Blockly.Python.colour={};Blockly.Python.colour_picker=function(a){return["'"+a.getFieldValue("COLOUR")+"'",Blockly.Python.ORDER_ATOMIC]};Blockly.Python.colour_random=function(a){Blockly.Python.definitions_.import_random="import random";return["'#%06x' % random.randint(0, 2**24 - 1)",Blockly.Python.ORDER_FUNCTION_CALL]}; +Blockly.Python.scrub_=function(a,b,c){var d="";if(!a.outputConnection||!a.outputConnection.targetConnection){var e=a.getCommentText();(e=Blockly.utils.wrap(e,Blockly.Python.COMMENT_WRAP-3))&&(d=a.getProcedureDef?d+('"""'+e+'\n"""\n'):d+Blockly.Python.prefixLines(e+"\n","# "));for(var f=0;fc?"int("+a+" - "+-c+")":"int("+a+")",d&&(a="-"+a));return a};Blockly.Python.colour={};Blockly.Python.colour_picker=function(a){return["'"+a.getFieldValue("COLOUR")+"'",Blockly.Python.ORDER_ATOMIC]};Blockly.Python.colour_random=function(a){Blockly.Python.definitions_.import_random="import random";return["'#%06x' % random.randint(0, 2**24 - 1)",Blockly.Python.ORDER_FUNCTION_CALL]}; Blockly.Python.colour_rgb=function(a){var b=Blockly.Python.provideFunction_("colour_rgb",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(r, g, b):"," r = round(min(100, max(0, r)) * 2.55)"," g = round(min(100, max(0, g)) * 2.55)"," b = round(min(100, max(0, b)) * 2.55)"," return '#%02x%02x%02x' % (r, g, b)"]),c=Blockly.Python.valueToCode(a,"RED",Blockly.Python.ORDER_NONE)||0,d=Blockly.Python.valueToCode(a,"GREEN",Blockly.Python.ORDER_NONE)||0;a=Blockly.Python.valueToCode(a,"BLUE",Blockly.Python.ORDER_NONE)|| 0;return[b+"("+c+", "+d+", "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]}; Blockly.Python.colour_blend=function(a){var b=Blockly.Python.provideFunction_("colour_blend",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(colour1, colour2, ratio):"," r1, r2 = int(colour1[1:3], 16), int(colour2[1:3], 16)"," g1, g2 = int(colour1[3:5], 16), int(colour2[3:5], 16)"," b1, b2 = int(colour1[5:7], 16), int(colour2[5:7], 16)"," ratio = min(1, max(0, ratio))"," r = round(r1 * (1 - ratio) + r2 * ratio)"," g = round(g1 * (1 - ratio) + g2 * ratio)"," b = round(b1 * (1 - ratio) + b2 * ratio)", From 9ee7319ac558cfcda3fdba829c74fa2dae76894a Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Fri, 14 Dec 2018 14:49:50 -0800 Subject: [PATCH 09/32] Trashcan/Zoom Anchored to Top when Toolbox is on Bottom. --- core/inject.js | 6 ++-- core/trashcan.js | 22 ++++++++----- core/zoom_controls.js | 76 +++++++++++++++++++++---------------------- 3 files changed, 53 insertions(+), 51 deletions(-) diff --git a/core/inject.js b/core/inject.js index 2792f54e1..921a15753 100644 --- a/core/inject.js +++ b/core/inject.js @@ -345,12 +345,12 @@ Blockly.init_ = function(mainWorkspace) { } } - var bottom = Blockly.Scrollbar.scrollbarThickness; + var verticalSpacing = Blockly.Scrollbar.scrollbarThickness; if (options.hasTrashcan) { - bottom = mainWorkspace.trashcan.init(bottom); + verticalSpacing = mainWorkspace.trashcan.init(verticalSpacing); } if (options.zoomOptions && options.zoomOptions.controls) { - mainWorkspace.zoomControls_.init(bottom); + mainWorkspace.zoomControls_.init(verticalSpacing); } if (options.hasScrollbars) { diff --git a/core/trashcan.js b/core/trashcan.js index 7d3f22355..50732ec9c 100644 --- a/core/trashcan.js +++ b/core/trashcan.js @@ -265,19 +265,21 @@ Blockly.Trashcan.prototype.createDom = function() { /** * Initialize the trash can. - * @param {number} bottom Distance from workspace bottom to bottom of trashcan. - * @return {number} Distance from workspace bottom to the top of trashcan. + * @param {number} verticalSpacing Vertical distance workspace edge to the same + * edge of the trashcan. + * @return {number} Vertical distance from workspace edge to the opposite + * edge of the trashcan. */ -Blockly.Trashcan.prototype.init = function(bottom) { +Blockly.Trashcan.prototype.init = function(verticalSpacing) { if (this.workspace_.options.maxTrashcanContents > 0) { Blockly.utils.insertAfter(this.flyout_.createDom('svg'), this.workspace_.getParentSvg()); this.flyout_.init(this.workspace_); } - this.bottom_ = this.MARGIN_BOTTOM_ + bottom; + this.verticalSpacing_ = this.MARGIN_BOTTOM_ + verticalSpacing; this.setOpen_(false); - return this.bottom_ + this.BODY_HEIGHT_ + this.LID_HEIGHT_; + return this.verticalSpacing_ + this.BODY_HEIGHT_ + this.LID_HEIGHT_; }; /** @@ -299,7 +301,7 @@ Blockly.Trashcan.prototype.dispose = function() { */ Blockly.Trashcan.prototype.position = function() { // Not yet initialized. - if (!this.bottom_) { + if (!this.verticalSpacing_) { return; } var metrics = this.workspace_.getMetrics(); @@ -323,12 +325,14 @@ Blockly.Trashcan.prototype.position = function() { this.left_ -= metrics.flyoutWidth; } } - this.top_ = metrics.viewHeight + metrics.absoluteTop - - (this.BODY_HEIGHT_ + this.LID_HEIGHT_) - this.bottom_; if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM) { - this.top_ -= metrics.flyoutHeight; + this.top_ = this.verticalSpacing_; + } else { + this.top_ = metrics.viewHeight + metrics.absoluteTop - + (this.BODY_HEIGHT_ + this.LID_HEIGHT_) - this.verticalSpacing_; } + this.svgGroup_.setAttribute('transform', 'translate(' + this.left_ + ',' + this.top_ + ')'); }; diff --git a/core/zoom_controls.js b/core/zoom_controls.js index 3ca9d05a1..19995be1d 100644 --- a/core/zoom_controls.js +++ b/core/zoom_controls.js @@ -94,7 +94,7 @@ Blockly.ZoomControls.prototype.top_ = 0; */ Blockly.ZoomControls.prototype.createDom = function() { this.svgGroup_ = - Blockly.utils.createSvgElement('g', {'class': 'blocklyZoom'}, null); + Blockly.utils.createSvgElement('g', {}, null); // Each filter/pattern needs a unique ID for the case of multiple Blockly // instances on a page. Browser behaviour becomes undefined otherwise. @@ -108,12 +108,14 @@ Blockly.ZoomControls.prototype.createDom = function() { /** * Initialize the zoom controls. - * @param {number} bottom Distance from workspace bottom to bottom of controls. - * @return {number} Distance from workspace bottom to the top of controls. + * @param {number} verticalSpacing Vertical distances from workspace edge to the + * same edge of the controls. + * @return {number} Vertical distance from workspace edge to the opposite + * edge of the controls. */ -Blockly.ZoomControls.prototype.init = function(bottom) { - this.bottom_ = this.MARGIN_BOTTOM_ + bottom; - return this.bottom_ + this.HEIGHT_; +Blockly.ZoomControls.prototype.init = function(verticalSpacing) { + this.verticalSpacing_ = this.MARGIN_BOTTOM_ + verticalSpacing; + return this.verticalSpacing_ + this.HEIGHT_; }; /** @@ -133,7 +135,7 @@ Blockly.ZoomControls.prototype.dispose = function() { */ Blockly.ZoomControls.prototype.position = function() { // Not yet initialized. - if (!this.bottom_) { + if (!this.verticalSpacing_) { return; } var metrics = this.workspace_.getMetrics(); @@ -157,11 +159,18 @@ Blockly.ZoomControls.prototype.position = function() { this.left_ -= metrics.flyoutWidth; } } - this.top_ = metrics.viewHeight + metrics.absoluteTop - - this.HEIGHT_ - this.bottom_; + if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM) { - this.top_ -= metrics.flyoutHeight; + this.top_ = this.verticalSpacing_; + this.zoomInGroup_.setAttribute('transform', 'translate(0, 34)'); + this.zoomResetGroup_.setAttribute('transform', 'translate(0, 77)'); + } else { + this.top_ = metrics.viewHeight + metrics.absoluteTop - + this.HEIGHT_ - this.verticalSpacing_; + this.zoomInGroup_.setAttribute('transform', 'translate(0, 43)'); + this.zoomOutGroup_.setAttribute('transform', 'translate(0, 77)'); } + this.svgGroup_.setAttribute('transform', 'translate(' + this.left_ + ',' + this.top_ + ')'); }; @@ -184,33 +193,28 @@ Blockly.ZoomControls.prototype.createZoomOutSvg_ = function(rnd) { */ var ws = this.workspace_; - - var svgHolder = Blockly.utils.createSvgElement('svg', - { - "id": "svg" + rnd - }, - this.svgGroup_); - + this.zoomOutGroup_ = Blockly.utils.createSvgElement('g', + {'class': 'blocklyZoom'}, this.svgGroup_); var clip = Blockly.utils.createSvgElement('clipPath', { 'id': 'blocklyZoomoutClipPath' + rnd }, - svgHolder); + this.zoomOutGroup_); Blockly.utils.createSvgElement('rect', { 'width': 32, 'height': 32, - 'y': 77 }, clip); var zoomoutSvg = Blockly.utils.createSvgElement('image', { 'width': Blockly.SPRITE.width, - 'height': Blockly.SPRITE.height, 'x': -64, - 'y': -15, + 'height': Blockly.SPRITE.height, + 'x': -64, + 'y': -92, 'clip-path': 'url(#blocklyZoomoutClipPath' + rnd + ')' }, - svgHolder); + this.zoomOutGroup_); zoomoutSvg.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', ws.options.pathToMedia + Blockly.SPRITE.url); @@ -243,21 +247,17 @@ Blockly.ZoomControls.prototype.createZoomInSvg_ = function(rnd) { */ var ws = this.workspace_; - var svgHolder = Blockly.utils.createSvgElement('svg', - { - "id": "svg" + rnd - }, - this.svgGroup_); + this.zoomInGroup_ = Blockly.utils.createSvgElement('g', + {'class': 'blocklyZoom'}, this.svgGroup_); var clip = Blockly.utils.createSvgElement('clipPath', { 'id': 'blocklyZoominClipPath' + rnd }, - svgHolder); + this.zoomInGroup_); Blockly.utils.createSvgElement('rect', { 'width': 32, 'height': 32, - 'y': 43 }, clip); var zoominSvg = Blockly.utils.createSvgElement('image', @@ -265,10 +265,10 @@ Blockly.ZoomControls.prototype.createZoomInSvg_ = function(rnd) { 'width': Blockly.SPRITE.width, 'height': Blockly.SPRITE.height, 'x': -32, - 'y': -49, + 'y': -92, 'clip-path': 'url(#blocklyZoominClipPath' + rnd + ')' }, - svgHolder); + this.zoomInGroup_); zoominSvg.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', ws.options.pathToMedia + Blockly.SPRITE.url); @@ -300,16 +300,13 @@ Blockly.ZoomControls.prototype.createZoomResetSvg_ = function(rnd) { */ var ws = this.workspace_; - var svgHolder = Blockly.utils.createSvgElement('svg', - { - "id": "svg" + rnd - }, - this.svgGroup_); + this.zoomResetGroup_ = Blockly.utils.createSvgElement('g', + {'class': 'blocklyZoom'}, this.svgGroup_); var clip = Blockly.utils.createSvgElement('clipPath', { 'id': 'blocklyZoomresetClipPath' + rnd }, - svgHolder); + this.zoomResetGroup_); Blockly.utils.createSvgElement('rect', { 'width': 32, @@ -319,10 +316,11 @@ Blockly.ZoomControls.prototype.createZoomResetSvg_ = function(rnd) { var zoomresetSvg = Blockly.utils.createSvgElement('image', { 'width': Blockly.SPRITE.width, - 'height': Blockly.SPRITE.height, 'y': -92, + 'height': Blockly.SPRITE.height, + 'y': -92, 'clip-path': 'url(#blocklyZoomresetClipPath' + rnd + ')' }, - svgHolder); + this.zoomResetGroup_); zoomresetSvg.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', ws.options.pathToMedia + Blockly.SPRITE.url); From a14ff64cf3fba33a7b1044764fb5df4583f80820 Mon Sep 17 00:00:00 2001 From: RoboErikG Date: Wed, 19 Dec 2018 10:37:40 -0800 Subject: [PATCH 10/32] Avoid crashing when a procedure input has an empty string (#2182) Fixes #1958 This will drop the input when it's in the empty string state. This causes the block to remove the input and re-add it when the text is reverted, but prevents the breakage. A followup fix should leave the input alone instead of removing it, but this works for now. --- blocks/procedures.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/blocks/procedures.js b/blocks/procedures.js index 0511ed232..7f6e0965f 100644 --- a/blocks/procedures.js +++ b/blocks/procedures.js @@ -159,7 +159,11 @@ Blockly.Blocks['procedures_defnoreturn'] = { this.arguments_.push(varName); var variable = Blockly.Variables.getOrCreateVariablePackage( this.workspace, varId, varName, ''); - this.argumentVarModels_.push(variable); + if (variable != null) { + this.argumentVarModels_.push(variable); + } else { + console.log('Failed to create a variable with name ' + varName + ', ignoring.'); + } } } this.updateParams_(); @@ -216,7 +220,12 @@ Blockly.Blocks['procedures_defnoreturn'] = { var varName = paramBlock.getFieldValue('NAME'); this.arguments_.push(varName); var variable = this.workspace.getVariable(varName, ''); - this.argumentVarModels_.push(variable); + if (variable != null) { + this.argumentVarModels_.push(variable); + } else { + console.log('Failed to get variable named ' + varName + ', ignoring.'); + } + this.paramIds_.push(paramBlock.id); paramBlock = paramBlock.nextConnection && paramBlock.nextConnection.targetBlock(); From 738d06a4640474aec50bca7789d534c6e9768b31 Mon Sep 17 00:00:00 2001 From: Erik Pasternak Date: Tue, 18 Dec 2018 11:52:43 -0800 Subject: [PATCH 11/32] Avoid crashing when a procedure input has an empty string Fixes #1958 This will drop the input when it's in the empty string state. This causes the block to remove the input and re-add it when the text is reverted, but prevents the breakage. A followup fix should leave the input alone instead of removing it, but this works for now. --- blocks/procedures.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/blocks/procedures.js b/blocks/procedures.js index 0511ed232..7f6e0965f 100644 --- a/blocks/procedures.js +++ b/blocks/procedures.js @@ -159,7 +159,11 @@ Blockly.Blocks['procedures_defnoreturn'] = { this.arguments_.push(varName); var variable = Blockly.Variables.getOrCreateVariablePackage( this.workspace, varId, varName, ''); - this.argumentVarModels_.push(variable); + if (variable != null) { + this.argumentVarModels_.push(variable); + } else { + console.log('Failed to create a variable with name ' + varName + ', ignoring.'); + } } } this.updateParams_(); @@ -216,7 +220,12 @@ Blockly.Blocks['procedures_defnoreturn'] = { var varName = paramBlock.getFieldValue('NAME'); this.arguments_.push(varName); var variable = this.workspace.getVariable(varName, ''); - this.argumentVarModels_.push(variable); + if (variable != null) { + this.argumentVarModels_.push(variable); + } else { + console.log('Failed to get variable named ' + varName + ', ignoring.'); + } + this.paramIds_.push(paramBlock.id); paramBlock = paramBlock.nextConnection && paramBlock.nextConnection.targetBlock(); From 036790e4fba5a72e08d7f5491af4ce42896eaba6 Mon Sep 17 00:00:00 2001 From: Sandeep Dubey Date: Thu, 20 Dec 2018 02:07:15 +0530 Subject: [PATCH 12/32] Added message for running local_build.sh from correct folder. --- local_build/local_build.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/local_build/local_build.sh b/local_build/local_build.sh index c5122036c..2355555db 100755 --- a/local_build/local_build.sh +++ b/local_build/local_build.sh @@ -20,7 +20,7 @@ # # Usage: local_build.sh. # -# This script generates only local_blockly_compressed.js. You may modify it as +# This script generates only local_blockly_compressed.js. You may modify it as # needed to build other files. # # The compressed file is a concatenation of all of Blockly's core files, run @@ -33,6 +33,16 @@ # - Add a good error message if multiple versions of the closure compiler were # found. +# Note that the root folder MUST be named 'local_build'. + +EXPECTED_PWD='local_build' +if [[ ${PWD##*/} != $EXPECTED_PWD ]]; then + echo "" + echo " WARNING This script should be run from the blockly/local_build folder." + echo "" + exit 1 +fi + # Find the Closure Compiler. if [ -f "$(npm root)/google-closure-compiler/compiler.jar" ]; then COMPILER="$(npm root)/google-closure-compiler/compiler.jar" From 1ed809dc87388b42671043c8cbfe63cfc0879b2c Mon Sep 17 00:00:00 2001 From: Sandeep Dubey Date: Thu, 20 Dec 2018 02:18:57 +0530 Subject: [PATCH 13/32] Changes in comment. --- local_build/local_build.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/local_build/local_build.sh b/local_build/local_build.sh index 2355555db..4336d3a10 100755 --- a/local_build/local_build.sh +++ b/local_build/local_build.sh @@ -33,12 +33,11 @@ # - Add a good error message if multiple versions of the closure compiler were # found. -# Note that the root folder MUST be named 'local_build'. - EXPECTED_PWD='local_build' +# Check the current working directory. if [[ ${PWD##*/} != $EXPECTED_PWD ]]; then echo "" - echo " WARNING This script should be run from the blockly/local_build folder." + echo " WARNING This script should be run from the local_build folder." echo "" exit 1 fi From c042a94b2d773c2cd0297cda836b051a319f482f Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Wed, 19 Dec 2018 14:28:36 -0800 Subject: [PATCH 14/32] Rebuild blocks_compressed --- blocks_compressed.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/blocks_compressed.js b/blocks_compressed.js index 00841fb90..b05fd9508 100644 --- a/blocks_compressed.js +++ b/blocks_compressed.js @@ -92,13 +92,14 @@ Blockly.Blocks.procedures_defnoreturn={init:function(){var a=new Blockly.FieldTe this.setColour(Blockly.Msg.PROCEDURES_HUE);this.setTooltip(Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP);this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL);this.arguments_=[];this.argumentVarModels_=[];this.setStatements_(!0);this.statementConnection_=null},setStatements_:function(a){this.hasStatements_!==a&&(a?(this.appendStatementInput("STACK").appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_DO),this.getInput("RETURN")&&this.moveInputBefore("STACK","RETURN")):this.removeInput("STACK",!0), this.hasStatements_=a)},updateParams_:function(){for(var a=!1,b={},c=0;c Date: Wed, 19 Dec 2018 14:29:54 -0800 Subject: [PATCH 15/32] Bump version number on master --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 777792cee..b1d5b5cdd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blockly", - "version": "1.20181214.0", + "version": "1.20181219.0", "description": "Blockly is a library for building visual programming editors.", "main": "blockly_node_javascript_en.js", "keywords": [ From 6fefa49112a243b69ba07c3ee8b7637e61ffa8f2 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Wed, 19 Dec 2018 16:55:58 -0800 Subject: [PATCH 16/32] Bump version number on develop --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b1d5b5cdd..469be7a6c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blockly", - "version": "1.20181219.0", + "version": "1.20181219.0-develop", "description": "Blockly is a library for building visual programming editors.", "main": "blockly_node_javascript_en.js", "keywords": [ From 96e754cf36c4be2d710063ccfed2fd6d29ae0aee Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Wed, 19 Dec 2018 18:10:57 -0800 Subject: [PATCH 17/32] Updated Comments. --- core/trashcan.js | 11 +++++++---- core/zoom_controls.js | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/core/trashcan.js b/core/trashcan.js index 50732ec9c..340500ba6 100644 --- a/core/trashcan.js +++ b/core/trashcan.js @@ -265,10 +265,10 @@ Blockly.Trashcan.prototype.createDom = function() { /** * Initialize the trash can. - * @param {number} verticalSpacing Vertical distance workspace edge to the same - * edge of the trashcan. + * @param {number} verticalSpacing Vertical distance from workspace edge to the + * same edge of the trashcan. * @return {number} Vertical distance from workspace edge to the opposite - * edge of the trashcan. + * edge of the trashcan. */ Blockly.Trashcan.prototype.init = function(verticalSpacing) { if (this.workspace_.options.maxTrashcanContents > 0) { @@ -297,7 +297,10 @@ Blockly.Trashcan.prototype.dispose = function() { }; /** - * Move the trash can to the bottom-right corner. + * Position the trashcan. + * It is positioned in the upper corner when the toolbox is on bottom, and the + * bottom corner for all other toolbox positions. It is on the right in LTR, + * and left in RTL. */ Blockly.Trashcan.prototype.position = function() { // Not yet initialized. diff --git a/core/zoom_controls.js b/core/zoom_controls.js index 19995be1d..b204fd586 100644 --- a/core/zoom_controls.js +++ b/core/zoom_controls.js @@ -109,9 +109,9 @@ Blockly.ZoomControls.prototype.createDom = function() { /** * Initialize the zoom controls. * @param {number} verticalSpacing Vertical distances from workspace edge to the - * same edge of the controls. + * same edge of the controls. * @return {number} Vertical distance from workspace edge to the opposite - * edge of the controls. + * edge of the controls. */ Blockly.ZoomControls.prototype.init = function(verticalSpacing) { this.verticalSpacing_ = this.MARGIN_BOTTOM_ + verticalSpacing; From ab84d5fb77ae0bdc512f40be2c0f34e2a465cddf Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Wed, 26 Dec 2018 11:50:36 -0800 Subject: [PATCH 18/32] Fixed scrolling horizontal flyouts with mousewheel. --- core/flyout_horizontal.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/flyout_horizontal.js b/core/flyout_horizontal.js index 3129e5386..e5e502a24 100644 --- a/core/flyout_horizontal.js +++ b/core/flyout_horizontal.js @@ -217,7 +217,7 @@ Blockly.HorizontalFlyout.prototype.scrollToStart = function() { * @private */ Blockly.HorizontalFlyout.prototype.wheel_ = function(e) { - var delta = e.deltaX; + var delta = e.deltaX || e.deltaY; if (delta) { // Firefox's mouse wheel deltas are a tenth that of Chrome/Safari. @@ -225,7 +225,6 @@ Blockly.HorizontalFlyout.prototype.wheel_ = function(e) { if (goog.userAgent.GECKO && (e.deltaMode === 1)) { delta *= 10; } - // TODO: #1093 var metrics = this.getMetrics_(); var pos = metrics.viewLeft + delta; var limit = metrics.contentWidth - metrics.viewWidth; From 46545e56910c97a6afe87db494b5656a10c4cc0a Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Wed, 26 Dec 2018 12:45:22 -0800 Subject: [PATCH 19/32] Changed callback to be looked up dynamically when the button is clicked. --- core/flyout_button.js | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/core/flyout_button.js b/core/flyout_button.js index c81e86ed2..4cd12fab9 100644 --- a/core/flyout_button.js +++ b/core/flyout_button.js @@ -75,21 +75,11 @@ Blockly.FlyoutButton = function(workspace, targetWorkspace, xml, isLabel) { this.isLabel_ = isLabel; /** - * Function to call when this button is clicked. - * @type {function(!Blockly.FlyoutButton)} + * The key to the function called when this button is clicked. + * @type {string} * @private */ - this.callback_ = null; - - var callbackKey = xml.getAttribute('callbackKey'); - if (this.isLabel_ && callbackKey) { - console.warn('Labels should not have callbacks. Label text: ' + this.text_); - } else if (!this.isLabel_ && - !(callbackKey && targetWorkspace.getButtonCallback(callbackKey))) { - console.warn('Buttons should have callbacks. Button text: ' + this.text_); - } else { - this.callback_ = targetWorkspace.getButtonCallback(callbackKey); - } + this.callbackKey_ = xml.getAttribute('callbackKey'); /** * If specified, a CSS class to add to this button. @@ -257,8 +247,12 @@ Blockly.FlyoutButton.prototype.onMouseUp_ = function(e) { gesture.cancel(); } - // Call the callback registered to this button. - if (this.callback_) { - this.callback_(this); + if (this.isLabel_ && this.callbackKey_) { + console.warn('Labels should not have callbacks. Label text: ' + this.text_); + } else if (!this.isLabel_ && !(this.callbackKey_ && + this.targetWorkspace_.getButtonCallback(this.callbackKey_))) { + console.warn('Buttons should have callbacks. Button text: ' + this.text_); + } else if (!this.isLabel_) { + this.targetWorkspace_.getButtonCallback(this.callbackKey_)(this); } }; From faf577d1c19ea3d032a8cf7a667c069af95c557a Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 27 Dec 2018 10:45:13 +0100 Subject: [PATCH 20/32] Localisation updates from https://translatewiki.net. --- msg/json/is.json | 4 +++- msg/json/nl.json | 5 ++++- msg/json/vi.json | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/msg/json/is.json b/msg/json/is.json index 7197c2b9b..cbcd2adf1 100644 --- a/msg/json/is.json +++ b/msg/json/is.json @@ -13,6 +13,7 @@ "DUPLICATE_BLOCK": "Afrita", "ADD_COMMENT": "Skrifa skýringu", "REMOVE_COMMENT": "Fjarlægja skýringu", + "DUPLICATE_COMMENT": "Tvítaka athugasemd", "EXTERNAL_INPUTS": "Ytri inntök", "INLINE_INPUTS": "Innri inntök", "DELETE_BLOCK": "Eyða kubbi", @@ -368,5 +369,6 @@ "PROCEDURES_CREATE_DO": "Búa til '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Ef gildi er satt, skal skila öðru gildi.", "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", - "PROCEDURES_IFRETURN_WARNING": "Aðvörun: Þennan kubb má aðeins nota í skilgreiningu falls." + "PROCEDURES_IFRETURN_WARNING": "Aðvörun: Þennan kubb má aðeins nota í skilgreiningu falls.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Segðu eitthvað..." } diff --git a/msg/json/nl.json b/msg/json/nl.json index a172a8764..64949977f 100644 --- a/msg/json/nl.json +++ b/msg/json/nl.json @@ -13,7 +13,8 @@ "Festina90", "Optilete", "Patio", - "KlaasZ4usV" + "KlaasZ4usV", + "Marcelhospers" ] }, "VARIABLES_DEFAULT_NAME": "item", @@ -219,6 +220,8 @@ "MATH_RANDOM_FLOAT_HELPURL": "https://nl.wikipedia.org/wiki/Toevalsgenerator", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "willekeurige fractie", "MATH_RANDOM_FLOAT_TOOLTIP": "Geeft een willekeurige fractie tussen 0.0 (inclusief) en 1.0 (exclusief).", + "MATH_ATAN2_TITLE": "atan2 van X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Geef de boogtangens van punt (X, Y) terug in graden tussen -180 naar 180.", "TEXT_TEXT_HELPURL": "https://nl.wikipedia.org/wiki/String_%28informatica%29", "TEXT_TEXT_TOOLTIP": "Een letter, woord of een regel tekst.", "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", diff --git a/msg/json/vi.json b/msg/json/vi.json index 8308726e8..758f0d112 100644 --- a/msg/json/vi.json +++ b/msg/json/vi.json @@ -34,7 +34,7 @@ "REDO": "Làm lại", "CHANGE_VALUE_TITLE": "Thay giá trị thành:", "RENAME_VARIABLE": "Thay tên biến...", - "RENAME_VARIABLE_TITLE": "Thay tên tất cả \"%1\" biến này thành:", + "RENAME_VARIABLE_TITLE": "Thay tên tất cả các biến \"%1\" thành:", "NEW_VARIABLE": "Tạo biến...", "NEW_STRING_VARIABLE": "Tạo một giá trị dạng chuỗi...", "NEW_NUMBER_VARIABLE": "Tạo một giá trị số...", From 4cc3708f0a650f80defaddb35e55e15b359c83cd Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 7 Jan 2019 10:03:25 +0100 Subject: [PATCH 21/32] Localisation updates from https://translatewiki.net. --- msg/json/hy.json | 18 +++++++++--------- msg/json/sr.json | 24 ++++++++++++------------ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/msg/json/hy.json b/msg/json/hy.json index b54e1524a..4edfc89c6 100644 --- a/msg/json/hy.json +++ b/msg/json/hy.json @@ -79,7 +79,7 @@ "CONTROLS_IF_TOOLTIP_4": "Եթե առաջին պայմանը ճշմարիտ է, ապա կատարում է հրահանգների առաջին բլոկը: Հակառակ դեպքում, եթե երկրորդ պայմանն է ճշմարիտ, կատարում է հրահանգների երկրորդ բլոկը: Եթե պայմաններից ոչ մեկը ճշմարիտ չեն, ապա կատարում է հրահանգների վերջին բլոկը:", "CONTROLS_IF_MSG_IF": "եթե", "CONTROLS_IF_MSG_ELSEIF": "հակառակ դեպքում, եթե", - "CONTROLS_IF_MSG_ELSE": "նաև", + "CONTROLS_IF_MSG_ELSE": "հակառակ դեպքում", "CONTROLS_IF_IF_TOOLTIP": "Ավելացնել, հեռացնել կամ փոխել հերթականությունը այս \"եթե\" բլոկը վերակարգավորելու համար։", "CONTROLS_IF_ELSEIF_TOOLTIP": "Ավելացնում է պայման «եթե» բլոկին:", "CONTROLS_IF_ELSE_TOOLTIP": "Ավելացնել վերջնական ենթաբլոկ (այն կաշխատի, եթե բոլոր պայմանները կեղծ են)", @@ -144,7 +144,7 @@ "MATH_TRIG_TOOLTIP_ACOS": "Վերադարձնում է թվի արկկոսինուսը:", "MATH_TRIG_TOOLTIP_ATAN": "Վերադարձնում է թվի արկտանգենսը:", "MATH_CONSTANT_HELPURL": "https://hy.wikipedia.org/wiki/Մաթեմատիկական_հաստատուն", - "MATH_CONSTANT_TOOLTIP": "Վերադարձնում է ընդհանուր հաստատուններից մեկը. π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), կամ ∞ (անվերջություն):", + "MATH_CONSTANT_TOOLTIP": "Վերադարձնում է տարածված հաստատուններից մեկը՝ π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), կամ ∞ (անվերջություն):", "MATH_IS_EVEN": "զույգ է", "MATH_IS_ODD": "կենտ է", "MATH_IS_PRIME": "պարզ է", @@ -247,7 +247,7 @@ "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Ավելացնել տարր ցանկին:", "LISTS_REPEAT_TOOLTIP": "Տրված արժեքը նշված քանակով կրկնելու միջոցով, ստեղծում է ցանկ։", "LISTS_REPEAT_TITLE": "ստեղծել ցանկ, %1 արժեքը կրկնելով %2 անգամ", - "LISTS_LENGTH_TITLE": "երկարությունը %1", + "LISTS_LENGTH_TITLE": "%1֊ի երկարությունը", "LISTS_LENGTH_TOOLTIP": "Վերադարձնում է ցանկի երկարությունը:", "LISTS_ISEMPTY_TITLE": "%1 դատարկ է", "LISTS_ISEMPTY_TOOLTIP": "Վերադարձնում է \"ճշմարիտ\" եթե ցանկը դատարկ է։", @@ -296,13 +296,13 @@ "LISTS_GET_SUBLIST_TOOLTIP": "Ստեղծում է ցանկի նշված մասի պատճենը։", "LISTS_SORT_TITLE": "դասավորել %1 %2 %3", "LISTS_SORT_TOOLTIP": "Դասավորում է ցանկի պատճենը", - "LISTS_SORT_ORDER_ASCENDING": "աճման", - "LISTS_SORT_ORDER_DESCENDING": "նվազման", - "LISTS_SORT_TYPE_NUMERIC": "թվային", - "LISTS_SORT_TYPE_TEXT": "այբբենական", + "LISTS_SORT_ORDER_ASCENDING": "աճման կարգ", + "LISTS_SORT_ORDER_DESCENDING": "նվազման կարգ", + "LISTS_SORT_TYPE_NUMERIC": "թվային կարգ", + "LISTS_SORT_TYPE_TEXT": "այբբենական կարգ", "LISTS_SORT_TYPE_IGNORECASE": "այբենական, անտեսել ռեգիստրը", - "LISTS_SPLIT_LIST_FROM_TEXT": "պատրաստել ցանկ տեքստից", - "LISTS_SPLIT_TEXT_FROM_LIST": "պատրաստել տեքստ ցանկից", + "LISTS_SPLIT_LIST_FROM_TEXT": "ստեղծել ցանկ տեքստից", + "LISTS_SPLIT_TEXT_FROM_LIST": "ստեղծել տեքստ ցանկից", "LISTS_SPLIT_WITH_DELIMITER": "բաժանարարով", "LISTS_SPLIT_TOOLTIP_SPLIT": "Տեքստը վեր է ածվում ցանկի, նշված բաժանարարով։", "LISTS_SPLIT_TOOLTIP_JOIN": "Ցանկից ստեղծվում է միացյալ տեքստ, ցանկի անդամները միացվում են բաժանարարներով։", diff --git a/msg/json/sr.json b/msg/json/sr.json index df7d2a304..1dea9cef4 100644 --- a/msg/json/sr.json +++ b/msg/json/sr.json @@ -174,7 +174,7 @@ "MATH_IS_TOOLTIP": "Проверава да ли је број паран, непаран, прост, цео, позитиван, негативан, или дељив са одређеним бројем. Враћа „тачно” или „нетачно”.", "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "промени %1 за %2", - "MATH_CHANGE_TOOLTIP": "Додајте број променљивој „%1“.", + "MATH_CHANGE_TOOLTIP": "Додаје број променљивој „%1”.", "MATH_ROUND_HELPURL": "https://sr.wikipedia.org/wiki/Заокруживање", "MATH_ROUND_TOOLTIP": "Заокружује број на већу или мању вредност.", "MATH_ROUND_OPERATOR_ROUND": "заокружи", @@ -188,11 +188,11 @@ "MATH_ONLIST_OPERATOR_MAX": "макс. списка", "MATH_ONLIST_TOOLTIP_MAX": "Враћа највећи број са списка.", "MATH_ONLIST_OPERATOR_AVERAGE": "просек списка", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Враћа просек (аритметичка средина) бројчаних вредности са списка.", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Враћа просек (аритметичку средину) бројева са списка.", "MATH_ONLIST_OPERATOR_MEDIAN": "медијана списка", "MATH_ONLIST_TOOLTIP_MEDIAN": "Враћа медијану са списка.", "MATH_ONLIST_OPERATOR_MODE": "модус списка", - "MATH_ONLIST_TOOLTIP_MODE": "Враћа слисак најчешће(их) ставке(и) са списка.", + "MATH_ONLIST_TOOLTIP_MODE": "Враћа списак најчешћих ставки на списку.", "MATH_ONLIST_OPERATOR_STD_DEV": "стандардна девијација списка", "MATH_ONLIST_TOOLTIP_STD_DEV": "Враћа стандардну девијацију списка.", "MATH_ONLIST_OPERATOR_RANDOM": "случајна ставка списка", @@ -219,7 +219,7 @@ "TEXT_CREATE_JOIN_TOOLTIP": "Додај, уклони, или другачије поредај одјелке како би изнова поставили овај текст блок.", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Додајте ставку у текст.", "TEXT_APPEND_TITLE": "на %1 додај текст %2", - "TEXT_APPEND_TOOLTIP": "Додаје текст на променљиву „%1“.", + "TEXT_APPEND_TOOLTIP": "Додаје текст променљивој „%1”.", "TEXT_LENGTH_TITLE": "дужина текста %1", "TEXT_LENGTH_TOOLTIP": "Враћа број слова (уклјучујући размаке) у датом тексту.", "TEXT_ISEMPTY_TITLE": "%1 је празан", @@ -346,10 +346,10 @@ "LISTS_REVERSE_TOOLTIP": "Обрни копију списка.", "ORDINAL_NUMBER_SUFFIX": "", "VARIABLES_GET_TOOLTIP": "Враћа вредност ове променљиве.", - "VARIABLES_GET_CREATE_SET": "Направи „постави %1“", + "VARIABLES_GET_CREATE_SET": "Направи блок за доделу вредности %1", "VARIABLES_SET": "постави %1 у %2", "VARIABLES_SET_TOOLTIP": "Поставља променљиву тако да буде једнака улазу.", - "VARIABLES_SET_CREATE_GET": "Направи „преузми %1“", + "VARIABLES_SET_CREATE_GET": "Направи блок за преузимање вредности из „%1”", "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFNORETURN_TITLE": "до", "PROCEDURES_DEFNORETURN_PROCEDURE": "урадите нешто", @@ -362,18 +362,18 @@ "PROCEDURES_DEFRETURN_RETURN": "врати", "PROCEDURES_DEFRETURN_TOOLTIP": "Прави функцију са излазом.", "PROCEDURES_ALLOW_STATEMENTS": "дозволи изјаве", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Упозорење: Ова функција има дуплиране параметаре.", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Упозорење: Ова функција има дуплиране параметре.", "PROCEDURES_CALLNORETURN_HELPURL": "https://sr.wikipedia.org/wiki/Потпрограм", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Покрените кориснички дефинисану функцију „%1”.", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Покреће кориснички дефинисану функцију „%1”.", "PROCEDURES_CALLRETURN_HELPURL": "https://sr.wikipedia.org/wiki/Потпрограм", - "PROCEDURES_CALLRETURN_TOOLTIP": "Покрените кориснички дефинисану функцију „%1” и користите њен излаз.", + "PROCEDURES_CALLRETURN_TOOLTIP": "Покреће кориснички дефинисану функцију „%1” и користи њен излаз.", "PROCEDURES_MUTATORCONTAINER_TITLE": "улази", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Додајте, уклоните или преуредите уносе за ову функцију.", - "PROCEDURES_MUTATORARG_TITLE": "име уноса:", + "PROCEDURES_MUTATORARG_TITLE": "име параметра:", "PROCEDURES_MUTATORARG_TOOLTIP": "Додајте улазни параметар финкцији.", "PROCEDURES_HIGHLIGHT_DEF": "Истакни дефиницију функције", - "PROCEDURES_CREATE_DO": "Направи „%1“", - "PROCEDURES_IFRETURN_TOOLTIP": "Ако је вредност „тачно“, онда врати другу вредност.", + "PROCEDURES_CREATE_DO": "Направи „%1”", + "PROCEDURES_IFRETURN_TOOLTIP": "Ако је прва вредност тачна, враћа другу вредност.", "PROCEDURES_IFRETURN_WARNING": "Упозорење: Овај блок се може користити једино унутар дефиниције функције.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Кажите нешто…" } From 7c619a1dba4e22e7d26562dddac28a7ca16867cb Mon Sep 17 00:00:00 2001 From: Noah Glaser Date: Mon, 7 Jan 2019 12:44:01 -0800 Subject: [PATCH 22/32] Prevent duplicate parameters in functions (#2177) Prevents the coder from using duplicate parameters names in functions. In the validator function check for parameter names that have been used. If it finds a block with a name that matches return null so that it will revert the change. Also change the name each time a new parameter is created to try to prevent duplicate name. --- blocks/procedures.js | 91 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 16 deletions(-) diff --git a/blocks/procedures.js b/blocks/procedures.js index 7f6e0965f..a8b15604b 100644 --- a/blocks/procedures.js +++ b/blocks/procedures.js @@ -80,26 +80,11 @@ Blockly.Blocks['procedures_defnoreturn'] = { }, /** * Update the display of parameters for this procedure definition block. - * Display a warning if there are duplicately named parameters. * @private * @this Blockly.Block */ updateParams_: function() { - // Check for duplicated arguments. - var badArg = false; - var hash = {}; - for (var i = 0; i < this.arguments_.length; i++) { - if (hash['arg_' + this.arguments_[i].toLowerCase()]) { - badArg = true; - break; - } - hash['arg_' + this.arguments_[i].toLowerCase()] = true; - } - if (badArg) { - this.setWarningText(Blockly.Msg['PROCEDURES_DEF_DUPLICATE_WARNING']); - } else { - this.setWarningText(null); - } + // Merge the arguments into a human-readable list. var paramString = ''; if (this.arguments_.length) { @@ -474,9 +459,72 @@ Blockly.Blocks['procedures_mutatorcontainer'] = { this.setColour(Blockly.Msg['PROCEDURES_HUE']); this.setTooltip(Blockly.Msg['PROCEDURES_MUTATORCONTAINER_TOOLTIP']); this.contextMenu = false; + }, + /** + * This will create & delete variables and in dialogs workspace to ensure + * that when a new block is dragged out it will have a unique parameter name. + * @param {!Blockly.Events.Abstract} event Change event. + * @this Blockly.Block + */ + onchange: function(event) { + if (!this.workspace || this.workspace.isFlyout || + (event.type != Blockly.Events.BLOCK_DELETE && event.type != Blockly.Events.BLOCK_CREATE)) { + return; + } + var blocks = this.workspace.getAllBlocks(); + var allVariables = this.workspace.getAllVariables(); + if (event.type == Blockly.Events.BLOCK_DELETE) { + var variableNamesToKeep = []; + for (var i = 0; i < blocks.length; i += 1) { + if (blocks[i].getFieldValue('NAME')) { + variableNamesToKeep.push(blocks[i].getFieldValue('NAME')); + } + } + for (var k = 0; k < allVariables.length; k += 1) { + if (variableNamesToKeep.indexOf(allVariables[k].name) == -1) { + this.workspace.deleteVariableById(allVariables[k].getId()); + } + } + return; + } + + if (event.type != Blockly.Events.BLOCK_CREATE) { + return; + } + + var block = this.workspace.getBlockById(event.blockId); + // This is to handle the one none variable block + // Happens when all the blocks are regenerated + if (!block.getField('NAME')) { + return; + } + var varName = block.getFieldValue('NAME'); + var variable = this.workspace.getVariable(varName); + + if (!variable) { + // This means the parameter name is not in use and we can create the variable. + variable = this.workspace.createVariable(varName); + } + // If the blocks are connected we don't have to check duplicate variables + // This only happens if the dialog box is open + if (block.previousConnection.isConnected() || block.nextConnection.isConnected()) { + return; + } + + for (var j = 0; j < blocks.length; j += 1) { + // filter block that was created + if (block.id != blocks[j].id && blocks[j].getFieldValue('NAME') == variable.name) { + // generate new name and set name field + varName = Blockly.Variables.generateUniqueName(this.workspace); + variable = this.workspace.createVariable(varName); + block.setFieldValue(variable.name, 'NAME'); + return; + } + } } }; + Blockly.Blocks['procedures_mutatorarg'] = { /** * Mutator block for procedure argument. @@ -510,6 +558,7 @@ Blockly.Blocks['procedures_mutatorarg'] = { field.createdVariables_ = []; field.onFinishEditing_('x'); }, + /** * Obtain a valid name for the procedure argument. Create a variable if * necessary. @@ -526,6 +575,16 @@ Blockly.Blocks['procedures_mutatorarg'] = { if (!varName) { return null; } + // Prevents duplicate parameter names in functions + var blocks = this.sourceBlock_.workspace.getAllBlocks(); + for (var i = 0; i < blocks.length; i += 1) { + if (blocks[i].id == this.sourceBlock_.id) { + continue; + } + if (blocks[i].getFieldValue('NAME') == varName) { + return null; + } + } var model = outerWs.getVariable(varName, ''); if (model && model.name != varName) { // Rename the variable (case change) From d2277f0c4bb5f07ba3e92e9c54955edc16a83607 Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Mon, 7 Jan 2019 16:04:10 -0800 Subject: [PATCH 23/32] Updated createZoomSVG comments. --- core/zoom_controls.js | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/core/zoom_controls.js b/core/zoom_controls.js index b204fd586..5ba858a37 100644 --- a/core/zoom_controls.js +++ b/core/zoom_controls.js @@ -183,14 +183,14 @@ Blockly.ZoomControls.prototype.position = function() { * @private */ Blockly.ZoomControls.prototype.createZoomOutSvg_ = function(rnd) { - /* This markup will be generated and added to the "blocklyZoom" group: - - - - - + + - + */ var ws = this.workspace_; this.zoomOutGroup_ = Blockly.utils.createSvgElement('g', @@ -236,16 +236,15 @@ Blockly.ZoomControls.prototype.createZoomOutSvg_ = function(rnd) { * @private */ Blockly.ZoomControls.prototype.createZoomInSvg_ = function(rnd) { - /* This markup will be generated and added to the "blocklyZoom" group: - - - - - + + + + - + */ - var ws = this.workspace_; this.zoomInGroup_ = Blockly.utils.createSvgElement('g', {'class': 'blocklyZoom'}, this.svgGroup_); @@ -290,14 +289,14 @@ Blockly.ZoomControls.prototype.createZoomInSvg_ = function(rnd) { * @private */ Blockly.ZoomControls.prototype.createZoomResetSvg_ = function(rnd) { - /* This markup will be generated and added to the "blocklyZoom" group: - - + /* This markup will be generated and added to the .svgGroup_: + + - - + - + */ var ws = this.workspace_; this.zoomResetGroup_ = Blockly.utils.createSvgElement('g', From d95f56f5467200a1e7e7e30c286e36508aacb082 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Tue, 8 Jan 2019 11:19:54 -0800 Subject: [PATCH 24/32] Enable insertion markers --- blockly_uncompressed.js | 2 +- core/block_dragger.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/blockly_uncompressed.js b/blockly_uncompressed.js index 7ace53c59..e64b8c588 100644 --- a/blockly_uncompressed.js +++ b/blockly_uncompressed.js @@ -37,7 +37,7 @@ this.BLOCKLY_BOOT = function(root) { goog.addDependency("../../../" + dir + "/core/block.js", ['Blockly.Block'], ['Blockly.Blocks', 'Blockly.Comment', 'Blockly.Connection', 'Blockly.Events.BlockChange', 'Blockly.Events.BlockCreate', 'Blockly.Events.BlockDelete', 'Blockly.Events.BlockMove', 'Blockly.Extensions', 'Blockly.Input', 'Blockly.Mutator', 'Blockly.utils', 'Blockly.Warning', 'Blockly.Workspace', 'goog.math.Coordinate']); goog.addDependency("../../../" + dir + "/core/block_animations.js", ['Blockly.BlockAnimations'], ['Blockly.utils']); goog.addDependency("../../../" + dir + "/core/block_drag_surface.js", ['Blockly.BlockDragSurfaceSvg'], ['Blockly.utils', 'goog.math.Coordinate']); -goog.addDependency("../../../" + dir + "/core/block_dragger.js", ['Blockly.BlockDragger'], ['Blockly.BlockAnimations', 'Blockly.DraggedConnectionManager', 'Blockly.Events.BlockMove', 'goog.math.Coordinate']); +goog.addDependency("../../../" + dir + "/core/block_dragger.js", ['Blockly.BlockDragger'], ['Blockly.BlockAnimations', 'Blockly.InsertionMarkerManager', 'Blockly.Events.BlockMove', 'goog.math.Coordinate']); goog.addDependency("../../../" + dir + "/core/block_events.js", ['Blockly.Events.BlockBase', 'Blockly.Events.BlockChange', 'Blockly.Events.BlockCreate', 'Blockly.Events.BlockDelete', 'Blockly.Events.BlockMove', 'Blockly.Events.Change', 'Blockly.Events.Create', 'Blockly.Events.Delete', 'Blockly.Events.Move'], ['Blockly.Events', 'Blockly.Events.Abstract', 'Blockly.Xml.utils', 'goog.math.Coordinate']); goog.addDependency("../../../" + dir + "/core/block_render_svg.js", ['Blockly.BlockSvg.render'], ['Blockly.BlockSvg']); goog.addDependency("../../../" + dir + "/core/block_svg.js", ['Blockly.BlockSvg'], ['Blockly.Block', 'Blockly.BlockAnimations', 'Blockly.ContextMenu', 'Blockly.Events.Ui', 'Blockly.Events.BlockMove', 'Blockly.Grid', 'Blockly.RenderedConnection', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.utils', 'goog.color', 'goog.math.Coordinate']); diff --git a/core/block_dragger.js b/core/block_dragger.js index ffd8f8754..47624a335 100644 --- a/core/block_dragger.js +++ b/core/block_dragger.js @@ -27,7 +27,7 @@ goog.provide('Blockly.BlockDragger'); goog.require('Blockly.BlockAnimations'); -goog.require('Blockly.DraggedConnectionManager'); +goog.require('Blockly.InsertionMarkerManager'); goog.require('Blockly.Events.BlockMove'); goog.require('goog.math.Coordinate'); @@ -57,10 +57,10 @@ Blockly.BlockDragger = function(block, workspace) { /** * Object that keeps track of connections on dragged blocks. - * @type {!Blockly.DraggedConnectionManager} + * @type {!Blockly.InsertionMarkerManager} * @private */ - this.draggedConnectionManager_ = new Blockly.DraggedConnectionManager( + this.draggedConnectionManager_ = new Blockly.InsertionMarkerManager( this.draggingBlock_); /** From 376bed8c466c7ef6bc7cf5e92ce2ca869c7fc711 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Tue, 27 Nov 2018 12:56:53 -0800 Subject: [PATCH 25/32] First pass at creating mocha tests --- package.json | 3 +- tests/mocha/index.html | 26 ++++ tests/mocha/mocha.opts | 3 + tests/mocha/utils_test.js | 267 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 298 insertions(+), 1 deletion(-) create mode 100644 tests/mocha/index.html create mode 100644 tests/mocha/mocha.opts create mode 100644 tests/mocha/utils_test.js diff --git a/package.json b/package.json index 469be7a6c..abda73acb 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "scripts": { "prepare": "gulp blockly_javascript_en", "lint": "eslint .", - "test": "tests/run_all_tests.sh" + "test": "mocha --opts tests/mocha/mocha.opts tests/mocha/*.js" }, "license": "Apache-2.0", "private": true, @@ -34,6 +34,7 @@ "gulp-series": "^1.0.2", "gulp-shell": "^0.6.5", "jshint": "^2.9.7", + "mocha": "^5.2.0", "webdriverio": "^4.14.1" }, "jshintConfig": { diff --git a/tests/mocha/index.html b/tests/mocha/index.html new file mode 100644 index 000000000..9b21c559e --- /dev/null +++ b/tests/mocha/index.html @@ -0,0 +1,26 @@ + + + + + Mocha Tests for Blockly + + + + + + +
+ + + + + + + + diff --git a/tests/mocha/mocha.opts b/tests/mocha/mocha.opts new file mode 100644 index 000000000..b0986b141 --- /dev/null +++ b/tests/mocha/mocha.opts @@ -0,0 +1,3 @@ +--ui tdd +--file ../blockly_uncompressed.js +--reporter landing diff --git a/tests/mocha/utils_test.js b/tests/mocha/utils_test.js new file mode 100644 index 000000000..7eeaae09d --- /dev/null +++ b/tests/mocha/utils_test.js @@ -0,0 +1,267 @@ +// var assert = require('assert'); +// describe('Array', function() { +// describe('#indexOf()', function() { +// it('should return -1 when the value is not present', function() { +// assert.equal([1,2,3].indexOf(4), -1); +// }); +// }); +// }); + + +suite('Utils', function() { + test('genUid', function() { + var uuids = {}; + chai.assert.equal([1,2,3].indexOf(4), -1); + for (var i = 0; i < 1000; i++) { + var uuid = Blockly.utils.genUid(); + chai.assert.isTrue(uuid in uuids, 'UUID different: ' + uuid); + uuids[uuid] = true; + } + }); + + + // function test_addClass() { + // var p = document.createElement('p'); + // Blockly.utils.addClass(p, 'one'); + // assertEquals('Adding "one"', 'one', p.className); + // Blockly.utils.addClass(p, 'one'); + // assertEquals('Adding duplicate "one"', 'one', p.className); + // Blockly.utils.addClass(p, 'two'); + // assertEquals('Adding "two"', 'one two', p.className); + // Blockly.utils.addClass(p, 'two'); + // assertEquals('Adding duplicate "two"', 'one two', p.className); + // Blockly.utils.addClass(p, 'three'); + // assertEquals('Adding "three"', 'one two three', p.className); + // } + + // function test_hasClass() { + // var p = document.createElement('p'); + // p.className = ' one three two three '; + // assertTrue('Has "one"', Blockly.utils.hasClass(p, 'one')); + // assertTrue('Has "two"', Blockly.utils.hasClass(p, 'two')); + // assertTrue('Has "three"', Blockly.utils.hasClass(p, 'three')); + // assertFalse('Has no "four"', Blockly.utils.hasClass(p, 'four')); + // assertFalse('Has no "t"', Blockly.utils.hasClass(p, 't')); + // } + + // function test_removeClass() { + // var p = document.createElement('p'); + // p.className = ' one three two three '; + // Blockly.utils.removeClass(p, 'two'); + // assertEquals('Removing "two"', 'one three three', p.className); + // Blockly.utils.removeClass(p, 'four'); + // assertEquals('Removing "four"', 'one three three', p.className); + // Blockly.utils.removeClass(p, 'three'); + // assertEquals('Removing "three"', 'one', p.className); + // Blockly.utils.removeClass(p, 'ne'); + // assertEquals('Removing "ne"', 'one', p.className); + // Blockly.utils.removeClass(p, 'one'); + // assertEquals('Removing "one"', '', p.className); + // Blockly.utils.removeClass(p, 'zero'); + // assertEquals('Removing "zero"', '', p.className); + // } + + // function test_shortestStringLength() { + // var len = Blockly.utils.shortestStringLength('one,two,three,four,five'.split(',')); + // assertEquals('Length of "one"', 3, len); + // len = Blockly.utils.shortestStringLength('one,two,three,four,five,'.split(',')); + // assertEquals('Length of ""', 0, len); + // len = Blockly.utils.shortestStringLength(['Hello World']); + // assertEquals('List of one', 11, len); + // len = Blockly.utils.shortestStringLength([]); + // assertEquals('Empty list', 0, len); + // } + + // function test_commonWordPrefix() { + // var len = Blockly.utils.commonWordPrefix('one,two,three,four,five'.split(',')); + // assertEquals('No prefix', 0, len); + // len = Blockly.utils.commonWordPrefix('Xone,Xtwo,Xthree,Xfour,Xfive'.split(',')); + // assertEquals('No word prefix', 0, len); + // len = Blockly.utils.commonWordPrefix('abc de,abc de,abc de,abc de'.split(',')); + // assertEquals('Full equality', 6, len); + // len = Blockly.utils.commonWordPrefix('abc deX,abc deY'.split(',')); + // assertEquals('One word prefix', 4, len); + // len = Blockly.utils.commonWordPrefix('abc de,abc deY'.split(',')); + // assertEquals('Overflow no', 4, len); + // len = Blockly.utils.commonWordPrefix('abc de,abc de Y'.split(',')); + // assertEquals('Overflow yes', 6, len); + // len = Blockly.utils.commonWordPrefix(['Hello World']); + // assertEquals('List of one', 11, len); + // len = Blockly.utils.commonWordPrefix([]); + // assertEquals('Empty list', 0, len); + // len = Blockly.utils.commonWordPrefix('turn left,turn right'.split(',')); + // assertEquals('No prefix due to &nbsp;', 0, len); + // len = Blockly.utils.commonWordPrefix('turn\u00A0left,turn\u00A0right'.split(',')); + // assertEquals('No prefix due to \\u00A0', 0, len); + // } + + // function test_commonWordSuffix() { + // var len = Blockly.utils.commonWordSuffix('one,two,three,four,five'.split(',')); + // assertEquals('No prefix', 0, len); + // len = Blockly.utils.commonWordSuffix('oneX,twoX,threeX,fourX,fiveX'.split(',')); + // assertEquals('No word prefix', 0, len); + // len = Blockly.utils.commonWordSuffix('abc de,abc de,abc de,abc de'.split(',')); + // assertEquals('Full equality', 6, len); + // len = Blockly.utils.commonWordSuffix('Xabc de,Yabc de'.split(',')); + // assertEquals('One word prefix', 3, len); + // len = Blockly.utils.commonWordSuffix('abc de,Yabc de'.split(',')); + // assertEquals('Overflow no', 3, len); + // len = Blockly.utils.commonWordSuffix('abc de,Y abc de'.split(',')); + // assertEquals('Overflow yes', 6, len); + // len = Blockly.utils.commonWordSuffix(['Hello World']); + // assertEquals('List of one', 11, len); + // len = Blockly.utils.commonWordSuffix([]); + // assertEquals('Empty list', 0, len); + // } + + // function test_tokenizeInterpolation() { + // var tokens = Blockly.utils.tokenizeInterpolation(''); + // assertArrayEquals('Null interpolation', [], tokens); + + // tokens = Blockly.utils.tokenizeInterpolation('Hello'); + // assertArrayEquals('No interpolation', ['Hello'], tokens); + + // tokens = Blockly.utils.tokenizeInterpolation('Hello%World'); + // assertArrayEquals('Unescaped %.', ['Hello%World'], tokens); + + // tokens = Blockly.utils.tokenizeInterpolation('Hello%%World'); + // assertArrayEquals('Escaped %.', ['Hello%World'], tokens); + + // tokens = Blockly.utils.tokenizeInterpolation('Hello %1 World'); + // assertArrayEquals('Interpolation.', ['Hello ', 1, ' World'], tokens); + + // tokens = Blockly.utils.tokenizeInterpolation('%123Hello%456World%789'); + // assertArrayEquals('Interpolations.', [123, 'Hello', 456, 'World', 789], tokens); + + // tokens = Blockly.utils.tokenizeInterpolation('%%%x%%0%00%01%'); + // assertArrayEquals('Torture interpolations.', ['%%x%0', 0, 1, '%'], tokens); + + // Blockly.Msg = Blockly.Msg || {}; + + // Blockly.Msg.STRING_REF = 'test string'; + // tokens = Blockly.utils.tokenizeInterpolation('%{bky_string_ref}'); + // assertArrayEquals('String table reference, lowercase', ['test string'], tokens); + // tokens = Blockly.utils.tokenizeInterpolation('%{BKY_STRING_REF}'); + // assertArrayEquals('String table reference, uppercase', ['test string'], tokens); + + // Blockly.Msg.WITH_PARAM = 'before %1 after'; + // tokens = Blockly.utils.tokenizeInterpolation('%{bky_with_param}'); + // assertArrayEquals('String table reference, with parameter', ['before ', 1, ' after'], tokens); + + // Blockly.Msg.RECURSE = 'before %{bky_string_ref} after'; + // tokens = Blockly.utils.tokenizeInterpolation('%{bky_recurse}'); + // assertArrayEquals('String table reference, with subreference', ['before test string after'], tokens); + + // // Error cases... + // tokens = Blockly.utils.tokenizeInterpolation('%{bky_undefined}'); + // assertArrayEquals('Undefined string table reference', ['%{bky_undefined}'], tokens); + + // Blockly.Msg['1'] = 'Will not match'; + // tokens = Blockly.utils.tokenizeInterpolation('before %{1} after'); + // assertArrayEquals('Invalid initial digit in string table reference', ['before %{1} after'], tokens); + + // Blockly.Msg['TWO WORDS'] = 'Will not match'; + // tokens = Blockly.utils.tokenizeInterpolation('before %{two words} after'); + // assertArrayEquals('Invalid character in string table reference: space', ['before %{two words} after'], tokens); + + // Blockly.Msg['TWO-WORDS'] = 'Will not match'; + // tokens = Blockly.utils.tokenizeInterpolation('before %{two-words} after'); + // assertArrayEquals('Invalid character in string table reference: dash', ['before %{two-words} after'], tokens); + + // Blockly.Msg['TWO.WORDS'] = 'Will not match'; + // tokens = Blockly.utils.tokenizeInterpolation('before %{two.words} after'); + // assertArrayEquals('Invalid character in string table reference: period', ['before %{two.words} after'], tokens); + + // Blockly.Msg['AB&C'] = 'Will not match'; + // tokens = Blockly.utils.tokenizeInterpolation('before %{ab&c} after'); + // assertArrayEquals('Invalid character in string table reference: &', ['before %{ab&c} after'], tokens); + + // Blockly.Msg['UNCLOSED'] = 'Will not match'; + // tokens = Blockly.utils.tokenizeInterpolation('before %{unclosed'); + // assertArrayEquals('String table reference, with parameter', ['before %{unclosed'], tokens); + // } + + // function test_replaceMessageReferences() { + // Blockly.Msg = Blockly.Msg || {}; + // Blockly.Msg.STRING_REF = 'test string'; + // Blockly.Msg.SUBREF = 'subref'; + // Blockly.Msg.STRING_REF_WITH_ARG = 'test %1 string'; + // Blockly.Msg.STRING_REF_WITH_SUBREF = 'test %{bky_subref} string'; + + // var resultString = Blockly.utils.replaceMessageReferences(''); + // assertEquals('Empty string produces empty string', '', resultString); + + // resultString = Blockly.utils.replaceMessageReferences('%%'); + // assertEquals('Escaped %', '%', resultString); + // resultString = Blockly.utils.replaceMessageReferences('%%{bky_string_ref}'); + // assertEquals('Escaped %', '%{bky_string_ref}', resultString); + + // resultString = Blockly.utils.replaceMessageReferences('%a'); + // assertEquals('Unrecognized % escape code treated as literal', '%a', resultString); + + // resultString = Blockly.utils.replaceMessageReferences('%1'); + // assertEquals('Interpolation tokens ignored.', '%1', resultString); + // resultString = Blockly.utils.replaceMessageReferences('%1 %2'); + // assertEquals('Interpolation tokens ignored.', '%1 %2', resultString); + // resultString = Blockly.utils.replaceMessageReferences('before %1 after'); + // assertEquals('Interpolation tokens ignored.', 'before %1 after', resultString); + + // // Blockly.Msg.STRING_REF cases: + // resultString = Blockly.utils.replaceMessageReferences('%{bky_string_ref}'); + // assertEquals('Message ref dereferenced.', 'test string', resultString); + // resultString = Blockly.utils.replaceMessageReferences('before %{bky_string_ref} after'); + // assertEquals('Message ref dereferenced.', 'before test string after', resultString); + + // // Blockly.Msg.STRING_REF_WITH_ARG cases: + // resultString = Blockly.utils.replaceMessageReferences('%{bky_string_ref_with_arg}'); + // assertEquals('Message ref dereferenced with argument preserved.', 'test %1 string', resultString); + // resultString = Blockly.utils.replaceMessageReferences('before %{bky_string_ref_with_arg} after'); + // assertEquals('Message ref dereferenced with argument preserved.', 'before test %1 string after', resultString); + + // // Blockly.Msg.STRING_REF_WITH_SUBREF cases: + // resultString = Blockly.utils.replaceMessageReferences('%{bky_string_ref_with_subref}'); + // assertEquals('Message ref and subref dereferenced.', 'test subref string', resultString); + // resultString = Blockly.utils.replaceMessageReferences('before %{bky_string_ref_with_subref} after'); + // assertEquals('Message ref and subref dereferenced.', 'before test subref string after', resultString); + // } + + // function test_startsWith() { + // assertEquals('Does not start with', false, Blockly.utils.startsWith('123', '2')); + // assertEquals('Start with', true, Blockly.utils.startsWith('123', '12')); + // assertEquals('Start with empty string 1', true, Blockly.utils.startsWith('123', '')); + // assertEquals('Start with empty string 2', true, Blockly.utils.startsWith('', '')); + // } + + // function test_arrayRemove() { + // var arr = [1, 2, 3, 2]; + // assertEquals('Remove Not found', false, Blockly.utils.arrayRemove(arr, 0)); + // assertEquals('Remove Not found result', '1,2,3,2', arr.join(',')); + // assertEquals('Remove item', true, Blockly.utils.arrayRemove(arr, 2)); + // assertEquals('Remove item result', '1,3,2', arr.join(',')); + // assertEquals('Remove item again', true, Blockly.utils.arrayRemove(arr, 2)); + // assertEquals('Remove item again result', '1,3', arr.join(',')); + // } + + // function test_toRadians() { + // var quarter = Math.PI / 2; + // assertEquals('-90', -quarter, Blockly.utils.toRadians(-90)); + // assertEquals('0', 0, Blockly.utils.toRadians(0)); + // assertEquals('90', quarter, Blockly.utils.toRadians(90)); + // assertEquals('180', 2 * quarter, Blockly.utils.toRadians(180)); + // assertEquals('270', 3 * quarter, Blockly.utils.toRadians(270)); + // assertEquals('360', 4 * quarter, Blockly.utils.toRadians(360)); + // assertEquals('450', 5 * quarter, Blockly.utils.toRadians(360 + 90)); + // } + + // function test_toDegrees() { + // var quarter = Math.PI / 2; + // assertEquals('-90', -90, Blockly.utils.toDegrees(-quarter)); + // assertEquals('0', 0, Blockly.utils.toDegrees(0)); + // assertEquals('90', 90, Blockly.utils.toDegrees(quarter)); + // assertEquals('180', 180, Blockly.utils.toDegrees(2 * quarter)); + // assertEquals('270', 270, Blockly.utils.toDegrees(3 * quarter)); + // assertEquals('360', 360, Blockly.utils.toDegrees(4 * quarter)); + // assertEquals('450', 360 + 90, Blockly.utils.toDegrees(5 * quarter)); + // } + +}); From e27f58ada7b088391e44fb8e90c2d3bce11b0988 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Fri, 7 Dec 2018 16:18:14 -0800 Subject: [PATCH 26/32] Add jsunit->chai assert converters, and block tests --- tests/mocha/block_test.js | 182 ++++++++++++++++++++++++++++++++++++ tests/mocha/index.html | 2 + tests/mocha/test_helpers.js | 73 +++++++++++++++ tests/mocha/utils_test.js | 155 +++++++++++++++--------------- 4 files changed, 335 insertions(+), 77 deletions(-) create mode 100644 tests/mocha/block_test.js create mode 100644 tests/mocha/test_helpers.js diff --git a/tests/mocha/block_test.js b/tests/mocha/block_test.js new file mode 100644 index 000000000..6400bccd2 --- /dev/null +++ b/tests/mocha/block_test.js @@ -0,0 +1,182 @@ + +// Declare some globals to make eslint happier. +// TODO: make an eslint config that applies to this directory and put this +// configuration in that file, instead of inline. +/* global suite, test, chai, setup, teardown */ + +/* global assertFalse, assertTrue, assertNull, assertEquals */ + +suite('Blocks', function() { + + suite('Unplug', function() { + function assertUnpluggedNoheal(blocks) { + // A has nothing connected to it. + assertEquals(0, blocks.A.getChildren().length); + // B and C are still connected. + assertEquals(blocks.B, blocks.C.getParent()); + // B is the top of its stack. + assertNull(blocks.B.getParent()); + } + + function assertUnpluggedHealed(blocks) { + // A and C are connected. + assertEquals(1, blocks.A.getChildren().length); + assertEquals(blocks.A, blocks.C.getParent()); + // B has nothing connected to it. + assertEquals(0, blocks.B.getChildren().length); + // B is the top of its stack. + assertNull(blocks.B.getParent()); + } + + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "stack_block", + "message0": "", + "previousStatement": null, + "nextStatement": null + }, + { + "type": "row_block", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "INPUT" + } + ], + "output": null + }]); + + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + delete Blockly.Blocks['stack_block']; + delete Blockly.Blocks['row_block']; + + this.workspace.dispose(); + }); + + suite('Row', function() { + setup(function() { + var blockA = this.workspace.newBlock('row_block'); + var blockB = this.workspace.newBlock('row_block'); + var blockC = this.workspace.newBlock('row_block'); + + blockA.inputList[0].connection.connect(blockB.outputConnection); + blockB.inputList[0].connection.connect(blockC.outputConnection); + + assertEquals(blockB, blockC.getParent()); + + this.blocks = { + A: blockA, + B: blockB, + C: blockC + }; + }); + + test('Don\'t heal', function() { + this.blocks.B.unplug(false); + assertUnpluggedNoheal(this.blocks); + }); + + test('Heal', function() { + this.blocks.B.unplug(true); + // Each block has only one input, and the types work. + assertUnpluggedHealed(this.blocks); + }); + + test('Heal with bad checks', function() { + var blocks = this.blocks; + + // A and C can't connect, but both can connect to B. + blocks.A.inputList[0].connection.setCheck('type1'); + blocks.C.outputConnection.setCheck('type2'); + + // Each block has only one input, but the types don't work. + blocks.B.unplug(true); + assertUnpluggedNoheal(blocks); + }); + + test('Parent has multiple inputs', function() { + var blocks = this.blocks; + // Add extra input to parent + blocks.A.appendValueInput("INPUT").setCheck(null); + blocks.B.unplug(true); + assertUnpluggedHealed(blocks); + }); + + test('Middle block has multiple inputs', function() { + var blocks = this.blocks; + // Add extra input to middle block + blocks.B.appendValueInput("INPUT").setCheck(null); + blocks.B.unplug(true); + assertUnpluggedNoheal(blocks); + }); + + test('Child block has multiple inputs', function() { + var blocks = this.blocks; + // Add extra input to child block + blocks.C.appendValueInput("INPUT").setCheck(null); + // Child block input count doesn't matter. + blocks.B.unplug(true); + assertUnpluggedHealed(blocks); + }); + }); + + + suite('Stack', function() { + setup(function() { + var blockA = this.workspace.newBlock('stack_block'); + var blockB = this.workspace.newBlock('stack_block'); + var blockC = this.workspace.newBlock('stack_block'); + + blockA.nextConnection.connect(blockB.previousConnection); + blockB.nextConnection.connect(blockC.previousConnection); + + assertEquals(blockB, blockC.getParent()); + + this.blocks = { + A: blockA, + B: blockB, + C: blockC + }; + }); + + test('Don\'t heal', function() { + this.blocks.B.unplug(); + assertUnpluggedNoheal(this.blocks); + }); + + test('Heal', function() { + this.blocks.B.unplug(true); + assertUnpluggedHealed(this.blocks); + }); + + test('Heal with bad checks', function() { + var blocks = this.blocks; + // A and C can't connect, but both can connect to B. + blocks.A.nextConnection.setCheck('type1'); + blocks.C.previousConnection.setCheck('type2'); + + // The types don't work. + blocks.B.unplug(true); + + // Stack blocks unplug before checking whether the types match. + // TODO (#1994): Check types before unplugging. + // A has nothing connected to it. + assertEquals(0, blocks.A.getChildren().length); + // B has nothing connected to it. + assertEquals(0, blocks.B.getChildren().length); + // C has nothing connected to it. + assertEquals(0, blocks.C.getChildren().length); + // A is the top of its stack. + assertNull(blocks.A.getParent()); + // B is the top of its stack. + assertNull(blocks.B.getParent()); + // C is the top of its stack. + assertNull(blocks.C.getParent()); + }); + }); + }); +}); diff --git a/tests/mocha/index.html b/tests/mocha/index.html index 9b21c559e..c4258eebd 100644 --- a/tests/mocha/index.html +++ b/tests/mocha/index.html @@ -17,6 +17,8 @@ ui: 'tdd' }); + + + + + - +