bondscell_resultsX$e57da7e5-32bb-48a2-af27-5ac671cabdaequeued¤logsrunning¦outputbody(b

Hailstone Sequence Parameters:

Starting Value

15
mimetext/htmlrootassigneelast_run_timestampAڅApersist_js_state·has_pluto_hook_features§cell_id$e57da7e5-32bb-48a2-af27-5ac671cabdaedepends_on_disabled_cells§runtimeΠ)published_object_keysdepends_on_skipped_cells§errored$6d225dce-3362-4f5d-bba9-0b5312f6be5aqueued¤logsrunning¦outputbodyHAPNG  IHDR5MsRGBgAMA a cHRMz&u0`:pQ< IDATxy}~9{!\C{JZrlEmnmG0#H qҠ14mppح/HJ,hWW]rCs}h%ڱ>B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!,B!c1t ƚ2G(Ed Z)1Xc@5Zk1(I >{EfQs,B!-rdzCdhD"BfifibLZ^ts4AYr5B!5= . Z)nd`e4vXBK6SSbaCEiraQp;tXB=y޺H h1c1(a :8F1hZ)V DQ!`b-ωtȜ#*FeI^TsòkP9{!P;Gq@=xO^׌uXК,D$$B6|{xA,,0jщc,ol0;1- :bcP@CkQ彧t(gTU (( .yy}g._fi!M|w(Gk1;1Zlק5tYBrQƐDFʼn cx~e;"B|5?ǎqbv.I21s6΁1l灢,Uò ˒5鰿a˓MSz3ロ VWօ α[!S;~xw14NO^UDr=EU+ .^[㋧OscKv4eX ˒,q!p'u~>Wֲn3j1n3nstz=ZknjKSSQέsje/]t![${ロthF71UUqTbGiX] K<}2_9}z=G)Eb-hXtP,sG#jy#u͹ ml]l Gfg91?]SSX5gf8<3ロ/ԅ ʒYB_]ܻo;~fVEJTs=.ssS{W(c#XYŋ<̭A+X'I$ .d#2*n)eY^&6cir57fqbʼn >26o6!&kf"VNZqLd Ѱ}:b#2/:885Ž nje3iN,B!㏳b7CՅ 7_?^B *be8dL)4%6H4?1A^UldXTyi}SSܻ@3B7?27GE ŋ^~òdXhDidҰhD&s8 !P9Ge]5yUQ8GY׼Q^Z_uƾp4363iddm4!x~>fe Q5!_%.*.V77iDiDA3q!0"ZH !P9Ge]5yUQ8GU9.z\"M3?S;=l1- |W(@iM(p/?1>$(KFUhSOp'hPJ"*.V77h0☫uMd 7"ZH!P5sш;"{RZqL3QK뼙|1f;4`C (cgR\=c04Ѡh0p&kFYƋ_z9d(Q15cF)P  ZJ)z91Z)bLS56e 0֒Xd.>JQyϰF]_`@^tӔH):i&☱fCj"kр65*R<2h6qne//'O o9.\ 4UE]F!ěXd iьcQD+1Zs=J)(bT>rG>‘n$1Jq34y-5{vOa,֚Z F{v+p}mm482={﹇;=>ʺfX3O͕9ֳ I!ZchD k1Ze]F!ěњfJQD3Zz4QYr}GEhܚPZgL{^/5{n51@d $a~bǖw=>ʺfX3O͕;;4ӔLL5Rt5(BCE֢C:s*{yɓl1ZCl-$[KZ"cR5oB|4v%K3a8N}(…@ByO=y]S5_ޓ9r*1de5hW_U98 ]&Ҕf!fy!pDJ9Fk C+I౥%~Fs&Q!˒~Q s75R:"oXkptfn =bXʒQYr}S B@QB(Kq"_DyY5˛<{2_~9o| v &KSbjIe"IHIfsy8_~BAfMβ45Q;VCvÇ@VUʒUyUq'waA+ūg (5{\e ?'³N 6ω}hÖnZ)ƴRx *ևCodyV Z)E#GǏoi)1lf&+sU\Q;S{9P9r3sePLҊc"kƀssn(vGޓZKj-Ӎ_Gm eS@c܌njYGgf6\LFgs aY2*N>űעBqp!++7GɩS k `;$ɪFyRh@)Ʋű1ȫ'G܊rIkiZK#iXRl9+!._fߧrA+śJY'3O>Neee}7=|gK٤ED֢CzQDEh=Yƙu}\Tq(ث^YNکS|)v棇v6H)8@scJ)L( ˒9j @UtӔ~UѲFaBñip kk7?λc ^kcW(ū"pE௅@_z%SO16$߱60Ň@V ,c3)css쟜mKK4Yc 1h(JyR(e9Z)rlvv~Y98s!@@!|!W})v;ycL4hPރRMk ޳ǜqvZ)ZIљ޲ssL6q΁RC>ȪAQP;G+i1cs1( faAY/ eə V}G#B>|\!$lmw(YƟ=,_;sш`E!viCÁ s^]Uj>ρn8Zg;B`'!*ڋ/{'O[ItLL0l2j[V->0(@ cyϨ%u]3fk*(#xJaf,+~YYlfY˃YUc 1 51 kkXXb-clfò$s~3*K|9qcgfxѣܿoinL)..'"7{ERlj4Pf*^^_5yw￟r%"RN{n8@B``ϱ&ǧkzfV J)m- |G5e]S5.\deI=sxyR5[܈;(b&iZ3 "Zs- PJFqR (X GZ)T!%E]/ Feɨ,)뚠}EVWynu33agab795ǖx`>,Bq'wӊ"v5z=^XYL>Ơy-!P8:ŗOr{*@$] I!DJaA+QkQJuT1, eIs*P1k Qw{Ƈ@b Zk\bwR$r-44h1 khN"%Bt׹3( 6hĨ,M1n@`-TMϭ*cK.>Ë,LL]ZRlIB`:M,MNr=^^={>I& P{OZ)^` {?zi~s\$?t[-ݷm eUEd D0(PJB(뚍шK!sx 9\9GP9<'@sUZaEFy-14fш"Q֚%@E ʒPJXLEb-yT>,)IEf;&[-Ӕf1X$( Q e-Vk"cPi65WٳbT׬eYp~xe*LǙ'ݓ'Yvy_=s$$tfD0hCzyN#>^3sUE;i' $TޓFSi֚iiYv40Zi%;iD7K+մL$ >NNb&+K.lnrfc˃<:zbjM77i6]Z-ִvse;=f-X2VC.pIfg1l!_kf?dr-></>Mw> & 4-؉5{TUŹ^o}:09OǙLS$DZFVkR$@,hę5>{O?&]k.\i-ӝ8f&MZCx !BՔRpc=%ۥ0n49ɾ :&M(bc0$\9PX=cyY6Q9G.H7҈c`Vbf,crtvqfc˃stnG917ǡnIkId ip;MZx58v{O,YyauXv){^|qz.ln>˥[#Gh*gwRhqC`3WW'jê"2-AkʲdPlF,IUFՅ <9nƨ3Y} L755E3IЀQ 5J)1h0Jk-c֌y(˒s=c8K<>1hc^`,0ϩB@||!@s3B 6Z1Z:q59!p48:;Y|MZIËP˾)RcSqLK'e֚nAUưV,t:X9x9BeTU|xYn[x3hsc. IDAT9G=j7!*Ƽ1p8G,cB|OZv=jq-^)}?u9^֚|;>ivCIь"($Q9p8)"qZsje  ˒AQp/ryJحvSS4Vkv2lR5 ʒ{&bݦhNRlYeKZk(bTE !;hpfQsLS&Ӕ1=y]WsuMQu-w/,yo]Zbft:{ƴ\M)ūB=X$MRCkuMl%2, C,uUΑ%50* \dUEYU1k*%eY2(Kvm6YtXdab*MNSqnɫ !'NZ.r~fBUJq#{ʺ_|ڟ9ע$hFiьc(B+Ŗ >üe~k .GkM+!ά2Ek `3.ą l)XtXELO%i& cnTUZcjM=cWX 3B 6nAYuMV aY2( |\snhM+i1[怏?881h@9^5(ՂR(Ci͘V$jgyOVldWWoUhDo4⯖ZdaqrNV4e:Mi1ۍ,BZ~o4/2hpٳ|1Zzy~-ZkQD7Ih1(hYX݇s<3iJ;IPZ3f'-Z)RlQ5=X1J1n3@hPJA <ȃi@k JZRkeJ)jQ\a0ƠB@)E3B`9zEA^pBsEcu8J1E41;QJdy4b3˨{uM1l'`C;Iq.…U!ആfL+R"wo~?y~Q0( (ш'/\`RvcBg.&-f}4b8yg76l6ٮyq;R@)pZs4M4 /{xaf&MQp-Rl Q EDJEAVUD0"H) X Jr1 45S&ۅ޳sEl-sx(cTш3>jE{nHk:iX'KkQ"(@Tax-=A)Wx_׼|hP@d 5(k=>/\s&{=EAo"[Y~EX`FqE(g{NQD/˸gP!X)j^y]_s5K.Gfgkvy$S&Fkv%RhkJiњ9VF#FedÖYc0J"*R쟜 ƼRS5SJaaLò$+K_􋂫%JbPF#F#VCZ^5ۿ{xxqVD)Hs{(ŭP@Y5~ x߇x9z\VVȪkA>|(o;t.IBXkܘ՚k͡nCo}+|Qz|' kzYzQ5ooqL3yA+B|xy{c2}_eF9<3n{x䮻& Ƽ-F)B+J1X/XܤpNf1 Њ"P 3s‡H)ië(VYƨ(\1*K8Zf}4`ppHs7[gg٢fբhGylakhGD֢k uZsxrG~~i~'^eu͝bBy /ъc[Z݇jOszm V=KDxϵ?g,"mNLplvvw=hD(JA( !512ъ"MLЌ"RlZ&ḃNPɝcP\҈cMbc&wKj={K^Qpi0 xj!B@0Z3iW @(H9GQUl%,#k6mQV ky q;UUm4uMYל䏟z_g٫ʺfY`}?| c<?(ǦH1(!pHkѩ)~9y,_>}WV2eɭ!ZMNrlfF ɇfYo1Q9GVUQY2*Kj~G~{s縻""4ggtƠjJk?{pyy;sz{tk$#ɖ+"Ţ@a?TmI%av%K lB`5mɋeE,\ifzf~dj$Kpα<2jqe#Sƨe =. ^`yEv9nso,.r=DZ("" 1 xUJ?t$YEE("\B:c-.TR!@Tq@9 }ZZ>o=3'Npbe/~Ӕ>q _GeV*%"kj4ո{}߇"zyBvg|G_|6mkaZe$FG"XC1^0( αJ맞bߧW k_E&+$<{.hdiSI&**QƠ\ UP%w``>Y猥)*IQFFཧpJ=nUsZZba-pvKK<FU:9V-~Gg^(BT)i »J<1s'sƫUv6dq*l٤_,zq8v҃wm16Ǩ*Z*qDơ)ܿȋtC}u:7?ַ_XXV1:JE􊂑4r*qLd[9}}{1?vM;wwb,MQDIX;Gb-W"\$B$qL=Mn4izO8 C`<=7GgqDlڴ鯜jŊp%߿:!KyQ7+=ǵ?3ܺ{7xϕx3gV9:H"*qrqo8A(Ƚ'((#<'2tmr|sQ!"lDӡ1pxvjbaRRsQ8!(xo~OZđ#;d8FkQ_{EN,,0VD=R"*qL%Yn.FӔ "HUZS86;K$@E|s`!Z XK)"JQaX1jaū23ns!_Z⣇}c$M1Ơ!(+5:JnjVDCp쳼4;_/>͗~(06goO8fj)&DwPJJ$DM6{^g7MM!"\{Fݍms|g3\ݿ۷X%"\pAsZj (@T !/RˣǎOpmnޱGۻ\1c ~WN甦 VfdqZ[ρq(D(6UYZSY,nUP"BIa{TU8g|]TZ*Ae""\;-"$ư1elc݇S%/ Z'y9~gyivUNN5שYxQVU*D4e$1qL-0@-I(U^aR xGy^[\o~dU!ٽmc{XB%MIû #)9J6m"۷""մNϳ`Zxo?uäưJ؀JIA'WTI*N9#â ;εؾ}Cm|a 0`D0LǏsjq+idNKEɻ[oc(y6fUED(̵`[uPũmtXxFflNb dX!0Ơ!DAy*[TybQ@ 1elc݇!MS*i=wwsf997SN;=Zv(_;zUuvWܹw/7mQ&k5FҔJFRk"6mi>y8w|36{˽Yl;$`<[O?٥%{_f \ +(XCJ^oyQG˵kn?($@ "b J|8;S;GlB{Fzb!A*"*D"TQE2a OǬ%bTӔm&wŏy'C?D Y^O:<ʇeηۜt>u֪gnZZ"6mY98>z;MN/,Y1rr~7[-Bq̗zZJ,#cyαY~'Y X?L$s'* tb8$"J{yUay8 }.\eܾo"Bd ZJ1 Pc~۸iV~QD%+BPeհ(8jc8!;ROɫR !@PEU *PUس'?6F5I0a "UD \JT`,ê""BHr1*FDJ TB@EPAEޣ\d { 4PU\$bD11TQ@ʄ`ye)`UXUk)ۚMڵN?O=O>M{Q-,p%l|dt5Ro7`ÇiӦpZonٵH 212'NpbnNޗx,c( sҗ841AP؈r*kU:yZ(r>?s.ϟ;Gf-{ljsm۳EUK*^V ī2 ,,z,zzRٛo])8fZ%u,#5BUa#Hޣ"B){2*PRP@aA$JUm" B)";V%QkQ@( !=Y]Ơ *!༧(""bk !eLZK%0QDj-EyP@b@/†TYO (mۨ19xY'ǹʅvnzz#zDlڴ/Ԟ1>s *Tyy;z{6ȑ#dvQ_?(/1e0ru.J"Bl-k B`t.\gϢ!PʬexlFem1YU $QD{0E;v3W2( {=]z={=\Ԭ;-[lHSJM4%ATyD+QAD*"BPŊ D()P.RD@\$RRV( R2M*{:1nslaD,1iCE"R "8Iz{ë{sc ZqݦPx##4+RkDZ a T \$BU\@U!=q!!Cl-b-FKz!ރ4壻v;<`0c'وvlaVCxM6$ idfy?;zs޽By0pȠ(:G9IBj-j$!JS"`=mf]Dh)}URc[T)G!!P 63t힘i2TU*EF+D( oQ|dv)GxC IDAT'^c{\ZBöFJU6mݱs'ۻZ.g=\ɮf*/B@.Re=1 "E*h}.t:;ljE:.Cd =bDXuhj!cޢÙ~;ߡ=B@S dQ|B9JwGn[w`*Vl΄V\Z+b@D( n"ZE\"B- zj-nQpay(B0`D(yQc89CHfml`Z> PW<'KF*FҔJ% =1"#"1 "$T=^J##25`V3Uo,Y2f76z*@%I!ISFʠ(.9.8Ǡ()1lDZqPUjd4$H㘉jǔ`T!1z2e6=NWxif Tc(<~8~$0r$ؿFz`E()寮[E=0 /,[O=W}UiJĦM>Z>owlߎr}=z72eu߁)% @g8Uz<+Y^(*Vc uC)E2QzERlN^~;CH 8O9q-/ceedbD@U1UUZ+B%UEE(*;w(oUJ"B}Ufm;zg|+{^[-\dQĖf-l2trP@b-!1( @^xcpS8GEα^njW*V*Ӕz11BZ\v9$Xc؈HPcyΪs(t(qtfɑb1\N+Dv枝; BDZbc[Kd ?~Jp'c1DEȢl=0?@=Ϝ9 g__'bӦMȍ[1{SoӧN6?u=01iZ@4R8K'{p\ĹVR-HEa|3g \GvG0QR /_z{$214%REDNH;.Ts* "\P@(8j~($TZHSiJ5ME(%﹒ZmdBǙEN/.<ΞZXcH%"(὆ELQ0ziZKE$Rc 4Z>8ZPOS1lĈF8fLJZ4eӡTqtζ+(*k%ư^etfgY9T9 KD[˅vOW}~yav5cHX@D@KTD` *FU@pq*éPRcs_?~_W9cʢz^Q2Y p5VZZ\VV<Ƈ@/zE%6,hV*V*Q aQ*VOl-cYhJk8=T)B x$4U{p!!Uymv~9{7[uTc @$"Q"H1 wC)n߱#;wr-rxunyf71{r%&'=6F51UJ(oQe--" Tِ1*Dxqfo7 KK]ZTζz$r%U4eWxO(9<7) NǎeRaכor4&&e-ԓ,4ߛnsIz`^'EĦM޽{s>wϜÇ1+@>_u~εd ;ǫssO{*vndR!c$0"\$BIX!CEx*P2ƀ*%UD AmM5Q@\J.\ͿaGmc=â sޓ;G=`ag2Y`kA, lbchf,#c&UzEeNZv:޳CRǤQCy i$ԒP/ j5N.,pbvz,k967Ǎ[w|2"4+il3gp>rɽ=2LEL6mF>}91?m6?ٱg ʻU~x#_;,D[(`%xOڵ} *"uD@D"\"Z "UU+=J*"PPJB@E@vOM^,CD0"`DȽLjC {ȝc 𞠊bA# "@D0"F1%k {P`s #U/\\g2YFRKqU2J8f&&3˜ntp!0Cb-iXKdQDEXe  1$$Lⅳg9nSxT9n3rb(7m¾1ֲ0]LS1nZX2t716mP|n۶, ͹NK ?}JH"` !"xU"6bDx[X,oa"BIـT#0*B!AEU.$"lHTAUʻ1*gZ-œOR lk4~QPc!B{r1" s|EA+gsޓ;9T0P:Ī$hd4ԒjPO1\ME8Y/cMLobv:ii@(XCb-iXKdQDb-֊眘g(i ۷KKtXY)p!0\2ƸyvʈPxPco|3O< |zEAĦM#"~l|o=$K>yQKC8léEshj##\ p=t817ǫ3BzElڴm[GFLS6ݳgߟyk?޽X0Ơ!P.U T.Lj"޳[K{΁V;yN=ˈ0Aـr Bs>*:yUVWgg \*:zbchd>("Z!P1+!4IZkaۥ[ŅֲJD%☵C(B{rȽyr}DD=8 ;{oֽ[-,Y,l+ 8us2L $ D6!3pB! ' $@c1/x-ږ%z|[BRue`I1?Oj{oy Sc($D1(,Dks  G!glcEQPzϹU]^!0t~yѣL5(Ak4aVCkc@J)P" "(c=9NJR4~3E@ A! "A"Ba̅@j-^Zbc!2ZC=@D"Icf,PyOc )t{J(t{u__gy١CL1cs`-'aVW9p++!\eǎv u-X*ﻏO>S^u(#J$ZcBlj1( "8ʢçNyX-yѣ47Ǖt򜓋Xcm4m482=Gor56ƠxR D@)D1Aţ+&U~ _(… !â;X2yN !k!4E֒FcTS:Gb [OE)՚k' DZQ(!2Jy*DTR<sZ[VkZ-m61Zs9FkdCd-mki)[UΑ9ǰ(V/Cxّ#UV+a_žVoάpsg2(K)yff﷽8"|ElU >Qx""jLƲIQ"jQD=d+!3 1%rj PXVUAY2, FUEC`b+51$[Kl $[ˆ9cZB@c>i!]]R5ƠEԒI)qX3Ih& cgf@hZa&֚f:U֢(rFeEN..Á)nܽffHS"g3ujLjXvxG?WS31-B$LMLٳg+r'z/ٿ!•X@ze0Pƀ->gΝc={x7ÇY)i13zo;v 5WKDЀV 1=@2rʒaY2,K*fC +K dPlz3LD4E4FcftxVC1Ljh9pJO'PcŠ(8sbkI%{ ++|9nspnZ6JQO,;v<ϼ/lկ*'>7N)PJ"̯x"5 >loxN,,p"{MnܻѬհwRs@dJk$>w1v;ABlVZk]^~5XIb(D G"F^Yaw΋P9scYQ0n96SIDc鈍!XkZkrJqxzӼYy`iO>,e$R"IB5k5u1Tα4 "l&JI՚~U2YYdUE=;yܿH=989V O;DžuQtAj 쟜f êbyO%y o{u, Y#oJq%"¯sWke4|t~4ݻyݱc\{7zfӈ"Q֚8pEA5lh"MS^{7ydEbC\\__ԣ{jQDb ˒n%V !6FPzO=sSyOx˝c~uUbk9nfJkeɠ,JrHk6hRkQ@j-[-.l;Ǡ(X2N2*\|=IJcs;Y6ܴw/"\yvքg]8f"EZ) Jq9^ x BXaTUDCl 1Cl ۉyvR4f 9.v<7-/s]HƴЈ"jqL5siDPJ⩤֒65α>猪,;v<oo Õ 0,Knj9N?C,ʒK85WEԢ]XY2J)9\xvY ʒcvQ"H^o/-sFUŨZKVc2MIîFˎg PџwM@)D+Ys~#aEDάLʒ,XK;Mi)lGD(c;J)bclD(t{J){v !2sEi4Ovprf2.*ge8de8$6VJS&%Qeǎg:~_@)vyݿ7|-ν=h J e {_]NexYYK4eѠ$(ǴӔ$h՚96ކqcR aWEw0@2km6YKV*LD(P:U\X_VCEqfm(c/{ovvtܲgַ׋'>h3pZiJ+MIeCitiH%\ ˒ B/Ž+z=FeɱY"kjV={i9.ᐕ54e2Mi& iCcdz{~5!8vO^:~EADAc_K] ʒIe^gj՚f2YiMl-IB#!p`o|# q 8/6 >J塚Nj0Vfdb^>QD3Ma ,c~mӝ969󫫜^[Åߖ<ɇNor (b;Z^v|⡇x?p4V8``@b-4ޓF/B;MQJ1]C_9@D񷫗|$qdj#SS9s|{Yxʒ'ZYKj iZK=I$haYC`,{$4 °,Y9Axg:Eԣ֌E9xO`ٱYO$IBa+ʒgy:z8ߎQGG)0{} uck'Ν;5fgiR dѠ$ԢVZiJEB^ˡv1 }7կ={ֲa0b ZLMqdjx#}p<,z\F}&&=1"kZZk6ԢZG#63J2q*^k ,c猪AYC`+$$EA/>v|e"rslV"nKx:,;v b^cg]!zZbk1Jq5B p/rg-˘[sWW9 gᐟ?4z+yѾ}CZQG IDATk925ő)Y |Iή1JSZm6h0lZj5V4e"f,+ E&+K6SJшcv5Ԣ.rU$+KE,q!Fez>BZjMQUxvn=p& Wgowt}-~yL8.EL$ (BDIBg4bfWyU"Zшc& 6+'/K"ҚJaBUAY"""0J1Ø1}aazQ@sUE=s|;KKܴgFk6ոn.Y^jYv&v/53Wvv-!`FDx@˯/,<p9Ggfy^Rk1{MPHkQ֚9sCh (ER  ʒ{1*F#"x5P%N< \)gXXsV9t_pQ8vvl%ҚZ"cJa"Inb`XFOXZEO=/?t&i1Sqtf4%5UE((clP\967vZk|5!`{E~82rVp&1Ԓ(HWne, ͜sʒшK>s< cj2D HEA+c VkКgyuqlvfF#Ih$  KcS:+Y($QD^BAYR9ǘשB "4W&"UE^UFDR"qV96sޣb;Z)bc(b ʒ{('1ưP8G=s1,KJ[zy#++\{7[mq",t<ˎ߄~M7ވv/pm-9'ҀQ?ك ϻ~K3Hؒ|#X /f!1V .0!n veCQl,eLml#|dIfF3=W?ݞ֌F|Οsm4z2UqnzP"f ZqAR8FQVP8^>Md 8U= Ta,㉋gtk5: W*c=M9 yfyQUyO/)kihFP˱)voY8b5!2[qpH'75E3縞qs7pz >s ,c^GTxxi笎F Ue7#B=h1(E4Vӈc WR*b#MzbEGJ2"D2]Ң@DʒaQW""$aHl)8ҔAx̩5MOnXY `Ϟo0w]݆zT"b|l3l*&Da!#O?CQ CZ-a\TA;9p,LDA@^'a« 9^SkkmFDPLUTOϞ[sdjZv)zYY2k-.]b-MY27F#b_EԌ"MM0* u&j Z0@e =kyN3 {1DaHh-xʲDg=9 ȝp#;︃79zQ^]zJXY)U9ss^P{gЭ՘ADةtK_ZZbPl+Skk|9.zd[1h0sz|i& mre_Ml-;%2l2hЪש!*$ycxsX&ֲR* XcH8 Us8Ɋ[ʩeᇹ4,cu4e(ofb: U9Ϟ% |(8fm<$XfMfu [IB+1\VxO/HqY;UN[?g*ax8MF#t:޳<^ҔΝ (cz2h0UcDBǦ9aӡdEi6lm4!1fb"NP媼'09«2aE0"VѮqhぃ6o>v3++C9bkAZXcUBc0ۉen*EFrnlŋ󜝼~bYc% "k#6=UEҔmBc%ZYU1se!YYr-FvNa~Qy7{M1jZp%g73?eX*UZ]'Ty^w91@T?g8ƭXZ2hNc!$n-eUJш'ܙ3=+o;pvRU6ш*-*.≮,ٖ%'xVCvЭ՘k4Hc$ iA|lA= I! &0d"!+B`-1b0`V# Cy6 ̴Z봓vZBP:Gl YU1UQ.ޣI Uʄ(;G#05&&"*VcIB+ֲMRt8n3*K.zTRͶZLAL0Ss o9vmeU/ 6ҔK>Opvc/^{RI˒Bk% fU{O=yU5ZjA@QU* '"v ^2*y%6L$ҮיET #Bh-FfaxyaSS("0TATUR﹚={< v+U9A|ɥ/7MeDa1 C>v$GD|G/H ,t .9v!3S:F3hd.7tvYh6k4(gT5LbHc A{"kcHD0 ADHJ-"cP&*SyO=sQ8D= fs\S*K*qU0"*s&4g#2k5ZIMUGaH}vAr1Mx:3ALM331eeI?XcDX% C b! `" C!1*/.e\ ^<ri0bn{l+G2#8(0. ziJ?)b pǾ}$ zX8`Db$ND0\ɰEUAUEDP*Ug 2~mZ-VG#*﹚'~p@8.QeBUxilkcaNS:G=4eTeI/xbiqQ0Q:KK_Z?hP1=TIch% 4`eFeɶqQ2;xNLLA %L SSv9n"0QBC^$0$EQ{-PL=UEEU1}llhĨ(p32s&}tzQ CWi8ld٤$t :4Qtf#LT@ej4~4 p0d\TI!wGVRLjLj1 d Ҕ4egypHs(47̐Wz=cx>`yNfZZFөיi!]Azư[` ӵ$a}4buzO?Jٍ "`Ϟë1c«4ri0@U~iXSŊMO>͙5{=J+8rۥ,αӨ(xri=yUO>IVU}׽kScsg[V_Yay0`$ϜEҔBkיm4% BUBlZaѠj«2Q MM: kk1"8U `媼G={qO=Ǘ8n14Xh4mm6i' N]^)$\TޓJQF' 16"`T7GaB2AUfyxU38 x@D@a*PUZҢ "yJO=x  6k),veygQe7\^O>Ʌ~ky݄\`ROY1G0FK}aZp51/ }vz}c;DŽ8Gh- @LƐWBkyC B?M5|筷"0[a XUXc1L1= "P Crɫr-9*UJ(+u㘕o {T,@Y"ΡeIJQTޓ%T deə "k EDxjA1fCz{$*bFш{*YY%$- rbiC!~ oiv Ðvni_kiʋ{%/-[:=͍f_uyNN(P *&iD,9E$/ EAVU $p˾N6&fgݦ]p5=&UTaµY6 ϥ|*&EUs'W;WE!2E{ֲt0`(k Zt#05FXX%iY%{|C.wѬ{vW >^kycOMa"8Ug?/"":7 8z[EV8Ο9=˿L=αzO$B=iJ` (B,cX#UaﺋV`%-Kan ϥWEd-_a {J=*sTUEɕ<0HS. \YӋ8c(%Z p-$af&ch18yOZdUEV 0:W_ _\|7mo4eۑ9~G~󋋼R< xrGt: U0QE1gBDIAUy>/S "" gg76{' JUp&0*{vsj ɝqY(E4.{|YcXhm6[nY櫊o%y^IX&U9s,,38t>Ll-Ta~$Fg\ư4a%g76Z=+1FlישeqQ||ǹy ԉA IDATc~y;}0s::(bLk 1t(S/3YT^M"Tx.@=U9i3!3Ǐ2[,4vYh482j1hL Hj(Ex + E8\]ET9(Mi& sl سd-GYٍ {ރWe7=q-GA幌Te'c *3!wfuZ8;22ҔQQ0Qy_?Η.]b  ų%WEUA5m޳TUdUx;xPxcTY9ƣٳ[[|m L% QSs @$Ns{=ZcיqSyFR8GQUUjI?g~׿v{λů#XZ8=pLs (BaF1QEEc05xϋa) {D/*Z*989isf}GxzeQQpgT\KYav.;ut48UZ (gTe*&4emZNӪeIX˶={ nvy 7`D?*)"ϱOwa*U g*;[8WseɕziJʶG|N1~n- )zO ^9PR{O=sxU&-EUs3xL=shY2rA32&YQY; ȝ#sҪ"- Ҕov1:pc Ǘy>s]ZUCZqL;Ih1YchDI9 ȫ(#**ÜXZ}o{:6}=zqvzӡC=p @UEDx+Dx1L < #BVl<6ȇ/]9C</\,۴kiD72sVG#YƋQ%'VW9nf`ËQC64em<&- rʒpө8pôfg+y^?~{J4坿/2$Ac'QE٢cMkY4^q޳F&QĶXq޳0yf}++UŶ4e#MЊcIB3pݬ1Ԍ漧p9 ȫȫ ʋO_yvKg{e*oIT1"\A+GUv@Jb {s O:o<ĸ,y%dU5QBE3FNW}o8U+( ٦NVɫ,ɪ y=bko6Zpg9dzT"xUeN⳧OsOpzm eKqdjf籋駩U9S:ǞEsܱ'4Uɫ͇{iFA`Rb &P-ʕ9FxNs,w<3OS=/]GIkɪO>Ë|-6oz+3IB%i4hFq< l2 [TAť%ݧ>_? 1yy:-0l|/-I03?{(.!`d #"+E PP7{O,Be0{;_j㦛/~?z!\g=MYOS8SI#"k MӔ˵)Z6Q8ǘ+"43݇#V:{6r"wʄZxbD0Aeɜ*Z*0@yGSOG0"|m1SS7$8xPKsTD"([#`{!>a勬-ǎqׁc񘏞8u^|ի[T9XtAX(k!6@(`xi ๒UA QE$„"l@EcpΑzO Xyࡇfs8HSLNenEnΏ |^ſ!>칒WeEZqLVXcx>V$ 6\ XQ^4eLj,ư[=/kඹ9Pe맟w~ͳI#Nぢ(xbem vW9SyϞZw;ƭԣk)O9k.̠UE^"aʋ'lEx {Ρ8I(ppHi ,cX шhD{<*/Dd-qP C&O}|k}>aivnRgY $bD@GQ èCg.q$;2CYš;tW/vUYRtR$i!FƠWe]/K{o~V=22"@9Kk K1$aȢ0Ϛj#ϗ2nsaRamF "˪UKlaS_+vܾ}|DXJ(D6UzD<dSS,vy % ˅v\GD% 9kxE[x͎X(Q@(01*=Qŋc#je1 $ 17ʚjGF8ZZZiR#2/;\jWQA@W%a9 LA'u33|<_aPcrq""B,}}%/ǬDg W8x!*IV2Q"8&  =˕eUƛMf;/DLͺZrj) J&Moe1K*(8Foayn<|*A4Т?C6aay 1(%AU0x+TA*^N>V=S9 T(1"xUZ-,;֬20@ZYFZ+evTS8y>P*Rqj xOtzQk_㑉 N.^UO@+heDu(BXYl`\pA;x 987dɺZ ˪Upˎ՘n6rxy7~DX1"|* P99RML.#PLJrӭe`p%KHb ^E"*=w˿ЇXt1' Õ Ia IjXZ‘.XZ. X[1V9Psj{ yTATA8b {TfŽ{Gyr~4x*-v:v:P+KQDVr"<o$Ĩr0;oG,v:޳ZYSSe}Fp"RJ%iy:y9ǁY,V[r5Ԣ4$_;tRY"m"s*29j=D"JAb "ӣJR@11 ` -4ef4ML{tX*0$a柃NN 甂Z ޽|a^v^yyTXkdF.+cc|䡇vds.z(ѣLZjTK%NV*Q[Nd|YV:fVư\E왚b< TP[TAvQ{jE^?|8V ,(o:.ۼZB1oU*ʝwǙRMJ%1l/O^r ojX "@PECy{Hgb~6O=ʓx=qsƍla=9G Bm](bcWsoz *vn{:sBc%DA@d-ܽͫ/kn,%"*1\e oWc<(b^euuαvijuaȉ' }qLÑy y,V` I1rUyILM7ވ =^AYƁ)UUy(+SU>py'nٱ׿Ŕ%0 ! ^oATQU=v 7~)FUD:ss碵k1<BUA8=STɨD86pyN.LC,`Q~=+Sž (+PEUp@)gD.LjK'B!VOD埓9G4e)!4GwbV㧮+n%q\l-לuqgS"QHNZuv:E419ITbCNDD*HZ-&M<[UAk/Z{;pcqPUTpɢ(hۼuNDTO<'e[SW]ER*#DUNJ xU2r&MDARF }}<93w57ҍ+(YrNDPUSs"(+SUstgѣ>'zܹ(=XzD1Qy") r!=]~ZۿM8"U**{FG90d -HT1 ɨ*sdDkUv5d06Xcj?~*Yj*,u[ނZxWeD0鰨ej\e "J<ΏR\}5mHLb-@? G#c8FUEU1{/OpDA~q̉' Is6oksV)Yy&PQE8=sA❣={叿EYɓTEP`A,cXNE@3%2tENoU1aHT9Vq !(8{իSRywfuW_ͅ6`(A6ofmfrI!j52ȋ4%+ Ң wGvIzk + W* W*8OSf;ir"UfV[ZYxK]q#=""87jj5'|5lհASzOӣޓsEAi6Uehpjy9.0$a IpHSӔNRUu`ne9=w>,cݿTE ""8U·tQ5JO+M9Kͧ){=9dTE'9;QYx(͙J֒!ݢ\u+YTY4X2h2ϳ{rG2jqƫ@J!BOQňT%aׇ>ĭ.2(YR,chWtv U2U0$/ NF9^OsyU]]8?1FzA欳8okes,NV(883R{̰EP򕯰gz(8Q:@E1"*ssHN2:yN;QU%~.ص盧FG9}TT*VPaPpfY‰ D6`kT1"d$h0"#BJIL#BGT1 ;^e \m;yfX αHY㉩)=9}7GGQcYJE{r"웜{/x5  sAQtŋ~8#Zu*"J*Qz}xUVHdsyf׼CCr*ʂiʝ>c\Ey@e0ewE##쳉Uz<éR8G;=?p d@xNE;/~E1LRc6'Rc 9RnfmQxϳ=wTcPQ@TUyAa5\f =88;ˆ>4u:̶Lی7웙T= NnQP8G={=:9ǿu]V2s'ʍgD$xOOw/_㟾M/ݔÐEaPp==cceS_8dkYWszVD2lsfgie7^}5E@==N=8)x@m4Xʩ8$TZRajS 2yͯ*U`Gky6|gs",zhzs㏳ܡQT& ZSbDf-` q)x ݢqC9F/~DDJz#‰EAl-U*Aa@UY ϻns ExPU ` TQE㠊"p2(s\={ 0=1$aI"ybbrbkl*Na36l$oF1pa<3n3 ?\a˅/~1ٺ஻8QD_DŽAH[PWF{OZdy[~HD==XrFϙ 鰬zA9~/fBCO3_=܉LP̶T5*Z|Qn>rUe%EA*Fl-qƺZ ֮4ϙ1kUzæM,"]:fZ-&[-ϳvGi) w:t_Gx Q+W- % 8& Xc1I HS ETK%T32HST3?czA ۷lx~kQUsAI Y˷LSI@ ~AOLNCx5}COqrܽ;4:7FQ,9ekq v[ C735.cEP@D `M =(⒑H nk fg9IugMl-KeqŶmX@XDnQpoellNF(i9nScڼrE[90;rtnȜDjVYC'_sP$H{NPE1=$=4.ΔJ1[),LVYIZJ2\p0KEA#M90lrdQK)XR/HJ%Bc(!a`!F*Q0Ieͱwj'''Oj6˙S{"@TbR/IN{O=FÍK%kZ CVq*FzSc6LSf;:*ϗe[.ZGXw ϤQTs' "Ρ< }=[/o|#,Px9W“?ζ!ZixJ tnvu @8=0j+ܽgg qH7yNOsYˉԓ9tI R{77ؾv-a߮+ 1qmH(9,Ug\fZe$^1h0h}X5k8-יg- EAYFJ=yQxUӔnN<0$ldCZr8<[YFh gJ-ȝ(YKZ+f$a Cl`rȜc}}ldYlCE㘬(Hn^\qgRZ*e1]ir{:sE' R #©qL=4ҔNn=υej+7of''35Ţ_|kIa98UyOTBUe)#)>kwM+y7ވ@AUyrr?$ q̢(h6ie5ҔvnUekQp_I\lcG>€8\e ;FG6Viyh~jOMgtQ;>~f7kaJ)<8p鳀c6b$0$1Q"rLdNNqz1VW^,)EAk5yɶm4{=2J#8h8Z>qBءU&r9(bc`^gZ2+V;.NN%B6|""<W)k n1$!czIB9\5S,r$ð/,pVcSo{}8`-Z1(@Yn󪫰ƠHkTЧk~=##`-h I0Y }VV\Z:abc-}^JMZz>7l IDAT 8"X͊}IMxzuH<ӋM읞&p]6S<}$/})l7)88"Y/"mkIwf}bOk`Xd/D^=WRƘ)ff) Q A+ZZGو$rnTzFL3R Ô //YK>"yJ!<1(-k e\f\"1FljZVf#++|(bբeSX^&L6r͕W7?㤔,}na,lU<2?O7I{/fPlN|m~vr>\_rvD%BJ_|k7޽8@Z03wExZ3S,}&cZ.rlu>RCy]߷mg$$E$IBqQXK'Iku2Eu *J%ô[eU$m I.㠔"10$֢ZJ)i%ycX'w:mtÐ>uK9ZWkR8"h5RhJD% 'uJ$E;M[- *&1J. ];9lZ_9rfzq &"$I"`|GE1|;;8X$XǼ{K)+3|\fǩFZRLrEeso;WNM!!@b-ZaVvcViflQ4:v8&J)-[JvX8_t߸vf  "g#"ZC1S(;0B$֒1}ZҮ!yeX$yl&'u\v~r2C$B$Ѝc:QD+ iz @q<.iEDXs>2naךS Ҿϗ$LgXn֢D c-(tvэ"iex;J%$a$C#:018&f!0d#t\BlLr:H&ﺬ.{>/eC -,0Gx.`XCk$}=2?Ox#q5(D OGRɉfnljf^1ws9|ǡ,6t?韦 FZV ?f@)ŶB##i6Ð2ɠ8;+* y[-.|3ozRZ3>=MZJ@?cIZe|dc,ZzRY;u& .,}K%vPN٬v CRtci!"Jk/9\qg8Kh- fZGຌd2%°n!J!QiYՈsR2 `3jvCqsJ.}T }JRD"JAV.q CE+ŧ ^cW.1Վ"^4=M_kÑU|YmqE=TRg2 __En䛒agg~(C"oc9-4 h  q q'VWٷ'NЎ"Z3ˑv]$DI; wnPt=Q^6;|J9\1{==L0bJZoǛoF2˸lF[K,0cpF:·V3;aHD*0sI9:LVHa^HzsQ"KK຤fKXQąNщ"QD7ْq,b-vzQ^g/F$i/ݾ\߽M.;㜬Vogkz?0??*}yg `.0D$QxWkd>c-8f#^V2=cd،nqV20qWX֩):bJH}K(|a38lbl3<~޽Ok:2ŸOw2pqqh IZ bɇjK߱9 4`8M,hqjM+ sZEߧED.Gqh!1}oњ>15D}'Orǟ x,lۆV\JMcfC ߿c)ɦRz=3phʉj÷'5]v0tacR$a殻8RiFi;FFV*ҚXc۔2j|}~nwm(YK;?q$:߫.dvN'~%Bu]$Ex{I>CI;XKp4ZjGgZ^45E!8QCkw+ZFZ>o^uW_y$IFV涝;~z T*&*N\,{yup @b q"4gE O)ҩ|O>~;P"XZ@#bE0|NF0L##4]fE^w/wnߎa]I¿9c8("IӍc?|GInݾZXG 㘋~|wb=Y I.6kP33[]e3bc۬ۄqQ 4ߧN;i5)Z3L1R Ð1 CUNp.8|Љ":QD'h!1lS E$B}ّJZN6T8Ys.~B*Z,ȟ~+OK;vvݺ};9ϣ/OPњ|AyI>?kkfQF?g" Jkdɓt㘁\W.뉍M0,њVFY\Ed2jn f _xaŶcdSJ=1$lL8m~>70ҷ\*ZԺ]|/R:rl8JrC<|8k 8,kQIB"0 ܼu+N^<=ⴄYµ([gtQ8Lr, DIjJE$\[r9$aRTNbdrWkbkMΗ(4][-?yc ""<3ҍ":QD'D8.3"cX6Nns6ᚩ) ،j5V*,7|;:ͯv۳8uq~NKa`"fkP" ƐRXc k}~_k$IZ kb@i|GQ'C$I ^˯z+NNg#֒47fM8=M&b= ̯Ri ap!ALZa|JiMO+E(DA"s e$ "Eif%IB+hzT;"c4eZ Xk1bX`-%Ў"V]:QD/Rlf7StHexΝn(Ź{=r`e0х~;DMoT:^.d}m>qov,4co9Zsss($ $Bi1 "gϲO? z ϕ}vRi9\0=ox)Hֲ |駹nrVF٧}WŮfVsO?jgnF "a18ef3ҞSSl-9,,ؒ1[.' O-.fb\*ŀaX .v]QD!B}bl-B0q"kY1fhzmaH/D("L8&>c >ygk5Ia$۷rV*l$1F# 'uO<ȡ%zqXH &~p)psRDP""J>]n޶كp$aO98X/)1(@DfO= <\#4GF8^q^g 8 o`#59TDhzwshe dvmUt/<N|WmW]5XN"Dtk5lvs͖-hH' yxajsZ%xƹ(s9&YD Ou\-Bʂv IDATu uI{֬kfXd:w֊a!50$4z=n:QD; i!(X˥"8 |,j0l,aK>ϰ2'k5bcuZ^*1|o4~zիxծ]|N|?W>1,]]uuA+5KRu92Bm;wrZb-V4 Isn2Z`D+Nta<3VWYn6Q"={ |⡇Xt8^Q}֊'C` ON]PJk <ɗ$L/)f^w/{\ӴtE67fe8=M.؈5C .,byglJM'H)f#ZRlw]w]%8l8Xm,aXd$6bAD"cVv:,ۄqL'D($p)R"rg(6҉"UZa0Ok^c/BiV W)<^VVX8L>yNZ12l?oQ u \q\ki|9\vI;q)K-7) #&.3?7Q 1"֒6& y!K&ögӈRܶ};GGx 뱞S۷FSMo5W_M "'96s۲McǨzrg(#X6Urf2Ns6nj0IXKu \u \q.R bcX+8L L Z,6ThzÐV A6bXw6beTn╻wS}\U aX?W 6yz(흚❯~5|S"Kuqf\8_]na}oZزk 1`-} 0?O7 yW21bE% _9tG6U,Gox ,>avn92uxFzQ'Orpel*Şq|a#ZMN5 `4e2G0ըw. @D(Kb }(XKh&LH9A%c8Zk1X]e$Wk&y4gSvV Wk%yl)xΝL ͩz?rXwO=,?w/k~z=}q1KxZ\09]rҮ1nC R[YwZsss+?AD IHDNI©vO?4#Gp 2ǩzqŊ-n_* `Z$ 781ֲn3зe? 0vݖ- nߎQczQJy t9RZJi|!L Ի]U$aXZ,.ֲjq^Xˀ|gN(R@tnю"QmlFFPm9fC k5\Dk-`4eK>a#Xn6IeX$y8J⚉ ٲG)6xq.0џ> y\Z?t5Tm߇ۑ}JrZ^w].QD+ bXc.ܱ{7?t啈}.p48㘗E9,TS'N0sO[V-1pRXQ6Ifw?YcҚsV#S| U^gy\?9I/qX1u%r''v:lбcTmF2 }J)FiA@b&JjT;iؒ1r6^jn3. (ҞD.54z=Qz,1(EtNaemOFzq̱j4ÐKtq(Ӥ]oi k-DpLZRX@'"T;zq\7ΒK؈5|qcH90LggY-}v:|'9Z)yfe2O$/c-8EtnӋc.ew8"%bEcvͱ9bk"XHAZ_9t\1>ӧN\&b0á,#7܀>F),/}1ɐq]^Zb\c8R'8To_r m79k ;#ssl$p]l/I.}(b=q"I.{H{T\-B_)`‘Jc-4SRl$JNTm 0GkF3 O1LrT@l (Etvù읞;v;S< zI°fC ǫU %B)LbP}^L*@X=MpBV'8h& \ff-9VeѠEvCbcn\3>0%/z+N\ lĶR Wk֚f9^q6nӍ"QD'r18\vIW|$`-ZoR acssg~nH)Zkt&&V1YJJpbU 9BxR"u8RJWJ$HIuqy\9ϖ8|Z`e+%*bO5aȁf:Z(!)(cXՊcz1N|yC= i!eU/My)Dq'?NaZ#ַ;wE%  lU/8‰eRx)\=]ǐ X@0)k4") }q8b(J91ssl+xǕWR.<(p`H),GߚAi*c-'WV8<;˱e^j ?b`#B&nS mT0ֲ ue *Wo>7NDT b!kUqȵ楰Ǽ3=!GJ KXCudiʹhk8j1qp{'. d-?SSSlfDYVJ>#l՘l4)q Ҕ^Of9XO._;r##{sΜaU'Mylao9Ce\(Kuو&?AvjV ٚ$9pli~*<^?b4:>`y0ǔ FK%!Xd9B{EwziJ5֔<*F|a{Bud$!ӚZQęNe [Hɍvq8fzq=GφbfCA@P@ P焾*G<)yRY+W )9`A1뱒$$Yf,OSZQD'Z庝;?:'%CZOSjae5Fa-q@k1XβóqIBCss]\$s]XENM!nY\wf#cKK<:?v )r +k~)8[a^g:֫ץ4qxx~~h `%X"!(8Rp]+%ZzYF+dk%J!x:)0~k-y,c6AAf<8;˗Gk͹\(CaH-)qd3Vu1Ȕ"U^cX/_O iP?M9ex&WͻwS)(>R8R2Z*Q*)J$yΙ~^5$$hc8c-I(EX;XcYR^Y'xS}4\2:|Tk3%?}H8\};,cXdUٵs:.X?x5er ߼>6b-B]\亄G7I)I|K_bbG~bH2]NIH Mm<eIuhQ|‘51 wFTK%Nrb\(}b|a-C1;*$0ET& KRx*c-,$ X SD)<'sb24Z.{3KSVkY"xx!\2:ʾFX+2p$OiG_?u`8 "RJV=k BJVy8l&7vǴ`@\)jlۆ`cTÐóm ʾ[wy,G,l8GyGqdGJrc8\kQ`@58LVi4)ɔBYkM'M1(bi0?>[װ#%o24%c.T.]~mojcZ7l^:  )\@ ,0*ETBLCe2>ӭpDϬe Y 53+L\fWJVI!lrdqT)o bf3 (o߳^}g9 `[ J`-C2Q1XcX"EJ1$ڃ4XZDyN$yNZ6ZU;FF(1>$aÑr})kMV\2:9BЎcjA@5sxv)BJ@lqʴs1ҔVъ"YKaZIc3J)]XanreFA49nsߙ3w:#%Q}#}\)ٌm f~<Љc,G=hZőUlIB+XcVN;~k-?W.]m#?‡?y9Å {o@JuJ1$aH}l捷*GJ1)Z#`(3~TBY| MYI]zϳ =c X* ^19c|_{u IDAT'w]Rx6~sjuJDo2KG9jq.B" R,.IP`HHr*IS}<$k2$a%q$21$yNRZ!GJJH)\cZ Z4(ɔbFʅM53C,:sk-e*Bc0IbZe R,dJEK\(pc##|}DYZ;j5~YT(HI7IXE<<;CdZ< DʾFrf*O5!)$EtVca>#YZW&ƂAoc&.H?!J1dY ecߞZ,`!2B0[e*"CN0jhv/;z_z{_cf\kZX!xhf߻nm2*plyAl`- JH! p/;Ɖ%ֲe΢a3ץWJBIBCJITbW vneH[vKKhkdQj/%Q,lm[Dk?}e %dWƾz禌AiM/Myliffȭ`BsINI2H)98:8RAf]\ۮ&'RRnrhzCss,%J8J\XKI<KSΗz`ZEJ3\)%(ǴNӎc1<_Gٿk7 '_r?ib..]p>?JA4~T+H0EX5 ZX\"C+Qħfw}NͱEWaRa#R]^&U:15X6g-xtn{cVqhz$a#B"0R(VX亝;) T|egZl˩1Z x|~rɴ8T*g裤YZP FK%<ǡ$\C[KeDyNetQt]v }jG0* %c?ͻnw^{- ~;NZ\\.e/cȱ?a C99֬wtjb-? Hcu95Z|7ʔoyLkV09?N-ւB'_D!]QC6eǖQưU3ߎsW|k9EZ ءCʵ汅,.Ca+%덗˼|JO=h!B2ɕTM++%Zf]fm` 9).9I-H;y`fm CZkv\c0d- (QZiM5ZYc<jAQ+.+:qL'IX9(k58ngk5]uq.'m>q >T AH xJy6Z32YFe$JqU*TBuk1/?^罯{#T?Rs?H Ðp]n ךTB2dӭ8f[PLlThGza}oJ>7y(ŐYV;9j|9RѠ\(^pXV}\r- e#V)<ץc-I*V?^VMw:<83C=JΑ69NNQ<)V*.dZca#7z8.Ҏc1lUuɴ݊}z<2;ᬝ*ٷvPrQZҚFZQĉV|cRyyZRaHTBMSQD\nƕ۷.IC33^Ya-x^kDY{ K# !ls\!PưR(ˈ(ϱrI)ij4-Ƈ5Wr]~ oI~箻x)\t<^61Y)'iQz%౩)r#hEEw]irNEY\n=xq%,$|}R!)i!BgbC }}R/4F)1ֲ^3vbQp](cc-CVҔzI£ v:Z<'s<'s1</;H_>~(xWs$Eߧhk8u<EϣDy ֬gegZ˅fo[/uYyux8IbUqn=pm*(b38\};lNЊ"iR}&k5A@Xy<,E.Z=Ļ/n]XKhcc/y'/,bq%9M0derxk0?t ` )AkfRPpz=rcZ"~x՞=4j5hUE%}ZQFazZsty$٪3SSkٌp]:GFֲ^'f0^Ð8dJ49xeL)Ҕ++]^ 9q9|m?Bϋ増Du?:8 R%8KVS?@ #ZcuܽNNsC֜nVP ^w kYϺ.qsfJϾfWJ1kh6Vi19ǖɴf+\e3yǒT NZ-R2Z.3R(0d%ӚL)Iq ]lJ~m(kc@J1H!=5Ū/=h͐O˓J4r($m4pdL+)o8x'Yzv-בB0^'ךA1\ T 2)[-1l@[* @pV{n32B8|)ʉ]wHH5Z4iM\>>(؈f]E}f]^EIvU !ZVuJw^wl&2=uóR9q9QaU>ֲ40bBK/;H/M4Ð.u6#dfov9¾ZkvbUPRhE(Bxuc=GJ!0lXK?Mi1(t?ƩS7& ZGFƿ"rыבBQZ AXc@kV=+BAk8c pFk>20dRa(sz=޹)ۇ<03Oتm2*kI!lrdq!س!CﳷP`i02mlšQk1/}&W؁8ƐiFÐs=T 6c#},yN(c،#% 2 ++$y΅q~+hA7LXdq_|u;w"n##yNet(/*U*έ!DiJ7I1+qL+1pY)HZu~> ^H.hvV<)k X!IB k-?!v6|躬!J`D Jphv&"WKIn ON{{ulDowVV+و2!%ڻ벖T)NZlՙ_eDR wRrcq )c_M<'sW*4K%`se&UBR1YF6m1Pa vQ+Y46Jb#D)84=RlFÙNVq! |w\}5e^P}ifH#KK|q!zN|e3qюc..b|(>u&k5 VnY"q1N_2?WJZonN^(.(a+AiL6vZ㠵f }g~qX A`-od^,2Z㰯Z%(U*ax:XjͿ>V!SS 6eǖ~rF^;ɓl|%%Z)$<ɍw Dy/|BRa4 qd(}R.## dZm  /$uj|&H!(>S+iV*a%L_| :zNc\P.h! @Z6ӊ"t:(c5_s bUEgwX M9']''V.s.WV84=MϗF+lTXxC?MY+SN,gG\(S7 ֲ+''y߭w ﺼj^!p\8fy0B֬i}T hqij+Cdگe۷34Q"s]hk C`-kY?ҳ }|ٗګzɾo@$UxǁEs ."<ꌎ>0$!I'NUwuUuumg?7x蓓Nhdo8)BV*dl}cbTbP$}(J)N'ea B̯qhhU ~3RIu)?B\fPy)ɧR\:>rF$ *_:p~,jbDz06 l Ja&,ha58gzML,à e2XA QZcHIE,jÐtE|8AWq]*!VF'NyVML)hlR߫l*RB4$&c$aXʉzŎg~L\r ~ <{9Lv|_I33EtXG4y20 )IBSirU&'69!mYIql+1 Q S4$qmq&,6HI0ZrP6˕ Zsѣt!ȥR\m?) 2Ms:Zk[j6?S:QĞrl*EO' ?1K&tR:)%g1Mj(Ix)j.^w/RƋEئIWq8F'NyVZ-zҶeLFi!g+c۔iX.Gu~ r:kYt5<&H&^ܻk_7Ǹzr~R|8WLv|)W0(LLA'e IDATAB#F LGJs0L\0@k\)(`r&aRa(aP@9!Tv.5 N)%7كc ZVYשd2- Dz0Қ5a#LxiBs$Љ׿N:RR )%]~Z 1ˁN*m|Ar.6M"mYmiUdpdeѓwK%3aԃ81'V ?PJG'>[BPp4T% Uc&J^ \M\yCC5Stz"[_)Y*..1H༑.ÐtGY9Dz(.Eץ800dS)4T+EO+0KAq(8~Xq$"ijǎ_v~d_B?)%?C?z#KK &;/4W -ZX:$ D-Kݳrf벿\5 E? Ԛ]8g&{dfRIi! `~sVuͮ]]!XetV\t8?gEB- 5Ў"RB`&BR|cnO}7J4珌,Ck:QBp8JkV ;t5-a0@Q}?(,`oD@W$NPx e%cOgl6Xۦs.(e2 B|)%=IPt1IBRDQ|} XYa;iX$cۜ tv:JRRfyL e\82cJ! v2AR<_B4Ro7uX\0q)[0(L'VViBFAV )5;K!n@AWJJNZg>r\42BƲ}$C:A!%0DAi\=9I4\P/c8Ə"(‹c,Β|w:|%BК|A )S.Sd!5ߧ)%r 'JyaW+O>2躔\08msNO3"&Q8I6NvS<8qo=J90Q(`lbZS}6;AKUuq>W*] GF6Qj/yly;/1dXdXd8l8Skk,V|\br:v8EEtYA%!etV A@' t8l20U,r: `VÏcv;Ŀ7.)%Ou}G e(\k|kaV3^,:IB%<&fgw&=g($Zso6B0]*Qr]vˌrti("VVjQYW}]YqL' 5fg1K7 )%]BI+ 9n ) ͟x{GBkVMnWi!"TX)X 1Z( CCkm8؆Au):apaH[na,e+N Yi6yxi{ŏcΆJ:X>q}RןwEeP༡!l)A)z4P/,0^HVt?D)$h@vn"v)%aRB,~_zQZ(.t+&'X= ,jVGELX)$ae[->F, 9C|uc\9&I~ _`]W\Aq.z +Q85h>ϠD)nlFM)%eZiZ- ?МY; z ߧQkq !hWzJk޸oBJI—|4; D<_xRңFk]ss|AyR2("i.HRbHZ[oa8lImhiUϣq>nܿR\?y!nq^DzU(mvּ]<6[/ctU\릧 @)<<]\=1={7],lbA6±,ִ|N5Eǡ_RvTPNsi1ҖEu6^h& (EXk /N{kMA+>wܷ /ʍRxQDEt=FB B(EH!Fs9B%8E+̯:K%.6M$+8L t%ZStX)97qLRݥZ\]7݄Hk O}O؆A5]*{rB0(cjA/ 41ĔCb$ %;7 0㘚S<7S/f4cwD)f76}&gK h.P6`{^Tщ"^^1=[.i"Jqt%ZSttH,j)2ı,"e72ZFÉFVp&mMIbfVc"J1Qp R&L4b٤ElT=5;^~:y͌ 87ロ~&;^B ]T`JZ]e;a,Zk0MHser@)ER)ϵ,U*!N Dwsx}ܸo:aȽǎq6v_= -ַu]5guO}7۷8I!leaKCJlGNe^5~ N6q̠l*]Bwhm3|Eg#e\ݥ~Z' 6;^.n:|s03aVl(E=J!bznRIqpL)%=IOlŀqbRr(amSp B(bFiVz6~&u 2Lw^q ;cLv`ݷ~JkAt. R ІA$Z Vrż.)@,%Z)hBp|G2aV*H)'a,ӤZ48I:[d|BRtHޅ$Le+Rkz!~ᵯeTBkҚ|ᇙ.d2JƳY$H$b7at41~ C("cNq.q,`_kYb~c9||I8!Tr:M6ˋc, JU=:R&&S.X˖ ZA@Қ#&8M/pm~k&^\OΖE4|ZbAb Z4!H6R4<+V(bݦy(?w'4t}c_2&;^ FGt$a;?1T Y""i)ߞ!ހ!%= ]Z) JJ|O5Q(p(m eRlkxxyN]NvG9} hKvy(ќc~BT*ZT\4Ja!^swϳ ?/Zs~h>~+𒄆qao*:zo9LRN1֚N`&=AT ^.,Z %N򢈹M$A cYZ+12Mz0 ++Ey5ϣyqLe\J&mlG A9N#N C JQĎ}an8 *g2?#|{0q 33 j>--q:e)QBOjIԭғ>wmzʹЀa\kY\6>X>v& l$57Ra~vAu=XG@ L0I /4ϵz )dpdDJM'NrAW~10ċ"ּXo2~ *&WOLP z:QSu:;2 $y'BKlv:d<ɐKPRJ'*e28I3xti  k|)dS)&E6='O YosdumSd(8gˋ"6;jҚM^Y<`KNKBf`^gf;'N+ X ҶVlď"8Iζ 4|z0Iر\XG|og8dݸoJ͹9Nя}DkC+I@КiL}c)%(EYZJ~cNZ҆G?JO6ᖋ/t] Kk>/% 8NTě.0藱,29zM2]*!kOh.GZkjG2FfM0Ezf?hal>~nҖE?xaHֶQZFM5]+&;F!bbΡUΥw_y%ۿA%J2uϣKJ)w= BiQjIQZs.I!S.s,`HUSS3ϳRa4C AO$t-^klt:{skk6<mSK'Ij};=jq%d|a\wc.5kK#9䛇3Q%?* rS_.1tYNNR1[]J'97kiܾj !@Xd:e&J?u#G=qxylRxt6au"Gh$g( Ϯ_ϻ6o#=$R\! (YEˢ"W.wp829L.4:#b~?Kфv]">LGhYLn:M4V^Pˉh¶Dz@j9J?3v4~?|=J44_DF8rtHa D}>B>ARD0Ф-bz.RBЈ?I*Q޶~==( `*!1lǡuq/MLp5SBodir) $|A zOשO;4Di2NSm.@<&%0J1^>c}(P)%UBLmLV燇NMa:GD(h$`= 2Bz.P,,st.GΝc9v!B:<~F JQKK/a9MFid<[/Dq8ӹRhaPP,*Ycss`z.~H.i8C߮]xuj U\ @vL`< V A#Lg2^>_شm}}D~cRH2~$K%sle*!U,r9ZZBPU2?m->v h 04 v]ݻ9>5!K< !Qm4!^ |>˱]|\qhjD"kۙ-h@J*iXW)\!%Ds]RT(q]4cT{fQ*0 (E=GMU7h,<8ZH2;!A4l\*6rcSS[)(aH`8ݻvq]o/?sU Z B*RdMtlyl/lD,`8qiNP%kcJ޶aQà"](`)iT;#4,Ǐc:UbLuB!zQs-[ǯp1HB#BRKٶɖJLdٞ=<=44Z~MVɶQJz| e1Nc:q\t|>OɶijHil‘m_d9 ,A2 ()ya^j}t*t)z<@pwCUG8̻6n$`4rpl'  KIǾ$*E48<6F/(JQ .+?>};+ZZhdkw7BJ)MLP5{z-[kЄ S*q`d*3H0J-y5:a޳y3ڨdh=gϲc`a x+=|>OEɲH)XzZZh idۜt~jo7vd '  e1ϳP,|i>~2B^/-~?tM#4>2͒)XN\fP S._2EJs]* i[) @ńR}n}h х R 6s |X\si*6tukѤ<|gg'|N0H.fMhm%S,b9U}m\U #7ߌGJRRJQV!U(Ǧel@b=8O4ŐBPIDӳXCM]]{f~?K[ndT$<34D\f"r.pylEDaHXd$U;֬ᗷm5$`BS@\f,"Y(ӼVB"^/@R M5Qa`.Rt4+Y(ȔJ(ik:\Qs@)j)F:HI-ẜyiw14 J JW)e:WIIicǘHidko/qGOU\ @R[)6Bש~mД%!fdOץt.Gٶyrp8t׬ako/L&gTBtGh}--*Mg2/2[ފ&RlH!]*#GJ&ɕ\aH\D&Cg8Wid6c<槥7c;w )H 8JQUv&R) g\.ZxuO,@H!h |T,te8E Lǡ_3C$yf9^!@)jIQE4{`n܈iz<(j(E?9¦n޿u+c$IIUT^bX5mmňD}>,b6 RuWg'@u."<?w4=x\!Knoog>'S*QKs쳜@0 $ R deEA-e 2t~Du${ibuBb6/G>B@q\!UR GwDe"8ؖt.7&o4 D(DJ)ő JM497?6lJ^Pz'>~{< J!\GR!8??߾'&xt42NØ-~?Mخڶ6޷e yij8@޲͝;ٹj(Em#G865"`U".%D- CӨ*Ral"mTtÄ}>p]*\(Xc~]yQ^ Cw4e F"!(&tLDXdPri뺺0tZR4>r>OR\DRRJe!{C"\G4Hty<Գx#~*Ck8̾FW=Pbt(qn݊4\A#4,;RR!@qHYdx95;4)YH4 IJ /,u~q\KǗ^a;d}G, |]Xryq]ϓ7M~no@Co$Bt]2RR9^-MJC! (&0 4Mc6q])&<MM4nꝝd,P bДpv۹cZ~qBTiXD94:J,މ)n~lRruwSvEpd&h*|>X*nꗶnb. lSh3X˃ .H=R_ڲa14VuO>0;7l R4Rr=s"d|;hd$?L4:a @e14?&%0ssmo\׬ի1BXJ3*D&}=DTjDХJ)J)Rخ!g,E)l>l.Rt:+[[whbڵ JQ+#a!ey<vZ r\Ķ939Ii`l&Q7M EX,S,S U::֭mM~<}<_;xV6wuQOIr`|^ws\'941AE0XHKI#S,S v<rfn}y *zZZwA"SSᣏb:Sem{; T)`H%A-!g}C4d_e,8J%tT s`x$ V'D}>~N=[Jy!vtx @_K B9 O-tF"TR a&Et]'N)ڹj& z|tׇWשP(-)Zc4RǹxD IDATuEooGK{$&%0͒*BÇۃy5>ݑMc)RdLHa,LgJt%ҹtXzYg6R(++߶Aשe--sd2#e!P͙LZ K ZUHI7<a!^ d&7hH!FI4R,ϳ܉_iǎO?M[(D,FE"7rmg^rh=Qx @륞府a8r.xk;;h욎[Zz<~|yr]YLۦ´mb^b9tH!XiLd2XCO4J0XLe$ @ z,O\sB/Si74>8w@JjIӧʚ&_9pooguFٶAש>!ӧ5O=EPSwuSRwp]aP}4 VD~ Iln۷KI=׶ÇǏBk0Hxm\JɶZRD @W$aWmf6R|`}{;hRD0HCqv&Ylǡ"k~Y4 QR\|be*d] t`!--{alw@Ŧ3~_%DŽpt@8sdJ%yƍe,P8aٳK]MQ,=J33ųbYUw]˯x#Bꝝe|aiHM=ƣLf2'OIIO4Jk0HE4P(0J΍BPϴ,j~ 3H0۸[[H8TM|GYAoK >]4#/S@PqWG$ŠXm}}n|l@Y)6x\T|O}Lg2,Epx rD:Mٶi {(@m3ɐ+ijjZL )% isΝ(㇔J 0-ZF]Gj8?RcI&YΝ!׋&eQ?OTJa @ qgժ|=AAt̞ӧ |rmх$@H]J(6^]GL6D&Go4/={877ǚVAnW(YUgLKMJIG(D{(Dh)Uyd6c,&Y(z+tWxtpHO<ζ.8TR u\X}2xuOo4JqX8Lf2dJ%]hYr(hjjlSWNb<)RRB r|t:MW!@)b0Z*G)&Y 3JȾ0@q$.qc{{:ʮ7N Q=ʚVA#^]gP` >7F<emkëTk R]ϏǏ=0 n`*VG8iTخ\@T"[.3zikc~à#r{7^AàXL <,RH!ki!RQ 49;78455-M R(oJe*EH,GU"(!ҳę3 (ŏ. R|a^ɯpQr=)pYL898z[Zgٳև?L"#>L@)d<~,W!XZ4фྟYqKmkCqU mc %wZv xyRmazQB.QJQmPd~?]KW$BGٲpd8>=r~qVt)YʪDC/ {gO.S,<]L"㓓|qTŃA޷u+Bʖm|i~.H+WKIxBk;:fM&)6R_Xq]^+Mؾb;:F#EԹs$gO@ф@AEX`Y4cSS;w>LK< h,d=RrTƊxChdP`*ѹBdž.*4!:/J4@pHz:/d׾Fo}7RjC'OՃɕJ,geK o^zr"=ۦr,]q0VQ,c HMJ _}4rEile]Gv!F?zPhZ;:%QS33ٞ=\ ޶~&i\F)r %,ת?U,qOLoxqh M7q]?1ǶB @eˢbXs|rCG uS)rT=c1t)LBWO  Q(E86=+q@rT R(!esA4i4@9BP#$ˉkfqBLڅ c4I9񏣔q]4)JJ9sˏO8@#ef<&[.Sq˪U|h|QD o5h۸JQrXɵ4 d:M4Є ,H!` $,g"A"Ul#%ǃLa>r,88<  WlۤE"R+"crF 7LOr)`+o~i }h]GRrf9s۪Uimə<{XJ!XLx"o|1ov`8(MC.Pm8yKGJ^/(\PJae : ٮWgϹsljkaM[EB2˲de.% lcE"A#R D^j͡q^zzi 4)YJ\fuU[?O,Ə Lg2(`8ccE,WC)E\fP o4Dhq]FR) ISSks2<>(E7se׮]|l.\}w7cA-BW]]FLwY>\̶,P~\FP!) /4zj ;uzRtqy`_ܼOXDulۦ`Y|~^NN: RNn[ex쳜RҥdʕtD"421M}};93iۼ(oXx0Rpjzϝt|^/ٶׯ#.(T6K4yqf J2%"Y,.qb)mp2i455dt@+c1Rʗ,(.&?};>4wo~3ArWmtD2mϝc4d)~ (^&<NG8wSo2E4t) Tm}Pe:4RPnκvLǡlYRKITOxֶu0]z;NR{<\G#FFxڵ+Zgx%~+WrMG˙fyYfs9jݾf nV:"ajI)f94>ضM4YRTH4YhG#Eb$v]~r:WR(!ewl؀O|F>zRXL.,G4ngso/ b*E\fha'Νc9gvB( ^6g\O=CmېFS33|g> zi/* Q$벜 ]]l񰔲e0G;tG"!B v EF dBHѲHE\x%0 ɖˌRJ\z" Wi@ᰘk좱&;81+G[8L<BJIHK&941|.R](AHeJd, {o~x4z<6àB4熆8@E4K(6[z{[i YLR|?bUtôBLg2, ٲz ᇹB!v\Sq΢IɺNꥊEFIb:o M9{iRkkg'7Є]J~Lpd|;t]J*RLRH)[)*\H,,W+҂GhdP`*At)\B!Mf2BꙀbFxr==ŐlP`,b,J*E\sOﰜϵPk>g&vJQK:qC`)׮?uyzhKUٲd2Ld2TI$F, k>r9">7+m*eAMv]FI:Dxx4v뗿w"JBJLOS_޿ ;w圙ᯞ{LF6vwSO:*b~?%AR Ӷ>J\Fݍv.%snnCcc, So(rjݽa7H4^`$[׬#۷Z(a0͒*1t=8, <o9KTQEQE\@Qc3I<'XhbOg;gf$NY "č[[w_=m;~'|[ d:{~Љt-QZjR2җN2W>]]]3`Yk5Gڀ/&IVo8GX!Fy PH&JZZˬa>z8@ IyV zumdLv-,dIR<1=͟<8r.dl!nG?7lߎ(0~O0d0Rr.vRzl)K@072dXLg{ﳖ\{-_r q<4gJ% 4 BZyV _k&y~a5mdlTZ-k5dM;S. 2d5+ Rw^|.߼T\!%svg.ZOT wO$a#!9u'+E8S*oĒ4I[MeR?=8'X)%w2 rݶm8O}8v8k1qDs d (XgII"m޹?=$uǡyD[X௟~_k[o1iz fU#33LPw/-1U*jH!ddBp.mcZytuu0@i*J1_*A!YBeN,BngXm\u+\Qn8H[.&vS IDAT$x$I7^tyaz<5^r BkR8l۷s`fj6qRJ6,j<=3CuY[v沑NБmfU0q۞=l5^uxj/=Zv 7ϓI$xieSJh4 f*=}F"FW#H0c碴fVc٤럖V B'&*W\f5 ZaKEJk/3_:ħCiO}s'kشh>КPݦ8˄ͯr e!'C_q [\yxRgx/z!u.Ė a:pV 5QVO?x5iܼB2ɹ(\Yٹ9|8l[/i2p]N./soܾ)%!O)Q̰7O&BG),/4M\gj1BuPR6M$p| Vsjχ}feR)2"8+/]t(@z\s І5^禝;1 4J1W#4@&CVZaw@ QR"BHlBqZoh0/L X^] ѓLrmtm8@:Mq&jR﹇v e&z&OOOSi)]aaRƝ;x`r<jyL岑~o&aDY֞RN4.SOQk8],>ʔ-I"0M !PZZhh  AXϡ.#Kk$o>V$!PFj?8fxx&HK$mڞG ;7\"AMw#81$ZAJ6Mj5RL"| mޱw/Rz {dmQ/-._pi 3q.NptvRW㶽{'DeIɞAҦ]Pq'`Vc-FFе(EW$,m==,T[-I"{) R\iP2 ֤-Fjd` >B !{xjb|D K0,糭H)ٔ bZ%Tn6dn ii!HՄi2ɹ"*#'Nmv `HKD#$I.dbeq.=$w@HmRg>4]}jV 5R+}^7Ŷ^zi.nFM;hyZku>mRH&حRHp\Қl*X.LB_:rj͙R 5*eYl)0$Ni K]]]l Z)L!Xd5w.ߚ\!N{YOO2{.뢃|Pך%}1$SxI޲w/Rǹw8CkΔ$/VѼ,HSx :@&tZY߶a<.m{55!O}Wc MЬViyffFWaܴSkpr @bV}⩧p}smQH%lm1M2bSr(O[Nl2S.pDM==!SZ3SPw3@Rr.>Qh!RM6Me|ڲ0(Rd L@kuBZ<?>_|{υz=BhM\uYn4ׇemߧl2 yjz1[-==\e BJBWo؁ھOPS>w(JWnĖ^$K$Xi69ȉ%`6-_L@. 4 pR<>=Sgΰ_fv mR)#I$YRyij5j5^t\J1U.<~0l JkO YM_`DՅ j_;~?:JG>Zqv<0++XEv sl6M.d(%iMj6QmD=/\zط7ލV|msli ?Kh>_=vzbBƫ1ћN7*p&b Rr.ЬC=G6M9ۿYO_:pO}f==fZ làc^w|zlJkv 0SPl4xĔ8?n刪;vGYn4Z3DIMO޹w/}5;< \irpv$kT8<5{eѓLP`G_a`TU<~Y|oxZ)B0R(,ej6 RBucXi4xaaZ %`,'L1U.(EWW $P8}Q0M V@MkBq~lق2M4## ?G(Ed? %4ORAA&J֚oϓO8֜)HY?ҚJj/=V*()%mX>O@2EHIֶiۘBkb'wj ՓLröm$-,ynnͻvodCCdm)%VT)$-` AȒBaj1[ҟNc AlwG*\(CJ6 -J5]]]?xL6_) !XoF0 'J К$䓜ϥt f&Wnތ!%*Rũ%~x8-Wb5e[@Ԛӥ hքJRrAmܾtD"KJMqxɧRt ؆yDO"mfe;v Okj㓓\(0Z(`&kYi6Ye NkBDAXMjM/ f rtRF E8t_\o 1M} nW]{/ r#a.E>w0 q-c\&*kۼq2Q??9Sqzy8\==\y3Byrjjͻvmք0 f+U8<5LLqr$d>< H[&2!/xdbO).Dʲ\(`JZ u~l I!moC&. ^&x+|ݶ\"mS) )h.j'"}0[Pww`pJat HGGako/qR.QZџNsÎ؆A/-mh{m7vͅx`}## d䵒-w0MhVy KdB{~nڵͅibKKH)'!xzzΜ㉩)j6"cl.BfZnd9ٮ>xYEkFﺋ8i56 ~+_| 1NM$H6r=O)<Sl4lrN 9A@Ț&q_Z3t\u+DZC1Q,r!$pMle--ۓjG?޿]$L()\ssj e^Ya\BC_Op&Cʶ -l/h> t0?\!H".PJdQAY$.lE$/3 ໂ?x 33ґMIi.M%Ç92;KXOHYEeB'"Nk26{刓B$G !S++(9B2ɯr $LPqXȧR}G&&_XcZe|aI6# Đ_) `\}~xl Jk ):[4 T֬E&!+|@w֭tBgpH)1 ]o><,q4F&àr0Jk;V('fT?'<~_d 2 J&F$.HkQ@kLOG6qdmΔJJa&7lJo:Zj5Wyn> @)4Pmy|bzJSF>"0MF{zLN$ 'xjzZcǐlB*EAaL]]]?\L6_kDJ Vm[EKPָZ|.;0  xZsX|eP ;65x`ym;<{ 5qS2D(= VL2U.ӱod݃ν{1@kU>0M"|2Ń+6m^Y,ߏ;͛ ]40@ҲHZR4+ET/s!>ַ}`aYlI&)L̷O 31ғL2aHIZҚr5]]]?|L6qRJgSJqNB+\!~ֳLЁQ 4!9ww>R)5eY5qmD+e)qr++h ynR) w?%`K&J ~ ) Rcx|Rj6_\"i؁\<8Hh '}NJ^YW㋋}yq6:6gX+L"A+D=15EqXKҲHYb :vMWW+ W8+_d-֜S YMvz&B   @2CLm%iYv `mϣlh!!5Op\浰 dw]v{zGGu9Hq8S*K$jy/..r>oݷ&\%4ˑmBMǡN+>t07\Blt=Zd 8C:yV]wq.?p>{K;#b[o/ۦ'FPڶK$&*>xu$l#gGqdBlњz!0.,ۼVWoď_q)"d e[@h^gT"TjhzDZũb5+DjM|!mgR!H<97lj%:j6MNe#<f=vZ@)6 $lBB/8`} Ck86o۱-5ZkZ%pfeCJ6 DDI"wiM<(= 񢋐R>2wKֶ;S*q۞= d-U|K&WlĞ!ER|9],rlqoW^) `e1S.3_DgXϾܾw/hMH{{QL-/#7dV i>^ | !dOBp.3W<6 lX,r=$|xewz7ǯsƈky/..?:Q\2o"bX$j[o/7E>"yTZ-g|aR׭w-J2 !2i&kI&\m>E|1 0|Zs|aJЦ$9 ^յl 0 *Hp gsY+ VZs>җJ+滔B RбhRr(a`g2ئ WB  ~%ty|]S/o~;C-#!%JJBw='NQH|lmS)|Xj48 J۶!9[uiUOԉel$LJIܖBCx4QDds\FkMDzx|r>}i2pn^0_QwB&Ld(#( 0X-뱵!2`=rRh0.Bp\fR!jV#{pe<5=kH'Қi!PJQm6 7_u@Jɾj"){bIIܰ};cqm!)1f @w|yB&=;?ػl"Ab'''(/U|{ m-tta`,qAӧyvv׃eܲgH&q?'ĝ*i.Q7ɿFE!%Yn4T<3;KTy~n-==!RbH5MeV}L6"WlDO>Qf=֘BU>u睤mTom IDATzvw\al$JGx!D 2 BBk]I6_'E k=&SssZcA f=f]w߽,!-Wv.ٴ )%QRnؾɕZK.#cXBO&(xqq(b@)^ ?y5dlKJ8v'ΜaR]d{ٺZ)c(H&As92ɕ<'<61A: ++j5]]]]dZdXb}o{5~Bq) }ӡ&.CҡS<@G!fko/qE޼s'D<:9IWoSK>| I"eq$++$ .zaI R"`\&~zzJkçus9ҶMH A!gf+Z,jtuuu&D%t @Q J5JL!{۞= "OLfJ&^7!-(JQs]ӧ806F\ؼL7Zi6ڱcٺcca0TD`6K4(p}hyOMMQmy|Cڲ*6|e| Coxzz(ZD \mqwI*AH[r99Q,Tn={YA>@ t\JBFբ2ـ/,p%jl %Q擟d=yZkފ <9t}te2DS)6Qu_fe՚(_)~f2dSJLU &>_yy oo a ^|()jZFJbFLc |-o~BR$ S)|r3 Puޱw/؆A>@A<5=M֚jZl@Gd5!磅@Z>r C q9} tU*x`6P6K>d^'YMo%0PA@qSLjt%2M.aVC+Eբ)I&"+&w϶BibG(DI&WVpggfx{O$0M@)B 8')6l*x׾}<'h?>ξ⊍7 [aIɀmӛͲ\h<}8`6aREƶdH"(tBzL6ZZM.` ZBp"QZ⚾msmJ$t f*@B\|(u/}tL"AGƶjf Rt$Mr㋋XZ]GG41 /qꞇm!VYVy= f2|kM&A @k>͑Yf*$?u5XR5_d\w'ҶMO*Eb O?LM;w,2M%S2n0٠ur$ 0XКq Jt}mm{ǩt"cBQG戳L1)hM4D}(5x=@ AO:e##JQn6RB0Y.?s )B A3gh. ORѹ9^||<7;7N`re5?yUlS++É fi2Bp=BQHYi6VRA;r9Bǎ~0M^XXy=J_)_&T4ՄtdYnR6WҮKHAڶ )阩TX׉:tt(р泥'bP&î~%J)'NT2lrtLJ^^m\Bܙbr7Ď>V z8ǗPJ]Br_>$}##Ľa. c a yVDyJ>^|/6 ylҚ׃urq[vB К(XOBRo'ay,g)xnn85q0(5DcwxH.־>B-ϣn>;ƙR_!J0Mq$! sX;R+ Ws9Ay (zٲ8O=E 'M]D4|T O)&VVjzᡇ8<3Cԝ0^vtvR|cA=1֬bC)Qքvr-k 42Mm VUG58^Fy: :j{y|u]ҨYŲl)@\HlB%@h..Y˛P6,e}HĉK\˶,˶hz櫧w/{;:mѣD {:ҺNT }CC 66wz|mC[ǽу?0hmMWeX$HS&ChCGJZyZ3|8=ZO>4ljzʕljl}Rx D"7k \ Ap5 yL|=4|M3M9'p\W.^dZ%pCWqr|tl[" 'NJO7۶aHIqphІBݍl<<ߧP!<&+C ?8Q+[[ozLMC)_  D"AVje _)l`YCͩ -,RFGy 5Mt!u$%*ftFO>M(cvќUu*PW<>c;-<\ NMq%^Tml-'d25-w _ye?}; I٩)'ju{;Z)eǡ1!|bLB8=1ǟ|˲ʧ|WsB ojHy 7p]k+qS2&&xmgo u RŃs,u% +[g'&JM7j+ffo=l̊&⦪U>?Q˛h0Mw_OZ urߧ꺌΢KIs:7ϜSOl0 AضMܥb>?ϱ! MgOǙO!3}/m<߼ZNC:Ma|i7/_΃[АN3Y>RDg-ܴ|97-[F|W.Q:; ܱz5 llD y\ >O>o<$y-467YH$taWS)b$ВUlM׉B"PB`6))W{VYS,RρKxqȃҘ7k|'pBMV*\͐B+E9喾>d &%Et){/ hmMWaT"nUK YH)F\U4gW_{zϿu%H$\$3oY,ִWw~G)3Ʈ.RNܡ!ެPH4 0$S;{001A Nm0$gpph--^BT )bgj+Z[{|3Z.H$taQـ\:W;?9b6tv< AݸG@W}t56ƍJ46RHI916Fٲ816|>cw[O<~936FTZYFܥbJ7#k4f2իr}ZyU&&oN4;35'N0˖qk_Ri4 \eRaZ%ygci>e })GGI$):2Yhq>B4`UK o}4U":Q+JQu%s֭NWJ@b.#k5݆}|(_=z}}hR>yz 4e2ܶr%{{bYeZ8{7mbESqS*?рo'it]'oxOͶ%wp84RĝӧI$I:0 Ra\ׯBV1 JJ)ʶM@S(qBJBGə&!mldY>r9>sF!>S66TI:oFc&C4id͛Y܌,!d.ff^btvЦ.wtPmM|n~|>~=linYR)ms~jށt y-467YH$i:0)(J$!Scc,fCGߡ硸L4Bc=\BBhh 1Tsl| xQyAie~oB:M˗S,5A!%*hfȶm74|e5 mo̲F*y!oR)Ņi\ NOߞycsOq^$Ŀ4ks (p Ѥdes3!_)U&KIjRhCbYxJהpbbu Pm~5Q*e:KI(clW\75'v1!d9R\/^q]޹z5 MZcb!>A c4Ƨ9z_{Y,6_<|rD"נs SJ!%9q>WTm/_9r;|o&Y;r}=4tM#(@.MLCxup8dS)N$Ŀ&k"WH]G.QW|Xi,oj"J)Eu4@))RRs]eNNڥbm(r|5CC|ꩧ[ڶ6 p|75k]ȦRD9Ku}x95 눻43 ϳ]+W e5fV#t ٵf 7QH$m:0%Yr]Rz? YFJ׉6c*4e2iVҹsPB` 8R"Q*=BुBu~:p}mMHGG =(2u[Х$tb7]kDS&C\Vw-l˗wbl##,MXLc&(.+6eˢdY|g7oF]I:az}9&eD@"NxKQ`.eo 15ečJt76(gYtKIfYLJ|'(ju )Ja{;{zغlqR|q;W J7R*?:ʛx#=,a:j<FFẊnŐ(,|*|!Jsx?<YΆnP8z"I$ kQJJyiD@^3gX M#8e۲eDu& y =iZ:|zYt0wzr9qDFf QGW)b pazggYJ8H$M(Tϟ'(jDu455MrI0;벵bG%ndM7 IDAT@s&ChR$1Y-==ܵn9$m.}ΞeXK{:yqܲض::иxt01 YrΜ!H$ފta#J$JR.W('TUӃ+|}J'NpqzBiB1M6\i( ){|@4I:eqldpRt ֭ CЄ txxSSb,0 ޽aq O,7@4$[5 BS@߸n逸Op<iD j,-'nZ%txxf!+|bY|Y 2mmhRjfi6MjKԉ'P-' )!xp}m3S0;iHiià9<.LNrltrboF q_9rֶ!RN|AB {5#Ԛ!<v]*<,eYS[zz;x&'I$2k(Y&K:t(.T,H_җirMV+lOcD5f2l&ԐN#"2_)FJ%c?s')@4R)Rfj5.2UPm33,喾>,ŋ lGn%m5&u}R\.oB\նڑ#$ہ5]_ [ AH@DBѡ!Vf.ë̯@K6K(W8@n[]JushpXyw=#М"y LM+ 0Q4YAYί}7*eaRt!p=pKy544ӧ:D"vP _lvnn`1mqc*qޱ0P (Mc>tT@K6KhfA)˦*~lldM[B:M$%"x2wL]'gj٩) McT<"KyuaHIeދ.%-4 Hq2q,i D!@)R዇Fȧư@uT2]]T, i):W/]S,RʖLbvi7\,\As:Mg1w[ǖHtB.bZe$ۉN%^j\Ug&%Q5ǡ\[ (j:sI!*4-!P<~$kʘ&ccEWd 77=BrmsblM8XLhXd)߻nDiV13SS;w7kY<~$ _w>,g'&I$yO~u ]C,Ut MWDG>B0R _ AT{>iޱz5R2eDm%% 4 t -zP{.OEk6KT!" <0@Zg'&POhpz\iҖq_x f!,?rH);99`H"H${qs\@DBP֕+4 tWJH>t4xJRxRRm~I4McG_a>UYB+Z[;QRJ2MN|m3]*,% niRHܞgѣYB&Cx5cz+9$=J"H$ cAj]Ӗ7Q.AL]gM#j*Є ' 1Rrzlw5MBݍ gҖ1[3Z*Qm7vw14B:ͱajf8=MԥkNhE[Bfu.NO{mZ:}|l. FJ%WH$+Bq w܁MR~aӒ7R*Ŧn4Mg=G4ZY޿iByDL-==ҚFJӘT6͙ BJ[becLjmJLM#ԘɠK%7ru1p]JZY.DMWuӖϳ5%%0Sr|LNMș&qoqF|!J$ۙN k> N}M#\s?Ӭzt&,tlLMי(ݍ)RH! ̰\( 4 lj"xlD5ӌ, ?c7vw3R< 9Gqe)w[TiD}fuBmMW*rQ,?rH)Ʊc"H$toBӈ{{y@aqy'ﻏlЄ@ '?a4!Y(4H۰]~cZi%nf3^*/VKiàX78=RnZ Xֆ@ٲ9{=JmmĽvQ̭3M⎏x?D"@'.syHMC*D> |&")hBӘ,?~<tMMm^eg )\hd<Y)Gq٩)Y܌tJKIhZb,PhBV !۶6MWخ]t čJ+H$-ta( H 'QR,q4M㽛65 g! u8RP -!0Q^ͽm_Х$i$Дrl:W;04泥 (ߧj8JQTȥӴd2P 0Hk,{׭\*EyߦMMT*x{7mbsWq5OqD⻅N;&V@.|!8{7RHvq'/Lti M#꾍t(_={ZF miʶk )T{)'o\4r<{4&ҺNHjoS,泮}/{8_>?D"D'7>0=B+).sJ4ĝ%K FˉT*?wv2t],plOq}y|=gϢK;V4.LM>i]'zH)c"H$$p@g.!RhB R|!иbyS)!={9D\9&Avwg6R{JS 9߼:G l_B*ED‘!57W,w.ӕ ;֬4-I$V:9~ %@@0`irbD\Dm b&\*ETF)rt64.> :XI{/\r]- q*; ~YJK6KW|?mВN#l*l#/hD"H|7I\gnFvFqPB҄`)J)Bڈ;_9|(߶ф`!{(StvZ2s9ʖE}ʶcG205E@]Vajq''!1&nZe!&,?<8KB_)\pl5P, qhxD"nRBP b)J)B9M#(qB4ItiB!XLTqx^pi0M+ iLr|}#JǙe1T[/'J Aq֭U-G%H$:yzyq\B%`)mM#w1|B:M܋ ]]|:5>"Bo`2$sUmW(눛,~XJwfϣP TlD"$}< (@pK]Lf*:Ϝ>M\H3R}!>3t)YJhMk+-,e&b=(.lh`]g'qRt<ג7S1{{05ط4g2d Ά|!05j;R 49d\}DJ' йS !h!@(!d bdҚyhFhTbxzЍ==A=MJ*MQ/>LN oXRיO{.GLFܦe˸i FUYB@!&i!t ulrJD"vXg~_z!) 2)F4>o3 0vl@s]LW@4YJQm=qZΜa>: @O1 4O@)#%st]guk+M)t]D"vX @ x,Wt*E_B\Ff./OMӃi$Ps] ]Xqrbz)%RH!U},!&nT"?HKѤ$pʕAP C\R  e"̩SZK)>c2D"vxS2BP}|!pd1?|HRifQ:4͓' Ν4g|qN3R.IɲfPccLV*,D AgC!S8&+ɛ&q ,NOʙ&a`:Q2ţGiRH-q}D"x;I)cJ(WRus]4Rhb.0)ٳhm#$R|Z| Dٞ XL{>i4PXDŲȥRj5~gX nD y_=|qXJwc#q }߿9 (KAIMʢ.r,\r9>ǩd:)ʩdUzJ)v\ʻ.۱,YI( 2%^( fz{Eq ~!zxN=/?΅cP"I_6wtzWd A@1?;"(cD=QfIK~kÐ\\&/vF+Rbl1Z;Qݽ$ Y _tfX$5Cd"-Iu>q4[)!Z k-yxϛ0xl2L;׌56u 뮻p]kロ4]N\({P"%Ќ"uXk6I>=MaVE)fK%\.w kAng?VD=2VQm<{9x[$ .k5F)6!1Z\w^Wva=(=<}(d2̯ aZ> IDAT3U,jt:3&SS)>wl O/.C_9rkkLA@l-1Dp5NϳbL\yr񞷄ef@k\9sQEl!"(2@ĆV7> SArfKjW0raPb N|&C=߃!X˟?8i+&1!TPoF8jwE.a7O>V-pmy/DHQfd?ge2O z" I+">SdjMϞRkiF}_8wQ \FwiTgJNt@1'_*D'oxWlDiX<{9xǙ@>+¥J} ie:Qyn VE(ZK9ZK/ )(=8g]crW$,cLR4%W/^$jAl i&'I3ֲ\ӎ"㺸V2ALk٤x罜hˠ^?r?ߏ6J6k-i7]*ѳb iG=Vϟ=(]oP 53"}(繥%6 #"̍jE=As"i,ukIU*CҌ1̯S=vկ2ʮR PA"g J<^n4MXK BZh-Bj1tH_)E2 E☴v=0i<ku$eX$5Z>k-}Y(r$#"|qju:q̾I\*Yfezqj C6xi!bW/\`R@."XK_6d2'm=xraVa]*᪵; ׽ 8?|+-jXn4W.㺴Z_?)''`,իk<{9x7w+~1D>$T8R375WePg,z.LI֢jɇ?Y2A]wZm6yyF-JfZ4$.S",S7FC5[. CҌ1\Z['WNb3JSSJZj41y/W~Fk$IH+ZK^Z$IH3e"' rZ8c?F` Zc" S(@Mϟ8͇3`aC7҅ taRVMqLaØQ"k]́ \W1 b|jt:,jx罜if%BZu~;nr.X&CZM$Iе˵n' ]cX\[k.1iHE`JCkD>c-~=(¥b\uqu_y׻y*quU,y/o"b[.jE2&s92ZglbŠ?(gn> ]ȇ!=$!cZX J\Zzv .W$+-i1\Z[_J\(SpYfe\Z.y˝ƻiykihM_1Um6I:IB! )f2V33|i\=J1!X_<*ȇ!} ךM6ca< jM"}YZ_$lfzv˸N]+DjVy@ݴ/p/Lwc $իrxjv&pV Hdϱ|ZQLLhЊ"6cDaok鉌/x6lF)\k~u&P4z4%¡)R Z-u$adPư;iJ%y\$a~uywhƵDŽl@RAњhU*a%׼Lj֤"lG:r(&&p]]_ ]h[Ko$yZ k-Jgl Zȏ A8-}lr++yF O< nA@Z.a3{eYkiFw͡lp,/?(J)e\󫫌#G1 @TmשZ w|@)Ң$Jw܁k婥%z2AI]ViGy߉4 ?3+a+5S=Q1ۧ)r$@ q㮻hMZ$|eOL&HKÌr3z4d-=Ϯ(&'q]0ƐDIhM.ѣD845V RZyw*( eEp-6c1Ҋczڽ%֒uø[Y0rוz6՚aӧ1殙QDb }U~{G$ (7> zOL C\NZ dTXZ\I b&CfagTb=HE3HDHfݽףg2R=2lFppj{G1Gݻj 8 pV;NJ II³KKr֒C}$a~uyw6nDH E%-P8X6KۥEXXK;}zE, lP ;$SeaÕz쟘 5s %JqhrNb}.\naoL$ƠD0bk$yN(V ](!q]>O+Rr( 4}a9"NQLN⺼Fl cc67ǷYKO;U{ JfYj4.q][_gX$ z0Rf9H;<@(>!.}E AYKo8R JZqL_9/wխrϞ;(Z)fp]Vqs9f](mҳj1t1\XZ2\g)HrZlymx/v,"'Tj5^c =ص -B_#l^Jt։c>o0qHF쟘 |ͯ2wD.-ї \' DHbyw{? bhMV" ++`+%|Ӌt:F909r1>%¡)He`-XKW.\`3Ǚ(p\Z"6Nn` = "6t<:U*~qkQ2v D?>Ni$a^'r9,dx6I\=(R*qWퟜ$5i(0y)\ {\n׮WUD4c-WuEӌ2S*}E1K='&µXn3U(ZH+d2uimfWNkD'^TM˩y~oG>yLZb+3"V0.Q"X (bJ_=,}qvfzֻ]ypo[%aZk\ƵOfc~o%dЌ\d:[fq6̎D 6b&éEcyk_fGOU{ SKKl'lh1}Wj5<4޶T*BBt͍WW{fn =uuZe+ 8oMvJN/-эc6375v驶Zc"h@ggDaذn30!F;:yvDPkYkI+f2:?OO? <!(p leP -T[-\Wj5Z`fwĝXkIg:0@b-X'OyhaQ UOL*ӧN&q aHZVM2U('"Yί֌"j6QF;wODA@b`ロ$B'Ym6Yi6e5;?9Ҏશ۸@AF)|7priQJ Y)e`c+: Ǐc={"'/]bb0gŰae}n3ˑ RXcp7]c+"sxy7O,7*rtDQD BZԛM2LHO)EPt1ֲh  VZ),pzqQ~=Ab@[c } k9(*E ~㓟<{a4ގ)=tӟ33jZ[|K  \Wk5=˵nQ;pm=stP):Qĉs`"Umfw.Gl݄A@jxyCmR&CVkҌ1?cǰ 21ZSzN--ɠ"XZ00uZe+Ag1ym vb&X6x.G;IH,7* 00v5DH+!p}fK%AA"N6kF!O<(?r=(nx2عs9RY_2yx*c\ARJ kd2,-B}!֒Vt8HZ)Utι9 O=(ue]MKzjVp;Fq]][c+ yx+qlfq.#JaGS<b{hM?O2he}X60J^k\,.2\@`☴?q1<󼝣ݹebcJї symd.7ψEXj،0Zd 7Pͼa\8扅<󼝣vrɞRۦfj@ATDX0XLhk-.QQkq 7fp=y4ގXS*vxzϝ=fT*,~(O;FRa~Aּ^np$"~ ?y4ގX9EhF?;FPaٔDQ:IKo^\nK xy;K툳׮U,2JXlMDHؐc@kqJ1Jb-.k i(|O! fNB&CtH5XKçNyZoG4ML0[*;+WTcpZI!!fD)^97G_;QAVN..276FZ.kI+xyq_9si#vF]q_%maqLZ-` Z3Y(l2GIZc/ywigwEeÐ>OfǹxABJ6Z-fJ%NNl2ǟxG@>$(bk鋒+0HrkXd+WWU(0W.^<ϻ4-ri?x8(P q̧+Tؔ 3_f)r4mۧ cDPO|9~FqҚ˕ {+6sim R,jLڅD6\i6<^jt^^Yr0ӌ2Df-xQ %pWWqMha={wBDllxE<󼗆ƻ9}{fgI;89Ɂ)WVH¥_UlK2pvfC!O㜻va~~0Z}RSxy/ w}yX.G;︃?z1F $ Qķ!)F[j69͒v`|s׮1%kA4 |i<󼗆{I<~~;iۿ?z1Fw8 ǎa,F[949I\Vb@3(<{)iN䁣GW39;a]AL0M1MG0dZs3/ `-Y&cy˔)hnfZs32_r ~$T.1*OSSWE4+fW^p """#"#Tb_ĴfZ'L;Tx9ӯ{*PB(b8OoFZZǍ#y) d- """#"#+krY4Ցc_pYô {! 5_‡b(;q"Y673m{2c ""2r,2i?>Rs9~Kˇf8\ɦ.T!"^z}}4Ցu R,d0DDDFEFC=Uv)d]z5isQ) _h g8G7mgE.`mmYMOc+*ƐCgӖ$Nh;A QĂ3ybejUdQO=̡=\Co”zzK%]q晼?<CiK6;G`%cN=_|ΜIօwy2 T+ڀNDDd$XdY >N2O4aXfF:s&YMį̙ckW9& }g1͛yzv6kY& K/Q޳Q9 ]) xcQE\5omƀdڊ y{i8vzzrI1CV#6` Θ:zefMsjGDDFEƔO||k4nYҥ`1,1ӓyj6~ EdFcȲHȘGE}.G֌ܯwȚ1J<~=`Yy6ٓ'UEDDFEƜ={sJwd͟6-\g֬H|JT8le6y&À#""ǗEƤu۶#^w̛NjO?̀})R-`19O>',!0 I9y"c?)XPCo}+]Hg'' ۜVođlNܲf$76"""ǟEƴ{CZǏ炙32a-b{w7?߹~޳LQp߭]9SҘ1R`%+9,2>g--dGo|{{8&! )V*ȺK%\{ _,d-x~;|便zX `R`LIgW8u=͘4e B9~,rBx[=>Ț9q"7]u~xD`\|x1M8iU{ cF=%KA@%sIv{{㘦$a8tu[9 U`Muuec7bZ>|%xe|.ǼɓrwO~JJVOpG '䎩S"HS"(BDD/p~=sZZX2ojRH=Μ4k%V0X%M9 rO+3~WEd9,rB5"47sdMnl䑭[Y0s&{QĶ8fz0яx̙e MgAV#""LJENXz!>t)Ci4DL1w:,\C GDDnXvEƹZK]]om`{8Gs 穭[yfq\1w.RF&M`ˑTZ.CV. "'Wk^wuqNk+lcf% y~.Κ<*˗/} 9,r?۽}4Xc8#R!+9%v2إ3g"""ǞENjvvorҥLzEƵ`އ["a>OV\9,r{an>|};Ǵ% s#(%kYOpw#""ǎEU{{-Ve^e ::(׬! MGDD-H_^ͦ}5Py;裸4e( aHmO ""džE?]s ,>$nb(zVLK2rO ""džEd78c@`b-q$F1ȱc9Iž8xq$ֺ.z*Y!CDD>0ZqLC;csd _`s vΔ)ȱa99I¶8&`0T9ڜ#˧)DY6XFDD6k0=I9T=: ܺf w.Z2R7ȼBDD.kXX \T(z5w,YVj"$}qLKL`-Y!w2o~2A|'7}ۈcy' ☡TE13~ロͷފ TU>xo#""GEu$qx W$199 Ek"""GE hqqLC;☩Iƒ? ;*t)v-""rtXDޠ9IBW3iK{.1dUދy7aZ5 !8o-~klɈayTUj9〪,hmEDD8Q6?Ipqu7{Rcg $gٟ!""EpI8PP"HS1E\wWBDD^1498G` Y\c{ʀ Cx1V!""Ekqmq !{O (?A~k_CDD^;q0=IZ0MCi9s"r\ø5k*@?a_""XD#W.PCO}#f}@"n`z ""Gf!8G>Ʉ0=BcM!""ó}BGm{rE"v1S9<(^(9*"4b ""24( ;no YBG""r((yc2XP.3+qk*DDd0(⒄%sN{;E3iu܂s"2\l[c cZ9"2 MO8G!+qLs ""XDFDŽP7cG35I+nIDATbӓ0IS(9ڜCDdgNuMΑgJLZ t ,"cWcƐ2XP.3B.DDN^1% cZ!d0c ?.ZoEd$lcꌡ"cs,"c$aO1Ԋ8f^ "r1-IfqP x8$Ed @Z461?]Ņ""'5=IҔ2pF{;><""'q<1_6~[*S+$ `fs31U$9S+J@s9ȉfFSQb99.Hsܗ$$s9*ST &9GG?J8e Cy`YsU u&ИQV@>y sٶp!o!1_XDN0 1CW*cZhʸqdYDN@=$akcje^`S3;IK2, lF+]q}KDDƂ)S"r$tΜPU`p% "2EaHs],"'/;㷽rJ2ze|{q;w""2M7c YjIOf`KpP{Q,z>""I44PkWw7f$ 8~k1iJBc$ADd4H` YӃE$;cYISjl~.Z)zy~**$ Lb6/\ȗs'"")A@]"r(P`eϞM(zY!"rcH{zH+YD9+VoWӛJ % 8oSc( `_$=CKyՄ t9n9 0y8jX.3""T Qv(¤)CzOs9Cի9[KdYDdH l^14EYx1/s*  Ǎ/MS,"2Y_v1rJ%b!yhog1|p!"F穏"jM-&'`)c|.$uRJ/e׬LpBGD&Mj*cy'Aƾ>~݈ ' Z'LT@PEU^f(y: (ظlgÑC[}={OUt a!o-*6P,"Y~-#=E2Gby1 u9HqVwp,"r\Y۝{70keҔՑpV(^X_s ИS"ñȈ999c?Ni¾>JyPxkq!"cCC.Gh YjRXDd9q46.[Fss3@zyjux0%UX5IENDB`mimeimage/pngrootassigneelast_run_timestampAڅ\persist_js_state·has_pluto_hook_features§cell_id$6d225dce-3362-4f5d-bba9-0b5312f6be5adepends_on_disabled_cells§runtimeΰepublished_object_keysdepends_on_skipped_cells§errored$0fdafbdc-a6aa-42a6-a899-41b351b5e7e8queued¤logsrunning¦outputbody<

Packages

mimetext/htmlrootassigneelast_run_timestampAڅ̀Epersist_js_state·has_pluto_hook_features§cell_id$0fdafbdc-a6aa-42a6-a899-41b351b5e7e8depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$3e6323cb-4b09-4fe9-a223-8c66cb0d3efcqueued¤logsrunning¦outputbody

Here a list of extra ressources in case you want to learn more. They inspired me a lot through this notebook so hope you find them usefull!

mimetext/htmlrootassigneelast_run_timestampAڅ̀۰persist_js_state·has_pluto_hook_features§cell_id$3e6323cb-4b09-4fe9-a223-8c66cb0d3efcdepends_on_disabled_cells§runtimeopublished_object_keysdepends_on_skipped_cells§errored$16d57341-6c55-4440-bdeb-492b4d0c4427queued¤logsrunning¦outputbody:

Gallery

mimetext/htmlrootassigneelast_run_timestampAڅ|Bpersist_js_state·has_pluto_hook_features§cell_id$16d57341-6c55-4440-bdeb-492b4d0c4427depends_on_disabled_cells§runtime\published_object_keysdepends_on_skipped_cells§errored$d6cc6642-018d-4a7f-b82a-dd50bff8e2fcqueued¤logsrunning¦outputbodyCollatzVisualizationmimetext/plainrootassigneelast_run_timestampAڅˏͰpersist_js_state·has_pluto_hook_features§cell_id$d6cc6642-018d-4a7f-b82a-dd50bff8e2fcdepends_on_disabled_cells§runtime;published_object_keysdepends_on_skipped_cells§errored$5977a13d-93b8-4e51-8484-5b1882100c49queued¤logsrunning¦outputbody

The Collatz Conjecture, also known as the 3x+1 problem, is a fascinating mathematical puzzle that has been named after the German mathematician Lothar Collatz. This conjecture arises from an iterative process where you start with any positive integer and alternate between two simple rules:

  • if the number is even, you divide it by 2,

  • and if it's odd, you multiply it by 3 and add 1.

For example, take the number 3. It's odd, so we multiply by 3 and add 1. We get 10. Now that's even, so we can divide it by 2, to get 5. Back to odd, so let's multiply that by 3 and add 1. We are now at 16, which is very even. So much so that we can keep on dividing by 2 until we reach 1.

$3 \rightarrow 10 \rightarrow 5 \rightarrow 16 \rightarrow 8 \rightarrow 4 \rightarrow 2 \rightarrow 1$

What happens when we reach 1? Well, it's odd so we multiply by 3 and add 1. And we are back at 4, which leads back to one. We have reached a cycle.

$4 \rightarrow 2 \rightarrow 1 \rightarrow 4 \rightarrow 2 \rightarrow 1 \ldots$

The question is, can you predict what the number will be after a certain number of iterations?

The conjecture is that no matter what starting number you choose, regardless of its size, you will always reach the number 1.

However, despite being relatively simple to understand and easy to test for small numbers, it has so far proven difficult to prove definitively for all cases. This conjecture is an unsolved problem in mathematics that continues to intrigue both mathematicians and enthusiasts alike.

mimetext/htmlrootassigneelast_run_timestampAڅv3jpersist_js_state·has_pluto_hook_features§cell_id$0bc0ea95-585d-43be-b7ac-c33a2a7417b4depends_on_disabled_cells§runtimeupublished_object_keysdepends_on_skipped_cells§errored$a1a6130d-771a-43d7-ae94-049e3c9b81b3queued¤logsrunning¦outputbody
ultra_shortcut_collatz
ultra_shortcut_collatz(n::Int)

Calculate the collatz sequence of a number using the absolute shortcut formulation: g(n) = (3n + 1) / 2^k if odd where k is the highest power that divides 3n+1 and g(n) = n / 2 if even

mimetext/htmlrootassigneelast_run_timestampAڅK:persist_js_state·has_pluto_hook_features§cell_id$a1a6130d-771a-43d7-ae94-049e3c9b81b3depends_on_disabled_cells§runtimeR[6published_object_keysdepends_on_skipped_cells§errored$81db5594-75c0-4bfb-8908-ef8084559123queued¤logsrunning¦outputbodyX

The Hailstone Sequence

mimetext/htmlrootassigneelast_run_timestampAڅvpersist_js_state·has_pluto_hook_features§cell_id$81db5594-75c0-4bfb-8908-ef8084559123depends_on_disabled_cells§runtimeppublished_object_keysdepends_on_skipped_cells§errored$c5673bfa-d2b0-4893-ad88-42a5b81f27b4queued¤logsrunning¦outputbodyL

Numerical Packages

Collatz: This package provide the methods to generate the hailstone sequence, the tree graph and stopping time for the collatz conjecture.

Graphs: Used to deal with creating and modifying graphs.

FixedPointNumbers: Package to deal with fixed point number, only used to handle colors.

mimetext/htmlrootassigneelast_run_timestampAڅCpersist_js_state·has_pluto_hook_features§cell_id$c5673bfa-d2b0-4893-ad88-42a5b81f27b4depends_on_disabled_cells§runtime#صpublished_object_keysdepends_on_skipped_cells§errored$9803f163-0027-4577-af8f-c66de195d182queued¤logsrunning¦outputbody>

Functions

mimetext/htmlrootassigneelast_run_timestampAڅ̀persist_js_state·has_pluto_hook_features§cell_id$9803f163-0027-4577-af8f-c66de195d182depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$8c854d1c-2f89-43f0-a810-ce174cf94af8queued¤logsrunning¦outputbodyVisualizationParametersmimetext/plainrootassigneelast_run_timestampAڅEpersist_js_state·has_pluto_hook_features§cell_id$8c854d1c-2f89-43f0-a810-ce174cf94af8depends_on_disabled_cells§runtime򒇵published_object_keysdepends_on_skipped_cells§errored$12d218ee-9a43-4647-a96b-c9252c665fa0queued¤logsrunning¦outputbodyc

We can visualize the path that each number takes with a graph.

mimetext/htmlrootassigneelast_run_timestampAڅy]Bpersist_js_state·has_pluto_hook_features§cell_id$12d218ee-9a43-4647-a96b-c9252c665fa0depends_on_disabled_cells§runtime:published_object_keysdepends_on_skipped_cells§errored$0865f8a3-a959-481b-a9ae-adbca78a2749queued¤logsrunning¦outputbody

Window Size

Height

Width

mimetext/htmlrootassigneelast_run_timestampAڅlUpersist_js_state·has_pluto_hook_features§cell_id$0865f8a3-a959-481b-a9ae-adbca78a2749depends_on_disabled_cells§runtimev`+published_object_keysdepends_on_skipped_cells§errored$13f52ec2-16b9-41a5-9560-177ca827a72equeued¤logsrunning¦outputbodyS

Ploting Packages

Plots: Plotting library for the several plots in the notebook.

Luxor: Drawing library used for the visualiation.

Karnak: Drawing library, specifically for graphs.

NetworkLayout: Used to compute the layout of the graphs.

ImageIO: Used to faciliate the handling of images.

ImageShow: Enhances the displaying of the images in the interactive visualization and the gallery.

mimetext/htmlrootassigneelast_run_timestampAڅpersist_js_state·has_pluto_hook_features§cell_id$13f52ec2-16b9-41a5-9560-177ca827a72edepends_on_disabled_cells§runtime!gCpublished_object_keysdepends_on_skipped_cells§errored$b4a31304-34a3-4ecc-8c6e-e67714bc5d52queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅ :persist_js_state·has_pluto_hook_features§cell_id$b4a31304-34a3-4ecc-8c6e-e67714bc5d52depends_on_disabled_cells§runtime6published_object_keysdepends_on_skipped_cells§errored$7dac4da8-0877-4d07-b4d2-2164faeccfdequeued¤logsrunning¦outputbody7format_sliderParameter (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAڅްpersist_js_state·has_pluto_hook_features§cell_id$7dac4da8-0877-4d07-b4d2-2164faeccfdedepends_on_disabled_cells§runtime9published_object_keysdepends_on_skipped_cells§errored$7dbfb4dc-c9d0-464d-83b2-18db90d76878queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅpersist_js_state·has_pluto_hook_features§cell_id$7dbfb4dc-c9d0-464d-83b2-18db90d76878depends_on_disabled_cells§runtimej[published_object_keysdepends_on_skipped_cells§errored$d0672735-8007-4a69-9fa5-0f40ac0685eaqueued¤logsrunning¦outputbody^

Interactive Visualization

mimetext/htmlrootassigneelast_run_timestampAڅy$persist_js_state·has_pluto_hook_features§cell_id$d0672735-8007-4a69-9fa5-0f40ac0685eadepends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$25d2291f-f422-41e4-aa61-9000e13d34adqueued¤logsrunning¦outputbodyCheckBoxParametermimetext/plainrootassigneelast_run_timestampAڅhpersist_js_state·has_pluto_hook_features§cell_id$25d2291f-f422-41e4-aa61-9000e13d34addepends_on_disabled_cells§runtime{bpublished_object_keysdepends_on_skipped_cells§errored$5f074850-b967-4de5-8ca3-b85a74052499queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅ3ʰpersist_js_state·has_pluto_hook_features§cell_id$5f074850-b967-4de5-8ca3-b85a74052499depends_on_disabled_cells§runtime`ӵpublished_object_keysdepends_on_skipped_cells§errored$822a3646-be9d-4b1c-a189-550bd8b56ab7queued¤logsrunning¦outputbodyD

Introduction

mimetext/htmlrootassigneelast_run_timestampAڅuRpersist_js_state·has_pluto_hook_features§cell_id$822a3646-be9d-4b1c-a189-550bd8b56ab7depends_on_disabled_cells§runtimeQpublished_object_keysdepends_on_skipped_cells§errored$3153ba89-f2d4-4e31-9e79-00ec5ecbb91cqueued¤logsrunning¦outputbodyw
descend_tree!
descend_tree!(g::SimpleGraph{Int64}, record::Array{Tuple{Number,Number}},  tree::Dict, previous::Number=collect(keys(tree))[1], depth::Int=0)

This function is used to explore the tree return by tree_graph from Collatz.jl and modify the graph g given as input.

Args

  • g::SimpleGraph: The graph to modify

  • record::Array{Tuple{Number,Number}}: An array that keeps track of each of the encountered values. Each value is stored as (depth, value) in order to keep track of what depth the value was encountered

  • tree::Dict: The tree graph returned by tree_graph

  • previous::Number: The number passed by the previous call to the function

  • depth::Int: The current depth of the search

mimetext/htmlrootassigneelast_run_timestampAڅLtpersist_js_state·has_pluto_hook_features§cell_id$3153ba89-f2d4-4e31-9e79-00ec5ecbb91cdepends_on_disabled_cells§runtime ppublished_object_keysdepends_on_skipped_cells§errored$b9277abb-7a14-4479-8bcb-6a50df27182bqueued¤logsrunning¦outputbody

A generalization of the collatz function is the following:

$g(n) = n/P \ \ \ \ \ \ \ \text{when}\ \ \ n \ \text{mod}\ P = 0$

$g(n) = an+b \ \ \ \text{otherwise}$

This formulation makes sure that we always deal with integers.

mimetext/htmlrootassigneelast_run_timestampAڅ|ʰpersist_js_state·has_pluto_hook_features§cell_id$b9277abb-7a14-4479-8bcb-6a50df27182bdepends_on_disabled_cells§runtime͵published_object_keysdepends_on_skipped_cells§errored$fb2dd0e1-5198-4c0a-b62b-50649ac21f32queued¤logsrunning¦outputbody*get_notes (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAڅrpersist_js_state·has_pluto_hook_features§cell_id$fb2dd0e1-5198-4c0a-b62b-50649ac21f32depends_on_disabled_cells§runtimeJpublished_object_keysdepends_on_skipped_cells§errored$43c4fd8d-bb44-43cd-91dd-d221629d1fd9queued¤logsrunning¦outputbody-%

Collatz Graph Parameters:

Starting Value

1

Maximum Orbit

9
mimetext/htmlrootassigneelast_run_timestampAڅpersist_js_state·has_pluto_hook_features§cell_id$43c4fd8d-bb44-43cd-91dd-d221629d1fd9depends_on_disabled_cells§runtime|published_object_keysdepends_on_skipped_cells§errored$3550fe19-261e-4069-9bf6-6417dcaac102queued¤logsrunning¦outputbodyx mimeimage/svg+xmlrootassigneelast_run_timestampAڅ%" persist_js_state·has_pluto_hook_features§cell_id$3550fe19-261e-4069-9bf6-6417dcaac102depends_on_disabled_cells§runtime^*published_object_keysdepends_on_skipped_cells§errored$5ba5f885-1de1-4058-91bf-35e1b05d1941queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅJpersist_js_state·has_pluto_hook_features§cell_id$5ba5f885-1de1-4058-91bf-35e1b05d1941depends_on_disabled_cells§runtimeΫ@hpublished_object_keysdepends_on_skipped_cells§errored$bdd54208-1f66-45da-9e67-9479cc460863queued¤logsrunning¦outputbody#

mimetext/htmlrootassigneelast_run_timestampAڅvYpersist_js_state·has_pluto_hook_features§cell_id$bdd54208-1f66-45da-9e67-9479cc460863depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$90dc6dd4-c4f3-4e4d-8e91-0fecafd258e1queued¤logsrunning¦outputbody@

CSS Styles

mimetext/htmlrootassigneelast_run_timestampAڅ̓persist_js_state·has_pluto_hook_features§cell_id$90dc6dd4-c4f3-4e4d-8e91-0fecafd258e1depends_on_disabled_cells§runtime\յpublished_object_keysdepends_on_skipped_cells§errored$2d98aed3-9a51-4225-b914-a20b19f43908queued¤logsrunning¦outputbody3format_colorPicker (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAڅ=}kpersist_js_state·has_pluto_hook_features§cell_id$2d98aed3-9a51-4225-b914-a20b19f43908depends_on_disabled_cells§runtimeCpublished_object_keysdepends_on_skipped_cells§errored$45ca6e2a-6a58-475e-9c02-4925e71625bdqueued¤logsrunning¦outputbodyM mimeimage/svg+xmlrootassigneelast_run_timestampAڅﮰpersist_js_state·has_pluto_hook_features§cell_id$45ca6e2a-6a58-475e-9c02-4925e71625bddepends_on_disabled_cells§runtimeέ4>\published_object_keysdepends_on_skipped_cells§errored$b7b80bd8-7a16-4483-9b8f-b6a8da531b0aqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅ}2]persist_js_state·has_pluto_hook_features§cell_id$b7b80bd8-7a16-4483-9b8f-b6a8da531b0adepends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$1c3f1bea-f1ba-4d64-90ad-584391c01da5queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅzpersist_js_state·has_pluto_hook_features§cell_id$1c3f1bea-f1ba-4d64-90ad-584391c01da5depends_on_disabled_cells§runtime~{published_object_keysdepends_on_skipped_cells§errored$f02affaa-534b-4c72-81ae-c42ca3b455fdqueued¤logsrunning¦outputbody:

Collatz

mimetext/htmlrootassigneelast_run_timestampAڅ̀_persist_js_state·has_pluto_hook_features§cell_id$f02affaa-534b-4c72-81ae-c42ca3b455fddepends_on_disabled_cells§runtimeTpublished_object_keysdepends_on_skipped_cells§errored$0fd7242c-46a1-4929-9c53-3c45768893b4queued¤logsrunning¦outputbody

Stopping Time Plot Parameters

Upper Bound

1000
mimetext/htmlrootassigneelast_run_timestampAڅ8persist_js_state·has_pluto_hook_features§cell_id$0fd7242c-46a1-4929-9c53-3c45768893b4depends_on_disabled_cells§runtime=5published_object_keysdepends_on_skipped_cells§errored$b56a1328-194c-4e1c-a033-9ca6e0ab3eebqueued¤logsrunning¦outputbody#

mimetext/htmlrootassigneelast_run_timestampAڅzpersist_js_state·has_pluto_hook_features§cell_id$b56a1328-194c-4e1c-a033-9ca6e0ab3eebdepends_on_disabled_cells§runtime\published_object_keysdepends_on_skipped_cells§errored$d9aaaadc-7d94-4e85-a1cb-c137e869ad2fqueued¤logsrunning¦outputbody8

Extras

mimetext/htmlrootassigneelast_run_timestampAڅ̓Opersist_js_state·has_pluto_hook_features§cell_id$d9aaaadc-7d94-4e85-a1cb-c137e869ad2fdepends_on_disabled_cells§runtime膵published_object_keysdepends_on_skipped_cells§errored$6f68b20d-67e5-4872-a23b-1840bbbb06ecqueued¤logsrunning¦outputbodyf

The stopping time of a number

mimetext/htmlrootassigneelast_run_timestampAڅypersist_js_state·has_pluto_hook_features§cell_id$6f68b20d-67e5-4872-a23b-1840bbbb06ecdepends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$1b48b435-e959-477f-a8d2-3507da73fc28queued¤logsrunning¦outputbody MyCoolVisualization.png mimetext/htmlrootassigneelast_run_timestampAڅz_persist_js_state·has_pluto_hook_features§cell_id$1b48b435-e959-477f-a8d2-3507da73fc28depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$75b9294e-43a4-48c4-b493-5d40027f3cd6queued¤logsrunning¦outputbodyN

The Collatz Graph

mimetext/htmlrootassigneelast_run_timestampAڅy.persist_js_state·has_pluto_hook_features§cell_id$75b9294e-43a4-48c4-b493-5d40027f3cd6depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$4dd44fbd-f26a-4b72-a580-842209b44f27queued¤logsrunning¦outputbody8format_sliderParameter (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampAڅҰpersist_js_state·has_pluto_hook_features§cell_id$4dd44fbd-f26a-4b72-a580-842209b44f27depends_on_disabled_cells§runtimeupublished_object_keysdepends_on_skipped_cells§errored$5683080b-7d4b-4e34-aa75-b3c68dc60314queued¤logsrunning¦outputbody
draw_hailstone_sequence
draw_hailstone_sequence(hailstone_seq::Vector{Int64}; params::VisualizationParameters)

This function is used to draw the trajectory of the hailstone sequence of a number. Using a Turtle, the function loops over each number in the sequence. For the sequence, a curve is drawn where for each step in the sequence, it will curves one way if the number is odd, and the other way if the number is even.

See also

VisualizationParameters

mimetext/htmlrootassigneelast_run_timestampAڅZ.fpersist_js_state·has_pluto_hook_features§cell_id$5683080b-7d4b-4e34-aa75-b3c68dc60314depends_on_disabled_cells§runtimewpublished_object_keysdepends_on_skipped_cells§errored$6a45247d-25db-445f-a687-191c0952c6c4queued¤logsrunning¦outputbodyg

At first it might seem that the fact that it always reaches 1 could appear strange, as some numbers get caught in a repeating pattern of multiplying by 3 and adding one, when dividing by 2, give a another odd number. Since:

$\begin{aligned} x < \frac{3x + 1}{2} \end{aligned}$

Thus, it's possible (and quite frequent) that we end going up in numbers, and looks like we are getting further away from the pit of doom that is the number 1.

However, this is unfortunately not the case, but we quantify this by calculating how long it takes for a number to reach a another number that is lower than the starting point: the stopping time.

Here is a plot to show the total stopping times of the numbers for up to 1000.

mimetext/htmlrootassigneelast_run_timestampAڅypersist_js_state·has_pluto_hook_features§cell_id$6a45247d-25db-445f-a687-191c0952c6c4depends_on_disabled_cells§runtime kpublished_object_keysdepends_on_skipped_cells§errored$278572e6-5a74-4dad-b39b-68cc85e4339cqueued¤logsrunning¦outputbody
draw_hailstone_sequences
draw_hailstone_sequences(hailstone_seqs::Vector{Vector{Int64}}; params::VisualizationParameters)

This function is used to draw each trajectory given an array of hailstone sequences.

See also

VisualizationParameters

mimetext/htmlrootassigneelast_run_timestampAڅ[߰persist_js_state·has_pluto_hook_features§cell_id$278572e6-5a74-4dad-b39b-68cc85e4339cdepends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$f718bbfd-2e86-45c5-96b3-ef3d810966a9queued¤logsrunning¦outputbodyX
buffer_img_data
buffer_img_data(vis::CollatzVisualization)

Helper function to transform the RGBA img of CollatzVisualization into a UInt8 buffer for loading onto a html canvas.

mimetext/htmlrootassigneelast_run_timestampAڅ dRpersist_js_state·has_pluto_hook_features§cell_id$f718bbfd-2e86-45c5-96b3-ef3d810966a9depends_on_disabled_cells§runtimeO.published_object_keysdepends_on_skipped_cells§errored$5328c6f3-2ae7-4449-a2a2-b6803cec0dccqueued¤logsrunning¦outputbody

Visualization of the Collatz Conjecture by Edmund Harris

The Collatz Conjecture

"Mathematics may not be ready for such problems." - Paul Erdos

mimetext/htmlrootassigneelast_run_timestampAڅ4persist_js_state·has_pluto_hook_features§cell_id$5328c6f3-2ae7-4449-a2a2-b6803cec0dccdepends_on_disabled_cells§runtimeAdtpublished_object_keysdepends_on_skipped_cells§errored$dc1dba7c-8c0d-4609-882a-e5703c467fefqueued¤logsrunning¦outputbodyn

Generalizing the Collatz function

mimetext/htmlrootassigneelast_run_timestampAڅ|persist_js_state·has_pluto_hook_features§cell_id$dc1dba7c-8c0d-4609-882a-e5703c467fefdepends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$23be8efa-b907-453f-9245-8bc46a37ad26queued¤logsrunning¦outputbodyu
shortcut_collatz
shortcut_collatz(n::Int)

Calculate the collatz sequence of a number using the shortcut formulation: g(n) = (3n + 1) / 2 if odd and g(n) = n / 2 if even

mimetext/htmlrootassigneelast_run_timestampAڅJUpersist_js_state·has_pluto_hook_features§cell_id$23be8efa-b907-453f-9245-8bc46a37ad26depends_on_disabled_cells§runtime-賵published_object_keysdepends_on_skipped_cells§errored$b79405c3-42d1-4289-bbc3-67b6eae2b135queued¤logsrunning¦outputbody
descend_tree!
descend_tree!(g::SimpleGraph{Int64}, record::Array{Tuple{Number,Number}},  tree::Dict, previous::Number=collect(keys(tree))[1], depth::Int=0)

This function is used to explore the tree return by tree_graph from Collatz.jl and modify the graph g given as input.

Args

  • g::SimpleGraph: The graph to modify

  • record::Array{Tuple{Number,Number}}: An array that keeps track of each of the encountered values. Each value is stored as (depth, value) in order to keep track of what depth the value was encountered

  • tree::Dict: The tree graph returned by tree_graph

  • previous::Number: The number passed by the previous call to the function

  • depth::Int: The current depth of the search

descend_tree!(g::SimpleGraph{Int64}, record::Array{Tuple{Number,Number}},  key::Int64, previous::Collatz._CC.CC, depth::Int=0)

To handle the case where the search hits a cycle and previous is of type Collatz._CC.CC

Args

  • g::SimpleGraph: The graph to modify

  • record::Array{Tuple{Number,Number}}: An array that keeps track of each of the encountered values

  • tree::Dict: The tree graph returned by tree_graph

  • previous::Collatz._CC.CC: The cycle value.

  • depth::Int: The current depth of the search

mimetext/htmlrootassigneelast_run_timestampAڅX/persist_js_state·has_pluto_hook_features§cell_id$b79405c3-42d1-4289-bbc3-67b6eae2b135depends_on_disabled_cells§runtimeεpublished_object_keysdepends_on_skipped_cells§errored$0e85d872-ef01-463e-b395-b0797c96317equeued¤logsrunning¦outputbody!

Want to generalize the parameters?

Note: This will update all the plots and visualizations in the notebook.
mimetext/htmlrootassigneelast_run_timestampAڅ}persist_js_state·has_pluto_hook_features§cell_id$0e85d872-ef01-463e-b395-b0797c96317edepends_on_disabled_cells§runtimeΊ9ܵpublished_object_keysdepends_on_skipped_cells§errored$240b4cc1-1bae-429b-863b-792897cd555bqueued¤logsrunning¦outputbodyprefixDict{Int64, Vector{Int64}}elementstypeDictprefix_shortDictobjectid92a2e97c8a669789mime!application/vnd.pluto.tree+objectrootassigneeultra_shortcut_collatz_cachelast_run_timestampAڅIpersist_js_state·has_pluto_hook_features§cell_id$240b4cc1-1bae-429b-863b-792897cd555bdepends_on_disabled_cells§runtime~published_object_keysdepends_on_skipped_cells§errored$f21f1e3e-a3ab-458e-a101-ce824731f0b6queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅppersist_js_state·has_pluto_hook_features§cell_id$f21f1e3e-a3ab-458e-a101-ce824731f0b6depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$ae8c02c0-2944-42dc-8a19-a45fbdc16134queued¤logsrunning¦outputbodyH

HTML Functions

mimetext/htmlrootassigneelast_run_timestampAڅ̓"persist_js_state·has_pluto_hook_features§cell_id$ae8c02c0-2944-42dc-8a19-a45fbdc16134depends_on_disabled_cells§runtimeµpublished_object_keysdepends_on_skipped_cells§errored$6e359db6-581f-4a5a-a0a7-6924faf19653queued¤logsrunning¦outputbody٢

Of course, we are not limited to the 3x + 1 problem, what happens if we change up those values?

mimetext/htmlrootassigneelast_run_timestampAڅ|Wmpersist_js_state·has_pluto_hook_features§cell_id$6e359db6-581f-4a5a-a0a7-6924faf19653depends_on_disabled_cells§runtimeLpublished_object_keysdepends_on_skipped_cells§errored$aef6cb43-61c7-4436-ad66-7e7f0459610dqueued¤logsrunning¦outputbodyٯ
Filename:
mimetext/htmlrootassigneelast_run_timestampAڅ| persist_js_state·has_pluto_hook_features§cell_id$aef6cb43-61c7-4436-ad66-7e7f0459610ddepends_on_disabled_cells§runtimeصpublished_object_keysdepends_on_skipped_cells§errored$1e85c1af-3318-4f20-a358-25aa0999dc8aqueued¤logsrunning¦outputbody
hailstone_sequences
hailstone_sequences(range::UnitRange{Int64}; P::Int=2, a::Int=3, b::Int=1 )

Extension for the hailstone_sequence() method from Collatz.jl to calculate list of hailstone sequence given a UnitRange.

Args

  • range::UnitRange{Int64}: Unit Range in which to calculate the hailstone sequences.

Kwargs

  • P::Integer = 2: Modulus used to devide n, iff n is equivalent to (0 mod P).

  • a::Integer = 3: Factor by which to multiply n.

  • b::Integer = 1: Value to add to the scaled value of n.

Examples

julia> hailstone_sequences(2:5) 
[[2, 1], [3, 10, 5, 16, 8, 4, 2, 1], [4, 2, 1], [5, 16, 8, 4, 2, 1]]
julia> hailstone_sequences(1:5; P=4, a=1, b=3)
[[1], [2, 5, 8, 2], [3, 6, 9, 12, 3], [4, 1], [5, 8, 2, 5]]

See also

hailstone_sequence, reverse_hailstone_sequences

mimetext/htmlrootassigneelast_run_timestampAڅMưpersist_js_state·has_pluto_hook_features§cell_id$1e85c1af-3318-4f20-a358-25aa0999dc8adepends_on_disabled_cells§runtimeIOpublished_object_keysdepends_on_skipped_cells§errored$7335059c-d9b8-40a5-b2c0-6bcca4bdfe28queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅ զpersist_js_state·has_pluto_hook_features§cell_id$7335059c-d9b8-40a5-b2c0-6bcca4bdfe28depends_on_disabled_cells§runtime,published_object_keysdepends_on_skipped_cells§errored$10ab31ff-2d28-4ac3-a118-654f8366768equeued¤logsrunning¦outputbodyٺ
Animate?
mimetext/htmlrootassigneelast_run_timestampAڅqgpersist_js_state·has_pluto_hook_features§cell_id$10ab31ff-2d28-4ac3-a118-654f8366768edepends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$cf545d05-7846-4881-a532-33cb2c1972a4queued¤logsrunning¦outputbody:

Drawing

mimetext/htmlrootassigneelast_run_timestampAڅ̀/persist_js_state·has_pluto_hook_features§cell_id$cf545d05-7846-4881-a532-33cb2c1972a4depends_on_disabled_cells§runtimeɵpublished_object_keysdepends_on_skipped_cells§errored$43479204-cd12-40b4-a65f-16bf54aaddfequeued¤logsrunning¦outputbodySliderParametermimetext/plainrootassigneelast_run_timestampAڅ persist_js_state·has_pluto_hook_features§cell_id$43479204-cd12-40b4-a65f-16bf54aaddfedepends_on_disabled_cells§runtime-Zpublished_object_keysdepends_on_skipped_cells§errored$e60fcc3e-312c-4546-9b04-e6b558ba752aqueued¤logsrunning¦outputbodyP mimetext/htmlrootassigneelast_run_timestampAڅipersist_js_state·has_pluto_hook_features§cell_id$e60fcc3e-312c-4546-9b04-e6b558ba752adepends_on_disabled_cells§runtimeͦpublished_object_keysdepends_on_skipped_cells§errored$319d784b-c62d-4f28-a5b3-ebf89c892afcqueued¤logsrunning¦outputbody
make_collatz_graph
make_collatz_graph(initial_value::Int, max_orbit_distance::Int; P=2, a=3, b=1)

This function returns a graph that represent the different branches that each number takes.

Args

  • initial_value::Integer: The starting value of the directed tree graph.

  • max_orbit_distance::Integer: Degree of seperation between the initial value and each value encountered.

Kwargs

  • P::Integer=2: Modulus used to devide n, iff n is equivalent to (0 mod P).

  • a::Integer=3: Factor by which to multiply n.

  • b::Integer=1: Value to add to the scaled value of n.

See also

tree_graph

mimetext/htmlrootassigneelast_run_timestampAڅXpersist_js_state·has_pluto_hook_features§cell_id$319d784b-c62d-4f28-a5b3-ebf89c892afcdepends_on_disabled_cells§runtime_?epublished_object_keysdepends_on_skipped_cells§errored$546a2cf6-f54a-4482-9da5-af9d966b22ebqueued¤logsrunning¦outputbody#

mimetext/htmlrootassigneelast_run_timestampAڅ}uupersist_js_state·has_pluto_hook_features§cell_id$546a2cf6-f54a-4482-9da5-af9d966b22ebdepends_on_disabled_cells§runtime'Ƶpublished_object_keysdepends_on_skipped_cells§errored$b7161895-ba79-4b99-b2f1-eda7484708daqueued¤logslinemsgBCustom style is applied, running with default collatz parameters..text/plaincell_id$b7161895-ba79-4b99-b2f1-eda7484708dakwargsidMain_workspace#4_5b2c1c73filei/home/runner/work/featured/featured/src/math/CollatzConjecture.jl#==#d6cc6642-018d-4a7f-b82a-dd50bff8e2fcgroupCollatzConjecturelevelInforunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅ opersist_js_state·has_pluto_hook_features§cell_id$b7161895-ba79-4b99-b2f1-eda7484708dadepends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$01cc5e4f-d94b-4211-b268-9ce0640cd23fqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅVbpersist_js_state·has_pluto_hook_features§cell_id$01cc5e4f-d94b-4211-b268-9ce0640cd23fdepends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$8a64e9e3-477e-4a7e-97f7-61cf5e428731queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅlpersist_js_state·has_pluto_hook_features§cell_id$8a64e9e3-477e-4a7e-97f7-61cf5e428731depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$b3c9453e-3198-4697-966f-ade21f2255cequeued¤logsrunning¦outputbody

The sequence of values that you go through when iterating a number is often called the hailstone sequence, as the numbers go up and down through the sequence.

mimetext/htmlrootassigneelast_run_timestampAڅx߰persist_js_state·has_pluto_hook_features§cell_id$b3c9453e-3198-4697-966f-ade21f2255cedepends_on_disabled_cells§runtimexpublished_object_keysdepends_on_skipped_cells§errored$af0c36ee-0534-4143-b59b-4ee041ef0f04queued¤logsrunning¦outputbody
mimetext/htmlrootassigneelast_run_timestampAڅpersist_js_state·has_pluto_hook_features§cell_id$af0c36ee-0534-4143-b59b-4ee041ef0f04depends_on_disabled_cells§runtime jpublished_object_keysdepends_on_skipped_cells§errored$f680e7ea-8e3a-41ac-ab92-a27c05103864queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅ-persist_js_state·has_pluto_hook_features§cell_id$f680e7ea-8e3a-41ac-ab92-a27c05103864depends_on_disabled_cells§runtime 0published_object_keysdepends_on_skipped_cells§errored$a7885279-3f73-4c5d-aeef-061dea1ce930queued¤logsrunning¦outputbody9format_checkBoxParameter (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAڅpersist_js_state·has_pluto_hook_features§cell_id$a7885279-3f73-4c5d-aeef-061dea1ce930depends_on_disabled_cells§runtimeFZpublished_object_keysdepends_on_skipped_cells§errored$1255f4cc-7448-40f6-83ba-0cca1637d1cfqueued¤logsrunning¦outputbodyColorParametermimetext/plainrootassigneelast_run_timestampAڅhpersist_js_state·has_pluto_hook_features§cell_id$1255f4cc-7448-40f6-83ba-0cca1637d1cfdepends_on_disabled_cells§runtime7Spublished_object_keysdepends_on_skipped_cells§errored$e4a76493-9aea-4379-9a56-6a9b9e8d6b54queued¤logsrunning¦outputbody

Notebook Packages

PlutoUI: Extension for Pluto to handle interactivity, provides the Sliders, Checkboxes and Color Picker.

HypertextLiteral: Drawing library, specifically for graphs.

mimetext/htmlrootassigneelast_run_timestampAڅ#persist_js_state·has_pluto_hook_features§cell_id$e4a76493-9aea-4379-9a56-6a9b9e8d6b54depends_on_disabled_cells§runtime {{cpublished_object_keysdepends_on_skipped_cells§errored$6693800b-e2bc-46e4-b5f8-004184ef472bqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAڅ5ذpersist_js_state·has_pluto_hook_features§cell_id$6693800b-e2bc-46e4-b5f8-004184ef472bdepends_on_disabled_cells§runtime&Jpublished_object_keysdepends_on_skipped_cells§errored$cdfb638b-a04c-482c-9206-47f7dfd63766queued¤logsrunning¦outputbody<

Appendix

mimetext/htmlrootassigneelast_run_timestampAڅڰpersist_js_state·has_pluto_hook_features§cell_id$cdfb638b-a04c-482c-9206-47f7dfd63766depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$091d8f63-d02a-48fa-be0c-e9e027409279queued¤logsrunning¦outputbodyD

Custom Types

mimetext/htmlrootassigneelast_run_timestampAڅ̀kjpersist_js_state·has_pluto_hook_features§cell_id$091d8f63-d02a-48fa-be0c-e9e027409279depends_on_disabled_cells§runtimeUpublished_object_keysdepends_on_skipped_cells§errored$7baab6e9-31bb-4da5-8ab9-938546cc863equeued¤logsrunning¦outputbody/ mimetext/htmlrootassigneelast_run_timestampAڅ _lpersist_js_state·has_pluto_hook_features§cell_id$7baab6e9-31bb-4da5-8ab9-938546cc863edepends_on_disabled_cells§runtimeȵpublished_object_keysdepends_on_skipped_cells§errored$5655a706-2c53-4763-b8c5-e21aa3e72371queued¤logsrunning¦outputbodyj

While playing around with the viusalization, I stumbled into some nice patterns that I wanted to share with you! I added the parameters in case you want to recreate them. Enjoy :)

(Note that the parameters are highly dependent on the size of the canvas so it might not be trivial to reproduced)

mimetext/htmlrootassigneelast_run_timestampAڅ} persist_js_state·has_pluto_hook_features§cell_id$5655a706-2c53-4763-b8c5-e21aa3e72371depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$3e9a6e74-a0ab-4c47-b493-4670fa828c45queued¤logsrunning¦outputbody#

mimetext/htmlrootassigneelast_run_timestampAڅ}Tpersist_js_state·has_pluto_hook_features§cell_id$3e9a6e74-a0ab-4c47-b493-4670fa828c45depends_on_disabled_cells§runtime%published_object_keysdepends_on_skipped_cells§errored$40dd9659-abb9-4484-b5f1-f332e2abe90equeued¤logsrunning¦outputbody>
reverse_hailstone_sequences
reverse_hailstone_sequences(range::UnitRange{Int64}; P::Int=2, a::Int=3, b::Int=1)

This function wraps the hailstone_sequence() method from Collatz.jl to calculate list of hailstone sequence given a UnitRange.

It return the reversed sequence where the endpoint is the first element of the result.

Args

  • range::UnitRange{Int64}: Unit Range in which to calculate the hailstone sequences.

Kwargs

  • P::Integer = 2: Modulus used to devide n, iff n is equivalent to (0 mod P).

  • a::Integer = 3: Factor by which to multiply n.

  • b::Integer = 1: Value to add to the scaled value of n.

Examples

julia> hailstone_sequences(2:5) 
[[1, 2], [1, 2, 4, 8, 16, 5, 10, 3], [1, 2, 4], [1, 2, 4, 8, 16, 5]]
julia> hailstone_sequences(1:5; P=4, a=1, b=3)
[[1], [2, 8, 5, 2], [3, 12, 9, 6, 3], [1, 4], [5, 2, 8, 5]]

See also

hailstone_sequence, hailstone_sequences

mimetext/htmlrootassigneelast_run_timestampAڅ1persist_js_state·has_pluto_hook_features§cell_id$40dd9659-abb9-4484-b5f1-f332e2abe90edepends_on_disabled_cells§runtimem{published_object_keysdepends_on_skipped_cells§errored$66fe673a-7679-4c55-bf59-146a8dd1241cqueued¤logsrunning¦outputbodylmimetext/htmlrootassigneelast_run_timestampAڅpersist_js_state·has_pluto_hook_features§cell_id$66fe673a-7679-4c55-bf59-146a8dd1241cdepends_on_disabled_cells§runtime>gQpublished_object_keysdepends_on_skipped_cells§errored$f47eb656-67ec-4760-8906-713fa480cb47queued¤logsrunning¦outputbody\

Interactivity extensions

mimetext/htmlrootassigneelast_run_timestampAڅ̓^persist_js_state·has_pluto_hook_features§cell_id$f47eb656-67ec-4760-8906-713fa480cb47depends_on_disabled_cells§runtime郵published_object_keysdepends_on_skipped_cells§errored$31a7994d-13e0-440a-8279-5f19d7d0933fqueued¤logsrunning¦outputbodyNumberFieldParametermimetext/plainrootassigneelast_run_timestampAڅ)Ұpersist_js_state·has_pluto_hook_features§cell_id$31a7994d-13e0-440a-8279-5f19d7d0933fdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$53520512-fc88-4dd2-ae6d-a8ed0d599e42queued¤logsrunning¦outputbodyn mimetext/htmlrootassigneelast_run_timestampAڅ ˚persist_js_state·has_pluto_hook_features§cell_id$53520512-fc88-4dd2-ae6d-a8ed0d599e42depends_on_disabled_cells§runtime|ppublished_object_keysdepends_on_skipped_cells§errored$4c991173-d9ff-4ba9-b217-8f9aafbbd631queued¤logsrunning¦outputbodyprefixDict{Int64, Vector{Int64}}elementstypeDictprefix_shortDictobjectidcb7c6eb7e3a95634mime!application/vnd.pluto.tree+objectrootassigneeshortcut_collatz_cachelast_run_timestampAڅGpersist_js_state·has_pluto_hook_features§cell_id$4c991173-d9ff-4ba9-b217-8f9aafbbd631depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$03eb05fa-57bc-45d0-9943-79034ed10211queued¤logsrunning¦outputbodyz
makeCollatzGallery
makeCollatzGallery(visualizations::Vector{CollatzVisualization}; width::Int=500, height::Int=500)

Helper function to format an array of visualizations into a scrollable gallery, with an panel below the image showing the parameters used to generate the visualization.

Kwargs

-width::Int=500: Width of each image in pixels

-height::Int=500: Height of each image in pixels

mimetext/htmlrootassigneelast_run_timestampAڅpersist_js_state·has_pluto_hook_features§cell_id$03eb05fa-57bc-45d0-9943-79034ed10211depends_on_disabled_cells§runtimerpublished_object_keysdepends_on_skipped_cells§errored$50a423ad-ca90-4015-9ef6-577f60e4efe7queued¤logsrunning¦outputbodyF mimetext/htmlrootassigneelast_run_timestampAڅXupersist_js_state·has_pluto_hook_features§cell_id$50a423ad-ca90-4015-9ef6-577f60e4efe7depends_on_disabled_cells§runtimep+published_object_keysdepends_on_skipped_cells§errored±cell_dependenciesX$e57da7e5-32bb-48a2-af27-5ac671cabdaeprecedence_heuristic cell_id$e57da7e5-32bb-48a2-af27-5ac671cabdaedownstream_cells_maphailstone_params$66fe673a-7679-4c55-bf59-146a8dd1241cupstream_cells_mapCoreBaseformat_sliderParameter$7dac4da8-0877-4d07-b4d2-2164faeccfde$4dd44fbd-f26a-4b72-a580-842209b44f27PlutoRunner.create_bondPlutoRunnerSliderParameter$43479204-cd12-40b4-a65f-16bf54aaddfeCore.applicable@bindBase.get$6d225dce-3362-4f5d-bba9-0b5312f6be5aprecedence_heuristic cell_id$6d225dce-3362-4f5d-bba9-0b5312f6be5adownstream_cells_mapedmund_stylestroke_widthbackground_colorx_startinteractive_viz$1b48b435-e959-477f-a8d2-3507da73fc28line_lengthy_startvary_shadeinit_anglerandom_shadenum_trajectturn_scalestroke_colorchris_styleupstream_cells_mapwindow_width$8a64e9e3-477e-4a7e-97f7-61cf5e428731Valcollatz_parameters$f21f1e3e-a3ab-458e-a101-ce824731f0b6@unpackviz_parameters$5ba5f885-1de1-4058-91bf-35e1b05d1941CollatzVisualization$d6cc6642-018d-4a7f-b82a-dd50bff8e2fcviz_colors_options$01cc5e4f-d94b-4211-b268-9ce0640cd23fwindow_height$8a64e9e3-477e-4a7e-97f7-61cf5e428731viz_extra_options$f680e7ea-8e3a-41ac-ab92-a27c05103864viz_specs_parameters$7dbfb4dc-c9d0-464d-83b2-18db90d76878$0fdafbdc-a6aa-42a6-a899-41b351b5e7e8precedence_heuristic cell_id$0fdafbdc-a6aa-42a6-a899-41b351b5e7e8downstream_cells_mapupstream_cells_map@md_strgetindex$3e6323cb-4b09-4fe9-a223-8c66cb0d3efcprecedence_heuristic cell_id$3e6323cb-4b09-4fe9-a223-8c66cb0d3efcdownstream_cells_mapupstream_cells_map@md_strgetindex$16d57341-6c55-4440-bdeb-492b4d0c4427precedence_heuristic cell_id$16d57341-6c55-4440-bdeb-492b4d0c4427downstream_cells_mapupstream_cells_map@md_strgetindex$d6cc6642-018d-4a7f-b82a-dd50bff8e2fcprecedence_heuristic cell_id$d6cc6642-018d-4a7f-b82a-dd50bff8e2fcdownstream_cells_map@unpack_CollatzVisualizationBase.show@pack_CollatzVisualizationCollatzVisualization$6d225dce-3362-4f5d-bba9-0b5312f6be5a$b7161895-ba79-4b99-b2f1-eda7484708da$f718bbfd-2e86-45c5-96b3-ef3d810966a9$7335059c-d9b8-40a5-b2c0-6bcca4bdfe28$b4a31304-34a3-4ecc-8c6e-e67714bc5d52$03eb05fa-57bc-45d0-9943-79034ed10211$fb2dd0e1-5198-4c0a-b62b-50649ac21f32upstream_cells_map7Luxor.Drawing!Tupleultra_shortcut_collatz$a1a6130d-771a-43d7-ae94-049e3c9b81b3'Base.CoreLogging.Base.fixup_stdlib_pathnothingNamedTupleMatrixLuxor$13f52ec2-16b9-41a5-9560-177ca827a72edraw_hailstone_sequences$278572e6-5a74-4dad-b39b-68cc85e4339cBase.AssertionError@docdumpBase.CoreLogging.===Base.throwerrorRGBA#___this_pluto_module_name=>AnygetisaBaseLuxor.finishnewBase.CoreLogging.isa@imagematrix*UnionBase.CoreLogging.>=reverseshortcut_collatz$23be8efa-b907-453f-9245-8bc46a37ad26IO@with_kwBase.show_defaultN0f8VisualizationParameters$8c854d1c-2f89-43f0-a810-ce174cf94af8escStringconvertBase.CoreLogging.!Vararg@inforeverse_hailstone_sequences$40dd9659-abb9-4484-b5f1-f332e2abe90e!=Luxor.origin==Luxor.image_as_matrixBase.CoreLogging.invokelatest:IOContextBoolColors$13f52ec2-16b9-41a5-9560-177ca827a72eSymbolbackground$5977a13d-93b8-4e51-8484-5b1882100c49precedence_heuristic cell_id$5977a13d-93b8-4e51-8484-5b1882100c49downstream_cells_mapformat_numberFieldParameter$0865f8a3-a959-481b-a9ae-adbca78a2749upstream_cells_map@md_strBase.getindex:HypertextLiteral.BypassPlutoUI$e4a76493-9aea-4379-9a56-6a9b9e8d6b54HypertextLiteral.contentString@htl$e4a76493-9aea-4379-9a56-6a9b9e8d6b54NumberFieldParameter$31a7994d-13e0-440a-8279-5f19d7d0933fVectorBasecombine$e4a76493-9aea-4379-9a56-6a9b9e8d6b54HypertextLiteral.ResultHypertextLiteralPlutoUI.NumberField$0bc0ea95-585d-43be-b7ac-c33a2a7417b4precedence_heuristic cell_id$0bc0ea95-585d-43be-b7ac-c33a2a7417b4downstream_cells_mapupstream_cells_map@md_strgetindex$a1a6130d-771a-43d7-ae94-049e3c9b81b3precedence_heuristic cell_id$a1a6130d-771a-43d7-ae94-049e3c9b81b3downstream_cells_mapultra_shortcut_collatz$d6cc6642-018d-4a7f-b82a-dd50bff8e2fcupstream_cells_map@docdivTuple%remhaskey#___this_pluto_module_nameultra_shortcut_collatz_cache$240b4cc1-1bae-429b-863b-792897cd555b/Int+Union÷==*$81db5594-75c0-4bfb-8908-ef8084559123precedence_heuristic cell_id$81db5594-75c0-4bfb-8908-ef8084559123downstream_cells_mapupstream_cells_map@md_strgetindex$c5673bfa-d2b0-4893-ad88-42a5b81f27b4precedence_heuristiccell_id$c5673bfa-d2b0-4893-ad88-42a5b81f27b4downstream_cells_mapGraphsCollatz$b79405c3-42d1-4289-bbc3-67b6eae2b135FixedPointNumbersupstream_cells_map@md_strgetindex$9803f163-0027-4577-af8f-c66de195d182precedence_heuristic cell_id$9803f163-0027-4577-af8f-c66de195d182downstream_cells_mapupstream_cells_map@md_strgetindex$8c854d1c-2f89-43f0-a810-ce174cf94af8precedence_heuristic cell_id$8c854d1c-2f89-43f0-a810-ce174cf94af8downstream_cells_map@pack_VisualizationParametersBase.showVisualizationParameters$d6cc6642-018d-4a7f-b82a-dd50bff8e2fc$278572e6-5a74-4dad-b39b-68cc85e4339c$5683080b-7d4b-4e34-aa75-b3c68dc60314@unpack_VisualizationParametersupstream_cells_mapIO@with_kwTupleBase.show_defaultescFloat64nothingVararg==@docdumpRGBAIOContextBool#___this_pluto_module_name=>Colors$13f52ec2-16b9-41a5-9560-177ca827a72eAnySymbolgetBaseInt64newUnion$12d218ee-9a43-4647-a96b-c9252c665fa0precedence_heuristic cell_id$12d218ee-9a43-4647-a96b-c9252c665fa0downstream_cells_mapupstream_cells_map@md_strgetindex$0865f8a3-a959-481b-a9ae-adbca78a2749precedence_heuristic cell_id$0865f8a3-a959-481b-a9ae-adbca78a2749downstream_cells_mapwindow_size_parameters$8a64e9e3-477e-4a7e-97f7-61cf5e428731window_size_slidersupstream_cells_mapCoreBaseformat_numberFieldParameter$5977a13d-93b8-4e51-8484-5b1882100c49PlutoRunner.create_bondPlutoRunnerCore.applicable@bindBase.getNumberFieldParameter$31a7994d-13e0-440a-8279-5f19d7d0933f$13f52ec2-16b9-41a5-9560-177ca827a72eprecedence_heuristiccell_id$13f52ec2-16b9-41a5-9560-177ca827a72edownstream_cells_mapImageIOPlots$66fe673a-7679-4c55-bf59-146a8dd1241cNetworkLayoutColors$d6cc6642-018d-4a7f-b82a-dd50bff8e2fc$8c854d1c-2f89-43f0-a810-ce174cf94af8KarnakLuxor$3550fe19-261e-4069-9bf6-6417dcaac102$d6cc6642-018d-4a7f-b82a-dd50bff8e2fc$278572e6-5a74-4dad-b39b-68cc85e4339cImageShowupstream_cells_map@md_strgrgetindex$b4a31304-34a3-4ecc-8c6e-e67714bc5d52precedence_heuristic cell_id$b4a31304-34a3-4ecc-8c6e-e67714bc5d52downstream_cells_mapBase.showupstream_cells_mapBaseIOCollatzVisualization$d6cc6642-018d-4a7f-b82a-dd50bff8e2fc@MIME_str$7dac4da8-0877-4d07-b4d2-2164faeccfdeprecedence_heuristic cell_id$7dac4da8-0877-4d07-b4d2-2164faeccfdedownstream_cells_mapformat_sliderParameter$e57da7e5-32bb-48a2-af27-5ac671cabdae$43c4fd8d-bb44-43cd-91dd-d221629d1fd9$0fd7242c-46a1-4929-9c53-3c45768893b4$5ba5f885-1de1-4058-91bf-35e1b05d1941$7dbfb4dc-c9d0-464d-83b2-18db90d76878$f21f1e3e-a3ab-458e-a101-ce824731f0b6upstream_cells_map@md_strBase.getindex:HypertextLiteral.BypassPlutoUI$e4a76493-9aea-4379-9a56-6a9b9e8d6b54HypertextLiteral.contentString@htl$e4a76493-9aea-4379-9a56-6a9b9e8d6b54VectorBasecombine$e4a76493-9aea-4379-9a56-6a9b9e8d6b54SliderParameter$43479204-cd12-40b4-a65f-16bf54aaddfeHypertextLiteralHypertextLiteral.ResultPlutoUI.Slider$7dbfb4dc-c9d0-464d-83b2-18db90d76878precedence_heuristic cell_id$7dbfb4dc-c9d0-464d-83b2-18db90d76878downstream_cells_mapviz_specs_sliders$50a423ad-ca90-4015-9ef6-577f60e4efe7viz_specs_parameters$6d225dce-3362-4f5d-bba9-0b5312f6be5aupstream_cells_mapwindow_width$8a64e9e3-477e-4a7e-97f7-61cf5e428731Coreformat_sliderParameter$7dac4da8-0877-4d07-b4d2-2164faeccfde$4dd44fbd-f26a-4b72-a580-842209b44f27Base.get@bindBasePlutoRunnerPlutoRunner.create_bond/Core.applicableSliderParameter$43479204-cd12-40b4-a65f-16bf54aaddfewindow_height$8a64e9e3-477e-4a7e-97f7-61cf5e428731$d0672735-8007-4a69-9fa5-0f40ac0685eaprecedence_heuristic cell_id$d0672735-8007-4a69-9fa5-0f40ac0685eadownstream_cells_mapupstream_cells_map@md_strgetindex$25d2291f-f422-41e4-aa61-9000e13d34adprecedence_heuristic cell_id$25d2291f-f422-41e4-aa61-9000e13d34addownstream_cells_map@unpack_CheckBoxParameterBase.showCheckBoxParameter$f680e7ea-8e3a-41ac-ab92-a27c05103864$a7885279-3f73-4c5d-aeef-061dea1ce930@pack_CheckBoxParameterupstream_cells_mapdumpIO@with_kwTupleBase.show_defaultescIOContextBoolString=>AnySymbolnothinggetBasenewerrorVararg*==$5f074850-b967-4de5-8ca3-b85a74052499precedence_heuristic cell_id$5f074850-b967-4de5-8ca3-b85a74052499downstream_cells_mapstopping_times$45ca6e2a-6a58-475e-9c02-4925e71625bdupstream_cells_mapDictgeneralize_collatz$1c3f1bea-f1ba-4d64-90ad-584391c01da5$822a3646-be9d-4b1c-a189-550bd8b56ab7precedence_heuristic cell_id$822a3646-be9d-4b1c-a189-550bd8b56ab7downstream_cells_mapupstream_cells_map@md_strgetindex$3153ba89-f2d4-4e31-9e79-00ec5ecbb91cprecedence_heuristic cell_id$3153ba89-f2d4-4e31-9e79-00ec5ecbb91cdownstream_cells_mapdescend_tree!$319d784b-c62d-4f28-a5b3-ebf89c892afcupstream_cells_mapDictkeysTupleadd_vertex!lengthmap==isnothing@docadd_edge!findfirstcollect#___this_pluto_module_nameisaInt64push!Int+UnionNumberArraySimpleGraph$b9277abb-7a14-4479-8bcb-6a50df27182bprecedence_heuristic cell_id$b9277abb-7a14-4479-8bcb-6a50df27182bdownstream_cells_mapupstream_cells_map@md_strgetindex$fb2dd0e1-5198-4c0a-b62b-50649ac21f32precedence_heuristic cell_id$fb2dd0e1-5198-4c0a-b62b-50649ac21f32downstream_cells_mapget_stroke_width$03eb05fa-57bc-45d0-9943-79034ed10211get_num_trajects$03eb05fa-57bc-45d0-9943-79034ed10211get_y_start$03eb05fa-57bc-45d0-9943-79034ed10211get_window_width$03eb05fa-57bc-45d0-9943-79034ed10211get_notes$03eb05fa-57bc-45d0-9943-79034ed10211get_turn_scale$03eb05fa-57bc-45d0-9943-79034ed10211get_random_shade$03eb05fa-57bc-45d0-9943-79034ed10211get_init_angle$03eb05fa-57bc-45d0-9943-79034ed10211get_x_start$03eb05fa-57bc-45d0-9943-79034ed10211get_vary_shade$03eb05fa-57bc-45d0-9943-79034ed10211get_stroke_color$03eb05fa-57bc-45d0-9943-79034ed10211get_window_height$03eb05fa-57bc-45d0-9943-79034ed10211get_line_length$03eb05fa-57bc-45d0-9943-79034ed10211get_background_color$03eb05fa-57bc-45d0-9943-79034ed10211upstream_cells_maphexRGBCollatzVisualization$d6cc6642-018d-4a7f-b82a-dd50bff8e2fc$43c4fd8d-bb44-43cd-91dd-d221629d1fd9precedence_heuristic cell_id$43c4fd8d-bb44-43cd-91dd-d221629d1fd9downstream_cells_mapgraph_parameters$6693800b-e2bc-46e4-b5f8-004184ef472bgraph_slidersupstream_cells_mapformat_sliderParameter$7dac4da8-0877-4d07-b4d2-2164faeccfde$4dd44fbd-f26a-4b72-a580-842209b44f27#PlutoRunner.PlutoRunner.create_bondHypertextLiteral.Bypass@bindHypertextLiteral.content@htl$e4a76493-9aea-4379-9a56-6a9b9e8d6b54PlutoRunnerPlutoRunner.Base.getHypertextLiteral.ResultHypertextLiteralSliderParameter$43479204-cd12-40b4-a65f-16bf54aaddfePlutoRunner.Core.applicable$3550fe19-261e-4069-9bf6-6417dcaac102precedence_heuristic cell_id$3550fe19-261e-4069-9bf6-6417dcaac102downstream_cells_mapcollatz_graphupstream_cells_mapLuxor.Drawingg$6693800b-e2bc-46e4-b5f8-004184ef472b@drawsvgdrawgraphStressrecord$6693800b-e2bc-46e4-b5f8-004184ef472bLuxor.finishfontsizemapLuxor.sethuesethueLuxor.originLuxor$13f52ec2-16b9-41a5-9560-177ca827a72eLuxor.previewgraph_colors$6693800b-e2bc-46e4-b5f8-004184ef472bbackground$5ba5f885-1de1-4058-91bf-35e1b05d1941precedence_heuristic cell_id$5ba5f885-1de1-4058-91bf-35e1b05d1941downstream_cells_mapviz_sliders$50a423ad-ca90-4015-9ef6-577f60e4efe7viz_parameters$6d225dce-3362-4f5d-bba9-0b5312f6be5aupstream_cells_mapCoreBaseformat_sliderParameter$7dac4da8-0877-4d07-b4d2-2164faeccfde$4dd44fbd-f26a-4b72-a580-842209b44f27PlutoRunner.create_bondPlutoRunnerSliderParameter$43479204-cd12-40b4-a65f-16bf54aaddfeCore.applicable@bindBase.get$bdd54208-1f66-45da-9e67-9479cc460863precedence_heuristic cell_id$bdd54208-1f66-45da-9e67-9479cc460863downstream_cells_mapupstream_cells_map@md_strgetindex$90dc6dd4-c4f3-4e4d-8e91-0fecafd258e1precedence_heuristic cell_id$90dc6dd4-c4f3-4e4d-8e91-0fecafd258e1downstream_cells_mapupstream_cells_map@md_strgetindex$2d98aed3-9a51-4225-b914-a20b19f43908precedence_heuristic cell_id$2d98aed3-9a51-4225-b914-a20b19f43908downstream_cells_mapformat_colorPicker$01cc5e4f-d94b-4211-b268-9ce0640cd23fupstream_cells_map@md_strBase.getindexHypertextLiteral.BypassPlutoUI$e4a76493-9aea-4379-9a56-6a9b9e8d6b54HypertextLiteral.contentString@htl$e4a76493-9aea-4379-9a56-6a9b9e8d6b54VectorBasePlutoUI.ColorPickercombine$e4a76493-9aea-4379-9a56-6a9b9e8d6b54HypertextLiteral.ResultHypertextLiteralColorParameter$1255f4cc-7448-40f6-83ba-0cca1637d1cf$45ca6e2a-6a58-475e-9c02-4925e71625bdprecedence_heuristic cell_id$45ca6e2a-6a58-475e-9c02-4925e71625bddownstream_cells_mapnewValuesupstream_cells_mapkeysgeneralize_collatz$1c3f1bea-f1ba-4d64-90ad-584391c01da5collatz_parameters$f21f1e3e-a3ab-458e-a101-ce824731f0b6filterstopping_times$5f074850-b967-4de5-8ca3-b85a74052499!=>xlabel!collectpush!valuesscatterstopping_timerangetitle!∈stopping_parameters$0fd7242c-46a1-4929-9c53-3c45768893b4insortylabel!$b7b80bd8-7a16-4483-9b8f-b6a8da531b0aprecedence_heuristic cell_id$b7b80bd8-7a16-4483-9b8f-b6a8da531b0adownstream_cells_mapupstream_cells_map$1c3f1bea-f1ba-4d64-90ad-584391c01da5precedence_heuristic cell_id$1c3f1bea-f1ba-4d64-90ad-584391c01da5downstream_cells_mapgeneralize_checkboxgeneralize_collatz$66fe673a-7679-4c55-bf59-146a8dd1241c$6693800b-e2bc-46e4-b5f8-004184ef472b$45ca6e2a-6a58-475e-9c02-4925e71625bd$5f074850-b967-4de5-8ca3-b85a74052499upstream_cells_mapCoreBasePlutoRunner.create_bondPlutoRunnerMultiCheckBoxCore.applicable@bindBase.getdo_generalize_collatz$0e85d872-ef01-463e-b395-b0797c96317e$f02affaa-534b-4c72-81ae-c42ca3b455fdprecedence_heuristic cell_id$f02affaa-534b-4c72-81ae-c42ca3b455fddownstream_cells_mapupstream_cells_map@md_strgetindex$0fd7242c-46a1-4929-9c53-3c45768893b4precedence_heuristic cell_id$0fd7242c-46a1-4929-9c53-3c45768893b4downstream_cells_mapstopping_parameters$45ca6e2a-6a58-475e-9c02-4925e71625bdupstream_cells_mapCoreBaseformat_sliderParameter$7dac4da8-0877-4d07-b4d2-2164faeccfde$4dd44fbd-f26a-4b72-a580-842209b44f27PlutoRunner.create_bondPlutoRunnerSliderParameter$43479204-cd12-40b4-a65f-16bf54aaddfeCore.applicable@bindBase.get$b56a1328-194c-4e1c-a033-9ca6e0ab3eebprecedence_heuristic cell_id$b56a1328-194c-4e1c-a033-9ca6e0ab3eebdownstream_cells_mapupstream_cells_map@md_strgetindex$d9aaaadc-7d94-4e85-a1cb-c137e869ad2fprecedence_heuristic cell_id$d9aaaadc-7d94-4e85-a1cb-c137e869ad2fdownstream_cells_mapupstream_cells_map@md_strgetindex$6f68b20d-67e5-4872-a23b-1840bbbb06ecprecedence_heuristic cell_id$6f68b20d-67e5-4872-a23b-1840bbbb06ecdownstream_cells_mapupstream_cells_map@md_strgetindex$1b48b435-e959-477f-a8d2-3507da73fc28precedence_heuristic cell_id$1b48b435-e959-477f-a8d2-3507da73fc28downstream_cells_mapupstream_cells_mapPlutoUI.DownloadButtonHypertextLiteral.BypassHypertextLiteral.ResultHypertextLiteralfilename$aef6cb43-61c7-4436-ad66-7e7f0459610dPlutoUI$e4a76493-9aea-4379-9a56-6a9b9e8d6b54HypertextLiteral.content==@htl$e4a76493-9aea-4379-9a56-6a9b9e8d6b54interactive_viz$6d225dce-3362-4f5d-bba9-0b5312f6be5a$75b9294e-43a4-48c4-b493-5d40027f3cd6precedence_heuristic cell_id$75b9294e-43a4-48c4-b493-5d40027f3cd6downstream_cells_mapupstream_cells_map@md_strgetindex$4dd44fbd-f26a-4b72-a580-842209b44f27precedence_heuristic cell_id$4dd44fbd-f26a-4b72-a580-842209b44f27downstream_cells_mapformat_sliderParameter$e57da7e5-32bb-48a2-af27-5ac671cabdae$43c4fd8d-bb44-43cd-91dd-d221629d1fd9$0fd7242c-46a1-4929-9c53-3c45768893b4$5ba5f885-1de1-4058-91bf-35e1b05d1941$7dbfb4dc-c9d0-464d-83b2-18db90d76878$f21f1e3e-a3ab-458e-a101-ce824731f0b6upstream_cells_map@md_strBase.getindex:HypertextLiteral.BypassPlutoUI$e4a76493-9aea-4379-9a56-6a9b9e8d6b54HypertextLiteral.contentString@htl$e4a76493-9aea-4379-9a56-6a9b9e8d6b54VectorBasecombine$e4a76493-9aea-4379-9a56-6a9b9e8d6b54SliderParameter$43479204-cd12-40b4-a65f-16bf54aaddfeHypertextLiteralHypertextLiteral.ResultPlutoUI.Slider$5683080b-7d4b-4e34-aa75-b3c68dc60314precedence_heuristic cell_id$5683080b-7d4b-4e34-aa75-b3c68dc60314downstream_cells_mapdraw_hailstone_sequence$278572e6-5a74-4dad-b39b-68cc85e4339cupstream_cells_mapForwardrandnRGBTupleremVisualizationParameters$8c854d1c-2f89-43f0-a810-ce174cf94af8Vectorlength/rescalePencolorTurn==@docTurtle@unpack%Penwidth#___this_pluto_module_namerandInt64setopacity-enumerateVal+Union*$6a45247d-25db-445f-a687-191c0952c6c4precedence_heuristic cell_id$6a45247d-25db-445f-a687-191c0952c6c4downstream_cells_mapupstream_cells_map@md_strgetindex$278572e6-5a74-4dad-b39b-68cc85e4339cprecedence_heuristic cell_id$278572e6-5a74-4dad-b39b-68cc85e4339cdownstream_cells_mapdraw_hailstone_sequences$d6cc6642-018d-4a7f-b82a-dd50bff8e2fcupstream_cells_map@docdeg2rad@unpackTupleLuxor.rotateVisualizationParameters$8c854d1c-2f89-43f0-a810-ce174cf94af8#___this_pluto_module_namedraw_hailstone_sequence$5683080b-7d4b-4e34-aa75-b3c68dc60314VectorInt64-Val/+UnionLuxor.translateπLuxor$13f52ec2-16b9-41a5-9560-177ca827a72eorigin$f718bbfd-2e86-45c5-96b3-ef3d810966a9precedence_heuristic cell_id$f718bbfd-2e86-45c5-96b3-ef3d810966a9downstream_cells_mapbuffer_img_data$53520512-fc88-4dd2-ae6d-a8ed0d599e42upstream_cells_map@docUInt8push!TupleUnionCollatzVisualization$d6cc6642-018d-4a7f-b82a-dd50bff8e2fc#___this_pluto_module_namereinterpretVector$5328c6f3-2ae7-4449-a2a2-b6803cec0dccprecedence_heuristic cell_id$5328c6f3-2ae7-4449-a2a2-b6803cec0dccdownstream_cells_mapupstream_cells_map@md_strResource=>getindex$dc1dba7c-8c0d-4609-882a-e5703c467fefprecedence_heuristic cell_id$dc1dba7c-8c0d-4609-882a-e5703c467fefdownstream_cells_mapupstream_cells_map@md_strgetindex$23be8efa-b907-453f-9245-8bc46a37ad26precedence_heuristic cell_id$23be8efa-b907-453f-9245-8bc46a37ad26downstream_cells_mapshortcut_collatz$d6cc6642-018d-4a7f-b82a-dd50bff8e2fcupstream_cells_map@docdivTuple%remhaskey#___this_pluto_module_nameshortcut_collatz_cache$4c991173-d9ff-4ba9-b217-8f9aafbbd631/Int+Union÷==*$b79405c3-42d1-4289-bbc3-67b6eae2b135precedence_heuristic cell_id$b79405c3-42d1-4289-bbc3-67b6eae2b135downstream_cells_mapdescend_tree!$319d784b-c62d-4f28-a5b3-ebf89c892afcupstream_cells_map@docadd_edge!findfirstTuple#___this_pluto_module_nameCollatz$c5673bfa-d2b0-4893-ad88-42a5b81f27b4lengthInt64mappush!Int+UnionNumber==ArrayisnothingSimpleGraph$0e85d872-ef01-463e-b395-b0797c96317eprecedence_heuristic cell_id$0e85d872-ef01-463e-b395-b0797c96317edownstream_cells_mapdo_generalize_collatz$1c3f1bea-f1ba-4d64-90ad-584391c01da5$f21f1e3e-a3ab-458e-a101-ce824731f0b6$af0c36ee-0534-4143-b59b-4ee041ef0f04upstream_cells_map#PlutoRunner.PlutoRunner.create_bondHypertextLiteral.BypassPlutoUI$e4a76493-9aea-4379-9a56-6a9b9e8d6b54@bindHypertextLiteral.content@htl$e4a76493-9aea-4379-9a56-6a9b9e8d6b54PlutoUI.CheckBoxPlutoRunnerPlutoRunner.Base.getHypertextLiteral.ResultHypertextLiteralPlutoRunner.Core.applicable$240b4cc1-1bae-429b-863b-792897cd555bprecedence_heuristic cell_id$240b4cc1-1bae-429b-863b-792897cd555bdownstream_cells_mapultra_shortcut_collatz_cache$a1a6130d-771a-43d7-ae94-049e3c9b81b3upstream_cells_mapDictIntVector$f21f1e3e-a3ab-458e-a101-ce824731f0b6precedence_heuristic cell_id$f21f1e3e-a3ab-458e-a101-ce824731f0b6downstream_cells_mapcollatz_parameters$66fe673a-7679-4c55-bf59-146a8dd1241c$6693800b-e2bc-46e4-b5f8-004184ef472b$45ca6e2a-6a58-475e-9c02-4925e71625bd$6d225dce-3362-4f5d-bba9-0b5312f6be5acollatz_slidersupstream_cells_mapCoreBaseformat_sliderParameter$7dac4da8-0877-4d07-b4d2-2164faeccfde$4dd44fbd-f26a-4b72-a580-842209b44f27PlutoRunner.create_bondPlutoRunnerSliderParameter$43479204-cd12-40b4-a65f-16bf54aaddfeCore.applicableBase.get@binddo_generalize_collatz$0e85d872-ef01-463e-b395-b0797c96317e$ae8c02c0-2944-42dc-8a19-a45fbdc16134precedence_heuristic cell_id$ae8c02c0-2944-42dc-8a19-a45fbdc16134downstream_cells_mapupstream_cells_map@md_strgetindex$6e359db6-581f-4a5a-a0a7-6924faf19653precedence_heuristic cell_id$6e359db6-581f-4a5a-a0a7-6924faf19653downstream_cells_mapupstream_cells_map@md_strgetindex$aef6cb43-61c7-4436-ad66-7e7f0459610dprecedence_heuristic cell_id$aef6cb43-61c7-4436-ad66-7e7f0459610ddownstream_cells_mapfilename$1b48b435-e959-477f-a8d2-3507da73fc28upstream_cells_mapPlutoUI.TextField#PlutoRunner.PlutoRunner.create_bondHypertextLiteral.BypassPlutoUI$e4a76493-9aea-4379-9a56-6a9b9e8d6b54@bindHypertextLiteral.content@htl$e4a76493-9aea-4379-9a56-6a9b9e8d6b54PlutoRunnerPlutoRunner.Base.getHypertextLiteral.ResultHypertextLiteralPlutoRunner.Core.applicable$1e85c1af-3318-4f20-a358-25aa0999dc8aprecedence_heuristic cell_id$1e85c1af-3318-4f20-a358-25aa0999dc8adownstream_cells_maphailstone_sequencesupstream_cells_map@docInt64UnitRangeTupleIntUnion#___this_pluto_module_namehailstone_sequence$7335059c-d9b8-40a5-b2c0-6bcca4bdfe28precedence_heuristic cell_id$7335059c-d9b8-40a5-b2c0-6bcca4bdfe28downstream_cells_mapBase.getpropertyupstream_cells_mapgetfieldBaseCollatzVisualization$d6cc6642-018d-4a7f-b82a-dd50bff8e2fc==Symbol$10ab31ff-2d28-4ac3-a118-654f8366768eprecedence_heuristic cell_id$10ab31ff-2d28-4ac3-a118-654f8366768edownstream_cells_mapanimate_hailstone$66fe673a-7679-4c55-bf59-146a8dd1241cupstream_cells_map#PlutoRunner.PlutoRunner.create_bondHypertextLiteral.BypassPlutoUI$e4a76493-9aea-4379-9a56-6a9b9e8d6b54@bindHypertextLiteral.content@htl$e4a76493-9aea-4379-9a56-6a9b9e8d6b54PlutoUI.CheckBoxPlutoRunnerPlutoRunner.Base.getHypertextLiteral.ResultHypertextLiteralPlutoRunner.Core.applicable$cf545d05-7846-4881-a532-33cb2c1972a4precedence_heuristic cell_id$cf545d05-7846-4881-a532-33cb2c1972a4downstream_cells_mapupstream_cells_map@md_strgetindex$43479204-cd12-40b4-a65f-16bf54aaddfeprecedence_heuristic cell_id$43479204-cd12-40b4-a65f-16bf54aaddfedownstream_cells_map@unpack_SliderParameterBase.showSliderParameter$e57da7e5-32bb-48a2-af27-5ac671cabdae$43c4fd8d-bb44-43cd-91dd-d221629d1fd9$0fd7242c-46a1-4929-9c53-3c45768893b4$5ba5f885-1de1-4058-91bf-35e1b05d1941$7dbfb4dc-c9d0-464d-83b2-18db90d76878$f21f1e3e-a3ab-458e-a101-ce824731f0b6$43479204-cd12-40b4-a65f-16bf54aaddfe$7dac4da8-0877-4d07-b4d2-2164faeccfde$4dd44fbd-f26a-4b72-a580-842209b44f27@pack_SliderParameterupstream_cells_mapIO@with_kwTupleBase.show_defaultescislessStringnothingAnySymbolgetBasenewSliderParameter$43479204-cd12-40b4-a65f-16bf54aaddfe*$e60fcc3e-312c-4546-9b04-e6b558ba752aprecedence_heuristic cell_id$e60fcc3e-312c-4546-9b04-e6b558ba752adownstream_cells_mapupstream_cells_mapTableOfContents$319d784b-c62d-4f28-a5b3-ebf89c892afcprecedence_heuristic cell_id$319d784b-c62d-4f28-a5b3-ebf89c892afcdownstream_cells_mapmake_collatz_graph$6693800b-e2bc-46e4-b5f8-004184ef472bupstream_cells_map@docdescend_tree!$3153ba89-f2d4-4e31-9e79-00ec5ecbb91c$b79405c3-42d1-4289-bbc3-67b6eae2b135tree_graphTupleIntArrayUnion#___this_pluto_module_nameNumberSimpleGraph$546a2cf6-f54a-4482-9da5-af9d966b22ebprecedence_heuristic cell_id$546a2cf6-f54a-4482-9da5-af9d966b22ebdownstream_cells_mapupstream_cells_map@md_strgetindex$b7161895-ba79-4b99-b2f1-eda7484708daprecedence_heuristic cell_id$b7161895-ba79-4b99-b2f1-eda7484708dadownstream_cells_mapviz_3_7_2hex_gridviz_3_1_7viz_5_5_5gallery_vizs$53520512-fc88-4dd2-ae6d-a8ed0d599e42viz_1_1_3viz_thumbnaillil_guyupstream_cells_mapRGB/CollatzVisualization$d6cc6642-018d-4a7f-b82a-dd50bff8e2fc$01cc5e4f-d94b-4211-b268-9ce0640cd23fprecedence_heuristic cell_id$01cc5e4f-d94b-4211-b268-9ce0640cd23fdownstream_cells_mapcolors_sliders$50a423ad-ca90-4015-9ef6-577f60e4efe7viz_colors_options$6d225dce-3362-4f5d-bba9-0b5312f6be5aupstream_cells_mapCoreformat_colorPicker$2d98aed3-9a51-4225-b914-a20b19f43908RGBN0f8Base.get@bindreinterpretBaseUInt8PlutoRunnerPlutoRunner.create_bondCore.applicableColorParameter$1255f4cc-7448-40f6-83ba-0cca1637d1cf$8a64e9e3-477e-4a7e-97f7-61cf5e428731precedence_heuristic cell_id$8a64e9e3-477e-4a7e-97f7-61cf5e428731downstream_cells_mapwindow_width$6d225dce-3362-4f5d-bba9-0b5312f6be5a$7dbfb4dc-c9d0-464d-83b2-18db90d76878window_height$6d225dce-3362-4f5d-bba9-0b5312f6be5a$7dbfb4dc-c9d0-464d-83b2-18db90d76878upstream_cells_mapVal@unpackwindow_size_parameters$0865f8a3-a959-481b-a9ae-adbca78a2749$b3c9453e-3198-4697-966f-ade21f2255ceprecedence_heuristic cell_id$b3c9453e-3198-4697-966f-ade21f2255cedownstream_cells_mapupstream_cells_map@md_strgetindex$af0c36ee-0534-4143-b59b-4ee041ef0f04precedence_heuristic cell_id$af0c36ee-0534-4143-b59b-4ee041ef0f04downstream_cells_mapupstream_cells_map@md_strdo_generalize_collatz$0e85d872-ef01-463e-b395-b0797c96317egetindex$f680e7ea-8e3a-41ac-ab92-a27c05103864precedence_heuristic cell_id$f680e7ea-8e3a-41ac-ab92-a27c05103864downstream_cells_mapviz_extra_sliders$50a423ad-ca90-4015-9ef6-577f60e4efe7viz_extra_options$6d225dce-3362-4f5d-bba9-0b5312f6be5aupstream_cells_mapCoreBasePlutoRunner.create_bondPlutoRunnerCheckBoxParameter$25d2291f-f422-41e4-aa61-9000e13d34adCore.applicable@bindBase.getformat_checkBoxParameter$a7885279-3f73-4c5d-aeef-061dea1ce930$a7885279-3f73-4c5d-aeef-061dea1ce930precedence_heuristic cell_id$a7885279-3f73-4c5d-aeef-061dea1ce930downstream_cells_mapformat_checkBoxParameter$f680e7ea-8e3a-41ac-ab92-a27c05103864upstream_cells_map@md_strBase.getindexHypertextLiteral.BypassPlutoUI$e4a76493-9aea-4379-9a56-6a9b9e8d6b54HypertextLiteral.contentString@htl$e4a76493-9aea-4379-9a56-6a9b9e8d6b54VectorPlutoUI.CheckBoxBasecombine$e4a76493-9aea-4379-9a56-6a9b9e8d6b54HypertextLiteral.ResultHypertextLiteralCheckBoxParameter$25d2291f-f422-41e4-aa61-9000e13d34ad$1255f4cc-7448-40f6-83ba-0cca1637d1cfprecedence_heuristic cell_id$1255f4cc-7448-40f6-83ba-0cca1637d1cfdownstream_cells_map@pack_ColorParameter@unpack_ColorParameterBase.showColorParameter$01cc5e4f-d94b-4211-b268-9ce0640cd23f$2d98aed3-9a51-4225-b914-a20b19f43908upstream_cells_mapdumpIORGB@with_kwTupleBase.show_defaultescIOContexterrorString=>AnySymbolnothinggetBasenewVararg*==$e4a76493-9aea-4379-9a56-6a9b9e8d6b54precedence_heuristiccell_id$e4a76493-9aea-4379-9a56-6a9b9e8d6b54downstream_cells_mapcombine$7dac4da8-0877-4d07-b4d2-2164faeccfde$4dd44fbd-f26a-4b72-a580-842209b44f27$5977a13d-93b8-4e51-8484-5b1882100c49$a7885279-3f73-4c5d-aeef-061dea1ce930$2d98aed3-9a51-4225-b914-a20b19f43908PlutoUI$10ab31ff-2d28-4ac3-a118-654f8366768e$aef6cb43-61c7-4436-ad66-7e7f0459610d$1b48b435-e959-477f-a8d2-3507da73fc28$0e85d872-ef01-463e-b395-b0797c96317e$7dac4da8-0877-4d07-b4d2-2164faeccfde$4dd44fbd-f26a-4b72-a580-842209b44f27$5977a13d-93b8-4e51-8484-5b1882100c49$a7885279-3f73-4c5d-aeef-061dea1ce930$2d98aed3-9a51-4225-b914-a20b19f43908Parameters@htl$10ab31ff-2d28-4ac3-a118-654f8366768e$43c4fd8d-bb44-43cd-91dd-d221629d1fd9$50a423ad-ca90-4015-9ef6-577f60e4efe7$aef6cb43-61c7-4436-ad66-7e7f0459610d$1b48b435-e959-477f-a8d2-3507da73fc28$0e85d872-ef01-463e-b395-b0797c96317e$53520512-fc88-4dd2-ae6d-a8ed0d599e42$03eb05fa-57bc-45d0-9943-79034ed10211$7dac4da8-0877-4d07-b4d2-2164faeccfde$4dd44fbd-f26a-4b72-a580-842209b44f27$5977a13d-93b8-4e51-8484-5b1882100c49$a7885279-3f73-4c5d-aeef-061dea1ce930$2d98aed3-9a51-4225-b914-a20b19f43908$7baab6e9-31bb-4da5-8ab9-938546cc863eupstream_cells_map@md_strgetindex$6693800b-e2bc-46e4-b5f8-004184ef472bprecedence_heuristic cell_id$6693800b-e2bc-46e4-b5f8-004184ef472bdownstream_cells_maprecord$3550fe19-261e-4069-9bf6-6417dcaac102g$3550fe19-261e-4069-9bf6-6417dcaac102graph_colors$3550fe19-261e-4069-9bf6-6417dcaac102upstream_cells_mapgraph_parameters$43c4fd8d-bb44-43cd-91dd-d221629d1fd9:RGBgeneralize_collatz$1c3f1bea-f1ba-4d64-90ad-584391c01da5collatz_parameters$f21f1e3e-a3ab-458e-a101-ce824731f0b6rescale∈nvinmake_collatz_graph$319d784b-c62d-4f28-a5b3-ebf89c892afc$cdfb638b-a04c-482c-9206-47f7dfd63766precedence_heuristic cell_id$cdfb638b-a04c-482c-9206-47f7dfd63766downstream_cells_mapupstream_cells_map@md_strgetindex$091d8f63-d02a-48fa-be0c-e9e027409279precedence_heuristic cell_id$091d8f63-d02a-48fa-be0c-e9e027409279downstream_cells_mapupstream_cells_map@md_strgetindex$7baab6e9-31bb-4da5-8ab9-938546cc863eprecedence_heuristic cell_id$7baab6e9-31bb-4da5-8ab9-938546cc863edownstream_cells_mapupstream_cells_mapHypertextLiteral.BypassHypertextLiteral.ResultHypertextLiteral@htl$e4a76493-9aea-4379-9a56-6a9b9e8d6b54$5655a706-2c53-4763-b8c5-e21aa3e72371precedence_heuristic cell_id$5655a706-2c53-4763-b8c5-e21aa3e72371downstream_cells_mapupstream_cells_map@md_strgetindex$3e9a6e74-a0ab-4c47-b493-4670fa828c45precedence_heuristic cell_id$3e9a6e74-a0ab-4c47-b493-4670fa828c45downstream_cells_mapupstream_cells_map@md_strgetindex$40dd9659-abb9-4484-b5f1-f332e2abe90eprecedence_heuristic cell_id$40dd9659-abb9-4484-b5f1-f332e2abe90edownstream_cells_mapreverse_hailstone_sequences$d6cc6642-018d-4a7f-b82a-dd50bff8e2fcupstream_cells_map@docInt64UnitRangereverseTupleIntUnion#___this_pluto_module_namehailstone_sequence$66fe673a-7679-4c55-bf59-146a8dd1241cprecedence_heuristic cell_id$66fe673a-7679-4c55-bf59-146a8dd1241cdownstream_cells_mappl##anim#292glhailstone_sequpstream_cells_mapPlots.gifcollatz_parameters$f21f1e3e-a3ab-458e-a101-ce824731f0b6Plots.framelengthrangePlots.Animationplot!animate_hailstone$10ab31ff-2d28-4ac3-a118-654f8366768e∈inhailstone_sequencescatter!:generalize_collatz$1c3f1bea-f1ba-4d64-90ad-584391c01da5Plots$13f52ec2-16b9-41a5-9560-177ca827a72exlabel!with_terminalhailstone_params$e57da7e5-32bb-48a2-af27-5ac671cabdaeplottitle!+@gifylabel!$f47eb656-67ec-4760-8906-713fa480cb47precedence_heuristic cell_id$f47eb656-67ec-4760-8906-713fa480cb47downstream_cells_mapupstream_cells_map@md_strgetindex$31a7994d-13e0-440a-8279-5f19d7d0933fprecedence_heuristic cell_id$31a7994d-13e0-440a-8279-5f19d7d0933fdownstream_cells_map@pack_NumberFieldParameter@unpack_NumberFieldParameterBase.showNumberFieldParameter$0865f8a3-a959-481b-a9ae-adbca78a2749$31a7994d-13e0-440a-8279-5f19d7d0933f$5977a13d-93b8-4e51-8484-5b1882100c49upstream_cells_mapIO@with_kwTupleBase.show_defaultescislessStringNumberFieldParameter$31a7994d-13e0-440a-8279-5f19d7d0933fnothingAnySymbolgetBasenew*$53520512-fc88-4dd2-ae6d-a8ed0d599e42precedence_heuristic cell_id$53520512-fc88-4dd2-ae6d-a8ed0d599e42downstream_cells_mapupstream_cells_mapbuffer_img_data$f718bbfd-2e86-45c5-96b3-ef3d810966a9HypertextLiteral.BypassHypertextLiteral.ResultHypertextLiteralmakeCollatzGallery$03eb05fa-57bc-45d0-9943-79034ed10211HypertextLiteral.contentHypertextLiteral.ScriptTag@htl$e4a76493-9aea-4379-9a56-6a9b9e8d6b54gallery_vizs$b7161895-ba79-4b99-b2f1-eda7484708da$4c991173-d9ff-4ba9-b217-8f9aafbbd631precedence_heuristic cell_id$4c991173-d9ff-4ba9-b217-8f9aafbbd631downstream_cells_mapshortcut_collatz_cache$23be8efa-b907-453f-9245-8bc46a37ad26upstream_cells_mapDictIntVector$03eb05fa-57bc-45d0-9943-79034ed10211precedence_heuristic cell_id$03eb05fa-57bc-45d0-9943-79034ed10211downstream_cells_mapmakeCollatzGallery$53520512-fc88-4dd2-ae6d-a8ed0d599e42upstream_cells_mapget_num_trajects$fb2dd0e1-5198-4c0a-b62b-50649ac21f32get_y_start$fb2dd0e1-5198-4c0a-b62b-50649ac21f32Tupleget_init_angle$fb2dd0e1-5198-4c0a-b62b-50649ac21f32get_turn_scale$fb2dd0e1-5198-4c0a-b62b-50649ac21f32get_random_shade$fb2dd0e1-5198-4c0a-b62b-50649ac21f32@htl$e4a76493-9aea-4379-9a56-6a9b9e8d6b54Vector HypertextLiteral.attribute_valueget_line_length$fb2dd0e1-5198-4c0a-b62b-50649ac21f32HypertextLiteral.Result@docget_stroke_width$fb2dd0e1-5198-4c0a-b62b-50649ac21f32get_window_width$fb2dd0e1-5198-4c0a-b62b-50649ac21f32HypertextLiteral.Bypassget_notes$fb2dd0e1-5198-4c0a-b62b-50649ac21f32HypertextLiteral.content#___this_pluto_module_nameget_x_start$fb2dd0e1-5198-4c0a-b62b-50649ac21f32get_vary_shade$fb2dd0e1-5198-4c0a-b62b-50649ac21f32push!get_stroke_color$fb2dd0e1-5198-4c0a-b62b-50649ac21f32get_window_height$fb2dd0e1-5198-4c0a-b62b-50649ac21f32IntHypertextLiteral-UnionCollatzVisualization$d6cc6642-018d-4a7f-b82a-dd50bff8e2fcget_background_color$fb2dd0e1-5198-4c0a-b62b-50649ac21f32enumerate$50a423ad-ca90-4015-9ef6-577f60e4efe7precedence_heuristic cell_id$50a423ad-ca90-4015-9ef6-577f60e4efe7downstream_cells_mapupstream_cells_mapviz_extra_sliders$f680e7ea-8e3a-41ac-ab92-a27c05103864viz_sliders$5ba5f885-1de1-4058-91bf-35e1b05d1941colors_sliders$01cc5e4f-d94b-4211-b268-9ce0640cd23fHypertextLiteralHypertextLiteral.Resultviz_specs_sliders$7dbfb4dc-c9d0-464d-83b2-18db90d76878HypertextLiteral.BypassHypertextLiteral.content@htl$e4a76493-9aea-4379-9a56-6a9b9e8d6b54cell_execution_orderX$c5673bfa-d2b0-4893-ad88-42a5b81f27b4$e4a76493-9aea-4379-9a56-6a9b9e8d6b54$13f52ec2-16b9-41a5-9560-177ca827a72e$e60fcc3e-312c-4546-9b04-e6b558ba752a$5328c6f3-2ae7-4449-a2a2-b6803cec0dcc$822a3646-be9d-4b1c-a189-550bd8b56ab7$0bc0ea95-585d-43be-b7ac-c33a2a7417b4$bdd54208-1f66-45da-9e67-9479cc460863$81db5594-75c0-4bfb-8908-ef8084559123$b3c9453e-3198-4697-966f-ade21f2255ce$10ab31ff-2d28-4ac3-a118-654f8366768e$75b9294e-43a4-48c4-b493-5d40027f3cd6$12d218ee-9a43-4647-a96b-c9252c665fa0$6f68b20d-67e5-4872-a23b-1840bbbb06ec$6a45247d-25db-445f-a687-191c0952c6c4$d0672735-8007-4a69-9fa5-0f40ac0685ea$aef6cb43-61c7-4436-ad66-7e7f0459610d$b56a1328-194c-4e1c-a033-9ca6e0ab3eeb$6e359db6-581f-4a5a-a0a7-6924faf19653$dc1dba7c-8c0d-4609-882a-e5703c467fef$b9277abb-7a14-4479-8bcb-6a50df27182b$0e85d872-ef01-463e-b395-b0797c96317e$1c3f1bea-f1ba-4d64-90ad-584391c01da5$5f074850-b967-4de5-8ca3-b85a74052499$af0c36ee-0534-4143-b59b-4ee041ef0f04$16d57341-6c55-4440-bdeb-492b4d0c4427$5655a706-2c53-4763-b8c5-e21aa3e72371$b7b80bd8-7a16-4483-9b8f-b6a8da531b0a$3e9a6e74-a0ab-4c47-b493-4670fa828c45$546a2cf6-f54a-4482-9da5-af9d966b22eb$cdfb638b-a04c-482c-9206-47f7dfd63766$3e6323cb-4b09-4fe9-a223-8c66cb0d3efc$0fdafbdc-a6aa-42a6-a899-41b351b5e7e8$091d8f63-d02a-48fa-be0c-e9e027409279$8c854d1c-2f89-43f0-a810-ce174cf94af8$9803f163-0027-4577-af8f-c66de195d182$1e85c1af-3318-4f20-a358-25aa0999dc8a$40dd9659-abb9-4484-b5f1-f332e2abe90e$f02affaa-534b-4c72-81ae-c42ca3b455fd$4c991173-d9ff-4ba9-b217-8f9aafbbd631$240b4cc1-1bae-429b-863b-792897cd555b$23be8efa-b907-453f-9245-8bc46a37ad26$a1a6130d-771a-43d7-ae94-049e3c9b81b3$3153ba89-f2d4-4e31-9e79-00ec5ecbb91c$b79405c3-42d1-4289-bbc3-67b6eae2b135$319d784b-c62d-4f28-a5b3-ebf89c892afc$cf545d05-7846-4881-a532-33cb2c1972a4$5683080b-7d4b-4e34-aa75-b3c68dc60314$278572e6-5a74-4dad-b39b-68cc85e4339c$d6cc6642-018d-4a7f-b82a-dd50bff8e2fc$b7161895-ba79-4b99-b2f1-eda7484708da$f718bbfd-2e86-45c5-96b3-ef3d810966a9$7335059c-d9b8-40a5-b2c0-6bcca4bdfe28$b4a31304-34a3-4ecc-8c6e-e67714bc5d52$ae8c02c0-2944-42dc-8a19-a45fbdc16134$f47eb656-67ec-4760-8906-713fa480cb47$43479204-cd12-40b4-a65f-16bf54aaddfe$31a7994d-13e0-440a-8279-5f19d7d0933f$25d2291f-f422-41e4-aa61-9000e13d34ad$1255f4cc-7448-40f6-83ba-0cca1637d1cf$7dac4da8-0877-4d07-b4d2-2164faeccfde$4dd44fbd-f26a-4b72-a580-842209b44f27$e57da7e5-32bb-48a2-af27-5ac671cabdae$43c4fd8d-bb44-43cd-91dd-d221629d1fd9$0fd7242c-46a1-4929-9c53-3c45768893b4$5ba5f885-1de1-4058-91bf-35e1b05d1941$f21f1e3e-a3ab-458e-a101-ce824731f0b6$66fe673a-7679-4c55-bf59-146a8dd1241c$6693800b-e2bc-46e4-b5f8-004184ef472b$3550fe19-261e-4069-9bf6-6417dcaac102$45ca6e2a-6a58-475e-9c02-4925e71625bd$5977a13d-93b8-4e51-8484-5b1882100c49$0865f8a3-a959-481b-a9ae-adbca78a2749$8a64e9e3-477e-4a7e-97f7-61cf5e428731$7dbfb4dc-c9d0-464d-83b2-18db90d76878$a7885279-3f73-4c5d-aeef-061dea1ce930$f680e7ea-8e3a-41ac-ab92-a27c05103864$2d98aed3-9a51-4225-b914-a20b19f43908$01cc5e4f-d94b-4211-b268-9ce0640cd23f$50a423ad-ca90-4015-9ef6-577f60e4efe7$6d225dce-3362-4f5d-bba9-0b5312f6be5a$1b48b435-e959-477f-a8d2-3507da73fc28$d9aaaadc-7d94-4e85-a1cb-c137e869ad2f$fb2dd0e1-5198-4c0a-b62b-50649ac21f32$03eb05fa-57bc-45d0-9943-79034ed10211$53520512-fc88-4dd2-ae6d-a8ed0d599e42$90dc6dd4-c4f3-4e4d-8e91-0fecafd258e1$7baab6e9-31bb-4da5-8ab9-938546cc863elast_hot_reload_timeshortpathCollatzConjecture.jlprocess_statusreadypathA/home/runner/work/featured/featured/src/math/CollatzConjecture.jlpluto_versionv1.0.0last_save_timeAڅd*Icell_orderX$e60fcc3e-312c-4546-9b04-e6b558ba752a$5328c6f3-2ae7-4449-a2a2-b6803cec0dcc$822a3646-be9d-4b1c-a189-550bd8b56ab7$0bc0ea95-585d-43be-b7ac-c33a2a7417b4$bdd54208-1f66-45da-9e67-9479cc460863$81db5594-75c0-4bfb-8908-ef8084559123$b3c9453e-3198-4697-966f-ade21f2255ce$e57da7e5-32bb-48a2-af27-5ac671cabdae$66fe673a-7679-4c55-bf59-146a8dd1241c$10ab31ff-2d28-4ac3-a118-654f8366768e$75b9294e-43a4-48c4-b493-5d40027f3cd6$12d218ee-9a43-4647-a96b-c9252c665fa0$3550fe19-261e-4069-9bf6-6417dcaac102$43c4fd8d-bb44-43cd-91dd-d221629d1fd9$6693800b-e2bc-46e4-b5f8-004184ef472b$6f68b20d-67e5-4872-a23b-1840bbbb06ec$6a45247d-25db-445f-a687-191c0952c6c4$0fd7242c-46a1-4929-9c53-3c45768893b4$45ca6e2a-6a58-475e-9c02-4925e71625bd$5f074850-b967-4de5-8ca3-b85a74052499$d0672735-8007-4a69-9fa5-0f40ac0685ea$50a423ad-ca90-4015-9ef6-577f60e4efe7$6d225dce-3362-4f5d-bba9-0b5312f6be5a$aef6cb43-61c7-4436-ad66-7e7f0459610d$1b48b435-e959-477f-a8d2-3507da73fc28$0865f8a3-a959-481b-a9ae-adbca78a2749$8a64e9e3-477e-4a7e-97f7-61cf5e428731$01cc5e4f-d94b-4211-b268-9ce0640cd23f$5ba5f885-1de1-4058-91bf-35e1b05d1941$7dbfb4dc-c9d0-464d-83b2-18db90d76878$f680e7ea-8e3a-41ac-ab92-a27c05103864$b56a1328-194c-4e1c-a033-9ca6e0ab3eeb$6e359db6-581f-4a5a-a0a7-6924faf19653$dc1dba7c-8c0d-4609-882a-e5703c467fef$b9277abb-7a14-4479-8bcb-6a50df27182b$0e85d872-ef01-463e-b395-b0797c96317e$1c3f1bea-f1ba-4d64-90ad-584391c01da5$f21f1e3e-a3ab-458e-a101-ce824731f0b6$af0c36ee-0534-4143-b59b-4ee041ef0f04$16d57341-6c55-4440-bdeb-492b4d0c4427$5655a706-2c53-4763-b8c5-e21aa3e72371$53520512-fc88-4dd2-ae6d-a8ed0d599e42$b7161895-ba79-4b99-b2f1-eda7484708da$b7b80bd8-7a16-4483-9b8f-b6a8da531b0a$3e9a6e74-a0ab-4c47-b493-4670fa828c45$546a2cf6-f54a-4482-9da5-af9d966b22eb$cdfb638b-a04c-482c-9206-47f7dfd63766$3e6323cb-4b09-4fe9-a223-8c66cb0d3efc$0fdafbdc-a6aa-42a6-a899-41b351b5e7e8$c5673bfa-d2b0-4893-ad88-42a5b81f27b4$e4a76493-9aea-4379-9a56-6a9b9e8d6b54$13f52ec2-16b9-41a5-9560-177ca827a72e$091d8f63-d02a-48fa-be0c-e9e027409279$d6cc6642-018d-4a7f-b82a-dd50bff8e2fc$8c854d1c-2f89-43f0-a810-ce174cf94af8$9803f163-0027-4577-af8f-c66de195d182$1e85c1af-3318-4f20-a358-25aa0999dc8a$40dd9659-abb9-4484-b5f1-f332e2abe90e$f718bbfd-2e86-45c5-96b3-ef3d810966a9$7335059c-d9b8-40a5-b2c0-6bcca4bdfe28$b4a31304-34a3-4ecc-8c6e-e67714bc5d52$f02affaa-534b-4c72-81ae-c42ca3b455fd$4c991173-d9ff-4ba9-b217-8f9aafbbd631$240b4cc1-1bae-429b-863b-792897cd555b$23be8efa-b907-453f-9245-8bc46a37ad26$a1a6130d-771a-43d7-ae94-049e3c9b81b3$319d784b-c62d-4f28-a5b3-ebf89c892afc$3153ba89-f2d4-4e31-9e79-00ec5ecbb91c$b79405c3-42d1-4289-bbc3-67b6eae2b135$cf545d05-7846-4881-a532-33cb2c1972a4$278572e6-5a74-4dad-b39b-68cc85e4339c$5683080b-7d4b-4e34-aa75-b3c68dc60314$ae8c02c0-2944-42dc-8a19-a45fbdc16134$03eb05fa-57bc-45d0-9943-79034ed10211$f47eb656-67ec-4760-8906-713fa480cb47$43479204-cd12-40b4-a65f-16bf54aaddfe$31a7994d-13e0-440a-8279-5f19d7d0933f$25d2291f-f422-41e4-aa61-9000e13d34ad$1255f4cc-7448-40f6-83ba-0cca1637d1cf$7dac4da8-0877-4d07-b4d2-2164faeccfde$4dd44fbd-f26a-4b72-a580-842209b44f27$5977a13d-93b8-4e51-8484-5b1882100c49$a7885279-3f73-4c5d-aeef-061dea1ce930$2d98aed3-9a51-4225-b914-a20b19f43908$d9aaaadc-7d94-4e85-a1cb-c137e869ad2f$fb2dd0e1-5198-4c0a-b62b-50649ac21f32$90dc6dd4-c4f3-4e4d-8e91-0fecafd258e1$7baab6e9-31bb-4da5-8ab9-938546cc863ejulia_versionv1.12.6published_objectsnbpkginstall_time_nsl7instantiatedòinstalled_versionsImageIO0.6.9PlutoUI0.7.81Plots1.41.6__internal_julia_version1.12.6Colors0.13.1Karnak1.2.0Collatz1.0.0FixedPointNumbers0.8.5Graphs1.14.0!__internal_julia_manifest_versionNetworkLayout0.4.10HypertextLiteral1.0.0Parameters0.12.3Luxor4.5.0ImageShow0.3.8terminal_outputsPlutoUI0 Waiting for other notebooks to finish Pkg operations... === ┌ Warning: The active manifest file at `/home/runner/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` has an old format that is being maintained. │ To update to the new format, which is supported by Julia versions ≥ 1.6.2, run `import Pkg; Pkg.upgrade_manifest()` which will upgrade the format without re-resolving. │ To then record the julia version re-resolve with `Pkg.resolve()` and if there are resolve conflicts consider `Pkg.update()`. └ @ Pkg.Types /opt/hostedtoolcache/julia/1.12.6/x64/share/julia/stdlib/v1.12/Pkg/src/manifest.jl:383 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` Instantiating... === ┌ Warning: The active manifest file is an older format with no julia version entry. Dependencies may have been resolved with a different julia version. └ @ ~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml:0 Precompiling... ===Karnak0 Waiting for other notebooks to finish Pkg operations... === ┌ Warning: The active manifest file at `/home/runner/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` has an old format that is being maintained. │ To update to the new format, which is supported by Julia versions ≥ 1.6.2, run `import Pkg; Pkg.upgrade_manifest()` which will upgrade the format without re-resolving. │ To then record the julia version re-resolve with `Pkg.resolve()` and if there are resolve conflicts consider `Pkg.update()`. └ @ Pkg.Types /opt/hostedtoolcache/julia/1.12.6/x64/share/julia/stdlib/v1.12/Pkg/src/manifest.jl:383 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` Instantiating... === ┌ Warning: The active manifest file is an older format with no julia version entry. Dependencies may have been resolved with a different julia version. └ @ ~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml:0 Precompiling... ===Collatz0 Waiting for other notebooks to finish Pkg operations... === ┌ Warning: The active manifest file at `/home/runner/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` has an old format that is being maintained. │ To update to the new format, which is supported by Julia versions ≥ 1.6.2, run `import Pkg; Pkg.upgrade_manifest()` which will upgrade the format without re-resolving. │ To then record the julia version re-resolve with `Pkg.resolve()` and if there are resolve conflicts consider `Pkg.update()`. └ @ Pkg.Types /opt/hostedtoolcache/julia/1.12.6/x64/share/julia/stdlib/v1.12/Pkg/src/manifest.jl:383 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` Instantiating... === ┌ Warning: The active manifest file is an older format with no julia version entry. Dependencies may have been resolved with a different julia version. └ @ ~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml:0 Precompiling... ===FixedPointNumbers0 Waiting for other notebooks to finish Pkg operations... === ┌ Warning: The active manifest file at `/home/runner/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` has an old format that is being maintained. │ To update to the new format, which is supported by Julia versions ≥ 1.6.2, run `import Pkg; Pkg.upgrade_manifest()` which will upgrade the format without re-resolving. │ To then record the julia version re-resolve with `Pkg.resolve()` and if there are resolve conflicts consider `Pkg.update()`. └ @ Pkg.Types /opt/hostedtoolcache/julia/1.12.6/x64/share/julia/stdlib/v1.12/Pkg/src/manifest.jl:383 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` Instantiating... === ┌ Warning: The active manifest file is an older format with no julia version entry. Dependencies may have been resolved with a different julia version. └ @ ~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml:0 Precompiling... ===Graphs0 Waiting for other notebooks to finish Pkg operations... === ┌ Warning: The active manifest file at `/home/runner/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` has an old format that is being maintained. │ To update to the new format, which is supported by Julia versions ≥ 1.6.2, run `import Pkg; Pkg.upgrade_manifest()` which will upgrade the format without re-resolving. │ To then record the julia version re-resolve with `Pkg.resolve()` and if there are resolve conflicts consider `Pkg.update()`. └ @ Pkg.Types /opt/hostedtoolcache/julia/1.12.6/x64/share/julia/stdlib/v1.12/Pkg/src/manifest.jl:383 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` Instantiating... === ┌ Warning: The active manifest file is an older format with no julia version entry. Dependencies may have been resolved with a different julia version. └ @ ~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml:0 Precompiling... ===NetworkLayout0 Waiting for other notebooks to finish Pkg operations... === ┌ Warning: The active manifest file at `/home/runner/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` has an old format that is being maintained. │ To update to the new format, which is supported by Julia versions ≥ 1.6.2, run `import Pkg; Pkg.upgrade_manifest()` which will upgrade the format without re-resolving. │ To then record the julia version re-resolve with `Pkg.resolve()` and if there are resolve conflicts consider `Pkg.update()`. └ @ Pkg.Types /opt/hostedtoolcache/julia/1.12.6/x64/share/julia/stdlib/v1.12/Pkg/src/manifest.jl:383 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` Instantiating... === ┌ Warning: The active manifest file is an older format with no julia version entry. Dependencies may have been resolved with a different julia version. └ @ ~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml:0 Precompiling... ===Luxor0 Waiting for other notebooks to finish Pkg operations... === ┌ Warning: The active manifest file at `/home/runner/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` has an old format that is being maintained. │ To update to the new format, which is supported by Julia versions ≥ 1.6.2, run `import Pkg; Pkg.upgrade_manifest()` which will upgrade the format without re-resolving. │ To then record the julia version re-resolve with `Pkg.resolve()` and if there are resolve conflicts consider `Pkg.update()`. └ @ Pkg.Types /opt/hostedtoolcache/julia/1.12.6/x64/share/julia/stdlib/v1.12/Pkg/src/manifest.jl:383 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` Instantiating... === ┌ Warning: The active manifest file is an older format with no julia version entry. Dependencies may have been resolved with a different julia version. └ @ ~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml:0 Precompiling... ===ImageShow0 Waiting for other notebooks to finish Pkg operations... === ┌ Warning: The active manifest file at `/home/runner/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` has an old format that is being maintained. │ To update to the new format, which is supported by Julia versions ≥ 1.6.2, run `import Pkg; Pkg.upgrade_manifest()` which will upgrade the format without re-resolving. │ To then record the julia version re-resolve with `Pkg.resolve()` and if there are resolve conflicts consider `Pkg.update()`. └ @ Pkg.Types /opt/hostedtoolcache/julia/1.12.6/x64/share/julia/stdlib/v1.12/Pkg/src/manifest.jl:383 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` Instantiating... === ┌ Warning: The active manifest file is an older format with no julia version entry. Dependencies may have been resolved with a different julia version. └ @ ~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml:0 Precompiling... ===ImageIO0 Waiting for other notebooks to finish Pkg operations... === ┌ Warning: The active manifest file at `/home/runner/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` has an old format that is being maintained. │ To update to the new format, which is supported by Julia versions ≥ 1.6.2, run `import Pkg; Pkg.upgrade_manifest()` which will upgrade the format without re-resolving. │ To then record the julia version re-resolve with `Pkg.resolve()` and if there are resolve conflicts consider `Pkg.update()`. └ @ Pkg.Types /opt/hostedtoolcache/julia/1.12.6/x64/share/julia/stdlib/v1.12/Pkg/src/manifest.jl:383 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` Instantiating... === ┌ Warning: The active manifest file is an older format with no julia version entry. Dependencies may have been resolved with a different julia version. └ @ ~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml:0 Precompiling... ===Plots0 Waiting for other notebooks to finish Pkg operations... === ┌ Warning: The active manifest file at `/home/runner/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` has an old format that is being maintained. │ To update to the new format, which is supported by Julia versions ≥ 1.6.2, run `import Pkg; Pkg.upgrade_manifest()` which will upgrade the format without re-resolving. │ To then record the julia version re-resolve with `Pkg.resolve()` and if there are resolve conflicts consider `Pkg.update()`. └ @ Pkg.Types /opt/hostedtoolcache/julia/1.12.6/x64/share/julia/stdlib/v1.12/Pkg/src/manifest.jl:383 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` Instantiating... === ┌ Warning: The active manifest file is an older format with no julia version entry. Dependencies may have been resolved with a different julia version. └ @ ~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml:0 Precompiling... ===Colors0 Waiting for other notebooks to finish Pkg operations... === ┌ Warning: The active manifest file at `/home/runner/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` has an old format that is being maintained. │ To update to the new format, which is supported by Julia versions ≥ 1.6.2, run `import Pkg; Pkg.upgrade_manifest()` which will upgrade the format without re-resolving. │ To then record the julia version re-resolve with `Pkg.resolve()` and if there are resolve conflicts consider `Pkg.update()`. └ @ Pkg.Types /opt/hostedtoolcache/julia/1.12.6/x64/share/julia/stdlib/v1.12/Pkg/src/manifest.jl:383 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` Instantiating... === ┌ Warning: The active manifest file is an older format with no julia version entry. Dependencies may have been resolved with a different julia version. └ @ ~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml:0 Precompiling... ===nbpkg_sync0 Waiting for other notebooks to finish Pkg operations... === ┌ Warning: The active manifest file at `/home/runner/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` has an old format that is being maintained. │ To update to the new format, which is supported by Julia versions ≥ 1.6.2, run `import Pkg; Pkg.upgrade_manifest()` which will upgrade the format without re-resolving. │ To then record the julia version re-resolve with `Pkg.resolve()` and if there are resolve conflicts consider `Pkg.update()`. └ @ Pkg.Types /opt/hostedtoolcache/julia/1.12.6/x64/share/julia/stdlib/v1.12/Pkg/src/manifest.jl:383 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` Instantiating... === ┌ Warning: The active manifest file is an older format with no julia version entry. Dependencies may have been resolved with a different julia version. └ @ ~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml:0 Precompiling... ===HypertextLiteral0 Waiting for other notebooks to finish Pkg operations... === ┌ Warning: The active manifest file at `/home/runner/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` has an old format that is being maintained. │ To update to the new format, which is supported by Julia versions ≥ 1.6.2, run `import Pkg; Pkg.upgrade_manifest()` which will upgrade the format without re-resolving. │ To then record the julia version re-resolve with `Pkg.resolve()` and if there are resolve conflicts consider `Pkg.update()`. └ @ Pkg.Types /opt/hostedtoolcache/julia/1.12.6/x64/share/julia/stdlib/v1.12/Pkg/src/manifest.jl:383 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` Instantiating... === ┌ Warning: The active manifest file is an older format with no julia version entry. Dependencies may have been resolved with a different julia version. └ @ ~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml:0 Precompiling... ===Parameters0 Waiting for other notebooks to finish Pkg operations... === ┌ Warning: The active manifest file at `/home/runner/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` has an old format that is being maintained. │ To update to the new format, which is supported by Julia versions ≥ 1.6.2, run `import Pkg; Pkg.upgrade_manifest()` which will upgrade the format without re-resolving. │ To then record the julia version re-resolve with `Pkg.resolve()` and if there are resolve conflicts consider `Pkg.update()`. └ @ Pkg.Types /opt/hostedtoolcache/julia/1.12.6/x64/share/julia/stdlib/v1.12/Pkg/src/manifest.jl:383 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml` Instantiating... === ┌ Warning: The active manifest file is an older format with no julia version entry. Dependencies may have been resolved with a different julia version. └ @ ~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_ejluyfbqui/Manifest.toml:0 Precompiling... ===enabled÷restart_recommended_msgrestart_required_msgbusy_packageswaiting_for_permission,waiting_for_permission_but_probably_disabled«cell_inputsX$e57da7e5-32bb-48a2-af27-5ac671cabdaecell_id$e57da7e5-32bb-48a2-af27-5ac671cabdaecodeٵ@bind hailstone_params format_sliderParameter(title="Hailstone Sequence Parameters:",[ SliderParameter(lb=1,ub=1000,default=15,step=1,alias=:start_value,label="Starting Value")] )metadatashow_logsèdisabled®skip_as_script«code_folded$6d225dce-3362-4f5d-bba9-0b5312f6be5acell_id$6d225dce-3362-4f5d-bba9-0b5312f6be5acode0begin @unpack ( num_traject, turn_scale, line_length ) = viz_parameters @unpack ( init_angle, x_start, y_start, stroke_width) = viz_specs_parameters @unpack ( stroke_color, background_color ) = viz_colors_options @unpack ( random_shade, vary_shade, edmund_style, chris_style ) = viz_extra_options interactive_viz = CollatzVisualization( viz_parameters = ( num_traject = num_traject, line_length = line_length, turn_scale = turn_scale, window_width = window_width, window_height = window_height, x_start = x_start, y_start = y_start, init_angle = init_angle, stroke_width = stroke_width, stroke_color = stroke_color, background_color = background_color, random_shade = random_shade, vary_shade = vary_shade ), collatz_parameters = (P=collatz_parameters.P,a = collatz_parameters.a, b= collatz_parameters.b), shortcut = edmund_style, ultra_shortcut = chris_style ) # trajectories = reverse_hailstone_sequences(range(5,num_traject); collatz_parameters...) # viz = @draw begin # background(background_color) # draw_hailstone_sequences( # trajectories; line_length, turn_scale, # window_width, window_height, init_angle, x_start, y_start, # stroke_width, stroke_color, random_shade, vary_shade # ) # end window_width window_height endmetadatashow_logsèdisabled®skip_as_script«code_folded$0fdafbdc-a6aa-42a6-a899-41b351b5e7e8cell_id$0fdafbdc-a6aa-42a6-a899-41b351b5e7e8codemd"## Packages" metadatashow_logsèdisabled®skip_as_script«code_folded$3e6323cb-4b09-4fe9-a223-8c66cb0d3efccell_id$3e6323cb-4b09-4fe9-a223-8c66cb0d3efccodeImd""" Here a list of extra ressources in case you want to learn more. They inspired me a lot through this notebook so hope you find them usefull! - [Wikipedia page](https://en.wikipedia.org/wiki/Collatz_conjecture) - [The Numberphile video](https://www.youtube.com/watch?v=5mFpVDpKX70) ( [and the extras](https://www.youtube.com/watch?v=O2_h3z1YgEU) ) - [The Coding Train](https://www.youtube.com/watch?v=EYLWxwo1Ed8) - [This amazing post from Luc Blassel] (https://lucblassel.com/posts/visualizing-the-collatz-conjecture/) - [Edmund Harris's website](https://maxwelldemon.com/) """metadatashow_logsèdisabled®skip_as_script«code_folded$16d57341-6c55-4440-bdeb-492b4d0c4427cell_id$16d57341-6c55-4440-bdeb-492b4d0c4427codemd"# Gallery"metadatashow_logsèdisabled®skip_as_script«code_folded$d6cc6642-018d-4a7f-b82a-dd50bff8e2fccell_id$d6cc6642-018d-4a7f-b82a-dd50bff8e2fccode""" A struct to bundle the parameters and the generated image together. `viz_parameters::VisualizationParameters` `collatz_parameters::NamedTuple{(:P, :a, :b)}` = (P = 2, a = 3, b = 1) `imgdata::Matrix{RGBA{N0f8}}` = [] `shortcut::Bool` = false `notes::String` = "" """ @with_kw struct CollatzVisualization viz_parameters::VisualizationParameters collatz_parameters::NamedTuple{(:P, :a, :b)} = (P=2,a=3,b=1) imgdata::Matrix{RGBA{N0f8}} = [] shortcut::Bool = false ultra_shortcut::Bool = false notes::String = "" function CollatzVisualization(viz_parameters, collatz_parameters,imgdata, shortcut,ultra_shortcut, notes) if((shortcut || ultra_shortcut) && (collatz_parameters.P != 2 || collatz_parameters.a != 3 || collatz_parameters.b == 1)) @info "Custom style is applied, running with default collatz parameters.." collatz_parameters = (P = 2, a=3, b=1) end # convert to struct not supplied if(!isa(viz_parameters, VisualizationParameters)) viz_parameters = VisualizationParameters(edmund_style=shortcut,chris_style=ultra_shortcut;viz_parameters...) end # Caluclate reversed hailstone_sequences if(ultra_shortcut) hailstone_sequences = [ reverse(ultra_shortcut_collatz(starting_number)) for starting_number in 1:viz_parameters.num_traject ] elseif(shortcut) hailstone_sequences = [ reverse(shortcut_collatz(starting_number)) for starting_number in 1:viz_parameters.num_traject ] else hailstone_sequences = reverse_hailstone_sequences(1:viz_parameters.num_traject; collatz_parameters...) end # Draw the sequence and store in an image matrix imgdata = @imagematrix begin background(viz_parameters.background_color) draw_hailstone_sequences( hailstone_sequences; params = viz_parameters ) end viz_parameters.window_width viz_parameters.window_height # Convert matrix to img imgdata = convert.(Colors.RGBA, imgdata) return new(viz_parameters, collatz_parameters ,imgdata, shortcut,ultra_shortcut, notes) end endmetadatashow_logsèdisabled®skip_as_script«code_folded$5977a13d-93b8-4e51-8484-5b1882100c49cell_id$5977a13d-93b8-4e51-8484-5b1882100c49codefunction format_numberFieldParameter( params::Vector{NumberFieldParameter{T}};title::String,) where T return combine() do Child mds = [ @htl("""

$(param.label)

$(Child(param.alias, PlutoUI.NumberField(param.lb:param.step:param.ub, default = param.default)) )
""") for param in params ] md""" #### $title $(mds) """ end endmetadatashow_logsèdisabled®skip_as_script«code_folded$0bc0ea95-585d-43be-b7ac-c33a2a7417b4cell_id$0bc0ea95-585d-43be-b7ac-c33a2a7417b4codemd""" The [Collatz Conjecture](https://en.wikipedia.org/wiki/Collatz_conjecture), also known as the 3x+1 problem, is a fascinating mathematical puzzle that has been named after the German mathematician [Lothar Collatz](https://en.wikipedia.org/wiki/Lothar_Collatz). This conjecture arises from an iterative process where you start with any positive integer and alternate between two simple rules: - if the number is *even*, you divide it by 2, - and if it's *odd*, you multiply it by 3 and add 1. For example, take the number 3. It's odd, so we multiply by 3 and add 1. We get 10. Now that's even, so we can divide it by 2, to get 5. Back to odd, so let's multiply that by 3 and add 1. We are now at 16, which is *very* even. So much so that we can keep on dividing by 2 until we reach 1. ``3 \rightarrow 10 \rightarrow 5 \rightarrow 16 \rightarrow 8 \rightarrow 4 \rightarrow 2 \rightarrow 1`` What happens when we reach 1? Well, it's odd so we multiply by 3 and add 1. And we are back at 4, which leads back to one. We have reached a cycle. `` 4 \rightarrow 2 \rightarrow 1 \rightarrow 4 \rightarrow 2 \rightarrow 1 \ldots`` ##### The question is, can you predict what the number will be after a certain number of iterations? ##### The conjecture is that no matter what starting number you choose, **regardless** of its size, you will **always** reach the number 1. However, despite being relatively simple to understand and easy to test for small numbers, it has so far proven difficult to prove definitively for all cases. This conjecture is an unsolved problem in mathematics that continues to intrigue both mathematicians and enthusiasts alike. """metadatashow_logsèdisabled®skip_as_script«code_folded$a1a6130d-771a-43d7-ae94-049e3c9b81b3cell_id$a1a6130d-771a-43d7-ae94-049e3c9b81b3code""" ultra_shortcut_collatz(n::Int) Calculate the collatz sequence of a number using the absolute shortcut formulation: g(n) = (3n + 1) / 2^k if odd where k is the highest power that divides 3n+1 and g(n) = n / 2 if even """ function ultra_shortcut_collatz(n::Int) if n == 1 return [1] elseif haskey(ultra_shortcut_collatz_cache, n) return ultra_shortcut_collatz_cache[n] elseif n % 2 == 0 while n % 2 == 0 n = n ÷ 2 end if n == 1 return [1] end sequence = [n, ultra_shortcut_collatz(3n + 1)...] ultra_shortcut_collatz_cache[n] = sequence return sequence else sequence = [n, ultra_shortcut_collatz(Int((3n + 1)/2))...] ultra_shortcut_collatz_cache[n] = sequence return sequence end end metadatashow_logsèdisabled®skip_as_script«code_folded$81db5594-75c0-4bfb-8908-ef8084559123cell_id$81db5594-75c0-4bfb-8908-ef8084559123codemd"## The Hailstone Sequence"metadatashow_logsèdisabled®skip_as_script«code_folded$c5673bfa-d2b0-4893-ad88-42a5b81f27b4cell_id$c5673bfa-d2b0-4893-ad88-42a5b81f27b4codebegin using Collatz using Graphs using FixedPointNumbers md""" !!! info "Numerical Packages" [Collatz](https://juliapackages.com/p/collatz): This package provide the methods to generate the hailstone sequence, the tree graph and stopping time for the collatz conjecture. [Graphs](https://www.juliapackages.com/p/graphs): Used to deal with creating and modifying graphs. [FixedPointNumbers](https://www.juliapackages.com/p/fixedpointnumbers): Package to deal with fixed point number, only used to handle colors. """ endmetadatashow_logsèdisabled®skip_as_script«code_folded$9803f163-0027-4577-af8f-c66de195d182cell_id$9803f163-0027-4577-af8f-c66de195d182codemd"## Functions"metadatashow_logsèdisabled®skip_as_script«code_folded$8c854d1c-2f89-43f0-a810-ce174cf94af8cell_id$8c854d1c-2f89-43f0-a810-ce174cf94af8code""" A struct to store parameters related to the visualization ```julia num_traject::Int64 = 100.0 line_length::Float64 = 20.0 turn_scale::Float64 = 10.0 init_angle::Float64 = 90.0 x_start::Float64 = 250.0 y_start::Float64 = 500.0 window_width::Float64 = 500.0 window_height::Float64 = 500.0 stroke_width::Float64 = 2.0 stroke_color::Colors.RGBA = RGBA(1.0,1.0,1.0,1.0) background_color::Colors.RGBA = RGBA(0.0,0.0,0.0,1.0) vary_shade::Bool = false random_shade::Bool = false edmund_style::Bool = false ``` """ @with_kw struct VisualizationParameters num_traject::Int64 = 100.0 line_length::Float64 = 20.0 turn_scale::Float64 = 10.0 init_angle::Float64 = 90.0 x_start::Float64 = 250.0 y_start::Float64 = 500.0 window_width::Float64 = 500.0 window_height::Float64 = 500.0 stroke_width::Float64 = 2.0 stroke_color::Colors.RGBA = RGBA(0.0,0.0,0.0,1.0) background_color::Colors.RGBA = RGBA(1.0,1.0,1.0,1.0) vary_shade::Bool = false random_shade::Bool = false edmund_style::Bool = false chris_style::Bool = false endmetadatashow_logsèdisabled®skip_as_script«code_folded$12d218ee-9a43-4647-a96b-c9252c665fa0cell_id$12d218ee-9a43-4647-a96b-c9252c665fa0codeLmd""" We can visualize the path that each number takes with a graph. """metadatashow_logsèdisabled®skip_as_script«code_folded$0865f8a3-a959-481b-a9ae-adbca78a2749cell_id$0865f8a3-a959-481b-a9ae-adbca78a2749codeibegin window_size_sliders = @bind window_size_parameters format_numberFieldParameter( title="Window Size", [ NumberFieldParameter( lb=100.0, ub=10000.0, default=700.0, alias = :window_height, label = "Height", ), NumberFieldParameter( lb=100.0, ub=10000.0, default=500.0, alias=:window_width, label="Width") ] ) end metadatashow_logsèdisabled®skip_as_script«code_folded$13f52ec2-16b9-41a5-9560-177ca827a72ecell_id$13f52ec2-16b9-41a5-9560-177ca827a72ecode'begin using Plots using Colors using Luxor using Karnak, NetworkLayout using ImageIO ,ImageShow gr() md""" !!! info "Ploting Packages" [Plots](https://www.juliapackages.com/p/plots): Plotting library for the several plots in the notebook. [Luxor](https://www.juliapackages.com/p/luxor): Drawing library used for the visualiation. [Karnak](https://www.juliapackages.com/p/karnak): Drawing library, specifically for graphs. [NetworkLayout](https://www.juliapackages.com/p/networklayout): Used to compute the layout of the graphs. [ImageIO](https://www.juliapackages.com/p/ImageIO): Used to faciliate the handling of images. [ImageShow](https://www.juliapackages.com/p/ImageShow): Enhances the displaying of the images in the interactive visualization and the gallery. """ endmetadatashow_logsèdisabled®skip_as_script«code_folded$b4a31304-34a3-4ecc-8c6e-e67714bc5d52cell_id$b4a31304-34a3-4ecc-8c6e-e67714bc5d52codeffunction Base.show(io::IO, m::MIME"image/png",obj::CollatzVisualization) show(io, m, obj.imgdata) endmetadatashow_logsèdisabled®skip_as_script«code_folded$7dac4da8-0877-4d07-b4d2-2164faeccfdecell_id$7dac4da8-0877-4d07-b4d2-2164faeccfdecodefunction format_sliderParameter( params::Vector{SliderParameter{T}};title::String,) where T return combine() do Child mds = [ @htl("""

$(param.label)

$(Child(param.alias, PlutoUI.Slider(param.lb:param.step:param.ub, default = param.default, show_value = true)))
""") for param in params ] md""" #### $title $(mds) """ end endmetadatashow_logsèdisabled®skip_as_script«code_folded$7dbfb4dc-c9d0-464d-83b2-18db90d76878cell_id$7dbfb4dc-c9d0-464d-83b2-18db90d76878codeviz_specs_sliders = @bind viz_specs_parameters format_sliderParameter( title = "Image Options:", [ SliderParameter( lb = 0.0, ub = 360.0, default = 20.0, step = 0.1, alias = :init_angle, label = "Image Rotation (in degrees)" ), SliderParameter( lb = 0.0, ub = window_width, default = window_width/2, step = 0.1, alias = :x_start, label = "Starting point (X)" ), SliderParameter( lb = 0.0, ub = window_height, default = window_height, step = 0.1, alias = :y_start, label = "Starting point (Y)" ), SliderParameter( lb = 1.0, ub = 50.0, default = 5.0, step = 0.1, alias = :stroke_width, label = "Stroke Width" ), ] );metadatashow_logsèdisabled®skip_as_script«code_folded$d0672735-8007-4a69-9fa5-0f40ac0685eacell_id$d0672735-8007-4a69-9fa5-0f40ac0685eacodemd"# Interactive Visualization"metadatashow_logsèdisabled®skip_as_script«code_folded$25d2291f-f422-41e4-aa61-9000e13d34adcell_id$25d2291f-f422-41e4-aa61-9000e13d34adcodek@with_kw struct CheckBoxParameter label::String default::Bool = false alias::Symbol = Symbol(label) endmetadatashow_logsèdisabled®skip_as_script«code_folded$5f074850-b967-4de5-8ca3-b85a74052499cell_id$5f074850-b967-4de5-8ca3-b85a74052499code8begin generalize_collatz stopping_times = Dict(); end;metadatashow_logsèdisabled®skip_as_script«code_folded$822a3646-be9d-4b1c-a189-550bd8b56ab7cell_id$822a3646-be9d-4b1c-a189-550bd8b56ab7codemd"# Introduction"metadatashow_logsèdisabled®skip_as_script«code_folded$3153ba89-f2d4-4e31-9e79-00ec5ecbb91ccell_id$3153ba89-f2d4-4e31-9e79-00ec5ecbb91ccode""" descend_tree!(g::SimpleGraph{Int64}, record::Array{Tuple{Number,Number}}, tree::Dict, previous::Number=collect(keys(tree))[1], depth::Int=0) This function is used to explore the tree return by `tree_graph` from Collatz.jl and modify the graph g given as input. ## Args - `g::SimpleGraph`: The graph to modify - `record::Array{Tuple{Number,Number}}`: An array that keeps track of each of the encountered values. Each value is stored as (depth, value) in order to keep track of what depth the value was encountered - `tree::Dict`: The tree graph returned by `tree_graph` - `previous::Number`: The number passed by the previous call to the function - `depth::Int`: The current depth of the search """ function descend_tree!(g::SimpleGraph{Int64}, record::Array{Tuple{Number,Number}}, tree::Dict, previous::Number=collect(keys(tree))[1], depth::Int=0) # loop over each branch for key in keys(tree) add_vertex!(g) # check if previous number exist in record previous_index = findfirst(x -> x == previous, map(x -> x[2], record)) # if exist, create a edge in the graph isnothing(previous_index) ? "" : add_edge!(g, previous_index, length(record)+1) # this check is there cos when reaching a cycle the tree has a non number key if(isa(key, Number)) push!(record, (depth, key)) end # call recursively to continue descending the tree descend_tree!(g, record,tree[key], key, depth +1) end # end end metadatashow_logsèdisabled®skip_as_script«code_folded$b9277abb-7a14-4479-8bcb-6a50df27182bcell_id$b9277abb-7a14-4479-8bcb-6a50df27182bcodemd""" A generalization of the collatz function is the following: `` g(n) = n/P \ \ \ \ \ \ \ \text{when}\ \ \ n \ \text{mod}\ P = 0 `` `` g(n) = an+b \ \ \ \text{otherwise} `` This formulation makes sure that we always deal with integers. """metadatashow_logsèdisabled®skip_as_script«code_folded$fb2dd0e1-5198-4c0a-b62b-50649ac21f32cell_id$fb2dd0e1-5198-4c0a-b62b-50649ac21f32codebegin # getters get_num_trajects(viz::CollatzVisualization) = viz.viz_parameters.num_traject get_line_length(viz::CollatzVisualization) = viz.viz_parameters.line_length get_turn_scale(viz::CollatzVisualization) = viz.viz_parameters.turn_scale get_window_width(viz::CollatzVisualization) = viz.viz_parameters.window_width get_window_height(viz::CollatzVisualization) = viz.viz_parameters.window_height get_x_start(viz::CollatzVisualization) = viz.viz_parameters.x_start get_y_start(viz::CollatzVisualization) = viz.viz_parameters.y_start get_init_angle(viz::CollatzVisualization) = viz.viz_parameters.init_angle get_stroke_width(viz::CollatzVisualization) = viz.viz_parameters.stroke_width get_stroke_color(viz::CollatzVisualization, as_hex=true) = as_hex ? hex(RGB(viz.viz_parameters.stroke_color)) : viz.viz_parameters.stroke_color get_background_color(viz::CollatzVisualization, as_hex=true) = as_hex ? hex(RGB(viz.viz_parameters.background_color)) : viz.viz_parameters.background_color get_vary_shade(viz::CollatzVisualization) = viz.viz_parameters.vary_shade get_random_shade(viz::CollatzVisualization) = viz.viz_parameters.random_shade get_notes(viz::CollatzVisualization) = viz.notes endmetadatashow_logsèdisabled®skip_as_script«code_folded$43c4fd8d-bb44-43cd-91dd-d221629d1fd9cell_id$43c4fd8d-bb44-43cd-91dd-d221629d1fd9codeubegin graph_sliders = @bind graph_parameters format_sliderParameter(title="Collatz Graph Parameters:",[ SliderParameter(lb=1,ub=1000,default=1,step=1,alias=:start_value,label="Starting Value"), SliderParameter(lb=1,ub=25,default=9,step=1,alias=:orbit,label="Maximum Orbit") ]) @htl("""
$graph_sliders
""") endmetadatashow_logsèdisabled®skip_as_script«code_folded$3550fe19-261e-4069-9bf6-6417dcaac102cell_id$3550fe19-261e-4069-9bf6-6417dcaac102codembegin collatz_graph = @drawsvg begin background("white") sethue("grey40") fontsize(25) drawgraph(g, layout=Stress(initialpos=[(0.0,0.0)]), margin = 60, vertexlabels = map(x -> x[2], record), vertexshapesizes = 40, vertexfillcolors = graph_colors ) end 1600 1200 collatz_graph endmetadatashow_logsèdisabled®skip_as_script«code_folded$5ba5f885-1de1-4058-91bf-35e1b05d1941cell_id$5ba5f885-1de1-4058-91bf-35e1b05d1941codeLviz_sliders = @bind viz_parameters format_sliderParameter( title = "Visualization Options:", [ SliderParameter( lb = 100.0, ub = 10000.0, default = 1000.0, step = 100.0, alias = :num_traject, label = "Numbers of trajectories" ), SliderParameter( lb = 1, ub = 150, default = 20, step = 1, alias=:line_length, label="Step"), SliderParameter( lb = 0.0, ub = 180.0, default = 10.0, step = 0.1, alias = :turn_scale, label = "Rotation Angle (in degrees)" ), ] );metadatashow_logsèdisabled®skip_as_script«code_folded$bdd54208-1f66-45da-9e67-9479cc460863cell_id$bdd54208-1f66-45da-9e67-9479cc460863codemd"---"metadatashow_logsèdisabled®skip_as_script«code_folded$90dc6dd4-c4f3-4e4d-8e91-0fecafd258e1cell_id$90dc6dd4-c4f3-4e4d-8e91-0fecafd258e1codemd"## CSS Styles"metadatashow_logsèdisabled®skip_as_script«code_folded$2d98aed3-9a51-4225-b914-a20b19f43908cell_id$2d98aed3-9a51-4225-b914-a20b19f43908code^function format_colorPicker( params::Vector{ColorParameter};title::String) return combine() do Child mds = [ @htl("""

$(param.label)

$(Child(param.alias, PlutoUI.ColorPicker(default=param.default)))
""") for param in params ] md""" #### $title $(mds) """ end endmetadatashow_logsèdisabled®skip_as_script«code_folded$45ca6e2a-6a58-475e-9c02-4925e71625bdcell_id$45ca6e2a-6a58-475e-9c02-4925e71625bdcodebegin # find values that that have not been previously been calculated newValues = filter(x -> !(x ∈ keys(stopping_times)),collect(range(1,stopping_parameters.ub,step=1)) ) # calculate the values and add them to the dictionary for newValue in newValues push!(stopping_times, ( newValue => "Stopping Time" ∈ generalize_collatz ? stopping_time(newValue, ;collatz_parameters..., total_stopping_time=true) : stopping_time(newValue, total_stopping_time=true)) ) end scatter( collect(values(sort( filter( key -> (key[1] ∈ range(1,stopping_parameters.ub,step=1)) , stopping_times) ) ) ), markersize = 1, leg = false) title!("Total stopping time of numbers up to $(stopping_parameters.ub)") ylabel!("Stopping time") xlabel!("Starting point") endmetadatashow_logsèdisabled®skip_as_script«code_folded$b7b80bd8-7a16-4483-9b8f-b6a8da531b0acell_id$b7b80bd8-7a16-4483-9b8f-b6a8da531b0acodemetadatashow_logsèdisabled®skip_as_script«code_folded$1c3f1bea-f1ba-4d64-90ad-584391c01da5cell_id$1c3f1bea-f1ba-4d64-90ad-584391c01da5codebegin generalize_checkbox = @bind generalize_collatz MultiCheckBox(["Hailstone Sequence", "Graph", "Stopping Time", "Interactive"], default=["Interactive"]) if(do_generalize_collatz) generalize_checkbox end endmetadatashow_logsèdisabled®skip_as_script«code_folded$f02affaa-534b-4c72-81ae-c42ca3b455fdcell_id$f02affaa-534b-4c72-81ae-c42ca3b455fdcodemd"### Collatz"metadatashow_logsèdisabled®skip_as_script«code_folded$0fd7242c-46a1-4929-9c53-3c45768893b4cell_id$0fd7242c-46a1-4929-9c53-3c45768893b4codeٶ@bind stopping_parameters format_sliderParameter(title="Stopping Time Plot Parameters", [SliderParameter(lb=100, ub=30000, step=100, default=1000,alias=:ub, label="Upper Bound")] )metadatashow_logsèdisabled®skip_as_script«code_folded$b56a1328-194c-4e1c-a033-9ca6e0ab3eebcell_id$b56a1328-194c-4e1c-a033-9ca6e0ab3eebcodemd"---"metadatashow_logsèdisabled®skip_as_script«code_folded$d9aaaadc-7d94-4e85-a1cb-c137e869ad2fcell_id$d9aaaadc-7d94-4e85-a1cb-c137e869ad2fcodemd"### Extras"metadatashow_logsèdisabled®skip_as_script«code_folded$6f68b20d-67e5-4872-a23b-1840bbbb06eccell_id$6f68b20d-67e5-4872-a23b-1840bbbb06eccode$md"## The stopping time of a number"metadatashow_logsèdisabled®skip_as_script«code_folded$1b48b435-e959-477f-a8d2-3507da73fc28cell_id$1b48b435-e959-477f-a8d2-3507da73fc28codeٞ@htl(""" $(filename == "" ? PlutoUI.DownloadButton(interactive_viz,"MyCoolVisualization.png") : PlutoUI.DownloadButton(interactive_viz,"$filename.png")) """ )metadatashow_logsèdisabled®skip_as_script«code_folded$75b9294e-43a4-48c4-b493-5d40027f3cd6cell_id$75b9294e-43a4-48c4-b493-5d40027f3cd6codemd"## The Collatz Graph"metadatashow_logsèdisabled®skip_as_script«code_folded$4dd44fbd-f26a-4b72-a580-842209b44f27cell_id$4dd44fbd-f26a-4b72-a580-842209b44f27codefunction format_sliderParameter( params::Vector{SliderParameter};title::String,) return combine() do Child mds = [ @htl("""

$(param.label)

$(Child(param.alias, PlutoUI.Slider(param.lb:param.step:param.ub, default = param.default, show_value = true)))
""") for param in params ] md""" #### $title $(mds) """ end endmetadatashow_logsèdisabled®skip_as_script«code_folded$5683080b-7d4b-4e34-aa75-b3c68dc60314cell_id$5683080b-7d4b-4e34-aa75-b3c68dc60314code""" draw_hailstone_sequence(hailstone_seq::Vector{Int64}; params::VisualizationParameters) This function is used to draw the trajectory of the hailstone sequence of a number. Using a Turtle, the function loops over each number in the sequence. For the sequence, a curve is drawn where for each step in the sequence, it will curves one way if the number is odd, and the other way if the number is even. ## See also [`VisualizationParameters`](@ref) """ function draw_hailstone_sequence(hailstone_seq::Vector{Int64}; params::VisualizationParameters=VisualizationParameters()) @unpack line_length, turn_scale, stroke_width, stroke_color, random_shade, vary_shade, edmund_style, chris_style = params # Initiliaze turle 🐢 = Turtle() # set stroke width Penwidth(🐢, stroke_width) # Handle Color if(random_shade) Pencolor(🐢,RGB(rand(), rand(), rand())) elseif vary_shade color_offset = randn()/2 Pencolor(🐢,RGB(stroke_color.r + color_offset, stroke_color.g + color_offset, stroke_color.b + color_offset)) else Pencolor(🐢,stroke_color) end # Move the turtle for (index,number) in enumerate(hailstone_seq) # decrease opacity as the sequence gets longer setopacity(rescale(index, 1, length(hailstone_seq)*8 , 0.1,1)) if(chris_style) if number % 3 == 1 Turn(🐢, turn_scale) else Turn(🐢, -turn_scale) end Forward(🐢, line_length) continue end if number % 2 == 0 Turn(🐢, turn_scale) else if(edmund_style) Turn(🐢, -1/2*turn_scale) else Turn(🐢, -turn_scale) end end # if number < 0 # Turn(🐢, -90) # end Forward(🐢, line_length) end end metadatashow_logsèdisabled®skip_as_script«code_folded$6a45247d-25db-445f-a687-191c0952c6c4cell_id$6a45247d-25db-445f-a687-191c0952c6c4codemd"""At first it might seem that the fact that it *always* reaches 1 could appear strange, as some numbers get caught in a repeating pattern of multiplying by 3 and adding one, when dividing by 2, give a another odd number. Since: `` \begin{aligned} x < \frac{3x + 1}{2} \end{aligned} `` Thus, it's possible (and quite frequent) that we end going up in numbers, and looks like we are getting further away from the pit of doom that is the number 1. However, this is unfortunately not the case, but we quantify this by calculating how long it takes for a number to reach a another number that is lower than the starting point: the stopping time. Here is a plot to show the total stopping times of the numbers for up to 1000. """ metadatashow_logsèdisabled®skip_as_script«code_folded$278572e6-5a74-4dad-b39b-68cc85e4339ccell_id$278572e6-5a74-4dad-b39b-68cc85e4339ccode""" draw_hailstone_sequences(hailstone_seqs::Vector{Vector{Int64}}; params::VisualizationParameters) This function is used to draw each trajectory given an array of hailstone sequences. ## See also [`VisualizationParameters`](@ref) """ function draw_hailstone_sequences(hailstone_seqs::Vector{Vector{Int64}}; params::VisualizationParameters) @unpack init_angle, x_start, y_start, window_width, window_height = params for hailstone_seq in hailstone_seqs # reset to origin and setup windows accord to user parameter origin() Luxor.translate( x_start - window_width /2, y_start - window_height /2 ) Luxor.rotate(deg2rad(init_angle)+π) # draw sequence draw_hailstone_sequence(hailstone_seq; params) end endmetadatashow_logsèdisabled®skip_as_script«code_folded$f718bbfd-2e86-45c5-96b3-ef3d810966a9cell_id$f718bbfd-2e86-45c5-96b3-ef3d810966a9codex""" buffer_img_data(vis::CollatzVisualization) Helper function to transform the RGBA img of CollatzVisualization into a UInt8 buffer for loading onto a html canvas. """ function buffer_img_data(vis::CollatzVisualization) buffer::Vector{UInt8} = [] for pix in vis.imgdata push!(buffer, reinterpret.(UInt8, [pix.r, pix.g, pix.b, pix.alpha])...) end return buffer endmetadatashow_logsèdisabled®skip_as_script«code_folded$5328c6f3-2ae7-4449-a2a2-b6803cec0dcccell_id$5328c6f3-2ae7-4449-a2a2-b6803cec0dcccodeXmd""" $(Resource("https://static.wixstatic.com/media/a27d24_08a39705c99d40c6b764c9b8d699b71a~mv2.jpg/v1/fit/w_900%2Ch_1000%2Cal_c%2Cq_80/file.jpg", :height => 500)) Visualization of the Collatz Conjecture by [Edmund Harris](https://maxwelldemon.com/) # The Collatz Conjecture > "Mathematics may not be ready for such problems." - Paul Erdos """metadatashow_logsèdisabled®skip_as_script«code_folded$dc1dba7c-8c0d-4609-882a-e5703c467fefcell_id$dc1dba7c-8c0d-4609-882a-e5703c467fefcode'md"# Generalizing the Collatz function"metadatashow_logsèdisabled®skip_as_script«code_folded$23be8efa-b907-453f-9245-8bc46a37ad26cell_id$23be8efa-b907-453f-9245-8bc46a37ad26code=""" shortcut_collatz(n::Int) Calculate the collatz sequence of a number using the shortcut formulation: g(n) = (3n + 1) / 2 if odd and g(n) = n / 2 if even """ function shortcut_collatz(n::Int) if n == 1 return [1] elseif haskey(shortcut_collatz_cache, n) return shortcut_collatz_cache[n] elseif n % 2 == 0 sequence = [n, shortcut_collatz(n ÷ 2)...] shortcut_collatz_cache[n] = sequence return sequence else sequence = [n, shortcut_collatz(Int((3n + 1)/2))...] shortcut_collatz_cache[n] = sequence return sequence end end metadatashow_logsèdisabled®skip_as_script«code_folded$b79405c3-42d1-4289-bbc3-67b6eae2b135cell_id$b79405c3-42d1-4289-bbc3-67b6eae2b135code""" descend_tree!(g::SimpleGraph{Int64}, record::Array{Tuple{Number,Number}}, key::Int64, previous::Collatz._CC.CC, depth::Int=0) To handle the case where the search hits a cycle and previous is of type Collatz._CC.CC ## Args - `g::SimpleGraph`: The graph to modify - `record::Array{Tuple{Number,Number}}`: An array that keeps track of each of the encountered values - `tree::Dict`: The tree graph returned by `tree_graph` - `previous::Collatz._CC.CC`: The cycle value. - `depth::Int`: The current depth of the search """ function descend_tree!(g::SimpleGraph{Int64}, record::Array{Tuple{Number,Number}}, key::Int64, previous::Collatz._CC.CC, depth::Int=0) # check if previous number exist in record previous_index = findfirst(x -> x == previous, map(x -> x[2], record)) # if exist, create a edge in the graph isnothing(previous_index) ? "" : add_edge!(g, previous, length(record)+1) # push key in record push!(record, (depth, key)) return endmetadatashow_logsèdisabled®skip_as_script«code_folded$0e85d872-ef01-463e-b395-b0797c96317ecell_id$0e85d872-ef01-463e-b395-b0797c96317ecode@htl("""

Want to generalize the parameters? $(@bind do_generalize_collatz PlutoUI.CheckBox())

Note: This will update all the plots and visualizations in the notebook.
""")metadatashow_logsèdisabled®skip_as_script«code_folded$240b4cc1-1bae-429b-863b-792897cd555bcell_id$240b4cc1-1bae-429b-863b-792897cd555bcode7ultra_shortcut_collatz_cache = Dict{Int, Vector{Int}}()metadatashow_logsèdisabled®skip_as_script«code_folded$f21f1e3e-a3ab-458e-a101-ce824731f0b6cell_id$f21f1e3e-a3ab-458e-a101-ce824731f0b6codeEbegin collatz_sliders = @bind collatz_parameters format_sliderParameter(title="Collatz Parameters:",[ SliderParameter(lb=1,ub=10,step=1,default=2,label="P"), SliderParameter(lb=1,ub=10,step=1,default=3,label="a"), SliderParameter(lb=1,ub=10,step=1,label="b"), ]) if(do_generalize_collatz) collatz_sliders else end endmetadatashow_logsèdisabled®skip_as_script«code_folded$ae8c02c0-2944-42dc-8a19-a45fbdc16134cell_id$ae8c02c0-2944-42dc-8a19-a45fbdc16134codemd"### HTML Functions"metadatashow_logsèdisabled®skip_as_script«code_folded$6e359db6-581f-4a5a-a0a7-6924faf19653cell_id$6e359db6-581f-4a5a-a0a7-6924faf19653codeemd"> Of course, we are not limited to the 3x + 1 problem, what happens if we change up those values?"metadatashow_logsèdisabled®skip_as_script«code_folded$aef6cb43-61c7-4436-ad66-7e7f0459610dcell_id$aef6cb43-61c7-4436-ad66-7e7f0459610dcodeُ@htl("""
Filename: $(@bind filename PlutoUI.TextField(default="MyCoolVisualization"))
""")metadatashow_logsèdisabled®skip_as_script«code_folded$1e85c1af-3318-4f20-a358-25aa0999dc8acell_id$1e85c1af-3318-4f20-a358-25aa0999dc8acode""" hailstone_sequences(range::UnitRange{Int64}; P::Int=2, a::Int=3, b::Int=1 ) Extension for the `hailstone_sequence()` method from Collatz.jl to calculate list of hailstone sequence given a UnitRange. ## Args - `range::UnitRange{Int64}`: Unit Range in which to calculate the hailstone sequences. ## Kwargs - `P::Integer = 2`: Modulus used to devide n, iff n is equivalent to (0 mod P). - `a::Integer = 3`: Factor by which to multiply n. - `b::Integer = 1`: Value to add to the scaled value of n. ## Examples ```jldoctest julia> hailstone_sequences(2:5) [[2, 1], [3, 10, 5, 16, 8, 4, 2, 1], [4, 2, 1], [5, 16, 8, 4, 2, 1]] ``` ```jldoctest julia> hailstone_sequences(1:5; P=4, a=1, b=3) [[1], [2, 5, 8, 2], [3, 6, 9, 12, 3], [4, 1], [5, 8, 2, 5]] ``` ## See also [`hailstone_sequence`](@ref), [`reverse_hailstone_sequences`](@ref) """ function hailstone_sequences(range::UnitRange{Int64}; P::Int=2, a::Int=3, b::Int=1 ) return [ hailstone_sequence(starting_number; P, a, b, verbose =false) for starting_number in range ] endmetadatashow_logsèdisabled®skip_as_script«code_folded$7335059c-d9b8-40a5-b2c0-6bcca4bdfe28cell_id$7335059c-d9b8-40a5-b2c0-6bcca4bdfe28codefunction Base.getproperty(obj::CollatzVisualization, sym::Symbol) if(sym == :P) return obj.collatz_parameters.P end if(sym == :a) return obj.collatz_parameters.a end if(sym == :b) return obj.collatz_parameters.b end return getfield(obj, sym) endmetadatashow_logsèdisabled®skip_as_script«code_folded$10ab31ff-2d28-4ac3-a118-654f8366768ecell_id$10ab31ff-2d28-4ac3-a118-654f8366768ecode٢@htl("""
Animate?
$(@bind animate_hailstone PlutoUI.CheckBox(default=true))
""")metadatashow_logsèdisabled®skip_as_script«code_folded$cf545d05-7846-4881-a532-33cb2c1972a4cell_id$cf545d05-7846-4881-a532-33cb2c1972a4codemd"### Drawing"metadatashow_logsèdisabled®skip_as_script«code_folded$43479204-cd12-40b4-a65f-16bf54aaddfecell_id$43479204-cd12-40b4-a65f-16bf54aaddfecoded@with_kw struct SliderParameter{T} lb::T = 0.0 ub::T = 100.0 step::T = 1.0 default::T = lb label::String alias::Symbol = Symbol(label) function SliderParameter{T}(lb::T,ub::T,step::T,default::T, label::String, alias::Symbol) where T if ub < lb error("Invalid Bounds") end return new{typeof(default)}(lb,ub,step,default,label,alias) end endmetadatashow_logsèdisabled®skip_as_script«code_folded$e60fcc3e-312c-4546-9b04-e6b558ba752acell_id$e60fcc3e-312c-4546-9b04-e6b558ba752acodeTableOfContents()metadatashow_logsèdisabled®skip_as_script«code_folded$319d784b-c62d-4f28-a5b3-ebf89c892afccell_id$319d784b-c62d-4f28-a5b3-ebf89c892afccodeu""" make_collatz_graph(initial_value::Int, max_orbit_distance::Int; P=2, a=3, b=1) This function returns a graph that represent the different branches that each number takes. ## Args - `initial_value::Integer`: The starting value of the directed tree graph. - `max_orbit_distance::Integer`: Degree of seperation between the initial value and each value encountered. ## Kwargs - ```P::Integer=2```: Modulus used to devide n, iff n is equivalent to (0 mod P). - ```a::Integer=3```: Factor by which to multiply n. - ```b::Integer=1```: Value to add to the scaled value of n. ## See also [`tree_graph`](@ref) """ function make_collatz_graph(initial_value::Int, max_orbit_distance::Int; P=2, a=3, b=1) g = SimpleGraph() record::Array{Tuple{Number,Number}} = [] tree = tree_graph(initial_value,max_orbit_distance; P, a,b ) descend_tree!(g, record, tree) return g, record endmetadatashow_logsèdisabled®skip_as_script«code_folded$546a2cf6-f54a-4482-9da5-af9d966b22ebcell_id$546a2cf6-f54a-4482-9da5-af9d966b22ebcodemd"---"metadatashow_logsèdisabled®skip_as_script«code_folded$b7161895-ba79-4b99-b2f1-eda7484708dacell_id$b7161895-ba79-4b99-b2f1-eda7484708dacode _begin viz_thumbnail = CollatzVisualization( viz_parameters = ( num_traject = 10000, line_length = 15, turn_scale = 9.3, window_width = 500.0, window_height = 500.0, x_start = 100.0, y_start = 0.0, init_angle = 270, stroke_width = 2.0, stroke_color = RGB(38/255,148/255,30/255), background_color = RGB(188/255, 251/255, 199/255), vary_shade=true, random_shade=false ), ultra_shortcut = true, ) viz_5_5_5 = CollatzVisualization( viz_parameters = ( num_traject = 1000, line_length = 15, turn_scale = 21.3, window_width = 500.0, window_height = 500.0, x_start = 500.0, y_start = 250.0, init_angle = 30.5, stroke_width = 2.0, stroke_color = RGB(0,102/255,0), background_color = RGB(128/255, 234/255, 193/255), vary_shade=true, random_shade=false ), collatz_parameters = ( P = 5, a = 5, b = 5 ) ) viz_3_7_2 = CollatzVisualization( viz_parameters = ( num_traject = 1000, line_length = 24, turn_scale = 10.3, window_width = 500.0, window_height = 500.0, x_start = 500.0, y_start = 250.0, init_angle = 306.0, stroke_width = 2.0, stroke_color = RGB(67/255,65/255,210/255), background_color = RGB(0/255,4/255,36/255), vary_shade=true, random_shade=false ), collatz_parameters = ( P = 2, a = 3, b = 7 ) ) viz_1_1_3 = CollatzVisualization( viz_parameters = ( num_traject = 1000, line_length = 25, turn_scale = 15.0, window_width = 500.0, window_height = 500.0, x_start = 500.0, y_start = 250.0, init_angle = 24.0, stroke_width = 2.0, stroke_color = RGB(191/255,237/255,253/255), background_color = RGB(1/255,152/255,150/255), vary_shade=true, random_shade=false ), collatz_parameters = ( P = 3, a = 1, b = 1 ) ) viz_3_1_7 = CollatzVisualization( collatz_parameters = ( P = 7, a = 1, b = 3 ), viz_parameters = ( num_traject = 1000, line_length = 22, turn_scale = 11.0, window_width = 500.0, window_height = 500.0, x_start = 500.0, y_start = 250.0, init_angle = 5.0, stroke_width = 2.0, stroke_color = RGB(236/255,196/255,50/255), background_color = RGB(255/255,243/255,163/255), vary_shade=true, random_shade=false ) ) hex_grid = CollatzVisualization( viz_parameters = ( num_traject = 1000, line_length = 12, turn_scale = 60.0, window_width = 500.0, window_height = 500.0, x_start = 300.0, y_start = 350.7, init_angle = 112.8, stroke_width = 3.0, stroke_color = RGB(196/255,132/255,231/255), background_color = RGB(28/255,0,87/255), vary_shade=true, random_shade=false ), collatz_parameters = ( P = 2, a = 3, b = 1 ) ) lil_guy = CollatzVisualization( viz_parameters = ( num_traject = 600, line_length = 42, turn_scale = 29.4, window_width = 500.0, window_height = 500.0, x_start = 300.0, y_start = 150.0, init_angle = 74.3, stroke_width = 3.0, stroke_color = RGB(230/255,130/255,130/255), background_color = RGB(0/255,0,0/255), vary_shade=true, random_shade=false ), collatz_parameters = ( P = 3, a = 8, b = 1 ) ) gallery_vizs = [viz_thumbnail, viz_5_5_5, viz_3_1_7,viz_1_1_3,viz_3_7_2, hex_grid, lil_guy,] end;metadatashow_logsèdisabled®skip_as_script«code_folded$01cc5e4f-d94b-4211-b268-9ce0640cd23fcell_id$01cc5e4f-d94b-4211-b268-9ce0640cd23fcodepcolors_sliders = @bind viz_colors_options format_colorPicker( title="Color Options", [ ColorParameter( alias = :stroke_color, label = "Stroke Color", default = RGB{N0f8}( reinterpret(N0f8, UInt8(230)), reinterpret(N0f8, UInt8(130)), reinterpret(N0f8, UInt8(130))) ), ColorParameter( alias=:background_color, label="Background") ] );metadatashow_logsèdisabled®skip_as_script«code_folded$8a64e9e3-477e-4a7e-97f7-61cf5e428731cell_id$8a64e9e3-477e-4a7e-97f7-61cf5e428731code<@unpack window_height,window_width = window_size_parameters;metadatashow_logsèdisabled®skip_as_script«code_folded$b3c9453e-3198-4697-966f-ade21f2255cecell_id$b3c9453e-3198-4697-966f-ade21f2255cecode٩md""" The sequence of values that you go through when iterating a number is often called the hailstone sequence, as the numbers go up and down through the sequence. """metadatashow_logsèdisabled®skip_as_script«code_folded$af0c36ee-0534-4143-b59b-4ee041ef0f04cell_id$af0c36ee-0534-4143-b59b-4ee041ef0f04code

$(param.label)

$(Child(param.alias, PlutoUI.CheckBox(default=param.default)) )
""") for param in params ] md""" #### $title $(mds) """ end endmetadatashow_logsèdisabled®skip_as_script«code_folded$1255f4cc-7448-40f6-83ba-0cca1637d1cfcell_id$1255f4cc-7448-40f6-83ba-0cca1637d1cfcodel@with_kw struct ColorParameter label::String default::RGB = RGB(0,0,0) alias::Symbol = Symbol(label) endmetadatashow_logsèdisabled®skip_as_script«code_folded$e4a76493-9aea-4379-9a56-6a9b9e8d6b54cell_id$e4a76493-9aea-4379-9a56-6a9b9e8d6b54codebegin # Notebook related packages using PlutoUI import PlutoUI: combine using HypertextLiteral:@htl using Parameters md""" !!! info "Notebook Packages" [PlutoUI](https://www.juliapackages.com/p/PlutoUI): Extension for Pluto to handle interactivity, provides the Sliders, Checkboxes and Color Picker. [HypertextLiteral](https://www.juliapackages.com/p/HypertextLiteral): Drawing library, specifically for graphs. """ endmetadatashow_logsèdisabled®skip_as_script«code_folded$6693800b-e2bc-46e4-b5f8-004184ef472bcell_id$6693800b-e2bc-46e4-b5f8-004184ef472bcodenbegin g, record = "Graph" ∈ generalize_collatz ? make_collatz_graph( graph_parameters.start_value, graph_parameters.orbit; collatz_parameters... ) : make_collatz_graph( graph_parameters.start_value, graph_parameters.orbit; ) graph_colors = [RGB(rescale(record[i][1],1,graph_parameters.orbit, 1,0.3),.1,.3) for i in 1:nv(g)] end;metadatashow_logsèdisabled®skip_as_script«code_folded$cdfb638b-a04c-482c-9206-47f7dfd63766cell_id$cdfb638b-a04c-482c-9206-47f7dfd63766codemd"# Appendix"metadatashow_logsèdisabled®skip_as_script«code_folded$091d8f63-d02a-48fa-be0c-e9e027409279cell_id$091d8f63-d02a-48fa-be0c-e9e027409279codemd"## Custom Types"metadatashow_logsèdisabled®skip_as_script«code_folded$7baab6e9-31bb-4da5-8ab9-938546cc863ecell_id$7baab6e9-31bb-4da5-8ab9-938546cc863ecode<@htl(""" """)metadatashow_logsèdisabled®skip_as_script«code_folded$5655a706-2c53-4763-b8c5-e21aa3e72371cell_id$5655a706-2c53-4763-b8c5-e21aa3e72371code-md"While playing around with the viusalization, I stumbled into some nice patterns that I wanted to share with you! I added the parameters in case you want to recreate them. Enjoy :) *(Note that the parameters are highly dependent on the size of the canvas so it might not be trivial to reproduced)*"metadatashow_logsèdisabled®skip_as_script«code_folded$3e9a6e74-a0ab-4c47-b493-4670fa828c45cell_id$3e9a6e74-a0ab-4c47-b493-4670fa828c45codemd"---"metadatashow_logsèdisabled®skip_as_script«code_folded$40dd9659-abb9-4484-b5f1-f332e2abe90ecell_id$40dd9659-abb9-4484-b5f1-f332e2abe90ecode""" reverse_hailstone_sequences(range::UnitRange{Int64}; P::Int=2, a::Int=3, b::Int=1) This function wraps the `hailstone_sequence()` method from Collatz.jl to calculate list of hailstone sequence given a UnitRange. It return the reversed sequence where the endpoint is the first element of the result. ## Args - `range::UnitRange{Int64}`: Unit Range in which to calculate the hailstone sequences. ## Kwargs - `P::Integer = 2`: Modulus used to devide n, iff n is equivalent to (0 mod P). - `a::Integer = 3`: Factor by which to multiply n. - `b::Integer = 1`: Value to add to the scaled value of n. ## Examples ```jldoctest julia> hailstone_sequences(2:5) [[1, 2], [1, 2, 4, 8, 16, 5, 10, 3], [1, 2, 4], [1, 2, 4, 8, 16, 5]] ``` ```jldoctest julia> hailstone_sequences(1:5; P=4, a=1, b=3) [[1], [2, 8, 5, 2], [3, 12, 9, 6, 3], [1, 4], [5, 2, 8, 5]] ``` ## See also [`hailstone_sequence`](@ref), [`hailstone_sequences`](@ref) """ function reverse_hailstone_sequences(range::UnitRange{Int64}; P::Int=2, a::Int=3, b::Int=1 ) return [ reverse(hailstone_sequence(starting_number; P, a, b, verbose =false)) for starting_number in range ] endmetadatashow_logsèdisabled®skip_as_script«code_folded$66fe673a-7679-4c55-bf59-146a8dd1241ccell_id$66fe673a-7679-4c55-bf59-146a8dd1241ccodejbegin hailstone_seq = "Hailstone Sequence" ∈ generalize_collatz ? hailstone_sequence(hailstone_params.start_value; collatz_parameters... ,verbose=false) : hailstone_sequence(hailstone_params.start_value; verbose=false) pl = plot(leg = false) xlabel!("Iterations") ylabel!("Value") title!("Hailstone sequence of: $(hailstone_params.start_value)") if(animate_hailstone) # using with_terminal to remove the @info msg with_terminal(show_value=false) do global gl = @gif for i in range(0,length(hailstone_seq),step=1) plot!(pl, hailstone_seq[1:i], linecolor=:lightblue) scatter!(pl, hailstone_seq[1:i], marker = :star7, markersize=7, markercolor=:lightblue) end fps = 4 end else plot!(pl, hailstone_seq, linecolor=:lightblue) scatter!(pl, hailstone_seq, marker = :star7, markersize=7, markercolor=:lightblue) global gl = pl end gl endmetadatashow_logsèdisabled®skip_as_script«code_folded$f47eb656-67ec-4760-8906-713fa480cb47cell_id$f47eb656-67ec-4760-8906-713fa480cb47code md"### Interactivity extensions"metadatashow_logsèdisabled®skip_as_script«code_folded$31a7994d-13e0-440a-8279-5f19d7d0933fcell_id$31a7994d-13e0-440a-8279-5f19d7d0933fcode@@with_kw struct NumberFieldParameter{T} lb::T = 0 ub::T = 100 step::T = 1 default::T = lb label::String alias::Symbol = Symbol(label) function NumberFieldParameter(lb,ub,step,default, label, alias) if ub < lb error("Invalid Bounds") end return new{typeof(default)}(lb,ub,step,default,label,alias) end endmetadatashow_logsèdisabled®skip_as_script«code_folded$53520512-fc88-4dd2-ae6d-a8ed0d599e42cell_id$53520512-fc88-4dd2-ae6d-a8ed0d599e42codebegin @htl(""" """) endmetadatashow_logsèdisabled®skip_as_script«code_folded$4c991173-d9ff-4ba9-b217-8f9aafbbd631cell_id$4c991173-d9ff-4ba9-b217-8f9aafbbd631code1shortcut_collatz_cache = Dict{Int, Vector{Int}}()metadatashow_logsèdisabled®skip_as_script«code_folded$03eb05fa-57bc-45d0-9943-79034ed10211cell_id$03eb05fa-57bc-45d0-9943-79034ed10211codeA""" makeCollatzGallery(visualizations::Vector{CollatzVisualization}; width::Int=500, height::Int=500) Helper function to format an array of visualizations into a scrollable gallery, with an panel below the image showing the parameters used to generate the visualization. ## Kwargs -`width::Int`=500: Width of each image in pixels -`height::Int`=500: Height of each image in pixels """ function makeCollatzGallery(visualizations::Vector{CollatzVisualization}; width::Int=500, height::Int=500) res = [] for (i,viz) in enumerate(visualizations) push!(res, @htl("""
Parameters:
P: $(viz.P)
a: $(viz.a)
b: $(viz.b)
Number of trajectories: $(get_num_trajects(viz))
Step length: $(get_line_length(viz))
Rotation Angle: $(get_turn_scale(viz))
Window Width: $(get_window_width(viz))
Window Height: $(get_window_height(viz))
Starting point (X): $(get_x_start(viz))
Starting point (Y): $(get_y_start(viz))
Rotation Angle: $(get_init_angle(viz))
Stroke Width: $(get_stroke_width(viz))
Stroke Color: #$(get_stroke_color(viz))
Background Color: #$(get_background_color(viz))
Shade Variation: $(get_vary_shade(viz))
Random Shade: $(get_random_shade(viz))
$(get_notes(viz))
""")) end return res endmetadatashow_logsèdisabled®skip_as_script«code_folded$50a423ad-ca90-4015-9ef6-577f60e4efe7cell_id$50a423ad-ca90-4015-9ef6-577f60e4efe7code+begin @htl(""" """) endmetadatashow_logsèdisabled®skip_as_script«code_foldedënotebook_id$3594fa08-59ad-11f1-9544-c93dbc7e80f6in_temp_dir¨metadatafrontmatterauthornameChris Damoururlhttps://github.com/damourChrislicence_urlghttps://github.com/JuliaPluto/featured/blob/2a6a9664e5428b37abe4957c1dca0994f4a8b7fd/LICENSES/Unlicenseimageىhttps://upload.wikimedia.org/wikipedia/commons/thumb/2/2b/Collatz_Conjecture_Vizualization.png/500px-Collatz_Conjecture_Vizualization.pngtitle#Visualizing the Collatz Conjecture tagsmathinteractive visualizationcollatz conjectureedmond harrisdate2023-12-14descriptionAExplore this cool math problem and create your own visualization!licenseUnlicense