ELF>@@8@@@@tt00 ))HH ;; ))@@Rtd ))HPQtd';lM );(; M  ^,20N:yj՗j  jl_f__call_latestjulia__gnu_h2f_ieeejulia__gnu_f2h_ieeejulia__truncdfhf2jl_RTLD_DEFAULT_handle_pointerjl_RTLD_DEFAULT_handlejl_image_pointersjl_system_image_datajl_system_image_sizelibjulia-internal.so.1.10JL_LIBJULIA_1.10libjulia.so.1.10;;;; ;(;0;8;@; P;X;`;;h;;;;P;;;)px v) _@: Aa ! 0genericzRx CAC ~ $<<AC Ct d AK| AK AK AK AKUHH IEH@HHH HEHMH}Hu1H ]ffff.UHAUSHHHtdH %L, IH;y[A]]@PfeXPfUXPZfXPJfXPJfX5%@%h%h%h%h oX`X  o(Tooojli  Linuxx86_641.10.3v1.10.30b4590a5507d3f3046e5bafc007cacbbfc9b310bqCoremуJ5Basemу]J5MainmуJ5ArgToolsBń x(mуF K5 Artifactsmr-V3|mу K5Base64UlD*_mу> K5CRC32c\y.jmуj K5 FileWatchingXzsy`{,zmуh& K5LibdluVW59˗,mу-" K5LoggingT{VhUXM=mуrU" K5MmapP~:xg,Omу|' K5NetworkOptionsC0YW,mуʠ, K5SHAQ<$!<%mу1 K5 Serialization [)*k1mу-G K5Sockets1V$ bdސݗmуYBY K5UnicodeP>I>Nrmуeszo K5 LinearAlgebraSm7̏mуuux K5 OpenBLAS_jll[(Śb6EcQ FmуDux K5libblastrampoline_jllLSۆ }lxӠmу^} K5MarkdownZPn7z`smу/Ed~ K5Printfg^cX׸QDmу;h K5Random_ɢ?\Ymу? K5TarOi>աmу!t, K5DatesEY8pj2 mуX K5FuturebS;3{I xVMmуsD K5InteractiveUtilsWL ~@'ZmуVg K5LibGit2Z[&RPTv3EКRmу8J K5 LibGit2_jll YXg}]$mуD K5 MbedTLS_jllAX 3ȡ_mу- K5 LibSSH2_jlloTZk)߆J7`@@@`N` ` `0@   ` `````o`hg`g``g ` .g `````` ` `` `D!`f.. n5`P2 xj"`fh?f#`0@@@N#` `H : P@6  `#` `f.  K dRn50p@.`@."`$``l`<%`0.&`p#p P 0 s!p#p#&`P# O8@>'`@!@@"@!N'` `^"b R "`"@N  "(``'` `f.0#0#3`(`(`Z! .###.)`#0$ $d FGwj#)`#$GEGV*`%@@&@P%N*` `]& x P& &@h  &&`&+`p l *` `D,`f.''$E`#V-.@'p-' Or`&'V4-,( ]79r P(&0,( nmb(@T++( arNNN&&T@)&*) vb)@*.) Ϩ3r.-`*)p*Nvb,.I.*HX`).`/`6P+0+pb`)@+.+4~`)@)~T.,۩'`)6,p,%2`(@+.,SMCm`(@(p.P-3`(0`@.@'-Nvf}. .d`@'1`2`3`4`5`6`.. Sj.7`.@/ ]fV98`/@1P1@/N8` `]P1  00@  1*`8` `f.11 Ov.@'@`3@2N8` `\`3  32@  039`8` `f.33ăA`. $33.*`3`4@44.:`444 0j`4:``4 5wz"Mq9`5@@ 7@5N9` `\ 7  66@  79` `f.`7`7 ``4V-.477.9`7.87.7`7`8;`088<`89=`8P9>` 999p9.?`p9::  ēj9?`9:)_p@`:@@<@0;N@` `Q<B  0<<@  `<>`A`@` `f.<< a`9V-V-=`=P=H Ekj=B`==h/cc+`0>@@?@>N+` `Q?b P ?P?@L  ?@`;`+` `f. @ @ܹ`=:p@@@.@`@@=@@.B`@.A@.8`@P=`A0A.+`0AAМC`A BBA.D`AE@BBBB_tR!EED`E B0CFJA+E`C@@@E@CNE` `2@Ez j DD@f  E(``E` `f.EE>TU` B(`(`Z! .0FFE.F`EFpF| vFj0FF`0FF>4G`PG@@PI@GNG` `1PI  HpH@  H  D``H`I`@I+`J``K`8`G` `D,`f.II}`0FV-V-I@' JJ %jIL`IJwALM`J@`NL@@KNM` `AL  @LL@  pLN`M` `f.LL LРvIL`M0M &]rTO`0NLMNv5%.N|`LP`Q`N`pPP@NNM` `1P   OO@   OG`M` `f.PPPP# %vI@'@`R@PNM``O`R^ , QQ@(  Q  `8+R`S`T`U`V``W`X`Y``M`f.RRa lDvIpFRR.G`R`S@SS.Z`SSSe  j`SZ``S Tw<>Vs̓[`T@@0V@TN[` `%0V~ l UU@h  V`\`[` `f.pVpV m;v`S@'V]`VWc^`VW`W0W._`0W[W`[W@X XXk![`[[`[_`@[WXkhf``Y@@Z@`YN`` `Z  `Z0Z@  Z  a`b`(`P`c`^` `` `f. [ [ v`W(`c`c`Z! .(`Z! .[d`[@\ \[.e`[0^`\@]\\\ ]1@'0^~T. ]kMy!0^e`^@\]NvRk .]Ֆr`@\f`g`h`Z! .^^P^.i`P^^^ hj^i`^`_P#wmj`_@a`a@`Nj` ``a  a`@  @aj`S` `f.aa_= c`^.@c@ bNj` `c  cb@  Pca`b`k`j` `f.cc2y`^.^ dc.j`cdpd@d.l`@ddd '\jdl`dPe=^Dm`e@gPg@fNm` `Pg  gf@  0gm`S` `f.ggLO `d.@pi@hNm` `pi   ih@   @ia`b`n`m` `f.iiV`d.dji.m`ij`j0j.o`0jjj$ 5#jjo`j@ku*Wp`k@m@m@kNp` `@m: , ll@(  mp`S` `f.mmҖi`j.@`o@nNp` ``oT B on@>  0oa`b`q`p` `f.oo8`j.jpo.p`oppPp p.r` ptptptppq@qq!ttttttr`Ptppqb-N)ts`@r@@s@rNs` `s~ \ s`s@X  st`u`v`s` `f.0t0t`ppt`u`v`v`Z! .u`Z! .t`Z! .0uut.w`tupu j0uw`0uupŋx`Pv@@x@vNx` `x  wpw@  wr`````x` `f.PxPx8`0u`x.Lx.yx :jxy`xpyl9C{K!I`y@|p{@ zNI` `p{  {z@  P{x`I` `f.{{Yе`x.L{.0~}@P|NI` `}  P} }@  }z`I` `f.}}5`x.@'~.@@~NI``C  P@  {`I``f.l`x.@.pP00 lM!&pPʇ.kl[!0f.sa&Pp.pC!&ph`Z! f.:`@@`@N` ``T > @:  ````` `f.,`.@'.P@Z Rj`gP!sk` @P@pNk` `v b p@@^  `k` `f.#8:`.@'0.@Nk` ` ~ p@z  Г`k` `f.00Ϩ`.L`. @ДNk``>   Е@  `k``f.``5`..@P@Nk` `P  З@  0`k` `f.(`..Л @`lM!&0Йʇ.kl[!f.ppsa&Лp.C!&h`Z! 0f.pp: ``8 `` `hB f.00p H`..p.v jp`p0ceA]D`@0@N` `0 ~ @z  `` `f.p n0p@`@N` `` @  ````` `f.8`p. .`p@.``.``l*  `V4 t** y(4rp.*)Y`0up  @   JJJ  XXXY`     Pts` `p`@`P`.#``B`0``P`@  .`&` `& !  4h!&`&&`&`@&@ p!B+0g`!@@%@ "N` `%z" 8 #"@  P#BBB````o`hg`g``g0 `* .g`$ ```` %#``  %` ``````f`6``-```````.` %` %` `A``` `K``` p%` `X!``D`n.```D!`D`f. & & }۸`@ f```Z! .f`Z! .&&&.`&@'0'" wvj&`&'{EE `(@@)@`(N` `)# " `)0)@"  )4``````` `f. * * # v&@'p*i`@**`*+A`*`+`0++`+,`+P,` ,,`p,-,,.`,10---p-%J9!11`p1- .qCdڂ`.@@1@.N` `1,$ $# //@#  0``f``6`````-``A`o`hg`g``g# `# 0` `.g` `Xf`!`f.P1P10`-f`f`Z! .211.`1P2@28$ Hj2`22߻bk` 3@@4@p3N` `4d$ @$ p4@4@<$  4`````` `f. 5 5h$ w2v2@'p5i`@50'55.`5@265.`5`6`066`67`6P7` 77`p77`7@88.`888`8.``898l$ bSj8`8p9l|BQ`9@@p<@ :N` `gp<0% x$ ;:@p$  P;P<`0<``t$ ```````0````-``````` `X ` `X``f.<<)&`8..-0==<.`<@P====vL!@@`@0=@>^_ `>@@P@@>N ` `P@N% >% ??@:%  @(`M` ` `f.@@`+6`0=(`(`Z! .@A A@.`@AAP% j@A`@ABZ{F$ ``B@@ D@BN ` `~ D|% X% CC@T%  C ````` ` `f.`D`D\`@A.DDD. `DpHDpEPE0EC!pHpH `PHDE=u%`@F@@G@FN` `~G% % G`G@%  G(`M`` `f.0H0H0Pg`D(`(`Z! .H,k`HI`H`I`0IIh_<`I@'JI.0`IPJ` JJJpJ.`pJKK% y?1jJ`JKx"`K@@M@0LN` `NM% % 0MM@%  `M```` `f.MMM% fEqnMJK0NN.`NNPJ`PNONN.`N`zpON@R% |r`m.PO&`OP`V4@POQ% N$r`p. Pz`OQQP2%  0Q %  2OR``RSRR.`RPS@S% d2jS`SSRQ ` T@@U@pTN` `FU% % pU@U@%  U` `f.VVV% O/5nUS`VB`0VV`VLWV.O`VPW` WWWpW.`pWXX% )GjW`WX2tYo`X@[Z@0YN` `vZ% % 0ZZ@%  `ZQ`$``Z`` `D`f.ZZ& #vWL]]@`[N` `j]& & `\0\@&  \`o`hg`g``g& `& p]` `.g``2``` & ``!`` `D"`f.]]& $UvW@'@`@0^N``Y`' ' 0__@'  `_``o`hg`g#``g' `' .g8+```f.@`@`' BnvWX```.``````I0aa.L`aaaPa.$`Paaa' Xja$`a`b?ƙ`b@d`d@cN` `#`d' ' dc@'  @dN`` `f.dd' xF vaLfpf@eN` `"pf' ' fe@'  @f`2`` `f.ff( va@'@ph@ gN``Mph( ( hg@(  Ph``f.hh( *,vaaih.`hPi%` iia`pijii.&`i`jPj( Ujj&`jj?]&)>7'`0k@Pml@kN'` `l<( &( lPl@"(  l_`n`'` `f. m mKnm`jL.`on@mN'` `nR( D( npn@@(  ne`'` `f.0o0oe`j@'.@s@oN'``Gs( ^( pp@V(  pa`b`S`(`e`V``sr%`Y``)``8+``*``q'`q*TqX( #Mr`rq`rNvTϻFo.rYlJ`qf`+`V`s 0sa`Psb`,`s sf.tt7tx`j.Pj`t0t.'`0tttt.-`t uu( @:jt-`tu%p{`u@@w@@vN{``Cw( ( @ww@(  pw8+I``{``f.www`t@xx. x.P{`x0{x{xpzxzylM!&P{y0yʇ.pykl[!{pzf.yysay&0{p.PzC!&P{h`Z! zf.zz:F) ( ~@(  P  8+/````*``q``f."`|P.0.`p@ Ѐ lM!&`@ʇ.kl[! f.sa&@p.`C!&`h`Z! f.:`p?`@@```J.M`P0.A``* VjPA`PCqB`p@@0@NB``0+ * @d*  ?`o`hg`gC``gt* `h* .gT`D`V`E``F`W``8+R`S`G``H``B``i J~* f.pp|>Q`P..Ы.H`pPL!H`pšڛI``@@@NI``!+ + @+  (`M`I``f.PP}c`(`(`Z! ..G`P@+ yirjG`"ÛJ` @@@pNJ``+ + p@@+  K`````J``f.  ܸ8`.p@.K`@002!00K`;?J2L`@@@PNL``+ + P @+  (`M`L``f.D5`(`(`Z! .M`PзbN` .`pO`@iP`Q``0.T`0Y` йR` @@`=` к+ =` @+ V`` S`T`V` S`0U`V`` S`V`(`8+.(``W`0X``нPY` p.Z`p+ 7jZ`u- 2`,P_```a`b`c`d` L- P- 7`Z! 2`7.   pJ7P@03 ` pb@@j- 2q`,_```a`b`c` r- v- f.א`.@'.70p2q`7.   @J7 @30P @@- 2n`,`_```a`b`c` - - f.N`..7@2n`7P.p   J7@3  PM@- 2`,0_```a`b`c` - - f.PP,`@'.72`70.  P  `J7@3p @- 2p`,_```a`b`c` - - f. K`.7`2p`7.   pJ7P@03 ` p:. @2. 2<ˀ`,_```a`b`c` <. @. *f. `@'.7 p2<ˀ`7p.   0J7@3 @ p0@`. 2'`,P_```a`b`c` h. l. f.pp `@'.702'`7@ .0 `  pJ7 @3     @ . 2m`, _```a`b`c` . . f.   K`.7p  2m`7 .     Z!  J7`@@ 30p  Z! @P. P3 ` , . 2\`,_```a`b`c`d` . . 7Z! 2\`7.  P  `J7@3p . . 2M`,_```a`b`c` . . 72M`7@.`   Z! J7@3 @Z! <@/ 3  P, / 2O`, _```a`b`c`d` / $/ 70Z! 2O`7 .   @ J7 @30P @ @8/ 2j`,`_```a`b`c` @/ D/ f.   K`.7 @ 2j`7%0!.P! !  $"J7$@"3$## 0#$@#R/ 2I`,$_```a`b`c` Z/ ^/ f.0%0%א`.@'`%.7%$2I`7 *&. & P&  )`'J7)@'3p)(' ()>@(/ 2`,(_```a`b`c` / / f.**/ iÊv@'7P*)2`7`/*.* *  `.,J7@.@ ,3.P-p, ,`.U@0-/ 2`,-_```a`b`c` / / *..f...Ѭ\`@'..f.0/0/,`@'.7/`.2`/jce`/@0f`000`0.\``01*T0/ 0 j0\`0p1Nv*7y.1&`021.`1P2 g` 22h`p22i`2@3j`33k``33dl`3P4044.m`444/ Z!jP4m`P45@K`p5@@07@5N`n`$070 / 66@/  6o`p`i`h``n`f.p7p7Vޟu`P4..477.`708q`88 r`P8888.s`8@909 0 &j8s`89wiF`:@@;@`:N`n` ;"0 0 `;0;@0  ;q`p``n`f.<<Ӄ`8.09P< <.` <<<p<.p`p< &0  @= =<.t`<==(0 j@=t`@=>o`>``>@@@@>N`n`@B0 00 ??@,0  ?u`v``n`f.P@P@2`@=.=@p@.`p@@-]w`@@A0x`AAS``AABy`A0B z`BF0 BPB.v`PBB{`B CB.`BpCD|`@CDCC.`CH``}`~`[```C4Gʇ. D1 1 [[@1  \S`f`p\g`R``m` `V`\ \S`\`f.0]0]LϦ`7@\N` `P_d1 F1 P^ ^@B1  ^S`f`^g`R``j` `V`^ _S`@_`f.__`P@\.NX` `a1 l1 ``@h1  `S`f`@ag`R`X`j` `V``a aS`a`f.bb̋`Z Q@\N` ` d1 1 cb@1  PcS`f`cg`R``m` `V`c cS`d`f.`d`d塯`g@@\N` `#e1 1 ePe@1  ef``+`1 1 ` `f.0f0f`ej.qN` `g2 1 `g0g@1  g1`3`1 1 ` `f.hh]?)`d.@'N``'i$2 2 @ii@2  pi` 2 ``f.iiC9O`d.N` `KpkB2 22 kj@(2  @kP`,2 ` `f.kkD`d.LNM` `1m2 J2 ll@F2  m  `C````mG`M` `X``f.mmB^`qjLI@'NI``C@o2 2 nn@2  o{`I``f.oow`qjLx.o.NI` `0q2 2 pp@2  qz`I` `f.pqpq(:`qjLx.@'q.NI` ` s2 2 rr@2  sx`I` `f.`s`s `qjLx.Ls.Nn``:u3 2 tt@2  t`n``f.PuPuI`qjL.u.Nn` `|w.3 3 vv@3  v`n` `f.@w@wVu`qjL.Lw.Nn` `xL3 83 xpx@43  x`n` `f.0y0y*`qjL.py.Nn` `zj3 V3 z`z@R3  z`n` `f. { {`qjL.@'`{.N+` `Q0}3 t3 |P|@p3  |  `C``,`;`}@`+` `X`,`f.p}p}G`qjL=N8` `\03 3 ~p~@3  ~,`C`` 9`8` `D,`f.pp|1`qjL.N8` `]0:4 4 p@4  Ѐ,`C`` *`8` `D,`f.pp{o`qjL.@'Nq``6X4 D4 p@@4  Ђ`q``f.00O~X`qjL0.p.Nq` `rv4 b4 `@^4  `q` `f.  `qjL0.@'`.Nq` `yІ4 4 P@|4  `q` `f.#׽`qjL0.LP.N#` `4 4 p@@4  ```#` `D`f.00m)`qjL5Nk``>4 4 `0@4  `k``f.Eg`qjL.0.Nk` `5 4 P @4  `k` `f.q `qjL.L .Nk` `&5 5 @@5  p`k` `f.ЎЎ `qjL..Nk` `D5 05 0@,5  ``k` `f.F#`qjL.@'.N` `p^5 N5 @J5  P`` `f. !`qjLpN` `p5 f5 @b5  ```P`` `X``f.^`qjLp.N0` `gp5 5 @5  ``P80` `X``f.5R$`qjL-N``p6 5 @5  ``PP``X``f.,`qjLNe` `f6 6 @6    5``S``R`Y` `j`e`V` S`К`f.@@ň|ap@'..ՖraЛ@]0k6 ]1~T.pkMy!h`Z! .Ne` `6 t6 @p6  e` `f.@@ň|`]@'.N` `6 6 p@@6  ` `f.lcni``rN` `6 6 0@6  `` `f.z``r..N``@6 6 @6  P``f.dN\` `6 6 p@6  Ф\` `f.00Gdp1NO` `E7 6 P @6  S`O` `f.dMNO` `E`>7 7 Ч@7  0```O` `f.)`M.N-` `(V7 H7 @D7  -` `f.PPQOJ`p*.N-` `(Ы~7 `7 P@\7  -` `f.H`p*..N0` `g7 7 @@7  p80` `f.ЭЭKd-  `ؼ虨7+not implemented for DistributedStdlibWorkerM-I9虨77?/#9虨79虨7,W?#self#wsignum:]b_'OV+@,[2W357p6.`wޑc}*G=tZvJnqߚr BI)NQY-8LHmosE K!je;T4Ug ȣazR"\~Sy?%X虨7!9虨7.!J49虨79虨7. K i- F>-!9虨7. L49虨7 A 7 ?/#9虨79虨7,?#self#虨7;HOST: Don't know what to do with this interrupt, rethrowing"HOST: Rethrowing interrupt to REPL*/opt/julia/packages/Malt/Z3YQq/src/Malt.jlt +?.049虨76+M!9虨7.049虨76+M!9虨7.049虨76+M!9虨7.!J 49虨7.!J 49虨7.O 49虨76 +M.049虨76 I3+!9虨7 I-e6+M!9虨7.!J49虨76+M    I9虨79虨7 I  -!M9虨7.9虨7#$6%+A I 49虨7 I # I A9虨7    .9虨7O 9虨7V-9虨7k*6++A I 49虨7 A9虨79虨7 9虨7     6.+A I9虨7.9虨7w9虨761+5!9虨7 I-3 I+ I9虨7 I A i6>+A A!i.!@9-!e:6;+? A9虨79虨7 9虨7    3+@ A :9虨79虨7 9虨7    3+A9虨7V9虨7- . KBC I RD I-!9虨7F6=+J.!9虨79虨7-!9虨77K6+ I9虨79虨7 I-!M9虨7.9虨7XY6Z+ I49虨7 I# I A9虨7 .9虨7O9虨7V-9虨7k_6`+ I49虨7 A9虨79虨7 9虨7 6c+ I9虨7.9虨7w9虨76f+j!9虨7 I-h I+ V+v I9虨79虨7. K im A9虨7. Fo- Fp I-nq I> W3+{ W I  A!9虨7 9虨79虨7> I= ~k6+ A!i.!@|-!e}6~+ A9虨79虨7 9虨73+ A }9虨79虨7 9虨73+9虨7V-77?++?+7/#9虨79虨7,/#9虨79虨7,/#5,~/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,T/#5,U/#5,V/#5,/#9虨79虨7,/#5z,,/#5z, ,/#5z, ,/#5z, ,/#5z, ,/#5z,,/#9虨79虨7,/#9虨79虨7,/#5,~,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,s,/#5,t,/#5,u,/#5,v,/#5,x,/#5,y,/#5,,/#9虨79虨7,?  !"####$%&'''())*++,,-0122222233333455555555567#_rethrow_to_repl#58rethrow_regularemsgkwargslinefileidlogger_modulegroupstd_levellevel#59taskmsgkwargslinefileidlogger_modulegroupstd_levellevelerr虨7S A9虨7=7?/#9虨79虨7,? #self#e虨7g. L49虨7-9虨7-k7?/#9虨79虨7,^?#self#虨7 seconds HOST: Worker did not exit after ?9虨7- . K I R9虨7. K i- F- A  9虨7-k 6 A!y9虨79虨7-I77??/#9虨79虨7,^/#9虨79虨7,_?$#_wait_for_exit#55timeout_sw#560 (@ (08X   08@HP虨7g A9虨79虨74@7?/#9虨79虨7,]? #self#w虨7g A9虨79虨74@7?/#9虨79虨7,\?#self#虨7@?7V?/#9虨79虨7,\?#_wait_for_exit#54timeout_s虨7`H? I A9虨76> A67>3 A9虨7.[. 6 7=-9虨737??/#9虨79虨7,R/#9虨79虨7,S/#9虨79虨7,T/#9虨79虨7,U/#9虨79虨7,V/#9虨79虨7,X/#9虨79虨7,Y?'#_poll#53intervaltimeout_sftstart虨7s A9虨79虨7{Gz?9虨77?/#9虨79虨7,Q? #self#f虨7g. L49虨7-9虨7-k7?/#9虨79虨7,2?#self#虨7+?9虨7- . K I R I-9虨76+!9虨7.9虨7 9虨7. K i - F-  A 9虨7-k6+!9虨7.9虨79虨7. K i- F- A 9虨7-k6+!9虨7.9虨7-9虨7 7>7=++?/#9虨7 9虨7 ,2/#9虨7 9虨7 ,3/#9虨7 9虨7 ,4/#9虨7 9虨7 ,5/#9虨7 9虨7 ,6/#9虨7 9虨7 ,7/#9虨7 9虨7 ,8/#9虨7 9虨7 ,9/#9虨7 9虨7 ,</#9虨7 9虨7 ,>?-#stop#50exit_timeoutterm_timeoutw#51ir虨7r= A!49虨77>?/#9虨79虨7,B/#9虨79虨7,C? #self#w虨7| A9虨79虨7.@9虨7.@7?/#9虨79虨7,1? #self#w虨7s= A!49虨79虨79虨79虨79虨7 449虨7 A 49虨7.!J49虨7 A 4A A 4A49虨7 49虨7 A 49虨7 4R9虨7  A 7V?/#9虨7 9虨7 ,P/#9虨7 9虨7 ,Q/#9虨7 9虨7 ,T? #self#w虨7p-9虨767 A9虨7-U7?/#9虨79虨7,%? #self#w虨7result isa AbstractChannel.!J9虨749虨7. L49虨7.!J49虨7. L49虨7 I..w9虨763-!l9虨7-!U 7?/#9虨79虨7,/#9虨79虨7,/#9虨79虨7,?#self#result虨7_ A9虨79虨77?/#9虨79虨7,?#self#wexpr虨7w.!J9虨749虨7 A9虨77?/#9虨79虨7,?#self#modwexpr虨7_ A9虨79虨77?/#9虨79虨7,?#self#wexpr虨7w.!J9虨749虨7 A9虨77?/#9虨79虨7,?#self#modwexpr虨7_ A9虨79虨77?/#9虨79虨7,?#self#wexpr虨7w.!J9虨749虨7 A9虨77?/#9虨79虨7,?#self#modwexpr虨7 A!i. L49虨7.!@-!e6. L49虨7. L49虨7 A }!P7. L49虨7. F . L49虨7 A }!P   7 ?/#9虨79虨7,?#self#虨7D?9虨7- - -  A K I R I-!9虨76=.!9虨79虨7-!9虨77V?/#9虨79虨7,/#5z,/#5z, /#5z, /#5z, /#5z, /#5z,/#9虨79虨7,?'#remote_do#45kwargsfargs#46task虨79虨7 A i-! A F A }!P7?/#9虨79虨7,?#self#fargs虨79虨7 A i-! A F A }!P7?/#9虨79虨7,?#self#fwargs虨79虨7 A i-! A F A }!P7?/#9虨79虨7,C?#self#fwargs虨7?.!J9虨749虨7 A9虨7 A9虨7=7V?/#9虨79虨7,/#9虨79虨7,?#remote_do#44kwargsfwargs虨7?.!J9虨749虨7 A9虨7= A9虨77?/#9虨79虨7,?&#remote_call_wait#43kwargsfwargs虨79虨7 A i-! A F A }!P7?/#9虨79虨7,?#self#fwargs虨79虨7 A i-! A F A }!P7?/#9虨79虨7,?#self#fwargs虨79虨7 A i-! A F A }!P7?/#9虨79虨7,>?#self#fwargs虨79虨7 A i-! A F A }!P7?/#9虨79虨7,?#self#fwargs虨7? A!i.!@-!e69虨7. F I A }!P3 A F9虨7 I A }!P  -9虨7 7 ?/#9虨79虨7,?'#remote_call_wait#42kwargsfwargs虨7?.!J9虨749虨7 A9虨7> A9虨77?/#9虨79虨7,?'#remote_call_fetch#41kwargsfwargs虨79虨7 A i-! A F A }!P7?/#9虨79虨7,?#self#fwargs虨79虨7 A i-! A F A }!P7?/#9虨79虨7,|?#self#fwargs虨79虨7 A i-! A F A }!P7?/#9虨79虨7,:?#self#fwargs虨79虨7 A i-! A F A }!P7?/#9虨79虨7,?#self#fwargs虨7? A!i.!@-!e69虨7. F I A }!P3 A F9虨7 I A }!P  -9虨7 7 ?/#9虨79虨7,?(#remote_call_fetch#40kwargsfwargs虨7? A!i.!@-!e69虨7. F A }!P3 A F9虨7 A }!P  7V?/#9虨79虨7,/#9虨79虨7,?&#remote_call_wait#39kwargsfwargs虨7!9虨79虨7. L49虨7 A9虨7 A7?/#9虨79虨7,? #self#io虨7y +? V A!i.!@-!e6 I A }!P3. F I A }!P   W7 W I 9虨7- . K I R-9虨7.9虨7-U ~7++?/#9虨79虨7,}/#9虨79虨7,~/#9虨79虨7,?/#remote_call_fetch#36kwargsfwargs#37ex虨7L A!i. L49虨7.!@-!e69虨7. L49虨7. L49虨7. F. L49虨7 A }!P  7 9虨7. L49虨7. L49虨7 A F . L49虨7 A }!P 7?/#9虨79虨7,z?#self#虨7O?9虨7- - - -  A K I R I-!9虨7 6=.!9虨79虨7-!9虨7 A!49虨77?/#9虨79虨7,z/#5z,/#5z, /#5z, /#5z, /#5z, /#5z,?*#remote_call#33kwargsfwargs#34task虨79虨7 A i-! A F A }!P7?/#9虨79虨7,y?#self#fwargs虨79虨7 A i-! A F A }!P7?/#9虨79虨7,r?#self#fwargs虨79虨7 A i-! A F A }!P7?/#9虨79虨7,6?#self#fwargs虨7?.!J9虨749虨7 A9虨7> A9虨77?/#9虨79虨7,s?!#remote_call#32kwargsfwargs虨7. L49虨7. L49虨7. L49虨7.9虨7-7?/#9虨79虨7,Y?#self#虨7 H+9虨7 I A9虨7>9虨7- - -  A K I R I-!9虨7 6=.!9虨79虨7-!9虨7 I . w 63.!N I .  7++?/#9虨79虨7,X/#9虨79虨7,Y/#5z,/#5z, /#5z, /#5z, /#5z, /#5z,?B#self#wmsg_typemsg_dataoutput_transformationmsg_id#30task虨7QH Am7?/#9虨79虨7,X?#self#wmsg_typemsg_data虨7 I A9虨7>.9虨77?/#9虨79虨7,O/#9虨79虨7,P?"#self#wmsg_typemsg_datamsg_id虨7*HOST: No response expected for message id HOST: waiting for response of*/opt/julia/packages/Malt/Z3YQq/src/Malt.jl+H.!J49虨7.6+F.!J49虨7 I.!M     I9虨79虨7 I-!M9虨7.9虨76+@ I 49虨7 I # I A9虨7  .9虨7O 9虨7V-9虨7k6+@ I 49虨7 A9虨79虨79虨7    6+@ I 9虨7 .9虨7w 9虨76 +$!9虨7 I -" I+B 06%+) I?3+* I- 9虨7 49虨7  I*.9虨7O9虨7V6,+5 I9虨7 9虨7. K i/- F I-01 I>3+7 A!9虨79虨79虨7     = I=6+@ A!i.!@8-!e96:+> A9虨79虨79虨7     3+? A 99虨79虨79虨7     3+@9虨7V I-9虨7.!J49虨7.9虨7B.9虨77D.!y9虨7-IF7G+H+H?+/#9虨79虨7,@/#9虨79虨7,A/#9虨79虨7,B/#5,~/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,f/#5,g/#5,h/#5,i/#5,j/#5,l/#5,m/#5,/#9虨79虨7,C/#9虨79虨7,D/#9虨79虨7,E/#9虨79虨7,G? c#self#workermsg_idresponsecmsgkwargslinefileidlogger_modulegroupstd_levellevelerr虨7HOST: sending message*/opt/julia/packages/Malt/Z3YQq/src/Malt.jl+O9虨7-9虨7.!J49虨7-9虨7.X A!49虨7 I. 9虨76. K9虨79虨7- .!J49虨7 A!x        I9虨79虨7 I-!M9虨7.9虨76+E I49虨7 I # I A9虨7  .9虨7O 9虨7V-9虨7k6+E I 49虨7 A9虨79虨7 9虨7    6"+E I 9虨7.9虨7w 9虨76%+)!9虨7 I -' I +5 06*+. I?3+/ I- 9虨749虨7 I/.9虨7O9虨7V61+: I9虨79虨7. K i4- F I-56 I>3+< A!9虨7 9虨79虨7     = I=6+E A!i.!@=-!e>6?+C A9虨79虨7 9虨7     3+D A >9虨79虨7 9虨7     3+E9虨7V.!J49虨7 A9虨7FG I. w6J+M3+O.!N I. M7+O+O?+/#9虨79虨7,-/#9虨79虨7,0/#9虨79虨7,1/#9虨79虨7,2/#9虨79虨7,5/#5,~/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,f/#5,g/#5,h/#5,i/#5,j/#5,l/#5,m/#5,/#9虨79虨7,7/#9虨79虨7,9? x#self#workermsg_typemsg_dataexpect_replymsg_idmsgkwargslinefileidlogger_modulegroupstd_levellevelerr虨7OH A>7?/#9虨79虨7,-? #self#workermsg_typemsg_data虨7O A F>7?/#9虨79虨7,?#self#fargskwargs虨7Y-k A F7?/#9虨79虨7,?!#self#send_resultfargskwargs虨7OPENBLAS_NUM_THREADS=1 worker.jlC$exe --startup-file=no $exeflags $(joinpath(src_path, "worker.jl"))?- F- F9虨7- F.9虨79虨7- F A F-!9虨7!9虨7- . F9虨7 A }!P!M  .9虨7 7 ?/#9虨79虨7,?&#_get_worker_cmd#29envexeflagsexe虨7aH!9虨7 A.!M-7?/#9虨79虨7,?#self#虨7- 9虨749虨7- U I- 9虨749虨7- U I A9虨77?/#9虨79虨7,?#self#exeenvexeflags@ (08 import Distributed const Distributed_expr = quote Base.loaded_modules[Base.PkgId(Base.UUID("8ba89e20-285c-5b6f-9357-94700520ee1b"), "Distributed")] end """ Malt.DistributedStdlibWorker() This implements the same functions as `Malt.Worker` but it uses the Distributed stdlib as a backend. Can be used for backwards compatibility. """ mutable struct DistributedStdlibWorker <: AbstractWorker pid::Int64 isrunning::Bool function DistributedStdlibWorker(; env=String[], exeflags=[]) # Spawn process expr = if VERSION < v"1.9.0-aaa" isempty(env) || @warn "Malt.DistributedStdlibWorker: the `env` kwarg requires Julia 1.9" :($(Distributed_expr).addprocs(1; exeflags=$(exeflags)) |> first) else :($(Distributed_expr).addprocs(1; exeflags=$(exeflags), env=$(env)) |> first) end pid = Distributed.remotecall_eval(Main, 1, expr) # TODO: process preamble from Pluto? # There's no reason to keep the worker process alive after the manager loses its handle. w = finalizer(w -> @async(stop(w)), new(pid, true) ) atexit(() -> stop(w)) return w end end Base.summary(io::IO, w::DistributedStdlibWorker) = write(io, "Malt.DistributedStdlibWorker with pid $(w.pid)") macro transform_exception(worker, ex) :(try $(esc(ex)) catch e if e isa Distributed.RemoteException throw($(RemoteException)($(esc(worker)), sprint(showerror, e.captured))) else rethrow(e) end end) end function remote_call(f, w::DistributedStdlibWorker, args...; kwargs...) @async Distributed.remotecall_fetch(f, w.pid, args...; kwargs...) end function remote_call_fetch(f, w::DistributedStdlibWorker, args...; kwargs...) @transform_exception w Distributed.remotecall_fetch(f, w.pid, args...; kwargs...) end function remote_call_wait(f, w::DistributedStdlibWorker, args...; kwargs...) @transform_exception w Distributed.remotecall_wait(f, w.pid, args...; kwargs...) nothing end function remote_do(f, w::DistributedStdlibWorker, args...; kwargs...) Distributed.remote_do(f, w.pid, args...; kwargs...) end function worker_channel(w::DistributedStdlibWorker, expr) @transform_exception w Core.eval(Main, quote $(Distributed).RemoteChannel(() -> Core.eval(Main, $(QuoteNode(expr))), $(w.pid)) end) end isrunning(w::DistributedStdlibWorker) = w.isrunning function stop(w::DistributedStdlibWorker) w.isrunning = false Distributed.remotecall_eval(Main, 1, quote $(Distributed_expr).rmprocs($(w.pid)) |> wait end) nothing end Base.kill(w::DistributedStdlibWorker, signum=Base.SIGTERM) = error("not implemented for DistributedStdlibWorker") function interrupt(w::DistributedStdlibWorker) if Sys.iswindows() @warn "Malt.interrupt is not supported on Windows for a DistributedStdlibWorker" nothing else Distributed.interrupt(w.pid) end end pushfirst!(LOAD_PATH, "@stdlib") using Logging: Logging, @debug using Serialization: serialize, deserialize using Sockets: Sockets popfirst!(LOAD_PATH) ## Allow catching InterruptExceptions Base.exit_on_sigint(false) # ENV["JULIA_DEBUG"] = @__MODULE__ include("./shared.jl") ## TODO: ## * Don't use a global Logger. Use one for dev, and one for user code (handled by Pluto) ## * Define a worker specific LogLevel # Logging.global_logger(Logging.ConsoleLogger(stderr, Logging.Debug)) function main() # Use the same port hint as Distributed port_hint = 9000 + (Sockets.getpid() % 1000) port, server = Sockets.listenany(port_hint) # Write port number to stdout to let main process know where to send requests @debug("WORKER: new port", port) println(stdout, port) flush(stdout) # Set network parameters, this is copied from Distributed Sockets.nagle(server, false) Sockets.quickack(server, true) serve(server) end function serve(server::Sockets.TCPServer) # Wait for new request @debug("WORKER: Waiting for new connection") io = Sockets.accept(server) @debug("WORKER: New connection", io) # Set network parameters, this is copied from Distributed Sockets.nagle(io, false) Sockets.quickack(io, true) _buffer_writes(io) # Here we use: # `for _i in Iterators.countfrom(1)` # instead of # `while true` # as a workaround for https://github.com/JuliaLang/julia/issues/37154 for _i in Iterators.countfrom(1) if !isopen(io) @debug("WORKER: io closed.") break end @debug "WORKER: Waiting for message" msg_type = try if eof(io) @debug("WORKER: io closed.") break end read(io, UInt8) catch e if e isa InterruptException @debug("WORKER: Caught interrupt while waiting for incoming data, ignoring...") continue # and go back to waiting for incoming data else @error("WORKER: Caught exception while waiting for incoming data, breaking", exception = (e, backtrace())) break end end # this next line can't fail msg_id = read(io, MsgID) msg_data, success = try (deserialize(io), true) catch err (format_error(err, catch_backtrace()), false) finally _discard_until_boundary(io) end if !success if msg_type === MsgType.from_host_call_with_response msg_type = MsgType.special_serialization_failure else continue end end try @debug("WORKER: Received message", msg_data) handle(Val(msg_type), io, msg_data, msg_id) @debug("WORKER: handled") catch e if e isa InterruptException @debug("WORKER: Caught interrupt while handling message, ignoring...") else @error("WORKER: Caught exception while handling message, ignoring...", exception = (e, backtrace())) end handle(Val(MsgType.special_serialization_failure), io, e, msg_id) end end @debug("WORKER: Closed server socket. Bye!") end # Check if task is still running before throwing interrupt interrupt(t::Task) = istaskdone(t) || Base.schedule(t, InterruptException(); error=true) interrupt(::Nothing) = nothing function handle(::Val{MsgType.from_host_call_with_response}, socket, msg, msg_id::MsgID) f, args, kwargs, respond_with_nothing = msg @async begin result, success = try result = f(args...; kwargs...) # @debug("WORKER: Evaluated result", result) (respond_with_nothing ? nothing : result, true) catch err # @debug("WORKER: Got exception!", e) (format_error(err, catch_backtrace()), false) end _serialize_msg( socket, success ? MsgType.from_worker_call_result : MsgType.from_worker_call_failure, msg_id, result ) end end function handle(::Val{MsgType.from_host_call_without_response}, socket, msg, msg_id::MsgID) f, args, kwargs, _ignored = msg @async try f(args...; kwargs...) catch e @warn("WORKER: Got exception while running call without response", exception=(e, catch_backtrace())) # TODO: exception is ignored, is that what we want here? end end function handle(::Val{MsgType.special_serialization_failure}, socket, msg, msg_id::MsgID) _serialize_msg( socket, MsgType.from_worker_call_failure, msg_id, msg ) end format_error(err, bt) = sprint() do io Base.invokelatest(showerror, io, err, bt) end const _channel_cache = Dict{UInt64, AbstractChannel}() if abspath(PROGRAM_FILE) == @__FILE__ main() end """ The Malt module doesn't export anything, use qualified names instead. Internal functions are marked with a leading underscore, these functions are not stable. """ module Malt # using Logging: Logging, @debug using Serialization: serialize, deserialize using Sockets: Sockets using RelocatableFolders: RelocatableFolders include("./shared.jl") # ENV["JULIA_DEBUG"] = @__MODULE__ abstract type AbstractWorker end """ Malt will raise a `TerminatedWorkerException` when a `remote_call` is made to a `Worker` that has already been terminated. """ struct TerminatedWorkerException <: Exception end struct RemoteException <: Exception worker::AbstractWorker message::String end function Base.showerror(io::IO, e::RemoteException) print(io, "Remote exception from $(summary(e.worker)):\n\n$(e.message)") end struct WorkerResult msg_type::UInt8 value::Any end function unwrap_worker_result(worker::AbstractWorker, result::WorkerResult) if result.msg_type == MsgType.special_serialization_failure throw(ErrorException("Error deserializing data from $(summary(worker)):\n\n$(sprint(Base.showerror, result.value))")) elseif result.msg_type == MsgType.special_worker_terminated throw(TerminatedWorkerException()) elseif result.msg_type == MsgType.from_worker_call_failure throw(RemoteException(worker, result.value)) else result.value end end include("DistributedStdlibWorker.jl") """ Malt.InProcessWorker(mod::Module=Main) This implements the same functions as `Malt.Worker` but runs in the same process as the caller. """ mutable struct InProcessWorker <: AbstractWorker host_module::Module latest_request_task::Task running::Bool function InProcessWorker(mod=Main) task = schedule(Task(() -> nothing)) new(mod, task, true) end end Base.summary(io::IO, w::InProcessWorker) = write(io, "Malt.InProcessWorker in module $(w.host_module)") const __iNtErNaL_running_procs = Set{Base.Process}() __iNtErNaL_get_running_procs() = filter!(Base.process_running, __iNtErNaL_running_procs) """ Malt.Worker() Create a new `Worker`. A `Worker` struct is a handle to a (separate) Julia process. # Examples ```julia-repl julia> w = Malt.worker() Malt.Worker(0x0000, Process(`…`, ProcessRunning)) ``` """ mutable struct Worker <: AbstractWorker port::UInt16 proc::Base.Process proc_pid::Int32 current_socket::Sockets.TCPSocket # socket_lock::ReentrantLock current_message_id::MsgID expected_replies::Dict{MsgID,Channel{WorkerResult}} function Worker(; env=String[], exeflags=[]) # Spawn process cmd = _get_worker_cmd(; env, exeflags) proc = open(Cmd( cmd; detach=true, windows_hide=true, ), "w+") # Keep internal list __iNtErNaL_get_running_procs() push!(__iNtErNaL_running_procs, proc) # Block until reading the port number of the process (from its stdout) port_str = readline(proc) port = parse(UInt16, port_str) # Connect socket = Sockets.connect(port) _buffer_writes(socket) # There's no reason to keep the worker process alive after the manager loses its handle. w = finalizer(w -> @async(stop(w)), new( port, proc, getpid(proc), socket, MsgID(0), Dict{MsgID,Channel{WorkerResult}}(), ) ) atexit(() -> stop(w)) _exit_loop(w) _receive_loop(w) return w end end Base.summary(io::IO, w::Worker) = write(io, "Malt.Worker on port $(w.port) with PID $(w.proc_pid)") function _exit_loop(worker::Worker) @async for _i in Iterators.countfrom(1) try if !isrunning(worker) # the worker got shut down, which means that we will never receive one of the expected_replies. So let's give all of them a special_worker_terminated reply. for c in values(worker.expected_replies) isready(c) || put!(c, WorkerResult(MsgType.special_worker_terminated, nothing)) end break end sleep(1) catch e @error "Unexpection error inside the exit loop" worker exception=(e,catch_backtrace()) end end end function _receive_loop(worker::Worker) io = worker.current_socket # Here we use: # `for _i in Iterators.countfrom(1)` # instead of # `while true` # as a workaround for https://github.com/JuliaLang/julia/issues/37154 @async for _i in Iterators.countfrom(1) try if !isopen(io) @debug("HOST: io closed.") break end @debug "HOST: Waiting for message" msg_type = try if eof(io) @debug("HOST: io closed.") break end read(io, UInt8) catch e if e isa InterruptException @debug("HOST: Caught interrupt while waiting for incoming data, rethrowing to REPL...") _rethrow_to_repl(e; rethrow_regular=false) continue # and go back to waiting for incoming data else @debug("HOST: Caught exception while waiting for incoming data, breaking", exception = (e, backtrace())) break end end # this next line can't fail msg_id = read(io, MsgID) msg_data, success = try deserialize(io), true catch err err, false finally _discard_until_boundary(io) end if !success msg_type = MsgType.special_serialization_failure end # msg_type will be one of: # MsgType.from_worker_call_result # MsgType.from_worker_call_failure # MsgType.special_serialization_failure c = get(worker.expected_replies, msg_id, nothing) if c isa Channel{WorkerResult} put!(c, WorkerResult(msg_type, msg_data)) else @error "HOST: Received a response, but I didn't ask for anything" msg_type msg_id msg_data end @debug("HOST: Received message", msg_data) catch e if e isa InterruptException @debug "HOST: Interrupted during receive loop." _rethrow_to_repl(e) elseif e isa Base.IOError && !isopen(io) sleep(3) if isrunning(worker) @error "HOST: Connection lost with worker, but the process is still running. Killing process..." exception = (e, catch_backtrace()) kill(worker, Base.SIGKILL) else # This is a clean exit end break else @error "HOST: Unknown error" exception = (e, catch_backtrace()) isopen(io) break end end end end # The entire `src` dir should be relocatable, so that worker.jl can include("MsgType.jl"). const src_path = RelocatableFolders.@path @__DIR__ function _get_worker_cmd(exe=Base.julia_cmd()[1]; env, exeflags) return addenv(`$exe --startup-file=no $exeflags $(joinpath(src_path, "worker.jl"))`, String["OPENBLAS_NUM_THREADS=1", Base.byteenv(env)...]) end ## We use tuples instead of structs for messaging so the worker doesn't need to load additional modules. _new_call_msg(send_result::Bool, f::Function, args, kwargs) = ( f, args, kwargs, !send_result, ) _new_do_msg(f::Function, args, kwargs) = ( f, args, kwargs, true, ) # function _ensure_connected(w::Worker) # # TODO: check if process running? # # TODO: `while` instead of `if`? # if w.current_socket === nothing || !isopen(w.current_socket) # w.current_socket = connect(w.port) # @async _receive_loop(w) # end # return w # end # GENERIC COMMUNICATION PROTOCOL """ Low-level: send a message to a worker. Returns a `msg_id::UInt16`, which can be used to wait for a response with `_wait_for_response`. """ function _send_msg(worker::Worker, msg_type::UInt8, msg_data, expect_reply::Bool=true)::MsgID _assert_is_running(worker) # _ensure_connected(worker) msg_id = (worker.current_message_id += MsgID(1))::MsgID if expect_reply worker.expected_replies[msg_id] = Channel{WorkerResult}(1) end @debug("HOST: sending message", msg_data) _serialize_msg(worker.current_socket, msg_type, msg_id, msg_data) return msg_id end """ Low-level: wait for a response to a previously sent message. Returns the response. Blocking call. """ function _wait_for_response(worker::Worker, msg_id::MsgID) if haskey(worker.expected_replies, msg_id) c = worker.expected_replies[msg_id] @debug("HOST: waiting for response of", msg_id) response = take!(c) delete!(worker.expected_replies, msg_id) return unwrap_worker_result(worker, response) else error("HOST: No response expected for message id $msg_id") end end """ `_wait_for_response ∘ _send_msg` """ function _send_receive(w::Worker, msg_type::UInt8, msg_data) msg_id = _send_msg(w, msg_type, msg_data, true) return _wait_for_response(w, msg_id) end """ `@async(_wait_for_response) ∘ _send_msg` """ function _send_receive_async(w::Worker, msg_type::UInt8, msg_data, output_transformation=identity)::Task # TODO: Unwrap TaskFailedExceptions msg_id = _send_msg(w, msg_type, msg_data, true) return @async output_transformation(_wait_for_response(w, msg_id)) end """ Malt.remote_call(f, w::Worker, args...; kwargs...) Evaluate `f(args...; kwargs...)` in worker `w` asynchronously. Returns a task that acts as a promise; the result value of the task is the result of the computation. The function `f` must already be defined in the namespace of `w`. # Examples ```julia-repl julia> promise = Malt.remote_call(uppercase ∘ *, w, "I ", "declare ", "bankruptcy!"); julia> fetch(promise) "I DECLARE BANKRUPTCY!" ``` """ function remote_call(f, w::Worker, args...; kwargs...) _send_receive_async( w, MsgType.from_host_call_with_response, _new_call_msg(true, f, args, kwargs), ) end function remote_call(f, w::InProcessWorker, args...; kwargs...) w.latest_request_task = @async remote_call_fetch(f, w, args...; kwargs...) end function remote_call_fetch(f, w::InProcessWorker, args...; kwargs...) try f(args...; kwargs...) catch ex throw(RemoteException( w, sprint() do io Base.invokelatest(showerror, io, ex, catch_backtrace()) end )) end end function remote_call_wait(f, w::InProcessWorker, args...; kwargs...) remote_call_fetch(f, w, args...; kwargs...) nothing end """ Malt.remote_call_fetch(f, w::Worker, args...; kwargs...) Shorthand for `fetch(Malt.remote_call(…))`. Blocks and then returns the result of the remote call. """ function remote_call_fetch(f, w::AbstractWorker, args...; kwargs...) fetch(remote_call(f, w, args...; kwargs...)) end function remote_call_fetch(f, w::Worker, args...; kwargs...) _send_receive( w, MsgType.from_host_call_with_response, _new_call_msg(true, f, args, kwargs) ) end """ Malt.remote_call_wait(f, w::Worker, args...; kwargs...) Shorthand for `wait(Malt.remote_call(…))`. Blocks and discards the resulting value. """ function remote_call_wait(f, w::AbstractWorker, args...; kwargs...) wait(remote_call(f, w, args...; kwargs...)) end function remote_call_wait(f, w::Worker, args...; kwargs...) _send_receive( w, MsgType.from_host_call_with_response, _new_call_msg(false, f, args, kwargs) ) end """ Malt.remote_do(f, w::Worker, args...; kwargs...) Start evaluating `f(args...; kwargs...)` in worker `w` asynchronously, and return `nothing`. Unlike `remote_call`, no reference to the remote call is available. This means: - You cannot wait for the call to complete on the worker. - The value returned by `f` is not available. """ function remote_do(f, w::Worker, args...; kwargs...) _send_msg( w, MsgType.from_host_call_without_response, _new_do_msg(f, args, kwargs), false ) nothing end function remote_do(f, ::InProcessWorker, args...; kwargs...) @async f(args...; kwargs...) nothing end ## Eval variants """ Malt.remote_eval(mod::Module=Main, w::Worker, expr) Evaluate expression `expr` under module `mod` on the worker `w`. `Malt.remote_eval` is asynchronous, like `Malt.remote_call`. The module `m` and the type of the result of `expr` must be defined in both the main process and the worker. # Examples ```julia-repl julia> Malt.remote_eval(w, quote x = "x is a global variable" end) julia> Malt.remote_eval_fetch(w, :x) "x is a global variable" ``` """ remote_eval(mod::Module, w::AbstractWorker, expr) = remote_call(Core.eval, w, mod, expr) remote_eval(w::AbstractWorker, expr) = remote_eval(Main, w, expr) """ Shorthand for `fetch(Malt.remote_eval(…))`. Blocks and returns the resulting value. """ remote_eval_fetch(mod::Module, w::AbstractWorker, expr) = remote_call_fetch(Core.eval, w, mod, expr) remote_eval_fetch(w::AbstractWorker, expr) = remote_eval_fetch(Main, w, expr) """ Shorthand for `wait(Malt.remote_eval(…))`. Blocks and discards the resulting value. """ remote_eval_wait(mod::Module, w::AbstractWorker, expr) = remote_call_wait(Core.eval, w, mod, expr) remote_eval_wait(w::AbstractWorker, expr) = remote_eval_wait(Main, w, expr) """ Malt.worker_channel(w::AbstractWorker, expr) Create a channel to communicate with worker `w`. `expr` must be an expression that evaluates to an `AbstractChannel`. `expr` should assign the channel to a (global) variable so the worker has a handle that can be used to send messages back to the manager. """ function worker_channel(w::Worker, expr) RemoteChannel(w, expr) end function worker_channel(w::InProcessWorker, expr) remote_call_fetch(w) do result = Core.eval(w.host_module, expr) @assert result isa AbstractChannel result end end struct RemoteChannel{T} <: AbstractChannel{T} worker::Worker id::UInt64 function RemoteChannel{T}(worker::Worker, expr) where {T} id = (worker.current_message_id += MsgID(1))::MsgID remote_eval_wait(Main, worker, quote Main._channel_cache[$id] = $expr end) new{T}(worker, id) end RemoteChannel(w::Worker, expr) = RemoteChannel{Any}(w, expr) end Base.take!(rc::RemoteChannel) = remote_eval_fetch(Main, rc.worker, :(take!(Main._channel_cache[$(rc.id)])))::eltype(rc) Base.put!(rc::RemoteChannel, v) = remote_eval_wait(Main, rc.worker, :(put!(Main._channel_cache[$(rc.id)], $v))) Base.isready(rc::RemoteChannel) = remote_eval_fetch(Main, rc.worker, :(isready(Main._channel_cache[$(rc.id)])))::Bool Base.wait(rc::RemoteChannel) = remote_eval_wait(Main, rc.worker, :(wait(Main._channel_cache[$(rc.id)])))::Bool ## Signals & Termination """ Malt.isrunning(w::Worker)::Bool Check whether the worker process `w` is running. """ isrunning(w::Worker)::Bool = Base.process_running(w.proc) isrunning(w::InProcessWorker) = w.running _assert_is_running(w::Worker) = isrunning(w) || throw(TerminatedWorkerException()) """ Malt.stop(w::Worker; exit_timeout::Real=15.0, term_timeout::Real=15.0)::Bool Terminate the worker process `w` in the nicest possible way. We first try using `Base.exit`, then SIGTERM, then SIGKILL. Waits for the worker process to be terminated. If `w` is still alive, and now terinated, `stop` returns true. If `w` is already dead, `stop` returns `false`. If `w` failed to terminate, throw an exception. """ function stop(w::Worker; exit_timeout::Real=15.0, term_timeout::Real=15.0) ir = () -> !isrunning(w) if isrunning(w) remote_do(Base.exit, w) if !_poll(ir; timeout_s=exit_timeout) kill(w, Base.SIGTERM) if !_poll(ir; timeout_s=term_timeout) kill(w, Base.SIGKILL) _wait_for_exit(w) end end true else false end end function stop(w::InProcessWorker) w.running = false true end """ kill(w::Malt.Worker, signum=Base.SIGTERM) Terminate the worker process `w` forcefully by sending a `SIGTERM` signal (unless otherwise specified). This is not the recommended way to terminate the process. See `Malt.stop`. """ # https://youtu.be/dyIilW_eBjc Base.kill(w::Worker, signum=Base.SIGTERM) = Base.kill(w.proc, signum) Base.kill(::InProcessWorker, signum=Base.SIGTERM) = nothing function _poll(f::Function; interval::Real=0.01, timeout_s::Real=Inf64) tstart = time() while true f() && return true if time() - tstart >= timeout_s return false end sleep(interval) end end _wait_for_exit(::AbstractWorker; timeout_s::Real=20.0) = nothing function _wait_for_exit(w::Worker; timeout_s::Real=20.0) if !_poll(() -> !isrunning(w); timeout_s) error("HOST: Worker did not exit after $timeout_s seconds") end end """ Malt.interrupt(w::Worker) Send an interrupt signal to the worker process. This will interrupt the latest request (`remote_call*` or `remote_eval*`) that was sent to the worker. """ function interrupt(w::Worker) if !isrunning(w) @warn "Tried to interrupt a worker that has already shut down." summary(w) else if Sys.iswindows() ccall((:GenerateConsoleCtrlEvent,"Kernel32"), Bool, (UInt32, UInt32), UInt32(1), UInt32(getpid(w.proc))) else Base.kill(w.proc, Base.SIGINT) end end nothing end function interrupt(w::InProcessWorker) istaskdone(w.latest_request_task) || schedule(w.latest_request_task, InterruptException(); error=true) nothing end # Based on `Base.task_done_hook` function _rethrow_to_repl(e::InterruptException; rethrow_regular::Bool=false) if isdefined(Base, :active_repl_backend) && isdefined(Base.active_repl_backend, :backend_task) && isdefined(Base.active_repl_backend, :in_eval) && Base.active_repl_backend.backend_task.state === :runnable && (isdefined(Base, :Workqueue) || isempty(Base.Workqueue)) && Base.active_repl_backend.in_eval @debug "HOST: Rethrowing interrupt to REPL" @async Base.schedule(Base.active_repl_backend.backend_task, e; error=true) elseif rethrow_regular @debug "HOST: Don't know what to do with this interrupt, rethrowing" exception = (e, catch_backtrace()) rethrow(e) end end end # module const MsgType = ( from_host_call_with_response = UInt8(1), from_host_call_without_response = UInt8(2), from_host_fake_interrupt = UInt8(20), #### from_worker_call_result = UInt8(80), from_worker_call_failure = UInt8(81), ### special_serialization_failure = UInt8(100), special_worker_terminated = UInt8(101), ) const MsgID = UInt64 const BUFFER_SIZE = 65536 # Base.SZ_UNBUFFERED_IO # Future-compat version of Base.buffer_writes _buffer_writes(io) = @static if isdefined(Base, :buffer_writes) && hasmethod(Base.buffer_writes, (Base.LibuvStream, Int)) Base.buffer_writes(io, BUFFER_SIZE) end # from Distributed.jl: # # Boundary inserted between messages on the wire, used for recovering # from deserialization errors. Picked arbitrarily. # A size of 10 bytes indicates ~ ~1e24 possible boundaries, so chance of collision # with message contents is negligible. const MSG_BOUNDARY = UInt8[0x79, 0x8e, 0x8e, 0xf5, 0x6e, 0x9b, 0x2e, 0x97, 0xd5, 0x7d] function _discard_until_boundary(io::IO) readuntil(io, MSG_BOUNDARY) end function _serialize_msg(io::IO, msg_type::UInt8, msg_id::MsgID, msg_data::Any) lock(io) try write(io, msg_type) write(io, msg_id) serialize(io, msg_data) write(io, MSG_BOUNDARY) flush(io) finally unlock(io) end return nothing endDistributedStdlibWorker.jl worker.jlMalt.jl shared.jl(dc751d595ff737f24685379b3c876d33d6bbbb1d"/opt/julia/packages/Malt/Z3YQq/src虨7HOST: Unknown errorWHOST: Connection lost with worker, but the process is still running. Killing process...&HOST: Interrupted during receive loop.HOST: Received message8HOST: Received a response, but I didn't ask for anything@HOST: Caught exception while waiting for incoming data, breakingMHOST: Caught interrupt while waiting for incoming data, rethrowing to REPL...HOST: Waiting for messageHOST: io closed.*/opt/julia/packages/Malt/Z3YQq/src/Malt.jl9+{.!J9虨749虨7- I-!P. O?-!Z6+{ I. L. L V+ . L49虨7-9虨7-k6+@     I9虨79虨7 I-!M9虨7.9虨7 6!+= I49虨7 I# I A9虨7.9虨7O9虨7V-9虨7k&6'+= I49虨7 A9虨79虨7 9虨7 6*+= I 9虨7 .9虨7w 9虨76-+1!9虨7 I -/ I + I 9虨7 I A i6>+= A!i.!@5 -!e667+; A9虨79虨7 9虨7   3+< A 69虨79虨7 9虨7   3+=9虨7V W3+{ I9虨79虨7 I-!M9虨7.9虨7JK6L+h I49虨7 I# I A9虨7.9虨7O9虨7V-9虨7kQ6R+h I49虨7 A9虨79虨7 9虨7 6U+h I9虨7 .9虨7w9虨76X+\!9虨7 I-Z I+ I9虨7 I A i6>+h A!i.!@`-!ea6b+f A9虨79虨7 9虨73+g A a9虨79虨7 9虨73+h9虨7V V+. L49虨7-9虨7j6k+ !"#$% I'9虨79虨7 I&'&-!M9虨7.9虨7wx6y+ I%49虨7 I$# I# A9虨7&%$.9虨7O#9虨7V-9虨7k~6+ I"49虨7 A9虨79虨7 9虨7 #'$%"6+ I!9虨7 .9虨7w!9虨76+!9虨7 I!-! I + I9虨7 I A i6>+ A!i.!@-!e6+ A9虨79虨7 9虨7#'$%"! 3+ A 9虨79虨7 9虨7#'$%"! 3+9虨7V W3+{. L49虨7 Iv. W3+ W I( .w(9虨76+)*+,-./0 I29虨79虨7 I121-!M9虨7.9虨76+ I049虨7 I/# I. A9虨710/.9虨7O.9虨7V-9虨7k6+ I-49虨7 A9虨79虨7 9虨7 .2/0-6+ I,9虨7 .9虨7w,9虨76+!9虨7 I,-, I++ I)9虨7 I* A i6>+ A!i.!@*-!e6+ A9虨79虨7 9虨7.2)/0-,+3+ A 9虨79虨7 9虨7.2)/0-,+3+9虨7V9虨7. K i- F=- A 9虨7( ~i W3+v3+v Iw3+3456789: I<9虨79虨7 I;<;-!M9虨7.9虨76+  I:49虨7 I9# I8 A9虨7;:9.9虨7O89虨7V-9虨7k6+  I749虨7 A9虨79虨7 9虨7 8<9:76+  I69虨7 .9虨7w69虨76+!9虨7 I6-6 I5+ V+ I39虨79虨7. K i( A9虨7. F- F I4- Ix> W3+ W I=  A!9虨7 9虨79虨78<9:765=> Ix= ~6x+  A!i.!@)4-!e)6)+  A9虨79虨7 9虨78<39:7653+  A )9虨79虨7 9虨78<39:7653+ 9虨7V ~i W3+{3+{ Iw) Ivw ~i I v. L49虨7 I.)9虨7 V+% Iy+ V+. L49虨7-9虨7) Iz. F)> W3+" W I>  Iz. F>= ~) I{z W3+' W Iy. L49虨7-9虨7 )'. Oy6))+, A!{.!l), I. L)- I. L)- A!l), I. L)0-k6)2+5 I .!J9虨7!49虨7". L49虨7#.!J)549虨7$ I AQ)6)7V. K9虨7%9虨7&.w)9):6);+A.9虨7& .9虨7')=)>3+?@ABCDEF IH9虨79虨7( IGHG-!M9虨7.9虨7)K)L6)M+ IF49虨7 IE# ID A9虨7GFE.9虨7OD9虨7V-9虨7k)R6)S+ IC49虨7) A9虨79虨7 9虨7 DHEFC6)V+ IB9虨7 .9虨7wB9虨76)Y+]!9虨7 IB-)[B IA+ 0 6)^+l 06)`+i 06)b+f I~?3+g I~- 9虨7*49虨7+ I}~3+j I}- 9虨7*49虨7, I|}3+m I|- 9虨7*49虨7-| II)m.9虨7OI9虨7V6)o+x I?9虨7.9虨7/. K i)r A F  I@-)s)t I>3+z A!9虨7 9虨79虨7DHEFCBAI= I=6+ A!i.!@){@-!e)|6)}+ A9虨79虨7 9虨7DH?EFCBA3+ A )|9虨79虨7 9虨7DH?EFCBA3+9虨7VJKLMNOPQ IS9虨79虨7 IRSR-!M9虨7.9虨7))6)+ IQ49虨7 IP# IO A9虨7RQP.9虨7OO9虨7V-9虨7k)6)+ IN49虨70 A9虨79虨7 9虨7 OSPQN6)+ IM9虨7 .9虨7wM9虨76)+!9虨7 IM-)M IL+ 06)+ I?3+ I- 9虨7*49虨7+ IT).9虨7OT9虨7V6)+ IJ9虨719虨72. K i)- F IK-)) I>3+ A!9虨7 9虨79虨7OSPQNMLT= I=6+ A!i.!@)K-!e)6)+ A9虨79虨7 9虨7OSJPQNML3+ A )9虨79虨7 9虨7OSJPQNML3+9虨7V W3+v W IU .wU9虨76)+VWXYZ[\] I_9虨79虨7 I^_^-!M9虨7.9虨7))6)+ I]49虨7 I\# I[ A9虨7^]\.9虨7O[9虨7V-9虨7k)6)+ IZ49虨73 A9虨79虨7 9虨7 [_\]Z6)+ IY9虨7 .9虨7wY9虨76)+!9虨7 IY-)Y IX+ IV9虨74 IW A i6>+ A!i.!@)W-!e)6)+ A9虨79虨7 9虨7[_V\]ZYX3+ A )9虨79虨7 9虨7[_V\]ZYX3+9虨7V-9虨7U3+uU!9虨75.w))6)+9. L49虨7-9虨7)-k)6)+9-9虨76. L49虨7#-9虨77)6)+6`abcdefg Ii9虨79虨7( Ihih-!M9虨7.9虨7))6)+1 Ig49虨7 If# Ie A9虨7hgf.9虨7Oe9虨7V-9虨7k) 6) +1 Id49虨78 A9虨79虨7 9虨7 eifgd6)+1 Ic9虨7 .9虨7wc9虨76)+!9虨7 Ic-)c Ib+ V+# I`9虨799虨7. K i)U A9虨7:. F))- F) Ia-)) I> W3+( W Ij  A!9虨7 9虨79虨7eifgdcbj> I= ~)6+1 A!i.!@))a-!e)*6)++/ A9虨79虨7 9虨7ei`fgdcb3+0 A )*9虨79虨7 9虨7ei`fgdcb3+19虨7V. L49虨7#!9虨7;.9虨7<)2)33+6 ~ 3+{3+uklmnopqr It9虨79虨7( Ists-!M9虨7.9虨7)C)D6)E+r Ir49虨7 Iq# Ip A9虨7srq.9虨7Op9虨7V-9虨7k)J6)K+r Io49虨7= A9虨79虨7 9虨7 ptqro6)N+r In9虨7 .9虨7wn9虨76)Q+U!9虨7 In-)Sn Im+ V+d Ik9虨7>9虨7?. K i)XU A9虨7:. F)Z)[. L49虨7-9虨7)]. F)\)^ Il-)Y)_ I> W3+i W Iu  A!9虨7 9虨79虨7ptqronmu> I= ~)V6+r A!i.!@)jl-!e)k6)l+p A9虨79虨7 9虨7ptkqronm3+q A )k9虨79虨7 9虨7ptkqronm3+r9虨7V ~ 3+{ ~ I.!P . O?-!Z)w6)x+{37?+{+{?+/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#5,~/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,T/#5,U/#5,V/#5,/#9虨7@9虨7A,/#9虨7@9虨7A,/#5,~,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,T,/#5,U,/#5,V,/#5,,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#5,~,1/#5,,1/#5,,1/#5,,1/#5,,1/#5,,1/#5,,1/#5,,1/#5,,1/#5,,1/#5,,1/#5,,1/#5,,1/#5,,1/#5,,1/#5,,1/#5,T,1/#5,U,1/#5,V,1/#5,,1/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#5,~,I/#5,,I/#5,,I/#5,,I/#5,,I/#5,,I/#5,,I/#5,,I/#5,,I/#5,,I/#5,,I/#5,,I/#5,,I/#5,,I/#5,,I/#5,,I/#5,T,I/#5,U,I/#5,V,I/#5,,I/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#5,~,`/#5,,`/#5,,`/#5,,`/#5,,`/#5,,`/#5,,`/#5,,`/#5,,`/#5,,`/#5,,`/#5,,`/#5,,`/#5,,`/#5,,`/#5,,`/#5,s,`/#5,t,`/#5,u,`/#5,v,`/#5,x,`/#5,y,`/#5,,`/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#5,~,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,f,/#5,g,/#5,h,/#5,i,/#5,j,/#5,l,/#5,m,/#5,,/#9虨7@9虨7A,/#5,~,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,f,/#5,g,/#5,h,/#5,i,/#5,j,/#5,l,/#5,m,/#5,,/#9虨7@9虨7A,/#9虨7@9虨7A,/#5,~,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,T,/#5,U,/#5,V,/#5,,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#5,~,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,s,/#5,t,/#5,u,/#5,v,/#5,x,/#5,y,/#5,,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#9虨7@9虨7A,/#5,~,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,,/#5,s,/#5,t,/#5,u,/#5,v,/#5,x,/#5,y,/#5,,/#9虨7@9虨7A,/#9虨7@9虨7A,?  !"""#$$%&&''(+,-------./00022222222345555678999:;;<==>>?BCDDDDDDDEFFGGGGGGHHJJJJJJJJKLMMMMNOPQQQRSSTUUVVWZ[\\\\\\\]^^^^^_____aaaaaaaabcddddefghhhijjkllmmnqrssssssstttttuvvvvvvvvvwxxxxxxxxyyzzz{{{{{{{|||||||}}}}}}}}}}}~~#self#_icsuccessmsg_datamsg_idmsg_typemsgkwargslinefileidlogger_modulegroupstd_levellevelmsgkwargslinefileidlogger_modulegroupstd_levellevelmsgkwargslinefileidlogger_modulegroupstd_levellevelemsgkwargslinefileidlogger_modulegroupstd_levellevelmsgkwargslinefileidlogger_modulegroupstd_levellevelerrerrmsgkwargslinefileidlogger_modulegroupstd_levellevelerrmsgkwargslinefileidlogger_modulegroupstd_levellevelerremsgkwargslinefileidlogger_modulegroupstd_levellevelmsgkwargslinefileidlogger_modulegroupstd_levellevelerrmsgkwargslinefileidlogger_modulegroupstd_levellevelerr虨7K I.!J49虨79虨7- -  A K I R I-!9虨76=.!9虨79虨7-!9虨77 ?/#9虨79虨7,/#9虨79虨7,/#5z,/#5z, /#5z, /#5z, /#5z, /#5z,?#self#workerio#27task虨7&Unexpection error inside the exit loop*/opt/julia/packages/Malt/Z3YQq/src/Malt.jl-+l.!J9虨749虨7- I-!P. O?-!Z6+l I. L. L V++. L49虨7-9虨7 -k 6+(. L49虨7.!J49虨7-9虨7 I-!P. O?-!Z6+& I. L. L-9虨76+3+!.!J9虨749虨7.9虨7 V.9虨7  I.!P. O?-!Z"6#+&3+ W3+l-9虨7 W3+g W I       I9虨7 9虨7 I-!M9虨7.9虨7 7869+e I49虨7 I # I A9虨7 .9虨7 O 9虨7 V-9虨7 k>6?+e I 49虨7 A9虨7 9虨79虨7   6B+e I 9虨7.9虨7 w 9虨7 6E+I!9虨7 I -G I + V+W I9虨79虨7. K iL. L49虨7 A9虨7. FOP. FNQ I-MR I> W3+\ W I  A!9虨79虨7 9虨7     > I= ~J6+e A!i.!@]-!e^6_+c A9虨7 9虨79虨7     3+d A ^9虨7 9虨79虨7     3+e9虨7 V ~ I.!P . O?-!Zh6i+l37?+l+l?+!/#9虨79虨7,/#9虨79虨7,/#9虨79虨7,/#9虨79虨7,/#9虨79虨7,/#9虨79虨7,/#9虨79虨7,/#9虨79虨7,/#9虨79虨7,/#5,~/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,s/#5,t/#5,u/#5,v/#5,x/#5,y/#5,/#9虨79虨7,?  !!!!!R#self#_icemsgkwargslinefileidlogger_modulegroupstd_levellevelerr虨79虨7- . K I R I-!9虨76=.!9虨79虨7-!9虨77 ?/#9虨79虨7,/#5z,/#5z, /#5z, /#5z, /#5z, /#5z,?#self#worker#25task虨7w++Q?9虨7. K i. F- I . 9虨79虨7. K i . F>>-  A  9虨7 I .9虨7 9虨7 A9虨7.9虨7 I -9虨7 I .9虨7  9虨7 9虨7 I- -9虨7  I R9虨7 9虨7.  I . w6+3+ I.!N.  I . w 6"+%3+& I.!N .  I-9虨7 . w'6)+,3+- I.!N'.  I. w.60+33+4 I.!N..  I-9虨7. w567+:3+; I.!N5. 9虨7. K9虨79虨7 A K=>? I A@. w <6B+E3+F I .!N<  R&-4;F I.9虨7G9虨7- . KIJ I RK-9虨7M-9虨7-9虨77+Q+Q?/#9虨79虨7,i/#9虨79虨7,j/#9虨79虨7,q/#9虨79虨7,r/#9虨79虨7,u/#9虨79虨7,v/#9虨79虨7,y/#9虨79虨7,z/#9虨79虨7,~/#9虨79虨7,/#9虨79虨7,/#9虨79虨7,/#9虨79虨7,? B#_#17envexeflags#20#18wsocketportport_strproccmd虨7`. L49虨7-9虨77?/#9虨79虨7,?#self#虨79虨7- . K I R I-!9虨76=.!9虨79虨7-!9虨77 ?/#9虨79虨7,~/#5z,/#5z, /#5z, /#5z, /#5z, /#5z,?#self#w#19task虨7`. L49虨7-9虨77?/#9虨79虨7,~?#self#虨7f!9虨7.9虨79虨77?/#9虨79虨7,N?#self#@ (08虨7:7V?/#9虨79虨7,F?#self#虨7.!J49虨7-9虨763 A9虨79虨7. K i- F>-9虨7.!J49虨7 A    7V?/#9虨79虨7,w/#9虨79虨7,x? #self#w虨7Kernel327Tried to interrupt a worker that has already shut down.*/opt/julia/packages/Malt/Z3YQq/src/Malt.jl+N-9虨7-k6+;  I 9虨79虨7 I   -!M9虨7.9虨76+9 I 49虨7 I # I A9虨7   .9虨7O9虨7V-9虨7k6+9 I49虨7 A9虨79虨79虨7   6+9 I9虨7 .9虨7w9虨76+ !9虨7 I- I+l V++ I9虨7 9虨7 . K i#-9虨7 - F% I-$& I> W3+0 W I  A!9虨79虨79虨7    > I= ~!6+9 A!i.!@1-!e263+7 A9虨79虨79虨7   3+8 A 29虨79虨79虨7   3+99虨7V3+N.!J9虨749虨7 A;6<+J<-<.!`>?<.!J49虨7-9虨7B-<C.!`AD.!Y<@.!Y<E S. F49虨79虨749虨7FGE@3+N!9虨7.!J49虨7!9虨7.JKL7V+N+N?+/#9虨79虨7,k/#9虨79虨7,l/#5,~/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,s/#5,t/#5,u/#5,v/#5,x/#5,y/#5,/#9虨79虨7,n/#9虨79虨7,o/#9虨79虨7,q/#9虨79虨7,t? K#self#wmsgkwargslinefileidlogger_modulegroupstd_levellevelerr虨7HMalt.interrupt is not supported on Windows for a DistributedStdlibWorker=/opt/julia/packages/Malt/Z3YQq/src/DistributedStdlibWorker.jl +1.!J9虨749虨7 A6+.  I 9虨79虨7 I   -!M9虨7.9虨76+, I 49虨7 I # I A9虨7   .9虨7O9虨7V-9虨7k6+, I49虨7 A9虨79虨79虨7    6+, I9虨7 .9虨7w9虨76+ !9虨7 I- I+[ I9虨7 I A i6>+, A!i.!@$-!e%6&+* A9虨79虨79虨7    3++ A %9虨79虨79虨7    3+,9虨7V7V9虨79虨7.!J49虨7-./70+1+1?+/#9虨79虨7,Z/#9虨79虨7,[/#5,~/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,T/#5,U/#5,V/#5,/#9虨79虨7,\/#9虨79虨7,^? F#self#wmsgkwargslinefileidlogger_modulegroupstd_levellevel虨7P.!J49虨77?/#9虨79虨7,#? #self#w虨7!9虨7.!J49虨7- I. w63.!N I.  7?/#9虨79虨7,"? #self#w虨7P.!J49虨77?/#9虨79虨7,M? #self#w虨79虨7- -  A K I R.9虨77?/#9虨79虨7,?#self#wexpr#48虨7Q.9虨77?/#9虨79虨7,?#self#wexpr虨7+" V.!J9虨749虨79虨79虨7 449虨7 A 49虨7 49虨7 49虨7-9虨7 A 4A49虨7 A 49虨7 4I9虨7  A 49虨7  .!J49虨7 A 4A  A 49虨7 4I9虨7 . W7 W I 9虨7 9虨7.w6+ 9虨7.!J49虨7.9虨7.9虨7-U ~7- ~7 +"+"?/#9虨79虨7 ,H/#9虨79虨7 ,,/#9虨79虨7 ,./#9虨79虨7 ,//#9虨79虨7 ,1?#self#wexpre虨7? A!i.!@-!e69虨79虨7.!J49虨7. F A }!P7 9虨79虨7.!J49虨7 A F  A }!P  7?/#9虨79虨7,D?#remote_do#14kwargsfwargs虨7U+ ? V A!i.!@-!e69虨79虨7.!J49虨7. F A }!P 39虨79虨7.!J49虨7 A F  A }!P  W3+ W I 9虨79虨7.w6+9虨7.!J49虨7.9虨7.9虨7-U3+- ~7V+ + ?/#9虨79虨7 ,?/#9虨79虨7 ,,/#9虨79虨7 ,./#9虨79虨7 ,//#9虨79虨7 ,1/#9虨79虨7 ,@?(#remote_call_wait#13kwargsfwargse虨7Q+"? V A!i.!@-!e69虨79虨7.!J49虨7. F I A }!P 39虨79虨7.!J49虨7 A F  I A }!P  W7 W I 9虨79虨7.w6+ 9虨7.!J49虨7.9虨7.9虨7-U ~7- ~7 +"+"?/#9虨79虨7 ,;/#9虨79虨7 ,,/#9虨79虨7 ,./#9虨79虨7 ,//#9虨79虨7 ,1?*#remote_call_fetch#12kwargsfwargse虨7+ A!i. L49虨7.!@-!e69虨79虨7. L49虨7. L49虨7.!J49虨7. F . L49虨7 A }!P  7 9虨79虨7. L49虨7. L49虨7.!J49虨7 A F. L49虨7 A }!P 7++?/#9虨79虨7,7?#self#虨76?9虨7- - - -  A K I R I-!9虨7 6=.!9虨79虨7-!9虨77?/#9虨79虨7,7/#5z,/#5z, /#5z, /#5z, /#5z, /#5z,?)#remote_call#9kwargsfwargs#10task虨7??- A 49虨74,9虨7 49虨79虨7- 49虨7 A 4A A 4A4U A 49虨74/9虨7 49虨7 A 49虨7  A 49虨74.9虨7 A 49虨749虨77?/#9虨7 9虨7,+?'#self#__source____module__workerex虨7@Malt.DistributedStdlibWorker: the `env` kwarg requires Julia 1.9=/opt/julia/packages/Malt/Z3YQq/src/DistributedStdlibWorker.jlaaa +b? ._9虨79虨76+=-e6 3+5   I9虨79虨7 I-!M9虨7.9虨76+4 I49虨7 I# I A9虨7.9虨7O9虨7V-9虨7k6+4 I49虨7 A9虨79虨79虨7 6!+4 I9虨7 .9虨7w9虨76$+(!9虨7 I-& I I 9虨7 I A i6>+4 A!i.!@, -!e-6.+2 A9虨79虨79虨7  3+3 A -9虨79虨79虨7  3+49虨7V9虨7 449虨7 A 49虨756 A 49虨749虨7. 49虨78 A 4A79 I A 4A49虨7:43+E9虨7 449虨7 A 49虨7=> A 49虨749虨7 A 49虨749虨7 A 49虨7@A A 4A?B I A 4A49虨7C4 I 9虨79虨79虨7 I AFG I R9虨79虨7. K I . w L6N+Q3+R I .!NL  . K I >. w S6U+X3+Y I .!NS  RKRY I.9虨7JZ9虨7- . K\] I R^-9虨7`7+b+b?+/#9虨79虨7/#9虨79虨7/#5,~/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,/#5,T/#5,U/#5,V/#5,/#9虨79虨7,/#9虨79虨7,/#9虨79虨7,/#9虨79虨7,/#9虨79虨7,!/#9虨79虨7,#? d#_#1envexeflags#4#2wpidexprmsgkwargslinefileidlogger_modulegroupstd_levellevel虨7`. L49虨7-9虨77?/#9虨79虨7,!?#self#虨79虨7- . K I R I-!9虨76=.!9虨79虨7-!9虨77 ?/#9虨79虨7,/#5z,/#5z, /#5z, /#5z, /#5z, /#5z,?#self#w#3task虨7`. L49虨7-9虨77?/#9虨79虨7,?#self# Distributed$8ba89e20-285c-5b6f-9357-94700520ee1b虨7: Error deserializing data from +.!J49虨7.!J9虨749虨7.Q6-9虨7!9虨7.!J4.9虨7 A!y9虨79虨7-9虨7 -U 7 .!J49虨7.!J9虨749虨7 .Q 6 A9虨7 -U7.!J49虨7.!J9虨749虨7 .Q6+.!J4.9虨7 -U7.!J47++?/#9虨7 9虨7,-/#9虨7 9虨7,./#9虨7 9虨7,//#9虨7 9虨7,0/#9虨7 9虨7,1/#9虨7 9虨7,2/#9虨7 9虨7,4?#self#workerresult*/opt/julia/packages/Malt/Z3YQq/src/Malt.jldڻ Malt.interrupt(w::Worker) Send an interrupt signal to the worker process. This will interrupt the latest request (`remote_call*` or `remote_eval*`) that was sent to the worker. */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻLow-level: send a message to a worker. Returns a `msg_id::UInt16`, which can be used to wait for a response with `_wait_for_response`. */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻThe Malt module doesn't export anything, use qualified names instead. Internal functions are marked with a leading underscore, these functions are not stable. */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻ Malt.Worker() Create a new `Worker`. A `Worker` struct is a handle to a (separate) Julia process. # Examples ```julia-repl julia> w = Malt.worker() Malt.Worker(0x0000, Process(`…`, ProcessRunning)) ``` */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻV Malt.isrunning(w::Worker)::Bool Check whether the worker process `w` is running. */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻ Malt.remote_call_wait(f, w::Worker, args...; kwargs...) Shorthand for `wait(Malt.remote_call(…))`. Blocks and discards the resulting value. =/opt/julia/packages/Malt/Z3YQq/src/DistributedStdlibWorker.jlڻ Malt.DistributedStdlibWorker() This implements the same functions as `Malt.Worker` but it uses the Distributed stdlib as a backend. Can be used for backwards compatibility. */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻ Malt.remote_call(f, w::Worker, args...; kwargs...) Evaluate `f(args...; kwargs...)` in worker `w` asynchronously. Returns a task that acts as a promise; the result value of the task is the result of the computation. The function `f` must already be defined in the namespace of `w`. # Examples ```julia-repl julia> promise = Malt.remote_call(uppercase ∘ *, w, "I ", "declare ", "bankruptcy!"); julia> fetch(promise) "I DECLARE BANKRUPTCY!" ``` */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻ Malt.remote_call_fetch(f, w::Worker, args...; kwargs...) Shorthand for `fetch(Malt.remote_call(…))`. Blocks and then returns the result of the remote call. */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻ#`_wait_for_response ∘ _send_msg` */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻ Malt.remote_eval(mod::Module=Main, w::Worker, expr) Evaluate expression `expr` under module `mod` on the worker `w`. `Malt.remote_eval` is asynchronous, like `Malt.remote_call`. The module `m` and the type of the result of `expr` must be defined in both the main process and the worker. # Examples ```julia-repl julia> Malt.remote_eval(w, quote x = "x is a global variable" end) julia> Malt.remote_eval_fetch(w, :x) "x is a global variable" ``` */opt/julia/packages/Malt/Z3YQq/src/Malt.jlFڻ kill(w::Malt.Worker, signum=Base.SIGTERM) Terminate the worker process `w` forcefully by sending a `SIGTERM` signal (unless otherwise specified). This is not the recommended way to terminate the process. See `Malt.stop`. */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻ2 Malt.worker_channel(w::AbstractWorker, expr) Create a channel to communicate with worker `w`. `expr` must be an expression that evaluates to an `AbstractChannel`. `expr` should assign the channel to a (global) variable so the worker has a handle that can be used to send messages back to the manager. */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻVShorthand for `fetch(Malt.remote_eval(…))`. Blocks and returns the resulting value. */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻ{Malt will raise a `TerminatedWorkerException` when a `remote_call` is made to a `Worker` that has already been terminated. */opt/julia/packages/Malt/Z3YQq/src/Malt.jl(ڻ Malt.stop(w::Worker; exit_timeout::Real=15.0, term_timeout::Real=15.0)::Bool Terminate the worker process `w` in the nicest possible way. We first try using `Base.exit`, then SIGTERM, then SIGKILL. Waits for the worker process to be terminated. If `w` is still alive, and now terinated, `stop` returns true. If `w` is already dead, `stop` returns `false`. If `w` failed to terminate, throw an exception. */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻ Malt.InProcessWorker(mod::Module=Main) This implements the same functions as `Malt.Worker` but runs in the same process as the caller. */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻVShorthand for `wait(Malt.remote_eval(…))`. Blocks and discards the resulting value. */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻL Malt.remote_do(f, w::Worker, args...; kwargs...) Start evaluating `f(args...; kwargs...)` in worker `w` asynchronously, and return `nothing`. Unlike `remote_call`, no reference to the remote call is available. This means: - You cannot wait for the call to complete on the worker. - The value returned by `f` is not available. */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻbLow-level: wait for a response to a previously sent message. Returns the response. Blocking call. */opt/julia/packages/Malt/Z3YQq/src/Malt.jlڻ+`@async(_wait_for_response) ∘ _send_msg` 虨7-c V I+.[.[.9虨7.[9虨7-9虨7 W3 W I-9虨7. O6 A!7V?/#9虨79虨7,%/#9虨79虨7,&/#9虨79虨7,'/#9虨79虨7,(/#9虨79虨7,)/#9虨79虨7,*/#9虨79虨7,+/#9虨79虨7,-/#9虨79虨7,0? $#self#iomsg_typemsg_idmsg_data虨7Y.9虨79虨77?/#9虨79虨7,!? #self#ioyn.}虨7v!9虨7.9虨77?/#9虨79虨7/#9虨79虨7? #self#ioR A !9虨787@@`?'//#9虨7?虨7L A !9虨77?/#9虨7? #self#x虨7P A !9虨77?/#9虨7?#self#mapexprx虨7X. 9虨79虨77?/#9虨79虨7? #self#x虨7UH!9虨7.7?/#9虨79虨7,W? #self#w虨7<7V?/#9虨79虨7,N?#self#signum虨7UH!9虨7.7?/#9虨79虨7,N?#self#虨7j!9虨7.!J49虨7.7?/#9虨79虨7,M?#self#wsignum虨7UH!9虨7.7?/#9虨79虨7,M? #self#w虨79虨7.!J49虨7 49虨7.!J49虨7 A 49虨7 A 4A49虨7 A9虨7. 7?/#9虨79虨7,? #self#rc虨79虨7.!J49虨7 49虨7.!J49虨7 A 49虨7 A 4A49虨7 A9虨77?/#9虨79虨7,? #self#rcv虨79虨7.!J49虨7 49虨7.!J49虨7 A 49虨7 A 4A49虨7 A9虨7. 7?/#9虨79虨7,? #self#rc虨79虨7.!J49虨7 49虨7.!J49虨7 A 49虨7 A 4A49虨7 A9虨7-!. 7 ?/#9虨79虨7,? #self#rc虨7: Remote exception from .!J49虨7-9虨7.!J49虨7 A!y9虨79虨7. 7?/#9虨79虨7,$? #self#ioe虨7 with PID Malt.Worker on port .!J49虨7.!J49虨7 A!y9虨79虨7.[7?/#9虨79虨7,? #self#iow虨7&Malt.DistributedStdlibWorker with pid o.!J49虨7.!y9虨7.[7?/#9虨79虨7,'? #self#iow虨7Malt.InProcessWorker in module o.!J49虨7.!y9虨7.[7?/#9虨79虨7,K? #self#iow虨7O+%. 049虨76. L49虨7. w9虨763 R 49虨749虨79虨7- U I3 I9虨7.@. 049虨76+. L49虨7. w9虨76+3+ R 49虨749虨79虨7- U I3+ I9虨7.@9虨7. K i.!-!-!e6 +#3+$ A! A9虨77$+%+%?/#9虨79虨7,1?(#unused#wexit_timeoutterm_timeout虨7 I-!9虨7 A F A }!P7?/#9虨79虨7,C?#unused#fwargskwargs...虨7 I-!9虨7 A F A }!P7?/#9虨79虨7,?#unused#fwargskwargs...虨7 I-!9虨7 A F A }!P7?/#9虨79虨7,?#unused#fargskwargs...虨7 I-!9虨7 A F A }!P7?/#9虨79虨7,:?#unused#fwargskwargs...虨7 I-!9虨7 A F A }!P7?/#9虨79虨7,|?#unused#fwargskwargs...虨7 I-!9虨7 A F A }!P7?/#9虨79虨7,?#unused#fwargskwargs...虨7 I-!9虨7 A F A }!P7?/#9虨79虨7,?#unused#fwargskwargs...虨7F+%. 049虨76. L49虨7. w9虨763 R 49虨749虨79虨7- U I3 I9虨7{Gz?. 049虨76+. L49虨7. w9虨76+3+ R 49虨749虨79虨7- U I3+ I9虨79虨7. K i.!-!-!e6 +#3+$ A! A9虨77$+%+%?/#9虨79虨7 ,Q?!#unused#fintervaltimeout_s虨7+. 049虨76. L49虨7. w9虨763 R 49虨749虨79虨7- U I3 I9虨74@9虨7. K i.!-!-!e6+3+ A! A9虨77++?/#9虨79虨7,\?#unused#timeout_s虨7+. 049虨76. L49虨7. w9虨763 R 49虨749虨79虨7- U I3 I9虨74@9虨7. K i.!-!-!e6+3+ A! A9虨77++?/#9虨79虨7,]?#unused#wtimeout_s虨7 I-!9虨7 A F A }!P7?/#9虨79虨7,6?#unused#fwargskwargs...虨7 I-!9虨7 A F A }!P7?/#9虨79虨7,r?#unused#fwargskwargs...虨7 I-!9虨7 A F A }!P7?/#9虨79虨7,y?#unused#fwargskwargs...虨7[+. 049虨76. L49虨7. w63 R 49虨749虨7- U I3 I=9虨7. K i.!-!-!e6+3+ A! A9虨77++?/#9虨79虨7,?#unused#erethrow_regular虨7 I-!9虨7 A F A }!P7?/#9虨79虨7,>?#unused#fwargskwargs...虨7 I-!9虨7 A F A }!P7?/#9虨79虨7,?#unused#fwargskwargs...虨7 I-!9虨7 A F A }!P7?/#9虨79虨7,?#unused#fwargskwargs...虨7 I-!9虨7 A F A }!P7?/#9虨79虨7,?#unused#fwargskwargs...虨7kH!9虨7 A.!M A7?/#9虨79虨7,?#s317虨7+. 049虨76 I. L49虨73- 9虨749虨7 I- U I. 049虨76 I. L49虨73- 9虨749虨7 I- U I9虨7. K i.!-!-!e6+3+ A! A9虨77++?/#9虨79虨7,?#s317exeenvexeflags虨7t+. 049虨76 I. L49虨73 I-!M. 049虨76 I. L49虨73 I A!9虨7. K i.!-!-!e6+3+.!49虨7 A 7++?/#9虨79虨7,g?#unused#envexeflags虨7r+. 049虨76 I. L49虨73 I-!M. 049虨76 I. L49虨73 I A!9虨7. K i.!-!-!e6+3+.!49虨7 A 7++?/#9虨79虨7?#unused#envexeflags虨7+.!J49虨7-9虨7.X A!49虨7 I. 9虨79虨7 49虨7 A 49虨7 A 4I A 49虨74 9虨7 A9虨7 . K9虨7 d.  I. w 63 I.!N .  I. w6+3+ I.!N R 7++?/#9虨79虨7,/#9虨79虨7, /#9虨79虨7, ?#ctor-self#workerexprid虨7\. K9虨7-.7?/#9虨79虨7,?#ctor-self#wexpr虨7S R9虨77?/#9虨79虨7,?#ctor-self#workermessage虨79虨7.  I. w63 I.!N.  I. w 6 3 I.!N  R7?/#9虨79虨7,?#ctor-self#workermessage虨7f49虨7-!M A! A7?/#9虨79虨7? #ctor-self#虨7K R9虨77?/#9虨79虨7,? #ctor-self#虨7LH-9虨77?/#9虨79虨7,F? #ctor-self#虨7+ I R9虨7-9虨7 I-9虨79虨7.  I. w63 I.!N.  I. w 63 I.!N .  I>. w6+3+ I.!N R 7++?/#9虨79虨7,F/#9虨79虨7,G?#ctor-self#mod#15task虨7S R9虨77?/#9虨79虨7,(?#ctor-self#msg_typevalue虨79虨7.  I. w63 I.!N.  I. w 6 3 I.!N  R7?/#9虨79虨7,(?#ctor-self#msg_typevalue虨7h49虨7-!M A! A7?/#9虨79虨7,g? #ctor-self#Nkill=/opt/julia/packages/Malt/Z3YQq/src/DistributedStdlibWorker.jlAbstractWorkerDistributedStdlibWorkerpid isrunningMalt__init__===#59#60#59*/opt/julia/packages/Malt/Z3YQq/src/Malt.jlactive_repl_backend backend_taskscheduleeerror##_rethrow_to_repl#58#_rethrow_to_repl#58in_evalstaterunnable WorkqueueDebug Malt_4a823d75 invokelatestfixup_stdlib_pathTaskput! ##sync#48 Malt_267ec9b8catch_backtrace logging_error exception#_rethrow_to_repl_rethrow_to_repl istaskdoneUInt32#56#57#56w##_wait_for_exit#55#_wait_for_exit#55_poll timeout_s WorkerResultmsg_typevalueWorkerportprocproc_pidcurrent_socketcurrent_message_idexpected_replies#_wait_for_exit_wait_for_exit#_wait_for_exit#54##_wait_for_exit#54Inf64>=-time ##_poll#53 #_poll#53sleep#_pollReal#51#52#51 ##stop#50#stop#50exit remote_doSIGTERMSIGKILL#stopstoprunningInProcessWorker host_modulelatest_request_taskremotecall_evalMainDistributed_exprrmprocs.|>waitblock#_assert_is_running_assert_is_runningTerminatedWorkerExceptioneltypeAbstractChannel#48#49#48Coreevalexpr@assert RemoteChannelworkeridT#remote_eval_waitremote_eval_waitremote_call_wait#remote_eval_fetchremote_eval_fetchremote_call_fetch #remote_eval remote_eval remote_call#46#47#46kwargsfargs##remote_do#45 #remote_do#45 #remote_do #remote_do#44 #remote_do#14namesNV##remote_do#44MsgTypefrom_host_call_without_response _new_do_msg _send_msg##remote_call_wait#43#remote_call_wait#43from_host_call_with_response _new_call_msg _send_receive#remote_call_wait#remote_call_wait#39#remote_call_wait#13#remote_call_wait#42##remote_call_wait#42##remote_call_fetch#41#remote_call_fetch#41#remote_call_fetch#remote_call_fetch#36#remote_call_fetch#12#remote_call_fetch#40fetch##remote_call_fetch#40##remote_call_wait#39#37#38#37 showerrorex##remote_call_fetch#36sprintRemoteException#34#35#34##remote_call#33#remote_call#33 #remote_call#remote_call#32#remote_call#9##remote_call#32_send_receive_async#30#31#30output_transformationmsg_id_wait_for_responseidentity#_send_receive_async#_send_receivedelete!take!haskey#_wait_for_response Malt_e6070354 UndefVarErrorunwrap_worker_resultTuple+ #_send_msgMsgIDChannel Malt_de99a594msg_data_serialize_msg #_new_do_msgFunction#_new_call_msgaddenvjoinpath##_get_worker_cmd#29#_get_worker_cmd#29src_pathcmd_genbyteenv#_get_worker_cmd_get_worker_cmd julia_cmdUndefKeywordErrorenvexeflags@__DIR__get backtraceInterruptExceptionreadeofisopen#27#28#27 Iterators countfromio Malt_ffed1bd8 Malt_81cd4f69 Malt_ffed1bd9 Malt_00cc3b1e Malt_8c3a0427 deserialize_discard_until_boundaryspecial_serialization_failureError Malt_6e0c48fa Malt_a44cd3f6 Malt_4574f243IOError Malt_526aa9eb Malt_2bc20b7c isopen(io)rethrow_regular#_receive_loop _receive_loop@debugisreadyvalues!#25#26#25special_worker_terminated Malt_48ab2e8e #_exit_loop _exit_loop@errorgetpidparsereadlinepush!openCmd#_#17#21_#17__iNtErNaL_get_running_procs__iNtErNaL_running_procsUInt16connect_buffer_writes#18#22 finalizer#20#24atexitdetach windows_hide#20#18#19#23#19DictInt32filter!#__iNtErNaL_get_running_procsprocess_runningSet#15#16#15ModuleSys #interrupt interruptWarn Malt_053ac733summary iswindowsGenerateConsoleCtrlEventccallSIGINT summary(w) Malt_1693bc0e #isrunning QuoteNode#worker_channelworker_channel Distributed->capturedmessagetuple##remote_do#14##remote_call_wait#13remotecall_wait##remote_call_fetch#12remotecall_fetchrethrowisaVararg#10#11#10##remote_call#9esc#@transform_exception@transform_exceptioniftrycallisemptyVERSION<#_#1#5_#1 Malt_6159fabeaddprocskw parameters#2#6#4#8#4#2#3#7#3BoolInt64@async@warn@v_strrefBaseUUIDPkgIdloaded_modulesthrowErrorException==#unwrap_worker_resultfrom_worker_call_failureprintString ##meta#58typesigmodule linenumberbindingpathfieldsUnion ExceptionnothingunlockflushwritelockAny#_serialize_msg,/opt/julia/packages/Malt/Z3YQq/src/shared.jl serialize MSG_BOUNDARY readuntilIO#_discard_until_boundary#_buffer_writes buffer_writes BUFFER_SIZE hasmethodInt isdefined@staticUInt64UInt8from_host_fake_interruptfrom_worker_call_resultRelocatableFoldersSockets#includeinclude#eval_channel_cache exit_timeoutkeyword argument term_timeoutinterval?<@@@@0P@0@ @pp@ 00 0 0 @ p`P0p@ 0 @p`P0@0@p`P0P@ 0 0 0 0 0 @ p`P0`@ 0 @p`P0p@0@@@P@ @P@ @ p@ @ @ @ @ @ @ p@ @@p`P0`@ P0`@ 0 0 @p`P0P@00 0 0 0 0 0 0 @p`P0`@@@p`P0`@ 0 0 0 0 0 0 @ p`P0`@ 0 @p`P0@@@p`P0P@ @0p@ 0P0`@ P0@ 0 0 @p`P0`@ 0 0 0 @ p`P0@ 0 0 @ @ p@ 0 @p`P0P@0P0`@00 0 @p`P0P@0P0`@00 0 @p`P0P@0P0`@00 0 @00p`P0`@ 0 0 @p`P0p@@ @p`P0P@0 P0P@0 P0P@0 @0@ @ @ @ 0 0 @p`P0p@@ @0@ @ @ @ 0 0 @p`P0p@@ @p`P0P@0 P0P@0 P0P@0 P0P@0 @0@ @ @ @ 0 0 0 @p`P0`@@ @0@ @ @ @ 0 0 @p`P0p@@ @p`P0P@0 P0P@0 P0P@0 P0P@0 @0@ @ @ @ 0 0 0 @p`P0`@@ @0@ @ @ @ 0 0 @p`P0P@@ @0@ @ @ @ 0 0 @ p`P0p@ 0 @p`P0`@@ @0@ @ @ @ 0 0 @00p`P0p@ 0 0 @p`P0@@ @p`P0P@0 P0P@0 P0P@0 @0@ @ @ @ 0 0 @p`P0p@@ @0@ @ @ @ 0 0 @00p`P0p@ 0 0 0 @p`P0@@P0P@00 0 @p`P0`@00 0 0 0 0 @p`P0@00 0 0 0 0 @p`P0@@P0P@00 0 @p`P0P@00 0 0 @p`P0P@@0 0 0 0 @p`P0 @@@p`P0P@ P0p@ 0 0 0 0@@P000000 0 0 0 0 0 0 0 0 0 @ p`P0  @ 0 @p`P0@ 0 0 0 0 0 0 0 0 0 @ p`P0 @ 0 @p`P0p@ 0 0 0 0 0 0 0 0 0 0 0 @p`P0 @00 @ p`P0`@ 0 @p`P0p@ 0 @ p`P0`@ 0 0 0 0 0 0 0 @p`P0`@ 0 0 0 @ @ @ @P00P 0 0 @p`P0P@ 0 0 0 0 0 @p`P0p@ P0@ P0@ 0 0 0 0 @p`P0P@ P0`@ P0P@ 0 0 0 0 @p`P0`@0P0P@0P0@ p@ P @@00 0 @p`P0`@@ @0@ @ @ @ 0 0 0 0 @p`P0@@ @0@ @ @ @ 0 0 0 0 @p`P0@@ @0@ @ @ @ 0 0 0 0 0 0 0 0 @00p`P0@ 0 0 @p`P0p@@ @0@ @ @ @ 0 0 0 0 0 @p`PP0 P P P P P PPp@@@@@@P0 0 0 0 0 0 0 0 0 0 @p`P00@00 @ p`P0`@ 0 @p`P0p@ 0 @ p`P0`@ 0 0 0 0 0 0 0 P P P P P P P 0 0 0 0 0 0 @p`P0@00 0 0 0 0 0 0   P 0 @ @  P 0 @0@0@  P 0 @  PP0 0 @  P 0 @  P 0 @0 @  PP0 0 @  P 0 @0 @  P 0 @0 @  P 0 @0@  P 0 @0@  P 0 @ @  P 0 @ @  P 0 @0@  PP0 0 @  P 0 @  PP0 0 @  P 0 @0@  P 0 @0 @  P 0 @ @  P 0 @0@0@ 0 0 0 @p@ 0 0 0 0 0 0 0 0 @p`P0p@@0 0 0 0 @p`P0`@ 0 0 00 @p`P0`@ 0 0 0 0 0 0 0 0 0 0 0 @ @0 0 0 0 0 @p`PPp0P@ @ PP0P@00 0 @p`P0P@ 0 0 0P@ 0P@00P@ 0P@00P@ 0 P@ 0 P@00 P@ 0 P@ 0p@00p@00`@00`@00 @00P@@ 0P@@ 0P@@ 0P@@ 0P@@ 0P@@ 0P@@ 0 @00@00@00P@@ 0P@@ 0P@@ 0p@00P@@ 0P@@ 0P@@ 0P@@ 0P@00p @00p @00p @00 P @0@ @ @ 0P@00P@00P@00P@ 0P@ 0P@ 0`@ 0P@00P@00P@ @@@@@0 @000 (((0 8 ((0 (8  @000 ((8  @00 ((8  @000( 0 (8  @000 ((8  @000      (0 000000(0 ((8  @00   @000((8  @000((((((8  @000((8  @000 0 (8  @000 ((8  @000((8  @00  (0   @00   @00 ((8  @00 ( 0(8  @000   0(0 ((8  @000  @000((8  @000  @000((8  @000  @0000 (8  @000 ((8  @000 ((8  @000   @000   @000 80000((8  @000 80000((8  @000 ((8  @000   @000   @000   @000 80000(((8  @000 80000((8  @000 ((8  @000   @000   @000   @000 80000(((8  @000 80000((8  @000 800000 (8  @000((8  @000 800000(8  @000 ((8  @000 ((8  @000   @000   @000 80000((8  @000 800000 (8  @000 (((8  @000  @000((8  @000(((((8  @00  (((8  @000  @000((8  @000 ((8  @000((((8  @00 0((8  @000  @000(@P(00000P(08 ((( (((0(8  @000 ((8  @00  (((((((0 (8  @000 ((8  @00  ((((((((8  @0000 (8  @000 ((8  @0000 (8  @000     (((8  @000  ( (@08 (((8  @000   (((8  @00   @00   @00 (((8  @00   @00   @00 ((((8  @000  @000  @00 (0 0@0((8  @000 80000((8  @000 80000((8  @000 80000((( 0(8  @000 ((8  @000 80000 ((8 @ @0000 0000 0000 (((((((((8  @00 00 (8  @000 ((8  @0000 (8  @000      0000000((((((8  @000((  0(8( @8`8`8 0 x@8`8`8000 (@8`8`80 (@8H@08H80 @8`8`80 X@8`8`80 0 (@8H@08H80 P@8`8`80 0 X@8`8`80 0 @8`8`800 @8`8`800 @8`8`800 p@8`8`800 @8`8`800 (@8H@08H80 @8`8`80 (@8H@08H80 @8`8`800 P@8`8`80 0 x@8`8`8 0 X@8`8`8000   ((0 (((( ((8  @000( ((8  @0000((8  @000       0    ((80  0 @000    @000((8  @000 @00  @000 @00  @000 @00  @0000 @0000 @0000 @0000 @000 @000 @000 @000 @000 @000  @000  @000  @000  @000  @000  @000  @000 @000 @000 @000  @000  @000  @000 @000  @000  @000  @000  @000 @000 @000 @000 @00000 0 @000 @000 @000 @000 @000 @000 @000 @000 @000 @000@0 #YOsOOOCPyPHRyD*'P((@)p**P++0,,--P1LMP`R0V]0)4MUZ]``dpfph`r)p1@KS WZ0`0@!!%P%//1255:0;0>>CCPGGJ@K`NNpPPTTY`Y_`a befghkkmn@rrPvvy z|P|0~~P pPД p`0`@p0 ppP @`0`  P! "(`(.. 3p39 :>>`BB@FFK0L TpTX0Y[`[]0^bcdef g0kkPmm`oou@v} ~0PP0p` pP0 `pPp @0!&*p55:`:`>>H IIKK@LOP`RTUW@YZP]_ bd`f@hjkmoqsuwy{}p`P@0 p0P@( jܾR߶ I0P)v%B.@n: ; ?@ CCVjuliajulia_include_498include.D*0includeD[B /opt/julia/packages/Malt/Z3YQq/srcMalt.jl  3Linker: LLD 15.0.7 C(8 <J  Y  g 0 v @  P          <) sh;1?n;H~P;)Ui}8 )W;(; .dynsym.gnu.version.gnu.version_r.gnu.hash.hash.dynstr.rela.dyn.rela.plt.rodata.eh_frame.text.plt.data.rel.ro.dynamic.data.got.plt.bss.debug_abbrev.debug_info.debug_str.debug_gnu_pubnames.debug_gnu_pubtypes.debug_line.comment.symtab.shstrtab.strtabtextjulia_include_498jl_globalYY.503jl_globalYY.504jfptr_include_499__gnu_h2f_ieee__extendhfsf2__gnu_f2h_ieee__truncsfhf2__truncdfhf2MUL.CoreDOT._call_latestYY.500MUL.MainDOT.BaseDOT.includeYY.501MUL.MaltDOT.MaltYY.502metadatajl_dispatch_target_idsjl_image_headersysimgjl_f__call_latestjl_tls_offsetjl_pgcstack_func_slotjulia__gnu_h2f_ieeejulia__gnu_f2h_ieeejulia__truncdfhf2jl_gvar_idxs_0jl_fvar_idxs_0jl_fvar_offsets_0jl_gvar_offsets_0jl_clone_slots_0jl_clone_idxs_0jl_clone_offsets_0jl_pgcstack_key_slotjl_fvar_base_0jl_gvar_base_0jl_RTLD_DEFAULT_handle_pointerjl_RTLD_DEFAULT_handlejl_shard_tablesjl_ptls_tablejl_small_typeofjl_image_pointersjl_system_image_datajl_system_image_size_DYNAMIC  oo %o((,/TTX5=GBXX`QYci`` Pn) {) @; T@XX8P,D0""AS_0"