├── .gitattributes ├── .gitignore ├── .project ├── CITATION.cff ├── Jenkinsfile ├── LICENSE ├── README.md ├── doc ├── feenk.png ├── gtoolkit.png ├── loader │ └── loader-log-example.txt └── releaser │ └── releaser-log-example.txt ├── feenk-releaser.version ├── github_deploy_key.enc ├── gtoolkit-builder.version ├── gtoolkit-vm.version ├── lepiter ├── 14qg8mjcg78gmu8e1cwk4z6p7.lepiter ├── 168fn0evqtoz9l8va173iu3ya.lepiter ├── 17ggf74yq8alu0zkq40986sl.lepiter ├── 18xk77smtim6mpt53pl4awjk.lepiter ├── 1f5nlu7ul60puw4d8lvtsrkij.lepiter ├── 1g3rinork5wwdkwm8lp0ianyp.lepiter ├── 1gc9srqc8yk7wwe98few2rmb1.lepiter ├── 1hwxsvmv2tembq8cnbpeshf28.lepiter ├── 1jw0stjuzf6u5aawd1cl0xj4z.lepiter ├── 1l8n7hwzqhs266adb7lvbokke.lepiter ├── 1l8n7hy23tzz7vi7gy1zhicgz.lepiter ├── 1l8n7hz8cfs4ak7est39g2zpt.lepiter ├── 1l8n7i0hrp4lpl2d0ml4vf5ur.lepiter ├── 1l8n7i2igtcdz82xsvyydzg2h.lepiter ├── 1l8n7i2kpw3dklbuj0hhxndin.lepiter ├── 1ncbmunmfwhpw1wry1mj91cm7.lepiter ├── 1ncbmuokuzfdkn61jgoaieqj5.lepiter ├── 1ncbmuqb7k5aalqndru4xnhd4.lepiter ├── 1omx4omgaapqeyrlfumam1vfi.lepiter ├── 1smwhznheyxtihpvr5uizsrga.lepiter ├── 1tc32ybua9b1i55n6qiq2p0k9.lepiter ├── 1uwrgkpnjmeodl18ifxrfsxf0.lepiter ├── 1v2v05rfximg7k3sr3wd5rz24.lepiter ├── 1v2v05ririti06bdwvnql904e.lepiter ├── 1v2v05w8sw0ov4w3whoiv0yib.lepiter ├── 1vf1mozz9ldrb6mqngqy9b3yy.lepiter ├── 1wazy4k85hdolg8gusqt5t7pj.lepiter ├── 1wazy4l2wc2nze6rszmznlgmh.lepiter ├── 1wazy4mum5jhc4d6msvida07p.lepiter ├── 1wazy4o46y2a707pgsxjh33cw.lepiter ├── 1wazy4oin7vt2pg18z4mtn7al.lepiter ├── 1wazy4pcyi3tsw7vf2e09dmbe.lepiter ├── 1wazy4pmmvdopfgpwlf0xgvkn.lepiter ├── 1wazy4qsg214unowsio9j3ub8.lepiter ├── 1wazy4quh36t4xomm15w7xff2.lepiter ├── 1wazy4rhuam3wj4mw6d4feiyv.lepiter ├── 1x57jy0rdycvhytqxyar21gw6.lepiter ├── 1xhqtjw5lsvsf1w2zis10qtmo.lepiter ├── 1xhqtjzfrysgl6q78cmdckxe0.lepiter ├── 1ytlpfrqpi0ggg5bksl3bu601.lepiter ├── 1ytlpfu6t3dtrwppwttloauw8.lepiter ├── 1ytlpfuouzwm1m3vvkjdbj5ju.lepiter ├── 1ytlpfv23i3dyulhbauhc9sdb.lepiter ├── 214larx54fnir4orgil3go4x7.lepiter ├── 21mab6chn2n98c935pqo610cw.lepiter ├── 250w8saumo67u9gp3155u53rc.lepiter ├── 250w8seiv1n8rl8wmrxxl5ng5.lepiter ├── 26emqdaptgodnr9hnob35645v.lepiter ├── 270ytb08d2vvi7r6m07yeb82d.lepiter ├── 270ytb2wbpd249b9meo1bpuql.lepiter ├── 270ytb3tnkqq2t7mvntl14qhw.lepiter ├── 270ytb3y5mi1voswipfyc5hti.lepiter ├── 270ytb699ih1jnrjj2ldj8ojn.lepiter ├── 28lsf69tdoi8iuhg8uohnjefa.lepiter ├── 28lsf6bry2odt7uvr0wsdcoqy.lepiter ├── 2c4988f2caflhxm8wrv4s07sm.lepiter ├── 2d06pe6iayin2aiar4zlg03ms.lepiter ├── 2d14xf6u41tmtorbvf62nvlix.lepiter ├── 2exwn84mr8nrzmxzszoj5w9mt.lepiter ├── 2gucuu45wndbd8no2s4vk6lav.lepiter ├── 2l2idaf37gq434qhjivoonfw0.lepiter ├── 2oiurgue84cv8xerpds2kphqh.lepiter ├── 2q5h2dpl58qt5r4rp5oaajac3.lepiter ├── 2q5h2drfi9zteqg605o07cy05.lepiter ├── 2q5h2dtn7nejupzx6lxyp4sqk.lepiter ├── 2q5h2duovwuclgqkxr96ccyjo.lepiter ├── 2q5h2dv435ssoaa502o2wil2y.lepiter ├── 2q5h2dw4evisgw5dwsxijaxfu.lepiter ├── 2sslgxh3u22bqggvcio0z5i50.lepiter ├── 2sslgxhagswqwjzxey1sztdrg.lepiter ├── 2sslgxkdad5ybya4mibt0dhoc.lepiter ├── 2sslgxkw1agkq7liw4heoqycp.lepiter ├── 2taosk42d3purmvmwfdg5y5x.lepiter ├── 2tayi32k6bk6g9hvxydicueq0.lepiter ├── 2tbpqa98apus4jnjk6bt9r8k8.lepiter ├── 2y96l714xplup2eheh8jgu7ta.lepiter ├── 2zbow09eh2ngi1ueslpdo5zca.lepiter ├── 30b523pwv49dtzyedc3fmpay7.lepiter ├── 33b00udbvrgvrgoecn1tfehxt.lepiter ├── 354jhxfkq8sdfwdp6inoitago.lepiter ├── 38pr9kx0hf1a5b2euufmc6cnd.lepiter ├── 39neztrl6hasnnqjvoa2e15l3.lepiter ├── 3dsfofgfz37c2pvbv11o7o1qb.lepiter ├── 3eqn9c31cz6togcdtj0qx6iu2.lepiter ├── 3g3781052c0zhq0qvf6csjamr.lepiter ├── 3g9kpmxty3fj9eev3ucmqkztc.lepiter ├── 3g9kpmxxo7epm82vbz03w6i2k.lepiter ├── 3gjh2eh7jq6tdwwtr1vkczjtw.lepiter ├── 3gjh2ejodiucfgb0ge24l69zl.lepiter ├── 3ikuo8xaim2vr1f1s6ncc10o6.lepiter ├── 3je4xtfz69euugtws1aiz3u4d.lepiter ├── 3johwdh5tgso6zlfya1heo3xy.lepiter ├── 3mbj3kyzkprddda2dvku9hiq0.lepiter ├── 3na1idciw97fdqmfw69gxbt7p.lepiter ├── 3na1idef0mbhj3oajn3uqlw8q.lepiter ├── 3na1idg5c9kzrb3ky31c13mnk.lepiter ├── 3pxdf097f22r7eelwr5nu1pws.lepiter ├── 3s7rxph90mb54g63lkm8l5ovj.lepiter ├── 3uat0hz0mnz075hfzjrwthg3p.lepiter ├── 3uat0i07qmx3lei2y3b4gpamn.lepiter ├── 3uat0i182g4fr7gn2s7683foq.lepiter ├── 3vrdvljqvwuaa3swhe1fsa67g.lepiter ├── 3xnijfwter0r0sik10l13qpct.lepiter ├── 3y9c2sib5ign8k4sbxv83clcx.lepiter ├── 3yg0hfqe84nbqtmmzt7eykt5l.lepiter ├── 3yg0hftz7nkon6m0bhtdgqxqd.lepiter ├── 3yos1evs4oakwzd8aftlcen7a.lepiter ├── 3yos1exl3ciunrw7sqxro0lvk.lepiter ├── 3yos1ey8ihjnjz25hqdezs824.lepiter ├── 3yos1f0t68ap0g5f3o25973x0.lepiter ├── 3zfbohxxqjqy3v6oiyg77dub8.lepiter ├── 3zie5cj8l2rk3yy76l866ei25.lepiter ├── 46b7n3mcbdy72ii1hqk594kdu.lepiter ├── 46b7n3nk2jqf46ebzjghzollt.lepiter ├── 46b7n3nzpxkz0ahj3ur0t9aew.lepiter ├── 46b7n3nzq8k61ixn7n91y7wzc.lepiter ├── 46b7n3o39dp0v3iebqawuwqmf.lepiter ├── 46b7n3rr75bevm3la4e3b33pr.lepiter ├── 46b7n3sa1i541kpfz7sjqh65y.lepiter ├── 46kmvr47kgm3d5j4jbwibt5yf.lepiter ├── 46kmvr6b6tpyz1rqrkidh4u5x.lepiter ├── 46kmvr7g21x98d9d6ebom9msy.lepiter ├── 46kmvr7gd8yp1wdrcubp0pb5u.lepiter ├── 46kmvr7nmugq0uvkdx26ds7s7.lepiter ├── 46kmvr9sttyxfxgbmmnlcglcz.lepiter ├── 46q0vxcbktxg7dsjwcda9p0v7.lepiter ├── 47070mv7d2ac6jepea7k140y2.lepiter ├── 4aq790szsyfdzurbbhyc4vkmh.lepiter ├── 4bh6zrqxcto0qmzwkgem1l26h.lepiter ├── 4bh6zrqz8cdqijqip8dkw3iyz.lepiter ├── 4bh6zrrpb7c8qyxz1x7al4i9e.lepiter ├── 4bh6zrt8nhuwf3p2x3vvbw5ke.lepiter ├── 4bh6zrwgxadl6bccu380jvs3t.lepiter ├── 4bh6zrx0rk9sh8ce3aq18sxlc.lepiter ├── 4bh6zrxorri0jh0vi3hvbmq5d.lepiter ├── 4euu2idytggau3b9bl5ukneip.lepiter ├── 4euu2ieaacl46jgxldyhxd8qz.lepiter ├── 4euu2iec81zu6gl2u355n2aaq.lepiter ├── 4euu2ifagwup9uohplf1is0ed.lepiter ├── 4euu2ifo6qmt44nrzfk2t074g.lepiter ├── 4ge19erg4k88qghwmoft3cc0r.lepiter ├── 4jvvq9oy7aa9y3074jus36yyj.lepiter ├── 4jvvq9s9h5b5w7328c8dg7ydj.lepiter ├── 4klije2w99qn98jr5n5akoels.lepiter ├── 4ksstjmve2o0qvgiy401mehda.lepiter ├── 4ksstjoshk5s1s4w9afkdc3hk.lepiter ├── 4kue9mzd2h8ts8j03aomskbrp.lepiter ├── 4lsasvmsw9es7f227ws9vybqa.lepiter ├── 4qir77wthvwk9srru19kexh8q.lepiter ├── 4qir783n2xm8xfl2pzz4wd75a.lepiter ├── 4qiu6w89837qvdkg8xmvmw4t2.lepiter ├── 4qiu6wcib34x8zny9lnsc82vz.lepiter ├── 4qiu6wdwt3q83ef2idikrcz47.lepiter ├── 4rnhhsqvjx7ufiwwq5azyx5gd.lepiter ├── 4s7idmjcl3mt7z5lr313r36dl.lepiter ├── 4st5drz1kkwhrui2r5hmf4s62.lepiter ├── 4ubz1k70ucugtd4iaw6gnx1uz.lepiter ├── 4ubz1k9tecqtp8chypakrmrje.lepiter ├── 4ubz1kav7lbj97ckttml6dk0q.lepiter ├── 4ubz1kdz23cam4ugh23orscuk.lepiter ├── 4uuqemuf9blcailwhb8prqc42.lepiter ├── 4wxxpytcck2hcz6byuqiactn8.lepiter ├── 4wxxpyxj2ow5qoyg5ntecmlmh.lepiter ├── 4wxxpyzgxbkgs8dtgrdfw3plf.lepiter ├── 4z7zcg56h66txeo5n1r3nbcas.lepiter ├── 4zfv1b6ujzwv1ukvjxkb2yep5.lepiter ├── 4zfv1bc6gqxy4x08qwpy710f8.lepiter ├── 4zfv1bcyj6if9010meqvdsfmq.lepiter ├── 52l14zcib8gv1kup9t33xhj3r.lepiter ├── 53lj109284d474rzn4qlisx0e.lepiter ├── 53lj10bndh3zmofj73vluqz2p.lepiter ├── 53lj10cpol7ee2fpyyjfzhs2o.lepiter ├── 53lj10cumhck8flzo567i0cuu.lepiter ├── 53lj10cvsjs59n50r3rygy0kd.lepiter ├── 53lj10d1cgi6bbto5y6w3uxrh.lepiter ├── 53lj10ds3cirb8yuvydudglcc.lepiter ├── 53lj10eqegdnqdo1ah8u69wxl.lepiter ├── 53lj10f3wdz11q2uyhiqfcjkv.lepiter ├── 55tigynyt97y2uk2a8dqxqyq4.lepiter ├── 55tigyr32o36sjgygtfit7ypq.lepiter ├── 56l3bwhs3bv3k6kmzq5fkzf72.lepiter ├── 59974yufobi35ulfz28la9htu.lepiter ├── 59974yuo2mb0j9sywl7bwowg3.lepiter ├── 59974yut6zdbo0rpx1wif9vkr.lepiter ├── 59974yw9w3xxsp820mv1tkdnc.lepiter ├── 59974yx7pkxgrrda7wh9mv6sc.lepiter ├── 59974yx9z0zjblylmb3o0m0sg.lepiter ├── 59974yxnj0txylwrjryp4uc1b.lepiter ├── 59974yy0qsek2ruxnz9ghp78g.lepiter ├── 59974yy5eqxx3drntpzjkmoit.lepiter ├── 59974yyx38w1jgov9kp63wtqf.lepiter ├── 59974yztvzadec0whbcsp3np5.lepiter ├── 5bx5wuvx4m0wcij2ik5f9mao.lepiter ├── 5cro10do8trrwp5vksdog63ji.lepiter ├── 5cro10iwsj8it6cvkif242lkh.lepiter ├── 5cro10j1ht4sfcd5rgi8sffjs.lepiter ├── 5cro10j3uqjajxk9r55lpl6f6.lepiter ├── 5e33a2306lazzhl2k7k13i716.lepiter ├── 5e33a25qsd1kyf6yqlbrej3g1.lepiter ├── 5e33a26nhfskjivba8wvzqs7s.lepiter ├── 5fx6lrmwbflol4kqacb5aukte.lepiter ├── 5k9x4i5hfq45ciejvkt3p05tx.lepiter ├── 5lqitzm6ugdi0tnasl4cb1wmu.lepiter ├── 5lw2wjefqnw6qokwfgjghsecb.lepiter ├── 5lw2wjhnolshqlzukbp22febe.lepiter ├── 5mxkpdy0fqi3yjgzqp34wclhu.lepiter ├── 5n6ozkrt00ww63gxl7yn8l3hc.lepiter ├── 5sy6u0e38hx6qr3dwqbds3ea0.lepiter ├── 5sy6u0ea8qii79jgdu3lnwyg0.lepiter ├── 5sy6u0f8hmf3ywmujers6no7q.lepiter ├── 5sy6u0gcoftwvt5k1dlp9r4ot.lepiter ├── 5vqqsthj11bx0jlp4ilx38mu1.lepiter ├── 5vqqstkrwpx6he6xsvn11axv5.lepiter ├── 5vqqstmcraoezn9ynl9r1532j.lepiter ├── 5vqqstnmfm3pywa3uoxykuu1a.lepiter ├── 5waea3zpwscnfe5p26degdjcg.lepiter ├── 5x4d5rl0l14cfz3f0j6jd8trw.lepiter ├── 5yafjnx0k0lkaggnyc9djyoqg.lepiter ├── 5z599zy5t433c3vgb7yvyqvjk.lepiter ├── 64llyut36jrc7chozc64fs9mb.lepiter ├── 65uz4exyytw1v4q8s779tjmp4.lepiter ├── 66e1y89n1t9njhkc1d8c9g9ng.lepiter ├── 69tiqg2foo7h4imkcuqhrnsmd.lepiter ├── 6a4niexwwx4g7g0orev3vtvfd.lepiter ├── 6dn0fvqgom1wst1al0jbhcoyn.lepiter ├── 6dn0fvubzt9wlcf61kfcabje2.lepiter ├── 6ft3b7fctb8j1xkl0tmh2itwa.lepiter ├── 6h3icwf26fev4i7s74u6jghm8.lepiter ├── 6iokxtuqjsdw014vuf11b3m3y.lepiter ├── 6iokxty6527f9t7ug454e7rjc.lepiter ├── 6iokxu03kp706xfjwe07p3jpm.lepiter ├── 6jnhav65j3nrg6wpvysz4locx.lepiter ├── 6jnhav6ypbrgsg35nj4z4k24i.lepiter ├── 6jnhav90r3dc2gr8j6esempn0.lepiter ├── 6jnhava2oqla86lg5kqu7t0vr.lepiter ├── 6jnhavaiy1r1smdayzj29bopu.lepiter ├── 6jnhavar8dbviuohu88jg36jv.lepiter ├── 6jnhavcbiybmgp63h90x35lbg.lepiter ├── 6jnhavcxo89fsyvjaqx1r9w20.lepiter ├── 6k5konofqz2tb197qgxroxvnk.lepiter ├── 6k5konpgkx1647v5b76tnhpx1.lepiter ├── 6k5konph19jt2x0pswiy06jq7.lepiter ├── 6k5konpjjknm9u90y4t6le5po.lepiter ├── 6k5konqi6zaag5grq59vhc523.lepiter ├── 6k5konridulf8yckc7fvc77q7.lepiter ├── 6k9vwu3tetn1h6a9j2wrmbx4r.lepiter ├── 6k9vwu3v9ulqda6sedtg9j4fv.lepiter ├── 6k9vwu4g8jugemcdx7vck524w.lepiter ├── 6k9vwu4iqoe6r1g3or2plhse3.lepiter ├── 6k9vwu4z1xfcc3nc0xh4mlpj1.lepiter ├── 6k9vwu53stveuu2focw41hvn7.lepiter ├── 6k9vwu5ktqx2n7kl2ql62ej4i.lepiter ├── 6k9vwu63py9gn8yya6bexch6m.lepiter ├── 6k9vwu789g7zsyfvhen1tsnte.lepiter ├── 6k9vwu7byk85xxaxrbk2082gi.lepiter ├── 6k9vwu7ps4419pwmg6faaxmei.lepiter ├── 6k9vwu84tuciijcnjmg1cx764.lepiter.links ├── 6k9vwu8lrdj1gz3h58sfc7vkj.lepiter ├── 6k9vwu9ae6zwmz3ff7fsbdkd4.lepiter ├── 6k9vwu9z1evtgk84ta3ptz3gg.lepiter ├── 6k9vwuaphdg8tb22b933y3zwq.lepiter ├── 6k9vwuau8psg5ghsgb64zriih.lepiter ├── 6k9vwuawlrxpq4g81a2nup8ik.lepiter ├── 6k9vwubemen05fcxg4kv6wi6b.lepiter ├── 6lcodb2a1g9eedqqu467kqr9m.lepiter ├── 6lzev4kkp2pcp4sip212xf3ft.lepiter ├── 6lzev4mpg6wofasdamdrnm4ix.lepiter ├── 6lzev4oudlu7hn56vkd5odpdu.lepiter ├── 6lzev4pilnzsq84czcex5x0mb.lepiter ├── 6n7q1ohdl0zevrwnmtksxr6b3.lepiter ├── 6oxnvjbf0f21qzoikb5dbr5dt.lepiter ├── 6pd0ugstbshikibtf97gb7hqd.lepiter ├── 6pd0uguf8xfgamzbuhcxr020s.lepiter ├── 6pd0ugyp8zmoi9r3k8mb8hgmc.lepiter ├── 6pd0ugz4tyqc7pirycqs8uu4j.lepiter ├── 6rkv2akoo02gml2kcy6u3j4mc.lepiter ├── 6rkv2am15mvctqf9bmpanfvmg.lepiter ├── 6rkv2ar4e5u042ur15m3qrymj.lepiter ├── 6rr6j549v9j1fwztgzd4dzwjs.lepiter ├── 6ru7ow67mgod48m04pub8jb2u.lepiter ├── 6w90xwxx2dpw62z09e7r14ig.lepiter ├── 6ys457ag1481f295y02kt9s3f.lepiter ├── 6zpcqog4adclo0n9k49xy014x.lepiter ├── 78o5rwapk6kg9wn8v0oiitetz.lepiter ├── 7by0suunpvdbms56pqnmk193l.lepiter ├── 7d4vgu684o7xflljmcwrs0yuw.lepiter ├── 7d4vgu6pbbibx6innh340lkdz.lepiter ├── 7d4vgu73hjq8fsi6s3wy8wqpt.lepiter ├── 7d4vgu7gbxcqjcvymru1vmyvt.lepiter ├── 7d4vgu9bsmkfixnqgju2kp5gd.lepiter ├── 7d4vgu9y24caixuew6dop4ql9.lepiter ├── 7d4vgualfthudtnd388rj9gdt.lepiter ├── 7d4vgub6oax0zxcslb4v9i7z1.lepiter ├── 7e7ubvun5yanlzkd2bfri55g4.lepiter ├── 7e7ubvvlixoctirfq89jndjns.lepiter ├── 7e7ubvyz4lznkit3mr1fu9u3r.lepiter ├── 7ed0nuwfqc5qp8b1b257cavgy.lepiter ├── 7fp6z0dgeikkpdotwg4d34ycd.lepiter ├── 7fp6z0hf8dnaq2yc2a0cbwnmt.lepiter ├── 7fp6z0igdtj9xayx8owjpt6cd.lepiter ├── 7fp6z0io90x40gujk5adlz94h.lepiter ├── 7fp6z0jub1kmadpjhfy3riv9b.lepiter ├── 7fuv1q2i2638xraf1s8q7ofng.lepiter ├── 7gj04bclw6nw29h8299pylw4t.lepiter ├── 7gkxhsrfoc11i8k03v35q7fhb.lepiter ├── 7id93cokun5y26q6orh7o8wf9.lepiter ├── 7km4y5q7c9mht3fplfbdv6vd4.lepiter ├── 7mfe0ftw0eakhrjuf13m3hdd6.lepiter ├── 7q9nhs42c92kpt5sdpjqw9l0y.lepiter ├── 7sex44bdh2hkio78lt6x4epta.lepiter ├── 7votnn1xw4o7tbulathhxh6gq.lepiter ├── 7votnn48ifppheqpa0wwv5zzn.lepiter ├── 7votnn4znwz8zu19voa9z1os6.lepiter ├── 7votnn8zgeg5sf5cnj3vjftya.lepiter ├── 7yd0r2khr4mmc7r5jc29cyr87.lepiter ├── 7z621ikatjzvygzgso1uc857v.lepiter ├── 83g93m258gqodktwpurtfn4l5.lepiter ├── 85tlqwkx87y3o3gry2try5ch8.lepiter ├── 86k0bv8k9z4ygikqwsjw9332o.lepiter ├── 86k0bv9zg05emsi592xc2razl.lepiter ├── 86k0bvahox0zcdqouxf7s3gwf.lepiter ├── 86k0bvap47m61362o14rukppy.lepiter ├── 89mq4s0mtsnhcc85fx3pjmw6d.lepiter ├── 8c0stpmwa8jg94a29i0qxebev.lepiter ├── 8dfq3h3jzgr9f6yu0huy7hnoo.lepiter ├── 8g4rhs61lcpn31ffomkp1er8v.lepiter ├── 8gq4sythwb8jl6tfay96smfyc.lepiter ├── 8kyed4w58s39o7318z62dtcmt.lepiter ├── 8mfse80r9si5ooyyyze9r5zeh.lepiter ├── 8mhol8qqkad6yfgn5m1uf8l8u.lepiter ├── 8mhol8tmu3yy4ymmvyf48gng1.lepiter ├── 8qnqnpn3al2pxj4s78ais9p0n.lepiter ├── 8uwft9jzt6z64ajvlm4coqb3p.lepiter ├── 8w0nfqczshj1njxes11wuazjj.lepiter ├── 8wee16q9ggwycg7qewnmv5cer.lepiter ├── 8zfamtw8pesvndb9qahoo0d88.lepiter ├── 91fxuudj8m1uingat2jucdjw3.lepiter ├── 92fulbdphhonsxzxyxig75thp.lepiter ├── 92fulbg3614x0k7ni0cbilkeo.lepiter ├── 93qk1qddng7mes72vhuafnpvk.lepiter ├── 94i4898osisv77xpzco65f9tq.lepiter ├── 94jgbip23xvy0f5mhx9bjayhu.lepiter ├── 95rw0drel0wsiu3gb4nce9sy8.lepiter ├── 966panyvk6ehshvkvql1z564w.lepiter ├── 96x9nk3j29c65ijug7f2p7iss.lepiter ├── 97w3j2asowqx7197d7gkaqjh9.lepiter ├── 98p0537dgjllrko3jqmdk8243.lepiter ├── 98p05389q8o71a8fh6zcaedac.lepiter ├── 98p0538aq1m8rxn2sqg7vztrq.lepiter ├── 98p0539szb7yufog2o59b7pf9.lepiter ├── 98p0539y74hzpnvu26phn74md.lepiter ├── 98p053cmtex18c4o3x60ujlgj.lepiter ├── 9buo5kiw8kjvfrpaxi8heqe3f.lepiter ├── 9buo5kotm456xgsqrbrq5xpq3.lepiter ├── 9cggvzati7qa66hkwfszifzrf.lepiter ├── 9cggvzcfp9xp0w4rj8fij99x4.lepiter ├── 9d6lee5i2gf3d8a22rvjcgodd.lepiter ├── 9ff1epb55os8fb4qe66ajoofm.lepiter ├── 9ff1epcvtd2rb3mu55xrxy8kk.lepiter ├── 9fv2iz73ic3ludfbi5mr97qgy.lepiter ├── 9gos3c5fbdmfh42xwodk1jxpk.lepiter ├── 9hoxueuufczpk99grl5hj37ld.lepiter ├── 9i3ul4zrcs9bde00lur7qdk6d.lepiter ├── 9iy8ihtv3046fcttg153ybg0y.lepiter ├── 9jkob03k21sbjujct0kh60016.lepiter ├── 9jkob0898tctthh5o3m23fv4e.lepiter ├── 9jkob08mw269cpxowmbe0ld8i.lepiter ├── 9jkob08ts9ihwg72kvyccl5ff.lepiter ├── 9l9jzpv3fi7enn31kvdsd9thn.lepiter ├── 9prkpxqvx3l2ox5foz1w6q4jc.lepiter ├── 9rpd5bxi9ai19d3ctknxhyvt6.lepiter ├── 9rx97vg8i7rq69hb5nprnhwgz.lepiter ├── 9vfnsj9gk6ac4j4iyoeezetud.lepiter ├── 9x2unsyac7r92r0p3bligpxyk.lepiter ├── 9x2unsydwidhl5bolmm4hvpy6.lepiter ├── 9y7jowdtdfxenw1klw6t4n39s.lepiter ├── 9y7jowgda5bkjzwesvsdg8aew.lepiter ├── a22i90200ku7n0jq4pymeupu6.lepiter ├── a3gqm0zppxlvxa8j47w6edbxl.lepiter ├── a3gqm107s3fzo3u96ofe50v56.lepiter ├── a6aidb24oznhlzvq9m62ygvat.lepiter ├── a6aidb2gkua1lcup6sf9so2qj.lepiter ├── a6rybg6oen349pdk6uf3vsipw.lepiter ├── a7sd39akm3z8a8pfohgm1urfk.lepiter ├── a8k1m5tp39p9a72reva62j5k0.lepiter ├── a8k1m5uwvz7lwjvvg8xvcjv3t.lepiter ├── aa5ltf2qqoepd1w2k7dhi82zt.lepiter ├── abcgwjyhd2e56v2lddmluww98.lepiter ├── abcgwjyqygdadpj0byd0p7hbq.lepiter ├── abcgwjyx9oczchnpn3cu0lllw.lepiter ├── agukn94e0ys4esfjpb0e9ahic.lepiter ├── agukn94pennj17018774htynn.lepiter ├── agukn94wd50pauy1p9z2y5qvi.lepiter ├── agukn96igfxap04i1wtqpejzt.lepiter ├── agukn97cuc4408kn3geny31cl.lepiter ├── agukn980fi16q69ihm2ac8ulc.lepiter ├── agukn98oq02fxrmdgckqn3faj.lepiter ├── agukn98q7lxi3kmat13d4mika.lepiter ├── agukn992dhln1i3hm9j9niijb.lepiter ├── agukn99nc1gkirn2b09bph1cs.lepiter ├── agukn99tssn73hg83d6eto0qx.lepiter ├── agukn9aiomo47o0nzkk5gnese.lepiter ├── agukn9bba3qkazgqhfy9sl1rj.lepiter ├── aii57ms12lx54uxi0nwggnb4h.lepiter ├── akzy87sfo25ew7howpf8depta.lepiter ├── amhrh1lwe8hr3h9uuqqpg89tc.lepiter ├── ancq0c8bsax2wxnegacwrkqhu.lepiter ├── ancq0caumtg9sngxwadj9w68e.lepiter ├── anv18ehrtqb2k1v7gyg0khn8b.lepiter ├── aoisxyi4qtrf1q2378evsjf67.lepiter ├── ar6rcvi1jjyzi9uwupvkn5gfk.lepiter ├── ar6rcvkeohz5iwuvkgt88gace.lepiter ├── atrf93k8ydb1rz7lnv7sdehx8.lepiter ├── attachments │ ├── 33b00u9tl2hl3yvhc0g3ehjzl │ │ ├── 06-model-extensions.ombu │ │ └── lepiter_attachment.properties │ ├── 33b00u9w2lb91jxs4ko45o0al │ │ ├── 48-game-animation-stop.ombu │ │ └── lepiter_attachment.properties │ ├── 33b00uc2acin52b70wx8yy38i │ │ ├── 27-card-element-disappear.ombu │ │ └── lepiter_attachment.properties │ ├── 33b00uc30ye0bdbz5qmvw9xou │ │ ├── 47-game-animation-shrinking.ombu │ │ └── lepiter_attachment.properties │ ├── 33b00ucoy75wob7qnlie0xv6j │ │ ├── 24-card-element-show-face.ombu │ │ └── lepiter_attachment.properties │ ├── 33b00ucxbjmagdcc647kv2gkn │ │ ├── 04-card-notifications.ombu │ │ └── lepiter_attachment.properties │ ├── 33b00ud9t988kge8ujps1d7b3 │ │ ├── 72-raw-card-element-disappear.ombu │ │ └── lepiter_attachment.properties │ ├── 33b00udcq5wgae6mtmlzsrswh │ │ ├── 26-card-element-hooks.ombu │ │ └── lepiter_attachment.properties │ ├── 33b00udv13u4zzjy227rzzeju │ │ ├── 25-card-element-layout.ombu │ │ └── lepiter_attachment.properties │ ├── 33b00uea1639nji6zmat08k6k │ │ ├── 71-raw-card-element-hooks.ombu │ │ └── lepiter_attachment.properties │ ├── 33b00uety8xqxk1f50d8cqqb1 │ │ ├── 41-board-element-bloc-card.ombu │ │ └── lepiter_attachment.properties │ ├── 33b00ufwxit6hm0o3g6nugudt │ │ ├── 46-game-animation-mouse-enter.ombu │ │ └── lepiter_attachment.properties │ ├── 33b00uh90evkjrm8mm2khz68h │ │ ├── 41-card-element-basic-methods.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj109g60ki9fpc4fdrsky0n │ │ ├── 44-event-listener-methods.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10a485h76pvd64v43gt7s │ │ ├── 40-card-element-class.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10a6a9gxjqqhy98usd5k0 │ │ ├── 03-card-actions.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10aemfhbfhu5j57aqfiyl │ │ ├── 68-raw-card-element-face.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10aqxo31ipsjm4w4snk1q │ │ ├── 21-card-element-basic-methods.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10aumvwvm5veetu2y31ae │ │ ├── 22-card-element-back.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10avqdx0fu1ngyug4przx │ │ ├── 67-raw-card-element-refactoring.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10b11sa32u43jn7ylsxrl │ │ ├── lepiter_attachment.properties │ │ └── memoryExample0.png │ ├── 53lj10b7h4e1kl33xb8lyk4fs │ │ ├── 60-raw-card-element-class.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10bafr0coy9piwx496k17 │ │ ├── 05-game-class.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10bb6hrtha3a2cxxn6qo7 │ │ ├── 65-raw-card-element-clipped-line.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10bcp6ol1j4r6mtjdovaw │ │ ├── 43-event-listener.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10bfckbh7tmagp3h5vm0s │ │ ├── 07-game-instantiations.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10c2dsm3avnzwdof43kta │ │ ├── 61-raw-card-element-basic-methods.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10cbtr0cdpoqbrf50hnly │ │ ├── 64-raw-card-element-cross-line.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10chqkdlhnd2cvjpi5y0q │ │ ├── 69-raw-card-element-face-align-horizontally.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10cqpssqr2g4cgcx01i4m │ │ ├── 06-game-basic-methods.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10cvaww0kiuvcfiu5c54n │ │ ├── 01-card-class.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10deqfihmxxt5mk481lmf │ │ ├── 08-game-logic.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10e21tleq1azp9psxlq1c │ │ ├── 07-game-initialization.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10eg6ucgcr4rzv0x3o398 │ │ ├── 20-card-element-class.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10etg4axc88y5d4zjdfp0 │ │ ├── 63-raw-card-element-rounded-shape.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10f1v0ejnv9hp4m958pda │ │ ├── 66-raw-card-element-both-lines.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10f35hkjpo0xsj038eejw │ │ ├── 23-card-element-face.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10fdbkq761fklc2928xt8 │ │ ├── 70-raw-card-element-face-centered.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10fznqo2indw073wbzq96 │ │ ├── lepiter_attachment.properties │ │ └── memoryExample1.png │ ├── 53lj10fzsr8eh2fwmc4gd6m8n │ │ ├── 45-game-register-listener.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10g4ru4bsf7qqpkst3v92 │ │ ├── 62-raw-card-element-basic-shape.ombu │ │ └── lepiter_attachment.properties │ ├── 53lj10g96eusgoqvwwauy55yr │ │ ├── 02-card-basic-methods.ombu │ │ └── lepiter_attachment.properties │ ├── 5mnyduoknx6cbphrs4az64w4c │ │ ├── 2024-08-20_14-07-43_BlElement-497029120.png │ │ └── lepiter_attachment.properties │ ├── 5mnyduq8sog60mq6gx1x55bkq │ │ ├── 2024-08-20_16-16-43_BlElement-497029120.png │ │ └── lepiter_attachment.properties │ ├── 5mnydus2v04s36eqv3ok2xb5q │ │ ├── 2024-08-20_14-10-15_BlElement-497029120.png │ │ └── lepiter_attachment.properties │ ├── 5mnydutjg4n9lrfh1ze3r20sz │ │ ├── 2024-08-20_16-17-31_BlElement-497029120.png │ │ └── lepiter_attachment.properties │ ├── 6cwa84k7r7y7dczvcu0zu8mhg │ │ ├── StackMachineClassDef.ombu │ │ └── lepiter_attachment.properties │ ├── 6cwa84lsqn79lutyqakczdr98 │ │ ├── emptyEg.ombu │ │ └── lepiter_attachment.properties │ ├── 6cwa84m50iztzyf9cs9oaoewd │ │ ├── lepiter_attachment.properties │ │ └── push1and2.ombu │ ├── 6cwa84mwgxyo47gi61z5htr3l │ │ ├── lepiter_attachment.properties │ │ └── popMethod.ombu │ ├── 6cwa84n2xiag9qkg35qrvnsqv │ │ ├── addMethod.ombu │ │ └── lepiter_attachment.properties │ ├── 6cwa84nq27sxcbculams0d39v │ │ ├── initializeMethod.ombu │ │ └── lepiter_attachment.properties │ ├── 6cwa84o8r539bxkza5t1zkchn │ │ ├── lepiter_attachment.properties │ │ └── pushMethod.ombu │ ├── 7d4vgu8428d5zekyjgbq9pbmw │ │ ├── 1zgarrgwhn7x1a7sfn5ksnbb4.png │ │ └── lepiter_attachment.properties │ ├── 7d4vgu929lrzz3flebimm9ebo │ │ ├── 1zgarrhnnky9l2usbltt8c4ef-1.png │ │ └── lepiter_attachment.properties │ ├── 7d4vgub855ra25t76uvvsq3gd │ │ ├── explainable-systems-tool-centered-decisions.png │ │ └── lepiter_attachment.properties │ ├── 7d4vgubkw1qj64gxh6tj0hn0w │ │ ├── explainable-systems-manual-decisions.png │ │ └── lepiter_attachment.properties │ ├── 82u1ehv9oec7k7jm8sl2bx9nm │ │ ├── lepiter_attachment.properties │ │ └── moldableStackCode.png │ ├── 96x9njz7aqd0qux2ntb7fe2ly │ │ ├── Screenshot 2024-08-05 at 13.29.51.png │ │ └── lepiter_attachment.properties │ ├── 9f74peaib7svljexyje0dg65w │ │ ├── drillerShortcuts.png │ │ └── lepiter_attachment.properties │ ├── 9f74pebexvoxrlpfdfug4u93g │ │ ├── drillerShortcuts2.png │ │ └── lepiter_attachment.properties │ ├── aoisxyipgyz7vgv8ixzqls579 │ │ ├── lepiter_attachment.properties │ │ └── squarified-treemap-paper-algorithm-example.png │ ├── aoisxyiybi07utq6jplxvps7t │ │ ├── lepiter_attachment.properties │ │ └── squarified-treemap-paper.png │ ├── b8yxhb30alr4xe23zd4sfnj4g │ │ ├── Screenshot 2023-02-26 at 13.04.25.png │ │ └── lepiter_attachment.properties │ ├── b8yxhb7z770mhdyhzqjvbwf6s │ │ ├── Screenshot 2023-01-18 at 18.34.47.png │ │ └── lepiter_attachment.properties │ ├── b9bjkparkgamd2hx6fgoqou5s │ │ ├── Screenshot 2024-07-31 at 17.45.30.png │ │ └── lepiter_attachment.properties │ ├── b9bjkpdk62gwp20uawtzf7hje │ │ ├── Screenshot 2024-07-31 at 17.45.16.png │ │ └── lepiter_attachment.properties │ ├── ch5f758npqdcbtxa2mgjp7dg1 │ │ ├── Jumble.ombu │ │ └── lepiter_attachment.properties │ ├── ch5f75cn4oxr76qmexc63kphv │ │ ├── Jumble-unjumble.ombu │ │ └── lepiter_attachment.properties │ ├── ch5f75d7lerqbfyatwduoj1cv │ │ ├── Jumble-initialize.ombu │ │ └── lepiter_attachment.properties │ ├── ch5f75dffhfuwj9g6g55h2ag0 │ │ ├── Jumble-comment.ombu │ │ └── lepiter_attachment.properties │ ├── dglzwjebdk4z3wivfvuj49a1y │ │ ├── lazy-unJumble.ombu │ │ └── lepiter_attachment.properties │ ├── dglzwjfa6khaam5y6goo08e7a │ │ ├── lepiter_attachment.properties │ │ └── wordDict-accessor.ombu │ ├── dglzwjfeaym7z9ys26chofh4b │ │ ├── altUrl.ombu │ │ └── lepiter_attachment.properties │ ├── dglzwjgbhuci690kdcst2tskw │ │ ├── from-class-side.ombu │ │ └── lepiter_attachment.properties │ ├── dglzwjghvvz4el2t7c0fcmtim │ │ ├── defaultExample.ombu │ │ └── lepiter_attachment.properties │ ├── dglzwjh8sx87lnccwc1yw4is3 │ │ ├── lepiter_attachment.properties │ │ └── wordListUrlSlot.ombu │ ├── dglzwji5fpcpvvl9jy3p77djc │ │ ├── altExmaple.ombu │ │ └── lepiter_attachment.properties │ ├── dglzwjis4sht2v0zx458locxd │ │ ├── defaultUrl.ombu │ │ └── lepiter_attachment.properties │ ├── dglzwjji54qdx95rx752vmr2d │ │ ├── lepiter_attachment.properties │ │ └── wordlistUrl.ombu │ ├── dglzwjkflu8133mrveziefbx0 │ │ ├── initialize-v2.ombu │ │ └── lepiter_attachment.properties │ ├── dglzwjktqpva9le6jzn8opo4s │ │ ├── lepiter_attachment.properties │ │ └── lineSeparatorFor.ombu │ ├── dglzwjlny63kppnbvq1vr9o4q │ │ ├── initializeWordDict.ombu │ │ └── lepiter_attachment.properties │ ├── e5aw309k6cdtf01bnt9g6pivc │ │ ├── lepiter_attachment.properties │ │ └── word-snippet-explanation.json │ ├── e5f5x587uudwtw0jt7nt8jr3a │ │ ├── craft-3.png │ │ └── lepiter_attachment.properties │ ├── e5f5x58aq6a4z5wjthxjtez0r │ │ ├── lepiter_attachment.properties │ │ └── roles-1.png │ ├── e5f5x58lhdajsu9j7xajpb3q7 │ │ ├── 50percent-3.png │ │ └── lepiter_attachment.properties │ ├── e5f5x5bifz9x8au48ylb60vcf │ │ ├── craft-1.png │ │ └── lepiter_attachment.properties │ ├── e5f5x5buneizrudd5ukf31s5h │ │ ├── 50percent-2.png │ │ └── lepiter_attachment.properties │ ├── e5f5x5f49a24o7gl93sfldz2q │ │ ├── lepiter_attachment.properties │ │ └── roles-2.png │ ├── ejn67l4404msqbgqo9fx8e7h8 │ │ ├── beacon.png │ │ └── lepiter_attachment.properties │ ├── f4t6d71n0g0eg7ardoshp1qdz │ │ ├── initialize-v2.ombu │ │ └── lepiter_attachment.properties │ ├── f4t6d72fr191tyiet1p5jmmit │ │ ├── jumble-v1.ombu │ │ └── lepiter_attachment.properties │ ├── in4er2pj2nlkeh35eiynzdjr │ │ ├── Screenshot 2024-04-25 at 15.12.02.png │ │ └── lepiter_attachment.properties │ ├── in4er320391qcvxfo3dy5woj │ │ ├── Screenshot 2024-04-25 at 14.48.35.png │ │ └── lepiter_attachment.properties │ ├── in4er32qtqimmgmt3h96vxcw │ │ ├── Screenshot 2024-04-25 at 14.49.10.png │ │ └── lepiter_attachment.properties │ ├── in4er72kcsvtzi3y99zhpvc4 │ │ ├── Screenshot 2024-04-25 at 14.37.05.png │ │ └── lepiter_attachment.properties │ ├── in4er8uzqaely1wxcs12xw50 │ │ ├── Screenshot 2024-04-25 at 14.49.10.png │ │ └── lepiter_attachment.properties │ ├── wmr9gf8jawfdh9evdtxd43zc │ │ ├── 03-fileContents-fileReference.ombu │ │ └── lepiter_attachment.properties │ ├── wmr9gfe7ldhz85kjtc69flma │ │ ├── 01-createFileOnDisk.ombu │ │ └── lepiter_attachment.properties │ ├── wmr9gg6hbu0o0xsewqxmqyym │ │ ├── 02-createFileOnDisk.ombu │ │ └── lepiter_attachment.properties │ ├── wmr9gge1jtpvks3c86hclxhc │ │ ├── 05-afterFileOnDisk.ombu │ │ └── lepiter_attachment.properties │ ├── wmr9gjypb0lddthyi8bxryz4 │ │ ├── 06-fileOnDiskAssertions.ombu │ │ └── lepiter_attachment.properties │ └── wmr9gldn7910fu1hk8b2f99h │ │ ├── 04-fileOnDisk.ombu │ │ └── lepiter_attachment.properties ├── av4xhcbk1obnri140f6hp2ytx.lepiter ├── axvukgjgeq1l173t4e7xvxcj5.lepiter ├── axvukgjrupk9agbu11ovaksff.lepiter ├── aycffrxx4vtysvd550zfiltq.lepiter ├── azcv43snde4g78djp2y31vu9w.lepiter ├── b5eofxmxvjk1suuoqfev59012.lepiter ├── b5eofxoc1k6oxwd8surhr6zho.lepiter ├── b7orhscgmczdqyatb6u3wgae.lepiter ├── b85ad063dfi0t1qwqmshblgjy.lepiter ├── b85ad06jfk8gmhvjj8q7poyfc.lepiter ├── b8jzw94rycyasxdw3z40wxms5.lepiter ├── b8m0n42up23jct336lovwtt0y.lepiter ├── b8yxhb1599idviq6g7oz8m9xm.lepiter ├── b8yxhb1wkrcpczldbagj5plya.lepiter ├── b8yxhb2g48gene8jdbcdlyu2l.lepiter ├── b8yxhb3kqh1e4phjhuuoaxmpz.lepiter ├── b8yxhb3y5t5jwwn9oswut0eo9.lepiter ├── b8yxhb593vdd4bso5pjevf1ve.lepiter ├── b8yxhb6peu0e72g58pe2gt6hd.lepiter ├── b8yxhb6qs6bw3ezid09jw8o6l.lepiter ├── b8yxhb88ga10dtny2algiqw68.lepiter ├── b9bjkpcuuvho4x5m27lppqrs6.lepiter ├── b9yla2jh79hcwqxg23m2rinn2.lepiter ├── bc98iv99o6h70ov8cs8ogzri5.lepiter ├── bc98ivggncplju7uyq9ee1dgg.lepiter ├── bcjkcdzqa1sfxsvqlndjhkqgo.lepiter ├── bcjkce0bapzsufgx913fbqmm8.lepiter ├── bfbaaxjyp9t1ktuetlgm8okxb.lepiter ├── bgas2p0ympychcyl4u3d8epfx.lepiter ├── bil0neob5vvhqlgh5y1ezxmu8.lepiter ├── bil0neqdlu0gcrvjszp5lsx88.lepiter ├── bil0ner8gns6klsdtyixi0wm0.lepiter ├── bint1xb0a9w9smvfjprd9830.lepiter ├── bl69wxy2xhznj8r1x4lv16y0a.lepiter ├── blf8mw2xkv6clhlhs65v6ioa8.lepiter ├── bliie6oqqvw3frin9ugcff9as.lepiter ├── bovgk7k60j179f0wcw8cfw3be.lepiter ├── btty1obm80nk9votoodjfap40.lepiter ├── bu1ezilcusk55cvte5fl24rxh.lepiter ├── bvb2ri7pvcu978atpsaxn19oe.lepiter ├── c1oq2lqkk2jcqndxezukpkynv.lepiter ├── c2cmwhno84sh3d254jhhgiy7.lepiter ├── c2jtx4xpu7mw3ou0vixt6b08k.lepiter ├── c5ababo1kkxbrquuxvi6etvuw.lepiter ├── c5ababr6wo8de5xm64ambu2yz.lepiter ├── caskangdjwh15y6a0m8dry56h.lepiter ├── cay17h1o5eje22rmcx9jmrr46.lepiter ├── ccbj3mff3i0eswfzhuujsvkvj.lepiter ├── ccbj3mfn104kttomd41qpwzm5.lepiter ├── ccbj3mhyi0tf8ak6oatgd4cro.lepiter ├── ccbj3mj7d3icr5ca77pk8svxk.lepiter ├── ccbj3mknxmhowl419y97pxaxg.lepiter ├── ccbj3mlms3p9q96edlho6tr32.lepiter ├── ccbj3mltiyqzyz7ihe2r5ffhy.lepiter ├── cdapm8ms75w23v5wtlv6hdbyb.lepiter ├── cdv36qads5tcwm0303t5hfzrv.lepiter ├── cdv36qd0zjxd97w8tofun7jyn.lepiter ├── cec4jwy2f4uzyih17eze50nev.lepiter ├── cec4jwzuif80mhso8ygsq8uls.lepiter ├── cec4jx37yavl9b6bgv82468pl.lepiter ├── cfmh5j5gjn541v2z7yslypurv.lepiter ├── chl2pef6fj6rozo8k0x2fyj96.lepiter ├── chl2pegg5ub0muatblglkdken.lepiter ├── clc27rdwpdzw8aqjsw90z7251.lepiter ├── clc27rj7c9ka7kewlyrbm2gvq.lepiter ├── cp57zrzerlkqvah5lmjqwnvvn.lepiter ├── cp6r1dwf4lqos42akw30tc83b.lepiter ├── cp6r1e2zthd4kid6ermkk37zc.lepiter ├── cpb7a4k73r4ebym8pp3kovx1i.lepiter ├── cqa9o3cki8c9lc3leyg5ohfu8.lepiter ├── cu29w2srkb3162fqyuqdtesog.lepiter ├── cvdib7y69u7ow8uo6x5zvu5ah.lepiter ├── d10xp3uuuk6y4rgmzaykgerif.lepiter ├── d10xp3xv0n1yn40kx87qhe9i1.lepiter ├── d44mtgb6jzpvc9khii80twwmv.lepiter ├── d44mtgf9e4sj8netjd3w4js6c.lepiter ├── daq9cy3g4s4gnztabwj0s1ev1.lepiter ├── dczep3o5r2stcj9ohe10k3o7o.lepiter ├── ddxd4pjfjsjbx0elhfaetwhkw.lepiter ├── ddxd4pkbrfwt1rbysqwl9z4bb.lepiter ├── debcmbbci2vj1zifto98jq1l1.lepiter ├── debcmbd5l7ambl0v769ybohjj.lepiter ├── defuf5iv1o49xfbvy5b5s4312.lepiter ├── dgu118jebqvw22tnvmzu1uyll.lepiter ├── didtmu3iiwxy35mpg1sh8aac3.lepiter ├── djrnr1mkieq0uwr3ys0g2xugz.lepiter ├── dngtieil67n9epjdrfqeqiqnh.lepiter ├── dohelsn2z3njr35gerumvj5ns.lepiter ├── doxnowbismpd7vgvml4d1jikn.lepiter ├── drgnm0hpphkqt0htlq4n3zbp6.lepiter ├── drgnm0j80kxg0c2hk9smy4cgs.lepiter ├── drgnm0jvlm5by5g8ckuqq8n7n.lepiter ├── drtl1hzqmcclc7oyod504skiz.lepiter ├── drtl1i4t81yoy6khen6r6bjhf.lepiter ├── dxetm1cbkxiesxqm77sy347sg.lepiter ├── dyquv19x8xwi85g99n0akc5lu.lepiter ├── dyquv1ad359wsnwasp6hwkgcj.lepiter ├── dyquv1b6xptl2c0ayhgb376bw.lepiter ├── dyquv1bb9krkve76ncq4kyxr7.lepiter ├── dyvymh09bdxh16sl4izn3zvo2.lepiter ├── dzu6ky2fgfgeefm4uiqjv91p4.lepiter ├── e14m3b0zi8ufl36p7u4w55zxk.lepiter ├── e16nohaeyoucnx1tznn39aw59.lepiter ├── e22u6a6st8z47omn6nhffw9vf.lepiter ├── e22u6ad2wg799ml3w6pxo9wmn.lepiter ├── e4x65txxff1uqf8w3g5af4zo8.lepiter ├── e4x65ty4hum90c23k84sgws1y.lepiter ├── e59vbxrp6b9zl0g5kqio3ahul.lepiter ├── e5aw30djc0oyppnc0xoxrd2wj.lepiter ├── e8ec88yyvnt9fb7o59omb5q07.lepiter ├── e8s1xs0i202xtuk475gslhocj.lepiter ├── ejjye38i0hbh2yzzzmhactrje.lepiter ├── ejn67l0sdt6csob78xjfb8kf4.lepiter ├── ejn67l1cykgfjrl9aklgriubv.lepiter ├── ejn67l21pdj93oyrinnqj9c7b.lepiter ├── ejn67l5cdqh83kegi9umt1mdd.lepiter ├── emk0e457pwudb404o7b5q5h76.lepiter ├── emk0e482yx1e8g1mvhtu3pyp6.lepiter ├── ems7ud91vjf7kjsd1d107odmo.lepiter ├── etmq5izsftmu1xnucux2g6bxm.lepiter ├── etmq5j2mu4y912h0c6x4h0z75.lepiter ├── etmq5j46471mqbagawov662m3.lepiter ├── etmq5j4mvm1dii0k1edryowqs.lepiter ├── evkv84au8b505w3whpaf0h7u0.lepiter ├── evkv84bc1s1z6y6cxcr369m6z.lepiter ├── evkv84bc38gb10d81c7ja2pn1.lepiter ├── evkv84ecrzkeptlaux3fuvu0m.lepiter ├── evkv84i9ok9xtnh6xmc40jcbn.lepiter ├── ezdlj9kgtbq8nf3pyxm88a9ho.lepiter ├── ezsfshhfr342s3n8jpj9koe2p.lepiter ├── f1cg9v1geb7xhc6vp2166tvj3.lepiter ├── f29kp5mghu1myawqb0nn2ky9y.lepiter ├── f3bfov44m22ijwe47j04zw2uf.lepiter ├── gmpnoytigqv2tzrnz78szvi2.lepiter ├── gmpnp39fu1m51p5hxn21czxe.lepiter ├── h61mr5u72yq7p21y0sfvo4ds.lepiter ├── in4er34nl4yw683h4m2x7he1.lepiter ├── iyz9w9nweg5uh35m7e8iy3nq.lepiter ├── l5922eybmo7t8xtdgnhvc54p.lepiter ├── lepiter.properties ├── lor2271nbpvdqfx46d0prlk2.lepiter ├── n3u261phzkdmva6yh47tv1kl.lepiter ├── o6ovnaw9ztv9mkvhqf4x8r1d.lepiter ├── o6ovnchb7cuc99ieix2ir71w.lepiter ├── o6ovndroqlv0vdcpn41i8e55.lepiter ├── o6ovndwk8u4cqyp6oid3g6e6.lepiter ├── o6ovneqbelldt9qrhrpybg2v.lepiter ├── o6ovnf9m7lgncj82xugu41vv.lepiter ├── oevv51bh05vtux6sygbde0i5.lepiter ├── thkwsqhgx7ewtetews49up2f.lepiter ├── vuflnrgp5r5o4m1szatoo4e2.lepiter ├── w8wtzvpidrxybd3b6yxf75jg.lepiter ├── w9fc31ubksh9va7i1516z5mt.lepiter ├── w9fc32wacolgivzf8432v4zz.lepiter ├── w9fc339jue7p4kmxoj291a5w.lepiter ├── w9fc35g3r6id437bc5voex1p.lepiter ├── w9fc36kn78l09l8tc9jf2qcn.lepiter ├── w9fc37am75ozp0rrdb5xftjo.lepiter ├── wmr9ggp9fan2j19g4z4crz0m.lepiter ├── wmr9ggr7z90661iumlo7sa5n.lepiter ├── wmr9gimw6g205bh5a1hacnoh.lepiter ├── wmr9git8h1d67ml29i49j9mc.lepiter └── wmr9gjuyxj7wd3k59ufn9736.lepiter ├── scripts ├── build │ ├── parallelsmoke │ │ └── lnx_2_2_smoke.sh │ ├── update-latest-links.sh │ └── upload.sh ├── docker │ └── gtoolkit │ │ ├── Dockerfile │ │ ├── README.md │ │ └── docker-image │ │ └── run.st ├── localbuild │ ├── linux.sh │ ├── mac.sh │ └── windows.ps1 ├── rollback │ ├── Jenkinsfile │ └── rollback.sh └── user │ └── gt_check_libs.sh └── src ├── .gitignore ├── .properties ├── BaselineOfGToolkit ├── BaselineOfGToolkit.class.st └── package.st ├── BaselineOfGToolkitForPharo9 ├── BaselineOfGToolkitForPharo9.class.st └── package.st ├── BaselineOfGToolkitMorphic ├── BaselineOfGToolkitMorphic.class.st └── package.st ├── BaselineOfGToolkitPharo6Compatibility ├── BaselineOfGToolkitPharo6Compatibility.class.st └── package.st ├── BaselineOfGToolkitPrerequisites ├── BaselineOfGToolkitPrerequisites.class.st ├── CompiledMethod.extension.st └── package.st ├── BaselineOfGToolkitTranscript ├── BaselineOfGToolkitTranscript.class.st └── package.st ├── GToolkit-Morphic ├── AbstractWorldRenderer.extension.st ├── BlGlutinHost.extension.st ├── BlHost.extension.st ├── BlWinitHost.extension.st └── package.st ├── GToolkit-Pharo6Compatibility ├── AbstractFileReference.extension.st ├── FileHandle.extension.st ├── FileLocator.extension.st ├── FileReference.extension.st ├── FileSystem.extension.st ├── FileSystemHandle.extension.st ├── MemoryFileSystemFile.extension.st ├── MemoryFileWriteStream.class.st ├── MemoryHandle.extension.st ├── ZnPositionableReadStream.extension.st └── package.st ├── GToolkit-PharoBasePatch-Deprecations ├── BlockClosure.extension.st ├── Class.extension.st ├── RBProgramNode.extension.st ├── RBVariableNode.extension.st └── package.st ├── GToolkit-PharoBasePatch-Extensions ├── CompiledMethod.extension.st ├── OpalCompiler.extension.st ├── RGMethodDefinition.extension.st ├── RPackageOrganizer.extension.st └── package.st ├── GToolkit-PharoBasePatch-ForPharo12 ├── UUID.extension.st └── package.st ├── GToolkit-PharoBasePatch-Iceberg ├── IceClassDefinition.extension.st ├── MCPatcher.extension.st └── package.st ├── GToolkit-PharoBasePatch-PharoIndex ├── GtReflectiveMethodInstalled.class.st └── package.st ├── GToolkit-PharoBasePatch-StrictSymbol-Overrides ├── AbstractLayoutScope.extension.st ├── Categorizer.extension.st ├── ChangeSet.extension.st ├── ClassDescription.extension.st ├── CompiledMethod.extension.st ├── FFICallout.extension.st ├── FFIConstantArgument.extension.st ├── FFIFunctionParser.extension.st ├── FFIInferenceResolutionMode.extension.st ├── IRMethod.extension.st ├── IceBasicProject.extension.st ├── IceCommit.extension.st ├── IceMethodDefinition.extension.st ├── IceNode.extension.st ├── IceRepositoryProperties.extension.st ├── IceSshCredentials.extension.st ├── IceWorkingCopy.extension.st ├── MCPackage.extension.st ├── MCPackageManager.extension.st ├── MCTraitDefinition.extension.st ├── MetacelloAbstractPackageSpec.extension.st ├── MetacelloMemberListSpec.extension.st ├── MetacelloPackagesSpec.extension.st ├── MetacelloProjectRegistry.extension.st ├── OCAbstractMethodScope.extension.st ├── PointerLayout.extension.st ├── ProtocolOrganizer.extension.st ├── RBAbstractVariablesRefactoring.extension.st ├── RBClass.extension.st ├── RBInlineMethodRefactoring.extension.st ├── RBKeywordToken.extension.st ├── RBMethod.extension.st ├── RBMoveMethodRefactoring.extension.st ├── RBSequenceNode.extension.st ├── RBVariableNode.extension.st ├── RPackageOrganizer.extension.st ├── RxParser.extension.st ├── STONWriter.extension.st ├── SessionCategory.extension.st ├── Slot.extension.st ├── SourceFileArray.extension.st ├── SpStyleSTONReader.extension.st ├── String.extension.st ├── TonelParser.extension.st ├── TonelReader.extension.st └── package.st ├── GToolkit-PharoBasePatch-StrictSymbol ├── Array.extension.st ├── Bag.extension.st ├── Collection.extension.st ├── GtStringContentDictionary.class.st ├── GtStringContentOrderedDictionary.class.st ├── GtStringContentSet.class.st ├── GtStringContentWeakSet.class.st ├── LinkedList.extension.st ├── Object.extension.st ├── RunArray.extension.st ├── SequenceableCollection.extension.st ├── String.extension.st ├── Symbol.extension.st ├── Text.extension.st └── package.st ├── GToolkit-PharoBasePatch-Subscriptions ├── FastSubscriptionRegistry.class.st ├── FastSubscriptionRegistryExamples.class.st ├── MethodAnnouncement.extension.st └── package.st ├── GToolkit-PharoOverrides-Debugger ├── BlBlocUIManager.extension.st ├── OupsDebuggerSystem.extension.st └── package.st ├── GToolkit-SystemInfo ├── GtVersionInfo.class.st └── package.st └── GToolkit-Transcript ├── GtTranscript.class.st ├── GtTranscriptAnnouncement.class.st ├── GtTranscriptDeleteAllAnnouncement.class.st ├── GtTranscriptDeleteAllTaskAction.class.st ├── GtTranscriptElement.class.st ├── GtTranscriptExamples.class.st ├── GtTranscriptInsertStringAnnouncement.class.st ├── GtTranscriptInsertStringTaskAction.class.st ├── GtTranscriptNextBuilder.class.st ├── GtTranscriptTextTaskAction.class.st └── package.st /.gitattributes: -------------------------------------------------------------------------------- 1 | # Bash needs lf even on windows/cygwin 2 | *.st eol=lf 3 | *.sh eol=lf 4 | 5 | # st files are always text, even if they contain invalid encoded chars 6 | *.st text diff 7 | 8 | # GitHub is unable to properly detect Smalltalk code, so help it a bit 9 | *.st linguist-language=Smalltalk 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.bak 2 | scripts/localbuild/glamoroustoolkit 3 | scripts/localbuild-pharo8/glamoroustoolkit 4 | scripts/localbuild-pharo9/glamoroustoolkit 5 | lib 6 | *.iml 7 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | { 2 | 'srcDirectory' : 'src' 3 | } -------------------------------------------------------------------------------- /CITATION.cff: -------------------------------------------------------------------------------- 1 | cff-version: 1.2.0 2 | message: "If you use this software, please cite it as below." 3 | authors: 4 | - name: "feenk.com" 5 | title: "Glamorous Toolkit" 6 | version: 1.0 7 | repository-code: "https://github.com/feenkcom/gtoolkit" 8 | url: "https://gtoolkit.com" 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017-2025 feenk gmbh 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /doc/feenk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/doc/feenk.png -------------------------------------------------------------------------------- /doc/gtoolkit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/doc/gtoolkit.png -------------------------------------------------------------------------------- /feenk-releaser.version: -------------------------------------------------------------------------------- 1 | v0.14.0 2 | -------------------------------------------------------------------------------- /github_deploy_key.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/github_deploy_key.enc -------------------------------------------------------------------------------- /gtoolkit-builder.version: -------------------------------------------------------------------------------- 1 | v0.172.0 2 | -------------------------------------------------------------------------------- /gtoolkit-vm.version: -------------------------------------------------------------------------------- 1 | latest-release 2 | -------------------------------------------------------------------------------- /lepiter/26emqdaptgodnr9hnob35645v.lepiter: -------------------------------------------------------------------------------- 1 | { 2 | "__schema" : "4.1", 3 | "__type" : "page", 4 | "children" : { 5 | "__type" : "snippets", 6 | "items" : [ 7 | { 8 | "__type" : "textSnippet", 9 | "children" : { 10 | "__type" : "snippets", 11 | "items" : [ ] 12 | }, 13 | "createEmail" : { 14 | "__type" : "email", 15 | "emailString" : "" 16 | }, 17 | "createTime" : { 18 | "__type" : "time", 19 | "time" : { 20 | "__type" : "dateAndTime", 21 | "dateAndTimeString" : "2024-08-15T23:57:00.043043+02:00" 22 | } 23 | }, 24 | "editEmail" : { 25 | "__type" : "email", 26 | "emailString" : "" 27 | }, 28 | "editTime" : { 29 | "__type" : "time", 30 | "time" : { 31 | "__type" : "dateAndTime", 32 | "dateAndTimeString" : "2024-08-15T23:57:03.481549+02:00" 33 | } 34 | }, 35 | "uid" : { 36 | "__type" : "uid", 37 | "uidString" : "Aq/rpiHcDQCIqcqqAM7JJA==" 38 | }, 39 | "paragraphStyle" : { 40 | "__type" : "textStyle" 41 | }, 42 | "string" : "[](https://www.opengl.org)" 43 | } 44 | ] 45 | }, 46 | "createEmail" : { 47 | "__type" : "email", 48 | "emailString" : "" 49 | }, 50 | "createTime" : { 51 | "__type" : "time", 52 | "time" : { 53 | "__type" : "dateAndTime", 54 | "dateAndTimeString" : "2024-08-15T23:56:29.696141+02:00" 55 | } 56 | }, 57 | "editEmail" : { 58 | "__type" : "email", 59 | "emailString" : "" 60 | }, 61 | "editTime" : { 62 | "__type" : "time", 63 | "time" : { 64 | "__type" : "dateAndTime", 65 | "dateAndTimeString" : "2024-08-15T23:56:29.696141+02:00" 66 | } 67 | }, 68 | "pageType" : { 69 | "__type" : "namedPage", 70 | "title" : "OpenGL" 71 | }, 72 | "uid" : { 73 | "__type" : "uuid", 74 | "uuid" : "931beba6-21dc-0d00-88a8-4b8700cec924" 75 | } 76 | } -------------------------------------------------------------------------------- /lepiter/46kmvr6b6tpyz1rqrkidh4u5x.lepiter: -------------------------------------------------------------------------------- 1 | { 2 | "__schema" : "4.1", 3 | "__type" : "page", 4 | "children" : { 5 | "__type" : "snippets", 6 | "items" : [ 7 | { 8 | "__type" : "textSnippet", 9 | "children" : { 10 | "__type" : "snippets", 11 | "items" : [ ] 12 | }, 13 | "createEmail" : { 14 | "__type" : "email", 15 | "emailString" : "" 16 | }, 17 | "createTime" : { 18 | "__type" : "time", 19 | "time" : { 20 | "__type" : "dateAndTime", 21 | "dateAndTimeString" : "2025-06-07T22:22:47.273368+02:00" 22 | } 23 | }, 24 | "editEmail" : { 25 | "__type" : "email", 26 | "emailString" : "" 27 | }, 28 | "editTime" : { 29 | "__type" : "time", 30 | "time" : { 31 | "__type" : "dateAndTime", 32 | "dateAndTimeString" : "2025-06-07T22:22:52.508382+02:00" 33 | } 34 | }, 35 | "uid" : { 36 | "__type" : "uid", 37 | "uidString" : "wb/S2GLzDQC2+ppqAiKmRg==" 38 | }, 39 | "paragraphStyle" : { 40 | "__type" : "textStyle" 41 | }, 42 | "string" : "Generative AI" 43 | } 44 | ] 45 | }, 46 | "createEmail" : { 47 | "__type" : "email", 48 | "emailString" : "" 49 | }, 50 | "createTime" : { 51 | "__type" : "time", 52 | "time" : { 53 | "__type" : "dateAndTime", 54 | "dateAndTimeString" : "2025-06-07T22:22:47.133041+02:00" 55 | } 56 | }, 57 | "editEmail" : { 58 | "__type" : "email", 59 | "emailString" : "" 60 | }, 61 | "editTime" : { 62 | "__type" : "time", 63 | "time" : { 64 | "__type" : "dateAndTime", 65 | "dateAndTimeString" : "2025-06-07T22:22:47.133041+02:00" 66 | } 67 | }, 68 | "pageType" : { 69 | "__type" : "namedPage", 70 | "title" : "GenAI" 71 | }, 72 | "uid" : { 73 | "__type" : "uuid", 74 | "uuid" : "b596d0d8-62f3-0d00-b6f9-bf6d0222a646" 75 | } 76 | } -------------------------------------------------------------------------------- /lepiter/46kmvr7g21x98d9d6ebom9msy.lepiter: -------------------------------------------------------------------------------- 1 | { 2 | "__schema" : "4.1", 3 | "__type" : "page", 4 | "children" : { 5 | "__type" : "snippets", 6 | "items" : [ 7 | { 8 | "__type" : "textSnippet", 9 | "children" : { 10 | "__type" : "snippets", 11 | "items" : [ ] 12 | }, 13 | "createEmail" : { 14 | "__type" : "email", 15 | "emailString" : "" 16 | }, 17 | "createTime" : { 18 | "__type" : "time", 19 | "time" : { 20 | "__type" : "dateAndTime", 21 | "dateAndTimeString" : "2025-06-07T22:22:54.6669+02:00" 22 | } 23 | }, 24 | "editEmail" : { 25 | "__type" : "email", 26 | "emailString" : "" 27 | }, 28 | "editTime" : { 29 | "__type" : "time", 30 | "time" : { 31 | "__type" : "dateAndTime", 32 | "dateAndTimeString" : "2025-06-07T22:23:00.683508+02:00" 33 | } 34 | }, 35 | "uid" : { 36 | "__type" : "uid", 37 | "uidString" : "r5BD2WLzDQC3cA4WAiKmRg==" 38 | }, 39 | "paragraphStyle" : { 40 | "__type" : "textStyle" 41 | }, 42 | "string" : "Large language model" 43 | } 44 | ] 45 | }, 46 | "createEmail" : { 47 | "__type" : "email", 48 | "emailString" : "" 49 | }, 50 | "createTime" : { 51 | "__type" : "time", 52 | "time" : { 53 | "__type" : "dateAndTime", 54 | "dateAndTimeString" : "2025-06-07T22:22:54.515852+02:00" 55 | } 56 | }, 57 | "editEmail" : { 58 | "__type" : "email", 59 | "emailString" : "" 60 | }, 61 | "editTime" : { 62 | "__type" : "time", 63 | "time" : { 64 | "__type" : "dateAndTime", 65 | "dateAndTimeString" : "2025-06-07T22:22:54.515852+02:00" 66 | } 67 | }, 68 | "pageType" : { 69 | "__type" : "namedPage", 70 | "title" : "LLM" 71 | }, 72 | "uid" : { 73 | "__type" : "uuid", 74 | "uuid" : "b24141d9-62f3-0d00-b76f-95930222a646" 75 | } 76 | } -------------------------------------------------------------------------------- /lepiter/4euu2idytggau3b9bl5ukneip.lepiter: -------------------------------------------------------------------------------- 1 | { 2 | "__schema" : "4.1", 3 | "__type" : "page", 4 | "children" : { 5 | "__type" : "snippets", 6 | "items" : [ 7 | { 8 | "__type" : "textSnippet", 9 | "children" : { 10 | "__type" : "snippets", 11 | "items" : [ ] 12 | }, 13 | "createEmail" : { 14 | "__type" : "email", 15 | "emailString" : "" 16 | }, 17 | "createTime" : { 18 | "__type" : "time", 19 | "time" : { 20 | "__type" : "dateAndTime", 21 | "dateAndTimeString" : "2022-05-23T08:22:52.476985+02:00" 22 | } 23 | }, 24 | "editEmail" : { 25 | "__type" : "email", 26 | "emailString" : "" 27 | }, 28 | "editTime" : { 29 | "__type" : "time", 30 | "time" : { 31 | "__type" : "dateAndTime", 32 | "dateAndTimeString" : "2022-05-23T08:22:53.625467+02:00" 33 | } 34 | }, 35 | "uid" : { 36 | "__type" : "uid", 37 | "uidString" : "07qmmQmcDQCvydgeBRaJSg==" 38 | }, 39 | "paragraphStyle" : { 40 | "__type" : "textStyle" 41 | }, 42 | "string" : "[](https://reactjs.org)" 43 | } 44 | ] 45 | }, 46 | "createEmail" : { 47 | "__type" : "email", 48 | "emailString" : "" 49 | }, 50 | "createTime" : { 51 | "__type" : "time", 52 | "time" : { 53 | "__type" : "dateAndTime", 54 | "dateAndTimeString" : "2022-05-23T08:22:23.671705+02:00" 55 | } 56 | }, 57 | "editEmail" : { 58 | "__type" : "email", 59 | "emailString" : "" 60 | }, 61 | "editTime" : { 62 | "__type" : "time", 63 | "time" : { 64 | "__type" : "dateAndTime", 65 | "dateAndTimeString" : "2022-05-23T08:22:23.671705+02:00" 66 | } 67 | }, 68 | "pageType" : { 69 | "__type" : "namedPage", 70 | "title" : "React" 71 | }, 72 | "uid" : { 73 | "__type" : "uuid", 74 | "uuid" : "4105a699-099c-0d00-afc8-dac10516894a" 75 | } 76 | } -------------------------------------------------------------------------------- /lepiter/4qir783n2xm8xfl2pzz4wd75a.lepiter: -------------------------------------------------------------------------------- 1 | { 2 | "__schema" : "4.1", 3 | "__type" : "page", 4 | "children" : { 5 | "__type" : "snippets", 6 | "items" : [ 7 | { 8 | "__type" : "textSnippet", 9 | "children" : { 10 | "__type" : "snippets", 11 | "items" : [ ] 12 | }, 13 | "createEmail" : { 14 | "__type" : "email", 15 | "emailString" : "" 16 | }, 17 | "createTime" : { 18 | "__type" : "time", 19 | "time" : { 20 | "__type" : "dateAndTime", 21 | "dateAndTimeString" : "2023-09-12T23:57:25.136773+02:00" 22 | } 23 | }, 24 | "editEmail" : { 25 | "__type" : "email", 26 | "emailString" : "" 27 | }, 28 | "editTime" : { 29 | "__type" : "time", 30 | "time" : { 31 | "__type" : "dateAndTime", 32 | "dateAndTimeString" : "2023-09-12T23:57:35.353112+02:00" 33 | } 34 | }, 35 | "uid" : { 36 | "__type" : "uid", 37 | "uidString" : "llHcQ5LBDQCeGRYJCioCUA==" 38 | }, 39 | "paragraphStyle" : { 40 | "__type" : "textStyle" 41 | }, 42 | "string" : "[](https://nixos.org)" 43 | } 44 | ] 45 | }, 46 | "createEmail" : { 47 | "__type" : "email", 48 | "emailString" : "" 49 | }, 50 | "createTime" : { 51 | "__type" : "time", 52 | "time" : { 53 | "__type" : "dateAndTime", 54 | "dateAndTimeString" : "2023-09-12T23:57:25.051956+02:00" 55 | } 56 | }, 57 | "editEmail" : { 58 | "__type" : "email", 59 | "emailString" : "" 60 | }, 61 | "editTime" : { 62 | "__type" : "time", 63 | "time" : { 64 | "__type" : "dateAndTime", 65 | "dateAndTimeString" : "2023-09-12T23:57:25.051956+02:00" 66 | } 67 | }, 68 | "pageType" : { 69 | "__type" : "namedPage", 70 | "title" : "Nix" 71 | }, 72 | "uid" : { 73 | "__type" : "uuid", 74 | "uuid" : "6e05db43-92c1-0d00-9e18-96ea0a2a0250" 75 | } 76 | } -------------------------------------------------------------------------------- /lepiter/attachments/33b00u9tl2hl3yvhc0g3ehjzl/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-06-21T09:55:15.558251+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/33b00u9w2lb91jxs4ko45o0al/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-06-21T10:11:44.499751+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/33b00uc2acin52b70wx8yy38i/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-06-21T10:04:09.649856+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/33b00uc30ye0bdbz5qmvw9xou/47-game-animation-shrinking.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #CardEventListener }, #name : #'mouseLeaveEvent:', #protocol : #'mouse handlers', #sourceCode : 'mouseLeaveEvent: anEvent\r\t| anAnimation |\r\tanAnimation := (BlTransformAnimation scale: 1.0 @ 1.0)\r\t\tabsolute;\r\t\tduration: 0.5 seconds.\r\tanEvent currentTarget addAnimation: anAnimation', #stamp : 'JurajKubelka 4/8/2019 07:12', #package : #Tutorial-MemoryGame-UI } } } -------------------------------------------------------------------------------- /lepiter/attachments/33b00uc30ye0bdbz5qmvw9xou/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-06-21T10:11:11.838601+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/33b00ucoy75wob7qnlie0xv6j/24-card-element-show-face.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #CardElement, #isMetaSide : false }, #name : #onFlippedFace, #protocol : #hooks, #sourceCode : 'onFlippedFace\r\tface visibility: BlVisibility visible.\r\tback visibility: BlVisibility hidden.', #stamp : 'JurajKubelka 1/11/2019 16:34' }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #CardElement, #isMetaSide : false }, #name : #onFlippedFace, #protocol : #hooks, #sourceCode : 'onFlippedFace\r\tface visibility: BlVisibility visible.\r\tback visibility: BlVisibility hidden.', #stamp : 'JurajKubelka 1/11/2019 16:34' } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/33b00ucoy75wob7qnlie0xv6j/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-06-21T10:01:55.211307+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/33b00ucxbjmagdcc647kv2gkn/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-06-21T09:52:44.907021+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/33b00ud9t988kge8ujps1d7b3/72-raw-card-element-disappear.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'card:', #protocol : #accessing, #sourceCode : 'card: aDMGCard\r\tcard ifNotNil: [ :anOldCard | anOldCard announcer unsubscribe: self ].\r\tcard := aDMGCard.\r\tcard announcer when: CardFlipped send: #onUpdated to: self.\r\tself onUpdated.', #stamp : 'JurajKubelka 3/6/2019 10:13', #package : #Tutorial-MemoryGame-SpartaUI }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'card:', #protocol : #accessing, #sourceCode : 'card: aDMGCard\r\tcard ifNotNil: [ :anOldCard | anOldCard announcer unsubscribe: self ].\r\tcard := aDMGCard.\r\tcard announcer when: CardFlipped send: #onUpdated to: self.\r\tcard announcer when: CardDisappeared send: #onDisappear to: self.\r\tself onUpdated.', #stamp : 'JurajKubelka 3/6/2019 10:23', #package : #Tutorial-MemoryGame-SpartaUI } } } OmEntry { #tags : { #prior : OmReference [ '1' ], #self : OmReference [ '2' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #onDisappear, #protocol : #hooks, #sourceCode : 'onDisappear\r\tself visibility: BlVisibility hidden.', #stamp : 'JurajKubelka 3/6/2019 10:23', #package : #Tutorial-MemoryGame-SpartaUI } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/33b00ud9t988kge8ujps1d7b3/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-06-21T10:20:21.183771+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/33b00udcq5wgae6mtmlzsrswh/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-06-21T10:03:22.909354+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/33b00udv13u4zzjy227rzzeju/25-card-element-layout.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #CardElement, #isMetaSide : false }, #name : #initialize, #protocol : #initialization, #sourceCode : 'initialize\r\tsuper initialize.\r\tself layout: BlFrameLayout new.\r\tself size: self cardSize.\r\tself background: self backgroundColor.\r\tself geometry: (BlRoundedRectangleGeometry cornerRadius: 12).\r\tself initializeFace.\r\tself addChild: face.\r\tself initializeBack.\r\tself addChild: back.', #stamp : 'JurajKubelka 1/11/2019 16:44' }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #CardElement, #isMetaSide : false }, #name : #initialize, #protocol : #initialization, #sourceCode : 'initialize\r\tsuper initialize.\r\tself layout: BlFrameLayout new.\r\tself size: self cardSize.\r\tself background: self backgroundColor.\r\tself geometry: (BlRoundedRectangleGeometry cornerRadius: 12).\r\tself initializeFace.\r\tself addChild: face.\r\tself initializeBack.\r\tself addChild: back.', #stamp : 'JurajKubelka 1/11/2019 16:44' } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/33b00udv13u4zzjy227rzzeju/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-06-21T10:02:48.885069+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/33b00uea1639nji6zmat08k6k/71-raw-card-element-hooks.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'card:', #protocol : #accessing, #sourceCode : 'card: aDMGCard\r\tcard ifNotNil: [ :anOldCard | anOldCard announcer unsubscribe: self ].\r\tcard := aDMGCard.\r\tcard announcer when: CardFlipped send: #onFlipped to: self.\r\tself onUpdated.', #stamp : 'JurajKubelka 3/6/2019 10:12', #package : #Tutorial-MemoryGame-SpartaUI }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'card:', #protocol : #accessing, #sourceCode : 'card: aDMGCard\r\tcard ifNotNil: [ :anOldCard | anOldCard announcer unsubscribe: self ].\r\tcard := aDMGCard.\r\tcard announcer when: CardFlipped send: #onUpdated to: self.\r\tself onUpdated.', #stamp : 'JurajKubelka 3/6/2019 10:13', #package : #Tutorial-MemoryGame-SpartaUI } } } OmEntry { #tags : { #prior : OmReference [ '1' ], #self : OmReference [ '2' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #onUpdated, #protocol : #hooks, #sourceCode : 'onUpdated\r\tself invalidate', #stamp : 'JurajKubelka 3/6/2019 10:15', #package : #Tutorial-MemoryGame-SpartaUI } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/33b00uea1639nji6zmat08k6k/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-06-21T10:19:45.764448+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/33b00uety8xqxk1f50d8cqqb1/41-board-element-bloc-card.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #GameElement }, #name : #newCardElement, #protocol : #'as yet unclassified', #sourceCode : 'newCardElement\r\t^ CardElement new', #stamp : 'JurajKubelka 3/18/2019 10:50', #package : #Tutorial-MemoryGame-UI }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #GameElement }, #name : #newCardElement, #protocol : #'instance creation', #sourceCode : 'newCardElement\r\t^ CardElement new', #stamp : 'JurajKubelka 3/18/2019 10:50', #package : #Tutorial-MemoryGame-UI } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/33b00uety8xqxk1f50d8cqqb1/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-06-21T10:07:03.102055+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/33b00ufwxit6hm0o3g6nugudt/46-game-animation-mouse-enter.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #CardEventListener }, #name : #'mouseEnterEvent:', #protocol : #'as yet unclassified', #sourceCode : 'mouseEnterEvent: anEvent\r\t| anAnimation |\r\tanAnimation := (BlTransformAnimation scale: 1.1 @ 1.1)\r\t\tabsolute;\r\t\tduration: 0.5 seconds.\r\tanEvent currentTarget addAnimation: anAnimation', #stamp : 'JurajKubelka 4/8/2019 07:05', #package : #Tutorial-MemoryGame-UI }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #CardEventListener }, #name : #'mouseEnterEvent:', #protocol : #'mouse handlers', #sourceCode : 'mouseEnterEvent: anEvent\r\t| anAnimation |\r\tanAnimation := (BlTransformAnimation scale: 1.1 @ 1.1)\r\t\tabsolute;\r\t\tduration: 0.5 seconds.\r\tanEvent currentTarget addAnimation: anAnimation', #stamp : 'JurajKubelka 4/8/2019 07:05', #package : #Tutorial-MemoryGame-UI } } } -------------------------------------------------------------------------------- /lepiter/attachments/33b00ufwxit6hm0o3g6nugudt/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-06-21T10:10:36.124228+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/33b00uh90evkjrm8mm2khz68h/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-06-21T10:05:40.176488+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj109g60ki9fpc4fdrsky0n/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/44-event-listener-methods.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.14722+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10a485h76pvd64v43gt7s/40-card-element-class.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpClassAddition { #class : RGClassDefinition { #annotations : IdentityDictionary { #superclassName : 'BlElement', #traitCompositionSource : '{}', #definitionSource : 'BlElement subclass: #GameElement\r\tinstanceVariableNames: \'game\'\r\tclassVariableNames: \'\'\r\tpoolDictionaries: \'\'\r\tcategory: \'Tutorial-MemoryGame-UI\'' }, #name : #GameElement, #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ RGInstanceVariableDefinition { #annotations : IdentityDictionary { #className : #GameElement, #isMetaSide : false }, #name : #game, #parent : @6 } ], #metaClass : RGMetaclassDefinition { #annotations : IdentityDictionary { #traitCompositionSource : '{}', #definitionSource : 'GameElement class\r\tinstanceVariableNames: \'\'' }, #name : #'GameElement class', #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ ], #baseClass : @6 }, #comment : RGCommentDefinition { #annotations : IdentityDictionary { #className : #GameElement, #isMetaSide : false }, #parent : @6, #content : '' }, #classVariables : OrderedCollection [ ], #category : #Tutorial-MemoryGame-UI, #package : #Tutorial-MemoryGame-UI, #sharedPools : OrderedCollection [ ] } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10a485h76pvd64v43gt7s/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/40-card-element-class.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.145645+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10a6a9gxjqqhy98usd5k0/03-card-actions.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #Card }, #name : #flip, #protocol : #actions, #sourceCode : 'flip\r\tflipped := flipped not.\r\tself notifyFlipped', #stamp : 'JurajKubelka 1/8/2019 10:54', #package : #Tutorial-MemoryGame-Model } } } OmEntry { #tags : { #prior : OmReference [ '1' ], #self : OmReference [ '2' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #Card }, #name : #disappear, #protocol : #actions, #sourceCode : 'disappear\r\tself notifyDisappear', #stamp : 'JurajKubelka 1/8/2019 10:54', #package : #Tutorial-MemoryGame-Model } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10a6a9gxjqqhy98usd5k0/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/03-card-actions.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:57.856478+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10aemfhbfhu5j57aqfiyl/68-raw-card-element-face.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'drawFaceSideOnSpartaCanvas:', #protocol : #drawing, #sourceCode : 'drawFaceSideOnSpartaCanvas: aCanvas\r\t"nothing to do for now"', #stamp : 'JurajKubelka 3/5/2019 11:18', #package : #Tutorial-MemoryGame-SpartaUI }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'drawFaceSideOnSpartaCanvas:', #protocol : #drawing, #sourceCode : 'drawFaceSideOnSpartaCanvas: aCanvas\r\t| aFont anOrigin |\r\taFont := aCanvas font\r\t\tnamed: \'Source Sans Pro\';\r\t\tsize: 50;\r\t\tbuild.\r\tanOrigin := self extent / 2.\r\taCanvas text\r\t\tbaseline: anOrigin;\r\t\tfont: aFont;\r\t\tpaint: self foregroundColor;\r\t\tstring: self card symbol asString;\r\t\tdraw', #stamp : 'JurajKubelka 3/5/2019 18:44', #package : #Tutorial-MemoryGame-SpartaUI } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10aemfhbfhu5j57aqfiyl/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/68-raw-card-element-face.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.023958+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10aqxo31ipsjm4w4snk1q/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/21-card-element-basic-methods.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:57.921953+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10aumvwvm5veetu2y31ae/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/22-card-element-back.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:57.922467+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10avqdx0fu1ngyug4przx/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/67-raw-card-element-refactoring.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.023517+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10b11sa32u43jn7ylsxrl/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/memoryExample0.png"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.107863+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10b11sa32u43jn7ylsxrl/memoryExample0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/53lj10b11sa32u43jn7ylsxrl/memoryExample0.png -------------------------------------------------------------------------------- /lepiter/attachments/53lj10b7h4e1kl33xb8lyk4fs/60-raw-card-element-class.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpClassAddition { #class : RGClassDefinition { #annotations : IdentityDictionary { #superclassName : 'BlElement', #traitCompositionSource : '{}', #definitionSource : 'BlElement subclass: #RawCardElement\r\tinstanceVariableNames: \'card\'\r\tclassVariableNames: \'\'\r\tpoolDictionaries: \'\'\r\tcategory: \'Tutorial-MemoryGame-SpartaUI\'' }, #name : #RawCardElement, #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ RGInstanceVariableDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #card, #parent : @6 } ], #metaClass : RGMetaclassDefinition { #annotations : IdentityDictionary { #traitCompositionSource : '{}', #definitionSource : 'RawCardElement class\r\tinstanceVariableNames: \'\'' }, #name : #'RawCardElement class', #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ ], #baseClass : @6 }, #comment : RGCommentDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #parent : @6, #content : '' }, #classVariables : OrderedCollection [ ], #category : #Tutorial-MemoryGame-SpartaUI, #package : #Tutorial-MemoryGame-SpartaUI, #sharedPools : OrderedCollection [ ] } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10b7h4e1kl33xb8lyk4fs/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/60-raw-card-element-class.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.018349+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10bafr0coy9piwx496k17/05-game-class.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpClassAddition { #class : RGClassDefinition { #annotations : IdentityDictionary { #superclassName : 'Object', #traitCompositionSource : '{}', #definitionSource : 'Object subclass: #Game\r\tinstanceVariableNames: \'availableCards chosenCards\'\r\tclassVariableNames: \'\'\r\tpoolDictionaries: \'\'\r\tcategory: \'Tutorial-MemoryGame-Model\'' }, #name : #Game, #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ RGInstanceVariableDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #Game }, #name : #availableCards, #parent : @6 }, RGInstanceVariableDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #Game }, #name : #chosenCards, #parent : @6 } ], #metaClass : RGMetaclassDefinition { #annotations : IdentityDictionary { #definitionSource : 'Game class\r\tinstanceVariableNames: \'\'', #traitCompositionSource : '{}' }, #name : #'Game class', #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ ], #baseClass : @6 }, #comment : RGCommentDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #Game }, #parent : @6, #content : '' }, #classVariables : OrderedCollection [ ], #category : #Tutorial-MemoryGame-Model, #package : #Tutorial-MemoryGame-Model, #sharedPools : OrderedCollection [ ] } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10bafr0coy9piwx496k17/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/05-game-class.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:57.857128+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10bb6hrtha3a2cxxn6qo7/65-raw-card-element-clipped-line.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '1' ], #self : OmReference [ '2' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'drawOnSpartaCanvas:', #protocol : #drawing, #sourceCode : 'drawOnSpartaCanvas: aCanvas\r\t| aRadiusOffset |\r\tsuper drawOnSpartaCanvas: aCanvas.\r\taRadiusOffset := 12 / Float pi.\r\taCanvas fill\r\t\tpaint: self backgroundColor;\r\t\tpath: (aCanvas shape \r\t\t\troundedRectangle: (self boundsInLocal)\r\t\t\tradii: (BlCornerRadii radius: 12));\r\t\tdraw.\r\taCanvas stroke\r\t\tpaint: self foregroundColor;\r\t\tpath: (aCanvas shape line: aRadiusOffset @ aRadiusOffset to: self extent - aRadiusOffset);\r\t\tdraw', #stamp : 'JurajKubelka 3/5/2019 11:02', #package : #Tutorial-MemoryGame-SpartaUI }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'drawOnSpartaCanvas:', #protocol : #drawing, #sourceCode : 'drawOnSpartaCanvas: aCanvas\r\t| aRadiusOffset |\r\tsuper drawOnSpartaCanvas: aCanvas.\r\taRadiusOffset := 12 / Float pi.\r\taCanvas fill\r\t\tpaint: self backgroundColor;\r\t\tpath: (aCanvas shape \r\t\t\troundedRectangle: (self boundsInLocal)\r\t\t\tradii: (BlCornerRadii radius: 12));\r\t\tdraw.\r\taCanvas stroke\r\t\tpaint: self foregroundColor;\r\t\tpath: (aCanvas shape \r\t\t\tline: aRadiusOffset @ aRadiusOffset \r\t\t\tto: self extent - aRadiusOffset);\r\t\tdraw', #stamp : 'JurajKubelka 3/5/2019 11:02', #package : #Tutorial-MemoryGame-SpartaUI } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10bb6hrtha3a2cxxn6qo7/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/65-raw-card-element-clipped-line.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.022401+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10bcp6ol1j4r6mtjdovaw/43-event-listener.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '1' ], #self : OmReference [ '2' ] }, #content : EpClassAddition { #class : RGClassDefinition { #annotations : IdentityDictionary { #superclassName : 'BlEventListener', #traitCompositionSource : '{}', #definitionSource : 'BlEventListener subclass: #CardEventListener\r\tinstanceVariableNames: \'game\'\r\tclassVariableNames: \'\'\r\tpoolDictionaries: \'\'\r\tcategory: \'Tutorial-MemoryGame-UI\'' }, #name : #CardEventListener, #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ RGInstanceVariableDefinition { #annotations : IdentityDictionary { #className : #CardEventListener, #isMetaSide : false }, #name : #game, #parent : @6 } ], #metaClass : RGMetaclassDefinition { #annotations : IdentityDictionary { #traitCompositionSource : '{}', #definitionSource : 'CardEventListener class\r\tinstanceVariableNames: \'\'' }, #name : #'CardEventListener class', #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ ], #baseClass : @6 }, #comment : RGCommentDefinition { #annotations : IdentityDictionary { #className : #CardEventListener, #isMetaSide : false }, #parent : @6, #content : '' }, #classVariables : OrderedCollection [ ], #category : #Tutorial-MemoryGame-UI, #package : #Tutorial-MemoryGame-UI, #sharedPools : OrderedCollection [ ] } } } -------------------------------------------------------------------------------- /lepiter/attachments/53lj10bcp6ol1j4r6mtjdovaw/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/43-event-listener.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.146719+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10bfckbh7tmagp3h5vm0s/07-game-instantiations.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '6' ], #self : OmReference [ '7' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #'Game class', #isMetaSide : true }, #name : #numbers, #protocol : #'instance creation', #sourceCode : 'numbers\r\t^ self new initializeForSymbols: \'12345678\'', #stamp : 'JurajKubelka 1/11/2019 21:09', #package : #Tutorial-MemoryGame-Model } } } OmEntry { #tags : { #prior : OmReference [ '7' ], #self : OmReference [ '8' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #'Game class', #isMetaSide : true }, #name : #emoji, #protocol : #'instance creation', #sourceCode : 'emoji\r\t^ self new initializeForSymbols: \'💰🏡🎅🍪🍕🚀😸🙈\'', #stamp : 'JurajKubelka 1/11/2019 21:09', #package : #Tutorial-MemoryGame-Model } } } OmEntry { #tags : { #prior : OmReference [ '8' ], #self : OmReference [ '9' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #'Game class', #isMetaSide : true }, #name : #chinese, #protocol : #'instance creation', #sourceCode : 'chinese\r\t^ self new initializeForSymbols: \'为从公家里地个时\'', #stamp : 'JurajKubelka 1/11/2019 21:09', #package : #Tutorial-MemoryGame-Model } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10bfckbh7tmagp3h5vm0s/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/07-game-instantiations.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:57.858708+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10c2dsm3avnzwdof43kta/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/61-raw-card-element-basic-methods.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.018939+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10cbtr0cdpoqbrf50hnly/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/64-raw-card-element-cross-line.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.021416+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10chqkdlhnd2cvjpi5y0q/69-raw-card-element-face-align-horizontally.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'drawFaceSideOnSpartaCanvas:', #protocol : #drawing, #sourceCode : 'drawFaceSideOnSpartaCanvas: aCanvas\r\t| aFont anOrigin |\r\taFont := aCanvas font\r\t\tnamed: \'Source Sans Pro\';\r\t\tsize: 50;\r\t\tbuild.\r\tanOrigin := self extent / 2.\r\taCanvas text\r\t\tbaseline: anOrigin;\r\t\tfont: aFont;\r\t\tpaint: self foregroundColor;\r\t\tstring: self card symbol asString;\r\t\tdraw', #stamp : 'JurajKubelka 3/5/2019 18:44', #package : #Tutorial-MemoryGame-SpartaUI }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'drawFaceSideOnSpartaCanvas:', #protocol : #drawing, #sourceCode : 'drawFaceSideOnSpartaCanvas: aCanvas\r\t| aFont anOrigin aTextPainter aMetrics |\r\taFont := aCanvas font\r\t\tnamed: \'Source Sans Pro\';\r\t\tsize: 50;\r\t\tbuild.\r\taTextPainter := aCanvas text\r\t\tfont: aFont;\r\t\tpaint: self foregroundColor;\r\t\tstring: self card symbol asString.\r\taMetrics := aTextPainter measure.\r\tanOrigin := (self extent - aMetrics textMetrics bounds extent) / 2.\r\taTextPainter\r\t\tbaseline: anOrigin;\r\t\tdraw', #stamp : 'JurajKubelka 3/6/2019 09:48', #package : #Tutorial-MemoryGame-SpartaUI } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10chqkdlhnd2cvjpi5y0q/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/69-raw-card-element-face-align-horizontally.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.024404+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10cqpssqr2g4cgcx01i4m/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/06-game-basic-methods.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:57.857648+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10cvaww0kiuvcfiu5c54n/01-card-class.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpClassAddition { #class : RGClassDefinition { #annotations : IdentityDictionary { #superclassName : 'Object', #traitCompositionSource : '{}', #definitionSource : 'Object subclass: #Card\r\tinstanceVariableNames: \'symbol flipped announcer\'\r\tclassVariableNames: \'\'\r\tpoolDictionaries: \'\'\r\tcategory: \'Tutorial-MemoryGame-Model\'' }, #name : #Card, #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ RGInstanceVariableDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #Card }, #name : #symbol, #parent : @6 }, RGInstanceVariableDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #Card }, #name : #flipped, #parent : @6 }, RGInstanceVariableDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #Card }, #name : #announcer, #parent : @6 } ], #metaClass : RGMetaclassDefinition { #annotations : IdentityDictionary { #definitionSource : 'Card class\r\tinstanceVariableNames: \'\'', #traitCompositionSource : '{}' }, #name : #'Card class', #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ ], #baseClass : @6 }, #comment : RGCommentDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #Card }, #parent : @6, #content : '' }, #classVariables : OrderedCollection [ ], #category : #Tutorial-MemoryGame-Model, #package : #Tutorial-MemoryGame-Model, #sharedPools : OrderedCollection [ ] } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10cvaww0kiuvcfiu5c54n/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/01-card-class.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:57.852823+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10deqfihmxxt5mk481lmf/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/08-game-logic.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.088661+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10e21tleq1azp9psxlq1c/07-game-initialization.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #Game }, #name : #'initializeForSymbols:', #protocol : #initialization, #sourceCode : 'initializeForSymbols: aCollectionOfCharacters\r\tself\r\t\tassert: [ aCollectionOfCharacters size = (self cardsCount / self matchesCount) ]\r\t\tdescription: [ \'Amount of characters must be equal to possible all combinations\' ].\r\tavailableCards := (aCollectionOfCharacters asArray\r\t\t\tcollect: [ :aSymbol | \r\t\t\t\t(1 to: self matchesCount) collect: [ :i | \r\t\t\t\t\tCard new symbol: aSymbol ] ] ) flattened shuffled asOrderedCollection', #stamp : 'JurajKubelka 1/8/2019 11:18', #package : #Tutorial-MemoryGame-Model } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10e21tleq1azp9psxlq1c/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/07-game-initialization.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:57.858156+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10eg6ucgcr4rzv0x3o398/20-card-element-class.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpClassAddition { #class : RGClassDefinition { #annotations : IdentityDictionary { #superclassName : 'BlElement', #traitCompositionSource : '{}', #definitionSource : 'BlElement subclass: #CardElement\r\tinstanceVariableNames: \'card\'\r\tclassVariableNames: \'\'\r\tpoolDictionaries: \'\'\r\tcategory: \'Tutorial-MemoryGame-UI\'' }, #name : #CardElement, #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ RGInstanceVariableDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #CardElement }, #name : #card, #parent : @6 } ], #metaClass : RGMetaclassDefinition { #annotations : IdentityDictionary { #definitionSource : 'CardElement class\r\tinstanceVariableNames: \'\'', #traitCompositionSource : '{}' }, #name : #'CardElement class', #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ ], #baseClass : @6 }, #comment : RGCommentDefinition { #annotations : IdentityDictionary { #isMetaSide : false, #className : #CardElement }, #parent : @6, #content : '' }, #classVariables : OrderedCollection [ ], #category : #Tutorial-MemoryGame-UI, #package : #Tutorial-MemoryGame-UI, #sharedPools : OrderedCollection [ ] } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10eg6ucgcr4rzv0x3o398/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/20-card-element-class.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:57.92138+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10etg4axc88y5d4zjdfp0/63-raw-card-element-rounded-shape.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'drawOnSpartaCanvas:', #protocol : #drawing, #sourceCode : 'drawOnSpartaCanvas: aCanvas\r\tsuper drawOnSpartaCanvas: aCanvas.\r\taCanvas fill\r\t\tpaint: self backgroundColor;\r\t\tpath: self boundsInLocal;\r\t\tdraw', #stamp : 'JurajKubelka 3/5/2019 10:19', #package : #Tutorial-MemoryGame-SpartaUI }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'drawOnSpartaCanvas:', #protocol : #drawing, #sourceCode : 'drawOnSpartaCanvas: aCanvas\r\tsuper drawOnSpartaCanvas: aCanvas.\r\taCanvas fill\r\t\tpaint: self backgroundColor;\r\t\tpath: (aCanvas shape \r\t\t\troundedRectangle: (self boundsInLocal)\r\t\t\tradii: (BlCornerRadii radius: 12));\r\t\tdraw', #stamp : 'JurajKubelka 3/5/2019 10:32', #package : #Tutorial-MemoryGame-SpartaUI } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10etg4axc88y5d4zjdfp0/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/63-raw-card-element-rounded-shape.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.019854+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10f1v0ejnv9hp4m958pda/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/66-raw-card-element-both-lines.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.022869+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10f35hkjpo0xsj038eejw/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/23-card-element-face.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:57.922953+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10fdbkq761fklc2928xt8/70-raw-card-element-face-centered.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'drawFaceSideOnSpartaCanvas:', #protocol : #drawing, #sourceCode : 'drawFaceSideOnSpartaCanvas: aCanvas\r\t| aFont anOrigin aTextPainter aMetrics |\r\taFont := aCanvas font\r\t\tnamed: \'Source Sans Pro\';\r\t\tsize: 50;\r\t\tbuild.\r\taTextPainter := aCanvas text\r\t\tfont: aFont;\r\t\tpaint: self foregroundColor;\r\t\tstring: self card symbol asString.\r\taMetrics := aTextPainter measure.\r\tanOrigin := (self extent - aMetrics textMetrics bounds extent) / 2.\r\taTextPainter\r\t\tbaseline: anOrigin;\r\t\tdraw', #stamp : 'JurajKubelka 3/6/2019 09:48', #package : #Tutorial-MemoryGame-SpartaUI }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'drawFaceSideOnSpartaCanvas:', #protocol : #drawing, #sourceCode : 'drawFaceSideOnSpartaCanvas: aCanvas\r\t| aFont anOrigin aTextPainter aMetrics |\r\taFont := aCanvas font\r\t\tnamed: \'Source Sans Pro\';\r\t\tsize: 50;\r\t\tbuild.\r\taTextPainter := aCanvas text\r\t\tfont: aFont;\r\t\tpaint: self foregroundColor;\r\t\tstring: self card symbol asString.\r\taMetrics := aTextPainter measure.\r\tanOrigin := (self extent - aMetrics textMetrics bounds extent) / 2.\r\tanOrigin := anOrigin - aMetrics textMetrics bounds origin.\r\taTextPainter\r\t\tbaseline: anOrigin;\r\t\tdraw', #stamp : 'JurajKubelka 3/6/2019 09:56', #package : #Tutorial-MemoryGame-SpartaUI } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10fdbkq761fklc2928xt8/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/70-raw-card-element-face-centered.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.024837+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10fznqo2indw073wbzq96/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/memoryExample1.png"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.108691+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10fznqo2indw073wbzq96/memoryExample1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/53lj10fznqo2indw073wbzq96/memoryExample1.png -------------------------------------------------------------------------------- /lepiter/attachments/53lj10fzsr8eh2fwmc4gd6m8n/45-game-register-listener.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #GameElement, #isMetaSide : false }, #name : #onUpdated, #protocol : #'as yet unclassified', #sourceCode : 'onUpdated\r\tself game ifNil: [ ^ self ].\r\tself removeChildren.\r\tself layout columnCount: self game gridSize.\r\tself game availableCards do: [ :aCard | \r\t\t| aCardElement |\r\t\taCardElement := CardElement new card: aCard.\t\r\t\taCardElement addEventHandler: (CardEventListener new game: self game).\r\t\tself addChild: aCardElement ]', #stamp : 'JurajKubelka 1/11/2019 21:34' }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #GameElement, #isMetaSide : false }, #name : #onUpdated, #protocol : #hooks, #sourceCode : 'onUpdated\r\tself game ifNil: [ ^ self ].\r\tself removeChildren.\r\tself layout columnCount: self game gridSize.\r\tself game availableCards do: [ :aCard | \r\t\t| aCardElement |\r\t\taCardElement := self newCardElement card: aCard.\t\r\t\taCardElement addEventHandler: (CardEventListener new game: self game).\r\t\tself addChild: aCardElement ]', #stamp : 'JurajKubelka 1/11/2019 21:34' } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10fzsr8eh2fwmc4gd6m8n/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/45-game-register-listener.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.147697+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10g4ru4bsf7qqpkst3v92/62-raw-card-element-basic-shape.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmNullReference [ ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'drawOnSpartaCanvas:', #protocol : #'as yet unclassified', #sourceCode : 'drawOnSpartaCanvas: aCanvas\r\tsuper drawOnSpartaCanvas: aCanvas.\r\taCanvas fill\r\t\tpaint: self backgroundColor;\r\t\tpath: self boundsInLocal;\r\t\tdraw', #stamp : 'JurajKubelka 3/5/2019 10:19', #package : #Tutorial-MemoryGame-SpartaUI }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #'drawOnSpartaCanvas:', #protocol : #drawing, #sourceCode : 'drawOnSpartaCanvas: aCanvas\r\tsuper drawOnSpartaCanvas: aCanvas.\r\taCanvas fill\r\t\tpaint: self backgroundColor;\r\t\tpath: self boundsInLocal;\r\t\tdraw', #stamp : 'JurajKubelka 3/5/2019 10:19', #package : #Tutorial-MemoryGame-SpartaUI } } } OmEntry { #tags : { #prior : OmReference [ '1' ], #self : OmReference [ '2' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #RawCardElement, #isMetaSide : false }, #name : #backgroundColor, #protocol : #'visual properties', #sourceCode : 'backgroundColor\r\t^ Color lightBlue', #stamp : 'JurajKubelka 3/5/2019 10:17', #package : #Tutorial-MemoryGame-SpartaUI } } } 2 | -------------------------------------------------------------------------------- /lepiter/attachments/53lj10g4ru4bsf7qqpkst3v92/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/62-raw-card-element-basic-shape.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:58.019409+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/53lj10g96eusgoqvwwauy55yr/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"3.2","__type":"attachment","originalReference":{"__type":"file","filename":"/home/alistair/pharo8/gt272/pharo-local/iceberg/feenkcom/Bloc/doc/tutorial-memory-game/changes/02-card-basic-methods.ombu"},"uploadedBy":{"__type":"email","emailString":"contact@feenk.com"},"uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2020-12-18T17:32:57.853942+01:00"}} -------------------------------------------------------------------------------- /lepiter/attachments/5mnyduoknx6cbphrs4az64w4c/2024-08-20_14-07-43_BlElement-497029120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/5mnyduoknx6cbphrs4az64w4c/2024-08-20_14-07-43_BlElement-497029120.png -------------------------------------------------------------------------------- /lepiter/attachments/5mnyduoknx6cbphrs4az64w4c/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-08-20T16:48:53.75064+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/5mnyduq8sog60mq6gx1x55bkq/2024-08-20_16-16-43_BlElement-497029120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/5mnyduq8sog60mq6gx1x55bkq/2024-08-20_16-16-43_BlElement-497029120.png -------------------------------------------------------------------------------- /lepiter/attachments/5mnyduq8sog60mq6gx1x55bkq/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-08-20T16:53:38.378906+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/5mnydus2v04s36eqv3ok2xb5q/2024-08-20_14-10-15_BlElement-497029120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/5mnydus2v04s36eqv3ok2xb5q/2024-08-20_14-10-15_BlElement-497029120.png -------------------------------------------------------------------------------- /lepiter/attachments/5mnydus2v04s36eqv3ok2xb5q/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-08-20T16:56:07.974932+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/5mnydutjg4n9lrfh1ze3r20sz/2024-08-20_16-17-31_BlElement-497029120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/5mnydutjg4n9lrfh1ze3r20sz/2024-08-20_16-17-31_BlElement-497029120.png -------------------------------------------------------------------------------- /lepiter/attachments/5mnydutjg4n9lrfh1ze3r20sz/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-08-20T16:54:25.537467+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/6cwa84k7r7y7dczvcu0zu8mhg/StackMachineClassDef.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpClassAddition { #class : RGClassDefinition { #annotations : IdentityDictionary { #superclassName : 'CollectionValueHolder', #traitCompositionSource : '{}', #definitionSource : 'CollectionValueHolder subclass: #StackMachine\r\tinstanceVariableNames: \'\'\r\tclassVariableNames: \'\'\r\tpackage: \'StackMachine\'' }, #name : #StackMachine, #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ ], #metaClass : RGMetaclassDefinition { #annotations : IdentityDictionary { #traitCompositionSource : '{}', #definitionSource : 'StackMachine class\r\tinstanceVariableNames: \'\'' }, #name : #'StackMachine class', #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ ], #baseClass : @6 }, #comment : RGCommentDefinition { #annotations : IdentityDictionary { #className : #StackMachine, #isMetaSide : false }, #parent : @6, #content : '' }, #classVariables : OrderedCollection [ ], #category : #StackMachine, #package : #StackMachine, #sharedPools : OrderedCollection [ ] } } } -------------------------------------------------------------------------------- /lepiter/attachments/6cwa84k7r7y7dczvcu0zu8mhg/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-04-14T17:30:43.304554+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/6cwa84lsqn79lutyqakczdr98/emptyEg.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #StackMachine, #isMetaSide : false }, #name : #empty, #protocol : #accessing, #sourceCode : 'empty\n\t\n\t| result |\n\tresult := StackMachine new.\n\tself assert: result value isEmpty.\n\t^ result', #stamp : 'GlamorousAuthor 4/14/2022 10:54', #package : #StackMachine } } } -------------------------------------------------------------------------------- /lepiter/attachments/6cwa84lsqn79lutyqakczdr98/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-04-14T17:45:54.077754+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/6cwa84m50iztzyf9cs9oaoewd/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-04-14T17:51:16.997414+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/6cwa84m50iztzyf9cs9oaoewd/push1and2.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #StackMachine, #isMetaSide : false }, #name : #pushed1and2, #protocol : #accessing, #sourceCode : 'pushed1and2\n\t\n\t| result |\n\tresult := self pushed1.\n\tresult push: 2.\n\tself assert: result value size equals: 2.\n\tself assert: result top equals: 2.\n\t^ result ', #stamp : 'GlamorousAuthor 4/14/2022 11:07', #package : #StackMachine } } } -------------------------------------------------------------------------------- /lepiter/attachments/6cwa84mwgxyo47gi61z5htr3l/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-04-14T17:49:07.098922+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/6cwa84mwgxyo47gi61z5htr3l/popMethod.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #StackMachine, #isMetaSide : false }, #name : #pop, #protocol : #accessing, #sourceCode : 'pop\n\tself assert: value isNotEmpty description: \'stack is empty\'.\n\t^ self removeLast', #stamp : 'GlamorousAuthor 4/14/2022 11:05', #package : #StackMachine } } } OmEntry { #tags : { #prior : OmReference [ '1' ], #self : OmReference [ '2' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #StackMachine, #isMetaSide : false }, #name : #push1andPop, #protocol : #accessing, #sourceCode : 'push1andPop\n\t\n\t| result popped |\n\tresult := self pushed1.\n\tpopped := result pop.\n\tself assert: popped equals: 1.\n\tself assert: result isEmpty.\n\t^ result ', #stamp : 'GlamorousAuthor 4/14/2022 11:05', #package : #StackMachine } } } -------------------------------------------------------------------------------- /lepiter/attachments/6cwa84n2xiag9qkg35qrvnsqv/addMethod.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #StackMachine, #isMetaSide : false }, #name : #add1and2, #protocol : #accessing, #sourceCode : 'add1and2\n\t\n\t| result |\n\tresult := self pushed1and2.\n\tresult add.\n\tself assert: result value size equals: 1.\n\tself assert: result top equals: 3.\n\t^ result', #stamp : 'GlamorousAuthor 4/14/2022 11:08', #package : #StackMachine } } } OmEntry { #tags : { #prior : OmReference [ '1' ], #self : OmReference [ '2' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #StackMachine, #isMetaSide : false }, #name : #add, #protocol : #accessing, #sourceCode : 'add\n\tself assert: value size >= 2 description: \'operation needs two arguments on the stack\'.\n\tself push: self pop + self pop', #stamp : 'GlamorousAuthor 4/14/2022 11:07', #package : #StackMachine } } } -------------------------------------------------------------------------------- /lepiter/attachments/6cwa84n2xiag9qkg35qrvnsqv/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-04-14T17:52:34.920612+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/6cwa84nq27sxcbculams0d39v/initializeMethod.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #StackMachine, #isMetaSide : false }, #name : #initialize, #protocol : #accessing, #sourceCode : 'initialize\n\tvalue := OrderedCollection new', #stamp : 'GlamorousAuthor 4/14/2022 10:51', #package : #StackMachine } } } -------------------------------------------------------------------------------- /lepiter/attachments/6cwa84nq27sxcbculams0d39v/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-04-14T17:43:23.206329+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/6cwa84o8r539bxkza5t1zkchn/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-04-14T17:47:35.000425+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/6cwa84o8r539bxkza5t1zkchn/pushMethod.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #StackMachine, #isMetaSide : false }, #name : #'push:', #protocol : #accessing, #sourceCode : 'push: anObject\n\tself addLast: anObject', #stamp : 'GlamorousAuthor 4/14/2022 11:04', #package : #StackMachine } } } OmEntry { #tags : { #prior : OmReference [ '1' ], #self : OmReference [ '2' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #StackMachine, #isMetaSide : false }, #name : #pushed1, #protocol : #accessing, #sourceCode : 'pushed1\n\t\n\t| result |\n\tresult := self empty.\n\tresult push: 1.\n\tself assert: result size equals: 1.\n\tself assert: result top equals: 1.\n\t^ result ', #stamp : 'GlamorousAuthor 4/14/2022 11:03', #package : #StackMachine } } } OmEntry { #tags : { #prior : OmReference [ '2' ], #self : OmReference [ '3' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #StackMachine, #isMetaSide : false }, #name : #top, #protocol : #accessing, #sourceCode : 'top\n\tself assert: value isNotEmpty description: \'stack is empty\'.\n\t^ value last', #stamp : 'GlamorousAuthor 4/14/2022 11:04', #package : #StackMachine } } } -------------------------------------------------------------------------------- /lepiter/attachments/7d4vgu8428d5zekyjgbq9pbmw/1zgarrgwhn7x1a7sfn5ksnbb4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/7d4vgu8428d5zekyjgbq9pbmw/1zgarrgwhn7x1a7sfn5ksnbb4.png -------------------------------------------------------------------------------- /lepiter/attachments/7d4vgu8428d5zekyjgbq9pbmw/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2023-11-15T19:14:24.109399+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/7d4vgu929lrzz3flebimm9ebo/1zgarrhnnky9l2usbltt8c4ef-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/7d4vgu929lrzz3flebimm9ebo/1zgarrhnnky9l2usbltt8c4ef-1.png -------------------------------------------------------------------------------- /lepiter/attachments/7d4vgu929lrzz3flebimm9ebo/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2023-11-15T19:15:23.909416+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/7d4vgub855ra25t76uvvsq3gd/explainable-systems-tool-centered-decisions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/7d4vgub855ra25t76uvvsq3gd/explainable-systems-tool-centered-decisions.png -------------------------------------------------------------------------------- /lepiter/attachments/7d4vgub855ra25t76uvvsq3gd/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2023-11-16T08:24:40.221464+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/7d4vgubkw1qj64gxh6tj0hn0w/explainable-systems-manual-decisions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/7d4vgubkw1qj64gxh6tj0hn0w/explainable-systems-manual-decisions.png -------------------------------------------------------------------------------- /lepiter/attachments/7d4vgubkw1qj64gxh6tj0hn0w/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2023-11-16T08:23:16.048523+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/82u1ehv9oec7k7jm8sl2bx9nm/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-10-31T10:47:10.471531+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/82u1ehv9oec7k7jm8sl2bx9nm/moldableStackCode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/82u1ehv9oec7k7jm8sl2bx9nm/moldableStackCode.png -------------------------------------------------------------------------------- /lepiter/attachments/96x9njz7aqd0qux2ntb7fe2ly/Screenshot 2024-08-05 at 13.29.51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/96x9njz7aqd0qux2ntb7fe2ly/Screenshot 2024-08-05 at 13.29.51.png -------------------------------------------------------------------------------- /lepiter/attachments/96x9njz7aqd0qux2ntb7fe2ly/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-09-13T07:43:00.206359+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/9f74peaib7svljexyje0dg65w/drillerShortcuts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/9f74peaib7svljexyje0dg65w/drillerShortcuts.png -------------------------------------------------------------------------------- /lepiter/attachments/9f74peaib7svljexyje0dg65w/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-10-31T09:52:01.042219+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/9f74pebexvoxrlpfdfug4u93g/drillerShortcuts2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/9f74pebexvoxrlpfdfug4u93g/drillerShortcuts2.png -------------------------------------------------------------------------------- /lepiter/attachments/9f74pebexvoxrlpfdfug4u93g/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-10-31T10:01:41.469432+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/aoisxyipgyz7vgv8ixzqls579/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-07-29T20:41:13.677304+02:00"},"uploadedBy":{"__type":"email","emailString":"veit.heller@feenk.com"}} -------------------------------------------------------------------------------- /lepiter/attachments/aoisxyipgyz7vgv8ixzqls579/squarified-treemap-paper-algorithm-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/aoisxyipgyz7vgv8ixzqls579/squarified-treemap-paper-algorithm-example.png -------------------------------------------------------------------------------- /lepiter/attachments/aoisxyiybi07utq6jplxvps7t/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-07-29T20:39:45.415586+02:00"},"uploadedBy":{"__type":"email","emailString":"veit.heller@feenk.com"}} -------------------------------------------------------------------------------- /lepiter/attachments/aoisxyiybi07utq6jplxvps7t/squarified-treemap-paper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/aoisxyiybi07utq6jplxvps7t/squarified-treemap-paper.png -------------------------------------------------------------------------------- /lepiter/attachments/b8yxhb30alr4xe23zd4sfnj4g/Screenshot 2023-02-26 at 13.04.25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/b8yxhb30alr4xe23zd4sfnj4g/Screenshot 2023-02-26 at 13.04.25.png -------------------------------------------------------------------------------- /lepiter/attachments/b8yxhb30alr4xe23zd4sfnj4g/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2023-02-26T13:22:21.191912+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/b8yxhb7z770mhdyhzqjvbwf6s/Screenshot 2023-01-18 at 18.34.47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/b8yxhb7z770mhdyhzqjvbwf6s/Screenshot 2023-01-18 at 18.34.47.png -------------------------------------------------------------------------------- /lepiter/attachments/b8yxhb7z770mhdyhzqjvbwf6s/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2023-02-26T13:22:48.646287+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/b9bjkparkgamd2hx6fgoqou5s/Screenshot 2024-07-31 at 17.45.30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/b9bjkparkgamd2hx6fgoqou5s/Screenshot 2024-07-31 at 17.45.30.png -------------------------------------------------------------------------------- /lepiter/attachments/b9bjkparkgamd2hx6fgoqou5s/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-08-01T11:29:16.278947+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/b9bjkpdk62gwp20uawtzf7hje/Screenshot 2024-07-31 at 17.45.16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/b9bjkpdk62gwp20uawtzf7hje/Screenshot 2024-07-31 at 17.45.16.png -------------------------------------------------------------------------------- /lepiter/attachments/b9bjkpdk62gwp20uawtzf7hje/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-08-01T11:29:41.236343+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/ch5f758npqdcbtxa2mgjp7dg1/Jumble.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpClassAddition { #class : RGClassDefinition { #annotations : IdentityDictionary { #superclassName : 'Object', #traitCompositionSource : '{}', #definitionSource : 'Object subclass: #Jumble\r\tinstanceVariableNames: \'wordDict\'\r\tclassVariableNames: \'\'\r\tpackage: \'Tutorial-Jumble\'' }, #name : #Jumble, #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ RGInstanceVariableDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #wordDict, #parent : @6 } ], #metaClass : RGMetaclassDefinition { #annotations : IdentityDictionary { #traitCompositionSource : '{}', #definitionSource : 'Jumble class\r\tinstanceVariableNames: \'\'' }, #name : #'Jumble class', #methods : IdentityDictionary { }, #protocols : Set [ ], #instanceVariables : OrderedCollection [ ], #baseClass : @6 }, #comment : RGCommentDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #parent : @6, #content : '' }, #classVariables : OrderedCollection [ ], #category : #Tutorial-Jumble, #package : #Tutorial-Jumble, #sharedPools : OrderedCollection [ ] } } } -------------------------------------------------------------------------------- /lepiter/attachments/ch5f758npqdcbtxa2mgjp7dg1/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-01-21T10:58:53.587363+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/ch5f75cn4oxr76qmexc63kphv/Jumble-unjumble.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #'unJumble:', #protocol : #accessing, #sourceCode : 'unJumble: aString\r\r\t^ wordDict at: aString sorted', #stamp : '', #package : #Tutorial-Jumble } } } -------------------------------------------------------------------------------- /lepiter/attachments/ch5f75cn4oxr76qmexc63kphv/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-01-21T11:01:26.143759+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/ch5f75d7lerqbfyatwduoj1cv/Jumble-initialize.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #initialize, #protocol : #accessing, #sourceCode : 'initialize\r\r\t| wordlistUrl words wordList |\r\twordlistUrl := \'https://raw.githubusercontent.com/dwyl/english-words/master/words_alpha.txt\'.\r\twords := (ZnUrl fromString: wordlistUrl) retrieveContents.\r\twordList := Character cr asString , Character lf asString split:\r\t\t words.\r\twordDict := Dictionary new.\r\twordList do: [ :word | \r\t\t| key |\r\t\tkey := word sorted.\r\t\twordDict\r\t\t\tat: key\r\t\t\tifPresent: [ :v | v addLast: word ]\r\t\t\tifAbsentPut: [ { word } asOrderedCollection ] ]\n', #stamp : '', #package : #Tutorial-Jumble } } } -------------------------------------------------------------------------------- /lepiter/attachments/ch5f75d7lerqbfyatwduoj1cv/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-01-21T11:00:08.038358+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/ch5f75dffhfuwj9g6g55h2ag0/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-01-21T10:59:13.196026+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjebdk4z3wivfvuj49a1y/lazy-unJumble.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #'unJumble:', #protocol : #accessing, #sourceCode : 'unJumble: aString\r\r\t^ wordDict at: aString sorted', #stamp : 'GlamorousAuthor 1/24/2022 08:49', #package : #Tutorial-Jumble }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #'unJumble:', #protocol : #accessing, #sourceCode : 'unJumble: aString\r\r\t^ self wordDict at: aString sorted ifAbsent: OrderedCollection new', #stamp : 'GlamorousAuthor 1/24/2022 10:10', #package : #Tutorial-Jumble } } } -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjebdk4z3wivfvuj49a1y/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-02-07T10:43:46.431229+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjfa6khaam5y6goo08e7a/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-02-07T10:36:12.459003+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjfa6khaam5y6goo08e7a/wordDict-accessor.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #wordDict, #protocol : #accessing, #sourceCode : 'wordDict\r\r\twordDict ifNil: [ self initializeWordDict ].\r\t^ wordDict', #stamp : 'GlamorousAuthor 1/24/2022 10:06', #package : #Tutorial-Jumble } } } -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjfeaym7z9ys26chofh4b/altUrl.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #'Jumble class', #isMetaSide : true }, #name : #altUrl, #protocol : #constants, #sourceCode : 'altUrl\r\r\t^ \'https://raw.githubusercontent.com/jeremy-rifkin/Wordlist/master/res/c.txt\'', #stamp : 'GlamorousAuthor 1/24/2022 09:40', #package : #Tutorial-Jumble } } } -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjfeaym7z9ys26chofh4b/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-02-07T10:29:00.603937+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjgbhuci690kdcst2tskw/from-class-side.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #'Jumble class', #isMetaSide : true }, #name : #'from:', #protocol : #'instance creation', #sourceCode : 'from: aWordListUrl\r\r\t| aJumble |\r\taJumble := self new.\r\taJumble wordlistUrl: aWordListUrl.\r\t^ aJumble', #stamp : 'GlamorousAuthor 1/24/2022 09:58', #package : #Tutorial-Jumble } } } -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjgbhuci690kdcst2tskw/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-02-07T10:42:22.209446+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjghvvz4el2t7c0fcmtim/defaultExample.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #defaultExample, #protocol : #example, #sourceCode : 'defaultExample\r\r\t\r\t| jumble |\r\tjumble := Jumble new.\r\tself assert: (jumble unJumble: \'gameses\') size = 2.\r\tself assert: (jumble unJumble: \'gameses\') second = \'message\'.\r\t^ jumble', #stamp : 'GlamorousAuthor 1/24/2022 08:57', #package : #Tutorial-Jumble } } } -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjghvvz4el2t7c0fcmtim/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-02-07T10:05:52.691446+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjh8sx87lnccwc1yw4is3/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-02-07T10:32:47.615531+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/dglzwji5fpcpvvl9jy3p77djc/altExmaple.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #altExample, #protocol : #example, #sourceCode : 'altExample\r\r\t\r\t| jumble |\r\tjumble := Jumble from: Jumble altUrl.\r\tself assert: (jumble unJumble: \'gameses\') size = 1.\r\tself assert: (jumble unJumble: \'gameses\') first = \'message\'.\r\tself assert: (jumble unJumble: \'xyz\') isEmpty.\r\t^ jumble', #stamp : 'GlamorousAuthor 1/24/2022 10:11', #package : #Tutorial-Jumble } } } -------------------------------------------------------------------------------- /lepiter/attachments/dglzwji5fpcpvvl9jy3p77djc/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-02-07T10:19:13.93161+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjis4sht2v0zx458locxd/defaultUrl.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #defaultUrl, #protocol : #constants, #sourceCode : 'defaultUrl\r\r\t^ \'https://raw.githubusercontent.com/dwyl/english-words/master/words_alpha.txt\'', #stamp : 'GlamorousAuthor 1/24/2022 09:40', #package : #Tutorial-Jumble } } } -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjis4sht2v0zx458locxd/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-02-07T10:30:50.62055+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjji54qdx95rx752vmr2d/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-02-07T10:40:15.413065+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjji54qdx95rx752vmr2d/wordlistUrl.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #'wordlistUrl:', #protocol : #initialization, #sourceCode : 'wordlistUrl: aString\r\r\twordlistUrl := aString', #stamp : 'GlamorousAuthor 1/24/2022 09:57', #package : #Tutorial-Jumble } } } -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjkflu8133mrveziefbx0/initialize-v2.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #initialize, #protocol : #initialization, #sourceCode : 'initialize\r\r\t| wordlistUrl words wordList |\r\twordlistUrl := \'https://raw.githubusercontent.com/dwyl/english-words/master/words_alpha.txt\'.\r\twords := (ZnUrl fromString: wordlistUrl) retrieveContents.\r\twordList := Character cr asString , Character lf asString split:\r\t\t words.\r\twordDict := Dictionary new.\r\twordList do: [ :word | \r\t\t| key |\r\t\tkey := word sorted.\r\t\twordDict\r\t\t\tat: key\r\t\t\tifPresent: [ :v | v addLast: word ]\r\t\t\tifAbsentPut: [ { word } asOrderedCollection ] ]\n', #stamp : 'GlamorousAuthor 1/24/2022 08:56', #package : #Tutorial-Jumble }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #initialize, #protocol : #initialization, #sourceCode : 'initialize\r\r\t| words wordList |\r\tself wordlistUrl: self defaultUrl', #stamp : 'GlamorousAuthor 1/24/2022 10:07', #package : #Tutorial-Jumble } } } -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjkflu8133mrveziefbx0/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-02-07T10:34:47.660996+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjktqpva9le6jzn8opo4s/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-02-07T10:39:03.758971+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjktqpva9le6jzn8opo4s/lineSeparatorFor.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #'lineSeparatorFor:', #protocol : #private, #sourceCode : 'lineSeparatorFor: words\r\r\t"Search for the line separator in the first 100 characters of words."\r\r\t| fragment cr lf crlf |\r\tfragment := words copyFrom: 1 to: 100.\r\r\tcr := Character cr asString.\r\tlf := Character lf asString.\r\tcrlf := cr , lf.\r\r\t(fragment includesSubstring: crlf) ifTrue: [ ^ crlf ].\r\t(fragment includesSubstring: cr) ifTrue: [ ^ cr ].\r\t(fragment includesSubstring: lf) ifTrue: [ ^ lf ].\r\r\tself error: \'Couldn\'\'t find line separator!\'', #stamp : 'GlamorousAuthor 1/24/2022 10:17', #package : #Tutorial-Jumble } } } -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjlny63kppnbvq1vr9o4q/initializeWordDict.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #initializeWordDict, #protocol : #initialization, #sourceCode : 'initializeWordDict\r\r\t| words separator wordList |\r\twordDict := Dictionary new.\r\r\twords := (ZnUrl fromString: wordlistUrl) retrieveContents.\r\r\tseparator := self lineSeparatorFor: words.\r\r\twordList := separator split: words.\r\twordList do: [ :word | \r\t\t| key |\r\t\tkey := word sorted.\r\t\twordDict\r\t\t\tat: key\r\t\t\tifPresent: [ :v | v addLast: word ]\r\t\t\tifAbsentPut: [ { word } asOrderedCollection ] ]', #stamp : 'GlamorousAuthor 1/24/2022 10:07', #package : #Tutorial-Jumble } } } -------------------------------------------------------------------------------- /lepiter/attachments/dglzwjlny63kppnbvq1vr9o4q/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-02-07T10:37:26.936407+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/e5aw309k6cdtf01bnt9g6pivc/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-12-09T18:17:30.126327+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/e5aw309k6cdtf01bnt9g6pivc/word-snippet-explanation.json: -------------------------------------------------------------------------------- 1 | ["refactoring",[{"phonetics":[],"meanings":[{"definitions":[{"synonyms":[],"definition":"To rewrite existing source code in order to improve its readability, reusability or structure without affecting its meaning or behaviour.","antonyms":[],"example":"The code works, but I must refactor it before it is production quality."},{"synonyms":[],"definition":"(writing) To rewrite existing text in order to improve its readability, reusability or structure without intentionally affecting its meaning. Similar to, but sometimes involving more extensive restructuring than, copy editing.","antonyms":[],"example":"Two significant activities which to contribute to community projects, such as Wikipedia, are to refactor complicated articles into simpler ones, and to refactor duplicated content into reusable templates."}],"synonyms":[],"antonyms":[],"partOfSpeech":"verb"},{"definitions":[{"synonyms":[],"definition":"An act or process in which code is refactored.","antonyms":[]}],"synonyms":[],"antonyms":[],"partOfSpeech":"noun"}],"word":"refactoring","sourceUrls":["https://en.wiktionary.org/wiki/refactor","https://en.wiktionary.org/wiki/refactoring"],"license":{"name":"CC BY-SA 3.0","url":"https://creativecommons.org/licenses/by-sa/3.0"}}]] -------------------------------------------------------------------------------- /lepiter/attachments/e5f5x587uudwtw0jt7nt8jr3a/craft-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/e5f5x587uudwtw0jt7nt8jr3a/craft-3.png -------------------------------------------------------------------------------- /lepiter/attachments/e5f5x587uudwtw0jt7nt8jr3a/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2023-04-21T11:54:51.975882+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/e5f5x58aq6a4z5wjthxjtez0r/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2023-04-21T11:55:49.571785+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/e5f5x58aq6a4z5wjthxjtez0r/roles-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/e5f5x58aq6a4z5wjthxjtez0r/roles-1.png -------------------------------------------------------------------------------- /lepiter/attachments/e5f5x58lhdajsu9j7xajpb3q7/50percent-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/e5f5x58lhdajsu9j7xajpb3q7/50percent-3.png -------------------------------------------------------------------------------- /lepiter/attachments/e5f5x58lhdajsu9j7xajpb3q7/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2023-04-21T11:53:10.860669+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/e5f5x5bifz9x8au48ylb60vcf/craft-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/e5f5x5bifz9x8au48ylb60vcf/craft-1.png -------------------------------------------------------------------------------- /lepiter/attachments/e5f5x5bifz9x8au48ylb60vcf/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2023-04-21T11:53:57.363704+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/e5f5x5buneizrudd5ukf31s5h/50percent-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/e5f5x5buneizrudd5ukf31s5h/50percent-2.png -------------------------------------------------------------------------------- /lepiter/attachments/e5f5x5buneizrudd5ukf31s5h/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2023-04-21T11:51:32.088508+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/e5f5x5f49a24o7gl93sfldz2q/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2023-04-21T11:56:16.366245+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/e5f5x5f49a24o7gl93sfldz2q/roles-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/e5f5x5f49a24o7gl93sfldz2q/roles-2.png -------------------------------------------------------------------------------- /lepiter/attachments/ejn67l4404msqbgqo9fx8e7h8/beacon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/ejn67l4404msqbgqo9fx8e7h8/beacon.png -------------------------------------------------------------------------------- /lepiter/attachments/ejn67l4404msqbgqo9fx8e7h8/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.0","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-05-18T22:42:12.250461+02:00"},"uploadedBy":{"__type":"email","emailString":"tudor@tudorgirba.com"}} -------------------------------------------------------------------------------- /lepiter/attachments/f4t6d71n0g0eg7ardoshp1qdz/initialize-v2.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '0' ], #self : OmReference [ '1' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #initialize, #protocol : #initialization, #sourceCode : 'initialize\r\r\t| wordlistUrl words wordList |\r\twordlistUrl := \'https://raw.githubusercontent.com/dwyl/english-words/master/words_alpha.txt\'.\r\twords := (ZnUrl fromString: wordlistUrl) retrieveContents.\r\twordList := Character cr asString , Character lf asString split:\r\t\t words.\r\twordDict := Dictionary new.\r\twordList do: [ :word | \r\t\t| key |\r\t\tkey := word sorted.\r\t\twordDict\r\t\t\tat: key\r\t\t\tifPresent: [ :v | v addLast: word ]\r\t\t\tifAbsentPut: [ { word } asOrderedCollection ] ]\n', #stamp : 'GlamorousAuthor 2/7/2022 11:40', #package : #Tutorial-Jumble }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #Jumble, #isMetaSide : false }, #name : #initialize, #protocol : #initialization, #sourceCode : 'initialize\r\r\tself wordlistUrl: self defaultUrl', #stamp : 'GlamorousAuthor 2/7/2022 11:34', #package : #Tutorial-Jumble } } } -------------------------------------------------------------------------------- /lepiter/attachments/f4t6d71n0g0eg7ardoshp1qdz/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-02-07T11:42:04.197617+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/f4t6d72fr191tyiet1p5jmmit/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2022-02-07T11:38:51.028554+01:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/in4er2pj2nlkeh35eiynzdjr/Screenshot 2024-04-25 at 15.12.02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/in4er2pj2nlkeh35eiynzdjr/Screenshot 2024-04-25 at 15.12.02.png -------------------------------------------------------------------------------- /lepiter/attachments/in4er2pj2nlkeh35eiynzdjr/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-04-25T15:40:11.642205+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/in4er320391qcvxfo3dy5woj/Screenshot 2024-04-25 at 14.48.35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/in4er320391qcvxfo3dy5woj/Screenshot 2024-04-25 at 14.48.35.png -------------------------------------------------------------------------------- /lepiter/attachments/in4er320391qcvxfo3dy5woj/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-04-25T15:38:46.974805+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/in4er32qtqimmgmt3h96vxcw/Screenshot 2024-04-25 at 14.49.10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/in4er32qtqimmgmt3h96vxcw/Screenshot 2024-04-25 at 14.49.10.png -------------------------------------------------------------------------------- /lepiter/attachments/in4er32qtqimmgmt3h96vxcw/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-04-25T15:39:31.274595+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/in4er72kcsvtzi3y99zhpvc4/Screenshot 2024-04-25 at 14.37.05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/in4er72kcsvtzi3y99zhpvc4/Screenshot 2024-04-25 at 14.37.05.png -------------------------------------------------------------------------------- /lepiter/attachments/in4er72kcsvtzi3y99zhpvc4/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-04-25T15:38:07.405865+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/in4er8uzqaely1wxcs12xw50/Screenshot 2024-04-25 at 14.49.10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/lepiter/attachments/in4er8uzqaely1wxcs12xw50/Screenshot 2024-04-25 at 14.49.10.png -------------------------------------------------------------------------------- /lepiter/attachments/in4er8uzqaely1wxcs12xw50/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.1","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2024-04-25T15:39:02.417988+02:00"},"uploadedBy":{"__type":"email","emailString":""}} -------------------------------------------------------------------------------- /lepiter/attachments/wmr9gf8jawfdh9evdtxd43zc/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.0","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-05-22T16:23:55.71446+02:00"},"uploadedBy":{"__type":"email","emailString":"tudor@tudorgirba.com"}} -------------------------------------------------------------------------------- /lepiter/attachments/wmr9gfe7ldhz85kjtc69flma/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.0","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-05-22T00:19:44.879839+02:00"},"uploadedBy":{"__type":"email","emailString":"tudor@tudorgirba.com"}} -------------------------------------------------------------------------------- /lepiter/attachments/wmr9gg6hbu0o0xsewqxmqyym/02-createFileOnDisk.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '2' ], #self : OmReference [ '3' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #GtExamplesTutorial, #isMetaSide : false }, #name : #createFileInMemory, #protocol : #examples, #sourceCode : 'createFileInMemory\r\t\r\t^ FileSystem memory workingDirectory / \'sample.txt\'\r\t\twriteStreamDo: [ :stream | stream nextPutAll: \'Sample contents\' ];\r\t\tyourself', #stamp : 'TudorGirba 5/6/2018 21:45', #package : #GToolkit-Examples-Dummies }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #GtExamplesTutorial, #isMetaSide : false }, #name : #createFileInMemory, #protocol : #examples, #sourceCode : 'createFileInMemory\r\t\r\t\r\t^ FileSystem memory workingDirectory / \'sample.txt\'\r\t\twriteStreamDo: [ :stream | stream nextPutAll: \'Sample contents\' ];\r\t\tyourself', #stamp : 'TudorGirba 5/6/2018 21:45', #package : #GToolkit-Examples-Dummies } } } -------------------------------------------------------------------------------- /lepiter/attachments/wmr9gg6hbu0o0xsewqxmqyym/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.0","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-05-22T00:35:46.238187+02:00"},"uploadedBy":{"__type":"email","emailString":"tudor@tudorgirba.com"}} -------------------------------------------------------------------------------- /lepiter/attachments/wmr9gge1jtpvks3c86hclxhc/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.0","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-05-22T16:26:49.259679+02:00"},"uploadedBy":{"__type":"email","emailString":"tudor@tudorgirba.com"}} -------------------------------------------------------------------------------- /lepiter/attachments/wmr9gjypb0lddthyi8bxryz4/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.0","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-05-22T16:28:55.697413+02:00"},"uploadedBy":{"__type":"email","emailString":"tudor@tudorgirba.com"}} -------------------------------------------------------------------------------- /lepiter/attachments/wmr9gldn7910fu1hk8b2f99h/04-fileOnDisk.ombu: -------------------------------------------------------------------------------- 1 | OmEntry { #tags : { #prior : OmReference [ '3' ], #self : OmReference [ '4' ] }, #content : EpMethodModification { #oldMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #GtExamplesTutorial, #isMetaSide : false }, #name : #createFileOnDisk, #protocol : #examples, #sourceCode : 'createFileOnDisk\r\t\r\t\r\t^ self directoryOnDisk / self fileName\r\t\twriteStreamDo: [ :stream | stream nextPutAll: self fileContents ];\r\t\tyourself', #stamp : 'TudorGirba 5/6/2018 21:41', #package : #GToolkit-Examples-Dummies }, #newMethod : RGMethodDefinition { #annotations : IdentityDictionary { #className : #GtExamplesTutorial, #isMetaSide : false }, #name : #createFileOnDisk, #protocol : #examples, #sourceCode : 'createFileOnDisk\r\t\r\t^ self directoryOnDisk / self fileName\r\t\twriteStreamDo: [ :stream | stream nextPutAll: self fileContents ];\r\t\tyourself', #stamp : 'TudorGirba 5/6/2018 21:42', #package : #GToolkit-Examples-Dummies } } } OmEntry { #tags : { #prior : OmReference [ '4' ], #self : OmReference [ '5' ] }, #content : EpMethodAddition { #method : RGMethodDefinition { #annotations : IdentityDictionary { #className : #GtExamplesTutorial, #isMetaSide : false }, #name : #directoryOnDisk, #protocol : #examples, #sourceCode : 'directoryOnDisk\r\t\r\t^ FileSystem workingDirectory', #stamp : 'TudorGirba 5/6/2018 21:40', #package : #GToolkit-Examples-Dummies } } } -------------------------------------------------------------------------------- /lepiter/attachments/wmr9gldn7910fu1hk8b2f99h/lepiter_attachment.properties: -------------------------------------------------------------------------------- 1 | {"__schema":"4.0","__type":"attachment","uploadDate":{"__type":"dateAndTime","dateAndTimeString":"2021-05-22T16:26:01.106541+02:00"},"uploadedBy":{"__type":"email","emailString":"tudor@tudorgirba.com"}} -------------------------------------------------------------------------------- /lepiter/b8yxhb6qs6bw3ezid09jw8o6l.lepiter: -------------------------------------------------------------------------------- 1 | { 2 | "__schema" : "4.1", 3 | "__type" : "page", 4 | "children" : { 5 | "__type" : "snippets", 6 | "items" : [ 7 | { 8 | "__type" : "textSnippet", 9 | "children" : { 10 | "__type" : "snippets", 11 | "items" : [ ] 12 | }, 13 | "createEmail" : { 14 | "__type" : "email", 15 | "emailString" : "" 16 | }, 17 | "createTime" : { 18 | "__type" : "time", 19 | "time" : { 20 | "__type" : "dateAndTime", 21 | "dateAndTimeString" : "2023-02-25T18:49:17.879916+01:00" 22 | } 23 | }, 24 | "editEmail" : { 25 | "__type" : "email", 26 | "emailString" : "" 27 | }, 28 | "editTime" : { 29 | "__type" : "time", 30 | "time" : { 31 | "__type" : "dateAndTime", 32 | "dateAndTimeString" : "2023-02-25T18:49:21.393741+01:00" 33 | } 34 | }, 35 | "uid" : { 36 | "__type" : "uid", 37 | "uidString" : "A5jxmeuxDQCRtjqvABcDvg==" 38 | }, 39 | "paragraphStyle" : { 40 | "__type" : "textStyle" 41 | }, 42 | "string" : "Java, the language." 43 | } 44 | ] 45 | }, 46 | "createEmail" : { 47 | "__type" : "email", 48 | "emailString" : "" 49 | }, 50 | "createTime" : { 51 | "__type" : "time", 52 | "time" : { 53 | "__type" : "dateAndTime", 54 | "dateAndTimeString" : "2023-02-25T18:49:15.379957+01:00" 55 | } 56 | }, 57 | "editEmail" : { 58 | "__type" : "email", 59 | "emailString" : "" 60 | }, 61 | "editTime" : { 62 | "__type" : "time", 63 | "time" : { 64 | "__type" : "dateAndTime", 65 | "dateAndTimeString" : "2023-02-25T18:49:15.379957+01:00" 66 | } 67 | }, 68 | "pageType" : { 69 | "__type" : "namedPage", 70 | "title" : "Java" 71 | }, 72 | "uid" : { 73 | "__type" : "uuid", 74 | "uuid" : "6d08f199-ebb1-0d00-91b5-8ac7001703be" 75 | } 76 | } -------------------------------------------------------------------------------- /lepiter/btty1obm80nk9votoodjfap40.lepiter: -------------------------------------------------------------------------------- 1 | { 2 | "__schema" : "4.1", 3 | "__type" : "page", 4 | "children" : { 5 | "__type" : "snippets", 6 | "items" : [ 7 | { 8 | "__type" : "textSnippet", 9 | "children" : { 10 | "__type" : "snippets", 11 | "items" : [ ] 12 | }, 13 | "createEmail" : { 14 | "__type" : "email", 15 | "emailString" : "" 16 | }, 17 | "createTime" : { 18 | "__type" : "time", 19 | "time" : { 20 | "__type" : "dateAndTime", 21 | "dateAndTimeString" : "2023-02-24T02:46:32.521858+01:00" 22 | } 23 | }, 24 | "editEmail" : { 25 | "__type" : "email", 26 | "emailString" : "" 27 | }, 28 | "editTime" : { 29 | "__type" : "time", 30 | "time" : { 31 | "__type" : "dateAndTime", 32 | "dateAndTimeString" : "2023-02-24T02:46:32.687285+01:00" 33 | } 34 | }, 35 | "uid" : { 36 | "__type" : "uid", 37 | "uidString" : "tab4CMqxDQCvF3cNB+HMxw==" 38 | }, 39 | "paragraphStyle" : { 40 | "__type" : "textStyle" 41 | }, 42 | "string" : "XML" 43 | } 44 | ] 45 | }, 46 | "createEmail" : { 47 | "__type" : "email", 48 | "emailString" : "" 49 | }, 50 | "createTime" : { 51 | "__type" : "time", 52 | "time" : { 53 | "__type" : "dateAndTime", 54 | "dateAndTimeString" : "2023-02-24T02:46:29.221884+01:00" 55 | } 56 | }, 57 | "editEmail" : { 58 | "__type" : "email", 59 | "emailString" : "" 60 | }, 61 | "editTime" : { 62 | "__type" : "time", 63 | "time" : { 64 | "__type" : "dateAndTime", 65 | "dateAndTimeString" : "2023-02-24T02:46:29.221884+01:00" 66 | } 67 | }, 68 | "pageType" : { 69 | "__type" : "namedPage", 70 | "title" : "XML" 71 | }, 72 | "uid" : { 73 | "__type" : "uuid", 74 | "uuid" : "a008f808-cab1-0d00-af16-5b4607e1ccc7" 75 | } 76 | } -------------------------------------------------------------------------------- /lepiter/c5ababo1kkxbrquuxvi6etvuw.lepiter: -------------------------------------------------------------------------------- 1 | { 2 | "__schema" : "4.1", 3 | "__type" : "page", 4 | "children" : { 5 | "__type" : "snippets", 6 | "items" : [ 7 | { 8 | "__type" : "textSnippet", 9 | "children" : { 10 | "__type" : "snippets", 11 | "items" : [ ] 12 | }, 13 | "createEmail" : { 14 | "__type" : "email", 15 | "emailString" : "" 16 | }, 17 | "createTime" : { 18 | "__type" : "time", 19 | "time" : { 20 | "__type" : "dateAndTime", 21 | "dateAndTimeString" : "2024-06-22T16:09:47.571537+02:00" 22 | } 23 | }, 24 | "editEmail" : { 25 | "__type" : "email", 26 | "emailString" : "" 27 | }, 28 | "editTime" : { 29 | "__type" : "time", 30 | "time" : { 31 | "__type" : "dateAndTime", 32 | "dateAndTimeString" : "2024-06-22T16:09:51.032392+02:00" 33 | } 34 | }, 35 | "uid" : { 36 | "__type" : "uid", 37 | "uidString" : "ZFlu1tzXDQC2jBGLC8IszQ==" 38 | }, 39 | "paragraphStyle" : { 40 | "__type" : "textStyle" 41 | }, 42 | "string" : "Abstract syntax tree" 43 | } 44 | ] 45 | }, 46 | "createEmail" : { 47 | "__type" : "email", 48 | "emailString" : "" 49 | }, 50 | "createTime" : { 51 | "__type" : "time", 52 | "time" : { 53 | "__type" : "dateAndTime", 54 | "dateAndTimeString" : "2024-06-22T16:09:47.535743+02:00" 55 | } 56 | }, 57 | "editEmail" : { 58 | "__type" : "email", 59 | "emailString" : "" 60 | }, 61 | "editTime" : { 62 | "__type" : "time", 63 | "time" : { 64 | "__type" : "dateAndTime", 65 | "dateAndTimeString" : "2024-06-22T16:09:47.535743+02:00" 66 | } 67 | }, 68 | "pageType" : { 69 | "__type" : "namedPage", 70 | "title" : "AST" 71 | }, 72 | "uid" : { 73 | "__type" : "uuid", 74 | "uuid" : "88cc6dd6-dcd7-0d00-b68b-85470bc22ccd" 75 | } 76 | } -------------------------------------------------------------------------------- /lepiter/lepiter.properties: -------------------------------------------------------------------------------- 1 | { 2 | "jsLink" : { 3 | "serverDebugMode" : true 4 | }, 5 | "tableOfContents" : "6k9vwu4iqoe6r1g3or2plhse3", 6 | "databaseName" : "Glamorous Toolkit Book", 7 | "schema" : "4.1", 8 | "uuid" : "4cc78ab5-9ab6-4a08-a953-ab622292d22a", 9 | "pythonBridge" : { 10 | "serverDebugMode" : true 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /scripts/build/parallelsmoke/lnx_2_2_smoke.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -o xtrace 3 | set -e 4 | #run smoke tests 5 | 6 | #first start gt with a 60 second timeout and put its process in the background with an & 7 | timeout 60 xvfb-run -a ./GlamorousToolkitLinux64*/glamoroustoolkit GlamorousToolkitLinux64*/GlamorousToolkit.image --interactive & 8 | 9 | #then sleep for 50 seconds so that gt has time to boot and settle 10 | sleep 50 11 | 12 | #then take a screenshot of the screen 13 | export DISPLAY=$(ps -aux | grep screen -m 1 | awk '{print $12}') 14 | export XAUTHORITY=$(ps -aux | grep screen -m 1 | awk '{print $19}') 15 | 16 | # It is enough to specify -root to take a screenshot of the main screen 17 | xwd -display $DISPLAY -root -out gt.xwd 18 | convert -verbose gt.xwd gt.jpg 19 | 20 | if [ $(find gt.jpg -type f -size +15000c 2>/dev/null) ] 21 | then 22 | echo "Screenshot looking good." 23 | else 24 | ls -al 25 | echo "gt.jpg does not exist or is too small. Exiting with 1 in order to fail the build." 26 | exit 1 27 | fi 28 | -------------------------------------------------------------------------------- /scripts/build/upload.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -o xtrace 3 | set -e 4 | pwd 5 | ls -al 6 | AWS="ubuntu@sftp.feenk.com" 7 | GT_FOLDER=/var/www/html/gt/ 8 | SCRIPTS_FOLDER=/var/www/html/scripts/ 9 | 10 | # Upload released artefacts to https://dl.feenk.com/gt/ 11 | scp GlamorousToolkit*.zip "$AWS:$GT_FOLDER" 12 | 13 | # Save the date so we can show it in the download button 14 | date +%s > releasedateinseconds 15 | scp releasedateinseconds "$AWS:$GT_FOLDER/.releasedateinseconds" 16 | 17 | # Remove the oldest 40 releases 18 | ssh "$AWS" -t "cd ${GT_FOLDER}; ls -tp | grep -v '/$' | tail -n +40 | xargs -d '\n' -r rm --" 19 | 20 | # Deploy local build scripts (Mac, Linux and Windows) 21 | scp scripts/localbuild/*.sh "$AWS:$SCRIPTS_FOLDER" 22 | scp scripts/localbuild/*.ps1 "$AWS:$SCRIPTS_FOLDER" 23 | 24 | pwd 25 | set +e 26 | -------------------------------------------------------------------------------- /scripts/docker/gtoolkit/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:latest as ubuntu-gtbase 2 | # This build prepares ubuntu for GToolkit, installing required libraries. 3 | 4 | LABEL authors="feenk" 5 | LABEL maintainer="feenk " 6 | 7 | # Install required applications 8 | # Source: https://octopus.com/blog/using-ubuntu-docker-image 9 | RUN echo 'APT::Install-Suggests "0";' >> /etc/apt/apt.conf.d/00-docker 10 | RUN echo 'APT::Install-Recommends "0";' >> /etc/apt/apt.conf.d/00-docker 11 | # Install libraries: 12 | # - libgl1 OpenGL (libgl1 is API and libgl1-mesa is a specific backend), 13 | # - libegl1 OpenEGL, 14 | # - libfreetype6 and libfontconfig1 to support font and text rendering, 15 | # - libx11-6 - for an event loop and windowing support 16 | RUN DEBIAN_FRONTEND=noninteractive \ 17 | apt-get update \ 18 | && apt-get install -y libfreetype6 libfontconfig1 libx11-6 libgl-dev libglvnd-dev libegl1 \ 19 | && rm -rf /var/lib/apt/lists/* 20 | 21 | # Create working directory 22 | RUN mkdir "/gtoolkit" 23 | WORKDIR "/gtoolkit/" 24 | 25 | 26 | FROM ubuntu-gtbase as gtoolkit 27 | # This build includes all necessary GToolkit executable, data, documentation files. 28 | 29 | # Copy basic Pharo run script. You want to replace the run.st file with our own version 30 | COPY docker-image/run.st /gtoolkit/ 31 | 32 | # Copy Pharo sources, VM (lib, bin), Pharo image and changes 33 | COPY *.sources /gtoolkit/ 34 | COPY lib /gtoolkit/lib/ 35 | COPY bin /gtoolkit/bin/ 36 | COPY GlamorousToolkit.changes /gtoolkit/ 37 | COPY GlamorousToolkit.image /gtoolkit/ 38 | 39 | # Copy documentation 40 | COPY gt-extra /gtoolkit/gt-extra/ 41 | 42 | ENTRYPOINT [ "./bin/GlamorousToolkit-cli", "GlamorousToolkit.image", "st", "run.st" ] 43 | -------------------------------------------------------------------------------- /scripts/docker/gtoolkit/README.md: -------------------------------------------------------------------------------- 1 | # GToolkit docker images 2 | 3 | This directory includes Docker files that are used to build GToolkit docker images. 4 | Images are published at [Docker Hub](https://hub.docker.com/r/feenkcom/gtoolkit). 5 | 6 | More information about building GToolkit image files is available at the Jenkins file of this repository. 7 | -------------------------------------------------------------------------------- /scripts/docker/gtoolkit/docker-image/run.st: -------------------------------------------------------------------------------- 1 | "Startup code template." 2 | Transcript 3 | cr; 4 | show: 'GToolkit '; 5 | show: GtImage version versionString; 6 | show: ' in a Docker container is ready.'; 7 | cr; 8 | show: 'Use `COPY run.st /gtoolkit/` Dockerfile command to configure what to execute.'; 9 | cr. 10 | 11 | "Remove (or change) the next line if you're starting a server." 12 | Smalltalk snapshot: false andQuit: true. 13 | -------------------------------------------------------------------------------- /scripts/localbuild/linux.sh: -------------------------------------------------------------------------------- 1 | #/bin/sh! 2 | # 3 | # Installs Glamorous Toolkit 4 | # 5 | 6 | curl -LsS https://github.com/feenkcom/gtoolkit-maestro-rs/releases/latest/download/installer.sh | bash 7 | 8 | exit 0 9 | -------------------------------------------------------------------------------- /scripts/localbuild/mac.sh: -------------------------------------------------------------------------------- 1 | #/bin/sh! 2 | # 3 | # Installs Glamorous Toolkit 4 | # 5 | 6 | curl -LsS https://github.com/feenkcom/gtoolkit-maestro-rs/releases/latest/download/installer.sh | bash 7 | 8 | exit 0 9 | -------------------------------------------------------------------------------- /scripts/localbuild/windows.ps1: -------------------------------------------------------------------------------- 1 | $installer = "gt-maestro" 2 | $osArchitecture = (Get-CimInstance -ClassName Win32_OperatingSystem).OSArchitecture 3 | 4 | if ($osArchitecture -match "64") { 5 | if ($osArchitecture -match "ARM") { 6 | $installerArch = "aarch64" 7 | } 8 | else { 9 | $installerArch = "x86_64" 10 | } 11 | } 12 | else { 13 | throw "Your architecture ($osArchitecture) is currently unsupported" 14 | } 15 | 16 | 17 | curl -o "$installer.exe" "https://github.com/feenkcom/gtoolkit-maestro-rs/releases/latest/download/gt-installer-$installerArch-pc-windows-msvc.exe" 18 | Start-Process -FilePath ".\$installer.exe" -ArgumentList "local-build" -Wait -NoNewWindow 19 | -------------------------------------------------------------------------------- /scripts/rollback/Jenkinsfile: -------------------------------------------------------------------------------- 1 | pipeline { 2 | agent { 3 | label "unix" 4 | } 5 | stages { 6 | stage('Roll back gtoolkit.com') { 7 | steps { 8 | script { 9 | withCredentials([sshUserPrivateKey(credentialsId: '31ee68a9-4d6c-48f3-9769-a2b8b50452b0', keyFileVariable: 'identity', passphraseVariable: '', usernameVariable: 'userName')]) { 10 | def remote = [:] 11 | remote.name = 'deploy' 12 | remote.host = 'ec2-18-197-145-81.eu-central-1.compute.amazonaws.com' 13 | remote.user = userName 14 | remote.identityFile = identity 15 | remote.allowAnyHosts = true 16 | sshScript remote: remote, script: "scripts/rollback/rollback.sh" 17 | } 18 | } 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /scripts/rollback/rollback.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | export GTfolder=/var/www/html/gt 5 | 6 | cd $GTfolder 7 | 8 | function fail { 9 | printf '%s\n' "$1" >&2 10 | exit 1 11 | } 12 | 13 | function rollback { 14 | local release_archive_name=$(cat $GTfolder/GlamorousToolkit$1-release) 15 | local yank_version_number="$(cut -d '.' -f3 <<< $release_archive_name)" 16 | local rollback_version="$(($yank_version_number - 1))" 17 | 18 | [ -z "$yank_version_number" ] && fail "[$1] Failed to detect version to yank" 19 | [ -z "$rollback_version" ] && fail "[$1] Failed to detect a version before $yank_version_number" 20 | 21 | echo "[$1] We yank $yank_version_number and rollback to $rollback_version" 22 | 23 | # The following replaces the path to the release archive in the release file 24 | sed -i "s/${yank_version_number}/${rollback_version}/g" "$GTfolder/GlamorousToolkit$1-release" 25 | 26 | local rollback_archive_name=$(cat $GTfolder/GlamorousToolkit$1-release) 27 | cp -rf "$GTfolder/$rollback_archive_name" "$GTfolder/GlamorousToolkit$1-release.zip" 28 | } 29 | 30 | rollback "Win64" 31 | rollback "WinArm64" 32 | rollback "OSX64" 33 | rollback "OSXM1" 34 | rollback "Linux64" 35 | rollback "LinuxArm64" 36 | 37 | stat -c %Y "$(cat $GTfolder/GlamorousToolkitLinux64-release)" > .releasedateinseconds 38 | 39 | set +e 40 | -------------------------------------------------------------------------------- /scripts/user/gt_check_libs.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Check that Gtoolkit libraries have the required dependencies available 4 | # 5 | 6 | LOG_FILE="GtLibs-$(date --iso-8601).log" 7 | 8 | function libs_not_found() { 9 | echo "Unable to find Gtoolkit libraries." 10 | echo "This script assumes that the VM is located in the 'lib' directory" 11 | echo "below the image directory." 12 | echo "This script should be run from the image directory, i.e." 13 | echo "GToolkit-*.image and libSkia.so should be present" 14 | exit 1 15 | } 16 | 17 | 18 | 19 | # 20 | # Quick check of the log for problems 21 | # 22 | function check_log() { 23 | if [ "$(grep "not found" "$LOG_FILE")" -eq 0 ] 24 | then 25 | echo "Library dependencies missing" 26 | fi 27 | } 28 | 29 | 30 | 31 | # 32 | # Check that the libraries are present 33 | # 34 | if [ ! -f libSkia.so ] 35 | then 36 | libs_not_found 37 | fi 38 | if [ ! -f lib/libgit2.so ] 39 | then 40 | libs_not_found 41 | fi 42 | 43 | 44 | # 45 | # Ensure output redirection 46 | # 47 | if [ -z "$1" ] 48 | then 49 | $0 save > "$LOG_FILE" 50 | check_log 51 | echo "Output saved to $LOG_FILE" 52 | exit 0 53 | fi 54 | 55 | export LD_LIBRARY_PATH="$(pwd)/lib" 56 | 57 | echo "Run: $(date)" 58 | echo "" 59 | echo "glibc version:" 60 | echo "" 61 | ldd --version 62 | echo "" 63 | echo "Image directory:" 64 | echo "" 65 | ls -l 66 | echo "" 67 | echo "lib directory:" 68 | echo "" 69 | ls -l lib/ 70 | echo "" 71 | echo "libSkia.so" 72 | echo "" 73 | ldd libSkia.so 74 | echo "" 75 | echo "lib/libgit2.so" 76 | echo "" 77 | ldd lib/libgit2.so 78 | echo "" 79 | echo "glxinfo extract" 80 | echo "" 81 | glxinfo | grep -i opengl 82 | exit 0 83 | -------------------------------------------------------------------------------- /src/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feenkcom/gtoolkit/96b5078996ef86c1e7002e0a0405d9de7269274e/src/.gitignore -------------------------------------------------------------------------------- /src/.properties: -------------------------------------------------------------------------------- 1 | { 2 | #format : #tonel 3 | } -------------------------------------------------------------------------------- /src/BaselineOfGToolkit/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #BaselineOfGToolkit } 2 | -------------------------------------------------------------------------------- /src/BaselineOfGToolkitForPharo9/BaselineOfGToolkitForPharo9.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #BaselineOfGToolkitForPharo9, 3 | #superclass : #BaselineOf, 4 | #classVars : [ 5 | 'PostLoaded' 6 | ], 7 | #category : #BaselineOfGToolkitForPharo9 8 | } 9 | 10 | { #category : #baselines } 11 | BaselineOfGToolkitForPharo9 >> baseline: spec [ 12 | 13 | 14 | spec for: #common do: [ 15 | spec postLoadDoIt: #postLoadGToolkit:. 16 | spec 17 | baseline: 'GToolkitPrerequisites' 18 | with: [ spec repository: 'github://feenkcom/gtoolkit:main/src' ]. 19 | spec 20 | baseline: 'GToolkit' 21 | with: [ spec repository: 'github://feenkcom/gtoolkit:main/src' ]. 22 | 23 | spec 24 | package: 'GToolkit-PharoOverrides-Debugger' with: [ 25 | spec requires: #('GToolkitPrerequisites' 'GToolkit')] ] 26 | ] 27 | 28 | { #category : #accessing } 29 | BaselineOfGToolkitForPharo9 >> postLoadGToolkit: spec [ 30 | (PostLoaded isNotNil and: [ PostLoaded ]) ifTrue: [ ^ self ]. 31 | PostLoaded := true. 32 | 33 | ] 34 | -------------------------------------------------------------------------------- /src/BaselineOfGToolkitForPharo9/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #BaselineOfGToolkitForPharo9 } 2 | -------------------------------------------------------------------------------- /src/BaselineOfGToolkitMorphic/BaselineOfGToolkitMorphic.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #BaselineOfGToolkitMorphic, 3 | #superclass : #BaselineOf, 4 | #category : #BaselineOfGToolkitMorphic 5 | } 6 | 7 | { #category : #baseline } 8 | BaselineOfGToolkitMorphic >> baseline: spec [ 9 | 10 | spec for: #'common' do: [ 11 | spec 12 | baseline: 'Bloc' with: [ 13 | spec repository: 'github://feenkcom/Bloc:main/src' ]; 14 | baseline: 'GlutinMorphic' with: [ 15 | spec repository: 'github://feenkcom/gtoolkit-glutin:main/src' ]. 16 | spec package: #'GToolkit-Morphic' with: [ 17 | spec requires: #('Bloc' 'GlutinMorphic' ). ]. ]. 18 | 19 | ] 20 | -------------------------------------------------------------------------------- /src/BaselineOfGToolkitMorphic/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #BaselineOfGToolkitMorphic } 2 | -------------------------------------------------------------------------------- /src/BaselineOfGToolkitPharo6Compatibility/BaselineOfGToolkitPharo6Compatibility.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #BaselineOfGToolkitPharo6Compatibility, 3 | #superclass : #BaselineOf, 4 | #category : #BaselineOfGToolkitPharo6Compatibility 5 | } 6 | 7 | { #category : #baseline } 8 | BaselineOfGToolkitPharo6Compatibility >> baseline: spec [ 9 | 10 | spec for: #common do: [ 11 | spec 12 | preLoadDoIt: #updateZincHTTPComponents:; 13 | project: 'ZincHTTPComponentsCharacterEncoding' with: [ 14 | spec 15 | className: #ConfigurationOfZincHTTPComponents; 16 | repository: 'http://smalltalkhub.com/mc/SvenVanCaekenberghe/ZincHTTPComponents/main/'; 17 | versionString: #stable; 18 | loads: 'Character-Encoding' ]; 19 | package: 'GToolkit-Pharo6Compatibility' with: [ 20 | spec requires: #( 'ZincHTTPComponentsCharacterEncoding' ) ] 21 | ] 22 | 23 | ] 24 | 25 | { #category : #private } 26 | BaselineOfGToolkitPharo6Compatibility >> updateZincHTTPComponents: spec [ 27 | Gofer it 28 | smalltalkhubUser: 'SvenVanCaekenberghe' project: 'ZincHTTPComponents'; 29 | package: 'ConfigurationOfZincHTTPComponents'; 30 | load. 31 | (self class environment at: #ConfigurationOfZincHTTPComponents) project 32 | stableVersion load: 'Character-Encoding' 33 | ] 34 | -------------------------------------------------------------------------------- /src/BaselineOfGToolkitPharo6Compatibility/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #BaselineOfGToolkitPharo6Compatibility } 2 | -------------------------------------------------------------------------------- /src/BaselineOfGToolkitPrerequisites/CompiledMethod.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #CompiledMethod } 2 | 3 | { #category : #'*BaselineOfGToolkitPrerequisites' } 4 | CompiledMethod >> sha256HashString [ 5 | 6 | ^ (SHA256 hashStream: self sourceCode withInternalLineEndings readStream) hex. 7 | ] 8 | -------------------------------------------------------------------------------- /src/BaselineOfGToolkitPrerequisites/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #BaselineOfGToolkitPrerequisites } 2 | -------------------------------------------------------------------------------- /src/BaselineOfGToolkitTranscript/BaselineOfGToolkitTranscript.class.st: -------------------------------------------------------------------------------- 1 | " 2 | # Transcript 3 | This is a reimagining of the classic transcript by taking advantage of the text rendering possibilities from tha graphical stack. It offers a rich and interactive interface for displaying live information coming from a system. Text is only the beginning! 4 | ## The API 5 | The API is backward compatible with the existing transcript. To enable the new features, we introduced a builder. For example, `transcript nextPutAll: 'something'` becomes `transcript next putAll: 'something'`. Between `next` and `putAll:`, we can add multiple attributes to the text output. 6 | 7 | The following example shows the complete API. 8 | 9 | {{gtExample:GtTranscriptExamples>>#completeAPI|expanded=true}} 10 | ## Logging an animation 11 | To get an idea of how this tool could be useful, take a look at the following example. A Bloc animation is logged in a visual, domain centric way, providing insight far superior to plain text. 12 | 13 | {{gtExample:GtTranscriptExamples>>#transcriptWitAnimation|expanded=true}} 14 | 15 | 16 | " 17 | Class { 18 | #name : #BaselineOfGToolkitTranscript, 19 | #superclass : #BaselineOf, 20 | #category : #BaselineOfGToolkitTranscript 21 | } 22 | 23 | { #category : #baseline } 24 | BaselineOfGToolkitTranscript >> baseline: spec [ 25 | 26 | spec for: #'common' do: [ 27 | spec baseline: 'Brick' with: [ 28 | spec repository: 'github://feenkcom/Brick:main/src' ]. 29 | spec package: 'GToolkit-Transcript' with: [ 30 | spec requires: #('Brick' ). ]. ]. 31 | 32 | ] 33 | -------------------------------------------------------------------------------- /src/BaselineOfGToolkitTranscript/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #BaselineOfGToolkitTranscript } 2 | -------------------------------------------------------------------------------- /src/GToolkit-Morphic/AbstractWorldRenderer.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #AbstractWorldRenderer } 2 | 3 | { #category : #'*GToolkit-Morphic' } 4 | AbstractWorldRenderer class >> openMorphicWorld [ 5 | | aRenderer aWorld | 6 | 7 | aWorld := self currentWorld. 8 | 9 | aWorld worldState worldRenderer class = self 10 | ifTrue: [ ^ self ]. 11 | 12 | aRenderer := self forWorld: aWorld. 13 | 14 | World == aWorld 15 | ifTrue:[ MainWorldRenderer := aRenderer ]. 16 | 17 | aWorld worldState worldRenderer: aRenderer. 18 | 19 | WorldMorph currentWorld ifNotNil: [:world | world restoreMorphicDisplay]. 20 | WorldMorph extraWorldList do: #restoreMorphicDisplay. 21 | 22 | SystemProgressMorph enable 23 | ] 24 | -------------------------------------------------------------------------------- /src/GToolkit-Morphic/BlGlutinHost.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #BlGlutinHost } 2 | 3 | { #category : #'*GToolkit-Morphic' } 4 | BlGlutinHost >> openMorphicWorld [ 5 | GlutinWorldOpenGLRenderer openMorphicWorld 6 | ] 7 | -------------------------------------------------------------------------------- /src/GToolkit-Morphic/BlHost.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #BlHost } 2 | 3 | { #category : #'*GToolkit-Morphic' } 4 | BlHost >> openMorphicWorld [ 5 | "We still want to support morphic world. The opening of the morphic world should be dispatched via 6 | bloc host as the world should be opened in a window of the same framework (Glutin, SDL2, etc) as Bloc. 7 | By default I do nothing" 8 | ] 9 | -------------------------------------------------------------------------------- /src/GToolkit-Morphic/BlWinitHost.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #BlWinitHost } 2 | 3 | { #category : #'*GToolkit-Morphic' } 4 | BlWinitHost >> openMorphicWorld [ 5 | WinitWorldPixelsRenderer openMorphicWorld 6 | ] 7 | -------------------------------------------------------------------------------- /src/GToolkit-Morphic/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'GToolkit-Morphic' } 2 | -------------------------------------------------------------------------------- /src/GToolkit-Pharo6Compatibility/AbstractFileReference.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #AbstractFileReference } 2 | 3 | { #category : #'*GToolkit-Pharo6Compatibility' } 4 | AbstractFileReference >> binaryWriteStream [ 5 | "Answer a binary write stream on the receiver" 6 | 7 | ^ self subclassResponsibility 8 | ] 9 | 10 | { #category : #'*GToolkit-Pharo6Compatibility' } 11 | AbstractFileReference >> binaryWriteStreamDo: aBlock [ 12 | "Pass a binary write stream on the receiver to the supplied block, and ensure that the stream is closed after evaluation." 13 | 14 | | stream | 15 | 16 | stream := self binaryWriteStream. 17 | ^ [ aBlock value: stream ] 18 | ensure: [ stream close ] 19 | ] 20 | -------------------------------------------------------------------------------- /src/GToolkit-Pharo6Compatibility/FileHandle.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #FileHandle } 2 | 3 | { #category : #'*GToolkit-Pharo6Compatibility' } 4 | FileHandle >> binaryWriteStream [ 5 | ^ (File named: reference fullName) writeStream 6 | ] 7 | -------------------------------------------------------------------------------- /src/GToolkit-Pharo6Compatibility/FileLocator.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #FileLocator } 2 | 3 | { #category : #'*GToolkit-Pharo6Compatibility' } 4 | FileLocator >> binaryWriteStream [ 5 | "Answer a binary write stream on the receiver" 6 | 7 | ^ self resolve binaryWriteStream 8 | ] 9 | -------------------------------------------------------------------------------- /src/GToolkit-Pharo6Compatibility/FileReference.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #FileReference } 2 | 3 | { #category : #'*GToolkit-Pharo6Compatibility' } 4 | FileReference >> binaryWriteStream [ 5 | "Answer a binary write stream on the receiver" 6 | 7 | ^ ZnBufferedReadWriteStream on: (filesystem binaryWriteStreamOn: self path) 8 | ] 9 | -------------------------------------------------------------------------------- /src/GToolkit-Pharo6Compatibility/FileSystem.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #FileSystem } 2 | 3 | { #category : #'*GToolkit-Pharo6Compatibility' } 4 | FileSystem >> binaryWriteStreamOn: aResolvable [ 5 | "Resolve the argument into an absolute path and open a file handle on the file 6 | at that path. Ask the handle to give us a binary write stream for reading the file." 7 | 8 | ^ (self open: aResolvable writable: true) binaryWriteStream. 9 | ] 10 | -------------------------------------------------------------------------------- /src/GToolkit-Pharo6Compatibility/FileSystemHandle.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #FileSystemHandle } 2 | 3 | { #category : #'*GToolkit-Pharo6Compatibility' } 4 | FileSystemHandle >> binaryWriteStream [ 5 | 6 | self subclassResponsibility 7 | ] 8 | -------------------------------------------------------------------------------- /src/GToolkit-Pharo6Compatibility/MemoryFileSystemFile.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #MemoryFileSystemFile } 2 | 3 | { #category : #'*GToolkit-Pharo6Compatibility' } 4 | MemoryFileSystemFile >> binaryWriteStream [ 5 | ^ MemoryFileWriteStream on: self 6 | ] 7 | 8 | { #category : #'*GToolkit-Pharo6Compatibility' } 9 | MemoryFileSystemFile >> close [ 10 | "do nothing" 11 | ] 12 | 13 | { #category : #'*GToolkit-Pharo6Compatibility' } 14 | MemoryFileSystemFile >> size [ 15 | 16 | ^ size 17 | ] 18 | 19 | { #category : #'*GToolkit-Pharo6Compatibility' } 20 | MemoryFileSystemFile >> updateContents: aCollection [ 21 | bytes := aCollection. 22 | self updateSize: aCollection size 23 | ] 24 | -------------------------------------------------------------------------------- /src/GToolkit-Pharo6Compatibility/MemoryFileWriteStream.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A file write stream - but within memory 3 | " 4 | Class { 5 | #name : #MemoryFileWriteStream, 6 | #superclass : #Object, 7 | #instVars : [ 8 | 'file', 9 | 'writeStream', 10 | 'stream' 11 | ], 12 | #category : #'GToolkit-Pharo6Compatibility' 13 | } 14 | 15 | { #category : #'instance creation' } 16 | MemoryFileWriteStream class >> on: aFile [ 17 | 18 | ^ self new 19 | file: aFile; 20 | yourself 21 | ] 22 | 23 | { #category : #'opening-closing' } 24 | MemoryFileWriteStream >> close [ 25 | self stream close. 26 | file close 27 | ] 28 | 29 | { #category : #'opening-closing' } 30 | MemoryFileWriteStream >> closed [ 31 | ^ file closed 32 | ] 33 | 34 | { #category : #accessing } 35 | MemoryFileWriteStream >> file: aMemoryFileSystemFile [ 36 | file := aMemoryFileSystemFile 37 | ] 38 | 39 | { #category : #writing } 40 | MemoryFileWriteStream >> flush [ 41 | file updateContents: self stream contents 42 | ] 43 | 44 | { #category : #testing } 45 | MemoryFileWriteStream >> isBinary [ 46 | ^ self stream isBinary 47 | ] 48 | 49 | { #category : #writing } 50 | MemoryFileWriteStream >> nextPut: aCollection [ 51 | ^ self stream nextPut: aCollection 52 | ] 53 | 54 | { #category : #writing } 55 | MemoryFileWriteStream >> nextPutAll: aCollection [ 56 | ^ self stream nextPutAll: aCollection 57 | ] 58 | 59 | { #category : #positioning } 60 | MemoryFileWriteStream >> position [ 61 | ^ self stream position 62 | ] 63 | 64 | { #category : #positioning } 65 | MemoryFileWriteStream >> setToEnd [ 66 | ^ self stream setToEnd 67 | ] 68 | 69 | { #category : #accessing } 70 | MemoryFileWriteStream >> size [ 71 | ^ file size 72 | ] 73 | 74 | { #category : #accessing } 75 | MemoryFileWriteStream >> stream [ 76 | ^ stream ifNil: [ stream := WriteStream on: file bytes from: 1 to: file size ] 77 | ] 78 | -------------------------------------------------------------------------------- /src/GToolkit-Pharo6Compatibility/MemoryHandle.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #MemoryHandle } 2 | 3 | { #category : #'*GToolkit-Pharo6Compatibility' } 4 | MemoryHandle >> binaryWriteStream [ 5 | 6 | ^ entry binaryWriteStream 7 | ] 8 | -------------------------------------------------------------------------------- /src/GToolkit-Pharo6Compatibility/ZnPositionableReadStream.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #ZnPositionableReadStream } 2 | 3 | { #category : #'*GToolkit-Pharo6Compatibility' } 4 | ZnPositionableReadStream >> binary [ 5 | stream binary 6 | ] 7 | 8 | { #category : #'*GToolkit-Pharo6Compatibility' } 9 | ZnPositionableReadStream >> reset [ 10 | self position: 0 11 | ] 12 | -------------------------------------------------------------------------------- /src/GToolkit-Pharo6Compatibility/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'GToolkit-Pharo6Compatibility' } 2 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Deprecations/BlockClosure.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #BlockClosure } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-Deprecations' } 4 | BlockClosure >> ifError: errorHandlerBlock [ 5 | 6 | 7 | ^ self on: Error do: [:ex | 8 | errorHandlerBlock cull: ex description cull: ex receiver ] 9 | ] 10 | 11 | { #category : #'*GToolkit-PharoBasePatch-Deprecations' } 12 | BlockClosure >> ifErrorDo: errorHandlerBlock [ 13 | 14 | 15 | ^ self on: Error do: [:ex | 16 | errorHandlerBlock cull: ex description cull: ex receiver ] 17 | ] 18 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Deprecations/Class.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #Class } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-Deprecations' } 4 | Class >> subclass: aSubclassSymbol instanceVariableNames: instVarNameList classVariableNames: classVarNames package: aPackageSymbol [ 5 | "Added to allow for a simplified subclass creation experience. " 6 | 7 | ^ self 8 | forPharo12: [ "self 9 | deprecated: 'This method uses the old way of creating classes. The new way is to use the ShiftClassInstaller.' 10 | transformWith: '`@rcv subclass: `@name instanceVariableNames: `@instVar classVariableNames: `@classVar package: `@package' 11 | -> '`@rcv classInstaller 12 | make: [ :builder | 13 | builder 14 | superclass: `@rcv; 15 | name: `@name; 16 | slotsFromString: `@instVar; 17 | sharedVariablesFromString: `@classVar; 18 | package: `@package; 19 | environment: `@rcv environment ]'." 20 | 21 | self classInstaller 22 | make: [ :builder | 23 | builder 24 | superclass: self; 25 | name: aSubclassSymbol; 26 | slotsFromString: instVarNameList; 27 | sharedVariablesFromString: classVarNames; 28 | category: aPackageSymbol; 29 | environment: self environment ] ] 30 | forPharo11AndPharo10: [ self 31 | subclass: aSubclassSymbol 32 | instanceVariableNames: instVarNameList 33 | classVariableNames: classVarNames 34 | poolDictionaries: '' 35 | package: aPackageSymbol ] 36 | ] 37 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Deprecations/RBProgramNode.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RBProgramNode } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-Deprecations' } 4 | RBProgramNode >> isSelfOrSuper [ 5 | 6 | 7 | ^ self isSelfOrSuperVariable 8 | ] 9 | 10 | { #category : #'*GToolkit-PharoBasePatch-Deprecations' } 11 | RBProgramNode >> isTemp [ 12 | 13 | 14 | ^ self isTempVariable 15 | ] 16 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Deprecations/RBVariableNode.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RBVariableNode } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-Deprecations' } 4 | RBVariableNode >> isBlockVar [ 5 | 6 | 7 | ^self isDefinedByBlock 8 | ] 9 | 10 | { #category : #'*GToolkit-PharoBasePatch-Deprecations' } 11 | RBVariableNode >> isGlobal [ 12 | 13 | 14 | "isGlobal used to return true for both class variables and globals (and even undeclared Variables). 15 | From Pharo9 on, #isGlobalVariable returns true only for real globals" 16 | 17 | ^self isLiteralVariable 18 | ] 19 | 20 | { #category : #'*GToolkit-PharoBasePatch-Deprecations' } 21 | RBVariableNode >> isTemp [ 22 | 23 | 24 | ^ self isTempVariable 25 | ] 26 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Deprecations/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'GToolkit-PharoBasePatch-Deprecations' } 2 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Extensions/CompiledMethod.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #CompiledMethod } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-Extensions' } 4 | CompiledMethod >> protocolName [ 5 | "Return the name of the protocol (conceptual groups of methods) in which the receiver is grouped into." 6 | 7 | ^ self 8 | forPharo12: [ self protocol ifNotNil: [ :protocol | protocol name ] ] 9 | forPharo11AndPharo10: [ self category ] 10 | ] 11 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Extensions/OpalCompiler.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #OpalCompiler } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-Extensions' } 4 | OpalCompiler >> isScripting: aBoolean [ 5 | 6 | 7 | self 8 | forPharo12: [ self compilationContext isScripting: aBoolean ] 9 | forPharo11AndPharo10: [ self noPattern: aBoolean ] 10 | ] 11 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Extensions/RGMethodDefinition.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RGMethodDefinition } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-Extensions' } 4 | RGMethodDefinition >> protocolName [ 5 | 6 | 7 | ^ self protocol 8 | ] 9 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Extensions/RPackageOrganizer.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RPackageOrganizer } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-Extensions' } 4 | RPackageOrganizer >> createPackageNamed: aString [ 5 | 6 | 7 | ^ self 8 | forPharo12: [ self addPackage: aString ] 9 | forPharo11AndPharo10: [ | instance | 10 | self validatePackageDoesNotExist: aString. 11 | 12 | instance := self packageClass named: aString. 13 | self registerPackage: instance. 14 | instance ] 15 | ] 16 | 17 | { #category : #'*GToolkit-PharoBasePatch-Extensions' } 18 | RPackageOrganizer >> includesPackageNamed: aSymbol [ 19 | 20 | "Takes a package or a package name as parameter and return true if I include this package." 21 | 22 | self packageNamed: aSymbol asSymbol ifAbsent: [ ^ false ]. 23 | ^ true 24 | ] 25 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Extensions/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'GToolkit-PharoBasePatch-Extensions' } 2 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-ForPharo12/UUID.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #UUID } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-ForPharo12' } 4 | UUID >> base64Encoded [ 5 | ^ self 6 | forPharo12: [ self uuidData base64Encoded ] 7 | forPharo11AndPharo10: [ super base64Encoded ] 8 | ] 9 | 10 | { #category : #'*GToolkit-PharoBasePatch-ForPharo12' } 11 | UUID class >> fromBase64EncodedString: aString64 [ 12 | | uid | 13 | uid := self nilUUID. 14 | self 15 | forPharo12: [ 16 | (ZnBase64Encoder new 17 | decode: aString64 readStream to: uid uuidData writeStream) ] 18 | forPharo11AndPharo10: [ 19 | ZnBase64Encoder new 20 | decode: aString64 readStream to: uid writeStream ]. 21 | ^ uid 22 | ] 23 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-ForPharo12/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'GToolkit-PharoBasePatch-ForPharo12' } 2 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Iceberg/IceClassDefinition.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #IceClassDefinition } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-Iceberg' } 4 | IceClassDefinition >> removeFromPatcher: aMCPatcher [ 5 | 6 | 7 | "This code is taken from https://github.com/pharo-vcs/iceberg/pull/1572 to fix feenkcom/gtoolkit#2431" 8 | 9 | "If the meta side is removed, we should modify the class definition to not include the meta-parts such as class-instance-variables" 10 | 11 | self asMCDefinition ifNil: [ ^ self ]. 12 | 13 | isMeta ifTrue: [ 14 | ^ aMCPatcher 15 | modifyDefinition: self asMCDefinition 16 | to: self asMCDefinitionWithoutMetaSide ]. 17 | 18 | aMCPatcher removeDefinition: self asMCDefinition 19 | ] 20 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Iceberg/MCPatcher.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #MCPatcher } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-Iceberg' } 4 | MCPatcher >> modifyDefinition: baseDefinition to: targetDefinition [ 5 | 6 | 7 | "This check is for https://github.com/feenkcom/gtoolkit/issues/2457" 8 | baseDefinition ifNil: [ 9 | ^ self addDefinition: targetDefinition ]. 10 | 11 | "This code is taken from: https://github.com/pharo-project/pharo/pull/10950 to fix gtoolkit/feenkcom#2431" 12 | 13 | "Only modify the definition if present" 14 | 15 | self definitions 16 | definitionLike: baseDefinition 17 | ifPresent: [ :found | 18 | found = baseDefinition ifTrue: [ 19 | self addDefinition: targetDefinition ] ] 20 | ifAbsent: [ "nothing" ] 21 | ] 22 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Iceberg/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'GToolkit-PharoBasePatch-Iceberg' } 2 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-PharoIndex/GtReflectiveMethodInstalled.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #GtReflectiveMethodInstalled, 3 | #superclass : #Announcement, 4 | #instVars : [ 5 | 'oldMethod', 6 | 'newMethod' 7 | ], 8 | #category : #'GToolkit-PharoBasePatch-PharoIndex' 9 | } 10 | 11 | { #category : #accessing } 12 | GtReflectiveMethodInstalled >> newMethod [ 13 | ^ newMethod 14 | ] 15 | 16 | { #category : #accessing } 17 | GtReflectiveMethodInstalled >> newMethod: anObject [ 18 | newMethod := anObject 19 | ] 20 | 21 | { #category : #accessing } 22 | GtReflectiveMethodInstalled >> oldMethod [ 23 | ^ oldMethod 24 | ] 25 | 26 | { #category : #accessing } 27 | GtReflectiveMethodInstalled >> oldMethod: anObject [ 28 | oldMethod := anObject 29 | ] 30 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-PharoIndex/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'GToolkit-PharoBasePatch-PharoIndex' } 2 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/AbstractLayoutScope.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #AbstractLayoutScope } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | AbstractLayoutScope >> resolveSlot: aName ifFound: foundBlock ifNone: exceptionBlock [ 5 | self 6 | allSlotsDo: [ :slot | (slot name sameContentAs: aName) ifTrue: [ ^ foundBlock cull: slot ] ]. 7 | ^ exceptionBlock value 8 | ] 9 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/ChangeSet.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #ChangeSet } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | ChangeSet >> clear [ 5 | 6 | "Reset the receiver to be empty." 7 | 8 | changeRecords := GtStringContentDictionary new. 9 | preamble := nil. 10 | postscript := nil 11 | ] 12 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/ClassDescription.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #ClassDescription } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | ClassDescription >> addAndClassifySelector: selector withMethod: compiledMethod inProtocol: category [ 5 | | priorMethodOrNil priorOriginOrNil oldProtocol newProtocol categorySelector | 6 | 7 | priorMethodOrNil := self compiledMethodAt: selector ifAbsent: [ nil ]. 8 | priorMethodOrNil ifNotNil: [ priorOriginOrNil := priorMethodOrNil origin ]. 9 | 10 | self addSelectorSilently: selector withMethod: compiledMethod. 11 | 12 | oldProtocol := self organization categoryOfElement: selector. 13 | categorySelector := category asSymbol. 14 | SystemAnnouncer uniqueInstance 15 | suspendAllWhile: [ self organization 16 | classify: selector 17 | under: ((categorySelector = Protocol unclassified) 18 | ifTrue: [ oldProtocol ] 19 | ifFalse: [ categorySelector ]) ]. 20 | newProtocol := self organization categoryOfElement: selector. 21 | 22 | self isAnonymous ifTrue: [ ^ self ]. 23 | 24 | (priorMethodOrNil isNil or: [ priorOriginOrNil ~= compiledMethod origin ]) 25 | ifTrue: [ SystemAnnouncer uniqueInstance methodAdded: compiledMethod ] 26 | ifFalse: [ "If protocol changed and someone is from different package, I need to throw a method recategorized"self 27 | notifyRepackage: selector 28 | method: compiledMethod 29 | oldProtocol: oldProtocol 30 | newProtocol: newProtocol. 31 | 32 | SystemAnnouncer uniqueInstance 33 | methodChangedFrom: priorMethodOrNil 34 | to: compiledMethod 35 | oldProtocol: oldProtocol ] 36 | ] 37 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/CompiledMethod.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #CompiledMethod } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | CompiledMethod >> sameAsMCDefinition: anMCMethodDefinition [ 5 | 6 | ^ anMCMethodDefinition selector = self selector and: [ 7 | (anMCMethodDefinition className sameContentAs: self className) and: [ 8 | anMCMethodDefinition classIsMeta = self isClassSide and: [ 9 | anMCMethodDefinition category = self protocol and: [ 10 | anMCMethodDefinition source = self sourceCode ] ] ] ] 11 | ] 12 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/FFIConstantArgument.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #FFIConstantArgument } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | FFIConstantArgument >> resolveUsing: aResolver [ 5 | 6 | (value sameContentAs: false) 7 | ifTrue: [ loader := FFILiteralArgument value: 0 type: (aResolver resolveType: #bool). 8 | resolvedType := type resolveUsing: aResolver forArgument: self. 9 | resolvedType loader: loader. 10 | ^ self ]. 11 | (value sameContentAs: true) 12 | ifTrue: [ loader := FFILiteralArgument value: 1 type: (aResolver resolveType: #bool). 13 | resolvedType := type resolveUsing: aResolver forArgument: self. 14 | resolvedType loader: loader. 15 | ^ self ]. 16 | (value isNil or: [ value = #NULL ]) 17 | ifTrue: [ loader := FFILiteralArgument 18 | value: ExternalAddress null 19 | type: (aResolver resolveType: #'void *'). 20 | resolvedType := type resolveUsing: aResolver forArgument: self. 21 | resolvedType loader: loader. 22 | ^ self ]. 23 | value == #self 24 | ifTrue: [ loader := resolvedType := type resolveUsing: aResolver forArgument: self. 25 | loader loader: FFISelfArgument new. 26 | ^ self ]. 27 | loader := FFILiteralArgument value: value. 28 | resolvedType := type resolveUsing: aResolver forArgument: self. 29 | resolvedType loader: loader 30 | ] 31 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/FFIInferenceResolutionMode.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #FFIInferenceResolutionMode } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | FFIInferenceResolutionMode >> resolveUndeclaredTypeForArgument: aFFIValueArgument withResolver: aResolver [ 5 | 6 | "Convert 'nil' and 'NULL' to symbols" 7 | (aFFIValueArgument value isNil 8 | or: [aFFIValueArgument value = #'nil' 9 | or: [ aFFIValueArgument value = #'NULL' ]]) 10 | ifTrue: [ ^ (aResolver resolveType: #'void *') ]. 11 | (#(true false) includes: aFFIValueArgument value) 12 | ifTrue: [ ^ aResolver resolveType: #bool ]. 13 | aFFIValueArgument value isInteger 14 | ifTrue: [ ^ (aFFIValueArgument value >=0 15 | ifTrue: [ aResolver resolveType: #uint32 ] 16 | ifFalse: [ aResolver resolveType: #int32 ]) ]. 17 | (aFFIValueArgument value == #self) ifTrue: [ 18 | ^ (aResolver requestor asExternalTypeOn: aResolver) 19 | prepareAsSelfFromCalloutDeclaration ]. 20 | 21 | ^ aFFIValueArgument value isSymbol 22 | ifTrue: [ 23 | "This is actually a class variable with a value..." 24 | aResolver resolveType: aFFIValueArgument value ] 25 | ifFalse: [ aResolver unsupportedUntypedLiteral: aFFIValueArgument value ] 26 | ] 27 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/IRMethod.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #IRMethod } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | IRMethod >> initialize [ 5 | 6 | irPrimitive := IRPrimitive null. 7 | tempMap := GtStringContentDictionary new. 8 | pragmas := OrderedCollection new. 9 | additionalLiterals := OCLiteralSet new. 10 | numArgs := 0 11 | ] 12 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/IceBasicProject.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #IceBasicProject } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | IceBasicProject >> properties: aDictionary [ 5 | 6 | properties := aDictionary ifNotNil: [ 7 | aDictionary as: GtStringContentDictionary ] 8 | ] 9 | 10 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 11 | IceBasicProject >> sourceDirectory [ 12 | 13 | ^ properties at: #srcDirectory ifAbsent: [ 'src' ] 14 | ] 15 | 16 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 17 | IceBasicProject >> sourceDirectory: aString [ 18 | 19 | properties at: #srcDirectory put: aString 20 | ] 21 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/IceCommit.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #IceCommit } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | IceCommit >> includesPackageNamed: aName [ 5 | 6 | ^ self packageNames includes: aName asString 7 | ] 8 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/IceMethodDefinition.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #IceMethodDefinition } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | IceMethodDefinition >> = anotherDefinition [ 5 | "A method can be equal and belong to another class (and be in the other side). 6 | And yes, even if this usually should not happen, it happens (and not always is incorrect)" 7 | 8 | ^ super = anotherDefinition 9 | and: [ (self className sameContentAs: anotherDefinition className) 10 | and: [ self classIsMeta = anotherDefinition classIsMeta ] ] 11 | ] 12 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/IceNode.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #IceNode } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | IceNode >> initialize [ 5 | 6 | super initialize. 7 | childrenDictionary := GtStringContentDictionary new 8 | ] 9 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/IceRepositoryProperties.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #IceRepositoryProperties } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | IceRepositoryProperties >> writerClass [ 5 | ^ self properties 6 | at: #format 7 | ifPresent: [ :v | TIceRepositoryWriter users detect: [ :each | each id = v ] ] 8 | ifAbsent: [ 9 | commitish project isInvalid 10 | ifFalse: [ IceLibgitRepository defaultFileFormat ] 11 | ifTrue: [ TIceRepositoryWriter users 12 | detect: #isLegacyDefault 13 | ifNone: [ Smalltalk at: #IceLibgitFiletreeWriter ] ] ] 14 | 15 | ] 16 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/IceSshCredentials.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #IceSshCredentials } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | IceSshCredentials >> isDefault [ 5 | 6 | ^ host = '*' 7 | ] 8 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/IceWorkingCopy.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #IceWorkingCopy } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | IceWorkingCopy >> initialize [ 5 | super initialize. 6 | shouldIgnoreNotifications := false. 7 | 8 | packages := GtStringContentDictionary new. 9 | referenceCommit := repository newNoCommit. 10 | self basicSetProject: referenceCommit project. 11 | properties := referenceCommit properties asBornProperties 12 | ] 13 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/MCPackage.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #MCPackage } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | MCPackage >> name [ 5 | ^ name asSymbol 6 | ] 7 | 8 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 9 | MCPackage >> name: aString [ 10 | name := aString ifNotNil: [ aString asSymbol ] 11 | ] 12 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/MCPackageManager.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #MCPackageManager } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | MCPackageManager class >> packageRenamed: anAnnouncement [ 5 | self allManagers 6 | detect: [ :each | each packageName sameContentAs: anAnnouncement newName ] 7 | ifFound: [ :newPackage | newPackage modified: true ]. 8 | (self allManagers detect: [ :each | each packageName = anAnnouncement oldName ]) 9 | unload 10 | ] 11 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/MCTraitDefinition.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #MCTraitDefinition } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | MCTraitDefinition >> = aDefinition [ 5 | self flag: #traits. "Ugly we harcoded the super superclass method. We will have to refactor the definition hierarchy" 6 | 7 | ^ (aDefinition isKindOf: MCDefinition) 8 | and: [(self isRevisionOf: aDefinition) 9 | and: [self traitCompositionString = aDefinition traitCompositionString 10 | and: [self classTraitCompositionString = aDefinition classTraitCompositionString 11 | and: [(category sameContentAs: aDefinition category) 12 | and: [self slotDefinitionString = aDefinition slotDefinitionString 13 | and: [self classInstVarNames = aDefinition classInstVarNames 14 | and: [comment = aDefinition comment]]]]]]] 15 | ] 16 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/MetacelloAbstractPackageSpec.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #MetacelloAbstractPackageSpec } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | MetacelloAbstractPackageSpec >> specs: specNames forPackageOrdering: aVersionSpec [ 5 | | packageOrProjectSpecs | 6 | packageOrProjectSpecs := GtStringContentSet new. 7 | specNames 8 | do: [ :specName | 9 | | spec | 10 | "get project/group/package specs" 11 | spec := aVersionSpec 12 | packageNamed: specName 13 | ifAbsent: [ 14 | MetacelloNameNotDefinedError 15 | signal: 16 | 'project group, or package named: ' , specName printString 17 | , 18 | ' not found when used in requires: or includes: field of package: ' 19 | , self name printString , ' for version: ' 20 | , aVersionSpec versionString , ' of ' 21 | , aVersionSpec projectLabel , '.'. 22 | nil "return nil if resumed" ]. 23 | spec 24 | ifNotNil: [ 25 | packageOrProjectSpecs 26 | addAll: (spec resolveSpecsForPackageOrdering: aVersionSpec) ] ]. 27 | ^ packageOrProjectSpecs 28 | ] 29 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/MetacelloMemberListSpec.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #MetacelloMemberListSpec } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | MetacelloMemberListSpec >> map [ 5 | 6 | | map | 7 | memberMap ~~ nil ifTrue: [ ^memberMap ]. 8 | map := GtStringContentDictionary new. 9 | self list do: [:member | 10 | member 11 | applyAdd: [:memberSpec | self mapAdd: memberSpec into: map ] 12 | copy: [:memberSpec | self mapCopy: memberSpec into: map ] 13 | merge: [:memberSpec | self mapMerge: memberSpec into: map ] 14 | remove: [:memberSpec | self mapRemove: memberSpec into: map ]]. 15 | memberMap := map. 16 | ^memberMap 17 | ] 18 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/MetacelloProjectRegistry.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #MetacelloProjectRegistry } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | MetacelloProjectRegistry >> baselineRegistry [ 5 | baselineRegistry ifNil: [ baselineRegistry := GtStringContentDictionary new ]. 6 | ^ baselineRegistry 7 | ] 8 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/OCAbstractMethodScope.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #OCAbstractMethodScope } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | OCAbstractMethodScope >> lookupVar: name declare: aBoolean [ 5 | 6 | copiedVars at: name ifPresent: [:v | ^ v]. 7 | tempVector at: name ifPresent: [:v | ^ v]. 8 | tempVars at: name ifPresent: [:v | ^ v]. 9 | (name sameContentAs: self tempVectorName) ifTrue: [ ^ self tempVectorVar ]. 10 | ^self outerScope lookupVar: name declare: aBoolean 11 | ] 12 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/PointerLayout.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #PointerLayout } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | PointerLayout >> resolveSlot: aName ifFound: foundBlock ifNone: noneBlock [ 5 | ^ slotScope resolveSlot: aName asSymbol ifFound: foundBlock ifNone: noneBlock 6 | ] 7 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/ProtocolOrganizer.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #ProtocolOrganizer } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | ProtocolOrganizer >> classify: aSymbol inProtocolNamed: aProtocolName [ 5 | | name protocol | 6 | name := aProtocolName. 7 | (name sameContentAs: allProtocol name) 8 | ifTrue: [ name := Protocol unclassified ]. "maybe here we should check if this method already belong to another protocol" 9 | (self protocolsOfSelector: aSymbol) 10 | do: [ :p | p removeMethodSelector: aSymbol ]. 11 | protocol := self getProtocolNamed: name ifNone: [ self addProtocolNamed: name ]. 12 | 13 | protocol addMethodSelector: aSymbol 14 | ] 15 | 16 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 17 | ProtocolOrganizer >> getProtocolNamed: aByteString ifNone: aBlockClosure [ 18 | ^ protocols 19 | detect: [ :e | e name sameContentAs: aByteString ] 20 | ifNone: aBlockClosure 21 | ] 22 | 23 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 24 | ProtocolOrganizer >> protocolNamed: aString ifAbsent: aBlock [ 25 | ^ self allProtocols 26 | detect: [ :e | e name sameContentAs: aString ] 27 | ifNone: aBlock 28 | ] 29 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/RBAbstractVariablesRefactoring.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RBAbstractVariablesRefactoring } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | RBAbstractVariablesRefactoring >> processReferenceNode: aNode [ 5 | | varName | 6 | varName := aNode name. 7 | (ignore sameContentAs: varName) ifTrue: [ ^ self ]. 8 | (aNode whoDefines: varName) ifNotNil: [ ^ self ]. 9 | (self instanceVariableNames includes: varName) 10 | ifTrue: [ instVarReaders add: varName ]. 11 | (self classVariableNames includes: varName) 12 | ifTrue: [ classVarReaders add: varName ] 13 | ] 14 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/RBClass.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RBClass } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | RBClass >> comment [ 5 | ^ (comment sameContentAs: LookupComment) 6 | ifTrue: [ comment := self isDefined ifTrue: [ self realClass comment ] ifFalse: [ nil ] ] 7 | ifFalse: [ comment ] 8 | ] 9 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/RBInlineMethodRefactoring.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RBInlineMethodRefactoring } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | RBInlineMethodRefactoring >> classOfTheMethodToInline [ 5 | 6 | ^ classOfTheMethodToInline 7 | ifNil: [ classOfTheMethodToInline := (sourceMessage receiver name = #super 8 | ifTrue: [ class superclass ] 9 | ifFalse: [ class ]) whoDefinesMethod: self inlineSelector ] 10 | ifNotNil: [ classOfTheMethodToInline ] 11 | ] 12 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/RBKeywordToken.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RBKeywordToken } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | RBKeywordToken >> isPrimitiveKeyword [ 5 | 6 | ^ self value = 'primitive:' 7 | ] 8 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/RBMethod.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RBMethod } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | RBMethod >> literal: anObject containsReferenceTo: aSymbol [ 5 | (anObject sameContentAs: aSymbol) ifTrue: [ ^ true ]. 6 | anObject class = Array ifFalse: [ ^ false ]. 7 | ^ anObject 8 | anySatisfy: [ :each | self literal: each containsReferenceTo: aSymbol ] 9 | ] 10 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/RBMoveMethodRefactoring.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RBMoveMethodRefactoring } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | RBMoveMethodRefactoring >> compileDelegatorMethod [ 5 | | statementNode delegatorNode tree | 6 | delegatorNode := RBMessageNode 7 | receiver: (RBVariableNode named: variable) 8 | selector: parseTree selector 9 | keywordsPositions: parseTree keywordsPositions 10 | arguments: (parseTree argumentNames 11 | collect: [ :each | 12 | (each sameContentAs: selfVariableName) 13 | ifTrue: [ RBVariableNode selfNode ] 14 | ifFalse: [ RBVariableNode named: each ] ]). 15 | self hasOnlySelfReturns 16 | ifFalse: [ delegatorNode := RBReturnNode value: delegatorNode ]. 17 | statementNode := RBSequenceNode 18 | temporaries: #() 19 | statements: (Array with: delegatorNode). 20 | (tree := class parseTreeForSelector: selector) body: statementNode. 21 | class compileTree: tree 22 | ] 23 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/RBSequenceNode.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RBSequenceNode } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | RBSequenceNode >> defines: aName [ 5 | ^ temporaries anySatisfy: [ :each | each name sameContentAs: aName ] 6 | ] 7 | 8 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 9 | RBSequenceNode >> removeTemporaryNamed: aName [ 10 | temporaries := temporaries reject: [ :each | each name sameContentAs: aName ] 11 | ] 12 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/RBVariableNode.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RBVariableNode } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | RBVariableNode class >> identifierNamed: anIdentifierName at: aPosition [ 5 | 6 | anIdentifierName = 'self' 7 | ifTrue: [ ^ self selfNode start: aPosition ]. 8 | anIdentifierName = 'thisContext' 9 | ifTrue: [ ^ self thisContextNode start: aPosition ]. 10 | anIdentifierName = 'super' 11 | ifTrue: [ ^ self superNode start: aPosition ]. 12 | 13 | ^ self named: anIdentifierName start: aPosition 14 | ] 15 | 16 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 17 | RBVariableNode >> references: aVariableName [ 18 | ^ self name sameContentAs: aVariableName 19 | ] 20 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/RPackageOrganizer.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RPackageOrganizer } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | RPackageOrganizer >> packageMatchingExtensionName: anExtensionName [ 5 | 6 | "return nil if no package is not found" 7 | | tmpPackageName | 8 | 9 | "we first look if their is a package matching exactly the name specified" 10 | (self packageExactlyMatchingExtensionName: anExtensionName) 11 | ifNotNil: [ :package | ^ package ]. 12 | 13 | "if no package was found, we try to find one matching the begining of the name specified" 14 | tmpPackageName := ''. 15 | packages keysDo: [:aSymbol | 16 | (anExtensionName beginsWith: (aSymbol asString, '-') caseSensitive: false) 17 | ifTrue: [ 18 | "we keep the longest package name found" 19 | (aSymbol size > tmpPackageName size) 20 | ifTrue: [ tmpPackageName := aSymbol ]]]. 21 | 22 | ^ tmpPackageName 23 | ifEmpty: [ nil ] 24 | ifNotEmpty: [ self packageNamed: tmpPackageName ] 25 | ] 26 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/STONWriter.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #STONWriter } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | STONWriter >> encodeCharacter: char [ 5 | | code encoding | 6 | "STONCharacters contains for the lower 127 characters (codes 0 to 126) either nil (unknown), 7 | #pass (output as is, clean ASCII characters) or a full escape string" 8 | ((code := char codePoint) < 127 and: [ (encoding := self stonCharacters at: code + 1) notNil ]) 9 | ifTrue: [ 10 | ((encoding sameContentAs: #pass) or: [ jsonMode and: [ char = $' ] ]) 11 | ifTrue: [ writeStream nextPut: char ] 12 | ifFalse: [ writeStream nextPutAll: encoding ] ] 13 | ifFalse: [ 14 | "always escape Latin1 C1 controls, or when asciiOnly is true" 15 | (code > 16r9F and: [ asciiOnly not ]) 16 | ifTrue: [ writeStream nextPut: char ] 17 | ifFalse: [ self escapeUnicode: code ] ] 18 | ] 19 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/SessionCategory.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #SessionCategory } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | SessionCategory >> renamedClass: aClass from: oldName to: newName [ 5 | priorityLists 6 | do: [ :handlers | 7 | handlers 8 | detect: [ :handler | handler handledId sameContentAs: oldName ] 9 | ifFound: [ :handler | handler registeredClassName: newName ] ] 10 | ] 11 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/Slot.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #Slot } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | Slot class >> isPseudovariableName: aSymbol [ 5 | ^ #(self true false nil thisContext super) includes: aSymbol 6 | ] 7 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/SourceFileArray.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #SourceFileArray } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | SourceFileArray >> timeStampAt: sourcePointer for: sourceDataPointers [ 5 | "Answer the authoring time-stamp for the given method, retrieved from the sources or changes file. Answer the empty string if no time stamp is available." 6 | 7 | | preamble stamp tokens stampPosition | 8 | stamp := ''. 9 | flushChanges ifFalse: [ ^ stamp ]. 10 | preamble := self sourcedDataAt: sourcePointer. 11 | (preamble includesSubstring: sourceDataPointers key) 12 | ifTrue: [ 13 | tokens := preamble parseLiterals. 14 | stampPosition := tokens stringContentIndexOf: sourceDataPointers value. 15 | stampPosition = 0 16 | ifFalse: [ 17 | "New format gives change stamp and unified prior pointer" 18 | stamp := tokens at: stampPosition + 1 ] ]. 19 | ^ stamp 20 | ] 21 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/SpStyleSTONReader.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #SpStyleSTONReader } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | SpStyleSTONReader >> lookupClass: name [ 5 | "The SpStyleSTONReader only looks for ston names in the hierarchy of SpStyle" 6 | 7 | ^ classes 8 | at: name 9 | ifAbsentPut: [ self styleClasses 10 | detect: [ :class | class isMeta not and: [ class stonName sameContentAs: name ] ] 11 | ifNone: [ NotFound signalFor: name ] ] 12 | ] 13 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/String.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #String } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | String >> isValidGlobalName [ 5 | 6 | self ifEmpty: [ ^ false ]. "reserverd default names" 7 | self = #NameOfSubclass ifTrue: [ ^ false ]. 8 | self = #TNameOfTrait ifTrue: [ ^ false ]. 9 | 10 | ^ (self first isLetter and: [ self first isUppercase ]) 11 | and: [ self 12 | allSatisfy: [ :character | character isAlphaNumeric or: [ character = $_ ] ] ] 13 | ] 14 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/TonelParser.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #TonelParser } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | TonelParser >> newClassDefinitionFrom: anArray [ 5 | | metadata | 6 | 7 | metadata := anArray sixth. 8 | ^ MCClassDefinition 9 | name: (metadata at: #name) 10 | superclassName: (metadata at: #superclass) 11 | traitComposition: (metadata at: #traits ifAbsent: [ '{}' ]) 12 | classTraitComposition: (metadata at: #classTraits ifAbsent: [ '{}' ]) 13 | category: (metadata at: #category) 14 | instVarNames: (metadata at: #instVars ifAbsent: [ #() ]) 15 | classVarNames: (metadata at: #classVars ifAbsent: [ #() ]) 16 | poolDictionaryNames: (metadata at: #pools ifAbsent: [ #() ]) 17 | classInstVarNames: (metadata at: #classInstVars ifAbsent: [ #() ]) 18 | type: (metadata at: #type ifAbsent: [ #normal ]) asSymbol 19 | comment: (anArray second ifNil: [ '' ]) 20 | commentStamp: nil 21 | ] 22 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/TonelReader.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #TonelReader } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 4 | TonelReader >> categoriesFrom: aCollection [ 5 | ^ ((aCollection select: #isClassDefinition) 6 | collect: #category 7 | as: GtStringContentSet) 8 | sorted: [ :a :b | a < b ] 9 | ] 10 | 11 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 12 | TonelReader >> loadDefinitions [ 13 | | definitionOrders newDefinitions newCategories organization | 14 | 15 | definitionOrders := self class definitionOrders. 16 | newDefinitions := ((self packageDirectory entries 17 | select: [ :each | self canBeLoaded: each ]) 18 | collect: [ :each | each readStreamDo: [ :s | TonelParser parseStream: s ] ]) 19 | flattened 20 | sort: [ :a :b | (definitionOrders at: a class) < (definitionOrders at: b class) ]. 21 | 22 | newCategories := self categoriesFrom: newDefinitions. 23 | (newCategories anySatisfy: [:each | each sameContentAs: (self package ifNotNil: #name)]) 24 | ifFalse: [ newCategories := newCategories copyWithFirst: (self package ifNotNil: #name) ]. 25 | organization := MCOrganizationDefinition categories: (newCategories reject: #isNil). 26 | 27 | definitions := (newDefinitions copyWithFirst: organization) sort 28 | ] 29 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol-Overrides/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'GToolkit-PharoBasePatch-StrictSymbol-Overrides' } 2 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol/Array.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #Array } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol' } 4 | Array >> asGtStringContentSet [ 5 | 6 | ^ GtStringContentSet newFromArray: self 7 | ] 8 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol/Bag.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #Bag } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol' } 4 | Bag >> asGtStringContentSet [ 5 | "Answer a set with the elements of the receiver." 6 | "#(1 2 2 3 1 1 1) asBag asSet >>> #(1 2 2 3 1 1 1) asSet" 7 | 8 | ^ contents keys asGtStringContentSet 9 | ] 10 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol/Collection.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #Collection } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol' } 4 | Collection >> asGtStringContentSet [ 5 | "Answer a GtStringContentSet whose elements are the unique elements of the receiver." 6 | 7 | "{1. 2} asSet = {2. 1} asSet >>> true" 8 | "{1. 2} asSet = {1. 2. 2} asSet >>> true" 9 | "{1. 2} asSet = {1. 2. 3} asSet >>> false" 10 | "{} asSet = Set new >>> true" 11 | 12 | ^ GtStringContentSet withAll: self 13 | ] 14 | 15 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol' } 16 | Collection >> sameContentAs: aCollection [ 17 | "Answer true if the reciever contains the same elements as aCollection, and vice versa, comparing strings and symbols based on their content." 18 | 19 | ^(aCollection isCollection) 20 | and: [ aCollection size = self size 21 | and: [ aCollection allSatisfy: [ :each | 22 | (aCollection occurrencesOf: each) sameContentAs: (self occurrencesOf: each) ]]] 23 | ] 24 | 25 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol' } 26 | Collection >> stringContentIntersection: aCollection [ 27 | "Answer the set theoretic intersection of two collections. 28 | Compare Strings and Symbols based on their content." 29 | 30 | "(#(1 2 3 4) intersection: #(3 4 5)) >>> #(3 4)" 31 | 32 | "(#(1 2 3 4) intersection: #()) >>> #()" 33 | 34 | "(#() intersection: #(1 2 3 4)) >>> #()" 35 | 36 | "('hello' intersection: 'world') >>> 'ol'" 37 | 38 | ^ self species withAll: (self asGtStringContentSet intersection: aCollection) asArray 39 | ] 40 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol/GtStringContentDictionary.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #GtStringContentDictionary, 3 | #superclass : #Dictionary, 4 | #category : #'GToolkit-PharoBasePatch-StrictSymbol-Collections' 5 | } 6 | 7 | { #category : #converting } 8 | GtStringContentDictionary >> asGtStringContentDictionary [ 9 | 10 | ^ self 11 | ] 12 | 13 | { #category : #serialization } 14 | GtStringContentDictionary >> mpWriteSelector [ 15 | 16 | ^#writeMap: 17 | ] 18 | 19 | { #category : #private } 20 | GtStringContentDictionary >> scanFor: anObject [ 21 | "Scan the key array for the first slot containing either a nil (indicating an empty slot) or an element that matches anObject. Answer the index of that slot or zero if no slot is found. This method will be overridden in various subclasses that have different interpretations for matching elements." 22 | | element start finish | 23 | 24 | finish := array size. 25 | start := (anObject hash \\ finish) + 1. 26 | 27 | "Search from (hash mod size) to the end." 28 | start to: finish do: 29 | [:index | ((element := array at: index) == nil or: [element key sameContentAs: anObject]) 30 | ifTrue: [^ index ]]. 31 | 32 | "Search from 1 to where we started." 33 | 1 to: start-1 do: 34 | [:index | ((element := array at: index) == nil or: [element key sameContentAs: anObject]) 35 | ifTrue: [^ index ]]. 36 | 37 | ^ 0 "No match AND no empty slot" 38 | ] 39 | 40 | { #category : #serialization } 41 | GtStringContentDictionary >> stonOn: stonWriter [ 42 | "Instances of STON mapClass will be encoded directly, without a class tag. 43 | Other (sub)classes will be encoded with a class tag and will use a map representation. " 44 | 45 | stonWriter writeMap: self 46 | ] 47 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol/GtStringContentOrderedDictionary.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #GtStringContentOrderedDictionary, 3 | #superclass : #OrderedDictionary, 4 | #category : #'GToolkit-PharoBasePatch-StrictSymbol-Collections' 5 | } 6 | 7 | { #category : #accessing } 8 | GtStringContentOrderedDictionary >> dictionaryClass [ 9 | ^ GtStringContentDictionary 10 | ] 11 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol/GtStringContentSet.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #GtStringContentSet, 3 | #superclass : #Set, 4 | #category : #'GToolkit-PharoBasePatch-StrictSymbol-Collections' 5 | } 6 | 7 | { #category : #private } 8 | GtStringContentSet >> scanFor: anObject [ 9 | "Scan the key array for the first slot containing either a nil (indicating an empty slot) or an element that matches anObject. Answer the index of that slot or raise an error if no slot is found. This method will be overridden in various subclasses that have different interpretations for matching elements." 10 | 11 | | index start | 12 | index := start := anObject hash \\ array size + 1. 13 | [ 14 | | element | 15 | ((element := array at: index) == nil or: [ element enclosedElement sameContentAs: anObject ]) 16 | ifTrue: [ ^index ]. 17 | (index := index \\ array size + 1) = start ] whileFalse. 18 | self errorNoFreeSpace 19 | ] 20 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol/GtStringContentWeakSet.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #GtStringContentWeakSet, 3 | #superclass : #WeakSet, 4 | #category : #'GToolkit-PharoBasePatch-StrictSymbol-Collections' 5 | } 6 | 7 | { #category : #private } 8 | GtStringContentWeakSet >> scanFor: anObject [ 9 | "Scan the key array for the first slot containing either flag (indicating an empty slot) or an element that matches anObject. Answer the index of that slot or raise an error if no slot is found. This method will be overridden in various subclasses that have different interpretations for matching elements." 10 | 11 | | index start | 12 | index := start := anObject hash \\ array size + 1. 13 | [ 14 | | element | 15 | ((element := array at: index) == flag or: [ element enclosedElement sameContentAs: anObject ]) 16 | ifTrue: [ ^index ]. 17 | (index := index \\ array size + 1) = start ] whileFalse. 18 | self errorNoFreeSpace 19 | ] 20 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol/LinkedList.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #LinkedList } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol' } 4 | LinkedList >> stringContentIndexOf: anElement startingAt: start ifAbsent: exceptionBlock [ 5 | "Answer the index of the first occurrence of anElement after start 6 | within the receiver. If the receiver does not contain anElement, 7 | answer the result of evaluating the argument, exceptionBlock. 8 | Compare Strings and Symbols based on their content." 9 | | currentLink index | 10 | 11 | currentLink := self linkAt: start ifAbsent: [ nil ]. 12 | index := start. 13 | [ currentLink isNil ] 14 | whileFalse: [ (currentLink value sameContentAs: anElement value) ifTrue: [ ^ index ]. 15 | currentLink := currentLink nextLink. 16 | index := index + 1 ]. 17 | ^ exceptionBlock value 18 | ] 19 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol/Object.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #Object } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol' } 4 | Object >> sameContentAs: anObject [ 5 | 6 | ^ self = anObject 7 | ] 8 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol/RunArray.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RunArray } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol' } 4 | RunArray >> asGtStringContentSet [ 5 | ^values asGtStringContentSet 6 | ] 7 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol/String.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #String } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol' } 4 | String >> sameContentAs: aString [ 5 | "Answer whether the receiver sorts equally as aString. 6 | The collation order is simple ascii (with case differences)." 7 | " 'abc' = 'def' >>> false" 8 | " 'abc' = 'abc' >>> true" 9 | " 'def' = 'abc' >>> false" 10 | 11 | (aString isString and: [self size = aString size]) ifFalse: [^false]. 12 | ^ (self compare: self with: aString collated: AsciiOrder) = (self 13 | fastForPharo12: [0] forPharo11: [2]) 14 | ] 15 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol/Symbol.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #Symbol } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol' } 4 | Symbol >> sameContentAs: aString [ 5 | "Compare the receiver and aString." 6 | self == aString ifTrue: [^ true]. 7 | self class == aString class ifTrue: [^ false]. 8 | "Use String comparison otherwise" 9 | ^ super sameContentAs: aString 10 | ] 11 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol/Text.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #Text } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-StrictSymbol' } 4 | Text >> sameContentAs: other [ 5 | "Am I equal to the other Text or String? 6 | ***** Warning ***** Two Texts are considered equal if they have the same characters in them. They might have completely different emphasis, fonts, sizes, text actions, or embedded morphs. If you need to find out if one is a true copy of the other, you must do (text1 = text2 and: [text1 runs = text2 runs])." 7 | 8 | other isText ifTrue: ["This is designed to run fast even for megabytes" 9 | ^ string == other string or: [string = other string]]. 10 | other isString ifTrue: [^ string == other or: [string sameContentAs: other]]. 11 | ^ false 12 | ] 13 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-StrictSymbol/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'GToolkit-PharoBasePatch-StrictSymbol' } 2 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Subscriptions/MethodAnnouncement.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #MethodAnnouncement } 2 | 3 | { #category : #'*GToolkit-PharoBasePatch-Subscriptions' } 4 | MethodAnnouncement >> affectsMethodsDefinedInPackage: aPackage [ 5 | 6 | 7 | "Patch to use the #methodPackage method so that the package can be computed lazily." 8 | ^self methodPackage == aPackage or: [ self methodAffected package == aPackage ] 9 | ] 10 | 11 | { #category : #'*GToolkit-PharoBasePatch-Subscriptions' } 12 | MethodAnnouncement >> method: aCompiledMethod [ 13 | 14 | 15 | method := aCompiledMethod. 16 | 17 | "We comment this out so that the package will be computed lazily only if needed" 18 | "methodPackage := aCompiledMethod package" 19 | ] 20 | -------------------------------------------------------------------------------- /src/GToolkit-PharoBasePatch-Subscriptions/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'GToolkit-PharoBasePatch-Subscriptions' } 2 | -------------------------------------------------------------------------------- /src/GToolkit-PharoOverrides-Debugger/BlBlocUIManager.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #BlBlocUIManager } 2 | 3 | { #category : #'*GToolkit-PharoOverrides-Debugger' } 4 | BlBlocUIManager >> handleDebugRequest: aDebugRequest [ 5 | 6 | 7 | OupsDebuggerSystem new gtOpenDebuggerOnRequest: aDebugRequest 8 | ] 9 | 10 | { #category : #'*GToolkit-PharoOverrides-Debugger' } 11 | BlBlocUIManager >> handleDebugRequest: aDebugRequest fromDebuggerSystem: anOupsDebuggerSystem [ 12 | 13 | 14 | anOupsDebuggerSystem gtOpenDebuggerOnRequest: aDebugRequest 15 | ] 16 | 17 | { #category : #'*GToolkit-PharoOverrides-Debugger' } 18 | BlBlocUIManager >> handleWarningDebugRequest: aDebugRequest [ 19 | 20 | 21 | OupsDebuggerSystem new gtOpenDebuggerOnRequest: aDebugRequest 22 | ] 23 | 24 | { #category : #'*GToolkit-PharoOverrides-Debugger' } 25 | BlBlocUIManager >> handleWarningDebugRequest: aDebugRequest fromDebuggerSystem: anOupsDebuggerSystem [ 26 | 27 | 28 | anOupsDebuggerSystem gtOpenDebuggerOnRequest: aDebugRequest 29 | ] 30 | -------------------------------------------------------------------------------- /src/GToolkit-PharoOverrides-Debugger/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'GToolkit-PharoOverrides-Debugger' } 2 | -------------------------------------------------------------------------------- /src/GToolkit-SystemInfo/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'GToolkit-SystemInfo' } 2 | -------------------------------------------------------------------------------- /src/GToolkit-Transcript/GtTranscriptAnnouncement.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #GtTranscriptAnnouncement, 3 | #superclass : #Announcement, 4 | #category : #'GToolkit-Transcript' 5 | } 6 | -------------------------------------------------------------------------------- /src/GToolkit-Transcript/GtTranscriptDeleteAllAnnouncement.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #GtTranscriptDeleteAllAnnouncement, 3 | #superclass : #GtTranscriptAnnouncement, 4 | #category : #'GToolkit-Transcript' 5 | } 6 | -------------------------------------------------------------------------------- /src/GToolkit-Transcript/GtTranscriptDeleteAllTaskAction.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #GtTranscriptDeleteAllTaskAction, 3 | #superclass : #GtTranscriptTextTaskAction, 4 | #category : #'GToolkit-Transcript' 5 | } 6 | 7 | { #category : #'api - running' } 8 | GtTranscriptDeleteAllTaskAction >> run: aWaker [ 9 | "We should only modify the editor from within the UI thread" 10 | 11 | self editor text deleteAll 12 | ] 13 | -------------------------------------------------------------------------------- /src/GToolkit-Transcript/GtTranscriptInsertStringAnnouncement.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #GtTranscriptInsertStringAnnouncement, 3 | #superclass : #GtTranscriptAnnouncement, 4 | #instVars : [ 5 | 'string', 6 | 'attributes' 7 | ], 8 | #category : #'GToolkit-Transcript' 9 | } 10 | 11 | { #category : #accessing } 12 | GtTranscriptInsertStringAnnouncement >> attributes [ 13 | ^ attributes 14 | ] 15 | 16 | { #category : #accessing } 17 | GtTranscriptInsertStringAnnouncement >> attributes: anObject [ 18 | attributes := anObject 19 | ] 20 | 21 | { #category : #accessing } 22 | GtTranscriptInsertStringAnnouncement >> string [ 23 | ^ string 24 | ] 25 | 26 | { #category : #accessing } 27 | GtTranscriptInsertStringAnnouncement >> string: anObject [ 28 | string := anObject 29 | ] 30 | -------------------------------------------------------------------------------- /src/GToolkit-Transcript/GtTranscriptInsertStringTaskAction.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #GtTranscriptInsertStringTaskAction, 3 | #superclass : #GtTranscriptTextTaskAction, 4 | #instVars : [ 5 | 'string', 6 | 'attributes' 7 | ], 8 | #category : #'GToolkit-Transcript' 9 | } 10 | 11 | { #category : #accessing } 12 | GtTranscriptInsertStringTaskAction >> attributes [ 13 | ^ attributes 14 | ] 15 | 16 | { #category : #accessing } 17 | GtTranscriptInsertStringTaskAction >> attributes: anObject [ 18 | attributes := anObject 19 | ] 20 | 21 | { #category : #'api - running' } 22 | GtTranscriptInsertStringTaskAction >> run: aWaker [ 23 | "We should only modify the editor from within the UI thread" 24 | 25 | self editor text append: (self string asRopedText attributes: self attributes) 26 | ] 27 | 28 | { #category : #accessing } 29 | GtTranscriptInsertStringTaskAction >> string [ 30 | ^ string 31 | ] 32 | 33 | { #category : #accessing } 34 | GtTranscriptInsertStringTaskAction >> string: anObject [ 35 | string := anObject 36 | ] 37 | -------------------------------------------------------------------------------- /src/GToolkit-Transcript/GtTranscriptTextTaskAction.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #GtTranscriptTextTaskAction, 3 | #superclass : #BlTask, 4 | #instVars : [ 5 | 'editor' 6 | ], 7 | #category : #'GToolkit-Transcript' 8 | } 9 | 10 | { #category : #testing } 11 | GtTranscriptTextTaskAction class >> isAbstract [ 12 | ^ self name = #GtTranscriptTextTaskAction 13 | ] 14 | 15 | { #category : #accessing } 16 | GtTranscriptTextTaskAction >> editor [ 17 | ^ editor 18 | ] 19 | 20 | { #category : #accessing } 21 | GtTranscriptTextTaskAction >> editor: anObject [ 22 | editor := anObject 23 | ] 24 | -------------------------------------------------------------------------------- /src/GToolkit-Transcript/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'GToolkit-Transcript' } 2 | --------------------------------------------------------------------------------