<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://conwaylife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Snacked</id>
	<title>LifeWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://conwaylife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Snacked"/>
	<link rel="alternate" type="text/html" href="https://conwaylife.com/wiki/Special:Contributions/Snacked"/>
	<updated>2026-11-11T08:49:37Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=User:77topaz/Forum_handles_table&amp;diff=157710</id>
		<title>User:77topaz/Forum handles table</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=User:77topaz/Forum_handles_table&amp;diff=157710"/>
		<updated>2025-01-05T02:27:58Z</updated>

		<summary type="html">&lt;p&gt;Snacked: hyperlinked my user page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To make referencing patterns and other discoveries easier, I&#039;ve decided to start compiling a table noting which forum handle corresponds to which real name used on this wiki. Feel free to add to this table if you want.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Preferred name for credits&lt;br /&gt;
!Forum handle&lt;br /&gt;
!Discord handle&lt;br /&gt;
!Discord nickname&lt;br /&gt;
!LifeWiki username&lt;br /&gt;
!Catagolue handle&lt;br /&gt;
|-&lt;br /&gt;
|[[Adam P. Goucher]]&lt;br /&gt;
|calcyman&lt;br /&gt;
|apgoucher&lt;br /&gt;
|apgoucher&lt;br /&gt;
|[[User:Calcyman|Calcyman]]&lt;br /&gt;
|apgoucher@gmx.com&lt;br /&gt;
|-&lt;br /&gt;
|[[Dylan Chen]]&lt;br /&gt;
|Dylan Chen&lt;br /&gt;
|inspirehep&lt;br /&gt;
|inspirehep&lt;br /&gt;
|[[User:Dylan Chen|Dylan Chen]]&lt;br /&gt;
|inspirehep@gmail.com{{refn|group=note|also Cloud_Bach}}&lt;br /&gt;
|-&lt;br /&gt;
|[[Jiahao Yu]]&lt;br /&gt;
|yujh&lt;br /&gt;
|yujhtheyujh&lt;br /&gt;
|#4 se fan: ihateswitchengines&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|[[User:Yujh|Yujh]]&lt;br /&gt;
|Yujh{{refn|group=note|also Yujh2}}&lt;br /&gt;
|-&lt;br /&gt;
|[[Caleb R. Hilton]]&lt;br /&gt;
|C_R_116&lt;br /&gt;
|c_r_116&lt;br /&gt;
|C_R_116&lt;br /&gt;
|[[User:C R 116|C R 116]]&lt;br /&gt;
|cc.nan.315@gmail.com&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Cyclotrons&lt;br /&gt;
|Cyclotrons&lt;br /&gt;
|Cyclotrons&lt;br /&gt;
|[[User:Cyclotrons|Cyclotrons]]&lt;br /&gt;
|Cyclotrons&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|dani&lt;br /&gt;
|danielle{{refn|group=note|formerly moose}}&lt;br /&gt;
|danielle&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot;&amp;gt;changes often&amp;lt;/ref&amp;gt;&lt;br /&gt;
|[[User:Dani|Dani]]&lt;br /&gt;
|dani&lt;br /&gt;
|-&lt;br /&gt;
|[[Dave Greene]]&lt;br /&gt;
|dvgrn&lt;br /&gt;
|dvgrn&lt;br /&gt;
|dvgrn&lt;br /&gt;
|[[User:Dvgrn|Dvgrn]]&lt;br /&gt;
|-&lt;br /&gt;
|[[David Raucci]]&lt;br /&gt;
|hotdogPi&lt;br /&gt;
|hotdogPi&lt;br /&gt;
|hotdogPi&lt;br /&gt;
|[[User:HotdogPi|HotdogPi]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Dongook Lee]]&lt;br /&gt;
|Scorbie&lt;br /&gt;
|&lt;br /&gt;
|Scorbie&lt;br /&gt;
|[[User:Scorbie|Scorbie]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Evin]]&lt;br /&gt;
|EvinZL&lt;br /&gt;
|wait262144what&lt;br /&gt;
|#NaN switch engine fan&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|[[User:Evin|Evin]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Entity Valkyrie]]&lt;br /&gt;
|Entity Valkyrie 2&lt;br /&gt;
|valkyriver&lt;br /&gt;
|Entity Valkyrie 2&lt;br /&gt;
|[[User:Entity Valkyrie 2|Entity Valkyrie 2]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|H. H. P. M. P. Cole&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[User:H. H. P. M. P. Cole|H. H. P. M. P. Cole]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Ian07&lt;br /&gt;
|Ian07&lt;br /&gt;
|Ian07&lt;br /&gt;
|[[User:Ian07|Ian07]]&lt;br /&gt;
|Ian07&lt;br /&gt;
|-&lt;br /&gt;
|[[Ignacy Jackl]]&lt;br /&gt;
|IgnacyJ&lt;br /&gt;
|jiqci&lt;br /&gt;
|ua w wae      strh az&lt;br /&gt;
|[[User:IgnacyJ|IgnacyJ]]&lt;br /&gt;
|IgnacyJ&lt;br /&gt;
|-&lt;br /&gt;
|[[Ivan Fomichev]]&lt;br /&gt;
|codeholic&lt;br /&gt;
|codeholic&lt;br /&gt;
|codeholic&lt;br /&gt;
|[[User:Codeholic|Codeholic]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Jacob]]&lt;br /&gt;
|moonsheep&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[User:Moonsheep|Moonsheep]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Jeremy Tan]]&lt;br /&gt;
|Freywa&lt;br /&gt;
|Parcly Taxel&lt;br /&gt;
|Parcly Taxel&lt;br /&gt;
|[[User:Freywa|Freywa]]&lt;br /&gt;
|-&lt;br /&gt;
|[[John Winston Garth]]&lt;br /&gt;
|winston&lt;br /&gt;
|winston&lt;br /&gt;
|Christristiax&lt;br /&gt;
|&lt;br /&gt;
|winstax&lt;br /&gt;
|-&lt;br /&gt;
|[[Kalan Warusa]]&lt;br /&gt;
|ihatecorderships&lt;br /&gt;
|Ball Lightning&lt;br /&gt;
|Ihatecorderships&lt;br /&gt;
|[[User:Ihatecorderships|Ihatecorderships]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Matthias Merzenich]]&lt;br /&gt;
|Sokwe&lt;br /&gt;
|Sokwe&lt;br /&gt;
|Matthias Merzenich&lt;br /&gt;
|[[User:Sokwe|Sokwe]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Mitchell Riley]]&lt;br /&gt;
|mvr&lt;br /&gt;
|mvr&lt;br /&gt;
|mvr&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Moosey&lt;br /&gt;
|Moooosey&lt;br /&gt;
|ought to do CA again&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|[[User:Moosey|Moosey]]&lt;br /&gt;
|Moosey&lt;br /&gt;
|-&lt;br /&gt;
|[[Connor Steppie]]&lt;br /&gt;
|muzik&lt;br /&gt;
|muzikbike&lt;br /&gt;
|Партин Моляков&lt;br /&gt;
|[[User:Muzik|Muzik]]&lt;br /&gt;
|muzikbike&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|wwei47{{refn|group=note|formerly wwei23}}&lt;br /&gt;
|xp3_xggk171z8e82&lt;br /&gt;
|&lt;br /&gt;
|[[User:Prime Raptor21|Prime Raptor21]]{{refn|group=note|formerly Wwei23}}&lt;br /&gt;
|ilovecoding23@gmail.com&lt;br /&gt;
|-&lt;br /&gt;
|[[Alex Greason]]&lt;br /&gt;
|AGreason&lt;br /&gt;
|Exa&lt;br /&gt;
|Exa&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|bubblegum&lt;br /&gt;
|sonata «pathétique»&lt;br /&gt;
|sonata&lt;br /&gt;
|[[User:Bubblegum|Bubblegum]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|cvojan&lt;br /&gt;
|cq&lt;br /&gt;
|$$$&lt;br /&gt;
|[[User:Cvojan|Cvojan]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|goldenratio&lt;br /&gt;
|phiisnotcoolanymore&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|goldenratio&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|[[User:Goldenratio|Goldenratio]]&lt;br /&gt;
|onepoint618&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|iNoMed&lt;br /&gt;
|iNoMed&lt;br /&gt;
|iNoMed&lt;br /&gt;
|[[User:INoMed|INoMed]]&lt;br /&gt;
|-&lt;br /&gt;
|[[James Pascua]]&lt;br /&gt;
|JP21&lt;br /&gt;
|Jam11&lt;br /&gt;
|&lt;br /&gt;
|[[User:JP21|JP21]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Mark Niemiec]]&lt;br /&gt;
|mniemiec&lt;br /&gt;
|StrongAxe&lt;br /&gt;
|Mark D. Niemiec&lt;br /&gt;
|-&lt;br /&gt;
|[[Daniel Vargas]]&lt;br /&gt;
|MathAndCode&lt;br /&gt;
|Danny2197&lt;br /&gt;
|MathAndCode&lt;br /&gt;
|[[User:MathAndCode|MathAndCode]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Nico Brown]]&lt;br /&gt;
|glider_rider&lt;br /&gt;
|turingcomplete30&lt;br /&gt;
|Nico (glider_rider)&lt;br /&gt;
|-&lt;br /&gt;
|[[Nikola K.]]&lt;br /&gt;
|andrewph33&lt;br /&gt;
|andrewthediscorder&lt;br /&gt;
|andrewthediscorder&lt;br /&gt;
|-&lt;br /&gt;
|[[Oscar Cunningham]]&lt;br /&gt;
|Macbi&lt;br /&gt;
|Macbi&lt;br /&gt;
|Macbi&lt;br /&gt;
|Macbi&lt;br /&gt;
|Macbi&lt;br /&gt;
|-&lt;br /&gt;
|[[Pavel Grankovskiy]]&lt;br /&gt;
|Pavgran&lt;br /&gt;
|Pavgran&lt;br /&gt;
|Pavgran&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Saka&lt;br /&gt;
|Droseraman&lt;br /&gt;
|Saka&lt;br /&gt;
|[[User:Saka|Saka]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Tanner Jacobi]]&lt;br /&gt;
|Kazyan&lt;br /&gt;
|Kazyan&lt;br /&gt;
|Kazyan&lt;br /&gt;
|-&lt;br /&gt;
|[[praosylen]]&lt;br /&gt;
|praosylen&amp;lt;ref name=&amp;quot;4A4A&amp;quot; group=&amp;quot;note&amp;quot;&amp;gt;formerly A for awesome&amp;lt;/ref&amp;gt;&lt;br /&gt;
|praosylen&lt;br /&gt;
|&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|[[User:Praosylen|Praosylen]]&amp;lt;ref name=&amp;quot;4A4A&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|0x6ef79077fbb&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|83bismuth38&lt;br /&gt;
|Dui Mauris Football&lt;br /&gt;
|gbrldvs&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|AforAmpere&lt;br /&gt;
|AforAmpere&lt;br /&gt;
|Ampere&lt;br /&gt;
|-&lt;br /&gt;
|[[Andrew J. Wade]]&lt;br /&gt;
|mscibing&lt;br /&gt;
|mscibing&lt;br /&gt;
|-&lt;br /&gt;
|[[Arie Paap]]&lt;br /&gt;
|wildmyron&lt;br /&gt;
|wildmyron&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Blinkerspawn&lt;br /&gt;
|AxiomaticSystem&lt;br /&gt;
|Blinkerspawn&lt;br /&gt;
|-&lt;br /&gt;
|[[Brett Berger]]&lt;br /&gt;
|biggiemac&lt;br /&gt;
|biggiemac42&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|M. I. Wright&lt;br /&gt;
|caramel&amp;lt;ref name=&amp;quot;wright&amp;quot; group=&amp;quot;note&amp;quot;&amp;gt;formerly Wright&amp;lt;/ref&amp;gt;&lt;br /&gt;
|caramel&amp;lt;ref name=&amp;quot;wright&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|cgoler2&lt;br /&gt;
|cgoler2&lt;br /&gt;
|just red&lt;br /&gt;
|[[User:Cgoler2|Cgoler2]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|confocaloid&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[User:Confocal|Confocal]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|gameoflifemaniac&lt;br /&gt;
|Illuminati65&lt;br /&gt;
|Illuminati65&lt;br /&gt;
|-&lt;br /&gt;
|[[John Goodman]]&lt;br /&gt;
|John Goodman&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|John Goodman&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|KittyTac&lt;br /&gt;
|KittyTac&lt;br /&gt;
|FOOF + ClF3&lt;br /&gt;
|-&lt;br /&gt;
|[[Luke Kiernan]]&lt;br /&gt;
|yoleo&lt;br /&gt;
|ljkiernan1&lt;br /&gt;
|ljkiernan1&lt;br /&gt;
|-&lt;br /&gt;
|[[Mateusz Naściszewski]]&lt;br /&gt;
|&lt;br /&gt;
|Mateon1&lt;br /&gt;
|Mateon1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Redstoneboi&lt;br /&gt;
|Redstoneboi&lt;br /&gt;
|RS BOB&lt;br /&gt;
|-&lt;br /&gt;
|[[Rob Liston]]&lt;br /&gt;
|rliston&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|rliston@gmail.com&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Sarp&lt;br /&gt;
|Sarperen&lt;br /&gt;
|Sarp&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|_zM&lt;br /&gt;
|_zM&lt;br /&gt;
|bird&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[Alexey Nigin]]&lt;br /&gt;
|Alexey_Nigin&lt;br /&gt;
|-&lt;br /&gt;
|[[Andrzej Okrasinski]]&lt;br /&gt;
|ohennel&lt;br /&gt;
|-&lt;br /&gt;
|[[Avery Feingold]]&lt;br /&gt;
|NimbleRogue&lt;br /&gt;
|-&lt;br /&gt;
|[[Chris Cain]]&lt;br /&gt;
|chris_c&lt;br /&gt;
|-&lt;br /&gt;
|[[Chris Rowett]]&lt;br /&gt;
|rowett&lt;br /&gt;
|rowett&lt;br /&gt;
|rowett&lt;br /&gt;
|[[User:Rowett|Rowett]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Darren Li]]&lt;br /&gt;
|testitemqlstudop&lt;br /&gt;
|gchromodynamics&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;formerly Dandan and ascendantDreamweaver, display name gradiometricChromodynamics&amp;lt;/ref&amp;gt;&lt;br /&gt;
|very&lt;br /&gt;
|[[User:Testitemqlstudop|Testitemqlstudop]]&lt;br /&gt;
|TechnobladeNeverDies&lt;br /&gt;
|-&lt;br /&gt;
|[[David Bell]]&lt;br /&gt;
|dbell&lt;br /&gt;
|-&lt;br /&gt;
|[[David S. Miller]]&lt;br /&gt;
|dsmiller&lt;br /&gt;
|-&lt;br /&gt;
|[[Dean Hickerson]]&lt;br /&gt;
|Dean Hickerson&lt;br /&gt;
|-&lt;br /&gt;
|[[Ed Pegg Jr]]&lt;br /&gt;
|EdPeggJr&lt;br /&gt;
|-&lt;br /&gt;
|[[Emerson J. Perkins]]&lt;br /&gt;
|knightlife&lt;br /&gt;
|-&lt;br /&gt;
|[[Frank Everdij]]&lt;br /&gt;
|dexter1&lt;br /&gt;
|-&lt;br /&gt;
|[[Hartmut Holzwart]]&lt;br /&gt;
|HartmutHolzwart&lt;br /&gt;
|-&lt;br /&gt;
|[[Heinrich Koenig]]&lt;br /&gt;
|hkoenig&lt;br /&gt;
|-&lt;br /&gt;
|[[Jason Summers]]&lt;br /&gt;
|Jason Summers&lt;br /&gt;
|-&lt;br /&gt;
|[[Josh Ball]]&lt;br /&gt;
|velcrorex&lt;br /&gt;
|-&lt;br /&gt;
|[[Haycat Durnak]]&lt;br /&gt;
|Haycat2009&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[User:Haycat2009|Haycat2009]]&lt;br /&gt;
|Durnakoic acid&lt;br /&gt;
|-&lt;br /&gt;
|[[Karel Suhajda]]&lt;br /&gt;
|Kasuha&lt;br /&gt;
|-&lt;br /&gt;
|[[Keith Amling]]&lt;br /&gt;
|amling&lt;br /&gt;
|-&lt;br /&gt;
|[[Kiran Linsuain]]&lt;br /&gt;
|Kiran&lt;br /&gt;
|-&lt;br /&gt;
|[[Lewis Patterson]]&lt;br /&gt;
|Lewis&lt;br /&gt;
|-&lt;br /&gt;
|[[Louis-François Handfield]]&lt;br /&gt;
|Jormungant&lt;br /&gt;
|-&lt;br /&gt;
|[[Luka Okanishi]]&lt;br /&gt;
|AbhpzTa&lt;br /&gt;
|-&lt;br /&gt;
|[[Martin Grant]]&lt;br /&gt;
|Extrementhusiast&lt;br /&gt;
|-&lt;br /&gt;
|[[Matti Ward]]&lt;br /&gt;
|mattiward&lt;br /&gt;
|-&lt;br /&gt;
|[[Michael Simkin]]&lt;br /&gt;
|simsim314&lt;br /&gt;
|-&lt;br /&gt;
|[[Mike Playle]]&lt;br /&gt;
|MikeP&lt;br /&gt;
|-&lt;br /&gt;
|[[Nick Gotts]]&lt;br /&gt;
|NickGotts&lt;br /&gt;
|-&lt;br /&gt;
|[[Park Shinhwan]]&lt;br /&gt;
|Dannyu NDos/David&lt;br /&gt;
|-&lt;br /&gt;
|[[Paul Callahan]]&lt;br /&gt;
|pcallahan&lt;br /&gt;
|-&lt;br /&gt;
|[[Paul Chapman]]&lt;br /&gt;
|igblan&lt;br /&gt;
|-&lt;br /&gt;
|[[Paul Tooke]]&lt;br /&gt;
|Paul Tooke&lt;br /&gt;
|-&lt;br /&gt;
|[[Rich Holmes]]&lt;br /&gt;
|Rich Holmes&lt;br /&gt;
|-&lt;br /&gt;
|[[Richard Schank]]&lt;br /&gt;
|flipper77&lt;br /&gt;
|-&lt;br /&gt;
|[[Sergey Petrov]]&lt;br /&gt;
|Guam&lt;br /&gt;
|-&lt;br /&gt;
|[[Shannon Omick]]&lt;br /&gt;
|skomick&lt;br /&gt;
|-&lt;br /&gt;
|[[Scot Ellison]]&lt;br /&gt;
|scote&lt;br /&gt;
|-&lt;br /&gt;
|[[Simon Ekström]]&lt;br /&gt;
|simeks&lt;br /&gt;
|-&lt;br /&gt;
|[[Stephen Silver]]&lt;br /&gt;
|SAS&lt;br /&gt;
|-&lt;br /&gt;
|[[Szymon Bartosiewicz]]&lt;br /&gt;
|lifeisawesome&lt;br /&gt;
|-&lt;br /&gt;
|[[Tim Coe]]&lt;br /&gt;
|moebius&lt;br /&gt;
|-&lt;br /&gt;
|[[Tim Hutton]]&lt;br /&gt;
|Tim Hutton&lt;br /&gt;
|-&lt;br /&gt;
|[[Tomas Rokicki]]&lt;br /&gt;
|rokicki&lt;br /&gt;
|-&lt;br /&gt;
|[[Wojciech Kęsy]]&lt;br /&gt;
|Game of Life Fun&lt;br /&gt;
|-&lt;br /&gt;
|[[Yoel Matveyev]]&lt;br /&gt;
|Yoel&lt;br /&gt;
|-&lt;br /&gt;
|[[Lucy D&#039;Agostino]]&lt;br /&gt;
|C28&lt;br /&gt;
|thevillageidiot0476&lt;br /&gt;
|C28&lt;br /&gt;
|[[User:C28|C28]]&lt;br /&gt;
|-&lt;br /&gt;
|Phil Bookman&lt;br /&gt;
|Book&lt;br /&gt;
|Book&lt;br /&gt;
|Book&lt;br /&gt;
|-&lt;br /&gt;
|Maia Karpovich&lt;br /&gt;
|thunk&lt;br /&gt;
|thunkii&lt;br /&gt;
|maia thunkies&lt;br /&gt;
|-&lt;br /&gt;
|Zhenqian Peng&lt;br /&gt;
|pzq_alex&lt;br /&gt;
|pzq_alex&lt;br /&gt;
|#!/usr/bin/pzq&lt;br /&gt;
|[[User:Pzq_Alex|Pzq Alex]]&lt;br /&gt;
|pzq_alex&lt;br /&gt;
|-&lt;br /&gt;
|[[Dmitry Maitak]]&lt;br /&gt;
|May13&lt;br /&gt;
|-&lt;br /&gt;
|Tommy Ziblis&lt;br /&gt;
|tommyaweosme&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|tommyaweosme&lt;br /&gt;
|tommyaweosme&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|unname4798&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[User:Unname4798|Unname4798]]&lt;br /&gt;
|-&lt;br /&gt;
|Chenxiao Zhou&lt;br /&gt;
|islptng&lt;br /&gt;
|islptng&lt;br /&gt;
|islptng&lt;br /&gt;
|[[User:I am islptng|I am islptng]]&lt;br /&gt;
|islptng&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|get_Snacked&lt;br /&gt;
|.aoeuidhtns&lt;br /&gt;
|#1 ethnomusicology fan&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|[[User:Snacked|Snacked]]&lt;br /&gt;
|get_snacked&lt;br /&gt;
|}&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOINDEX__&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=User:77topaz/Forum_handles_table&amp;diff=157709</id>
		<title>User:77topaz/Forum handles table</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=User:77topaz/Forum_handles_table&amp;diff=157709"/>
		<updated>2025-01-05T02:27:27Z</updated>

		<summary type="html">&lt;p&gt;Snacked: added myself&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To make referencing patterns and other discoveries easier, I&#039;ve decided to start compiling a table noting which forum handle corresponds to which real name used on this wiki. Feel free to add to this table if you want.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Preferred name for credits&lt;br /&gt;
!Forum handle&lt;br /&gt;
!Discord handle&lt;br /&gt;
!Discord nickname&lt;br /&gt;
!LifeWiki username&lt;br /&gt;
!Catagolue handle&lt;br /&gt;
|-&lt;br /&gt;
|[[Adam P. Goucher]]&lt;br /&gt;
|calcyman&lt;br /&gt;
|apgoucher&lt;br /&gt;
|apgoucher&lt;br /&gt;
|[[User:Calcyman|Calcyman]]&lt;br /&gt;
|apgoucher@gmx.com&lt;br /&gt;
|-&lt;br /&gt;
|[[Dylan Chen]]&lt;br /&gt;
|Dylan Chen&lt;br /&gt;
|inspirehep&lt;br /&gt;
|inspirehep&lt;br /&gt;
|[[User:Dylan Chen|Dylan Chen]]&lt;br /&gt;
|inspirehep@gmail.com{{refn|group=note|also Cloud_Bach}}&lt;br /&gt;
|-&lt;br /&gt;
|[[Jiahao Yu]]&lt;br /&gt;
|yujh&lt;br /&gt;
|yujhtheyujh&lt;br /&gt;
|#4 se fan: ihateswitchengines&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|[[User:Yujh|Yujh]]&lt;br /&gt;
|Yujh{{refn|group=note|also Yujh2}}&lt;br /&gt;
|-&lt;br /&gt;
|[[Caleb R. Hilton]]&lt;br /&gt;
|C_R_116&lt;br /&gt;
|c_r_116&lt;br /&gt;
|C_R_116&lt;br /&gt;
|[[User:C R 116|C R 116]]&lt;br /&gt;
|cc.nan.315@gmail.com&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Cyclotrons&lt;br /&gt;
|Cyclotrons&lt;br /&gt;
|Cyclotrons&lt;br /&gt;
|[[User:Cyclotrons|Cyclotrons]]&lt;br /&gt;
|Cyclotrons&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|dani&lt;br /&gt;
|danielle{{refn|group=note|formerly moose}}&lt;br /&gt;
|danielle&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot;&amp;gt;changes often&amp;lt;/ref&amp;gt;&lt;br /&gt;
|[[User:Dani|Dani]]&lt;br /&gt;
|dani&lt;br /&gt;
|-&lt;br /&gt;
|[[Dave Greene]]&lt;br /&gt;
|dvgrn&lt;br /&gt;
|dvgrn&lt;br /&gt;
|dvgrn&lt;br /&gt;
|[[User:Dvgrn|Dvgrn]]&lt;br /&gt;
|-&lt;br /&gt;
|[[David Raucci]]&lt;br /&gt;
|hotdogPi&lt;br /&gt;
|hotdogPi&lt;br /&gt;
|hotdogPi&lt;br /&gt;
|[[User:HotdogPi|HotdogPi]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Dongook Lee]]&lt;br /&gt;
|Scorbie&lt;br /&gt;
|&lt;br /&gt;
|Scorbie&lt;br /&gt;
|[[User:Scorbie|Scorbie]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Evin]]&lt;br /&gt;
|EvinZL&lt;br /&gt;
|wait262144what&lt;br /&gt;
|#NaN switch engine fan&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|[[User:Evin|Evin]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Entity Valkyrie]]&lt;br /&gt;
|Entity Valkyrie 2&lt;br /&gt;
|valkyriver&lt;br /&gt;
|Entity Valkyrie 2&lt;br /&gt;
|[[User:Entity Valkyrie 2|Entity Valkyrie 2]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|H. H. P. M. P. Cole&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[User:H. H. P. M. P. Cole|H. H. P. M. P. Cole]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Ian07&lt;br /&gt;
|Ian07&lt;br /&gt;
|Ian07&lt;br /&gt;
|[[User:Ian07|Ian07]]&lt;br /&gt;
|Ian07&lt;br /&gt;
|-&lt;br /&gt;
|[[Ignacy Jackl]]&lt;br /&gt;
|IgnacyJ&lt;br /&gt;
|jiqci&lt;br /&gt;
|ua w wae      strh az&lt;br /&gt;
|[[User:IgnacyJ|IgnacyJ]]&lt;br /&gt;
|IgnacyJ&lt;br /&gt;
|-&lt;br /&gt;
|[[Ivan Fomichev]]&lt;br /&gt;
|codeholic&lt;br /&gt;
|codeholic&lt;br /&gt;
|codeholic&lt;br /&gt;
|[[User:Codeholic|Codeholic]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Jacob]]&lt;br /&gt;
|moonsheep&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[User:Moonsheep|Moonsheep]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Jeremy Tan]]&lt;br /&gt;
|Freywa&lt;br /&gt;
|Parcly Taxel&lt;br /&gt;
|Parcly Taxel&lt;br /&gt;
|[[User:Freywa|Freywa]]&lt;br /&gt;
|-&lt;br /&gt;
|[[John Winston Garth]]&lt;br /&gt;
|winston&lt;br /&gt;
|winston&lt;br /&gt;
|Christristiax&lt;br /&gt;
|&lt;br /&gt;
|winstax&lt;br /&gt;
|-&lt;br /&gt;
|[[Kalan Warusa]]&lt;br /&gt;
|ihatecorderships&lt;br /&gt;
|Ball Lightning&lt;br /&gt;
|Ihatecorderships&lt;br /&gt;
|[[User:Ihatecorderships|Ihatecorderships]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Matthias Merzenich]]&lt;br /&gt;
|Sokwe&lt;br /&gt;
|Sokwe&lt;br /&gt;
|Matthias Merzenich&lt;br /&gt;
|[[User:Sokwe|Sokwe]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Mitchell Riley]]&lt;br /&gt;
|mvr&lt;br /&gt;
|mvr&lt;br /&gt;
|mvr&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Moosey&lt;br /&gt;
|Moooosey&lt;br /&gt;
|ought to do CA again&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|[[User:Moosey|Moosey]]&lt;br /&gt;
|Moosey&lt;br /&gt;
|-&lt;br /&gt;
|[[Connor Steppie]]&lt;br /&gt;
|muzik&lt;br /&gt;
|muzikbike&lt;br /&gt;
|Партин Моляков&lt;br /&gt;
|[[User:Muzik|Muzik]]&lt;br /&gt;
|muzikbike&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|wwei47{{refn|group=note|formerly wwei23}}&lt;br /&gt;
|xp3_xggk171z8e82&lt;br /&gt;
|&lt;br /&gt;
|[[User:Prime Raptor21|Prime Raptor21]]{{refn|group=note|formerly Wwei23}}&lt;br /&gt;
|ilovecoding23@gmail.com&lt;br /&gt;
|-&lt;br /&gt;
|[[Alex Greason]]&lt;br /&gt;
|AGreason&lt;br /&gt;
|Exa&lt;br /&gt;
|Exa&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|bubblegum&lt;br /&gt;
|sonata «pathétique»&lt;br /&gt;
|sonata&lt;br /&gt;
|[[User:Bubblegum|Bubblegum]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|cvojan&lt;br /&gt;
|cq&lt;br /&gt;
|$$$&lt;br /&gt;
|[[User:Cvojan|Cvojan]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|goldenratio&lt;br /&gt;
|phiisnotcoolanymore&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|goldenratio&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|[[User:Goldenratio|Goldenratio]]&lt;br /&gt;
|onepoint618&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|iNoMed&lt;br /&gt;
|iNoMed&lt;br /&gt;
|iNoMed&lt;br /&gt;
|[[User:INoMed|INoMed]]&lt;br /&gt;
|-&lt;br /&gt;
|[[James Pascua]]&lt;br /&gt;
|JP21&lt;br /&gt;
|Jam11&lt;br /&gt;
|&lt;br /&gt;
|[[User:JP21|JP21]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Mark Niemiec]]&lt;br /&gt;
|mniemiec&lt;br /&gt;
|StrongAxe&lt;br /&gt;
|Mark D. Niemiec&lt;br /&gt;
|-&lt;br /&gt;
|[[Daniel Vargas]]&lt;br /&gt;
|MathAndCode&lt;br /&gt;
|Danny2197&lt;br /&gt;
|MathAndCode&lt;br /&gt;
|[[User:MathAndCode|MathAndCode]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Nico Brown]]&lt;br /&gt;
|glider_rider&lt;br /&gt;
|turingcomplete30&lt;br /&gt;
|Nico (glider_rider)&lt;br /&gt;
|-&lt;br /&gt;
|[[Nikola K.]]&lt;br /&gt;
|andrewph33&lt;br /&gt;
|andrewthediscorder&lt;br /&gt;
|andrewthediscorder&lt;br /&gt;
|-&lt;br /&gt;
|[[Oscar Cunningham]]&lt;br /&gt;
|Macbi&lt;br /&gt;
|Macbi&lt;br /&gt;
|Macbi&lt;br /&gt;
|Macbi&lt;br /&gt;
|Macbi&lt;br /&gt;
|-&lt;br /&gt;
|[[Pavel Grankovskiy]]&lt;br /&gt;
|Pavgran&lt;br /&gt;
|Pavgran&lt;br /&gt;
|Pavgran&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Saka&lt;br /&gt;
|Droseraman&lt;br /&gt;
|Saka&lt;br /&gt;
|[[User:Saka|Saka]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Tanner Jacobi]]&lt;br /&gt;
|Kazyan&lt;br /&gt;
|Kazyan&lt;br /&gt;
|Kazyan&lt;br /&gt;
|-&lt;br /&gt;
|[[praosylen]]&lt;br /&gt;
|praosylen&amp;lt;ref name=&amp;quot;4A4A&amp;quot; group=&amp;quot;note&amp;quot;&amp;gt;formerly A for awesome&amp;lt;/ref&amp;gt;&lt;br /&gt;
|praosylen&lt;br /&gt;
|&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|[[User:Praosylen|Praosylen]]&amp;lt;ref name=&amp;quot;4A4A&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|0x6ef79077fbb&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|83bismuth38&lt;br /&gt;
|Dui Mauris Football&lt;br /&gt;
|gbrldvs&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|AforAmpere&lt;br /&gt;
|AforAmpere&lt;br /&gt;
|Ampere&lt;br /&gt;
|-&lt;br /&gt;
|[[Andrew J. Wade]]&lt;br /&gt;
|mscibing&lt;br /&gt;
|mscibing&lt;br /&gt;
|-&lt;br /&gt;
|[[Arie Paap]]&lt;br /&gt;
|wildmyron&lt;br /&gt;
|wildmyron&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Blinkerspawn&lt;br /&gt;
|AxiomaticSystem&lt;br /&gt;
|Blinkerspawn&lt;br /&gt;
|-&lt;br /&gt;
|[[Brett Berger]]&lt;br /&gt;
|biggiemac&lt;br /&gt;
|biggiemac42&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|M. I. Wright&lt;br /&gt;
|caramel&amp;lt;ref name=&amp;quot;wright&amp;quot; group=&amp;quot;note&amp;quot;&amp;gt;formerly Wright&amp;lt;/ref&amp;gt;&lt;br /&gt;
|caramel&amp;lt;ref name=&amp;quot;wright&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|cgoler2&lt;br /&gt;
|cgoler2&lt;br /&gt;
|just red&lt;br /&gt;
|[[User:Cgoler2|Cgoler2]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|confocaloid&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[User:Confocal|Confocal]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|gameoflifemaniac&lt;br /&gt;
|Illuminati65&lt;br /&gt;
|Illuminati65&lt;br /&gt;
|-&lt;br /&gt;
|[[John Goodman]]&lt;br /&gt;
|John Goodman&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|John Goodman&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|KittyTac&lt;br /&gt;
|KittyTac&lt;br /&gt;
|FOOF + ClF3&lt;br /&gt;
|-&lt;br /&gt;
|[[Luke Kiernan]]&lt;br /&gt;
|yoleo&lt;br /&gt;
|ljkiernan1&lt;br /&gt;
|ljkiernan1&lt;br /&gt;
|-&lt;br /&gt;
|[[Mateusz Naściszewski]]&lt;br /&gt;
|&lt;br /&gt;
|Mateon1&lt;br /&gt;
|Mateon1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Redstoneboi&lt;br /&gt;
|Redstoneboi&lt;br /&gt;
|RS BOB&lt;br /&gt;
|-&lt;br /&gt;
|[[Rob Liston]]&lt;br /&gt;
|rliston&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|rliston@gmail.com&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Sarp&lt;br /&gt;
|Sarperen&lt;br /&gt;
|Sarp&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|_zM&lt;br /&gt;
|_zM&lt;br /&gt;
|bird&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[Alexey Nigin]]&lt;br /&gt;
|Alexey_Nigin&lt;br /&gt;
|-&lt;br /&gt;
|[[Andrzej Okrasinski]]&lt;br /&gt;
|ohennel&lt;br /&gt;
|-&lt;br /&gt;
|[[Avery Feingold]]&lt;br /&gt;
|NimbleRogue&lt;br /&gt;
|-&lt;br /&gt;
|[[Chris Cain]]&lt;br /&gt;
|chris_c&lt;br /&gt;
|-&lt;br /&gt;
|[[Chris Rowett]]&lt;br /&gt;
|rowett&lt;br /&gt;
|rowett&lt;br /&gt;
|rowett&lt;br /&gt;
|[[User:Rowett|Rowett]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Darren Li]]&lt;br /&gt;
|testitemqlstudop&lt;br /&gt;
|gchromodynamics&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;formerly Dandan and ascendantDreamweaver, display name gradiometricChromodynamics&amp;lt;/ref&amp;gt;&lt;br /&gt;
|very&lt;br /&gt;
|[[User:Testitemqlstudop|Testitemqlstudop]]&lt;br /&gt;
|TechnobladeNeverDies&lt;br /&gt;
|-&lt;br /&gt;
|[[David Bell]]&lt;br /&gt;
|dbell&lt;br /&gt;
|-&lt;br /&gt;
|[[David S. Miller]]&lt;br /&gt;
|dsmiller&lt;br /&gt;
|-&lt;br /&gt;
|[[Dean Hickerson]]&lt;br /&gt;
|Dean Hickerson&lt;br /&gt;
|-&lt;br /&gt;
|[[Ed Pegg Jr]]&lt;br /&gt;
|EdPeggJr&lt;br /&gt;
|-&lt;br /&gt;
|[[Emerson J. Perkins]]&lt;br /&gt;
|knightlife&lt;br /&gt;
|-&lt;br /&gt;
|[[Frank Everdij]]&lt;br /&gt;
|dexter1&lt;br /&gt;
|-&lt;br /&gt;
|[[Hartmut Holzwart]]&lt;br /&gt;
|HartmutHolzwart&lt;br /&gt;
|-&lt;br /&gt;
|[[Heinrich Koenig]]&lt;br /&gt;
|hkoenig&lt;br /&gt;
|-&lt;br /&gt;
|[[Jason Summers]]&lt;br /&gt;
|Jason Summers&lt;br /&gt;
|-&lt;br /&gt;
|[[Josh Ball]]&lt;br /&gt;
|velcrorex&lt;br /&gt;
|-&lt;br /&gt;
|[[Haycat Durnak]]&lt;br /&gt;
|Haycat2009&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[User:Haycat2009|Haycat2009]]&lt;br /&gt;
|Durnakoic acid&lt;br /&gt;
|-&lt;br /&gt;
|[[Karel Suhajda]]&lt;br /&gt;
|Kasuha&lt;br /&gt;
|-&lt;br /&gt;
|[[Keith Amling]]&lt;br /&gt;
|amling&lt;br /&gt;
|-&lt;br /&gt;
|[[Kiran Linsuain]]&lt;br /&gt;
|Kiran&lt;br /&gt;
|-&lt;br /&gt;
|[[Lewis Patterson]]&lt;br /&gt;
|Lewis&lt;br /&gt;
|-&lt;br /&gt;
|[[Louis-François Handfield]]&lt;br /&gt;
|Jormungant&lt;br /&gt;
|-&lt;br /&gt;
|[[Luka Okanishi]]&lt;br /&gt;
|AbhpzTa&lt;br /&gt;
|-&lt;br /&gt;
|[[Martin Grant]]&lt;br /&gt;
|Extrementhusiast&lt;br /&gt;
|-&lt;br /&gt;
|[[Matti Ward]]&lt;br /&gt;
|mattiward&lt;br /&gt;
|-&lt;br /&gt;
|[[Michael Simkin]]&lt;br /&gt;
|simsim314&lt;br /&gt;
|-&lt;br /&gt;
|[[Mike Playle]]&lt;br /&gt;
|MikeP&lt;br /&gt;
|-&lt;br /&gt;
|[[Nick Gotts]]&lt;br /&gt;
|NickGotts&lt;br /&gt;
|-&lt;br /&gt;
|[[Park Shinhwan]]&lt;br /&gt;
|Dannyu NDos/David&lt;br /&gt;
|-&lt;br /&gt;
|[[Paul Callahan]]&lt;br /&gt;
|pcallahan&lt;br /&gt;
|-&lt;br /&gt;
|[[Paul Chapman]]&lt;br /&gt;
|igblan&lt;br /&gt;
|-&lt;br /&gt;
|[[Paul Tooke]]&lt;br /&gt;
|Paul Tooke&lt;br /&gt;
|-&lt;br /&gt;
|[[Rich Holmes]]&lt;br /&gt;
|Rich Holmes&lt;br /&gt;
|-&lt;br /&gt;
|[[Richard Schank]]&lt;br /&gt;
|flipper77&lt;br /&gt;
|-&lt;br /&gt;
|[[Sergey Petrov]]&lt;br /&gt;
|Guam&lt;br /&gt;
|-&lt;br /&gt;
|[[Shannon Omick]]&lt;br /&gt;
|skomick&lt;br /&gt;
|-&lt;br /&gt;
|[[Scot Ellison]]&lt;br /&gt;
|scote&lt;br /&gt;
|-&lt;br /&gt;
|[[Simon Ekström]]&lt;br /&gt;
|simeks&lt;br /&gt;
|-&lt;br /&gt;
|[[Stephen Silver]]&lt;br /&gt;
|SAS&lt;br /&gt;
|-&lt;br /&gt;
|[[Szymon Bartosiewicz]]&lt;br /&gt;
|lifeisawesome&lt;br /&gt;
|-&lt;br /&gt;
|[[Tim Coe]]&lt;br /&gt;
|moebius&lt;br /&gt;
|-&lt;br /&gt;
|[[Tim Hutton]]&lt;br /&gt;
|Tim Hutton&lt;br /&gt;
|-&lt;br /&gt;
|[[Tomas Rokicki]]&lt;br /&gt;
|rokicki&lt;br /&gt;
|-&lt;br /&gt;
|[[Wojciech Kęsy]]&lt;br /&gt;
|Game of Life Fun&lt;br /&gt;
|-&lt;br /&gt;
|[[Yoel Matveyev]]&lt;br /&gt;
|Yoel&lt;br /&gt;
|-&lt;br /&gt;
|[[Lucy D&#039;Agostino]]&lt;br /&gt;
|C28&lt;br /&gt;
|thevillageidiot0476&lt;br /&gt;
|C28&lt;br /&gt;
|[[User:C28|C28]]&lt;br /&gt;
|-&lt;br /&gt;
|Phil Bookman&lt;br /&gt;
|Book&lt;br /&gt;
|Book&lt;br /&gt;
|Book&lt;br /&gt;
|-&lt;br /&gt;
|Maia Karpovich&lt;br /&gt;
|thunk&lt;br /&gt;
|thunkii&lt;br /&gt;
|maia thunkies&lt;br /&gt;
|-&lt;br /&gt;
|Zhenqian Peng&lt;br /&gt;
|pzq_alex&lt;br /&gt;
|pzq_alex&lt;br /&gt;
|#!/usr/bin/pzq&lt;br /&gt;
|[[User:Pzq_Alex|Pzq Alex]]&lt;br /&gt;
|pzq_alex&lt;br /&gt;
|-&lt;br /&gt;
|[[Dmitry Maitak]]&lt;br /&gt;
|May13&lt;br /&gt;
|-&lt;br /&gt;
|Tommy Ziblis&lt;br /&gt;
|tommyaweosme&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|tommyaweosme&lt;br /&gt;
|tommyaweosme&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|unname4798&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[User:Unname4798|Unname4798]]&lt;br /&gt;
|-&lt;br /&gt;
|Chenxiao Zhou&lt;br /&gt;
|islptng&lt;br /&gt;
|islptng&lt;br /&gt;
|islptng&lt;br /&gt;
|[[User:I am islptng|I am islptng]]&lt;br /&gt;
|islptng&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|get_Snacked&lt;br /&gt;
|.aoeuidhtns&lt;br /&gt;
|#1 ethnomusicology fan&amp;lt;ref name=&amp;quot;changes_often&amp;quot; group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
|Snacked&lt;br /&gt;
|get_snacked&lt;br /&gt;
|}&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOINDEX__&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=Cloverleaf_interchange&amp;diff=155858</id>
		<title>Cloverleaf interchange</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=Cloverleaf_interchange&amp;diff=155858"/>
		<updated>2024-09-26T17:18:54Z</updated>

		<summary type="html">&lt;p&gt;Snacked: wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stilllife&lt;br /&gt;
|name         = Cloverleaf interchange&lt;br /&gt;
|pname        = cloverleafinterchange&lt;br /&gt;
|type         = strict&lt;br /&gt;
|c            = 56&lt;br /&gt;
|bx           = 13&lt;br /&gt;
|by           = 13&lt;br /&gt;
|symmetry     = *c&lt;br /&gt;
|discoverer   = Adam P. Goucher&lt;br /&gt;
|discoveryear = 2016&amp;lt;!--should we be listing this as the discovery year if it was known beforehand?--&amp;gt;&lt;br /&gt;
|rulemin      = B/S23&lt;br /&gt;
|rulemax      = B378/S012345678&lt;br /&gt;
|rulespecial  = [[Conway&#039;s Game of Life|Conway Life]]&lt;br /&gt;
|isorulemin   = B/S2cik&lt;br /&gt;
|isorulemax   = B2ikn34-inw5-ry6-i78/S012345678&lt;br /&gt;
|synthesis    = 9&lt;br /&gt;
|plaintext    = true&lt;br /&gt;
|rle          = true&lt;br /&gt;
|viewerconfig = #C [[ THUMBSIZE 2 HEIGHT 480 ]]&lt;br /&gt;
|apgcode      = xs56_g8861u0u1688gz8ll55o0o55ll8zx3430343&lt;br /&gt;
}}&lt;br /&gt;
{{for|other uses of cloverleaf|Cloverleaf (disambiguation)}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Cloverleaf interchange&#039;&#039;&#039; (or &#039;&#039;&#039;fourfold [[racetrack]]-[[weld]]-racetrack&#039;&#039;&#039;) is a {{slcells|56|text=56-cell}} [[still life]] exhibiting D8_1 [[symmetry]]. &lt;br /&gt;
&lt;br /&gt;
While known for many years beforehand due to its ability to be [[hassle]]d, it is notable due to a natural occurrence being found in the [[ash]] of a random [[asymmetric]] [[soup]] by [[Adam P. Goucher]] on August 12, {{year|2016}}.&amp;lt;ref name=&amp;quot;haul10a1c7a48df686717596631e275383a5&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;post34242&amp;quot; /&amp;gt; This made it the single largest known still life to occur completely [[natural]]ly, surpassing the previous record holder, the 46-cell [[professor]]; it had previously arisen semi-naturally in various higher symmetries, including C2_1, C4_1, D2_+1, D4_+1, D4_+2 and D4_x1. It has since been tied in C1 by another, unnamed 56-cell still life found by [[John Goodman]] in September {{year|2021}}.&amp;lt;ref name=&amp;quot;post135613&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[BlinkerSpawn]] found a {{gliders|12}} [[Glider synthesis|synthesis]] on August 12, 2016.&amp;lt;ref name=&amp;quot;post34243&amp;quot; /&amp;gt; [[GUYTU6J]] improved this to {{gliders|10|text=10 gliders}} on February 5, 2020.&amp;lt;ref name=&amp;quot;post88936&amp;quot; /&amp;gt; [[KtT]] further reduced the cost to {{gliders|9|text=9 gliders}} on September 23, 2024.&amp;lt;ref name=&amp;quot;post194679&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A cloverleaf interchange can be hassled by [[carnival shuttle]]s:&lt;br /&gt;
&lt;br /&gt;
{{EmbedViewer&lt;br /&gt;
|pname        = p12cloverleafhassler&lt;br /&gt;
|viewerconfig = #C [[ AUTOSTART THUMBSIZE 2 ZOOM 8 WIDTH 600 HEIGHT 600 GPS 6 LOOP 12 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;haul10a1c7a48df686717596631e275383a5&amp;quot;&amp;gt;{{citeCatagolue&lt;br /&gt;
|page       = haul/b3s23/C1/10a1c7a48df686717596631e275383a5&lt;br /&gt;
|title      = Haul&lt;br /&gt;
|author     = Adam P. Goucher&lt;br /&gt;
|work       = Catagolue&lt;br /&gt;
|date       = August 12, 2016&lt;br /&gt;
|accessdate = August 12, 2016&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post34242&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Soup search results&lt;br /&gt;
|p      = 34242&lt;br /&gt;
|author = Apple Bottom&lt;br /&gt;
|date   = August 12, 2016&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post135613&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Soup search results&lt;br /&gt;
|p      = 135613&lt;br /&gt;
|author = dani&lt;br /&gt;
|date   = September 8, 2021&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post34243&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format     = ref&lt;br /&gt;
|title      = Re: Soup search results&lt;br /&gt;
|f          = 2 &lt;br /&gt;
|t          = 1452 &lt;br /&gt;
|p          = 34243&lt;br /&gt;
|author     = BlinkerSpawn&lt;br /&gt;
|date       = August 12, 2016&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post88936&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Thread for your unsure discoveries&lt;br /&gt;
|p      = 88936&lt;br /&gt;
|author = GUYTU6J&lt;br /&gt;
|date   = February 5, 2020&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post194679&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Still Life Synthesis Thread&lt;br /&gt;
|f      = 2&lt;br /&gt;
|t      = 3267&lt;br /&gt;
|p      = 194679&lt;br /&gt;
|author = KtT&lt;br /&gt;
|date   = September 23, 2024&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* {{LinkWikipedia|Cloverleaf_interchange}}&lt;br /&gt;
* {{LinkCatagolue|xs56_g8861u0u1688gz8ll55o0o55ll8zx3430343}}&lt;br /&gt;
&lt;br /&gt;
{{natural}}&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=Cloverleaf_interchange&amp;diff=155857</id>
		<title>Cloverleaf interchange</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=Cloverleaf_interchange&amp;diff=155857"/>
		<updated>2024-09-26T17:18:31Z</updated>

		<summary type="html">&lt;p&gt;Snacked: added new 9G synthesis. I don&amp;#039;t know why the &amp;quot;2020&amp;quot; on the 10G synthesis had a hyperlink so I removed it&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stilllife&lt;br /&gt;
|name         = Cloverleaf interchange&lt;br /&gt;
|pname        = cloverleafinterchange&lt;br /&gt;
|type         = strict&lt;br /&gt;
|c            = 56&lt;br /&gt;
|bx           = 13&lt;br /&gt;
|by           = 13&lt;br /&gt;
|symmetry     = *c&lt;br /&gt;
|discoverer   = Adam P. Goucher&lt;br /&gt;
|discoveryear = 2016&amp;lt;!--should we be listing this as the discovery year if it was known beforehand?--&amp;gt;&lt;br /&gt;
|rulemin      = B/S23&lt;br /&gt;
|rulemax      = B378/S012345678&lt;br /&gt;
|rulespecial  = [[Conway&#039;s Game of Life|Conway Life]]&lt;br /&gt;
|isorulemin   = B/S2cik&lt;br /&gt;
|isorulemax   = B2ikn34-inw5-ry6-i78/S012345678&lt;br /&gt;
|synthesis    = 9&lt;br /&gt;
|plaintext    = true&lt;br /&gt;
|rle          = true&lt;br /&gt;
|viewerconfig = #C [[ THUMBSIZE 2 HEIGHT 480 ]]&lt;br /&gt;
|apgcode      = xs56_g8861u0u1688gz8ll55o0o55ll8zx3430343&lt;br /&gt;
}}&lt;br /&gt;
{{for|other uses of cloverleaf|Cloverleaf (disambiguation)}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Cloverleaf interchange&#039;&#039;&#039; (or &#039;&#039;&#039;fourfold [[racetrack]]-[[weld]]-racetrack&#039;&#039;&#039;) is a {{slcells|56|text=56-cell}} [[still life]] exhibiting D8_1 [[symmetry]]. &lt;br /&gt;
&lt;br /&gt;
While known for many years beforehand due to its ability to be [[hassle]]d, it is notable due to a natural occurrence being found in the [[ash]] of a random [[asymmetric]] [[soup]] by [[Adam P. Goucher]] on August 12, {{year|2016}}.&amp;lt;ref name=&amp;quot;haul10a1c7a48df686717596631e275383a5&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;post34242&amp;quot; /&amp;gt; This made it the single largest known still life to occur completely [[natural]]ly, surpassing the previous record holder, the 46-cell [[professor]]; it had previously arisen semi-naturally in various higher symmetries, including C2_1, C4_1, D2_+1, D4_+1, D4_+2 and D4_x1. It has since been tied in C1 by another, unnamed 56-cell still life found by [[John Goodman]] in September {{year|2021}}.&amp;lt;ref name=&amp;quot;post135613&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[BlinkerSpawn]] found a {{gliders|12}} [[Glider synthesis|synthesis]] on August 12, 2016.&amp;lt;ref name=&amp;quot;post34243&amp;quot; /&amp;gt; [[GUYTU6J]] improved this to {{gliders|10|text=10 gliders}} on February 5, 2020.&amp;lt;ref name=&amp;quot;post88936&amp;quot; /&amp;gt; [[KtT]] further reduced its cost to {{gliders|9|text=9 gliders}} on September 23, 2024.&amp;lt;ref name=&amp;quot;post194679&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A cloverleaf interchange can be hassled by [[carnival shuttle]]s:&lt;br /&gt;
&lt;br /&gt;
{{EmbedViewer&lt;br /&gt;
|pname        = p12cloverleafhassler&lt;br /&gt;
|viewerconfig = #C [[ AUTOSTART THUMBSIZE 2 ZOOM 8 WIDTH 600 HEIGHT 600 GPS 6 LOOP 12 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;haul10a1c7a48df686717596631e275383a5&amp;quot;&amp;gt;{{citeCatagolue&lt;br /&gt;
|page       = haul/b3s23/C1/10a1c7a48df686717596631e275383a5&lt;br /&gt;
|title      = Haul&lt;br /&gt;
|author     = Adam P. Goucher&lt;br /&gt;
|work       = Catagolue&lt;br /&gt;
|date       = August 12, 2016&lt;br /&gt;
|accessdate = August 12, 2016&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post34242&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Soup search results&lt;br /&gt;
|p      = 34242&lt;br /&gt;
|author = Apple Bottom&lt;br /&gt;
|date   = August 12, 2016&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post135613&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Soup search results&lt;br /&gt;
|p      = 135613&lt;br /&gt;
|author = dani&lt;br /&gt;
|date   = September 8, 2021&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post34243&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format     = ref&lt;br /&gt;
|title      = Re: Soup search results&lt;br /&gt;
|f          = 2 &lt;br /&gt;
|t          = 1452 &lt;br /&gt;
|p          = 34243&lt;br /&gt;
|author     = BlinkerSpawn&lt;br /&gt;
|date       = August 12, 2016&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post88936&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Thread for your unsure discoveries&lt;br /&gt;
|p      = 88936&lt;br /&gt;
|author = GUYTU6J&lt;br /&gt;
|date   = February 5, 2020&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post194679&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Still Life Synthesis Thread&lt;br /&gt;
|f      = 2&lt;br /&gt;
|t      = 3267&lt;br /&gt;
|p      = 194679&lt;br /&gt;
|author = KtT&lt;br /&gt;
|date   = September 23, 2024&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* {{LinkWikipedia|Cloverleaf_interchange}}&lt;br /&gt;
* {{LinkCatagolue|xs56_g8861u0u1688gz8ll55o0o55ll8zx3430343}}&lt;br /&gt;
&lt;br /&gt;
{{natural}}&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=Template:GliderNavbox&amp;diff=143229</id>
		<title>Template:GliderNavbox</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=Template:GliderNavbox&amp;diff=143229"/>
		<updated>2023-12-17T15:29:19Z</updated>

		<summary type="html">&lt;p&gt;Snacked: Snark64 added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox&lt;br /&gt;
|name       = Glider-accepting Devices Navbox&lt;br /&gt;
|state        = {{{state|autocollapse}}}&lt;br /&gt;
|title          = &amp;lt;big&amp;gt;[[Glider]]-accepting devices in stationary [[signal]] [[circuitry]]&amp;lt;/big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;([[Template_talk:GliderNavbox|Talk]] · [https://conwaylife.com/w/index.php?title=Template:GliderNavbox&amp;amp;action=edit Edit] · [[Special:WhatLinksHere/Template:GliderNavbox|Links]])&amp;lt;/small&amp;gt;&lt;br /&gt;
|image      = [[File:Glider.png|64px]]&lt;br /&gt;
|group1    = [[Stable]]&lt;br /&gt;
|list1         = {{Navbox&lt;br /&gt;
 |group1   = [[Reflector]]s&lt;br /&gt;
 |list1        = {{Navbox&lt;br /&gt;
  |group1  = [[Elementary]]&lt;br /&gt;
  |list1       = {{Navbox&lt;br /&gt;
   |group1 = 90-degree&lt;br /&gt;
   |list1      = [[Snark]] · [[Snark64]]&lt;br /&gt;
   |group2 = 180-degree&lt;br /&gt;
   |list2      = [[Boojum reflector]] · [[Rectifier]]&lt;br /&gt;
   |group3 = 0-degree&lt;br /&gt;
   |list3      = [[Bandersnatch]] · [[0-degree colour-preserving reflector (March 2023)]]&lt;br /&gt;
   |group4 = Others&lt;br /&gt;
   |list4      = [[Rephaser]] · [[Glider-block cycle]] · [[Three-block shifter]] &lt;br /&gt;
   }}&lt;br /&gt;
  |group2  = [[Composite]]&lt;br /&gt;
  |list2       = [[Silver&#039;s reflector]] · [[487-tick reflector]] · [[Scorbie Splitter]] · [[Highway robber]] for glider · [[stable pseudo-Heisenburp]] for glider · stable [[speed booster]] (advancer) · [[Trombone slide]]&lt;br /&gt;
  }}&lt;br /&gt;
 |group2   = [[Pulse divider]]s{{br}}([[Period multiplier]]s)&lt;br /&gt;
 |list2        = {{Navbox&lt;br /&gt;
  |group1  = 2×&lt;br /&gt;
  |list1       = [[Semi-Snark]] ([[CC semi-Snark]] · [[CP semi-Snark]]) · [[Semi-cenark]] ([[CC semi-cenark]] · [[CP semi-cenark]])&lt;br /&gt;
  |group2  = 3×&lt;br /&gt;
  |list2       = [[Tremi-Snark]]&lt;br /&gt;
  |group3  = 4×&lt;br /&gt;
  |list3       = [[Quadri-Snark]]&lt;br /&gt;
  |group4  = Adjustable&lt;br /&gt;
  |list4       = p-even [[crystal]]lization-and-decay devices&lt;br /&gt;
  }}&lt;br /&gt;
 |group3   = G-to-X (mostly{{br}}[[glider-to-Herschel]])&lt;br /&gt;
 |list3        = {{Navbox&lt;br /&gt;
  |group1  = Elementary&lt;br /&gt;
  |list1       = {{Navbox&lt;br /&gt;
   |group1 = Single input&lt;br /&gt;
   |list1      = [[Syringe]] · [[Bronco]] · [[Speed tunnel]] · [[G-to-X (November 2023)]] · [[G-to-pi catalyst (August 2023)]] · [[G-to-LWSS (2023)]]&lt;br /&gt;
   |group2 = [[Asynchronous]] double input&lt;br /&gt;
   |list2      = [[Callahan G-to-H]] · [[Herschel receiver]] · [[G4 receiver]]&lt;br /&gt;
   |group3 = [[Synchronized]] double input&lt;br /&gt;
   |list3      = [[Jormungant&#039;s G-to-H]] · [[BFx59H injector]]&lt;br /&gt;
   }}&lt;br /&gt;
  |group2  = Composite&lt;br /&gt;
  |list2       = [[Silver G-to-H]]&lt;br /&gt;
  }}&lt;br /&gt;
 |group4   = [[Memory cell]]s / [[Factory|Factories]]&lt;br /&gt;
 |list4        = [[Glider stopper]] · [[Beehive stopper]] · [[Bistable switch]] · [[Boat-bit]] · [[Honeybit]] · [[Glider to block]] · [[Glider to 2 blocks]]&lt;br /&gt;
 |group5   = [[Eater]]s&lt;br /&gt;
 |list5        = [[Eater 1]] · [[Eater 2]] · [[Eater 3]] · [[Tub-with-tail eater]] · [[Sidesnagger]] · [[Sparking eater]]&lt;br /&gt;
 }}&lt;br /&gt;
|group2   = [[Periodic]]&lt;br /&gt;
|list2        = {{Navbox&lt;br /&gt;
 |group1  = Reflectors&lt;br /&gt;
 |list1       = {{Navbox &lt;br /&gt;
  |group1  = 90-degree&lt;br /&gt;
  |list1       = {{Navbox&lt;br /&gt;
   |group1 = [[Bumper]]s&lt;br /&gt;
   |list1      = [[p3 bumper|p3]] · [[p4 bumper|p4]] · [[p5 bumper|p5]] · [[p6 bumper|p6]] · [[p7 bumper|p7]] · [[p8 bumper|p8]] · [[p9 bumper|p9]] · [[p11 bumper|p11]] · [[p15 bumper|p15]]&lt;br /&gt;
   |group2 = [[Bouncer]]s&lt;br /&gt;
   |list2      = p3 · [[p4 bouncer|p4]] · [[p5 bouncer|p5]] · [[p6 bouncer|p6]] · [[p7 bouncer|p7]] · [[p8 bouncer|p8]] · [[p9 bouncer|p9]] · [[p11 bouncer|p11]] · [[p15 bouncer|p15]]&lt;br /&gt;
   |group3 = [[Duoplet]] emitters&lt;br /&gt;
   |list3      = [[34P14 shuttle]] · [[Merzenich&#039;s p31]] · [[44P38]] · [[Twin bees shuttle]] · [[p50 traffic jam]] · [[Centinal]]&lt;br /&gt;
   |group4 = Other&lt;br /&gt;
   |list4      = [[p4 reflector]] · [[p4 CC cenark]] · [[p4 CP cenark]] · [[Buckaroo]] · [[PD-pair reflector]]{{br}}[[Beluchenko&#039;s other p37]] · [[Karel&#039;s p177]]&lt;br /&gt;
   }}&lt;br /&gt;
  |group2  = 180-degree&lt;br /&gt;
  |list2       = [[Pentadecathlon]](s) (as in [[6 bits]]) · 3-block-1-tub reflector (as in [[Ocellus]] or [[Gallus]]) · Pre-pond reflector · [[Hotcrystal0 reaction]] · [[p8 glider reflector]]{{br}}5× pulse divider: [[Quinti-Snark]] ([[p5 quinti-Snark]])&lt;br /&gt;
  |group3  = 0-degree&lt;br /&gt;
  |list3       = [[Glider pusher]] · [[Inline inverter]]&lt;br /&gt;
  }}&lt;br /&gt;
 |group2   = G-to-H&lt;br /&gt;
 |list2        = [[p4 syringe]] · [[Two blockers hassling R-pentomino]] (as in [[gunstar]]) · TO BE DONE&lt;br /&gt;
 }}&lt;br /&gt;
|group3   = Concepts&lt;br /&gt;
|list3        = [[Speed]] · [[Color]] · [[Parity]] · [[Phase]] · [[Lane]] ([[Half-diagonal]] · [[Quarter-diagonal]] · [[Full-diagonal]] · [[Gn]])&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;[[Category:Navbox templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=G-to-X_(November_2023)&amp;diff=141352</id>
		<title>G-to-X (November 2023)</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=G-to-X_(November_2023)&amp;diff=141352"/>
		<updated>2023-11-20T22:11:35Z</updated>

		<summary type="html">&lt;p&gt;Snacked: category added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
A stable &amp;quot;glider-to-chaos&amp;quot; mechanism was discovered in November {{year|2023}}, based on a [[partial result]] by Mitchell Riley.&amp;lt;ref name=&amp;quot;post171229&amp;quot; /&amp;gt;&lt;br /&gt;
The base reaction involves a [[Transparent object|transparent]] [[block]], a transparent [[beehive]], an [[eater 1]] and a large catalyst, and produces a certain &amp;quot;pi+block&amp;quot; collision as output (with a leftover beehive that can be suppressed).&lt;br /&gt;
&lt;br /&gt;
Shortly after discovery, several [[stable reflector]]s&amp;lt;ref name=&amp;quot;post171229&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;post171215&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;post171277&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;post171279&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;post171256&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;post171309&amp;quot; /&amp;gt; and [[conduit]]s&amp;lt;ref name=&amp;quot;post171229&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;post171328&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;post171279&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;post171242&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;post171287&amp;quot; /&amp;gt; were completed with this mechanism as the first stage.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;instant disappearance&amp;quot; [[repeat time]] (assuming the output pi+block is removed as soon as it forms) is 90 ticks; several known completions keep the same repeat time.&lt;br /&gt;
&lt;br /&gt;
== Modifications ==&lt;br /&gt;
&lt;br /&gt;
{{EmbedViewer&lt;br /&gt;
|rle          = x = 105, y = 33, rule = B3/S23&lt;br /&gt;
7b2o38b2o38b2o$6bo2bo36bo2bo36bo2bo$7b2o38b2o38b2o3$103b2o$103b2o3$59b&lt;br /&gt;
2o$o39bo18bo20bo$b2o38b2o17b3o18b2o$2o38b2o20bo17b2o6$20b2o38b2o38b2o$&lt;br /&gt;
18bo2bo36bo2bo36bo2bo$18b3o37b3o37b3o2$8b2o8b2obob2o23b2o8b2obob2o23b&lt;br /&gt;
2o8b2obob2o$8b2o9bob2obo23b2o9bob2obo23b2o9bob2obo$2b2o15bo22b2o15bo&lt;br /&gt;
22b2o15bo$3bo7b2o3b2obo23bo7b2o3b2obo23bo7b2o3b2obo$3o7bo2bo3bob2o19b&lt;br /&gt;
3o7bo2bo3bob2o19b3o7bo2bo3bob2o$o8bob2o3bo23bo8bob2o3bo23bo8bob2o3bo$&lt;br /&gt;
9bo5bo33bo5bo33bo5bo$10b6obo32b6obo32b6obo$12bo3bobo33bo3bobo33bo3bobo&lt;br /&gt;
$15bo2bo36bo2bo36bo2bo$16b2o38b2o38b2o!&lt;br /&gt;
|viewerconfig = #C [[ HEIGHT 500 WIDTH 1000 THUMBSIZE 2 ZOOM 8 X 0 Y -10 GPS 20 AUTOSTART T 0 PAUSE 2 T 108 PAUSE 1 T 137 PAUSE 1 LOOP 138 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = Left: the base reaction; middle: beehive suppressed with an eater 1;&amp;lt;ref name=&amp;quot;post171328&amp;quot; /&amp;gt; right: beehive suppressed with a block&amp;lt;ref name=&amp;quot;post171229&amp;quot; /&amp;gt;&lt;br /&gt;
|style        = width:300px;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beehive factory ===&lt;br /&gt;
&lt;br /&gt;
If the transparent beehive is removed, what is left is a glider-to-beehive factory with high clearance and toggle functionality.&amp;lt;ref name=&amp;quot;post171223&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{EmbedViewer&lt;br /&gt;
|rle          = x = 65, y = 30, rule = B3/S23&lt;br /&gt;
47bo$46bobo$46bobo$47bo4$o39bo$b2o38b2o$2o38b2o6$20b2o38b2o$18bo2bo36b&lt;br /&gt;
o2bo$18b3o37b3o2$8b2o8b2obob2o23b2o8b2obob2o$8b2o9bob2obo23b2o9bob2obo&lt;br /&gt;
$2b2o15bo22b2o15bo$3bo7b2o3b2obo23bo7b2o3b2obo$3o7bo2bo3bob2o19b3o7bo&lt;br /&gt;
2bo3bob2o$o8bob2o3bo23bo8bob2o3bo$9bo5bo33bo5bo$10b6obo32b6obo$12bo3bo&lt;br /&gt;
bo33bo3bobo$15bo2bo36bo2bo$16b2o38b2o!&lt;br /&gt;
|viewerconfig = #C [[ HEIGHT 500 WIDTH 800 THUMBSIZE 2 ZOOM 10 GPS 20 AUTOSTART T 0 PAUSE 2 T 122 PAUSE 1 LOOP 123 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = A beehive factory with toggle functionality&amp;lt;ref name=&amp;quot;post171223&amp;quot; /&amp;gt;&lt;br /&gt;
|style        = width:300px;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Completions ==&lt;br /&gt;
&lt;br /&gt;
=== Reflectors ===&lt;br /&gt;
{{gallery top}}&lt;br /&gt;
{{gallery item|{{EmbedViewer&lt;br /&gt;
|rle          = x = 41, y = 58, rule = B3/S23&lt;br /&gt;
11bo17bo$10bobo15bobo$11bo5b2o3b2o5bo$16bo2bobo2bo$17b2o3b2o8b2o$32b2o&lt;br /&gt;
8$37b2o$37bobo$39bo$39b2o8$bo$2bo15b2o$3o14bo2bo$18b2o3$34b2o$34b2o10$&lt;br /&gt;
34bo$32b3o$31bo$29bo2bo$29b4o2$19b2o8b2o$19b2o9bo$13b2o15bob2o$14bo7b&lt;br /&gt;
2o3b2obo2bo$11b3o7bo2bo3bob2o$11bo8bob2o3bo$20bo5bo$21b6obo$23bo3bobo$&lt;br /&gt;
26bo2bo$27b2o!&lt;br /&gt;
|viewerconfig = #C [[ HEIGHT 700 WIDTH 600 THUMBSIZE 2 ZOOM 8 GPS 20 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = 180-degree reflector&amp;lt;ref name=&amp;quot;post171215&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;post171309&amp;quot; /&amp;gt;&lt;br /&gt;
|style        = width:300px;&lt;br /&gt;
}}}}&lt;br /&gt;
{{gallery item|{{EmbedViewer&lt;br /&gt;
|rle          = x = 40, y = 53, rule = B3/S23&lt;br /&gt;
11b2o26bo$11b2o24b3o$36bo$11b4o21b2o$10bo3bo$9bob2o$6bo2bobo$5bobobobo&lt;br /&gt;
$5bobob2o$6bobo$8bo$8b2o8$bo$2bo15b2o$3o14bo2bo$18b2o3$34b2o$34b2o10$&lt;br /&gt;
34bo$32b3o$31bo$29bo2bo$29b4o2$19b2o8b2o$19b2o9bo$13b2o15bob2o$14bo7b&lt;br /&gt;
2o3b2obo2bo$11b3o7bo2bo3bob2o$11bo8bob2o3bo$20bo5bo$21b6obo$23bo3bobo$&lt;br /&gt;
26bo2bo$27b2o!&lt;br /&gt;
|viewerconfig = #C [[ HEIGHT 700 WIDTH 600 THUMBSIZE 2 ZOOM 8 GPS 20 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = 180-degree reflector&amp;lt;ref name=&amp;quot;post171256&amp;quot; /&amp;gt;&lt;br /&gt;
|style        = width:300px;&lt;br /&gt;
}}}}&lt;br /&gt;
{{gallery item|{{EmbedViewer&lt;br /&gt;
|rle          = x = 38, y = 58, rule = B3/S23&lt;br /&gt;
25bo$23b3o$22bo$12b2o8b2o$12b2o18b2o$32bo$34bo$30b5o$30bo4b2o$33b2o2bo&lt;br /&gt;
$34bob2o$34bo$33b2o3$9b2o$8bobo$8bo$7b2o6$bo$2bo15b2o$3o14bo2bo$18b2o&lt;br /&gt;
3$34b2o$34b2o10$34bo$32b3o$31bo$29bo2bo$29b4o2$19b2o8b2o$19b2o9bo$13b&lt;br /&gt;
2o15bob2o$14bo7b2o3b2obo2bo$11b3o7bo2bo3bob2o$11bo8bob2o3bo$18b3o5bo$&lt;br /&gt;
17bo4b5obo$17b2o4bo3bobo$21bo4bo2bo$21b2o4b2o!&lt;br /&gt;
|viewerconfig = #C [[ HEIGHT 700 WIDTH 600 THUMBSIZE 2 ZOOM 8 GPS 20 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = 90-degree reflector&amp;lt;ref name=&amp;quot;post171229&amp;quot; /&amp;gt;&lt;br /&gt;
|style        = width:300px;&lt;br /&gt;
}}}}&lt;br /&gt;
{{gallery item|{{EmbedViewer&lt;br /&gt;
|rle          = x = 37, y = 75, rule = B3/S23&lt;br /&gt;
19b2o$19bobo$21bo2b2o$20b2obobo$23bo$23b2o7$29bo$27b3o$26bo$26b2o6$29b&lt;br /&gt;
2o$29b2o8$33b2o$33bobo$35bo$35b2o3$12b2o$7b2o3b2o$6bobo$6bo$5b2o$bo$2b&lt;br /&gt;
o15b2o$3o14bo2bo$18b2o3$34b2o$34b2o10$34bo$32b3o$31bo$29bo2bo$29b4o2$&lt;br /&gt;
19b2o8b2o$19b2o9bo$13b2o15bob2o$14bo7b2o3b2obo2bo$11b3o7bo2bo3bob2o$&lt;br /&gt;
11bo8bob2o3bo$18b3o5bo$17bo4b5obo$17b2o4bo3bobo$21bo4bo2bo$21b2o4b2o!&lt;br /&gt;
|viewerconfig = #C [[ HEIGHT 700 WIDTH 600 THUMBSIZE 2 ZOOM 8 GPS 20 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = 90-degree reflector&amp;lt;ref name=&amp;quot;post171279&amp;quot; /&amp;gt;&lt;br /&gt;
|style        = width:300px;&lt;br /&gt;
}}}}&lt;br /&gt;
{{gallery item|{{EmbedViewer&lt;br /&gt;
|rle          = x = 44, y = 73, rule = B3/S23&lt;br /&gt;
37bo$35b3o$34bo$34b2o3$bo$b3o$4bo$3b2o2$7b2o$7b2o2$2o$2o4$3b2o$4bo$b3o&lt;br /&gt;
$bo9$37b2obo$37b2ob3o$43bo$37b2ob3o$38bobo$38bobo$39bo2$5bo$6bo15b2o$&lt;br /&gt;
4b3o14bo2bo$22b2o3$38b2o$38b2o10$38bo$36b3o$35bo$33bo2bo$33b4o2$23b2o&lt;br /&gt;
8b2o$23b2o9bo$17b2o15bob2o$18bo7b2o3b2obo2bo$15b3o7bo2bo3bob2o$15bo8bo&lt;br /&gt;
b2o3bo$24bo5bo$25b6obo$27bo3bobo$30bo2bo$31b2o!&lt;br /&gt;
|viewerconfig = #C [[ HEIGHT 700 WIDTH 600 THUMBSIZE 2 ZOOM 8 GPS 20 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = G &amp;amp;rarr; 2G ([[glider duplicator]])&amp;lt;ref name=&amp;quot;post171277&amp;quot; /&amp;gt;&lt;br /&gt;
|style        = width:300px;&lt;br /&gt;
}}}}&lt;br /&gt;
{{gallery bottom}}&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
{{gallery top}}&lt;br /&gt;
{{gallery item|{{EmbedViewer&lt;br /&gt;
|rle          = x = 38, y = 67, rule = B3/S23&lt;br /&gt;
13b2o$13bo$11b3o7$25bo$23b3o$22bo$13b2o7b2o$13b2o3$4b2o$4b2o3$36bo$35b&lt;br /&gt;
obo$5b2o29bo$6bo$3b3o3b2o$3bo4bobo$8bo$7b2o6$bo$2bo15b2o$3o14bo2bo$18b&lt;br /&gt;
2o3$34b2o$34b2o10$34bo$32b3o$31bo$29bo2bo$29b4o2$19b2o8b2o$19b2o9bo$&lt;br /&gt;
13b2o15bob2o$14bo7b2o3b2obo2bo$11b3o7bo2bo3bob2o$11bo8bob2o3bo$18b3o5b&lt;br /&gt;
o$17bo4b5obo$17b2o4bo3bobo$21bo4bo2bo$21b2o4b2o!&lt;br /&gt;
|viewerconfig = #C [[ HEIGHT 700 WIDTH 600 THUMBSIZE 2 ZOOM 8 GPS 20 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = G &amp;amp;rarr; H&amp;lt;ref name=&amp;quot;post171229&amp;quot; /&amp;gt;&lt;br /&gt;
|style        = width:300px;&lt;br /&gt;
}}}}&lt;br /&gt;
{{gallery item|{{EmbedViewer&lt;br /&gt;
|rle          = x = 37, y = 72, rule = B3/S23&lt;br /&gt;
18bo$17bobo$17bob2o3$24b2o$24b2o$10b2o$10b2o$29bo$27b3o$26bo$26b2o6$&lt;br /&gt;
29b2o$29b2o8$33b2o$33bobo$35bo$35b2o3$12b2o$7b2o3b2o$6bobo$6bo$5b2o$bo&lt;br /&gt;
$2bo15b2o$3o14bo2bo$18b2o3$34b2o$34b2o10$34bo$32b3o$31bo$29bo2bo$29b4o&lt;br /&gt;
2$19b2o8b2o$19b2o9bo$13b2o15bob2o$14bo7b2o3b2obo2bo$11b3o7bo2bo3bob2o$&lt;br /&gt;
11bo8bob2o3bo$18b3o5bo$17bo4b5obo$17b2o4bo3bobo$21bo4bo2bo$21b2o4b2o!&lt;br /&gt;
|viewerconfig = #C [[ HEIGHT 700 WIDTH 600 THUMBSIZE 2 ZOOM 8 GPS 20 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = G &amp;amp;rarr; B&amp;lt;ref name=&amp;quot;post171279&amp;quot; /&amp;gt;&lt;br /&gt;
|style        = width:300px;&lt;br /&gt;
}}}}&lt;br /&gt;
{{gallery item|{{EmbedViewer&lt;br /&gt;
|rle          = x = 45, y = 81, rule = B3/S23&lt;br /&gt;
32b2o$33bo$33b3o16$34b2o$34b2o2$41bob2o$41b2obo5$16b2o5b2o$16b2o5b2o$&lt;br /&gt;
39bo$38bobo$39b2o5$6b2o$5bobo$5bo$4b2o4$13b2o$14bo$11b3o$11bo$bo$2bo&lt;br /&gt;
15b2o$3o14bo2bo$18b2o7$30b2o$30bo$31b3o$33bo6$31b2o$29bo2bo$29b3o2$19b&lt;br /&gt;
2o8b2obob2o$19b2o9bob2obo$13b2o15bo$14bo7b2o3b2obo$11b3o7bo2bo3bob2o$&lt;br /&gt;
11bo8bob2o3bo$20bo5bo$21b6obo$23bo3bobo$26bo2bo$27b2o!&lt;br /&gt;
|viewerconfig = #C [[ HEIGHT 700 WIDTH 600 THUMBSIZE 2 ZOOM 8 GPS 20 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = G &amp;amp;rarr; R+G&amp;lt;ref name=&amp;quot;post171328&amp;quot; /&amp;gt; (followed by [[RF28B]] [[BFx59H]])&lt;br /&gt;
|style        = width:300px;&lt;br /&gt;
}}}}&lt;br /&gt;
{{gallery item|{{EmbedViewer&lt;br /&gt;
|rle          = x = 37, y = 60, rule = B3/S23&lt;br /&gt;
12bo15bo$12b3o11b3o$15bo9bo$6bo7b2o9b2o$5bobo10bo3bo$5bobo9bobobobo$3b&lt;br /&gt;
3ob2o8bobobobo$2bo15bo3bo$3b3ob2o$5bob2o5$5b2o$4bo$5b2o26b2o$6bo26bobo&lt;br /&gt;
$35bo$35b2o7$bo$2bo15b2o$3o14bo2bo$18b2o3$34b2o$34b2o10$34bo$32b3o$31b&lt;br /&gt;
o$29bo2bo$29b4o2$19b2o8b2o$19b2o9bo$13b2o15bob2o$14bo7b2o3b2obo2bo$11b&lt;br /&gt;
3o7bo2bo3bob2o$11bo8bob2o3bo$20bo5bo$21b6obo$23bo3bobo$26bo2bo$27b2o!&lt;br /&gt;
|viewerconfig = #C [[ HEIGHT 700 WIDTH 600 THUMBSIZE 2 ZOOM 8 GPS 20 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = G &amp;amp;rarr; B&amp;lt;ref name=&amp;quot;post171242&amp;quot; /&amp;gt;&lt;br /&gt;
|style        = width:300px;&lt;br /&gt;
}}}}&lt;br /&gt;
{{gallery item|{{EmbedViewer&lt;br /&gt;
|rle          = x = 36, y = 43, rule = B3/S23&lt;br /&gt;
11b2o$10bobo20bo$10bo21bobo$9b2o20b3o$31b3o5$bo$2bo15b2o$3o14bo2bo$18b2o3$34b2o$34b2o10$34bo$32b3o$31bo$29bo2bo$29b4o2$19b2o8b2o$19b2o9bo$13b&lt;br /&gt;
2o15bob2o$14bo7b2o3b2obo2bo$11b3o7bo2bo3bob2o$11bo8bob2o3bo$20bo5bo$21b6obo$23bo3bobo$26bo2bo$27b2o!&lt;br /&gt;
|viewerconfig = #C [[ HEIGHT 700 WIDTH 600 THUMBSIZE 2 ZOOM 8 GPS 20 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = G &amp;amp;rarr; [[U-turner]]&amp;lt;ref name=&amp;quot;post171287&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;post171382&amp;quot; /&amp;gt;&lt;br /&gt;
|style        = width:300px;&lt;br /&gt;
}}}}&lt;br /&gt;
{{gallery bottom}}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Snark]]&lt;br /&gt;
* [[Bronco]]&lt;br /&gt;
* [[Syringe]]&lt;br /&gt;
* [[Speed tunnel]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post171215&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|p      = 171215&lt;br /&gt;
|title  = Re: The Hunting of the Elementary Conduits&lt;br /&gt;
|author = iNoMed&lt;br /&gt;
|date   = November 15, 2023&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post171223&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|p      = 171223&lt;br /&gt;
|title  = Re: Still-life &#039;factories&#039;&lt;br /&gt;
|author = Jormungant&lt;br /&gt;
|date   = November 15, 2023&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post171229&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|p      = 171229&lt;br /&gt;
|title  = Re: The Hunting of the Elementary Conduits&lt;br /&gt;
|author = AlbertArmStain&lt;br /&gt;
|date   = November 15, 2023&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post171242&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|p      = 171242&lt;br /&gt;
|title  = Re: Thread for your speculative elementary conduits&lt;br /&gt;
|author = squareroot12621&lt;br /&gt;
|date   = November 15, 2023&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post171256&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|p      = 171256&lt;br /&gt;
|title  = Re: Thread for your speculative elementary conduits&lt;br /&gt;
|author = C28&lt;br /&gt;
|date   = November 16, 2023&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post171277&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|p      = 171277&lt;br /&gt;
|title  = Re: The Hunting of the Elementary Conduits&lt;br /&gt;
|author = iNoMed&lt;br /&gt;
|date   = November 16, 2023&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post171279&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|p      = 171279&lt;br /&gt;
|title  = Re: The Hunting of the Elementary Conduits&lt;br /&gt;
|author = AlbertArmStain&lt;br /&gt;
|date   = November 16, 2023&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post171287&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|p      = 171287&lt;br /&gt;
|title  = Re: Thread for your speculative elementary conduits&lt;br /&gt;
|author = EvinZL&lt;br /&gt;
|date   = November 16, 2023&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post171309&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|p      = 171309&lt;br /&gt;
|title  = Re: Thread for your speculative elementary conduits&lt;br /&gt;
|author = Period1GliderGun&lt;br /&gt;
|date   = November 16, 2023&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post171328&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|p      = 171328&lt;br /&gt;
|title  = Re: The Hunting of the Elementary Conduits&lt;br /&gt;
|author = AlbertArmStain&lt;br /&gt;
|date   = November 16, 2023&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post171382&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|p      = 171382&lt;br /&gt;
|title  = Re: Still-life &#039;factories&#039;&lt;br /&gt;
|author = C28&lt;br /&gt;
|date   = November 17, 2023&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Stable reflectors]]&lt;br /&gt;
[[Category:Stable conduits]]&lt;br /&gt;
[[Category:Reactions]]&lt;br /&gt;
[[Category:Partial results]]&lt;br /&gt;
[[Category:Glider conduits]]&lt;br /&gt;
[[Category:Patterns found in 2023]]&lt;br /&gt;
[[Category:Patterns found by Mitchell Riley]]&lt;br /&gt;
&lt;br /&gt;
{{GliderNavbox}}&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=O(sqrt(log(t)))&amp;diff=140782</id>
		<title>O(sqrt(log(t)))</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=O(sqrt(log(t)))&amp;diff=140782"/>
		<updated>2023-11-12T17:46:18Z</updated>

		<summary type="html">&lt;p&gt;Snacked: Category added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pattern&lt;br /&gt;
|name         = O(sqrt(log(t)))&lt;br /&gt;
|pname        = osqrt&lt;br /&gt;
|c            = &lt;br /&gt;
|bx           = &lt;br /&gt;
|by           = &lt;br /&gt;
|discoverer   = Adam P. Goucher&lt;br /&gt;
|discoveryear = 2010&lt;br /&gt;
|nofile       = true&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;O(sqrt(log(&#039;&#039;t&#039;&#039;)))&#039;&#039;&#039; is a pattern constructed by [[Adam P. Goucher]] in {{year|2010}}&amp;lt;ref name=&amp;quot;ref1&amp;quot;&amp;gt;{{LinkGoLNews|2011/01/|title=Game of Life News 1/30/11}}&amp;lt;/ref&amp;gt; which uses an unbounded triangular region as [[memory]] for a [[binary counter]]. [[Empty space]] is read as a zero, and a [[boat]] as a one, as shown below:&lt;br /&gt;
&lt;br /&gt;
{{EmbedViewer&lt;br /&gt;
|pname        = memorycell&lt;br /&gt;
|viewerconfig = #C [[ THEME 6 GRID THUMBLAUNCH THUMBSIZE 2 HEIGHT 400 WIDTH 640 ZOOM 12 GPS 16 AUTOSTART T 0 PAUSE 5 T 100 PAUSE 1 LOOP 110 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|style        = width:300px;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The pattern&#039;s diametric growth rate is Θ(sqrt(log(&#039;&#039;t&#039;&#039;))), which is the slowest possible for any [[Life]] pattern,&amp;lt;ref&amp;gt;[[Conway&#039;s Game of Life: Mathematics and Construction]], 9.7.2&amp;lt;/ref&amp;gt; or indeed any 2D Euclidean cellular automaton. Since the population returns infinitely often to its initial minimum value (during carry operations from 11111...1 to 100000...0, it can be considered to be an unusual form of [[sawtooth]].&lt;br /&gt;
&lt;br /&gt;
==Pattern file==&lt;br /&gt;
To get the very large pattern file for this pattern, open [[Golly]] and then click Help &amp;gt; Online Archives &amp;gt; Very Large Patterns.&lt;br /&gt;
&lt;br /&gt;
==Also see==&lt;br /&gt;
* [[Memory cell]]&lt;br /&gt;
* [[APGsembly]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
* {{LinkLexicon|lex_o.htm#osqrtlogt}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Patterns]]&lt;br /&gt;
[[Category:Infinite growth]]&lt;br /&gt;
[[Category:Patterns with between 100,000 and 999,999 cells]]&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=User:Snacked/DiPiWiki/Di-Pi&amp;diff=136086</id>
		<title>User:Snacked/DiPiWiki/Di-Pi</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=User:Snacked/DiPiWiki/Di-Pi&amp;diff=136086"/>
		<updated>2023-08-28T01:32:42Z</updated>

		<summary type="html">&lt;p&gt;Snacked: Created page with &amp;quot;{{Rule |name            = Di-Pi |char            = Somewhat explosive |b               = 3-e5n |s               = 2-cn3-y4i |ruleinteger     = 4 |reversal        = B0123e45-n678/S012cn3y4-i5678 }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Rule&lt;br /&gt;
|name            = Di-Pi&lt;br /&gt;
|char            = Somewhat explosive&lt;br /&gt;
|b               = 3-e5n&lt;br /&gt;
|s               = 2-cn3-y4i&lt;br /&gt;
|ruleinteger     = 4&lt;br /&gt;
|reversal        = B0123e45-n678/S012cn3y4-i5678&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=User:Snacked/DiPiWiki&amp;diff=136085</id>
		<title>User:Snacked/DiPiWiki</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=User:Snacked/DiPiWiki&amp;diff=136085"/>
		<updated>2023-08-28T01:24:04Z</updated>

		<summary type="html">&lt;p&gt;Snacked: Created page with &amp;quot;welcome to low effort (for now) wiki woohoo&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;welcome to low effort (for now) wiki woohoo&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=Period-16_honey_farm_hasslers&amp;diff=128526</id>
		<title>Period-16 honey farm hasslers</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=Period-16_honey_farm_hasslers&amp;diff=128526"/>
		<updated>2023-04-05T23:37:04Z</updated>

		<summary type="html">&lt;p&gt;Snacked: 588p16? lol&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{OscListP/HF|p=16}}&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;margin:auto;width:300px;&amp;quot;&lt;br /&gt;
|{{EmbedViewer&lt;br /&gt;
|rle          = x = 20, y = 22, rule = B3/S23&lt;br /&gt;
4bo7bo$3bobo4b3o$4bo4bo$9b2o2$6b3o$2o3bo3bo$2o2bo5bo$5bo3bo$6b3o3$11b&lt;br /&gt;
3o$10bo3bo$9bo5bo2b2o$10bo3bo3b2o$11b3o2$9b2o$10bo4bo$7b3o4bobo$7bo7bo!&lt;br /&gt;
|viewerconfig = #C [[ THUMBLAUNCH THUMBSIZE 2 THEME Book ZOOM 10 HEIGHT 500 WIDTH 500 GPS 8 AUTOSTART STOP 16 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = 44P16,&amp;lt;ref name=&amp;quot;oldid114513&amp;quot; /&amp;gt; found by [[Dongook Lee]] on January 7, {{year|2016}}&amp;lt;ref name=&amp;quot;post26519&amp;quot; /&amp;gt;&lt;br /&gt;
|apgcode      = xp16_g8gx33z01gg02dd4y5g0s4z4701y54mm8011gzyaoox121&lt;br /&gt;
}}&lt;br /&gt;
|{{EmbedViewer&lt;br /&gt;
|rle          = x = 28, y = 32, rule = B3/S23&lt;br /&gt;
4b2o7b2o$4bo2b2ob2o2bo$5b2obobob2o$6bo5bo$6bob3obo$7bo3bo2$7bo3bo$7bo&lt;br /&gt;
3bo2$8b3o$23b2o$23b3o$9bo13b2obo$8b3o7bo6bobo$b2o4bo3bo5b3o4bo2bo$o2bo&lt;br /&gt;
4b3o5bo3bo4b2o$obo6bo7b3o$bob2o13bo$2b3o$3b2o$17b3o2$16bo3bo$16bo3bo2$&lt;br /&gt;
16bo3bo$15bob3obo$15bo5bo$14b2obobob2o$13bo2b2ob2o2bo$13b2o7b2o!&lt;br /&gt;
|viewerconfig = #C [[ THUMBLAUNCH THUMBSIZE 2 THEME Book ZOOM 10 HEIGHT 500 WIDTH 500 GPS 8 AUTOSTART STOP 16 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = 112P16,&amp;lt;ref name=&amp;quot;oldid114513&amp;quot; /&amp;gt; stabilized by [[mold]]s and [[T-nosed p4]]s, found by [[Jason Summers]] on August 2, {{year|2004}}&amp;lt;ref name=&amp;quot;jslife&amp;quot; /&amp;gt;&lt;br /&gt;
|apgcode      = xp16_ggy969lqoz1cba24o0goy2g81pzojd5421w1y166421y5g8ozy8s2hb3y1s80s21llmzy8ss8gy612269czy92543&lt;br /&gt;
}}&lt;br /&gt;
|-&lt;br /&gt;
|{{EmbedViewer&lt;br /&gt;
|rle          = x = 25, y = 20, rule = B3/S23&lt;br /&gt;
10b2o2b3o2b2o$10bo2b5o2bo$11b9o$8b3o9b3o$8bo2bo7bo2bo$9b2o9b2o2$15bo$&lt;br /&gt;
14bobo$13bo3bo$13bo3bo$b2ob2obo5bo3bo$2o2b2ob2o5bobo$8bo6bo$2o16b2obo$&lt;br /&gt;
2o5b2o10bob3o$7b2o8bobo4bo$o15bob2o3b2o$2ob2o2b2o7bo$bob2ob2o7b2o!&lt;br /&gt;
|viewerconfig = #C [[ THUMBLAUNCH THUMBSIZE 2 THEME Book ZOOM 10 HEIGHT 500 WIDTH 500 GPS 8 AUTOSTART STOP 16 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = 92P16,&amp;lt;ref name=&amp;quot;oldid114513&amp;quot; /&amp;gt; found by [[David Raucci]] on March 10, {{year|2022}}&amp;lt;ref name=&amp;quot;post142634&amp;quot; /&amp;gt; and reduced by James Pascua&amp;lt;ref name=&amp;quot;post142665&amp;quot; /&amp;gt;&lt;br /&gt;
|apgcode      = xp16_ckgg0s4871y2ae12032b4zx1011gcc4oy02d4c04875zxggx3j3xggzw32ql4988894lq23&lt;br /&gt;
}}&lt;br /&gt;
|{{EmbedViewer&lt;br /&gt;
|rle          = x = 16, y = 21, rule = B3/S23&lt;br /&gt;
b2o$b2o2$bo7b2o$obo5bo2bo$o2bo4bobobo$bo2bo4bob3o$11b3o$bo2bo$b2o2$7b&lt;br /&gt;
3o$6bo3bo$b2o2bo5bo2b2o$b2o3bo3bo3b2o$7b3o2$10b2o$5bo4bo$4bobo4b3o$5bo7bo!&lt;br /&gt;
|viewerconfig = #C [[ THUMBLAUNCH THUMBSIZE 2 THEME Book ZOOM 10 HEIGHT 500 WIDTH 500 GPS 8 AUTOSTART STOP 16 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = 56P16,&amp;lt;ref name=&amp;quot;oldid114513&amp;quot; /&amp;gt; a monomer&lt;br /&gt;
|apgcode      = xp16_y0252xca23z066x6dhe4x66z422sy1g8ssz3jg1y03452z011&lt;br /&gt;
}}&lt;br /&gt;
|-&lt;br /&gt;
|{{EmbedViewer&lt;br /&gt;
|rle          = x = 39, y = 29, rule = B3/S23&lt;br /&gt;
8bo3bo$7bobobobo$8b2ob2o3$4b5o3b5o13bo3bo$4bob4ob4obo12bobobobo$4b2obo&lt;br /&gt;
bobobob2o13b2ob2o$5bobobobobobo$6b3o3b3o12bo9bo$7bo5bo12bo11bo$26bo3b&lt;br /&gt;
2ob2o3bo$18b3o6b3obobob3o$17bo3bo6b2obobob2o$3b2o3b2o6bo5bo6b2o3b2o$2b&lt;br /&gt;
2obobob2o6bo3bo$b3obobob3o6b3o$o3b2ob2o3bo$o11bo12bo5bo$bo9bo12b3o3b3o&lt;br /&gt;
$23bobobobobobo$4b2ob2o13b2obobobobob2o$3bobobobo12bob4ob4obo$4bo3bo&lt;br /&gt;
13b5o3b5o3$26b2ob2o$25bobobobo$26bo3bo!&lt;br /&gt;
|viewerconfig = #C [[ THUMBLAUNCH THUMBSIZE 2 THEME Book ZOOM 10 HEIGHT 500 WIDTH 500 GPS 8 AUTOSTART STOP 16 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = 158P16,&amp;lt;ref name=&amp;quot;oldid114513&amp;quot; /&amp;gt; found by [[Carson Cheng]] on August 28, {{year|2022}}&amp;lt;ref name=&amp;quot;post150280&amp;quot; /&amp;gt;&lt;br /&gt;
|apgcode      = xp16_y32560652zy03diiie0eiiid3y6g025606520gzy0gxgy4ok4ooy03498ie0ei8943zci914707419icy011221wgggxgggzx4a606a4y8cb444707444bczyl4a606a4&lt;br /&gt;
}}&lt;br /&gt;
|{{EmbedViewer&lt;br /&gt;
|rle          = x = 35, y = 25, rule = B3/S23&lt;br /&gt;
5bo3bo$4bobobobo$5b2ob2o2$2b3o5b3o6bo$bo4bobo4bo5bobo$o5bobo5bo3bobo$b&lt;br /&gt;
o4bobo4bo6bo$b2o3bobo3b2o$17bo6bo$3b3o3b3o4bobo4bobo$15bo3bo4bo$15bo3b&lt;br /&gt;
o$10bo4bo3bo$9bobo4bobo4b3o3b3o$10bo6bo$21b2o3bobo3b2o$14bo6bo4bobo4bo&lt;br /&gt;
$14bobo3bo5bobo5bo$13bobo5bo4bobo4bo$15bo6b3o5b3o2$25b2ob2o$24bobobobo&lt;br /&gt;
$25bo3bo!&lt;br /&gt;
|viewerconfig = #C [[ THUMBLAUNCH THUMBSIZE 2 THEME Book ZOOM 10 HEIGHT 500 WIDTH 500 GPS 8 AUTOSTART STOP 16 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = 98P16,&amp;lt;ref name=&amp;quot;oldid114513&amp;quot; /&amp;gt; found by James Pascua on January 30, {{year|2022}}&amp;lt;ref name=&amp;quot;post140952&amp;quot; /&amp;gt;&lt;br /&gt;
|apgcode      = xp16_x2560652y4gz3diiie0eiiid3y02161wgzy4g8gx69ricx121zy51wgcg8y0om999e0e999mozya1y48kc0ck8&lt;br /&gt;
}}&lt;br /&gt;
|-&lt;br /&gt;
|{{EmbedViewer&lt;br /&gt;
|rle          = x = 55, y = 30, rule = B3/S23&lt;br /&gt;
3b2o3b2o$2bo2bo2b2o$2bo10b6o$2bo2bo6bo2bo3bo$2b2ob2o6bo5bo15bo$2bo2bo&lt;br /&gt;
3b2o3b3obo14b3o$2bobo4b2o4bo16bo$3bo28b2o$18b2o$5b2o6b2o3b2o9b3o$2o3b&lt;br /&gt;
2o6b2o13bo3bo5b2o3b2o$2o25bo5bo3bo2bo2b2o$16bo11bo3bo4bo10b6o$4bo4b2o&lt;br /&gt;
4bobo11b3o5bo2bo6bo2bo3bo$bob3o3b2o3bo2bo19b2ob2o6bo5bo$o5bo6b2ob2o19b&lt;br /&gt;
o2bo3b2o3b3obo$o3bo2bo6bo2bo5b3o11bobo4b2o4bo$b6o10bo4bo3bo11bo$10b2o&lt;br /&gt;
2bo2bo3bo5bo25b2o$10b2o3b2o5bo3bo13b2o6b2o3b2o$23b3o9b2o3b2o6b2o$35b2o&lt;br /&gt;
$21b2o28bo$22bo16bo4b2o4bobo$19b3o14bob3o3b2o3bo2bo$19bo15bo5bo6b2ob2o&lt;br /&gt;
$35bo3bo2bo6bo2bo$36b6o10bo$45b2o2bo2bo$45b2o3b2o!&lt;br /&gt;
|viewerconfig = #C [[ THUMBLAUNCH THUMBSIZE 2 THEME Book ZOOM 10 HEIGHT 500 WIDTH 500 GPS 8 AUTOSTART STOP 16 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = 174P16,&amp;lt;ref name=&amp;quot;oldid114513&amp;quot; /&amp;gt; found by David Raucci on April 3, {{year|2022}}&amp;lt;ref name=&amp;quot;post143748&amp;quot; /&amp;gt;&lt;br /&gt;
|apgcode      = xp16_oowg8cx33xj3zooxjx31whh032zw8o0hhwgoxpx33zxopxoox621wj3y0ggzydgpgw643zy5o01agw1ag03zy1o4cw1j1zy011y0opwg8cx33xj3zy6ooxjx31whh032zy88o0hhwgoxpx33zy9opxoox621w33&lt;br /&gt;
}}&lt;br /&gt;
|{{EmbedViewer&lt;br /&gt;
|rle          = x = 52, y = 30, rule = B3/S23&lt;br /&gt;
3b2o3b2o5b2o$bo2bo3b2o3bo4bo6b2o4b2o4b2o$13bo10bo2bobo4bobo2bo$o5bo5bo&lt;br /&gt;
6bo4b3o10b3o$o6bo5bo4b2o7b2o6b2o$6bo2b2o2bo12bo2b6o2bo$b2ob2o3b2o3bobo&lt;br /&gt;
9b2o8b2o$3bo11bo$18b2o$5b2o6b2o3b2o$2o3b2o6b2o20b2o3b2o5b2o$2o27bo3bo&lt;br /&gt;
2bo3b2o3bo4bo$4bo11bo10b2obo14bo$3bobo3b2o3b2ob2o8bo2bobo5bo5bo6bo$6bo&lt;br /&gt;
2b2o2bo13b3o2bo6bo5bo4b2o$2o4bo5bo6bo2b3o13bo2b2o2bo$o6bo5bo5bobo2bo8b&lt;br /&gt;
2ob2o3b2o3bobo$6bo14bob2o10bo11bo$bo4bo3b2o3bo2bo3bo27b2o$3b2o5b2o3b2o&lt;br /&gt;
20b2o6b2o3b2o$32b2o3b2o6b2o$32b2o$36bo11bo$14b2o8b2o9bobo3b2o3b2ob2o$&lt;br /&gt;
14bo2b6o2bo12bo2b2o2bo$15b2o6b2o7b2o4bo5bo6bo$12b3o10b3o4bo6bo5bo5bo$&lt;br /&gt;
12bo2bobo4bobo2bo10bo$13b2o4b2o4b2o6bo4bo3b2o3bo2bo$35b2o5b2o3b2o!&lt;br /&gt;
|viewerconfig = #C [[ THUMBLAUNCH THUMBSIZE 2 THEME Book ZOOM 10 HEIGHT 500 WIDTH 500 GPS 8 AUTOSTART STOP 16 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = 244P16,&amp;lt;ref name=&amp;quot;oldid114513&amp;quot; /&amp;gt; found by David Raucci on April 3, {{year|2022}}&amp;lt;ref name=&amp;quot;post143748&amp;quot; /&amp;gt;&lt;br /&gt;
|apgcode      = xp16_y93jx33xc8gwoozy8230hhw13xjxooz0o4s0ggx33xpxogwhh0o8zw10vspx33w126xooxpozwg0v7jx37wode2y4ggz0347011y2oocwgy06is343zxccxccw1h2x33xfvvzw8c244w4cw1d2w33x643siczccx62y246x33zccw4bow32w22431zy633x33&lt;br /&gt;
}}&lt;br /&gt;
|-&lt;br /&gt;
|{{EmbedViewer&lt;br /&gt;
|pname        = p16honeyfarmhassler2&lt;br /&gt;
|viewerconfig = #C [[ THUMBLAUNCH THUMBSIZE 2 THEME Book ZOOM 16 HEIGHT 500 WIDTH 500 GPS 8 AUTOSTART STOP 16 ]]&lt;br /&gt;
|position     = center&lt;br /&gt;
|caption      = 58P16, found by [[Carson Cheng]] on January 19, {{year|2023}} and reduced by [[James Pascua]] on January 26, {{year|2023}} &amp;lt;ref name=&amp;quot;post156480&amp;quot; /&amp;gt;&lt;br /&gt;
|apgcode      = xp16_0gbjy5ggoz01qg1ay232zggy233566wo8gz1cr0rby732zw121&lt;br /&gt;
}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;oldid114513&amp;quot;&amp;gt;RLE extracted from https://conwaylife.com/w/index.php?title=RLE:P16honeyfarmhasslers&amp;amp;oldid=114513&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;jslife&amp;quot;&amp;gt;{{CiteSummersPattern|name=jslife|accessdate=June 7, 2021}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post26519&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Oscillator Discoveries Thread&lt;br /&gt;
|p      = 26519&lt;br /&gt;
|author = Dongook Lee&lt;br /&gt;
|date   = January 7, 2016&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post140952&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Oscillator Discussion Thread&lt;br /&gt;
|p      = 140952&lt;br /&gt;
|author = James Pascua&lt;br /&gt;
|date   = January 30, 2022&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post142634&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Oscillator Discussion Thread&lt;br /&gt;
|p      = 142634&lt;br /&gt;
|author = David Raucci&lt;br /&gt;
|date   = March 10, 2022&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post142665&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Oscillator Discussion Thread&lt;br /&gt;
|p      = 142665&lt;br /&gt;
|author = James Pascua&lt;br /&gt;
|date   = March 11, 2022&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post143748&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Oscillator Discussion Thread&lt;br /&gt;
|p      = 143748&lt;br /&gt;
|author = David Raucci&lt;br /&gt;
|date   = April 3, 2022&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post150280&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Oscillator Discussion Thread&lt;br /&gt;
|p      = 150280&lt;br /&gt;
|author = David Raucci&lt;br /&gt;
|date   = August 28, 2022&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post156480&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Oscillator Discussion Thread&lt;br /&gt;
|p      = 156480&lt;br /&gt;
|author = James Pascua&lt;br /&gt;
|date   = January 26, 2023&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=Octagon_4&amp;diff=126819</id>
		<title>Octagon 4</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=Octagon_4&amp;diff=126819"/>
		<updated>2023-03-14T19:50:35Z</updated>

		<summary type="html">&lt;p&gt;Snacked: link added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Oscillator&lt;br /&gt;
|name             = Octagon 4&lt;br /&gt;
|pname            = octagon4&lt;br /&gt;
|c                = 40&lt;br /&gt;
|bx               = 16&lt;br /&gt;
|by               = 16&lt;br /&gt;
|p                = 4&lt;br /&gt;
|m                = 4&lt;br /&gt;
|h                = 48&lt;br /&gt;
|v                = 0.83&lt;br /&gt;
|sv               = 0.67&lt;br /&gt;
|discoverer       = Robert Wainwright&lt;br /&gt;
|discoveryear     = 1979&lt;br /&gt;
|rulemin          = B3/S23&lt;br /&gt;
|rulemax          = B378/S0238&lt;br /&gt;
|rulespecial      = [[Conway&#039;s Game of Life|Conway Life]]&lt;br /&gt;
|isorulemin       = B3ijn/S2-ae3anqy&lt;br /&gt;
|isorulemax       = B2cin34-aew5-r6-kn78/S0234-qr5-ijn6-ae7e8&lt;br /&gt;
|synthesis        = 18&lt;br /&gt;
|synthesisRLE     = true&lt;br /&gt;
|plaintext        = true&lt;br /&gt;
|rle              = true&lt;br /&gt;
|animated         = true&lt;br /&gt;
|viewerconfig     = #C [[ THUMBSIZE 3 GPS 4 ZOOM 24 HEIGHT 500 WIDTH 600 ]]&lt;br /&gt;
|apgcode          = xp4_y1g8bb8gzcc0u1y21u0cczy0124kk421zy311&lt;br /&gt;
|pentadecathlonid = 40P4.19&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Octagon 4&#039;&#039;&#039; is a {{period|4}} [[oscillator]], discovered in January {{year|1979}} by [[Robert Wainwright]].&amp;lt;ref&amp;gt;{{CiteHickersonOscillators|accessdate=March 14, 2020}}&amp;lt;/ref&amp;gt; It consists of a regular octagon with sides four cells long and of four [[block]]s.&lt;br /&gt;
&lt;br /&gt;
In August {{year|2004}} [[Jason Summers]] and [[Mark Niemiec]] found a {{gliders|34}} [[synthesis]] of this oscillator,&amp;lt;ref&amp;gt;{{CiteSummersPattern|name=jslife}}&amp;lt;/ref&amp;gt; which was improved to {{gliders|18|text=18 gliders}} by [[Jeremy Tan]] on May 17, {{year|2019}}.&amp;lt;ref name=&amp;quot;post76303&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The oscillator first appeared [[semi-natural]]ly in October {{year|2014}} in a [[soup]] found by [[Matthias Merzenich]] using [[apgsearch]].&amp;lt;ref name=&amp;quot;post13599&amp;quot; /&amp;gt; Almost exactly 3 in 100000 (within the margin of error) even-width eightfold (D8_4) symmetric soups will form an octagon 4 in the centre.&lt;br /&gt;
&lt;br /&gt;
Without the blocks, the octagon will become 4 [[Pond|ponds]].&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Octagon 2]]&lt;br /&gt;
* [[List of common oscillators]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post13599&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Soup search results&lt;br /&gt;
|p      = 13599&lt;br /&gt;
|author = Matthias Merzenich&lt;br /&gt;
|date   = October 2, 2014&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post76303&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format = ref&lt;br /&gt;
|title  = Re: Synthesising Oscillators&lt;br /&gt;
|p      = 76303&lt;br /&gt;
|author = Jeremy Tan&lt;br /&gt;
|date   = May 17, 2019&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
* {{LinkLexicon|lex_o.htm#octagoniv}}&lt;br /&gt;
* {{LinkPentadecathlonObject|40P4.19}}&lt;br /&gt;
* {{LinkCatagolue|xp4_y1g8bb8gzcc0u1y21u0cczy0124kk421zy311}}&lt;br /&gt;
&lt;br /&gt;
{{Symmetry|full}}&lt;br /&gt;
{{seminatural}}&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=P4_syringe&amp;diff=121716</id>
		<title>P4 syringe</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=P4_syringe&amp;diff=121716"/>
		<updated>2023-01-03T20:57:21Z</updated>

		<summary type="html">&lt;p&gt;Snacked: grammar moment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Conduit&lt;br /&gt;
|name         = p4 syringe&lt;br /&gt;
|pname        = p4syringe&lt;br /&gt;
|type         = converter&lt;br /&gt;
|conduitfor   = Glider&lt;br /&gt;
|convertsto   = Herschel&lt;br /&gt;
|recovery     = 44&lt;br /&gt;
|c            = 109&lt;br /&gt;
|bx           = 29&lt;br /&gt;
|by           = 35&lt;br /&gt;
|spartan      = no&lt;br /&gt;
|discoverer   = David Raucci&lt;br /&gt;
|discoverer2 = Louis-François Handfield&lt;br /&gt;
|discoveryear = 2021&lt;br /&gt;
|rulemin      = B3/S23&lt;br /&gt;
|rulemax      = B38/S23&lt;br /&gt;
|rulespecial  = [[Conway&#039;s Game of Life|Conway Life]]&lt;br /&gt;
|isorulemin       = B3/S23&lt;br /&gt;
|isorulemax       = B34c7c8/S234c5e6ei&lt;br /&gt;
|plaintext    = true&lt;br /&gt;
|rle          = true&lt;br /&gt;
|viewerconfig = #C [[ THUMBNAIL THUMBSIZE 2 Z 16 WIDTH 600 HEIGHT 600 GPS 12 AUTOSTART PAUSE 2 T 96 PAUSE 2 LOOP 140 ]]&lt;br /&gt;
}}{{DISPLAYTITLE: p4 syringe}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;p4 syringe&#039;&#039;&#039; is a [[periodic]] [[glider-to-Herschel converter]] that was found by [[David Raucci]] and [[Louis-François Handfield]] in November {{year|2021}}.&amp;lt;ref name=&amp;quot;post138076&amp;quot; /&amp;gt; It consists of a [[bait]] [[block]], an [[eater 1]], a [[block on table]] (originally [[mold]]), and a large {{period|4}} [[oscillator]] that is a [[weld]] of a high-[[clearance]] [[heavyweight emulator]] variant and a [[tub-with-tail eater]] (eater 5) variant. The input [[glider]] hitting the block triggers a [[honey farm]] explosion, which is perturbed by stable [[catalyst]]s and &#039;&#039;two&#039;&#039; [[domino]] sparks to give a [[B-heptomino]], releasing a [[Herschel]] and restoring the block. &lt;br /&gt;
&lt;br /&gt;
The transient [[spark]] from honey farm reaction fades away before another glider 42 ticks behind the first one enters, but considering periodicity and removal of output&#039;s [[first natural glider]], the infobox form of this device works for gliders separated by (60+4&#039;&#039;n&#039;&#039;) ticks. For lower periods, a suitable [[sparker]] should be welded in place of the eater 5, like an [[53P13]] for p52.&amp;lt;ref name=&amp;quot;post138098&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post138076&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format     = ref&lt;br /&gt;
|p          = 138076&lt;br /&gt;
|title      = Re: The Hunting of the Periodic Herschel Conduits&lt;br /&gt;
|author     = David Raucci&lt;br /&gt;
|date       = November 25, 2021&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;post138098&amp;quot;&amp;gt;{{LinkForumThread&lt;br /&gt;
|format     = ref&lt;br /&gt;
|p          = 138098&lt;br /&gt;
|title      = Re: The Hunting of the Periodic Herschel Conduits&lt;br /&gt;
|author     = cvojan&lt;br /&gt;
|date       = November 26, 2021&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{GliderNavbox}}&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=Talk:Catagolue&amp;diff=121154</id>
		<title>Talk:Catagolue</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=Talk:Catagolue&amp;diff=121154"/>
		<updated>2022-12-20T23:37:13Z</updated>

		<summary type="html">&lt;p&gt;Snacked: /* picture */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==4x64, 2x128, 1x256, 32x32==&lt;br /&gt;
I did that. -wwei23 2:54PM 6/23/2017 NY time&lt;br /&gt;
&lt;br /&gt;
:Would you share your version of apgsearch that you used for these? [[User:Apple Bottom|Apple Bottom]] ([[User talk:Apple Bottom|talk]]) 21:19, 23 June 2017 (UTC)&lt;br /&gt;
&lt;br /&gt;
::Sure, this is modified because I had it use my key, here it uses &amp;quot;#anon&amp;quot;. These modifications are trivial(I use JS, not PY!). Also, won&#039;t apgsearch eventually run out of soups to search?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# *************************************&lt;br /&gt;
# * Ash Pattern Generator (apgsearch) *&lt;br /&gt;
# *************************************&lt;br /&gt;
# * Version: v1.1  (beta release)     *&lt;br /&gt;
# *************************************&lt;br /&gt;
#&lt;br /&gt;
# -- Processes roughly 100 soups per (second . core . GHz), using caching&lt;br /&gt;
#    and machine-learning to optimise itself during runtime.&lt;br /&gt;
#&lt;br /&gt;
# -- Can perfectly identify oscillators with period &amp;lt; 1000, well-separated&lt;br /&gt;
#    spaceships of low period, and certain infinite-growth patterns (such&lt;br /&gt;
#    guns and puffers, including both naturally-occurring types of switch&lt;br /&gt;
#    engine).&lt;br /&gt;
#&lt;br /&gt;
# -- Separates most pseudo-objects into their constituent parts, including&lt;br /&gt;
#    all pseudo-still-lifes of 18 or fewer live cells (which is the maximum&lt;br /&gt;
#    theoretically possible, given there is a 19-cell pseudo-still-life&lt;br /&gt;
#    with two distinct decompositions).&lt;br /&gt;
#&lt;br /&gt;
# -- Correctly separates non-interacting standard spaceships, irrespective&lt;br /&gt;
#    of their proximity. In particular, a LWSS-on-LWSS is registered as two&lt;br /&gt;
#    LWSSes, whereas an LWSS-on-HWSS is registered as a single spaceship&lt;br /&gt;
#    (since they interact by suppressing sparks).&lt;br /&gt;
#&lt;br /&gt;
# -- At least 99.9999999999% reliable at identifying objects in asymmetrical&lt;br /&gt;
#    soups in B3/S23 (based on the fact that out of over 10^12 objects that&lt;br /&gt;
#    have appeared, there are no errors).&lt;br /&gt;
#&lt;br /&gt;
# -- Scores soups based on the total excitement of the ash objects.&lt;br /&gt;
#&lt;br /&gt;
# -- Support for other outer-totalistic rules, including detection and&lt;br /&gt;
#    classification of various types of infinite growth.&lt;br /&gt;
#&lt;br /&gt;
# -- Support for symmetrical soups.&lt;br /&gt;
#&lt;br /&gt;
# -- Uploads results to the server at http://catagolue.appspot.com (which&lt;br /&gt;
#    currently has collected over 2.7 * 10^12 objects).&lt;br /&gt;
#&lt;br /&gt;
# -- Peer-reviews others&#039; contributions to ensure data integrity for the&lt;br /&gt;
#    asymmetrical B3/S23 census.&lt;br /&gt;
#&lt;br /&gt;
# By Adam P. Goucher, with contributions from Andrew Trevorrow, Tom Rokicki,&lt;br /&gt;
# Nathaniel Johnston, Dave Greene and Richard Schank.&lt;br /&gt;
&lt;br /&gt;
import golly as g&lt;br /&gt;
from glife import rect, pattern&lt;br /&gt;
import time&lt;br /&gt;
import math&lt;br /&gt;
import operator&lt;br /&gt;
import hashlib&lt;br /&gt;
import datetime&lt;br /&gt;
import os&lt;br /&gt;
import urllib2&lt;br /&gt;
import RANDOM&lt;br /&gt;
&lt;br /&gt;
def get_server_address():&lt;br /&gt;
    # Should be &#039;http://catagolue.appspot.com&#039; for the released version,&lt;br /&gt;
    # and &#039;http://localhost:8080&#039; for the development version:    &lt;br /&gt;
    return &#039;http://catagolue.appspot.com&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Engages with Catagolue&#039;s authentication system (&#039;payment over SHA-256&#039;,&lt;br /&gt;
# affectionately abbreviated to &#039;payosha256&#039;):&lt;br /&gt;
#&lt;br /&gt;
# The payosha256_key can be obtained from logging into Catagolue in your&lt;br /&gt;
# web browser and visiting http://catagolue.appspot.com/payosha256&lt;br /&gt;
def authenticate(payosha256_key, operation_name):&lt;br /&gt;
&lt;br /&gt;
    g.show(&amp;quot;Authenticating with Catagolue via the payosha256 protocol...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    payload = &amp;quot;payosha256:get_token:&amp;quot;+payosha256_key+&amp;quot;:&amp;quot;+operation_name&lt;br /&gt;
&lt;br /&gt;
    req = urllib2.Request(get_server_address() + &amp;quot;/payosha256&amp;quot;, payload, {&amp;quot;Content-type&amp;quot;: &amp;quot;text/plain&amp;quot;})&lt;br /&gt;
    f = urllib2.urlopen(req)&lt;br /&gt;
&lt;br /&gt;
    if (f.getcode() != 200):&lt;br /&gt;
        return None&lt;br /&gt;
&lt;br /&gt;
    resp = f.read()&lt;br /&gt;
&lt;br /&gt;
    lines = resp.splitlines()&lt;br /&gt;
&lt;br /&gt;
    for line in lines:&lt;br /&gt;
        parts = line.split(&#039;:&#039;)&lt;br /&gt;
&lt;br /&gt;
        if (len(parts) &amp;lt; 3):&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        if (parts[1] != &#039;good&#039;):&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        target = parts[2]&lt;br /&gt;
        token = parts[3]&lt;br /&gt;
&lt;br /&gt;
        g.show(&amp;quot;Token &amp;quot; + token + &amp;quot; obtained from payosha256. Performing proof of work with target &amp;quot; + target + &amp;quot;...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        for nonce in xrange(100000000):&lt;br /&gt;
&lt;br /&gt;
            prehash = token + &amp;quot;:&amp;quot; + str(nonce)&lt;br /&gt;
            posthash = hashlib.sha256(prehash).hexdigest()&lt;br /&gt;
&lt;br /&gt;
            if (posthash &amp;lt; target):&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
        if (posthash &amp;gt; target):&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        g.show(&amp;quot;String &amp;quot;+prehash+&amp;quot; is sufficiently valuable (&amp;quot;+posthash+&amp;quot; &amp;lt; &amp;quot;+target+&amp;quot;).&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        payload = &amp;quot;payosha256:pay_token:&amp;quot;+prehash+&amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        return payload&lt;br /&gt;
&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
# Sends the results to Catagolue:&lt;br /&gt;
def catagolue_results(results, payosha256_key, operation_name, endpoint=&amp;quot;/apgsearch&amp;quot;, return_point=None):&lt;br /&gt;
&lt;br /&gt;
    try:&lt;br /&gt;
&lt;br /&gt;
        payload = authenticate(&amp;quot;#anon&amp;quot;, operation_name)&lt;br /&gt;
&lt;br /&gt;
        if payload is None:&lt;br /&gt;
            return 1&lt;br /&gt;
&lt;br /&gt;
        payload += results&lt;br /&gt;
&lt;br /&gt;
        req = urllib2.Request(get_server_address() + endpoint, payload, {&amp;quot;Content-type&amp;quot;: &amp;quot;text/plain&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
        f = urllib2.urlopen(req)&lt;br /&gt;
&lt;br /&gt;
        if (f.getcode() != 200):&lt;br /&gt;
            return 2&lt;br /&gt;
&lt;br /&gt;
        resp = f.read()&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            f2 = open(g.getdir(&amp;quot;data&amp;quot;)+&amp;quot;catagolue-response.txt&amp;quot;, &#039;w&#039;)&lt;br /&gt;
            f2.write(resp)&lt;br /&gt;
            f2.close()&lt;br /&gt;
&lt;br /&gt;
            if return_point is not None:&lt;br /&gt;
                return_point[0] = resp&lt;br /&gt;
            &lt;br /&gt;
        except:&lt;br /&gt;
            g.warn(&amp;quot;Unable to save catagolue response file.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        return 0&lt;br /&gt;
&lt;br /&gt;
    except:&lt;br /&gt;
&lt;br /&gt;
        return 1&lt;br /&gt;
&lt;br /&gt;
# Takes approximately 350 microseconds to construct a 16-by-16 soup based&lt;br /&gt;
# on a SHA-256 cryptographic hash in the obvious way.&lt;br /&gt;
def hashsoup(instring, sym):&lt;br /&gt;
&lt;br /&gt;
    s = hashlib.sha256(instring).digest()&lt;br /&gt;
&lt;br /&gt;
    thesoup = []&lt;br /&gt;
&lt;br /&gt;
    if sym in [&#039;D2_x&#039;, &#039;D8_1&#039;, &#039;D8_4&#039;]:&lt;br /&gt;
        d = 1&lt;br /&gt;
    elif sym in [&#039;D4_x1&#039;, &#039;D4_x4&#039;]:&lt;br /&gt;
        d = 2&lt;br /&gt;
    else:&lt;br /&gt;
        d = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
    for j in xrange(32):&lt;br /&gt;
&lt;br /&gt;
        t = ord(s[j])&lt;br /&gt;
&lt;br /&gt;
        for k in xrange(8):&lt;br /&gt;
&lt;br /&gt;
            if (sym == &#039;8x32&#039;):&lt;br /&gt;
                &lt;br /&gt;
                x = k + 8*(j % 4)&lt;br /&gt;
                y = int(j / 4)&lt;br /&gt;
                &lt;br /&gt;
            elif (sym == &#039;4x64&#039;):&lt;br /&gt;
                &lt;br /&gt;
                x = k + 8*(j % 8)&lt;br /&gt;
                y = int(j / 8)&lt;br /&gt;
        &lt;br /&gt;
            elif (sym == &#039;2x128&#039;):&lt;br /&gt;
                &lt;br /&gt;
                x = k + 8*(j % 16)&lt;br /&gt;
                y = int(j / 16)&lt;br /&gt;
                &lt;br /&gt;
            elif (sym == &#039;1x256&#039;):&lt;br /&gt;
                &lt;br /&gt;
                x = k + 8*(j % 32)&lt;br /&gt;
                y = int(j / 32)&lt;br /&gt;
                &lt;br /&gt;
            else:&lt;br /&gt;
                &lt;br /&gt;
                x = k + 8*(j % 2)&lt;br /&gt;
                y = int(j / 2)&lt;br /&gt;
&lt;br /&gt;
            if (t &amp;amp; (1 &amp;lt;&amp;lt; (7 - k))):&lt;br /&gt;
&lt;br /&gt;
                if ((d == 0) | (x &amp;gt;= y)):&lt;br /&gt;
&lt;br /&gt;
                    thesoup.append(x)&lt;br /&gt;
                    thesoup.append(y)&lt;br /&gt;
&lt;br /&gt;
                    if (sym == &#039;32x32&#039;):&lt;br /&gt;
&lt;br /&gt;
                        thesoup.append(x+16)&lt;br /&gt;
                        thesoup.append(y)&lt;br /&gt;
                        thesoup.append(x)&lt;br /&gt;
                        thesoup.append(y+16)&lt;br /&gt;
                        thesoup.append(x+16)&lt;br /&gt;
                        thesoup.append(y+16)&lt;br /&gt;
&lt;br /&gt;
                elif (sym == &#039;D4_x1&#039;):&lt;br /&gt;
&lt;br /&gt;
                    thesoup.append(y)&lt;br /&gt;
                    thesoup.append(-x)&lt;br /&gt;
&lt;br /&gt;
                elif (sym == &#039;D4_x4&#039;):&lt;br /&gt;
&lt;br /&gt;
                    thesoup.append(y)&lt;br /&gt;
                    thesoup.append(-x-1)&lt;br /&gt;
&lt;br /&gt;
                if ((sym == &#039;D4_x1&#039;) &amp;amp; (x == y)):&lt;br /&gt;
&lt;br /&gt;
                    thesoup.append(y)&lt;br /&gt;
                    thesoup.append(-x)&lt;br /&gt;
&lt;br /&gt;
                if ((sym == &#039;D4_x4&#039;) &amp;amp; (x == y)):&lt;br /&gt;
&lt;br /&gt;
                    thesoup.append(y)&lt;br /&gt;
                    thesoup.append(-x-1)&lt;br /&gt;
&lt;br /&gt;
    # Checks for diagonal symmetries:&lt;br /&gt;
    if (d &amp;gt;= 1):&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(thesoup[x+1])&lt;br /&gt;
            thesoup.append(thesoup[x])&lt;br /&gt;
        if d == 2:&lt;br /&gt;
            if (sym == &#039;D4_x1&#039;):&lt;br /&gt;
                for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
                    thesoup.append(-thesoup[x+1])&lt;br /&gt;
                    thesoup.append(-thesoup[x])&lt;br /&gt;
            else:&lt;br /&gt;
                for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
                    thesoup.append(-thesoup[x+1] - 1)&lt;br /&gt;
                    thesoup.append(-thesoup[x] - 1)&lt;br /&gt;
            return thesoup&lt;br /&gt;
&lt;br /&gt;
    # Checks for orthogonal x symmetry:&lt;br /&gt;
    if sym in [&#039;D2_+1&#039;, &#039;D4_+1&#039;, &#039;D4_+2&#039;]:&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(thesoup[x])&lt;br /&gt;
            thesoup.append(-thesoup[x+1])&lt;br /&gt;
    elif sym in [&#039;D2_+2&#039;, &#039;D4_+4&#039;]:&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(thesoup[x])&lt;br /&gt;
            thesoup.append(-thesoup[x+1] - 1)&lt;br /&gt;
&lt;br /&gt;
    # Checks for orthogonal y symmetry:&lt;br /&gt;
    if sym in [&#039;D4_+1&#039;]:&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(-thesoup[x])&lt;br /&gt;
            thesoup.append(thesoup[x+1])&lt;br /&gt;
    elif sym in [&#039;D4_+2&#039;, &#039;D4_+4&#039;]:&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(-thesoup[x] - 1)&lt;br /&gt;
            thesoup.append(thesoup[x+1])&lt;br /&gt;
&lt;br /&gt;
    # Checks for rotate2 symmetry:&lt;br /&gt;
    if sym in [&#039;C2_1&#039;, &#039;C4_1&#039;, &#039;D8_1&#039;]:&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(-thesoup[x])&lt;br /&gt;
            thesoup.append(-thesoup[x+1])&lt;br /&gt;
    elif sym in [&#039;C2_2&#039;]:&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(-thesoup[x])&lt;br /&gt;
            thesoup.append(-thesoup[x+1]-1)&lt;br /&gt;
    elif sym in [&#039;C2_4&#039;, &#039;C4_4&#039;, &#039;D8_4&#039;]:&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(-thesoup[x]-1)&lt;br /&gt;
            thesoup.append(-thesoup[x+1]-1)&lt;br /&gt;
&lt;br /&gt;
    # Checks for rotate4 symmetry:&lt;br /&gt;
    if (sym in [&#039;C4_1&#039;, &#039;D8_1&#039;]):&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(thesoup[x+1])&lt;br /&gt;
            thesoup.append(-thesoup[x])&lt;br /&gt;
    elif (sym in [&#039;C4_4&#039;, &#039;D8_4&#039;]):&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(thesoup[x+1])&lt;br /&gt;
            thesoup.append(-thesoup[x]-1)&lt;br /&gt;
&lt;br /&gt;
    return thesoup&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Obtains a canonical representation of any oscillator/spaceship that (in&lt;br /&gt;
# some phase) fits within a 40-by-40 bounding box. This representation is&lt;br /&gt;
# alphanumeric and lowercase, and so much more compact than RLE. Compare:&lt;br /&gt;
#&lt;br /&gt;
# Common name: pentadecathlon&lt;br /&gt;
# Canonical representation: 4r4z4r4&lt;br /&gt;
# Equivalent RLE: 2bo4bo$2ob4ob2o$2bo4bo!&lt;br /&gt;
#&lt;br /&gt;
# It is a generalisation of a notation created by Allan Weschler in 1992.&lt;br /&gt;
def canonise(duration):&lt;br /&gt;
&lt;br /&gt;
    representation = &amp;quot;#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # We need to compare each phase to find the one with the smallest&lt;br /&gt;
    # description:&lt;br /&gt;
    for t in xrange(duration):&lt;br /&gt;
&lt;br /&gt;
        rect = g.getrect()&lt;br /&gt;
        if (len(rect) == 0):&lt;br /&gt;
            return &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        if ((rect[2] &amp;lt;= 40) &amp;amp; (rect[3] &amp;lt;= 40)):&lt;br /&gt;
            # Fits within a 40-by-40 bounding box, so eligible to be canonised.&lt;br /&gt;
            # Choose the orientation which results in the smallest description:&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[2], rect[3], rect[0], rect[1], 1, 0, 0, 1))&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[2], rect[3], rect[0]+rect[2]-1, rect[1], -1, 0, 0, 1))&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[2], rect[3], rect[0], rect[1]+rect[3]-1, 1, 0, 0, -1))&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[2], rect[3], rect[0]+rect[2]-1, rect[1]+rect[3]-1, -1, 0, 0, -1))&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[3], rect[2], rect[0], rect[1], 0, 1, 1, 0))&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[3], rect[2], rect[0]+rect[2]-1, rect[1], 0, -1, 1, 0))&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[3], rect[2], rect[0], rect[1]+rect[3]-1, 0, 1, -1, 0))&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[3], rect[2], rect[0]+rect[2]-1, rect[1]+rect[3]-1, 0, -1, -1, 0))&lt;br /&gt;
&lt;br /&gt;
        g.run(1)&lt;br /&gt;
&lt;br /&gt;
    return representation&lt;br /&gt;
&lt;br /&gt;
# A subroutine used by canonise:&lt;br /&gt;
def canonise_orientation(length, breadth, ox, oy, a, b, c, d):&lt;br /&gt;
&lt;br /&gt;
    representation = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    chars = &amp;quot;0123456789abcdefghijklmnopqrstuvwxyz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    for v in xrange(int((breadth-1)/5)+1):&lt;br /&gt;
        zeroes = 0&lt;br /&gt;
        if (v != 0):&lt;br /&gt;
            representation += &amp;quot;z&amp;quot;&lt;br /&gt;
        for u in xrange(length):&lt;br /&gt;
            baudot = 0&lt;br /&gt;
            for w in xrange(5):&lt;br /&gt;
                x = ox + a*u + b*(5*v + w)&lt;br /&gt;
                y = oy + c*u + d*(5*v + w)&lt;br /&gt;
                baudot = (baudot &amp;gt;&amp;gt; 1) + 16*g.getcell(x, y)&lt;br /&gt;
            if (baudot == 0):&lt;br /&gt;
                zeroes += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if (zeroes &amp;gt; 0):&lt;br /&gt;
                    if (zeroes == 1):&lt;br /&gt;
                        representation += &amp;quot;0&amp;quot;&lt;br /&gt;
                    elif (zeroes == 2):&lt;br /&gt;
                        representation += &amp;quot;w&amp;quot;&lt;br /&gt;
                    elif (zeroes == 3):&lt;br /&gt;
                        representation += &amp;quot;x&amp;quot;&lt;br /&gt;
                    else:&lt;br /&gt;
                        representation += &amp;quot;y&amp;quot;&lt;br /&gt;
                        representation += chars[zeroes - 4]&lt;br /&gt;
                zeroes = 0&lt;br /&gt;
                representation += chars[baudot]&lt;br /&gt;
    return representation&lt;br /&gt;
&lt;br /&gt;
# Compares strings first by length, then by lexicographical ordering.&lt;br /&gt;
# A hash character is worse than anything else.&lt;br /&gt;
def compare_representations(a, b):&lt;br /&gt;
&lt;br /&gt;
    if (a == &amp;quot;#&amp;quot;):&lt;br /&gt;
        return b&lt;br /&gt;
    elif (b == &amp;quot;#&amp;quot;):&lt;br /&gt;
        return a&lt;br /&gt;
    elif (len(a) &amp;lt; len(b)):&lt;br /&gt;
        return a&lt;br /&gt;
    elif (len(b) &amp;lt; len(a)):&lt;br /&gt;
        return b&lt;br /&gt;
    elif (a &amp;lt; b):&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return b&lt;br /&gt;
&lt;br /&gt;
# Finds the gradient of the least-squares regression line corresponding&lt;br /&gt;
# to a list of ordered pairs:&lt;br /&gt;
def regress(pairlist):&lt;br /&gt;
&lt;br /&gt;
    cumx = 0.0&lt;br /&gt;
    cumy = 0.0&lt;br /&gt;
    cumvar = 0.0&lt;br /&gt;
    cumcov = 0.0&lt;br /&gt;
&lt;br /&gt;
    for x,y in pairlist:&lt;br /&gt;
&lt;br /&gt;
        cumx += x&lt;br /&gt;
        cumy += y&lt;br /&gt;
&lt;br /&gt;
    cumx = cumx / len(pairlist)&lt;br /&gt;
    cumy = cumy / len(pairlist)&lt;br /&gt;
&lt;br /&gt;
    for x,y in pairlist:&lt;br /&gt;
&lt;br /&gt;
        cumvar += (x - cumx)*(x - cumx)&lt;br /&gt;
        cumcov += (x - cumx)*(y - cumy)&lt;br /&gt;
&lt;br /&gt;
    return (cumcov / cumvar)&lt;br /&gt;
&lt;br /&gt;
# Analyses a pattern whose average population follows a power-law:&lt;br /&gt;
def powerlyse(stepsize, numsteps):&lt;br /&gt;
&lt;br /&gt;
    g.setalgo(&amp;quot;HashLife&amp;quot;)&lt;br /&gt;
    g.setbase(2)&lt;br /&gt;
    g.setstep(stepsize)&lt;br /&gt;
&lt;br /&gt;
    poplist = [0]*numsteps&lt;br /&gt;
&lt;br /&gt;
    poplist[0] = int(g.getpop())&lt;br /&gt;
&lt;br /&gt;
    pointlist = []&lt;br /&gt;
&lt;br /&gt;
    for i in xrange(1, numsteps, 1):&lt;br /&gt;
&lt;br /&gt;
        g.step()&lt;br /&gt;
        poplist[i] = int(g.getpop()) + poplist[i-1]&lt;br /&gt;
&lt;br /&gt;
        if (i % 50 == 0):&lt;br /&gt;
&lt;br /&gt;
            g.fit()&lt;br /&gt;
            g.update()&lt;br /&gt;
&lt;br /&gt;
        if (i &amp;gt; numsteps/2):&lt;br /&gt;
&lt;br /&gt;
            pointlist.append((math.log(i),math.log(poplist[i]+1.0)))&lt;br /&gt;
&lt;br /&gt;
    power = regress(pointlist)&lt;br /&gt;
&lt;br /&gt;
    if (power &amp;lt; 1.10):&lt;br /&gt;
        return &amp;quot;unidentified&amp;quot;&lt;br /&gt;
    elif (power &amp;lt; 1.65):&lt;br /&gt;
        return &amp;quot;zz_REPLICATOR&amp;quot;&lt;br /&gt;
    elif (power &amp;lt; 2.05):&lt;br /&gt;
        return &amp;quot;zz_LINEAR&amp;quot;&lt;br /&gt;
    elif (power &amp;lt; 2.8):&lt;br /&gt;
        return &amp;quot;zz_EXPLOSIVE&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        return &amp;quot;zz_QUADRATIC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Gets the period of an interleaving of degree-d polynomials:&lt;br /&gt;
def deepperiod(sequence, maxperiod, degree):&lt;br /&gt;
&lt;br /&gt;
    for p in xrange(1, maxperiod, 1):&lt;br /&gt;
&lt;br /&gt;
        good = True&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(maxperiod):&lt;br /&gt;
&lt;br /&gt;
            diffs = [0] * (degree + 2)&lt;br /&gt;
            for j in xrange(degree + 2):&lt;br /&gt;
&lt;br /&gt;
                diffs[j] = sequence[i + j*p]&lt;br /&gt;
&lt;br /&gt;
            # Produce successive differences:&lt;br /&gt;
            for j in xrange(degree + 1):&lt;br /&gt;
                for k in xrange(degree + 1):&lt;br /&gt;
                    diffs[k] = diffs[k] - diffs[k + 1]&lt;br /&gt;
&lt;br /&gt;
            if (diffs[0] != 0):&lt;br /&gt;
                good = False&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
        if (good):&lt;br /&gt;
            return p&lt;br /&gt;
    return -1&lt;br /&gt;
&lt;br /&gt;
# Analyses a linear-growth pattern, returning a hash:&lt;br /&gt;
def linearlyse(maxperiod):&lt;br /&gt;
&lt;br /&gt;
    poplist = [0]*(3*maxperiod)&lt;br /&gt;
&lt;br /&gt;
    for i in xrange(3*maxperiod):&lt;br /&gt;
&lt;br /&gt;
        g.run(1)&lt;br /&gt;
        poplist[i] = int(g.getpop())&lt;br /&gt;
&lt;br /&gt;
    p = deepperiod(poplist, maxperiod, 1)&lt;br /&gt;
&lt;br /&gt;
    if (p == -1):&lt;br /&gt;
        return &amp;quot;unidentified&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    difflist = [0]*(2*maxperiod)&lt;br /&gt;
&lt;br /&gt;
    for i in xrange(2*maxperiod):&lt;br /&gt;
&lt;br /&gt;
        difflist[i] = poplist[i + p] - poplist[i]&lt;br /&gt;
&lt;br /&gt;
    q = deepperiod(difflist, maxperiod, 0)&lt;br /&gt;
&lt;br /&gt;
    moments = [0, 0, 0]&lt;br /&gt;
&lt;br /&gt;
    for i in xrange(p):&lt;br /&gt;
&lt;br /&gt;
        moments[0] += (poplist[i + q] - poplist[i])&lt;br /&gt;
        moments[1] += (poplist[i + q] - poplist[i]) ** 2&lt;br /&gt;
        moments[2] += (poplist[i + q] - poplist[i]) ** 3&lt;br /&gt;
&lt;br /&gt;
    prehash = str(moments[1]) + &amp;quot;#&amp;quot; + str(moments[2])&lt;br /&gt;
&lt;br /&gt;
    # Linear-growth patterns with growth rate zero are clearly errors!&lt;br /&gt;
    if (moments[0] == 0):&lt;br /&gt;
        return &amp;quot;unidentified&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;yl&amp;quot; + str(p) + &amp;quot;_&amp;quot; + str(q) + &amp;quot;_&amp;quot; + str(moments[0]) + &amp;quot;_&amp;quot; + hashlib.md5(prehash).hexdigest()&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
# This explodes pseudo-still-lifes and pseudo-oscillators into their&lt;br /&gt;
# constituent parts.&lt;br /&gt;
#&lt;br /&gt;
# -- Requires the period (if oscillatory) and graph-theoretic diameter&lt;br /&gt;
#    to not exceed 4096.&lt;br /&gt;
# -- Never mistakenly separates a true object.&lt;br /&gt;
# -- Correctly separates most pseudo-still-lifes, including the famous:&lt;br /&gt;
#    http://www.conwaylife.com/wiki/Quad_pseudo_still_life&lt;br /&gt;
# -- Works perfectly for all still-lifes of up to 17 bits.&lt;br /&gt;
# -- Doesn&#039;t separate &#039;locks&#039;, of which the smallest example has 18&lt;br /&gt;
#    bits and is unique:&lt;br /&gt;
#&lt;br /&gt;
#     ** **&lt;br /&gt;
#     ** **&lt;br /&gt;
#&lt;br /&gt;
#    * *** *&lt;br /&gt;
#    ** * **&lt;br /&gt;
#&lt;br /&gt;
# To use this function (standalone), merely copy it into a script of&lt;br /&gt;
# the following form:&lt;br /&gt;
#&lt;br /&gt;
#   import golly as g&lt;br /&gt;
#&lt;br /&gt;
#   def pseudo_bangbang():&lt;br /&gt;
#&lt;br /&gt;
#   [...]&lt;br /&gt;
#&lt;br /&gt;
#   pseudo_bangbang()&lt;br /&gt;
#&lt;br /&gt;
# and execute it in Golly with a B3/S23 universe containing any still-&lt;br /&gt;
# lifes or oscillators you want to separate. Pure objects correspond to&lt;br /&gt;
# connected components in the final state of the universe.&lt;br /&gt;
#&lt;br /&gt;
# This has dependencies on the rules ContagiousLife, PercolateInfection&lt;br /&gt;
# and EradicateInfection.&lt;br /&gt;
#&lt;br /&gt;
# Not to be confused with the Unix shell instruction for repeating the&lt;br /&gt;
# previous instruction as a superuser (sudo !!), or indeed with any&lt;br /&gt;
# parodies of this song: https://www.youtube.com/watch?v=YswhUHH6Ufc&lt;br /&gt;
#&lt;br /&gt;
# Adam P. Goucher, 2014-08-25&lt;br /&gt;
def pseudo_bangbang(alpharule):&lt;br /&gt;
&lt;br /&gt;
    g.setrule(&amp;quot;APG_ContagiousLife_&amp;quot; + alpharule)&lt;br /&gt;
    g.setbase(2)&lt;br /&gt;
    g.setstep(12)&lt;br /&gt;
    g.step()&lt;br /&gt;
&lt;br /&gt;
    celllist = g.getcells(g.getrect())&lt;br /&gt;
&lt;br /&gt;
    for i in xrange(0, len(celllist)-1, 3):&lt;br /&gt;
        &lt;br /&gt;
        # Only infect cells that haven&#039;t yet been infected:&lt;br /&gt;
        if (g.getcell(celllist[i], celllist[i+1]) &amp;lt;= 2):&lt;br /&gt;
&lt;br /&gt;
            # Seed an initial &#039;infected&#039; (red) cell:&lt;br /&gt;
            g.setcell(celllist[i], celllist[i+1], g.getcell(celllist[i], celllist[i+1]) + 2)&lt;br /&gt;
&lt;br /&gt;
            prevpop = 0&lt;br /&gt;
            currpop = int(g.getpop())&lt;br /&gt;
&lt;br /&gt;
            # Continue infecting until the entire component has been engulfed:&lt;br /&gt;
            while (prevpop != currpop):&lt;br /&gt;
&lt;br /&gt;
                # Percolate the infection to every cell in the island:&lt;br /&gt;
                g.setrule(&amp;quot;APG_PercolateInfection&amp;quot;)&lt;br /&gt;
                g.setbase(2)&lt;br /&gt;
                g.setstep(12)&lt;br /&gt;
                g.step()&lt;br /&gt;
&lt;br /&gt;
                # Transmit the infection across any bridges.&lt;br /&gt;
                g.setrule(&amp;quot;APG_ContagiousLife_&amp;quot; + alpharule)&lt;br /&gt;
                g.setbase(2)&lt;br /&gt;
                g.setstep(12)&lt;br /&gt;
                g.step()&lt;br /&gt;
&lt;br /&gt;
                prevpop = currpop&lt;br /&gt;
                currpop = int(g.getpop())&lt;br /&gt;
                &lt;br /&gt;
            g.fit()&lt;br /&gt;
            g.update()&lt;br /&gt;
&lt;br /&gt;
            # Red becomes green:&lt;br /&gt;
            g.setrule(&amp;quot;APG_EradicateInfection&amp;quot;)&lt;br /&gt;
            g.step()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Counts the number of live cells of each degree:&lt;br /&gt;
def degreecount():&lt;br /&gt;
&lt;br /&gt;
    celllist = g.getcells(g.getrect())&lt;br /&gt;
    counts = [0,0,0,0,0,0,0,0,0]&lt;br /&gt;
&lt;br /&gt;
    for i in xrange(0, len(celllist), 2):&lt;br /&gt;
&lt;br /&gt;
        x = celllist[i]&lt;br /&gt;
        y = celllist[i+1]&lt;br /&gt;
&lt;br /&gt;
        degree = -1&lt;br /&gt;
&lt;br /&gt;
        for ux in xrange(x - 1, x + 2):&lt;br /&gt;
            for uy in xrange(y - 1, y + 2):&lt;br /&gt;
&lt;br /&gt;
                degree += g.getcell(ux, uy)&lt;br /&gt;
&lt;br /&gt;
        counts[degree] += 1&lt;br /&gt;
&lt;br /&gt;
    return counts&lt;br /&gt;
&lt;br /&gt;
# Counts the number of live cells of each degree in generations 1 and 2:&lt;br /&gt;
def degreecount2():&lt;br /&gt;
&lt;br /&gt;
    g.run(1)&lt;br /&gt;
    a = degreecount()&lt;br /&gt;
    g.run(1)&lt;br /&gt;
    b = degreecount()&lt;br /&gt;
&lt;br /&gt;
    return (a + b)&lt;br /&gt;
&lt;br /&gt;
# If the universe consists only of disjoint *WSSes, this will return&lt;br /&gt;
# a triple (l, w, h) giving the quantities of each *WSS. Otherwise,&lt;br /&gt;
# this function will return (-1, -1, -1).&lt;br /&gt;
#&lt;br /&gt;
# This should only be used to separate period-4 moving objects which&lt;br /&gt;
# may contain multiple *WSSes.&lt;br /&gt;
def countxwsses():&lt;br /&gt;
&lt;br /&gt;
    degcount = degreecount2()&lt;br /&gt;
    if (degreecount2() != degcount):&lt;br /&gt;
        # Degree counts are not period-2:&lt;br /&gt;
        return (-1, -1, -1)&lt;br /&gt;
&lt;br /&gt;
    # Degree counts of each standard spaceship:&lt;br /&gt;
    hwssa = [1,4,6,2,0,0,0,0,0,0,0,0,4,4,6,1,2,1]&lt;br /&gt;
    mwssa = [2,2,5,2,0,0,0,0,0,0,0,0,4,4,4,1,2,0]&lt;br /&gt;
    lwssa = [1,2,4,2,0,0,0,0,0,0,0,0,4,4,2,2,0,0]&lt;br /&gt;
    hwssb = [0,0,0,4,4,6,1,2,1,1,4,6,2,0,0,0,0,0]&lt;br /&gt;
    mwssb = [0,0,0,4,4,4,1,2,0,2,2,5,2,0,0,0,0,0]&lt;br /&gt;
    lwssb = [0,0,0,4,4,2,2,0,0,1,2,4,2,0,0,0,0,0]&lt;br /&gt;
&lt;br /&gt;
    # Calculate the number of standard spaceships in each phase:&lt;br /&gt;
    hacount = degcount[17]&lt;br /&gt;
    macount = degcount[16]/2 - hacount&lt;br /&gt;
    lacount = (degcount[15] - hacount - macount)/2&lt;br /&gt;
    hbcount = degcount[8]&lt;br /&gt;
    mbcount = degcount[7]/2 - hbcount&lt;br /&gt;
    lbcount = (degcount[6] - hbcount - mbcount)/2&lt;br /&gt;
&lt;br /&gt;
    # Determine the expected degcount given the calculated quantities:&lt;br /&gt;
    pcounts = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]&lt;br /&gt;
    pcounts = map(lambda x, y: x + y, pcounts, map(lambda x: hacount*x, hwssa))&lt;br /&gt;
    pcounts = map(lambda x, y: x + y, pcounts, map(lambda x: macount*x, mwssa))&lt;br /&gt;
    pcounts = map(lambda x, y: x + y, pcounts, map(lambda x: lacount*x, lwssa))&lt;br /&gt;
    pcounts = map(lambda x, y: x + y, pcounts, map(lambda x: hbcount*x, hwssb))&lt;br /&gt;
    pcounts = map(lambda x, y: x + y, pcounts, map(lambda x: mbcount*x, mwssb))&lt;br /&gt;
    pcounts = map(lambda x, y: x + y, pcounts, map(lambda x: lbcount*x, lwssb))&lt;br /&gt;
&lt;br /&gt;
    # Compare the observed and expected degcounts (to eliminate nonstandard spaceships):&lt;br /&gt;
    if (pcounts != degcount):&lt;br /&gt;
        # Expected and observed values do not match:&lt;br /&gt;
        return (-1, -1, -1)&lt;br /&gt;
&lt;br /&gt;
    # Return the combined numbers of *WSSes:&lt;br /&gt;
    return(lacount + lbcount, macount + mbcount, hacount + hbcount)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Generates the helper rules for apgsearch, given a base outer-totalistic rule.&lt;br /&gt;
class RuleGenerator:&lt;br /&gt;
&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
&lt;br /&gt;
        # Unless otherwise specified, assume standard B3/S23 rule:&lt;br /&gt;
        self.bee = [False, False, False, True, False, False, False, False, False]&lt;br /&gt;
        self.ess = [False, False, True, True, False, False, False, False, False]&lt;br /&gt;
        self.alphanumeric = &amp;quot;B3S23&amp;quot;&lt;br /&gt;
        self.slashed = &amp;quot;B3/S23&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Save all helper rules:&lt;br /&gt;
    def saveAllRules(self):&lt;br /&gt;
&lt;br /&gt;
        self.saveClassifyObjects()&lt;br /&gt;
        self.saveCoalesceObjects()&lt;br /&gt;
        self.saveExpungeObjects()&lt;br /&gt;
        self.saveExpungeGliders()&lt;br /&gt;
        self.saveIdentifyGliders()&lt;br /&gt;
        self.saveHandlePlumes()&lt;br /&gt;
        self.savePercolateInfection()&lt;br /&gt;
        self.saveEradicateInfection()&lt;br /&gt;
        self.saveContagiousLife()&lt;br /&gt;
&lt;br /&gt;
    # Set outer-totalistic rule:&lt;br /&gt;
    def setrule(self, rulestring):&lt;br /&gt;
&lt;br /&gt;
        mode = 0&lt;br /&gt;
        s = [False]*9&lt;br /&gt;
        b = [False]*9&lt;br /&gt;
&lt;br /&gt;
        for c in rulestring:&lt;br /&gt;
&lt;br /&gt;
            if ((c == &#039;s&#039;) | (c == &#039;S&#039;)):&lt;br /&gt;
                mode = 0&lt;br /&gt;
&lt;br /&gt;
            if ((c == &#039;b&#039;) | (c == &#039;B&#039;)):&lt;br /&gt;
                mode = 1&lt;br /&gt;
&lt;br /&gt;
            if (c == &#039;/&#039;):&lt;br /&gt;
                mode = 1 - mode&lt;br /&gt;
&lt;br /&gt;
            if ((ord(c) &amp;gt;= 48) &amp;amp; (ord(c) &amp;lt;= 56)):&lt;br /&gt;
                d = ord(c) - 48&lt;br /&gt;
                if (mode == 0):&lt;br /&gt;
                    s[d] = True&lt;br /&gt;
                else:&lt;br /&gt;
                    b[d] = True&lt;br /&gt;
&lt;br /&gt;
        prefix = &amp;quot;B&amp;quot;&lt;br /&gt;
        suffix = &amp;quot;S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(9):&lt;br /&gt;
            if (b[i]):&lt;br /&gt;
                prefix += str(i)&lt;br /&gt;
            if (s[i]):&lt;br /&gt;
                suffix += str(i)&lt;br /&gt;
&lt;br /&gt;
        self.alphanumeric = prefix + suffix&lt;br /&gt;
        self.slashed = prefix + &amp;quot;/&amp;quot; + suffix&lt;br /&gt;
        self.bee = b&lt;br /&gt;
        self.ess = s&lt;br /&gt;
&lt;br /&gt;
    # Save a rule file:&lt;br /&gt;
    def saverule(self, name, comments, table, colours):&lt;br /&gt;
&lt;br /&gt;
        ruledir = g.getdir(&amp;quot;rules&amp;quot;)&lt;br /&gt;
        filename = ruledir + name + &amp;quot;.rule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        results = &amp;quot;@RULE &amp;quot; + name + &amp;quot;\n\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;*** File autogenerated by saverule. ***\n\n&amp;quot;&lt;br /&gt;
        results += comments&lt;br /&gt;
        results += &amp;quot;\n\n@TABLE\n\n&amp;quot;&lt;br /&gt;
        results += table&lt;br /&gt;
        results += &amp;quot;\n\n@COLORS\n\n&amp;quot;&lt;br /&gt;
        results += colours&lt;br /&gt;
&lt;br /&gt;
        # Only create a rule file if it doesn&#039;t already exist; this avoids&lt;br /&gt;
        # concurrency issues when booting an instance of apgsearch whilst&lt;br /&gt;
        # one is already running.&lt;br /&gt;
        if not os.path.exists(filename):&lt;br /&gt;
            try:&lt;br /&gt;
                f = open(filename, &#039;w&#039;)&lt;br /&gt;
                f.write(results)&lt;br /&gt;
                f.close()&lt;br /&gt;
            except:&lt;br /&gt;
                g.warn(&amp;quot;Unable to create rule table:\n&amp;quot; + filename)&lt;br /&gt;
&lt;br /&gt;
    # Defines a variable:&lt;br /&gt;
    def newvar(self, name, vallist):&lt;br /&gt;
&lt;br /&gt;
        line = &amp;quot;var &amp;quot;+name+&amp;quot;={&amp;quot;&lt;br /&gt;
        for i in xrange(len(vallist)):&lt;br /&gt;
            if (i &amp;gt; 0):&lt;br /&gt;
                line += &#039;,&#039;&lt;br /&gt;
            line += str(vallist[i])&lt;br /&gt;
        line += &amp;quot;}\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        return line&lt;br /&gt;
&lt;br /&gt;
    # Defines a block of equivalent variables:&lt;br /&gt;
    def newvars(self, namelist, vallist):&lt;br /&gt;
&lt;br /&gt;
        block = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        for name in namelist:&lt;br /&gt;
            block += self.newvar(name, vallist)&lt;br /&gt;
&lt;br /&gt;
        block += &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        return block&lt;br /&gt;
&lt;br /&gt;
    def scoline(self, chara, charb, left, right, amount):&lt;br /&gt;
&lt;br /&gt;
        line = str(left) + &amp;quot;,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(8):&lt;br /&gt;
            if (i &amp;lt; amount):&lt;br /&gt;
                line += chara&lt;br /&gt;
            else:&lt;br /&gt;
                line += charb&lt;br /&gt;
            line += chr(97 + i)&lt;br /&gt;
            line += &amp;quot;,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        line += str(right) + &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        return line&lt;br /&gt;
&lt;br /&gt;
    def saveHandlePlumes(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
This post-processes the output of ClassifyObjects to remove any&lt;br /&gt;
unwanted clustering of low-period objects appearing in puffer&lt;br /&gt;
exhaust.&lt;br /&gt;
&lt;br /&gt;
state 0:  vacuum&lt;br /&gt;
&lt;br /&gt;
state 7:  ON, still-life&lt;br /&gt;
state 8:  OFF, still-life&lt;br /&gt;
&lt;br /&gt;
state 9:  ON, p2 oscillator&lt;br /&gt;
state 10: OFF, p2 oscillator&lt;br /&gt;
&lt;br /&gt;
state 11: ON, higher-period object&lt;br /&gt;
state 12: OFF, higher-period object&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
n_states:17&lt;br /&gt;
neighborhood:Moore&lt;br /&gt;
symmetries:permute&lt;br /&gt;
&lt;br /&gt;
var da={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
var db={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
var dc={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
var dd={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
var de={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
var df={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
var dg={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
var dh={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
&lt;br /&gt;
var a={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var b={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var c={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var d={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var e={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var f={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var g={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var h={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8,da,db,dc,dd,de,df,dg,dh,0&lt;br /&gt;
10,da,db,dc,dd,de,df,dg,dh,0&lt;br /&gt;
&lt;br /&gt;
9,a,b,c,d,e,f,g,h,1&lt;br /&gt;
10,a,b,c,d,e,f,g,h,2&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
1  255  255  255&lt;br /&gt;
2  127  127  127&lt;br /&gt;
7    0    0  255&lt;br /&gt;
8    0    0  127&lt;br /&gt;
9  255    0    0&lt;br /&gt;
10 127    0    0&lt;br /&gt;
11   0  255    0&lt;br /&gt;
12   0  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_HandlePlumesCorrected&amp;quot;, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
    def saveExpungeGliders(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
This removes unwanted gliders.&lt;br /&gt;
It is mandatory that one first runs the rules CoalesceObjects,&lt;br /&gt;
IdentifyGliders and ClassifyObjects.&lt;br /&gt;
&lt;br /&gt;
Run this for two generations, and observe the population&lt;br /&gt;
counts after 1 and 2 generations. This will give the&lt;br /&gt;
following data:&lt;br /&gt;
&lt;br /&gt;
number of gliders = (p(1) - p(2))/5&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
n_states:17&lt;br /&gt;
neighborhood:Moore&lt;br /&gt;
symmetries:rotate4reflect&lt;br /&gt;
&lt;br /&gt;
var a={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var b={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var c={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var d={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var e={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var f={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var g={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var h={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
&lt;br /&gt;
13,a,b,c,d,e,f,g,h,14&lt;br /&gt;
14,a,b,c,d,e,f,g,h,0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1  255  255  255&lt;br /&gt;
2  127  127  127&lt;br /&gt;
7    0    0  255&lt;br /&gt;
8    0    0  127&lt;br /&gt;
9  255    0    0&lt;br /&gt;
10 127    0    0&lt;br /&gt;
11   0  255    0&lt;br /&gt;
12   0  127    0&lt;br /&gt;
13 255  255    0&lt;br /&gt;
14 127  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_ExpungeGliders&amp;quot;, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
    def saveIdentifyGliders(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
Run this after CoalesceObjects to find any gliders.&lt;br /&gt;
&lt;br /&gt;
state 0:  vacuum&lt;br /&gt;
state 1:  ON&lt;br /&gt;
state 2:  OFF&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
n_states:17&lt;br /&gt;
neighborhood:Moore&lt;br /&gt;
symmetries:rotate4reflect&lt;br /&gt;
&lt;br /&gt;
var a={0,2}&lt;br /&gt;
var b={0,2}&lt;br /&gt;
var c={0,2}&lt;br /&gt;
var d={0,2}&lt;br /&gt;
var e={0,2}&lt;br /&gt;
var f={0,2}&lt;br /&gt;
var g={0,2}&lt;br /&gt;
var h={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var i={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var j={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var k={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var l={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var m={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var n={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var o={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var p={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var q={3,4}&lt;br /&gt;
var r={9,10}&lt;br /&gt;
var s={11,12}&lt;br /&gt;
&lt;br /&gt;
1,1,a,1,1,b,1,c,d,3&lt;br /&gt;
d,1,1,1,1,a,b,1,c,4&lt;br /&gt;
&lt;br /&gt;
3,i,j,k,l,m,n,o,p,5&lt;br /&gt;
4,i,j,k,l,m,n,o,p,6&lt;br /&gt;
&lt;br /&gt;
1,q,i,j,a,b,c,k,l,7&lt;br /&gt;
d,q,i,j,a,b,c,k,l,8&lt;br /&gt;
1,i,a,b,c,d,e,j,q,7&lt;br /&gt;
f,i,a,b,c,d,e,j,q,8&lt;br /&gt;
&lt;br /&gt;
5,7,8,7,7,8,7,8,8,9&lt;br /&gt;
6,7,7,7,7,8,8,7,8,10&lt;br /&gt;
5,i,j,k,l,m,n,o,p,15&lt;br /&gt;
6,i,j,k,l,m,n,o,p,16&lt;br /&gt;
15,i,j,k,l,m,n,o,p,1&lt;br /&gt;
16,i,j,k,l,m,n,o,p,2&lt;br /&gt;
&lt;br /&gt;
7,i,j,k,l,m,n,o,p,11&lt;br /&gt;
8,i,j,k,l,m,n,o,p,12&lt;br /&gt;
&lt;br /&gt;
9,i,j,k,l,m,n,o,p,13&lt;br /&gt;
10,i,j,k,l,m,n,o,p,14&lt;br /&gt;
11,r,j,k,l,m,n,o,p,13&lt;br /&gt;
11,i,r,k,l,m,n,o,p,13&lt;br /&gt;
12,r,j,k,l,m,n,o,p,14&lt;br /&gt;
12,i,r,k,l,m,n,o,p,14&lt;br /&gt;
&lt;br /&gt;
11,i,j,k,l,m,n,o,p,1&lt;br /&gt;
12,i,j,k,l,m,n,o,p,2&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1  255  255  255&lt;br /&gt;
2  127  127  127&lt;br /&gt;
7    0    0  255&lt;br /&gt;
8    0    0  127&lt;br /&gt;
9  255    0    0&lt;br /&gt;
10 127    0    0&lt;br /&gt;
11   0  255    0&lt;br /&gt;
12   0  127    0&lt;br /&gt;
13 255  255    0&lt;br /&gt;
14 127  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_IdentifyGliders&amp;quot;, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
    def saveEradicateInfection(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
To run after ContagiousLife to disinfect any cells in states 3 or 4.&lt;br /&gt;
&lt;br /&gt;
state 0:  vacuum&lt;br /&gt;
state 1:  ON&lt;br /&gt;
state 2:  OFF&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
n_states:7&lt;br /&gt;
neighborhood:Moore&lt;br /&gt;
symmetries:permute&lt;br /&gt;
&lt;br /&gt;
var a={0,1,2,3,4,5,6}&lt;br /&gt;
var b={0,1,2,3,4,5,6}&lt;br /&gt;
var c={0,1,2,3,4,5,6}&lt;br /&gt;
var d={0,1,2,3,4,5,6}&lt;br /&gt;
var e={0,1,2,3,4,5,6}&lt;br /&gt;
var f={0,1,2,3,4,5,6}&lt;br /&gt;
var g={0,1,2,3,4,5,6}&lt;br /&gt;
var h={0,1,2,3,4,5,6}&lt;br /&gt;
var i={0,1,2,3,4,5,6}&lt;br /&gt;
&lt;br /&gt;
4,a,b,c,d,e,f,g,h,6&lt;br /&gt;
3,a,b,c,d,e,f,g,h,5&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1    0    0  255&lt;br /&gt;
2    0    0  127&lt;br /&gt;
3  255    0    0&lt;br /&gt;
4  127    0    0&lt;br /&gt;
5    0  255    0&lt;br /&gt;
6    0  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_EradicateInfection&amp;quot;, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
    def savePercolateInfection(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
Percolates any infection to all cells of that particular island.&lt;br /&gt;
&lt;br /&gt;
state 0:  vacuum&lt;br /&gt;
state 1:  ON&lt;br /&gt;
state 2:  OFF&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
n_states:7&lt;br /&gt;
neighborhood:Moore&lt;br /&gt;
symmetries:permute&lt;br /&gt;
&lt;br /&gt;
var a={0,1,2,3,4,5,6}&lt;br /&gt;
var b={0,1,2,3,4,5,6}&lt;br /&gt;
var c={0,1,2,3,4,5,6}&lt;br /&gt;
var d={0,1,2,3,4,5,6}&lt;br /&gt;
var e={0,1,2,3,4,5,6}&lt;br /&gt;
var f={0,1,2,3,4,5,6}&lt;br /&gt;
var g={0,1,2,3,4,5,6}&lt;br /&gt;
var h={0,1,2,3,4,5,6}&lt;br /&gt;
var i={0,1,2,3,4,5,6}&lt;br /&gt;
&lt;br /&gt;
var q={3,4}&lt;br /&gt;
var da={2,4,6}&lt;br /&gt;
var la={1,3,5}&lt;br /&gt;
&lt;br /&gt;
da,q,b,c,d,e,f,g,h,4&lt;br /&gt;
la,q,b,c,d,e,f,g,h,3&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1    0    0  255&lt;br /&gt;
2    0    0  127&lt;br /&gt;
3  255    0    0&lt;br /&gt;
4  127    0    0&lt;br /&gt;
5    0  255    0&lt;br /&gt;
6    0  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_PercolateInfection&amp;quot;, comments, table, colours)&lt;br /&gt;
        &lt;br /&gt;
    def saveExpungeObjects(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
This removes unwanted monominos, blocks, blinkers and beehives.&lt;br /&gt;
It is mandatory that one first runs the rule ClassifyObjects.&lt;br /&gt;
&lt;br /&gt;
Run this for four generations, and observe the population&lt;br /&gt;
counts after 0, 1, 2, 3 and 4 generations. This will give the&lt;br /&gt;
following data:&lt;br /&gt;
&lt;br /&gt;
number of monominos = p(1) - p(0)&lt;br /&gt;
number of blocks = (p(2) - p(1))/4&lt;br /&gt;
number of blinkers = (p(3) - p(2))/5&lt;br /&gt;
number of beehives = (p(4) - p(3))/8&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;n_states:17\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;neighborhood:Moore\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;symmetries:rotate4reflect\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        table += self.newvars([&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;e&amp;quot;,&amp;quot;f&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;h&amp;quot;,&amp;quot;i&amp;quot;], range(0, 17, 1))&lt;br /&gt;
&lt;br /&gt;
        table += &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
# Monomino&lt;br /&gt;
7,0,0,0,0,0,0,0,0,0&lt;br /&gt;
&lt;br /&gt;
# Death&lt;br /&gt;
6,a,b,c,d,e,f,g,h,0&lt;br /&gt;
a,6,b,c,d,e,f,g,h,0&lt;br /&gt;
&lt;br /&gt;
# Block&lt;br /&gt;
7,7,7,7,0,0,0,0,0,1&lt;br /&gt;
1,1,1,1,0,0,0,0,0,0&lt;br /&gt;
1,a,b,c,d,e,f,g,h,7&lt;br /&gt;
&lt;br /&gt;
# Blinker&lt;br /&gt;
10,0,0,0,9,9,9,0,0,2&lt;br /&gt;
9,9,10,0,0,0,0,0,10,3&lt;br /&gt;
2,a,b,c,d,e,f,g,h,10&lt;br /&gt;
3,a,b,c,d,e,f,g,h,9&lt;br /&gt;
9,2,0,3,0,2,0,3,0,6&lt;br /&gt;
&lt;br /&gt;
# Beehive&lt;br /&gt;
7,0,7,8,7,0,0,0,0,1&lt;br /&gt;
7,0,0,7,8,8,7,0,0,1&lt;br /&gt;
8,7,7,8,7,7,0,7,0,4&lt;br /&gt;
4,1,1,4,1,1,0,1,0,5&lt;br /&gt;
4,a,b,c,d,e,f,g,h,8&lt;br /&gt;
5,5,b,c,d,e,f,g,h,6&lt;br /&gt;
5,a,b,c,d,e,f,g,h,15&lt;br /&gt;
15,a,b,c,d,e,f,g,h,8&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1  255  255  255&lt;br /&gt;
2  127  127  127&lt;br /&gt;
7    0    0  255&lt;br /&gt;
8    0    0  127&lt;br /&gt;
9  255    0    0&lt;br /&gt;
10 127    0    0&lt;br /&gt;
11   0  255    0&lt;br /&gt;
12   0  127    0&lt;br /&gt;
13 255  255    0&lt;br /&gt;
14 127  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_ExpungeObjects&amp;quot;, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
    def saveCoalesceObjects(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
A variant of HistoricalLife which separates a field of ash into&lt;br /&gt;
distinct objects.&lt;br /&gt;
&lt;br /&gt;
state 0:  vacuum&lt;br /&gt;
state 1:  ON&lt;br /&gt;
state 2:  OFF&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;n_states:3\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;neighborhood:Moore\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;symmetries:permute\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        table += self.newvars([&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;e&amp;quot;,&amp;quot;f&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;h&amp;quot;,&amp;quot;i&amp;quot;], [0, 1, 2])&lt;br /&gt;
        table += self.newvars([&amp;quot;da&amp;quot;,&amp;quot;db&amp;quot;,&amp;quot;dc&amp;quot;,&amp;quot;dd&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;df&amp;quot;,&amp;quot;dg&amp;quot;,&amp;quot;dh&amp;quot;,&amp;quot;di&amp;quot;], [0, 2])&lt;br /&gt;
        table += self.newvars([&amp;quot;la&amp;quot;,&amp;quot;lb&amp;quot;,&amp;quot;lc&amp;quot;,&amp;quot;ld&amp;quot;,&amp;quot;le&amp;quot;,&amp;quot;lf&amp;quot;,&amp;quot;lg&amp;quot;,&amp;quot;lh&amp;quot;,&amp;quot;li&amp;quot;], [1])&lt;br /&gt;
&lt;br /&gt;
        minperc = 10&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(9):&lt;br /&gt;
            if (self.bee[i]):&lt;br /&gt;
                if (minperc == 10):&lt;br /&gt;
                    minperc = i&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,0,1,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,2,1,i)&lt;br /&gt;
            if (self.ess[i]):&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,1,1,i)&lt;br /&gt;
&lt;br /&gt;
        table += &amp;quot;\n# Bridge inductors\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(9):&lt;br /&gt;
            if (i &amp;gt;= minperc):&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,0,2,i)&lt;br /&gt;
&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,1,2,0)&lt;br /&gt;
&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1  255  255  255&lt;br /&gt;
2  127  127  127&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_CoalesceObjects_&amp;quot;+self.alphanumeric, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
    def saveClassifyObjects(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
This passively classifies objects as either still-lifes, p2 oscillators&lt;br /&gt;
or higher-period oscillators. It is mandatory that one first runs the&lt;br /&gt;
rule CoalesceObjects.&lt;br /&gt;
&lt;br /&gt;
state 0:  vacuum&lt;br /&gt;
state 1:  input ON&lt;br /&gt;
state 2:  input OFF&lt;br /&gt;
&lt;br /&gt;
state 3:  ON, will die&lt;br /&gt;
state 4:  OFF, will remain off&lt;br /&gt;
state 5:  ON, will survive&lt;br /&gt;
state 6:  OFF, will become alive&lt;br /&gt;
&lt;br /&gt;
state 7:  ON, still-life&lt;br /&gt;
state 8:  OFF, still-life&lt;br /&gt;
&lt;br /&gt;
state 9:  ON, p2 oscillator&lt;br /&gt;
state 10: OFF, p2 oscillator&lt;br /&gt;
&lt;br /&gt;
state 11: ON, higher-period object&lt;br /&gt;
state 12: OFF, higher-period object&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;n_states:17\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;neighborhood:Moore\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;symmetries:permute\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        table += self.newvars([&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;e&amp;quot;,&amp;quot;f&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;h&amp;quot;,&amp;quot;i&amp;quot;], range(0, 17, 1))&lt;br /&gt;
        table += self.newvars([&amp;quot;la&amp;quot;,&amp;quot;lb&amp;quot;,&amp;quot;lc&amp;quot;,&amp;quot;ld&amp;quot;,&amp;quot;le&amp;quot;,&amp;quot;lf&amp;quot;,&amp;quot;lg&amp;quot;,&amp;quot;lh&amp;quot;,&amp;quot;li&amp;quot;], range(1, 17, 2))&lt;br /&gt;
        table += self.newvars([&amp;quot;da&amp;quot;,&amp;quot;db&amp;quot;,&amp;quot;dc&amp;quot;,&amp;quot;dd&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;df&amp;quot;,&amp;quot;dg&amp;quot;,&amp;quot;dh&amp;quot;,&amp;quot;di&amp;quot;], range(0, 17, 2))&lt;br /&gt;
        table += self.newvars([&amp;quot;pa&amp;quot;,&amp;quot;pb&amp;quot;,&amp;quot;pc&amp;quot;,&amp;quot;pd&amp;quot;,&amp;quot;pe&amp;quot;,&amp;quot;pf&amp;quot;,&amp;quot;pg&amp;quot;,&amp;quot;ph&amp;quot;,&amp;quot;pi&amp;quot;], [0, 3, 4])&lt;br /&gt;
        table += self.newvars([&amp;quot;qa&amp;quot;,&amp;quot;qb&amp;quot;,&amp;quot;qc&amp;quot;,&amp;quot;qd&amp;quot;,&amp;quot;qe&amp;quot;,&amp;quot;qf&amp;quot;,&amp;quot;qg&amp;quot;,&amp;quot;qh&amp;quot;,&amp;quot;qi&amp;quot;], [5, 6])&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(9):&lt;br /&gt;
            if (self.bee[i]):&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,2,6,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;q&amp;quot;,&amp;quot;p&amp;quot;,3,9,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;q&amp;quot;,&amp;quot;p&amp;quot;,4,12,i)&lt;br /&gt;
            if (self.ess[i]):&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,1,5,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;q&amp;quot;,&amp;quot;p&amp;quot;,5,7,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;q&amp;quot;,&amp;quot;p&amp;quot;,6,12,i)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,2,4,0)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,1,3,0)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,5,11,0)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,3,11,0)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,4,8,0)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,6,10,0)&lt;br /&gt;
&lt;br /&gt;
        table += &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
# Propagate interestingness&lt;br /&gt;
7,11,b,c,d,e,f,g,h,11&lt;br /&gt;
7,12,b,c,d,e,f,g,h,11&lt;br /&gt;
7,9,b,c,d,e,f,g,h,9&lt;br /&gt;
7,10,b,c,d,e,f,g,h,9&lt;br /&gt;
8,11,b,c,d,e,f,g,h,12&lt;br /&gt;
8,12,b,c,d,e,f,g,h,12&lt;br /&gt;
8,9,b,c,d,e,f,g,h,10&lt;br /&gt;
8,10,b,c,d,e,f,g,h,10&lt;br /&gt;
&lt;br /&gt;
7,13,b,c,d,e,f,g,h,11&lt;br /&gt;
7,14,b,c,d,e,f,g,h,11&lt;br /&gt;
8,13,b,c,d,e,f,g,h,14&lt;br /&gt;
8,14,b,c,d,e,f,g,h,14&lt;br /&gt;
9,13,b,c,d,e,f,g,h,11&lt;br /&gt;
9,14,b,c,d,e,f,g,h,11&lt;br /&gt;
10,13,b,c,d,e,f,g,h,14&lt;br /&gt;
10,14,b,c,d,e,f,g,h,14&lt;br /&gt;
&lt;br /&gt;
9,11,b,c,d,e,f,g,h,11&lt;br /&gt;
9,12,b,c,d,e,f,g,h,11&lt;br /&gt;
10,11,b,c,d,e,f,g,h,12&lt;br /&gt;
10,12,b,c,d,e,f,g,h,12&lt;br /&gt;
&lt;br /&gt;
13,11,b,c,d,e,f,g,h,11&lt;br /&gt;
13,12,b,c,d,e,f,g,h,11&lt;br /&gt;
14,11,b,c,d,e,f,g,h,12&lt;br /&gt;
14,12,b,c,d,e,f,g,h,12&lt;br /&gt;
13,9,b,c,d,e,f,g,h,11&lt;br /&gt;
14,9,b,c,d,e,f,g,h,12&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1  255  255  255&lt;br /&gt;
2  127  127  127&lt;br /&gt;
7    0    0  255&lt;br /&gt;
8    0    0  127&lt;br /&gt;
9  255    0    0&lt;br /&gt;
10 127    0    0&lt;br /&gt;
11   0  255    0&lt;br /&gt;
12   0  127    0&lt;br /&gt;
13 255  255    0&lt;br /&gt;
14 127  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_ClassifyObjects_&amp;quot;+self.alphanumeric, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
    def saveContagiousLife(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
A variant of HistoricalLife used for detecting dependencies between&lt;br /&gt;
islands.&lt;br /&gt;
&lt;br /&gt;
state 0:  vacuum&lt;br /&gt;
state 1:  ON&lt;br /&gt;
state 2:  OFF&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;n_states:7\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;neighborhood:Moore\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;symmetries:permute\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        table += self.newvars([&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;e&amp;quot;,&amp;quot;f&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;h&amp;quot;,&amp;quot;i&amp;quot;], range(0, 7, 1))&lt;br /&gt;
        table += self.newvars([&amp;quot;la&amp;quot;,&amp;quot;lb&amp;quot;,&amp;quot;lc&amp;quot;,&amp;quot;ld&amp;quot;,&amp;quot;le&amp;quot;,&amp;quot;lf&amp;quot;,&amp;quot;lg&amp;quot;,&amp;quot;lh&amp;quot;,&amp;quot;li&amp;quot;], range(1, 7, 2))&lt;br /&gt;
        table += self.newvars([&amp;quot;da&amp;quot;,&amp;quot;db&amp;quot;,&amp;quot;dc&amp;quot;,&amp;quot;dd&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;df&amp;quot;,&amp;quot;dg&amp;quot;,&amp;quot;dh&amp;quot;,&amp;quot;di&amp;quot;], range(0, 7, 2))&lt;br /&gt;
        table += self.newvar(&amp;quot;p&amp;quot;,[3, 4])&lt;br /&gt;
        table += self.newvars([&amp;quot;ta&amp;quot;,&amp;quot;tb&amp;quot;,&amp;quot;tc&amp;quot;,&amp;quot;td&amp;quot;,&amp;quot;te&amp;quot;,&amp;quot;tf&amp;quot;,&amp;quot;tg&amp;quot;,&amp;quot;th&amp;quot;,&amp;quot;ti&amp;quot;], [3])&lt;br /&gt;
        table += self.newvars([&amp;quot;qa&amp;quot;,&amp;quot;qb&amp;quot;,&amp;quot;qc&amp;quot;,&amp;quot;qd&amp;quot;,&amp;quot;qe&amp;quot;,&amp;quot;qf&amp;quot;,&amp;quot;qg&amp;quot;,&amp;quot;qh&amp;quot;,&amp;quot;qi&amp;quot;], [0, 1, 2, 4, 5, 6])&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(9):&lt;br /&gt;
            if (self.bee[i]):&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,4,3,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,2,1,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,0,1,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,6,5,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;t&amp;quot;,&amp;quot;q&amp;quot;,0,4,i)&lt;br /&gt;
            if (self.ess[i]):&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,3,3,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,5,5,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,1,1,i)&lt;br /&gt;
&lt;br /&gt;
        table += &amp;quot;# Default behaviour (death):\n&amp;quot;&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,1,2,0)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,5,6,0)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,3,4,0)&lt;br /&gt;
&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1    0    0  255&lt;br /&gt;
2    0    0  127&lt;br /&gt;
3  255    0    0&lt;br /&gt;
4  127    0    0&lt;br /&gt;
5    0  255    0&lt;br /&gt;
6    0  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_ContagiousLife_&amp;quot;+self.alphanumeric, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Soup:&lt;br /&gt;
&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
&lt;br /&gt;
        # The rule generator:&lt;br /&gt;
        self.rg = RuleGenerator()&lt;br /&gt;
&lt;br /&gt;
        # Should we skip error-correction:&lt;br /&gt;
        self.skipErrorCorrection = False&lt;br /&gt;
&lt;br /&gt;
        # A dict mapping binary representations of small possibly-pseudo-objects&lt;br /&gt;
        # to their equivalent canonised representation.&lt;br /&gt;
        #&lt;br /&gt;
        # This is many-to-one, as (for example) all of these will map to&lt;br /&gt;
        # the same pseudo-object (namely the beacon on block):&lt;br /&gt;
        #&lt;br /&gt;
        # ..**.**  ..**.**  **.....                           **.....&lt;br /&gt;
        # ..**.**  ...*.**  **.....                           *......&lt;br /&gt;
        # **.....  *......  ..**...                           ...*.**&lt;br /&gt;
        # **.....  **.....  ..**... [...12 others omitted...] ..**.**&lt;br /&gt;
        # .......  .......  .......                           .......&lt;br /&gt;
        # .......  .......  ..**...                           .......&lt;br /&gt;
        # .......  .......  ..**...                           .......&lt;br /&gt;
        #&lt;br /&gt;
        # The first few soups are much slower to process, as objects are being&lt;br /&gt;
        # entered into the cache.&lt;br /&gt;
        self.cache = {}&lt;br /&gt;
&lt;br /&gt;
        # A dict to store memoized decompositions of possibly-pseudo-objects&lt;br /&gt;
        # into constituent parts. This is initialised with the unique minimal&lt;br /&gt;
        # pseudo-still-life (two blocks on lock) that cannot be automatically&lt;br /&gt;
        # separated by the routine pseudo_bangbang(). Any larger objects are&lt;br /&gt;
        # ambiguous, such as this one:&lt;br /&gt;
        #&lt;br /&gt;
        #     *&lt;br /&gt;
        #    * * **&lt;br /&gt;
        #     ** **&lt;br /&gt;
        #&lt;br /&gt;
        #    * *** *&lt;br /&gt;
        #    ** * **&lt;br /&gt;
        #&lt;br /&gt;
        # Is it a (block on (lock on boat)) or ((block on lock) on boat)?&lt;br /&gt;
        # Ahh, the joys of non-associativity.&lt;br /&gt;
        #&lt;br /&gt;
        # See http://paradise.caltech.edu/~cook/Workshop/CAs/2DOutTot/Life/StillLife/StillLifeTheory.html&lt;br /&gt;
        self.decompositions = {&amp;quot;xs18_3pq3qp3&amp;quot;: [&amp;quot;xs14_3123qp3&amp;quot;, &amp;quot;xs4_33&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
        # A dict of objects in the form {&amp;quot;identifier&amp;quot;: (&amp;quot;common name&amp;quot;, points)}&lt;br /&gt;
        #&lt;br /&gt;
        # As a rough heuristic, an object is worth 15 + log2(n) points if it&lt;br /&gt;
        # is n times rarer than the pentadecathlon.&lt;br /&gt;
        #&lt;br /&gt;
        # Still-lifes are limited to 10 points.&lt;br /&gt;
        # p2 oscillators are limited to 20 points.&lt;br /&gt;
        # p3 and p4 oscillators are limited to 30 points.&lt;br /&gt;
        self.commonnames = {&amp;quot;xp3_co9nas0san9oczgoldlo0oldlogz1047210127401&amp;quot;: (&amp;quot;pulsar&amp;quot;, 8),&lt;br /&gt;
                       &amp;quot;xp15_4r4z4r4&amp;quot;: (&amp;quot;pentadecathlon&amp;quot;, 15),&lt;br /&gt;
                       &amp;quot;xp2_2a54&amp;quot;: (&amp;quot;clock&amp;quot;, 16),&lt;br /&gt;
                       &amp;quot;xp2_31ago&amp;quot;: (&amp;quot;bipole&amp;quot;, 17),&lt;br /&gt;
                       &amp;quot;xp2_0g0k053z32&amp;quot;: (&amp;quot;quadpole&amp;quot;, 18),&lt;br /&gt;
                       &amp;quot;xp2_g8gid1e8z1226&amp;quot;: (&amp;quot;great on-off&amp;quot;, 19),&lt;br /&gt;
                       &amp;quot;xp2_rhewehr&amp;quot;: (&amp;quot;spark coil&amp;quot;, 19),&lt;br /&gt;
                       &amp;quot;xp8_gk2gb3z11&amp;quot;: (&amp;quot;figure-8&amp;quot;, 20),&lt;br /&gt;
                       &amp;quot;xp4_37bkic&amp;quot;: (&amp;quot;mold&amp;quot;, 21),&lt;br /&gt;
                       &amp;quot;xp2_31a08zy0123cko&amp;quot;: (&amp;quot;quadpole on ship&amp;quot;, 20),&lt;br /&gt;
                       &amp;quot;xp2_g0k053z11&amp;quot;: (&amp;quot;tripole&amp;quot;, 20),&lt;br /&gt;
                       &amp;quot;xp4_ssj3744zw3&amp;quot;: (&amp;quot;mazing&amp;quot;, 23),&lt;br /&gt;
                       &amp;quot;xp8_g3jgz1ut&amp;quot;: (&amp;quot;blocker&amp;quot;, 24),&lt;br /&gt;
                       &amp;quot;xp3_695qc8zx33&amp;quot;: (&amp;quot;jam&amp;quot;, 24),&lt;br /&gt;
                       &amp;quot;xp30_w33z8kqrqk8zzzw33&amp;quot;: (&amp;quot;cis-queen-bee-shuttle&amp;quot;, 24),&lt;br /&gt;
                       &amp;quot;xp30_w33z8kqrqk8zzzx33&amp;quot;: (&amp;quot;trans-queen-bee-shuttle&amp;quot;, 24),&lt;br /&gt;
                       &amp;quot;xp4_8eh5e0e5he8z178a707a871&amp;quot;: (&amp;quot;cloverleaf&amp;quot;, 25),&lt;br /&gt;
                       &amp;quot;xp5_idiidiz01w1&amp;quot;: (&amp;quot;octagon II&amp;quot;, 26),&lt;br /&gt;
                       &amp;quot;xp6_ccb7w66z066&amp;quot;: (&amp;quot;unix&amp;quot;, 26),&lt;br /&gt;
                       &amp;quot;xp14_j9d0d9j&amp;quot;: (&amp;quot;tumbler&amp;quot;, 27),&lt;br /&gt;
                       &amp;quot;xp3_025qzrq221&amp;quot;: (&amp;quot;trans-tub-eater&amp;quot;, 28),&lt;br /&gt;
                       &amp;quot;xp3_4hh186z07&amp;quot;: (&amp;quot;caterer&amp;quot;, 29),&lt;br /&gt;
                       &amp;quot;xp3_025qz32qq1&amp;quot;: (&amp;quot;cis-tub-eater&amp;quot;, 30),&lt;br /&gt;
                       &amp;quot;xp8_wgovnz234z33&amp;quot;: (&amp;quot;Tim Coe&#039;s p8&amp;quot;, 31),&lt;br /&gt;
                       &amp;quot;xp5_3pmwmp3zx11&amp;quot;: (&amp;quot;fumarole&amp;quot;, 33),&lt;br /&gt;
                       &amp;quot;xp46_330279cx1aad3y833zx4e93x855bc&amp;quot;: (&amp;quot;cis-twin-bees-shuttle&amp;quot;, 35),&lt;br /&gt;
                       &amp;quot;xp46_330279cx1aad3zx4e93x855bcy8cc&amp;quot;: (&amp;quot;trans-twin-bees-shuttle&amp;quot;, 35),&lt;br /&gt;
                       &amp;quot;yl144_1_16_afb5f3db909e60548f086e22ee3353ac&amp;quot;: (&amp;quot;block-laying switch engine&amp;quot;, 16),&lt;br /&gt;
                       &amp;quot;yl384_1_59_7aeb1999980c43b4945fb7fcdb023326&amp;quot;: (&amp;quot;glider-producing switch engine&amp;quot;, 17),&lt;br /&gt;
                       &amp;quot;xp10_9hr&amp;quot;: (&amp;quot;[HighLife] p10&amp;quot;, 6),&lt;br /&gt;
                       &amp;quot;xp7_13090c8&amp;quot;: (&amp;quot;[HighLife] p7&amp;quot;, 9),&lt;br /&gt;
                       &amp;quot;xq48_07z8ca7zy1e531&amp;quot;: (&amp;quot;[HighLife] bomber&amp;quot;, 9),&lt;br /&gt;
                       &amp;quot;xq4_153&amp;quot;: (&amp;quot;glider&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xq4_6frc&amp;quot;: (&amp;quot;lightweight spaceship&amp;quot;, 7),&lt;br /&gt;
                       &amp;quot;xq4_27dee6&amp;quot;: (&amp;quot;middleweight spaceship&amp;quot;, 9),&lt;br /&gt;
                       &amp;quot;xq4_27deee6&amp;quot;: (&amp;quot;heavyweight spaceship&amp;quot;, 12),&lt;br /&gt;
                       &amp;quot;xq7_3nw17862z6952&amp;quot;: (&amp;quot;loafer&amp;quot;, 70),&lt;br /&gt;
                       &amp;quot;xp2_7&amp;quot;: (&amp;quot;blinker&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs4_33&amp;quot;: (&amp;quot;block&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs4_252&amp;quot;: (&amp;quot;tub&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs5_253&amp;quot;: (&amp;quot;boat&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs6_bd&amp;quot;: (&amp;quot;snake&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs6_356&amp;quot;: (&amp;quot;ship&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs6_696&amp;quot;: (&amp;quot;beehive&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs6_25a4&amp;quot;: (&amp;quot;barge&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs6_39c&amp;quot;: (&amp;quot;carrier&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xp2_7e&amp;quot;: (&amp;quot;toad&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xp2_318c&amp;quot;: (&amp;quot;beacon&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs7_3lo&amp;quot;: (&amp;quot;long snake&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs7_25ac&amp;quot;: (&amp;quot;long boat&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs7_178c&amp;quot;: (&amp;quot;eater&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs7_2596&amp;quot;: (&amp;quot;loaf&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_178k8&amp;quot;: (&amp;quot;twit&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_32qk&amp;quot;: (&amp;quot;hook with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_69ic&amp;quot;: (&amp;quot;mango&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_6996&amp;quot;: (&amp;quot;pond&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_25ak8&amp;quot;: (&amp;quot;long barge&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_3pm&amp;quot;: (&amp;quot;shillelagh&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_312ko&amp;quot;: (&amp;quot;canoe&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_31248c&amp;quot;: (&amp;quot;very long snake&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_35ac&amp;quot;: (&amp;quot;long ship&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_g8o653z11&amp;quot;: (&amp;quot;ship-tie&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_g88m952z121&amp;quot;: (&amp;quot;half-bakery&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_69bqic&amp;quot;: (&amp;quot;paperclip&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_31ego&amp;quot;: (&amp;quot;integral sign&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_g8o652z01&amp;quot;: (&amp;quot;boat-tie&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_g88b96z123&amp;quot;: (&amp;quot;big ess&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs16_g88m996z1221&amp;quot;: (&amp;quot;bipond&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_raar&amp;quot;: (&amp;quot;table on table&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_4aar&amp;quot;: (&amp;quot;hat&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_35ako&amp;quot;: (&amp;quot;very long ship&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_178ko&amp;quot;: (&amp;quot;trans boat with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs15_354cgc453&amp;quot;: (&amp;quot;moose antlers&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_6970796&amp;quot;: (&amp;quot;cis-mirrored r-bee&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_32qr&amp;quot;: (&amp;quot;block on table&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs16_j1u0696z11&amp;quot;: (&amp;quot;beehive on dock&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_j1u066z11&amp;quot;: (&amp;quot;block on dock&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_g8o652z11&amp;quot;: (&amp;quot;boat tie ship&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_25ako&amp;quot;: (&amp;quot;very long boat&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs16_69egmiczx1&amp;quot;: (&amp;quot;scorpion&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs18_rhe0ehr&amp;quot;: (&amp;quot;dead spark coil&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs17_2ege1ege2&amp;quot;: (&amp;quot;twinhat&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_178kk8&amp;quot;: (&amp;quot;beehive with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_69ar&amp;quot;: (&amp;quot;loop&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_69bo8a6&amp;quot;: (&amp;quot;fourteener&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_39e0e93&amp;quot;: (&amp;quot;bookends&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_178kc&amp;quot;: (&amp;quot;cis boat with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_330f96&amp;quot;: (&amp;quot;block and cap&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_358gkc&amp;quot;: (&amp;quot;10.003&amp;quot;,0),&lt;br /&gt;
                       &amp;quot;xs12_330fho&amp;quot;: (&amp;quot;trans block and longhook&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_g0s252z11&amp;quot;: (&amp;quot;prodigal sign&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_g0s453z11&amp;quot;: (&amp;quot;elevener&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_6is079c&amp;quot;: (&amp;quot;cis-rotated hook&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_69e0eic&amp;quot;: (&amp;quot;trans-mirrored R-bee&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_ggm952z1&amp;quot;: (&amp;quot;trans loaf with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs15_j1u06a4z11&amp;quot;: (&amp;quot;cis boat and dock&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs20_3lkkl3z32w23&amp;quot;: (&amp;quot;mirrored dock&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_178br&amp;quot;: (&amp;quot;12.003&amp;quot;,0),&lt;br /&gt;
                       &amp;quot;xs12_3hu066&amp;quot;: (&amp;quot;cis block and longhook&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_178c453&amp;quot;: (&amp;quot;eater with nine&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_0drz32&amp;quot;: (&amp;quot;broken snake&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_312453&amp;quot;: (&amp;quot;long shillelagh&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_3215ac&amp;quot;: (&amp;quot;boat with long tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_39e0e96&amp;quot;: (&amp;quot;cis-hook and R-bee&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs13_g88m96z121&amp;quot;: (&amp;quot;beehive at loaf&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_39e0eic&amp;quot;: (&amp;quot;trans hook and R-bee&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_3542ac&amp;quot;: (&amp;quot;S-ten&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs15_259e0eic&amp;quot;: (&amp;quot;trans R-bee and R-loaf&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_178jd&amp;quot;: (&amp;quot;11-loop&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_25a84c&amp;quot;: (&amp;quot;tub with long tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs15_3lkm96z01&amp;quot;: (&amp;quot;bee-hat&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_g8o0e96z121&amp;quot;: (&amp;quot;cis-rotated R-bee&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs13_69e0mq&amp;quot;: (&amp;quot;R-bee and snake&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_69lic&amp;quot;: (&amp;quot;11.003&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_6960ui&amp;quot;: (&amp;quot;beehive and table&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs16_259e0e952&amp;quot;: (&amp;quot;cis-mirrored R-loaf&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_1784ko&amp;quot;: (&amp;quot;8-snake-eater&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs13_4a960ui&amp;quot;: (&amp;quot;ortho loaf and table&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_g0g853z11&amp;quot;: (&amp;quot;long canoe&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs18_69is0si96&amp;quot;: (&amp;quot;[cis-mirrored R-mango]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_178kic&amp;quot;: (&amp;quot;cis loaf with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs16_69bob96&amp;quot;: (&amp;quot;symmetric scorpion&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs13_0g8o653z121&amp;quot;: (&amp;quot;longboat on ship&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_o4q552z01&amp;quot;: (&amp;quot;beehive at beehive&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_ggka52z1&amp;quot;: (&amp;quot;trans barge with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_256o8a6&amp;quot;: (&amp;quot;eater on boat&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_6960uic&amp;quot;: (&amp;quot;beehive with cap&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_2egm93&amp;quot;: (&amp;quot;snorkel loop&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_2egm96&amp;quot;: (&amp;quot;beehive bend tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_g0s253z11&amp;quot;: (&amp;quot;trans boat with nine&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs15_3lk453z121&amp;quot;: (&amp;quot;trans boat and dock&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs19_69icw8ozxdd11&amp;quot;: (&amp;quot;[mango with block on dock]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs13_2530f96&amp;quot;: (&amp;quot;[cis boat and cap]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_2530f9&amp;quot;: (&amp;quot;cis boat and table&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_4a9m88gzx121&amp;quot;: (&amp;quot;[bi-loaf2]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_ggka53z1&amp;quot;: (&amp;quot;trans longboat with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs18_2egm9a4zx346&amp;quot;: (&amp;quot;[loaf eater tail]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs15_4a9raic&amp;quot;: (&amp;quot;[15-bent-paperclip]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_3586246&amp;quot;: (&amp;quot;[11-snake]&amp;quot;,0),&lt;br /&gt;
                       &amp;quot;xs11_178b52&amp;quot;: (&amp;quot;[11-boat wrap tail]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_08u1e8z321&amp;quot;: (&amp;quot;[hat join hook]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_g4s079cz11&amp;quot;: (&amp;quot;[cis-mirrored offset hooks]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs13_31egma4&amp;quot;: (&amp;quot;[13-boat wrap eater]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_69960ui&amp;quot;: (&amp;quot;pond and table&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs13_255q8a6&amp;quot;: (&amp;quot;[eater tie beehive]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs15_09v0ccz321&amp;quot;: (&amp;quot;[hook join table and block]&amp;quot;,0)}&lt;br /&gt;
&lt;br /&gt;
        # First soup to contain a particular object:&lt;br /&gt;
        self.alloccur = {}&lt;br /&gt;
&lt;br /&gt;
        # A tally of objects that have occurred during this run of apgsearch:&lt;br /&gt;
        self.objectcounts = {}&lt;br /&gt;
&lt;br /&gt;
        # Any soups with positive scores, and the number of points.&lt;br /&gt;
        self.soupscores = {}&lt;br /&gt;
&lt;br /&gt;
        # Temporary list of unidentified objects:&lt;br /&gt;
        self.unids = []&lt;br /&gt;
&lt;br /&gt;
        # Things like glider guns and large oscillators belong here:&lt;br /&gt;
        self.superunids = []&lt;br /&gt;
        self.gridsize = 0&lt;br /&gt;
        self.resets = 0&lt;br /&gt;
&lt;br /&gt;
        # For profiling purposes:&lt;br /&gt;
        self.qlifetime = 0.0&lt;br /&gt;
        self.ruletime = 0.0&lt;br /&gt;
        self.gridtime = 0.0&lt;br /&gt;
&lt;br /&gt;
    # Increment object count by given value:&lt;br /&gt;
    def incobject(self, obj, incval):&lt;br /&gt;
        if (incval &amp;gt; 0):&lt;br /&gt;
            if obj in self.objectcounts:&lt;br /&gt;
                self.objectcounts[obj] = self.objectcounts[obj] + incval&lt;br /&gt;
            else:&lt;br /&gt;
                self.objectcounts[obj] = incval&lt;br /&gt;
&lt;br /&gt;
    # Increment soup score by given value:&lt;br /&gt;
    def awardpoints(self, soupid, incval):&lt;br /&gt;
        if (incval &amp;gt; 0):&lt;br /&gt;
            if soupid in self.soupscores:&lt;br /&gt;
                self.soupscores[soupid] = self.soupscores[soupid] + incval&lt;br /&gt;
            else:&lt;br /&gt;
                self.soupscores[soupid] = incval&lt;br /&gt;
&lt;br /&gt;
    # Increment soup score by appropriate value:&lt;br /&gt;
    def awardpoints2(self, soupid, obj):&lt;br /&gt;
&lt;br /&gt;
        # Record the occurrence of this object:&lt;br /&gt;
        if (obj in self.alloccur):&lt;br /&gt;
            if (len(self.alloccur[obj]) &amp;lt; 10):&lt;br /&gt;
                if (soupid not in self.alloccur[obj]):&lt;br /&gt;
                    self.alloccur[obj] += [soupid]&lt;br /&gt;
        else:&lt;br /&gt;
            self.alloccur[obj] = [soupid]&lt;br /&gt;
        &lt;br /&gt;
        if obj in self.commonnames:&lt;br /&gt;
            self.awardpoints(soupid, self.commonnames[obj][1])&lt;br /&gt;
        elif (obj[0] == &#039;x&#039;):&lt;br /&gt;
            prefix = obj.split(&#039;_&#039;)[0]&lt;br /&gt;
            prenum = int(prefix[2:])&lt;br /&gt;
            if (obj[1] == &#039;s&#039;):&lt;br /&gt;
                self.awardpoints(soupid, min(prenum, 20)) # for still-lifes, award one point per constituent cell (max 20)&lt;br /&gt;
            elif (obj[1] == &#039;p&#039;):&lt;br /&gt;
                if (prenum == 2):&lt;br /&gt;
                    self.awardpoints(soupid, 20) # p2 oscillators are limited to 20 points&lt;br /&gt;
                elif ((prenum == 3) | (prenum == 4)):&lt;br /&gt;
                    self.awardpoints(soupid, 30) # p3 and p4 oscillators are limited to 30 points&lt;br /&gt;
                else:&lt;br /&gt;
                    self.awardpoints(soupid, 40)&lt;br /&gt;
            else:&lt;br /&gt;
                self.awardpoints(soupid, 50)&lt;br /&gt;
        else:&lt;br /&gt;
            self.awardpoints(soupid, 60)&lt;br /&gt;
&lt;br /&gt;
    # Assuming the pattern has stabilised, perform a census:&lt;br /&gt;
    def census(self, stepsize):&lt;br /&gt;
&lt;br /&gt;
        g.setrule(&amp;quot;APG_CoalesceObjects_&amp;quot; + self.rg.alphanumeric)&lt;br /&gt;
        g.setbase(2)&lt;br /&gt;
        g.setstep(stepsize)&lt;br /&gt;
        g.step()&lt;br /&gt;
&lt;br /&gt;
        # apgsearch theoretically supports up to 2^14 rules, whereas the Guy&lt;br /&gt;
        # glider is only stable in 2^8 rules. Ensure that this is one of these&lt;br /&gt;
        # rules by doing some basic Boolean arithmetic.&lt;br /&gt;
        #&lt;br /&gt;
        # This should be parsed as `gliders exist&#039;, not `glider sexist&#039;:&lt;br /&gt;
        glidersexist = self.rg.ess[2] &amp;amp; self.rg.ess[3] &amp;amp; (not self.rg.ess[1]) &amp;amp; (not self.rg.ess[4])&lt;br /&gt;
        glidersexist = glidersexist &amp;amp; (not (self.rg.bee[4] | self.rg.bee[5]))&lt;br /&gt;
&lt;br /&gt;
        if (glidersexist):&lt;br /&gt;
            g.setrule(&amp;quot;APG_IdentifyGliders&amp;quot;)&lt;br /&gt;
            g.setbase(2)&lt;br /&gt;
            g.setstep(2)&lt;br /&gt;
            g.step()&lt;br /&gt;
&lt;br /&gt;
        g.setrule(&amp;quot;APG_ClassifyObjects_&amp;quot; + self.rg.alphanumeric)&lt;br /&gt;
        g.setbase(2)&lt;br /&gt;
        g.setstep(max(8, stepsize))&lt;br /&gt;
        g.step()&lt;br /&gt;
&lt;br /&gt;
        # Only do this if we have an infinite-growth pattern:&lt;br /&gt;
        if (stepsize &amp;gt; 8):&lt;br /&gt;
            g.setrule(&amp;quot;APG_HandlePlumesCorrected&amp;quot;)&lt;br /&gt;
            g.setbase(2)&lt;br /&gt;
            g.setstep(1)&lt;br /&gt;
            g.step()&lt;br /&gt;
            g.setrule(&amp;quot;APG_ClassifyObjects_&amp;quot; + self.rg.alphanumeric)&lt;br /&gt;
            g.setstep(stepsize)&lt;br /&gt;
            g.step()&lt;br /&gt;
&lt;br /&gt;
        # Remove any gliders:&lt;br /&gt;
        if (glidersexist):&lt;br /&gt;
            g.setrule(&amp;quot;APG_ExpungeGliders&amp;quot;)&lt;br /&gt;
            g.run(1)&lt;br /&gt;
            pop5 = int(g.getpop())&lt;br /&gt;
            g.run(1)&lt;br /&gt;
            pop6 = int(g.getpop())&lt;br /&gt;
            self.incobject(&amp;quot;xq4_153&amp;quot;, (pop5 - pop6)/5)&lt;br /&gt;
&lt;br /&gt;
        # Remove any blocks, blinkers and beehives:&lt;br /&gt;
        g.setrule(&amp;quot;APG_ExpungeObjects&amp;quot;)&lt;br /&gt;
        pop0 = int(g.getpop())&lt;br /&gt;
        g.run(1)&lt;br /&gt;
        pop1 = int(g.getpop())&lt;br /&gt;
        g.run(1)&lt;br /&gt;
        pop2 = int(g.getpop())&lt;br /&gt;
        g.run(1)&lt;br /&gt;
        pop3 = int(g.getpop())&lt;br /&gt;
        g.run(1)&lt;br /&gt;
        pop4 = int(g.getpop())&lt;br /&gt;
&lt;br /&gt;
        # Blocks, blinkers and beehives removed by ExpungeObjects:&lt;br /&gt;
        self.incobject(&amp;quot;xs1_1&amp;quot;, (pop0-pop1))&lt;br /&gt;
        self.incobject(&amp;quot;xs4_33&amp;quot;, (pop1-pop2)/4)&lt;br /&gt;
        self.incobject(&amp;quot;xp2_7&amp;quot;, (pop2-pop3)/5)&lt;br /&gt;
        self.incobject(&amp;quot;xs6_696&amp;quot;, (pop3-pop4)/8)&lt;br /&gt;
&lt;br /&gt;
    # Removes an object incident with (ix, iy) and returns the cell list:&lt;br /&gt;
    def grabobj(self, ix, iy):&lt;br /&gt;
&lt;br /&gt;
        allcells = [ix, iy, g.getcell(ix, iy)]&lt;br /&gt;
        g.setcell(ix, iy, 0)&lt;br /&gt;
        livecells = []&lt;br /&gt;
        deadcells = []&lt;br /&gt;
&lt;br /&gt;
        marker = 0&lt;br /&gt;
        ll = 3&lt;br /&gt;
&lt;br /&gt;
        while (marker &amp;lt; ll):&lt;br /&gt;
            x = allcells[marker]&lt;br /&gt;
            y = allcells[marker+1]&lt;br /&gt;
            z = allcells[marker+2]&lt;br /&gt;
            marker += 3&lt;br /&gt;
&lt;br /&gt;
            if ((z % 2) == 1):&lt;br /&gt;
                livecells.append(x)&lt;br /&gt;
                livecells.append(y)&lt;br /&gt;
            else:&lt;br /&gt;
                deadcells.append(x)&lt;br /&gt;
                deadcells.append(y)&lt;br /&gt;
&lt;br /&gt;
            for nx in xrange(x - 1, x + 2):&lt;br /&gt;
                for ny in xrange(y - 1, y + 2):&lt;br /&gt;
&lt;br /&gt;
                    nz = g.getcell(nx, ny)&lt;br /&gt;
                    if (nz &amp;gt; 0):&lt;br /&gt;
                        allcells.append(nx)&lt;br /&gt;
                        allcells.append(ny)&lt;br /&gt;
                        allcells.append(nz)&lt;br /&gt;
                        g.setcell(nx, ny, 0)&lt;br /&gt;
                        ll += 3&lt;br /&gt;
&lt;br /&gt;
        return livecells&lt;br /&gt;
&lt;br /&gt;
    # Command to Grab, Remove and IDentify an OBJect:&lt;br /&gt;
    def gridobj(self, ix, iy, gsize, gspacing, pos):&lt;br /&gt;
&lt;br /&gt;
        allcells = [ix, iy, g.getcell(ix, iy)]&lt;br /&gt;
        g.setcell(ix, iy, 0)&lt;br /&gt;
        livecells = []&lt;br /&gt;
        deadcells = []&lt;br /&gt;
&lt;br /&gt;
        # This tacitly assumes the object is smaller than 1000-by-1000.&lt;br /&gt;
        # But this is okay, since it is only used by the routing logic.&lt;br /&gt;
        dleft = ix + 1000&lt;br /&gt;
        dright = ix - 1000&lt;br /&gt;
        dtop = iy + 1000&lt;br /&gt;
        dbottom = iy - 1000&lt;br /&gt;
&lt;br /&gt;
        lleft = ix + 1000&lt;br /&gt;
        lright = ix - 1000&lt;br /&gt;
        ltop = iy + 1000&lt;br /&gt;
        lbottom = iy - 1000&lt;br /&gt;
&lt;br /&gt;
        lpop = 0&lt;br /&gt;
        dpop = 0&lt;br /&gt;
&lt;br /&gt;
        marker = 0&lt;br /&gt;
        ll = 3&lt;br /&gt;
&lt;br /&gt;
        while (marker &amp;lt; ll):&lt;br /&gt;
            x = allcells[marker]&lt;br /&gt;
            y = allcells[marker+1]&lt;br /&gt;
            z = allcells[marker+2]&lt;br /&gt;
            marker += 3&lt;br /&gt;
&lt;br /&gt;
            if ((z % 2) == 1):&lt;br /&gt;
                livecells.append(x)&lt;br /&gt;
                livecells.append(y)&lt;br /&gt;
                lleft = min(lleft, x)&lt;br /&gt;
                lright = max(lright, x)&lt;br /&gt;
                ltop = min(ltop, y)&lt;br /&gt;
                lbottom = max(lbottom, y)&lt;br /&gt;
                lpop += 1&lt;br /&gt;
            else:&lt;br /&gt;
                deadcells.append(x)&lt;br /&gt;
                deadcells.append(y)&lt;br /&gt;
                dleft = min(dleft, x)&lt;br /&gt;
                dright = max(dright, x)&lt;br /&gt;
                dtop = min(dtop, y)&lt;br /&gt;
                dbottom = max(dbottom, y)&lt;br /&gt;
                dpop += 1&lt;br /&gt;
&lt;br /&gt;
            for nx in xrange(x - 1, x + 2):&lt;br /&gt;
                for ny in xrange(y - 1, y + 2):&lt;br /&gt;
&lt;br /&gt;
                    nz = g.getcell(nx, ny)&lt;br /&gt;
                    if (nz &amp;gt; 0):&lt;br /&gt;
                        allcells.append(nx)&lt;br /&gt;
                        allcells.append(ny)&lt;br /&gt;
                        allcells.append(nz)&lt;br /&gt;
                        g.setcell(nx, ny, 0)&lt;br /&gt;
                        ll += 3&lt;br /&gt;
&lt;br /&gt;
        lwidth = max(0, 1 + lright - lleft)&lt;br /&gt;
        lheight = max(0, 1 + lbottom - ltop)&lt;br /&gt;
        dwidth = max(0, 1 + dright - dleft)&lt;br /&gt;
        dheight = max(0, 1 + dbottom - dtop)&lt;br /&gt;
&lt;br /&gt;
        llength = max(lwidth, lheight)&lt;br /&gt;
        lbreadth = min(lwidth, lheight)&lt;br /&gt;
        dlength = max(dwidth, dheight)&lt;br /&gt;
        dbreadth = min(dwidth, dheight)&lt;br /&gt;
&lt;br /&gt;
        self.gridsize = max(self.gridsize, llength)&lt;br /&gt;
&lt;br /&gt;
        objid = &amp;quot;unidentified&amp;quot;&lt;br /&gt;
        bitstring = 0&lt;br /&gt;
&lt;br /&gt;
        if (lpop == 0):&lt;br /&gt;
            objid = &amp;quot;nothing&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            if ((lwidth &amp;lt;= 7) &amp;amp; (lheight &amp;lt;= 7)):&lt;br /&gt;
                for i in xrange(0, lpop*2, 2):&lt;br /&gt;
                    bitstring += (1 &amp;lt;&amp;lt; ((livecells[i] - lleft) + 7*(livecells[i + 1] - ltop)))&lt;br /&gt;
&lt;br /&gt;
                if bitstring in self.cache:&lt;br /&gt;
                    objid = self.cache[bitstring]&lt;br /&gt;
&lt;br /&gt;
        if (objid == &amp;quot;unidentified&amp;quot;):&lt;br /&gt;
            # This has passed through the routing logic without being identified,&lt;br /&gt;
            # so save it in a temporary list for later identification:&lt;br /&gt;
            self.unids.append(bitstring)&lt;br /&gt;
            self.unids.append(livecells)&lt;br /&gt;
            self.unids.append(lleft)&lt;br /&gt;
            self.unids.append(ltop)&lt;br /&gt;
        elif (objid != &amp;quot;nothing&amp;quot;):&lt;br /&gt;
            # The object is non-empty, so add it to the census:&lt;br /&gt;
            ux = int(0.5 + float(lleft)/float(gspacing))&lt;br /&gt;
            uy = int(0.5 + float(ltop)/float(gspacing))&lt;br /&gt;
            soupid = ux + (uy * gsize) + pos&lt;br /&gt;
&lt;br /&gt;
            # Check whether the cached object is in the set of decompositions&lt;br /&gt;
            # (this is usually the case, unless for example it is a high-period&lt;br /&gt;
            # albeit small spaceship):&lt;br /&gt;
            if objid in self.decompositions:            &lt;br /&gt;
                for comp in self.decompositions[objid]:&lt;br /&gt;
                    self.incobject(comp, 1)&lt;br /&gt;
                    self.awardpoints2(soupid, comp)&lt;br /&gt;
            else:&lt;br /&gt;
                self.incobject(objid, 1)&lt;br /&gt;
                self.awardpoints2(soupid, objid)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    # Tests for population periodicity:&lt;br /&gt;
    def naivestab(self, period, security, length):&lt;br /&gt;
&lt;br /&gt;
        depth = 0&lt;br /&gt;
        prevpop = 0&lt;br /&gt;
        for i in xrange(length):&lt;br /&gt;
            g.run(period)&lt;br /&gt;
            currpop = int(g.getpop())&lt;br /&gt;
            if (currpop == prevpop):&lt;br /&gt;
                depth += 1&lt;br /&gt;
            else:&lt;br /&gt;
                depth = 0&lt;br /&gt;
            prevpop = currpop&lt;br /&gt;
            if (depth == security):&lt;br /&gt;
                # Population is periodic.&lt;br /&gt;
                return True&lt;br /&gt;
&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # This should catch most short-lived soups with few gliders produced:&lt;br /&gt;
    def naivestab2(self, period, length):&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(length):&lt;br /&gt;
            r = g.getrect()&lt;br /&gt;
            if (len(r) == 0):&lt;br /&gt;
                return True&lt;br /&gt;
            pop0 = int(g.getpop())&lt;br /&gt;
            g.run(period)&lt;br /&gt;
            hash1 = g.hash(r)&lt;br /&gt;
            pop1 = int(g.getpop())&lt;br /&gt;
            g.run(period)&lt;br /&gt;
            hash2 = g.hash(r)&lt;br /&gt;
            pop2 = int(g.getpop())&lt;br /&gt;
&lt;br /&gt;
            if ((hash1 == hash2) &amp;amp; (pop0 == pop1) &amp;amp; (pop1 == pop2)):&lt;br /&gt;
&lt;br /&gt;
                if (g.getrect() == r):&lt;br /&gt;
                    return True&lt;br /&gt;
                &lt;br /&gt;
                g.run((2*int(max(r[2], r[3])/period)+1)*period)&lt;br /&gt;
                hash3 = g.hash(r)&lt;br /&gt;
                pop3 = int(g.getpop())&lt;br /&gt;
                if ((hash2 == hash3) &amp;amp; (pop2 == pop3)):&lt;br /&gt;
                    return True&lt;br /&gt;
&lt;br /&gt;
        return False&lt;br /&gt;
            &lt;br /&gt;
    # Runs a pattern until stabilisation with a 99.99996% success rate.&lt;br /&gt;
    # False positives are handled by a later error-correction stage.&lt;br /&gt;
    def stabilise3(self):&lt;br /&gt;
&lt;br /&gt;
        # Phase I of stabilisation detection, designed to weed out patterns&lt;br /&gt;
        # that stabilise into a cluster of low-period oscillators within&lt;br /&gt;
        # about 6000 generations.&lt;br /&gt;
&lt;br /&gt;
        if (self.naivestab2(12, 10)):&lt;br /&gt;
            return 4;&lt;br /&gt;
&lt;br /&gt;
        if (self.naivestab(12, 30, 200)):&lt;br /&gt;
            return 4;&lt;br /&gt;
&lt;br /&gt;
        if (self.naivestab(30, 30, 200)):&lt;br /&gt;
            return 5;&lt;br /&gt;
&lt;br /&gt;
        # Phase II of stabilisation detection, which is much more rigorous&lt;br /&gt;
        # and based on oscar.py.&lt;br /&gt;
&lt;br /&gt;
        # Should be sufficient:&lt;br /&gt;
        prect = [-2000, -2000, 4000, 4000]&lt;br /&gt;
&lt;br /&gt;
        # initialize lists&lt;br /&gt;
        hashlist = []        # for pattern hash values&lt;br /&gt;
        genlist = []         # corresponding generation counts&lt;br /&gt;
&lt;br /&gt;
        for j in xrange(4000):&lt;br /&gt;
&lt;br /&gt;
            g.run(30)&lt;br /&gt;
&lt;br /&gt;
            h = g.hash(prect)&lt;br /&gt;
&lt;br /&gt;
            # determine where to insert h into hashlist&lt;br /&gt;
            pos = 0&lt;br /&gt;
            listlen = len(hashlist)&lt;br /&gt;
            while pos &amp;lt; listlen:&lt;br /&gt;
                if h &amp;gt; hashlist[pos]:&lt;br /&gt;
                    pos += 1&lt;br /&gt;
                elif h &amp;lt; hashlist[pos]:&lt;br /&gt;
                    # shorten lists and append info below&lt;br /&gt;
                    del hashlist[pos : listlen]&lt;br /&gt;
                    del genlist[pos : listlen]&lt;br /&gt;
                    break&lt;br /&gt;
                else:&lt;br /&gt;
                    period = (int(g.getgen()) - genlist[pos])&lt;br /&gt;
&lt;br /&gt;
                    prevpop = g.getpop()&lt;br /&gt;
&lt;br /&gt;
                    for i in xrange(20):&lt;br /&gt;
                        g.run(period)&lt;br /&gt;
                        currpop = g.getpop()&lt;br /&gt;
                        if (currpop != prevpop):&lt;br /&gt;
                            period = max(period, 4000)&lt;br /&gt;
                            break&lt;br /&gt;
                        prevpop = currpop&lt;br /&gt;
                        &lt;br /&gt;
                    return max(1 + int(math.log(period, 2)),3)&lt;br /&gt;
&lt;br /&gt;
            hashlist.insert(pos, h)&lt;br /&gt;
            genlist.insert(pos, int(g.getgen()))&lt;br /&gt;
&lt;br /&gt;
        g.setalgo(&amp;quot;HashLife&amp;quot;)&lt;br /&gt;
        g.setrule(self.rg.slashed)&lt;br /&gt;
        g.setbase(2)&lt;br /&gt;
        g.setstep(16)&lt;br /&gt;
        g.step()&lt;br /&gt;
        stepsize = 12&lt;br /&gt;
        g.setalgo(&amp;quot;QuickLife&amp;quot;)&lt;br /&gt;
        g.setrule(self.rg.slashed)&lt;br /&gt;
&lt;br /&gt;
        return 12&lt;br /&gt;
&lt;br /&gt;
    # Differs from oscar.py in that it detects absolute cycles, not eventual cycles.&lt;br /&gt;
    def bijoscar(self, maxsteps):&lt;br /&gt;
&lt;br /&gt;
        initpop = int(g.getpop())&lt;br /&gt;
        initrect = g.getrect()&lt;br /&gt;
        if (len(initrect) == 0):&lt;br /&gt;
            return 0&lt;br /&gt;
        inithash = g.hash(initrect)&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(maxsteps):&lt;br /&gt;
&lt;br /&gt;
            g.run(1)&lt;br /&gt;
&lt;br /&gt;
            if (int(g.getpop()) == initpop):&lt;br /&gt;
&lt;br /&gt;
                prect = g.getrect()&lt;br /&gt;
                phash = g.hash(prect)&lt;br /&gt;
&lt;br /&gt;
                if (phash == inithash):&lt;br /&gt;
&lt;br /&gt;
                    period = i + 1&lt;br /&gt;
&lt;br /&gt;
                    if (prect == initrect):&lt;br /&gt;
                        return period&lt;br /&gt;
                    else:&lt;br /&gt;
                        return -period&lt;br /&gt;
        return -1&lt;br /&gt;
&lt;br /&gt;
    # For a non-moving unidentified object, we check the dictionary of&lt;br /&gt;
    # memoized decompositions of possibly-pseudo-objects. If the object is&lt;br /&gt;
    # not already in the dictionary, it will be memoized.&lt;br /&gt;
    #&lt;br /&gt;
    # Low-period spaceships are also separated by this routine, although&lt;br /&gt;
    # this is less important now that there is a more bespoke prodecure&lt;br /&gt;
    # to handle disjoint unions of standard spaceships.&lt;br /&gt;
    #&lt;br /&gt;
    # @param moving  a bool which specifies whether the object is moving&lt;br /&gt;
    def enter_unid(self, unidname, soupid, moving):&lt;br /&gt;
&lt;br /&gt;
        if not(unidname in self.decompositions):&lt;br /&gt;
&lt;br /&gt;
            # Separate into pure components:&lt;br /&gt;
            if (moving):&lt;br /&gt;
                g.setrule(&amp;quot;APG_CoalesceObjects_&amp;quot; + self.rg.alphanumeric)&lt;br /&gt;
                g.setbase(2)&lt;br /&gt;
                g.setstep(3)&lt;br /&gt;
                g.step()&lt;br /&gt;
            else:&lt;br /&gt;
                pseudo_bangbang(self.rg.alphanumeric)&lt;br /&gt;
&lt;br /&gt;
            listoflists = [] # which incidentally don&#039;t contain themselves.&lt;br /&gt;
&lt;br /&gt;
            # Someone who plays the celllo:&lt;br /&gt;
            celllist = g.join(g.getcells(g.getrect()), [0])&lt;br /&gt;
&lt;br /&gt;
            for i in xrange(0, len(celllist)-1, 3):&lt;br /&gt;
                if (g.getcell(celllist[i], celllist[i+1]) != 0):&lt;br /&gt;
                    livecells = self.grabobj(celllist[i], celllist[i+1])&lt;br /&gt;
                    if (len(livecells) &amp;gt; 0):&lt;br /&gt;
                        listoflists.append(livecells)&lt;br /&gt;
&lt;br /&gt;
            listofobjs = []&lt;br /&gt;
&lt;br /&gt;
            for livecells in listoflists:&lt;br /&gt;
&lt;br /&gt;
                g.new(&amp;quot;Subcomponent&amp;quot;)&lt;br /&gt;
                g.setalgo(&amp;quot;QuickLife&amp;quot;)&lt;br /&gt;
                g.setrule(self.rg.slashed)&lt;br /&gt;
                g.putcells(livecells)&lt;br /&gt;
                period = self.bijoscar(1000)&lt;br /&gt;
                canonised = canonise(abs(period))&lt;br /&gt;
                if (period &amp;lt; 0):&lt;br /&gt;
                    listofobjs.append(&amp;quot;xq&amp;quot;+str(0-period)+&amp;quot;_&amp;quot;+canonised)&lt;br /&gt;
                elif (period == 1):&lt;br /&gt;
                    listofobjs.append(&amp;quot;xs&amp;quot;+str(len(livecells)/2)+&amp;quot;_&amp;quot;+canonised)&lt;br /&gt;
                else:&lt;br /&gt;
                    listofobjs.append(&amp;quot;xp&amp;quot;+str(period)+&amp;quot;_&amp;quot;+canonised)&lt;br /&gt;
&lt;br /&gt;
            self.decompositions[unidname] = listofobjs&lt;br /&gt;
&lt;br /&gt;
        # Actually add to the census:&lt;br /&gt;
        for comp in self.decompositions[unidname]:&lt;br /&gt;
            self.incobject(comp, 1)&lt;br /&gt;
            self.awardpoints2(soupid, comp)&lt;br /&gt;
&lt;br /&gt;
    # This function has lots of arguments (hence the name):&lt;br /&gt;
    #&lt;br /&gt;
    # @param gsize     the square-root of the number of soups per page&lt;br /&gt;
    # @param gspacing  the minimum distance between centres of soups&lt;br /&gt;
    # @param ashes     a list of cell lists&lt;br /&gt;
    # @param stepsize  binary logarithm of amount of time to coalesce objects&lt;br /&gt;
    # @param intergen  binary logarithm of amount of time to run HashLife&lt;br /&gt;
    # @param pos       the index of the first soup on the page&lt;br /&gt;
    def teenager(self, gsize, gspacing, ashes, stepsize, intergen, pos):&lt;br /&gt;
&lt;br /&gt;
        # For error-correction:&lt;br /&gt;
        if (intergen &amp;gt; 0):&lt;br /&gt;
            g.setalgo(&amp;quot;HashLife&amp;quot;)&lt;br /&gt;
            g.setrule(self.rg.slashed)&lt;br /&gt;
&lt;br /&gt;
        # If this gets incremented, we panic and perform error-correction:&lt;br /&gt;
        pathological = 0&lt;br /&gt;
&lt;br /&gt;
        # Draw the soups:&lt;br /&gt;
        for i in xrange(gsize * gsize):&lt;br /&gt;
&lt;br /&gt;
            x = int(i % gsize)&lt;br /&gt;
            y = int(i / gsize)&lt;br /&gt;
&lt;br /&gt;
            g.putcells(ashes[3*i], gspacing * x, gspacing * y)&lt;br /&gt;
&lt;br /&gt;
        # Because why not?&lt;br /&gt;
        g.fit()&lt;br /&gt;
        g.update()&lt;br /&gt;
&lt;br /&gt;
        # For error-correction:&lt;br /&gt;
        if (intergen &amp;gt; 0):&lt;br /&gt;
            g.setbase(2)&lt;br /&gt;
            g.setstep(intergen)&lt;br /&gt;
            g.step()&lt;br /&gt;
&lt;br /&gt;
        # Apply rules to coalesce objects and expunge annoyances such as&lt;br /&gt;
        # blocks, blinkers, beehives and gliders:&lt;br /&gt;
        start_time = time.clock()&lt;br /&gt;
        self.census(stepsize)&lt;br /&gt;
        end_time = time.clock()&lt;br /&gt;
        self.ruletime += (end_time - start_time)&lt;br /&gt;
&lt;br /&gt;
        # Now begin identifying objects:&lt;br /&gt;
        start_time = time.clock()&lt;br /&gt;
        celllist = g.join(g.getcells(g.getrect()), [0])&lt;br /&gt;
&lt;br /&gt;
        if (len(celllist) &amp;gt; 2):&lt;br /&gt;
            for i in xrange(0, len(celllist)-1, 3):&lt;br /&gt;
                if (g.getcell(celllist[i], celllist[i+1]) != 0):&lt;br /&gt;
                    self.gridobj(celllist[i], celllist[i+1], gsize, gspacing, pos)&lt;br /&gt;
&lt;br /&gt;
        # If we have leftover unidentified objects, attempt to canonise them:&lt;br /&gt;
        while (len(self.unids) &amp;gt; 0):&lt;br /&gt;
            ux = int(0.5 + float(self.unids[-2])/float(gspacing))&lt;br /&gt;
            uy = int(0.5 + float(self.unids[-1])/float(gspacing))&lt;br /&gt;
            soupid = ux + (uy * gsize) + pos&lt;br /&gt;
            unidname = self.process_unid()&lt;br /&gt;
            if (unidname == &amp;quot;PATHOLOGICAL&amp;quot;):&lt;br /&gt;
                pathological += 1&lt;br /&gt;
            if (unidname != &amp;quot;nothing&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
                if ((unidname[0] == &#039;U&#039;) &amp;amp; (unidname[1] == &#039;S&#039;) &amp;amp; (unidname[2] == &#039;S&#039;)):&lt;br /&gt;
                    &lt;br /&gt;
                    # Union of standard spaceships:&lt;br /&gt;
                    countlist = unidname.split(&#039;_&#039;)&lt;br /&gt;
                    &lt;br /&gt;
                    self.incobject(&amp;quot;xq4_6frc&amp;quot;, int(countlist[1]))&lt;br /&gt;
                    for i in xrange(int(countlist[1])):&lt;br /&gt;
                        self.awardpoints2(soupid, &amp;quot;xq4_6frc&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    self.incobject(&amp;quot;xq4_27dee6&amp;quot;, int(countlist[2]))&lt;br /&gt;
                    for i in xrange(int(countlist[2])):&lt;br /&gt;
                        self.awardpoints2(soupid, &amp;quot;xq4_27dee6&amp;quot;)&lt;br /&gt;
                        &lt;br /&gt;
                    self.incobject(&amp;quot;xq4_27deee6&amp;quot;, int(countlist[3]))&lt;br /&gt;
                    for i in xrange(int(countlist[3])):&lt;br /&gt;
                        self.awardpoints2(soupid, &amp;quot;xq4_27deee6&amp;quot;)&lt;br /&gt;
                        &lt;br /&gt;
                elif ((unidname[0] == &#039;x&#039;) &amp;amp; ((unidname[1] == &#039;s&#039;) | (unidname[1] == &#039;p&#039;))):&lt;br /&gt;
                    self.enter_unid(unidname, soupid, False)&lt;br /&gt;
                else:&lt;br /&gt;
                    if ((unidname[0] == &#039;x&#039;) &amp;amp; (unidname[1] == &#039;q&#039;) &amp;amp; (unidname[3] == &#039;_&#039;)):&lt;br /&gt;
                        # Separates low-period (&amp;lt;= 9) non-standard spaceships in medium proximity:&lt;br /&gt;
                        self.enter_unid(unidname, soupid, True)&lt;br /&gt;
                    else:&lt;br /&gt;
                        self.incobject(unidname, 1)&lt;br /&gt;
                        self.awardpoints2(soupid, unidname)&lt;br /&gt;
&lt;br /&gt;
        end_time = time.clock()&lt;br /&gt;
        self.gridtime += (end_time - start_time)&lt;br /&gt;
&lt;br /&gt;
        return pathological&lt;br /&gt;
&lt;br /&gt;
    def stabilise_soups_parallel(self, root, pos, gsize, sym):&lt;br /&gt;
&lt;br /&gt;
        souplist = [[sym, root + str(pos + i)] for i in xrange(gsize * gsize)]&lt;br /&gt;
&lt;br /&gt;
        return self.stabilise_soups_parallel_orig(gsize, souplist, pos)&lt;br /&gt;
&lt;br /&gt;
    def stabilise_soups_parallel_list(self, gsize, stringlist, pos):&lt;br /&gt;
&lt;br /&gt;
        souplist = [s.split(&#039;/&#039;) for s in stringlist]&lt;br /&gt;
&lt;br /&gt;
        return self.stabilise_soups_parallel_orig(gsize, souplist, pos)&lt;br /&gt;
&lt;br /&gt;
    # This basically orchestrates everything:&lt;br /&gt;
    def stabilise_soups_parallel_orig(self, gsize, souplist, pos):&lt;br /&gt;
&lt;br /&gt;
        ashes = []&lt;br /&gt;
        stepsize = 3&lt;br /&gt;
&lt;br /&gt;
        g.new(&amp;quot;Random soups&amp;quot;)&lt;br /&gt;
        g.setalgo(&amp;quot;QuickLife&amp;quot;)&lt;br /&gt;
        g.setrule(self.rg.slashed)&lt;br /&gt;
&lt;br /&gt;
        gspacing = 0&lt;br /&gt;
&lt;br /&gt;
        # Generate and run the soups until stabilisation:&lt;br /&gt;
        for i in xrange(gsize * gsize):&lt;br /&gt;
&lt;br /&gt;
            if (i &amp;lt; len(souplist)):&lt;br /&gt;
&lt;br /&gt;
                sym = souplist[i][0]&lt;br /&gt;
                prehash = souplist[i][1]&lt;br /&gt;
&lt;br /&gt;
                # Generate the soup from the SHA-256 of the concatenation of the&lt;br /&gt;
                # seed with the index:&lt;br /&gt;
                g.putcells(hashsoup(prehash, sym), 0, 0)&lt;br /&gt;
&lt;br /&gt;
            # Run the soup until stabilisation:&lt;br /&gt;
            start_time = time.clock()&lt;br /&gt;
            stepsize = max(stepsize, self.stabilise3())&lt;br /&gt;
            end_time = time.clock()&lt;br /&gt;
            self.qlifetime += (end_time - start_time)&lt;br /&gt;
&lt;br /&gt;
            # Ironically, the spelling of this variable is incurrrect:&lt;br /&gt;
            currrect = g.getrect()&lt;br /&gt;
            ashes.append(g.getcells(currrect))&lt;br /&gt;
&lt;br /&gt;
            if (len(currrect) == 4):&lt;br /&gt;
                ashes.append(currrect[0])&lt;br /&gt;
                ashes.append(currrect[1])&lt;br /&gt;
                # Choose the grid spacing based on the size of the ash:&lt;br /&gt;
                gspacing = max(gspacing, 2*currrect[2])&lt;br /&gt;
                gspacing = max(gspacing, 2*currrect[3])&lt;br /&gt;
                g.select(currrect)&lt;br /&gt;
                g.clear(0)&lt;br /&gt;
            else:&lt;br /&gt;
                ashes.append(0)&lt;br /&gt;
                ashes.append(0)&lt;br /&gt;
            g.select([])&lt;br /&gt;
&lt;br /&gt;
        # Account for any extra enlargement caused by running CoalesceObjects:&lt;br /&gt;
        gspacing += 2 ** (stepsize + 1) + 1000&lt;br /&gt;
&lt;br /&gt;
        start_time = time.clock()&lt;br /&gt;
&lt;br /&gt;
        # Remember the dictionary, just in case we have a pathological object:&lt;br /&gt;
        prevdict = self.objectcounts.copy()&lt;br /&gt;
        prevscores = self.soupscores.copy()&lt;br /&gt;
        prevunids = self.superunids[:]&lt;br /&gt;
&lt;br /&gt;
        # Process the soups:&lt;br /&gt;
        returncode = self.teenager(gsize, gspacing, ashes, stepsize, 0, pos)&lt;br /&gt;
&lt;br /&gt;
        end_time = time.clock()&lt;br /&gt;
&lt;br /&gt;
        # Calculate the mean delay incurred (excluding qlifetime or error-correction):&lt;br /&gt;
        meandelay = (end_time - start_time) / (gsize * gsize)&lt;br /&gt;
&lt;br /&gt;
        if (returncode &amp;gt; 0):&lt;br /&gt;
            if (self.skipErrorCorrection == False):&lt;br /&gt;
                # Arrrggghhhh, there&#039;s a pathological object! Usually this means&lt;br /&gt;
                # that naive stabilisation detection returned a false positive.&lt;br /&gt;
                self.resets += 1&lt;br /&gt;
                &lt;br /&gt;
                # Reset the object counts:&lt;br /&gt;
                self.objectcounts = prevdict&lt;br /&gt;
                self.soupscores = prevscores&lt;br /&gt;
                self.superunids = prevunids&lt;br /&gt;
&lt;br /&gt;
                # 2^18 generations should suffice. This takes about 30 seconds in&lt;br /&gt;
                # HashLife, but error-correction only occurs very infrequently, so&lt;br /&gt;
                # this has a negligible impact on mean performance:&lt;br /&gt;
                gspacing += 2 ** 19&lt;br /&gt;
                stepsize = max(stepsize, 12)&lt;br /&gt;
                &lt;br /&gt;
                # Clear the universe:&lt;br /&gt;
                g.new(&amp;quot;Error-correcting phase&amp;quot;)&lt;br /&gt;
                self.teenager(gsize, gspacing, ashes, stepsize, 18, pos)&lt;br /&gt;
&lt;br /&gt;
        # Erase any ashes. Not least because England usually loses...&lt;br /&gt;
        ashes = []&lt;br /&gt;
&lt;br /&gt;
        # Return the mean delay so that we can use machine-learning to&lt;br /&gt;
        # find the optimal value of sqrtspp:&lt;br /&gt;
        return meandelay&lt;br /&gt;
&lt;br /&gt;
    def reset(self):&lt;br /&gt;
&lt;br /&gt;
        self.objectcounts = {}&lt;br /&gt;
        self.soupscores = {}&lt;br /&gt;
        self.alloccur = {}&lt;br /&gt;
        self.superunids = []&lt;br /&gt;
        self.unids = []&lt;br /&gt;
&lt;br /&gt;
    # Pop the last unidentified object from the stack, and attempt to&lt;br /&gt;
    # ascertain its period and classify it.&lt;br /&gt;
    def process_unid(self):&lt;br /&gt;
&lt;br /&gt;
        g.new(&amp;quot;Unidentified object&amp;quot;)&lt;br /&gt;
        g.setalgo(&amp;quot;QuickLife&amp;quot;)&lt;br /&gt;
        g.setrule(self.rg.slashed)&lt;br /&gt;
        y = self.unids.pop()&lt;br /&gt;
        x = self.unids.pop()&lt;br /&gt;
        livecells = self.unids.pop()&lt;br /&gt;
        bitstring = self.unids.pop()&lt;br /&gt;
        g.putcells(livecells, -x, -y, 1, 0, 0, 1, &amp;quot;or&amp;quot;)&lt;br /&gt;
        period = self.bijoscar(1000)&lt;br /&gt;
        &lt;br /&gt;
        if (period == -1):&lt;br /&gt;
            # Infinite growth pattern, probably. Most infinite-growth&lt;br /&gt;
            # patterns are linear-growth (such as puffers, wickstretchers,&lt;br /&gt;
            # guns etc.) so we analyse to see whether we have a linear-&lt;br /&gt;
            # growth pattern:&lt;br /&gt;
            descriptor = linearlyse(1500)&lt;br /&gt;
            if (descriptor[0] == &amp;quot;y&amp;quot;):&lt;br /&gt;
                return descriptor&lt;br /&gt;
&lt;br /&gt;
            # Similarly check for irregular power-law growth. This will&lt;br /&gt;
            # catch replicators, for instance. Spend around 375 000&lt;br /&gt;
            # generations; this seems like a reasonable amount of time.&lt;br /&gt;
            descriptor = powerlyse(8, 1500)&lt;br /&gt;
            if (descriptor[0] == &amp;quot;z&amp;quot;):&lt;br /&gt;
                return descriptor&lt;br /&gt;
&lt;br /&gt;
            # It may be an unstabilised ember that slipped through the net,&lt;br /&gt;
            # but this will be handled by error-correction (unless it&lt;br /&gt;
            # persists another 2^18 gens, which is so unbelievably improbable&lt;br /&gt;
            # that you are more likely to be picked up by a passing ship in&lt;br /&gt;
            # the vacuum of space).&lt;br /&gt;
            self.superunids.append(livecells)&lt;br /&gt;
            self.superunids.append(x)&lt;br /&gt;
            self.superunids.append(y)&lt;br /&gt;
            &lt;br /&gt;
            return &amp;quot;PATHOLOGICAL&amp;quot;&lt;br /&gt;
        elif (period == 0):&lt;br /&gt;
            return &amp;quot;nothing&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            if (period == -4):&lt;br /&gt;
&lt;br /&gt;
                triple = countxwsses()&lt;br /&gt;
&lt;br /&gt;
                if (triple != (-1, -1, -1)):&lt;br /&gt;
&lt;br /&gt;
                    # Union of Standard Spaceships:&lt;br /&gt;
                    return (&amp;quot;USS_&amp;quot; + str(triple[0]) + &amp;quot;_&amp;quot; + str(triple[1]) + &amp;quot;_&amp;quot; + str(triple[2]))&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            canonised = canonise(abs(period))&lt;br /&gt;
&lt;br /&gt;
            if (canonised == &amp;quot;#&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
                # Okay, we know that it&#039;s an oscillator or spaceship with&lt;br /&gt;
                # a non-astronomical period. But it&#039;s too large to canonise&lt;br /&gt;
                # in any of its phases (i.e. transcends a 40-by-40 box).&lt;br /&gt;
                self.superunids.append(livecells)&lt;br /&gt;
                self.superunids.append(x)&lt;br /&gt;
                self.superunids.append(y)&lt;br /&gt;
                &lt;br /&gt;
                # Append a suffix according to whether it is a still-life,&lt;br /&gt;
                # oscillator or moving object:&lt;br /&gt;
                if (period == 1):&lt;br /&gt;
                    descriptor = (&amp;quot;ov_s&amp;quot;+str(len(livecells)/2))&lt;br /&gt;
                elif (period &amp;gt; 0):&lt;br /&gt;
                    descriptor = (&amp;quot;ov_p&amp;quot;+str(period))&lt;br /&gt;
                else:&lt;br /&gt;
                    descriptor = (&amp;quot;ov_q&amp;quot;+str(0-period))&lt;br /&gt;
&lt;br /&gt;
                return descriptor&lt;br /&gt;
            &lt;br /&gt;
            else:&lt;br /&gt;
&lt;br /&gt;
                # Prepend a prefix according to whether it is a still-life,&lt;br /&gt;
                # oscillator or moving object:&lt;br /&gt;
                if (period == 1):&lt;br /&gt;
                    descriptor = (&amp;quot;xs&amp;quot;+str(len(livecells)/2)+&amp;quot;_&amp;quot;+canonised)&lt;br /&gt;
                elif (period &amp;gt; 0):&lt;br /&gt;
                    descriptor = (&amp;quot;xp&amp;quot;+str(period)+&amp;quot;_&amp;quot;+canonised)&lt;br /&gt;
                else:&lt;br /&gt;
                    descriptor = (&amp;quot;xq&amp;quot;+str(0-period)+&amp;quot;_&amp;quot;+canonised)&lt;br /&gt;
&lt;br /&gt;
                if (bitstring &amp;gt; 0):&lt;br /&gt;
                    self.cache[bitstring] = descriptor&lt;br /&gt;
&lt;br /&gt;
                return descriptor&lt;br /&gt;
&lt;br /&gt;
    # This doesn&#039;t really do much, since unids should be empty and&lt;br /&gt;
    # actual pathological/oversized objects will rarely arise naturally.&lt;br /&gt;
    def display_unids(self):&lt;br /&gt;
&lt;br /&gt;
        g.new(&amp;quot;Unidentified objects&amp;quot;)&lt;br /&gt;
        g.setalgo(&amp;quot;QuickLife&amp;quot;)&lt;br /&gt;
        g.setrule(self.rg.slashed)&lt;br /&gt;
&lt;br /&gt;
        rowlength = 1 + int(math.sqrt(len(self.superunids)/3))&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(len(self.superunids)/3):&lt;br /&gt;
&lt;br /&gt;
            xpos = i % rowlength&lt;br /&gt;
            ypos = int(i / rowlength)&lt;br /&gt;
&lt;br /&gt;
            g.putcells(self.superunids[3*i], xpos * (self.gridsize + 8) - self.superunids[3*i + 1], ypos * (self.gridsize + 8) - self.superunids[3*i + 2], 1, 0, 0, 1, &amp;quot;or&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        g.fit()&lt;br /&gt;
        g.update()&lt;br /&gt;
&lt;br /&gt;
    def compactify_scores(self):&lt;br /&gt;
&lt;br /&gt;
        # Number of soups to record:&lt;br /&gt;
        highscores = 100&lt;br /&gt;
        ilist = sorted(self.soupscores.iteritems(), key=operator.itemgetter(1), reverse=True)&lt;br /&gt;
&lt;br /&gt;
        # Empty the high score table:&lt;br /&gt;
        self.soupscores = {}&lt;br /&gt;
        &lt;br /&gt;
        for soupnum, score in ilist[:highscores]:&lt;br /&gt;
            self.soupscores[soupnum] = score&lt;br /&gt;
&lt;br /&gt;
    # Saves a machine-readable textual file containing the census:&lt;br /&gt;
    def save_progress(self, numsoups, root, symmetry=&#039;C1&#039;, save_file=True, payosha256_key=None):&lt;br /&gt;
&lt;br /&gt;
        g.show(&amp;quot;Saving progress...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Count the total number of objects:&lt;br /&gt;
        totobjs = 0&lt;br /&gt;
        censustable = &amp;quot;@CENSUS TABLE\n&amp;quot;&lt;br /&gt;
        tlist = sorted(self.objectcounts.iteritems(), key=operator.itemgetter(1), reverse=True)&lt;br /&gt;
        for objname, count in tlist:&lt;br /&gt;
            totobjs += count&lt;br /&gt;
            censustable += objname + &amp;quot; &amp;quot; + str(count) + &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        g.show(&amp;quot;Writing header information...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # The MD5 hash of the root string:&lt;br /&gt;
        md5root = hashlib.md5(root).hexdigest()&lt;br /&gt;
&lt;br /&gt;
        # Header information:&lt;br /&gt;
        results = &amp;quot;@VERSION v1.1\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;@MD5 &amp;quot;+md5root+&amp;quot;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;@ROOT &amp;quot;+root+&amp;quot;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;@RULE &amp;quot;+self.rg.alphanumeric+&amp;quot;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;@SYMMETRY &amp;quot;+symmetry+&amp;quot;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;@NUM_SOUPS &amp;quot;+str(numsoups)+&amp;quot;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;@NUM_OBJECTS &amp;quot;+str(totobjs)+&amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        results += &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        # Census table:&lt;br /&gt;
        results += censustable&lt;br /&gt;
&lt;br /&gt;
        g.show(&amp;quot;Compactifying score table...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        results += &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        # Number of soups to record:&lt;br /&gt;
        highscores = 100&lt;br /&gt;
&lt;br /&gt;
        results += &amp;quot;@TOP &amp;quot;+str(highscores)+&amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        ilist = sorted(self.soupscores.iteritems(), key=operator.itemgetter(1), reverse=True)&lt;br /&gt;
&lt;br /&gt;
        # Empty the high score table:&lt;br /&gt;
        self.soupscores = {}&lt;br /&gt;
        &lt;br /&gt;
        for soupnum, score in ilist[:highscores]:&lt;br /&gt;
            self.soupscores[soupnum] = score&lt;br /&gt;
            results += str(soupnum) + &amp;quot; &amp;quot; + str(score) + &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        g.show(&amp;quot;Saving soupids for rare objects...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        results += &amp;quot;\n@SAMPLE_SOUPIDS\n&amp;quot;&lt;br /&gt;
        for objname, count in tlist:&lt;br /&gt;
            # blinkers and gliders have no alloccur[] entry for some reason,&lt;br /&gt;
            # so the line below avoids errors in B3/S23, maybe other rules too?&lt;br /&gt;
            if objname in self.alloccur:&lt;br /&gt;
                results += objname&lt;br /&gt;
                for soup in self.alloccur[objname]:&lt;br /&gt;
                    results += &amp;quot; &amp;quot; + str(soup)&lt;br /&gt;
                results += &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        g.show(&amp;quot;Writing progress file...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        dirname = g.getdir(&amp;quot;data&amp;quot;)&lt;br /&gt;
        separator = dirname[-1]&lt;br /&gt;
        progresspath = dirname + &amp;quot;apgsearch&amp;quot; + separator + &amp;quot;progress&amp;quot; + separator&lt;br /&gt;
        if not os.path.exists(progresspath):&lt;br /&gt;
            os.makedirs(progresspath)&lt;br /&gt;
&lt;br /&gt;
        filename = progresspath + &amp;quot;search_&amp;quot; + md5root + &amp;quot;.txt&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        try:&lt;br /&gt;
            f = open(filename, &#039;w&#039;)&lt;br /&gt;
            f.write(results)&lt;br /&gt;
            f.close()&lt;br /&gt;
        except:&lt;br /&gt;
            g.warn(&amp;quot;Unable to create progress file:\n&amp;quot; + filename)&lt;br /&gt;
&lt;br /&gt;
        if payosha256_key is not None:&lt;br /&gt;
            if (len(payosha256_key) &amp;gt; 0):&lt;br /&gt;
                return catagolue_results(results, payosha256_key, &amp;quot;post_apgsearch_haul&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Save soup RLE:&lt;br /&gt;
    def save_soup(self, root, soupnum, symmetry):&lt;br /&gt;
&lt;br /&gt;
        # Soup pattern will be stored in a temporary directory:&lt;br /&gt;
        souphash = hashlib.sha256(root + str(soupnum))&lt;br /&gt;
        rlepath = souphash.hexdigest()&lt;br /&gt;
        rlepath = g.getdir(&amp;quot;temp&amp;quot;) + rlepath + &amp;quot;.rle&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        results = &amp;quot;&amp;lt;a href=\&amp;quot;open:&amp;quot; + rlepath + &amp;quot;\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
        results += str(soupnum)&lt;br /&gt;
        results += &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        # Try to write soup patterns to file &amp;quot;rlepath&amp;quot;:&lt;br /&gt;
        try:&lt;br /&gt;
            g.store(hashsoup(root + str(soupnum), symmetry), rlepath)&lt;br /&gt;
        except:&lt;br /&gt;
            g.warn(&amp;quot;Unable to create soup pattern:\n&amp;quot; + rlepath)&lt;br /&gt;
&lt;br /&gt;
        return results&lt;br /&gt;
        &lt;br /&gt;
    # Display results in Help window:&lt;br /&gt;
    def display_census(self, numsoups, root, symmetry):&lt;br /&gt;
&lt;br /&gt;
        dirname = g.getdir(&amp;quot;data&amp;quot;)&lt;br /&gt;
        separator = dirname[-1]&lt;br /&gt;
        apgpath = dirname + &amp;quot;apgsearch&amp;quot; + separator&lt;br /&gt;
        objectspath = apgpath + &amp;quot;objects&amp;quot; + separator + self.rg.alphanumeric + separator&lt;br /&gt;
        if not os.path.exists(objectspath):&lt;br /&gt;
            os.makedirs(objectspath)&lt;br /&gt;
&lt;br /&gt;
        results = &amp;quot;&amp;lt;html&amp;gt;\n&amp;lt;title&amp;gt;Census results&amp;lt;/title&amp;gt;\n&amp;lt;body bgcolor=\&amp;quot;#FFFFCE\&amp;quot;&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;p&amp;gt;Census results after processing &amp;quot; + str(numsoups) + &amp;quot; soups (seed = &amp;quot; + root + &amp;quot;, symmetry = &amp;quot; + symmetry + &amp;quot;):\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        tlist = sorted(self.objectcounts.iteritems(), key=operator.itemgetter(1), reverse=True)    &lt;br /&gt;
        results += &amp;quot;&amp;lt;p&amp;gt;&amp;lt;center&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;table cellspacing=1 border=2 cols=2&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;amp;nbsp;Object&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;amp;nbsp;Common name&amp;amp;nbsp;&amp;lt;/td&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;td align=right&amp;gt;&amp;amp;nbsp;Count&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;amp;nbsp;Sample occurrences&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n&amp;quot;&lt;br /&gt;
        for objname, count in tlist:&lt;br /&gt;
            if (objname[0] == &#039;x&#039;):&lt;br /&gt;
                if (objname[1] == &#039;p&#039;):&lt;br /&gt;
                    results += &amp;quot;&amp;lt;tr bgcolor=\&amp;quot;#CECECF\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
                elif (objname[1] == &#039;q&#039;):&lt;br /&gt;
                    results += &amp;quot;&amp;lt;tr bgcolor=\&amp;quot;#CEFFCE\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
                else:&lt;br /&gt;
                    results += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
            else:&lt;br /&gt;
                results += &amp;quot;&amp;lt;tr bgcolor=\&amp;quot;#FFCECE\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
            results += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
            results += &amp;quot;&amp;amp;nbsp;&amp;quot;&lt;br /&gt;
            &lt;br /&gt;
            # Using &amp;quot;open:&amp;quot; link enables one to click on the object name to open the pattern in Golly:&lt;br /&gt;
            rlepath = objectspath + objname + &amp;quot;.rle&amp;quot;&lt;br /&gt;
            if (objname[0] == &#039;x&#039;):&lt;br /&gt;
                results += &amp;quot;&amp;lt;a href=\&amp;quot;open:&amp;quot; + rlepath + &amp;quot;\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
            # If the name is longer than that of the block-laying switch engine:&lt;br /&gt;
            if len(objname) &amp;gt; 51:&lt;br /&gt;
                # Contract name and include ellipsis:&lt;br /&gt;
                results += objname[:40] + &amp;quot;&amp;amp;#8230;&amp;quot; + objname[-10:]&lt;br /&gt;
            else:&lt;br /&gt;
                results += objname&lt;br /&gt;
            if (objname[0] == &#039;x&#039;):&lt;br /&gt;
                results += &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
            results += &amp;quot;&amp;amp;nbsp;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            if (objname[0] == &#039;x&#039;):&lt;br /&gt;
                # save object in rlepath if it doesn&#039;t exist&lt;br /&gt;
                if not os.path.exists(rlepath):&lt;br /&gt;
                    # Canonised objects are at most 40-by-40:&lt;br /&gt;
                    rledata = &amp;quot;x = 40, y = 40, rule = &amp;quot; + self.rg.slashed + &amp;quot;\n&amp;quot;&lt;br /&gt;
                    # http://ferkeltongs.livejournal.com/15837.html&lt;br /&gt;
                    compact = objname.split(&#039;_&#039;)[1] + &amp;quot;z&amp;quot;&lt;br /&gt;
                    i = 0&lt;br /&gt;
                    strip = []&lt;br /&gt;
                    while (i &amp;lt; len(compact)):&lt;br /&gt;
                        c = ord2(compact[i])&lt;br /&gt;
                        if (c &amp;gt;= 0):&lt;br /&gt;
                            if (c &amp;lt; 32):&lt;br /&gt;
                                # Conventional character:&lt;br /&gt;
                                strip.append(c)&lt;br /&gt;
                            else:&lt;br /&gt;
                                if (c == 35):&lt;br /&gt;
                                    # End of line:&lt;br /&gt;
                                    if (len(strip) == 0):&lt;br /&gt;
                                        strip.append(0)&lt;br /&gt;
                                    for j in xrange(5):&lt;br /&gt;
                                        for d in strip:&lt;br /&gt;
                                            if ((d &amp;amp; (1 &amp;lt;&amp;lt; j)) &amp;gt; 0):&lt;br /&gt;
                                                rledata += &amp;quot;o&amp;quot;&lt;br /&gt;
                                            else:&lt;br /&gt;
                                                rledata += &amp;quot;b&amp;quot;&lt;br /&gt;
                                        rledata += &amp;quot;$\n&amp;quot;&lt;br /&gt;
                                    strip = []&lt;br /&gt;
                                else:&lt;br /&gt;
                                    # Multispace character:&lt;br /&gt;
                                    strip.append(0)&lt;br /&gt;
                                    strip.append(0)&lt;br /&gt;
                                    if (c &amp;gt;= 33):&lt;br /&gt;
                                        strip.append(0)&lt;br /&gt;
                                    if (c == 34):&lt;br /&gt;
                                        strip.append(0)&lt;br /&gt;
                                        i += 1&lt;br /&gt;
                                        d = ord2(compact[i])&lt;br /&gt;
                                        for j in xrange(d):&lt;br /&gt;
                                            strip.append(0)&lt;br /&gt;
                        i += 1&lt;br /&gt;
                    # End of pattern representation:&lt;br /&gt;
                    rledata += &amp;quot;!\n&amp;quot;&lt;br /&gt;
                    try:&lt;br /&gt;
                        f = open(rlepath, &#039;w&#039;)&lt;br /&gt;
                        f.write(rledata)&lt;br /&gt;
                        f.close()&lt;br /&gt;
                    except:&lt;br /&gt;
                        g.warn(&amp;quot;Unable to create object pattern:\n&amp;quot; + rlepath)&lt;br /&gt;
            &lt;br /&gt;
            results += &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;amp;nbsp;&amp;quot;&lt;br /&gt;
            if (objname in self.commonnames):&lt;br /&gt;
                results += self.commonnames[objname][0]&lt;br /&gt;
            results += &amp;quot;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td align=right&amp;gt;&amp;amp;nbsp;&amp;quot; + str(count) + &amp;quot;&amp;amp;nbsp;&amp;quot;&lt;br /&gt;
            results += &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
            if objname in self.alloccur:&lt;br /&gt;
                results += &amp;quot;&amp;amp;nbsp;&amp;quot;&lt;br /&gt;
                for soup in self.alloccur[objname]:&lt;br /&gt;
                    results += self.save_soup(root, soup, symmetry) &lt;br /&gt;
                    results += &amp;quot;&amp;amp;nbsp;&amp;quot;&lt;br /&gt;
            results += &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;/table&amp;gt;\n&amp;lt;/center&amp;gt;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        ilist = sorted(self.soupscores.iteritems(), key=operator.itemgetter(1), reverse=True)&lt;br /&gt;
        results += &amp;quot;&amp;lt;p&amp;gt;&amp;lt;center&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;table cellspacing=1 border=2 cols=2&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;amp;nbsp;Soup number&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td align=right&amp;gt;&amp;amp;nbsp;Score&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n&amp;quot;&lt;br /&gt;
        for soupnum, score in ilist[:50]:&lt;br /&gt;
            results += &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;quot;&lt;br /&gt;
            results += self.save_soup(root, soupnum, symmetry)&lt;br /&gt;
            results += &amp;quot;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td align=right&amp;gt;&amp;amp;nbsp;&amp;quot; + str(score) + &amp;quot;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        results += &amp;quot;&amp;lt;/table&amp;gt;\n&amp;lt;/center&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;/body&amp;gt;\n&amp;lt;/html&amp;gt;\n&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        htmlname = apgpath + &amp;quot;latest_census.html&amp;quot;&lt;br /&gt;
        try:&lt;br /&gt;
            f = open(htmlname, &#039;w&#039;)&lt;br /&gt;
            f.write(results)&lt;br /&gt;
            f.close()&lt;br /&gt;
            g.open(htmlname)&lt;br /&gt;
        except:&lt;br /&gt;
            g.warn(&amp;quot;Unable to create html file:\n&amp;quot; + htmlname)&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
# Converts a base-36 case-insensitive alphanumeric character into a&lt;br /&gt;
# numerical value.&lt;br /&gt;
def ord2(char):&lt;br /&gt;
&lt;br /&gt;
    x = ord(char)&lt;br /&gt;
&lt;br /&gt;
    if ((x &amp;gt;= 48) &amp;amp; (x &amp;lt; 58)):&lt;br /&gt;
        return x - 48&lt;br /&gt;
&lt;br /&gt;
    if ((x &amp;gt;= 65) &amp;amp; (x &amp;lt; 91)):&lt;br /&gt;
        return x - 55&lt;br /&gt;
&lt;br /&gt;
    if ((x &amp;gt;= 97) &amp;amp; (x &amp;lt; 123)):&lt;br /&gt;
        return x - 87&lt;br /&gt;
&lt;br /&gt;
    return -1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def apg_verify(rulestring, symmetry, payoshakey):&lt;br /&gt;
&lt;br /&gt;
    verifysoup = Soup()&lt;br /&gt;
    verifysoup.rg.setrule(rulestring)&lt;br /&gt;
    verifysoup.rg.saveAllRules()&lt;br /&gt;
&lt;br /&gt;
    return_point = [None]&lt;br /&gt;
&lt;br /&gt;
    catagolue_results(rulestring+&amp;quot;\n&amp;quot;+symmetry+&amp;quot;\n&amp;quot;, payoshakey, &amp;quot;verify_apgsearch_haul&amp;quot;, endpoint=&amp;quot;/verify&amp;quot;, return_point=return_point)&lt;br /&gt;
&lt;br /&gt;
    if return_point[0] is not None:&lt;br /&gt;
&lt;br /&gt;
        resplist = return_point[0].split(&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        if ((len(resplist) &amp;gt;= 4) and (resplist[1] == &amp;quot;yes&amp;quot;)):&lt;br /&gt;
&lt;br /&gt;
            md5 = resplist[2]&lt;br /&gt;
            passcode = resplist[3]&lt;br /&gt;
&lt;br /&gt;
            stringlist = resplist[4:]&lt;br /&gt;
&lt;br /&gt;
            stringlist = [s for s in stringlist if (len(s) &amp;gt; 0 and s[0] != &#039;*&#039;)]&lt;br /&gt;
&lt;br /&gt;
            # g.exit(stringlist[0])&lt;br /&gt;
&lt;br /&gt;
            gsize = 3&lt;br /&gt;
&lt;br /&gt;
            pos = 0&lt;br /&gt;
&lt;br /&gt;
            while (len(stringlist) &amp;gt; 0):&lt;br /&gt;
&lt;br /&gt;
                while (gsize * gsize &amp;gt; len(stringlist)):&lt;br /&gt;
&lt;br /&gt;
                    gsize -= 1&lt;br /&gt;
&lt;br /&gt;
                listhead = stringlist[:(gsize*gsize)]&lt;br /&gt;
                stringlist = stringlist[(gsize*gsize):]&lt;br /&gt;
&lt;br /&gt;
                verifysoup.stabilise_soups_parallel_list(gsize, listhead, pos)&lt;br /&gt;
&lt;br /&gt;
                pos += (gsize * gsize)&lt;br /&gt;
&lt;br /&gt;
            # verifysoup.display_census(-1, &amp;quot;verify&amp;quot;, &amp;quot;verify&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            payload = &amp;quot;@MD5 &amp;quot;+md5+&amp;quot;\n&amp;quot;&lt;br /&gt;
            payload += &amp;quot;@PASSCODE &amp;quot;+passcode+&amp;quot;\n&amp;quot;&lt;br /&gt;
            payload += &amp;quot;@RULE &amp;quot;+rulestring+&amp;quot;\n&amp;quot;&lt;br /&gt;
            payload += &amp;quot;@SYMMETRY &amp;quot;+symmetry+&amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            tlist = sorted(verifysoup.objectcounts.iteritems(), key=operator.itemgetter(1), reverse=True)&lt;br /&gt;
&lt;br /&gt;
            for objname, count in tlist:&lt;br /&gt;
&lt;br /&gt;
                payload += objname + &amp;quot; &amp;quot; + str(count) + &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            catagolue_results(payload, payoshakey, &amp;quot;submit_verification&amp;quot;, endpoint=&amp;quot;/verify&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def apg_main():&lt;br /&gt;
&lt;br /&gt;
    # ---------------- Hardcode the following inputs if running without a user interface ----------------&lt;br /&gt;
    orignumber = int(g.getstring(&amp;quot;How many soups to search between successive uploads?&amp;quot;, &amp;quot;5000000&amp;quot;))&lt;br /&gt;
    rulestring = g.getstring(&amp;quot;Which rule to use?&amp;quot;, &amp;quot;B3/S23&amp;quot;)&lt;br /&gt;
    symmstring = g.getstring(&amp;quot;What symmetries to use?&amp;quot;, &amp;quot;C1&amp;quot;)&lt;br /&gt;
    payoshakey = g.getstring(&amp;quot;Please enter your key (visit &amp;quot;+get_server_address()+&amp;quot;/payosha256 in your browser).&amp;quot;, &amp;quot;#anon&amp;quot;)&lt;br /&gt;
    # ---------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    # Sanitise input:&lt;br /&gt;
    orignumber = max(orignumber, 100000)&lt;br /&gt;
    orignumber = min(orignumber, 100000000)&lt;br /&gt;
    number = orignumber&lt;br /&gt;
    initpos = 0&lt;br /&gt;
    if symmstring not in [&amp;quot;32x32&amp;quot;, &amp;quot;1x256&amp;quot;, &amp;quot;2x128&amp;quot;, &amp;quot;4x64&amp;quot;, &amp;quot;8x32&amp;quot;, &amp;quot;C1&amp;quot;, &amp;quot;C2_1&amp;quot;, &amp;quot;C2_2&amp;quot;, &amp;quot;C2_4&amp;quot;, &amp;quot;C4_1&amp;quot;, &amp;quot;C4_4&amp;quot;, &amp;quot;D2_+1&amp;quot;, &amp;quot;D2_+2&amp;quot;, &amp;quot;D2_x&amp;quot;, &amp;quot;D4_+1&amp;quot;, &amp;quot;D4_+2&amp;quot;, &amp;quot;D4_+4&amp;quot;, &amp;quot;D4_x1&amp;quot;, &amp;quot;D4_x4&amp;quot;, &amp;quot;D8_1&amp;quot;, &amp;quot;D8_4&amp;quot;]:&lt;br /&gt;
        g.exit(symmstring+&amp;quot; is not a valid symmetry option&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    quitapg = False&lt;br /&gt;
&lt;br /&gt;
    # Create associated rule tables:&lt;br /&gt;
    soup = Soup()&lt;br /&gt;
    soup.rg.setrule(rulestring)&lt;br /&gt;
    soup.rg.saveAllRules()&lt;br /&gt;
&lt;br /&gt;
    # We have 100 soups per page, instead of one. This parallel approach&lt;br /&gt;
    # was suggested by Tomas Rokicki, and results in approximately a&lt;br /&gt;
    # fourfold increase in soup-searching speed!&lt;br /&gt;
    sqrtspp_optimal = 10&lt;br /&gt;
&lt;br /&gt;
    # Initialise the census:&lt;br /&gt;
    start_time = time.clock()&lt;br /&gt;
    f = (lambda x : &#039;abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789&#039;[ord(x) % 56])&lt;br /&gt;
    rootstring = &#039;&#039;.join(map(f, list(hashlib.sha256(payoshakey + datetime.datetime.now().isoformat()).digest()[:12])))&lt;br /&gt;
    scount = 0&lt;br /&gt;
&lt;br /&gt;
    while (quitapg == False):&lt;br /&gt;
&lt;br /&gt;
        # Peer-review some soups:&lt;br /&gt;
        for i in xrange(5):&lt;br /&gt;
            apg_verify(&amp;quot;b3s23&amp;quot;, &amp;quot;C1&amp;quot;, payoshakey)&lt;br /&gt;
&lt;br /&gt;
        # The &#039;for&#039; loop has been replaced with a &#039;while&#039; loop to allow sqrtspp&lt;br /&gt;
        # to vary during runtime. The idea is that apgsearch can apply a basic&lt;br /&gt;
        # form of machine-learning to dynamically locate the optimum sqrtspp:&lt;br /&gt;
        while (scount &amp;lt; number):&lt;br /&gt;
&lt;br /&gt;
            delays = [0.0, 0.0, 0.0]&lt;br /&gt;
&lt;br /&gt;
            for i in xrange(1000):&lt;br /&gt;
&lt;br /&gt;
                page_time = time.clock()&lt;br /&gt;
&lt;br /&gt;
                sqrtspp = (sqrtspp_optimal + (i % 3) - 1) if (i &amp;lt; 150) else (sqrtspp_optimal)&lt;br /&gt;
&lt;br /&gt;
                # Don&#039;t overrun:&lt;br /&gt;
                while (scount + sqrtspp * sqrtspp &amp;gt; number):&lt;br /&gt;
                    sqrtspp -= 1&lt;br /&gt;
&lt;br /&gt;
                meandelay = soup.stabilise_soups_parallel(rootstring, scount + initpos, sqrtspp, symmstring)&lt;br /&gt;
                if (i &amp;lt; 150):&lt;br /&gt;
                    delays[i % 3] += meandelay&lt;br /&gt;
                scount += (sqrtspp * sqrtspp)&lt;br /&gt;
&lt;br /&gt;
                current_speed = int((sqrtspp * sqrtspp)/(time.clock() - page_time))&lt;br /&gt;
                alltime_speed = int((scount)/(time.clock() - start_time))&lt;br /&gt;
                &lt;br /&gt;
                g.show(str(scount) + &amp;quot; soups processed (&amp;quot; + str(current_speed) +&lt;br /&gt;
                       &amp;quot; per second current; &amp;quot; + str(alltime_speed) + &amp;quot; overall)&amp;quot; +&lt;br /&gt;
                       &amp;quot; : (type &#039;s&#039; to see latest census or &#039;q&#039; to quit).&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                event = g.getevent()&lt;br /&gt;
                if event.startswith(&amp;quot;key&amp;quot;):&lt;br /&gt;
                    evt, ch, mods = event.split()&lt;br /&gt;
                    if ch == &amp;quot;s&amp;quot;:&lt;br /&gt;
                        soup.save_progress(scount, rootstring, symmstring)&lt;br /&gt;
                        soup.display_census(scount, rootstring, symmstring)&lt;br /&gt;
                    elif ch == &amp;quot;q&amp;quot;:&lt;br /&gt;
                        quitapg = True&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                if (scount &amp;gt;= number):&lt;br /&gt;
                    break&lt;br /&gt;
                &lt;br /&gt;
            if (quitapg == True):&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
            # Change sqrtspp to a more optimal value:&lt;br /&gt;
            if (scount &amp;lt; number):&lt;br /&gt;
                sqrtspp_new = sqrtspp_optimal&lt;br /&gt;
&lt;br /&gt;
                if (delays[0] &amp;lt; delays[1]):&lt;br /&gt;
                    sqrtspp_new = sqrtspp_optimal - 1&lt;br /&gt;
                if ((delays[2] &amp;lt; delays[1]) and (delays[2] &amp;lt; delays[0])):&lt;br /&gt;
                    sqrtspp_new = sqrtspp_optimal + 1&lt;br /&gt;
&lt;br /&gt;
                sqrtspp_optimal = sqrtspp_new&lt;br /&gt;
                sqrtspp_optimal = max(sqrtspp_optimal, 5)&lt;br /&gt;
&lt;br /&gt;
            # Compactify highscore table:&lt;br /&gt;
            soup.compactify_scores()&lt;br /&gt;
&lt;br /&gt;
        if (quitapg == False):&lt;br /&gt;
            # Save progress, upload it to Catagolue, and reset the census if successful:&lt;br /&gt;
            a = soup.save_progress(scount, rootstring, symmstring, payosha256_key=payoshakey)&lt;br /&gt;
            if (a == 0):&lt;br /&gt;
                # Reset the census:&lt;br /&gt;
                soup.reset()&lt;br /&gt;
                start_time = time.clock()&lt;br /&gt;
                f = (lambda x : &#039;abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789&#039;[ord(x) % 56])&lt;br /&gt;
                rootstring = &#039;&#039;.join(map(f, list(hashlib.sha256(rootstring + payoshakey + datetime.datetime.now().isoformat()).digest()[:12])))&lt;br /&gt;
                scount = 0&lt;br /&gt;
                number = orignumber&lt;br /&gt;
            else:&lt;br /&gt;
                number += orignumber&lt;br /&gt;
&lt;br /&gt;
    end_time = time.clock()&lt;br /&gt;
&lt;br /&gt;
    soup.save_progress(scount, rootstring, symmstring, payosha256_key=payoshakey)&lt;br /&gt;
&lt;br /&gt;
    soup.display_unids()&lt;br /&gt;
    soup.display_census(scount, rootstring, symmstring)&lt;br /&gt;
&lt;br /&gt;
def symmetry_test():&lt;br /&gt;
&lt;br /&gt;
    g.new(&amp;quot;Symmetry test&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    symmetries = [[&amp;quot;32x32&amp;quot;, &amp;quot;C1&amp;quot;, &amp;quot;8x32&amp;quot;, &amp;quot;4x64&amp;quot;, &amp;quot;2x128&amp;quot;, &amp;quot;1x256&amp;quot;],&lt;br /&gt;
                  [&amp;quot;C2_1&amp;quot;, &amp;quot;C2_2&amp;quot;, &amp;quot;C2_4&amp;quot;],&lt;br /&gt;
                  [&amp;quot;C4_1&amp;quot;, &amp;quot;C4_4&amp;quot;],&lt;br /&gt;
                  [&amp;quot;D2_+1&amp;quot;, &amp;quot;D2_+2&amp;quot;, &amp;quot;D2_x&amp;quot;],&lt;br /&gt;
                  [&amp;quot;D4_+1&amp;quot;, &amp;quot;D4_+2&amp;quot;, &amp;quot;D4_+4&amp;quot;, &amp;quot;D4_x1&amp;quot;, &amp;quot;D4_x4&amp;quot;],&lt;br /&gt;
                  [&amp;quot;D8_1&amp;quot;, &amp;quot;D8_4&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
    for i in range(len(symmetries)):&lt;br /&gt;
        for j in range(len(symmetries[i])):&lt;br /&gt;
&lt;br /&gt;
            g.putcells(hashsoup(&amp;quot;sym_test&amp;quot;, symmetries[i][j]), 120 * j + 60 * (i % 2), 80 * i)&lt;br /&gt;
    g.fit()&lt;br /&gt;
&lt;br /&gt;
# Run the soup-searching script:&lt;br /&gt;
apg_main()&lt;br /&gt;
# apg_verify()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-wwei23 10:21AM 6/25/2017 NY time&lt;br /&gt;
&lt;br /&gt;
:Thanks -- this should make it easier to ensure that if others also search these symmetries, they&#039;ll generate soups the same way!&lt;br /&gt;
&lt;br /&gt;
:And yes, eventually there won&#039;t be any new soups left to search, but that&#039;s not a concern in practice. [[User:Apple Bottom|Apple Bottom]] ([[User talk:Apple Bottom|talk]]) 09:06, 30 June 2017 (UTC)&lt;br /&gt;
&lt;br /&gt;
== More symmetries ==&lt;br /&gt;
&lt;br /&gt;
1x256X2 and 1x256X2+1 now available!&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# *************************************&lt;br /&gt;
# * Ash Pattern Generator (apgsearch) *&lt;br /&gt;
# *************************************&lt;br /&gt;
# * Version: v1.1  (beta release)     *&lt;br /&gt;
# *************************************&lt;br /&gt;
#&lt;br /&gt;
# -- Processes roughly 100 soups per (second . core . GHz), using caching&lt;br /&gt;
#    and machine-learning to optimise itself during runtime.&lt;br /&gt;
#&lt;br /&gt;
# -- Can perfectly identify oscillators with period &amp;lt; 1000, well-separated&lt;br /&gt;
#    spaceships of low period, and certain infinite-growth patterns (such&lt;br /&gt;
#    guns and puffers, including both naturally-occurring types of switch&lt;br /&gt;
#    engine).&lt;br /&gt;
#&lt;br /&gt;
# -- Separates most pseudo-objects into their constituent parts, including&lt;br /&gt;
#    all pseudo-still-lifes of 18 or fewer live cells (which is the maximum&lt;br /&gt;
#    theoretically possible, given there is a 19-cell pseudo-still-life&lt;br /&gt;
#    with two distinct decompositions).&lt;br /&gt;
#&lt;br /&gt;
# -- Correctly separates non-interacting standard spaceships, irrespective&lt;br /&gt;
#    of their proximity. In particular, a LWSS-on-LWSS is registered as two&lt;br /&gt;
#    LWSSes, whereas an LWSS-on-HWSS is registered as a single spaceship&lt;br /&gt;
#    (since they interact by suppressing sparks).&lt;br /&gt;
#&lt;br /&gt;
# -- At least 99.9999999999% reliable at identifying objects in asymmetrical&lt;br /&gt;
#    soups in B3/S23 (based on the fact that out of over 10^12 objects that&lt;br /&gt;
#    have appeared, there are no errors).&lt;br /&gt;
#&lt;br /&gt;
# -- Scores soups based on the total excitement of the ash objects.&lt;br /&gt;
#&lt;br /&gt;
# -- Support for other outer-totalistic rules, including detection and&lt;br /&gt;
#    classification of various types of infinite growth.&lt;br /&gt;
#&lt;br /&gt;
# -- Support for symmetrical soups.&lt;br /&gt;
#&lt;br /&gt;
# -- Uploads results to the server at http://catagolue.appspot.com (which&lt;br /&gt;
#    currently has collected over 2.7 * 10^12 objects).&lt;br /&gt;
#&lt;br /&gt;
# -- Peer-reviews others&#039; contributions to ensure data integrity for the&lt;br /&gt;
#    asymmetrical B3/S23 census.&lt;br /&gt;
#&lt;br /&gt;
# By Adam P. Goucher, with contributions from Andrew Trevorrow, Tom Rokicki,&lt;br /&gt;
# Nathaniel Johnston, Dave Greene and Richard Schank.&lt;br /&gt;
&lt;br /&gt;
import golly as g&lt;br /&gt;
from glife import rect, pattern&lt;br /&gt;
import time&lt;br /&gt;
import math&lt;br /&gt;
import operator&lt;br /&gt;
import hashlib&lt;br /&gt;
import datetime&lt;br /&gt;
import os&lt;br /&gt;
import urllib2&lt;br /&gt;
&lt;br /&gt;
def get_server_address():&lt;br /&gt;
    # Should be &#039;http://catagolue.appspot.com&#039; for the released version,&lt;br /&gt;
    # and &#039;http://localhost:8080&#039; for the development version:    &lt;br /&gt;
    return &#039;http://catagolue.appspot.com&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Engages with Catagolue&#039;s authentication system (&#039;payment over SHA-256&#039;,&lt;br /&gt;
# affectionately abbreviated to &#039;payosha256&#039;):&lt;br /&gt;
#&lt;br /&gt;
# The payosha256_key can be obtained from logging into Catagolue in your&lt;br /&gt;
# web browser and visiting http://catagolue.appspot.com/payosha256&lt;br /&gt;
def authenticate(payosha256_key, operation_name):&lt;br /&gt;
&lt;br /&gt;
    g.show(&amp;quot;Authenticating with Catagolue via the payosha256 protocol...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    payload = &amp;quot;payosha256:get_token:&amp;quot;+payosha256_key+&amp;quot;:&amp;quot;+operation_name&lt;br /&gt;
&lt;br /&gt;
    req = urllib2.Request(get_server_address() + &amp;quot;/payosha256&amp;quot;, payload, {&amp;quot;Content-type&amp;quot;: &amp;quot;text/plain&amp;quot;})&lt;br /&gt;
    f = urllib2.urlopen(req)&lt;br /&gt;
&lt;br /&gt;
    if (f.getcode() != 200):&lt;br /&gt;
        return None&lt;br /&gt;
&lt;br /&gt;
    resp = f.read()&lt;br /&gt;
&lt;br /&gt;
    lines = resp.splitlines()&lt;br /&gt;
&lt;br /&gt;
    for line in lines:&lt;br /&gt;
        parts = line.split(&#039;:&#039;)&lt;br /&gt;
&lt;br /&gt;
        if (len(parts) &amp;lt; 3):&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        if (parts[1] != &#039;good&#039;):&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        target = parts[2]&lt;br /&gt;
        token = parts[3]&lt;br /&gt;
&lt;br /&gt;
        g.show(&amp;quot;Token &amp;quot; + token + &amp;quot; obtained from payosha256. Performing proof of work with target &amp;quot; + target + &amp;quot;...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        for nonce in xrange(100000000):&lt;br /&gt;
&lt;br /&gt;
            prehash = token + &amp;quot;:&amp;quot; + str(nonce)&lt;br /&gt;
            posthash = hashlib.sha256(prehash).hexdigest()&lt;br /&gt;
&lt;br /&gt;
            if (posthash &amp;lt; target):&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
        if (posthash &amp;gt; target):&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        g.show(&amp;quot;String &amp;quot;+prehash+&amp;quot; is sufficiently valuable (&amp;quot;+posthash+&amp;quot; &amp;lt; &amp;quot;+target+&amp;quot;).&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        payload = &amp;quot;payosha256:pay_token:&amp;quot;+prehash+&amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        return payload&lt;br /&gt;
&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
# Sends the results to Catagolue:&lt;br /&gt;
def catagolue_results(results, payosha256_key, operation_name, endpoint=&amp;quot;/apgsearch&amp;quot;, return_point=None):&lt;br /&gt;
&lt;br /&gt;
    try:&lt;br /&gt;
&lt;br /&gt;
        payload = authenticate(payosha256_key, operation_name)&lt;br /&gt;
&lt;br /&gt;
        if payload is None:&lt;br /&gt;
            return 1&lt;br /&gt;
&lt;br /&gt;
        payload += results&lt;br /&gt;
&lt;br /&gt;
        req = urllib2.Request(get_server_address() + endpoint, payload, {&amp;quot;Content-type&amp;quot;: &amp;quot;text/plain&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
        f = urllib2.urlopen(req)&lt;br /&gt;
&lt;br /&gt;
        if (f.getcode() != 200):&lt;br /&gt;
            return 2&lt;br /&gt;
&lt;br /&gt;
        resp = f.read()&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            f2 = open(g.getdir(&amp;quot;data&amp;quot;)+&amp;quot;catagolue-response.txt&amp;quot;, &#039;w&#039;)&lt;br /&gt;
            f2.write(resp)&lt;br /&gt;
            f2.close()&lt;br /&gt;
&lt;br /&gt;
            if return_point is not None:&lt;br /&gt;
                return_point[0] = resp&lt;br /&gt;
            &lt;br /&gt;
        except:&lt;br /&gt;
            g.warn(&amp;quot;Unable to save catagolue response file.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        return 0&lt;br /&gt;
&lt;br /&gt;
    except:&lt;br /&gt;
&lt;br /&gt;
        return 1&lt;br /&gt;
&lt;br /&gt;
# Takes approximately 350 microseconds to construct a 16-by-16 soup based&lt;br /&gt;
# on a SHA-256 cryptographic hash in the obvious way.&lt;br /&gt;
def hashsoup(instring, sym):&lt;br /&gt;
&lt;br /&gt;
    s = hashlib.sha256(instring).digest()&lt;br /&gt;
&lt;br /&gt;
    thesoup = []&lt;br /&gt;
&lt;br /&gt;
    if sym in [&#039;D2_x&#039;, &#039;D8_1&#039;, &#039;D8_4&#039;]:&lt;br /&gt;
        d = 1&lt;br /&gt;
    elif sym in [&#039;D4_x1&#039;, &#039;D4_x4&#039;]:&lt;br /&gt;
        d = 2&lt;br /&gt;
    else:&lt;br /&gt;
        d = 0&lt;br /&gt;
        &lt;br /&gt;
    for j in xrange(32):&lt;br /&gt;
&lt;br /&gt;
        t = ord(s[j])&lt;br /&gt;
&lt;br /&gt;
        for k in xrange(8):&lt;br /&gt;
&lt;br /&gt;
            if (sym == &#039;8x32&#039;):&lt;br /&gt;
                &lt;br /&gt;
                x = k + 8*(j % 4)&lt;br /&gt;
                y = int(j / 4)&lt;br /&gt;
                &lt;br /&gt;
            elif (sym == &#039;4x64&#039;):&lt;br /&gt;
                &lt;br /&gt;
                x = k + 8*(j % 8)&lt;br /&gt;
                y = int(j / 8)&lt;br /&gt;
        &lt;br /&gt;
            elif (sym == &#039;2x128&#039;):&lt;br /&gt;
                &lt;br /&gt;
                x = k + 8*(j % 16)&lt;br /&gt;
                y = int(j / 16)&lt;br /&gt;
                &lt;br /&gt;
            elif (sym in [&#039;1x256&#039;, &#039;1x256X2&#039;, &#039;1x256X2+1&#039;]):&lt;br /&gt;
                &lt;br /&gt;
                x = k + 8*(j % 32)&lt;br /&gt;
                y = int(j / 32)&lt;br /&gt;
                &lt;br /&gt;
            else:&lt;br /&gt;
                &lt;br /&gt;
                x = k + 8*(j % 2)&lt;br /&gt;
                y = int(j / 2)&lt;br /&gt;
&lt;br /&gt;
            if (t &amp;amp; (1 &amp;lt;&amp;lt; (7 - k))):&lt;br /&gt;
                &lt;br /&gt;
                if ((d == 0) | (x &amp;gt;= y)):&lt;br /&gt;
&lt;br /&gt;
                    thesoup.append(x)&lt;br /&gt;
                    thesoup.append(y)&lt;br /&gt;
&lt;br /&gt;
                if (sym == &#039;1x256X2+1&#039;):&lt;br /&gt;
&lt;br /&gt;
                    thesoup.append(-x)&lt;br /&gt;
                    thesoup.append(y)&lt;br /&gt;
&lt;br /&gt;
                if (sym == &#039;1x256X2&#039;):&lt;br /&gt;
&lt;br /&gt;
                    thesoup.append(-1-x)&lt;br /&gt;
                    thesoup.append(y)&lt;br /&gt;
                &lt;br /&gt;
                if (sym == &#039;32x32&#039;):&lt;br /&gt;
&lt;br /&gt;
                    thesoup.append(x+16)&lt;br /&gt;
                    thesoup.append(y)&lt;br /&gt;
                    thesoup.append(x)&lt;br /&gt;
                    thesoup.append(y+16)&lt;br /&gt;
                    thesoup.append(x+16)&lt;br /&gt;
                    thesoup.append(y+16)&lt;br /&gt;
&lt;br /&gt;
                if (sym == &#039;75p&#039;):&lt;br /&gt;
&lt;br /&gt;
                    thesoup.append(16-y)&lt;br /&gt;
                    thesoup.append(x)&lt;br /&gt;
&lt;br /&gt;
                elif (sym == &#039;D4_x1&#039;):&lt;br /&gt;
&lt;br /&gt;
                    thesoup.append(y)&lt;br /&gt;
                    thesoup.append(-x)&lt;br /&gt;
&lt;br /&gt;
                elif (sym == &#039;D4_x4&#039;):&lt;br /&gt;
&lt;br /&gt;
                    thesoup.append(y)&lt;br /&gt;
                    thesoup.append(-x-1)&lt;br /&gt;
&lt;br /&gt;
                if ((sym == &#039;D4_x1&#039;) &amp;amp; (x == y)):&lt;br /&gt;
&lt;br /&gt;
                    thesoup.append(y)&lt;br /&gt;
                    thesoup.append(-x)&lt;br /&gt;
&lt;br /&gt;
                if ((sym == &#039;D4_x4&#039;) &amp;amp; (x == y)):&lt;br /&gt;
&lt;br /&gt;
                    thesoup.append(y)&lt;br /&gt;
                    thesoup.append(-x-1)&lt;br /&gt;
&lt;br /&gt;
    # Checks for diagonal symmetries:&lt;br /&gt;
    if (d &amp;gt;= 1):&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(thesoup[x+1])&lt;br /&gt;
            thesoup.append(thesoup[x])&lt;br /&gt;
        if d == 2:&lt;br /&gt;
            if (sym == &#039;D4_x1&#039;):&lt;br /&gt;
                for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
                    thesoup.append(-thesoup[x+1])&lt;br /&gt;
                    thesoup.append(-thesoup[x])&lt;br /&gt;
            else:&lt;br /&gt;
                for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
                    thesoup.append(-thesoup[x+1] - 1)&lt;br /&gt;
                    thesoup.append(-thesoup[x] - 1)&lt;br /&gt;
            return thesoup&lt;br /&gt;
&lt;br /&gt;
    # Checks for orthogonal x symmetry:&lt;br /&gt;
    if sym in [&#039;D2_+1&#039;, &#039;D4_+1&#039;, &#039;D4_+2&#039;]:&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(thesoup[x])&lt;br /&gt;
            thesoup.append(-thesoup[x+1])&lt;br /&gt;
    elif sym in [&#039;D2_+2&#039;, &#039;D4_+4&#039;]:&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(thesoup[x])&lt;br /&gt;
            thesoup.append(-thesoup[x+1] - 1)&lt;br /&gt;
&lt;br /&gt;
    # Checks for orthogonal y symmetry:&lt;br /&gt;
    if sym in [&#039;D4_+1&#039;]:&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(-thesoup[x])&lt;br /&gt;
            thesoup.append(thesoup[x+1])&lt;br /&gt;
    elif sym in [&#039;D4_+2&#039;, &#039;D4_+4&#039;]:&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(-thesoup[x] - 1)&lt;br /&gt;
            thesoup.append(thesoup[x+1])&lt;br /&gt;
&lt;br /&gt;
    # Checks for rotate2 symmetry:&lt;br /&gt;
    if sym in [&#039;C2_1&#039;, &#039;C4_1&#039;, &#039;D8_1&#039;]:&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(-thesoup[x])&lt;br /&gt;
            thesoup.append(-thesoup[x+1])&lt;br /&gt;
    elif sym in [&#039;C2_2&#039;]:&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(-thesoup[x])&lt;br /&gt;
            thesoup.append(-thesoup[x+1]-1)&lt;br /&gt;
    elif sym in [&#039;C2_4&#039;, &#039;C4_4&#039;, &#039;D8_4&#039;]:&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(-thesoup[x]-1)&lt;br /&gt;
            thesoup.append(-thesoup[x+1]-1)&lt;br /&gt;
&lt;br /&gt;
    # Checks for rotate4 symmetry:&lt;br /&gt;
    if (sym in [&#039;C4_1&#039;, &#039;D8_1&#039;]):&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(thesoup[x+1])&lt;br /&gt;
            thesoup.append(-thesoup[x])&lt;br /&gt;
    elif (sym in [&#039;C4_4&#039;, &#039;D8_4&#039;]):&lt;br /&gt;
        for x in xrange(0, len(thesoup), 2):&lt;br /&gt;
            thesoup.append(thesoup[x+1])&lt;br /&gt;
            thesoup.append(-thesoup[x]-1)&lt;br /&gt;
&lt;br /&gt;
    return thesoup&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Obtains a canonical representation of any oscillator/spaceship that (in&lt;br /&gt;
# some phase) fits within a 40-by-40 bounding box. This representation is&lt;br /&gt;
# alphanumeric and lowercase, and so much more compact than RLE. Compare:&lt;br /&gt;
#&lt;br /&gt;
# Common name: pentadecathlon&lt;br /&gt;
# Canonical representation: 4r4z4r4&lt;br /&gt;
# Equivalent RLE: 2bo4bo$2ob4ob2o$2bo4bo!&lt;br /&gt;
#&lt;br /&gt;
# It is a generalisation of a notation created by Allan Weschler in 1992.&lt;br /&gt;
def canonise(duration):&lt;br /&gt;
&lt;br /&gt;
    representation = &amp;quot;#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # We need to compare each phase to find the one with the smallest&lt;br /&gt;
    # description:&lt;br /&gt;
    for t in xrange(duration):&lt;br /&gt;
&lt;br /&gt;
        rect = g.getrect()&lt;br /&gt;
        if (len(rect) == 0):&lt;br /&gt;
            return &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        if ((rect[2] &amp;lt;= 40) &amp;amp; (rect[3] &amp;lt;= 40)):&lt;br /&gt;
            # Fits within a 40-by-40 bounding box, so eligible to be canonised.&lt;br /&gt;
            # Choose the orientation which results in the smallest description:&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[2], rect[3], rect[0], rect[1], 1, 0, 0, 1))&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[2], rect[3], rect[0]+rect[2]-1, rect[1], -1, 0, 0, 1))&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[2], rect[3], rect[0], rect[1]+rect[3]-1, 1, 0, 0, -1))&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[2], rect[3], rect[0]+rect[2]-1, rect[1]+rect[3]-1, -1, 0, 0, -1))&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[3], rect[2], rect[0], rect[1], 0, 1, 1, 0))&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[3], rect[2], rect[0]+rect[2]-1, rect[1], 0, -1, 1, 0))&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[3], rect[2], rect[0], rect[1]+rect[3]-1, 0, 1, -1, 0))&lt;br /&gt;
            representation = compare_representations(representation, canonise_orientation(rect[3], rect[2], rect[0]+rect[2]-1, rect[1]+rect[3]-1, 0, -1, -1, 0))&lt;br /&gt;
&lt;br /&gt;
        g.run(1)&lt;br /&gt;
&lt;br /&gt;
    return representation&lt;br /&gt;
&lt;br /&gt;
# A subroutine used by canonise:&lt;br /&gt;
def canonise_orientation(length, breadth, ox, oy, a, b, c, d):&lt;br /&gt;
&lt;br /&gt;
    representation = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    chars = &amp;quot;0123456789abcdefghijklmnopqrstuvwxyz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    for v in xrange(int((breadth-1)/5)+1):&lt;br /&gt;
        zeroes = 0&lt;br /&gt;
        if (v != 0):&lt;br /&gt;
            representation += &amp;quot;z&amp;quot;&lt;br /&gt;
        for u in xrange(length):&lt;br /&gt;
            baudot = 0&lt;br /&gt;
            for w in xrange(5):&lt;br /&gt;
                x = ox + a*u + b*(5*v + w)&lt;br /&gt;
                y = oy + c*u + d*(5*v + w)&lt;br /&gt;
                baudot = (baudot &amp;gt;&amp;gt; 1) + 16*g.getcell(x, y)&lt;br /&gt;
            if (baudot == 0):&lt;br /&gt;
                zeroes += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if (zeroes &amp;gt; 0):&lt;br /&gt;
                    if (zeroes == 1):&lt;br /&gt;
                        representation += &amp;quot;0&amp;quot;&lt;br /&gt;
                    elif (zeroes == 2):&lt;br /&gt;
                        representation += &amp;quot;w&amp;quot;&lt;br /&gt;
                    elif (zeroes == 3):&lt;br /&gt;
                        representation += &amp;quot;x&amp;quot;&lt;br /&gt;
                    else:&lt;br /&gt;
                        representation += &amp;quot;y&amp;quot;&lt;br /&gt;
                        representation += chars[zeroes - 4]&lt;br /&gt;
                zeroes = 0&lt;br /&gt;
                representation += chars[baudot]&lt;br /&gt;
    return representation&lt;br /&gt;
&lt;br /&gt;
# Compares strings first by length, then by lexicographical ordering.&lt;br /&gt;
# A hash character is worse than anything else.&lt;br /&gt;
def compare_representations(a, b):&lt;br /&gt;
&lt;br /&gt;
    if (a == &amp;quot;#&amp;quot;):&lt;br /&gt;
        return b&lt;br /&gt;
    elif (b == &amp;quot;#&amp;quot;):&lt;br /&gt;
        return a&lt;br /&gt;
    elif (len(a) &amp;lt; len(b)):&lt;br /&gt;
        return a&lt;br /&gt;
    elif (len(b) &amp;lt; len(a)):&lt;br /&gt;
        return b&lt;br /&gt;
    elif (a &amp;lt; b):&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return b&lt;br /&gt;
&lt;br /&gt;
# Finds the gradient of the least-squares regression line corresponding&lt;br /&gt;
# to a list of ordered pairs:&lt;br /&gt;
def regress(pairlist):&lt;br /&gt;
&lt;br /&gt;
    cumx = 0.0&lt;br /&gt;
    cumy = 0.0&lt;br /&gt;
    cumvar = 0.0&lt;br /&gt;
    cumcov = 0.0&lt;br /&gt;
&lt;br /&gt;
    for x,y in pairlist:&lt;br /&gt;
&lt;br /&gt;
        cumx += x&lt;br /&gt;
        cumy += y&lt;br /&gt;
&lt;br /&gt;
    cumx = cumx / len(pairlist)&lt;br /&gt;
    cumy = cumy / len(pairlist)&lt;br /&gt;
&lt;br /&gt;
    for x,y in pairlist:&lt;br /&gt;
&lt;br /&gt;
        cumvar += (x - cumx)*(x - cumx)&lt;br /&gt;
        cumcov += (x - cumx)*(y - cumy)&lt;br /&gt;
&lt;br /&gt;
    return (cumcov / cumvar)&lt;br /&gt;
&lt;br /&gt;
# Analyses a pattern whose average population follows a power-law:&lt;br /&gt;
def powerlyse(stepsize, numsteps):&lt;br /&gt;
&lt;br /&gt;
    g.setalgo(&amp;quot;HashLife&amp;quot;)&lt;br /&gt;
    g.setbase(2)&lt;br /&gt;
    g.setstep(stepsize)&lt;br /&gt;
&lt;br /&gt;
    poplist = [0]*numsteps&lt;br /&gt;
&lt;br /&gt;
    poplist[0] = int(g.getpop())&lt;br /&gt;
&lt;br /&gt;
    pointlist = []&lt;br /&gt;
&lt;br /&gt;
    for i in xrange(1, numsteps, 1):&lt;br /&gt;
&lt;br /&gt;
        g.step()&lt;br /&gt;
        poplist[i] = int(g.getpop()) + poplist[i-1]&lt;br /&gt;
&lt;br /&gt;
        if (i % 50 == 0):&lt;br /&gt;
&lt;br /&gt;
            g.fit()&lt;br /&gt;
            g.update()&lt;br /&gt;
&lt;br /&gt;
        if (i &amp;gt; numsteps/2):&lt;br /&gt;
&lt;br /&gt;
            pointlist.append((math.log(i),math.log(poplist[i]+1.0)))&lt;br /&gt;
&lt;br /&gt;
    power = regress(pointlist)&lt;br /&gt;
&lt;br /&gt;
    if (power &amp;lt; 1.10):&lt;br /&gt;
        return &amp;quot;unidentified&amp;quot;&lt;br /&gt;
    elif (power &amp;lt; 1.65):&lt;br /&gt;
        return &amp;quot;zz_REPLICATOR&amp;quot;&lt;br /&gt;
    elif (power &amp;lt; 2.05):&lt;br /&gt;
        return &amp;quot;zz_LINEAR&amp;quot;&lt;br /&gt;
    elif (power &amp;lt; 2.8):&lt;br /&gt;
        return &amp;quot;zz_EXPLOSIVE&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        return &amp;quot;zz_QUADRATIC&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Gets the period of an interleaving of degree-d polynomials:&lt;br /&gt;
def deepperiod(sequence, maxperiod, degree):&lt;br /&gt;
&lt;br /&gt;
    for p in xrange(1, maxperiod, 1):&lt;br /&gt;
&lt;br /&gt;
        good = True&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(maxperiod):&lt;br /&gt;
&lt;br /&gt;
            diffs = [0] * (degree + 2)&lt;br /&gt;
            for j in xrange(degree + 2):&lt;br /&gt;
&lt;br /&gt;
                diffs[j] = sequence[i + j*p]&lt;br /&gt;
&lt;br /&gt;
            # Produce successive differences:&lt;br /&gt;
            for j in xrange(degree + 1):&lt;br /&gt;
                for k in xrange(degree + 1):&lt;br /&gt;
                    diffs[k] = diffs[k] - diffs[k + 1]&lt;br /&gt;
&lt;br /&gt;
            if (diffs[0] != 0):&lt;br /&gt;
                good = False&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
        if (good):&lt;br /&gt;
            return p&lt;br /&gt;
    return -1&lt;br /&gt;
&lt;br /&gt;
# Analyses a linear-growth pattern, returning a hash:&lt;br /&gt;
def linearlyse(maxperiod):&lt;br /&gt;
&lt;br /&gt;
    poplist = [0]*(3*maxperiod)&lt;br /&gt;
&lt;br /&gt;
    for i in xrange(3*maxperiod):&lt;br /&gt;
&lt;br /&gt;
        g.run(1)&lt;br /&gt;
        poplist[i] = int(g.getpop())&lt;br /&gt;
&lt;br /&gt;
    p = deepperiod(poplist, maxperiod, 1)&lt;br /&gt;
&lt;br /&gt;
    if (p == -1):&lt;br /&gt;
        return &amp;quot;unidentified&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    difflist = [0]*(2*maxperiod)&lt;br /&gt;
&lt;br /&gt;
    for i in xrange(2*maxperiod):&lt;br /&gt;
&lt;br /&gt;
        difflist[i] = poplist[i + p] - poplist[i]&lt;br /&gt;
&lt;br /&gt;
    q = deepperiod(difflist, maxperiod, 0)&lt;br /&gt;
&lt;br /&gt;
    moments = [0, 0, 0]&lt;br /&gt;
&lt;br /&gt;
    for i in xrange(p):&lt;br /&gt;
&lt;br /&gt;
        moments[0] += (poplist[i + q] - poplist[i])&lt;br /&gt;
        moments[1] += (poplist[i + q] - poplist[i]) ** 2&lt;br /&gt;
        moments[2] += (poplist[i + q] - poplist[i]) ** 3&lt;br /&gt;
&lt;br /&gt;
    prehash = str(moments[1]) + &amp;quot;#&amp;quot; + str(moments[2])&lt;br /&gt;
&lt;br /&gt;
    # Linear-growth patterns with growth rate zero are clearly errors!&lt;br /&gt;
    if (moments[0] == 0):&lt;br /&gt;
        return &amp;quot;unidentified&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;yl&amp;quot; + str(p) + &amp;quot;_&amp;quot; + str(q) + &amp;quot;_&amp;quot; + str(moments[0]) + &amp;quot;_&amp;quot; + hashlib.md5(prehash).hexdigest()&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
# This explodes pseudo-still-lifes and pseudo-oscillators into their&lt;br /&gt;
# constituent parts.&lt;br /&gt;
#&lt;br /&gt;
# -- Requires the period (if oscillatory) and graph-theoretic diameter&lt;br /&gt;
#    to not exceed 4096.&lt;br /&gt;
# -- Never mistakenly separates a true object.&lt;br /&gt;
# -- Correctly separates most pseudo-still-lifes, including the famous:&lt;br /&gt;
#    http://www.conwaylife.com/wiki/Quad_pseudo_still_life&lt;br /&gt;
# -- Works perfectly for all still-lifes of up to 17 bits.&lt;br /&gt;
# -- Doesn&#039;t separate &#039;locks&#039;, of which the smallest example has 18&lt;br /&gt;
#    bits and is unique:&lt;br /&gt;
#&lt;br /&gt;
#     ** **&lt;br /&gt;
#     ** **&lt;br /&gt;
#&lt;br /&gt;
#    * *** *&lt;br /&gt;
#    ** * **&lt;br /&gt;
#&lt;br /&gt;
# To use this function (standalone), merely copy it into a script of&lt;br /&gt;
# the following form:&lt;br /&gt;
#&lt;br /&gt;
#   import golly as g&lt;br /&gt;
#&lt;br /&gt;
#   def pseudo_bangbang():&lt;br /&gt;
#&lt;br /&gt;
#   [...]&lt;br /&gt;
#&lt;br /&gt;
#   pseudo_bangbang()&lt;br /&gt;
#&lt;br /&gt;
# and execute it in Golly with a B3/S23 universe containing any still-&lt;br /&gt;
# lifes or oscillators you want to separate. Pure objects correspond to&lt;br /&gt;
# connected components in the final state of the universe.&lt;br /&gt;
#&lt;br /&gt;
# This has dependencies on the rules ContagiousLife, PercolateInfection&lt;br /&gt;
# and EradicateInfection.&lt;br /&gt;
#&lt;br /&gt;
# Not to be confused with the Unix shell instruction for repeating the&lt;br /&gt;
# previous instruction as a superuser (sudo !!), or indeed with any&lt;br /&gt;
# parodies of this song: https://www.youtube.com/watch?v=YswhUHH6Ufc&lt;br /&gt;
#&lt;br /&gt;
# Adam P. Goucher, 2014-08-25&lt;br /&gt;
def pseudo_bangbang(alpharule):&lt;br /&gt;
&lt;br /&gt;
    g.setrule(&amp;quot;APG_ContagiousLife_&amp;quot; + alpharule)&lt;br /&gt;
    g.setbase(2)&lt;br /&gt;
    g.setstep(12)&lt;br /&gt;
    g.step()&lt;br /&gt;
&lt;br /&gt;
    celllist = g.getcells(g.getrect())&lt;br /&gt;
&lt;br /&gt;
    for i in xrange(0, len(celllist)-1, 3):&lt;br /&gt;
        &lt;br /&gt;
        # Only infect cells that haven&#039;t yet been infected:&lt;br /&gt;
        if (g.getcell(celllist[i], celllist[i+1]) &amp;lt;= 2):&lt;br /&gt;
&lt;br /&gt;
            # Seed an initial &#039;infected&#039; (red) cell:&lt;br /&gt;
            g.setcell(celllist[i], celllist[i+1], g.getcell(celllist[i], celllist[i+1]) + 2)&lt;br /&gt;
&lt;br /&gt;
            prevpop = 0&lt;br /&gt;
            currpop = int(g.getpop())&lt;br /&gt;
&lt;br /&gt;
            # Continue infecting until the entire component has been engulfed:&lt;br /&gt;
            while (prevpop != currpop):&lt;br /&gt;
&lt;br /&gt;
                # Percolate the infection to every cell in the island:&lt;br /&gt;
                g.setrule(&amp;quot;APG_PercolateInfection&amp;quot;)&lt;br /&gt;
                g.setbase(2)&lt;br /&gt;
                g.setstep(12)&lt;br /&gt;
                g.step()&lt;br /&gt;
&lt;br /&gt;
                # Transmit the infection across any bridges.&lt;br /&gt;
                g.setrule(&amp;quot;APG_ContagiousLife_&amp;quot; + alpharule)&lt;br /&gt;
                g.setbase(2)&lt;br /&gt;
                g.setstep(12)&lt;br /&gt;
                g.step()&lt;br /&gt;
&lt;br /&gt;
                prevpop = currpop&lt;br /&gt;
                currpop = int(g.getpop())&lt;br /&gt;
                &lt;br /&gt;
            g.fit()&lt;br /&gt;
            g.update()&lt;br /&gt;
&lt;br /&gt;
            # Red becomes green:&lt;br /&gt;
            g.setrule(&amp;quot;APG_EradicateInfection&amp;quot;)&lt;br /&gt;
            g.step()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Counts the number of live cells of each degree:&lt;br /&gt;
def degreecount():&lt;br /&gt;
&lt;br /&gt;
    celllist = g.getcells(g.getrect())&lt;br /&gt;
    counts = [0,0,0,0,0,0,0,0,0]&lt;br /&gt;
&lt;br /&gt;
    for i in xrange(0, len(celllist), 2):&lt;br /&gt;
&lt;br /&gt;
        x = celllist[i]&lt;br /&gt;
        y = celllist[i+1]&lt;br /&gt;
&lt;br /&gt;
        degree = -1&lt;br /&gt;
&lt;br /&gt;
        for ux in xrange(x - 1, x + 2):&lt;br /&gt;
            for uy in xrange(y - 1, y + 2):&lt;br /&gt;
&lt;br /&gt;
                degree += g.getcell(ux, uy)&lt;br /&gt;
&lt;br /&gt;
        counts[degree] += 1&lt;br /&gt;
&lt;br /&gt;
    return counts&lt;br /&gt;
&lt;br /&gt;
# Counts the number of live cells of each degree in generations 1 and 2:&lt;br /&gt;
def degreecount2():&lt;br /&gt;
&lt;br /&gt;
    g.run(1)&lt;br /&gt;
    a = degreecount()&lt;br /&gt;
    g.run(1)&lt;br /&gt;
    b = degreecount()&lt;br /&gt;
&lt;br /&gt;
    return (a + b)&lt;br /&gt;
&lt;br /&gt;
# If the universe consists only of disjoint *WSSes, this will return&lt;br /&gt;
# a triple (l, w, h) giving the quantities of each *WSS. Otherwise,&lt;br /&gt;
# this function will return (-1, -1, -1).&lt;br /&gt;
#&lt;br /&gt;
# This should only be used to separate period-4 moving objects which&lt;br /&gt;
# may contain multiple *WSSes.&lt;br /&gt;
def countxwsses():&lt;br /&gt;
&lt;br /&gt;
    degcount = degreecount2()&lt;br /&gt;
    if (degreecount2() != degcount):&lt;br /&gt;
        # Degree counts are not period-2:&lt;br /&gt;
        return (-1, -1, -1)&lt;br /&gt;
&lt;br /&gt;
    # Degree counts of each standard spaceship:&lt;br /&gt;
    hwssa = [1,4,6,2,0,0,0,0,0,0,0,0,4,4,6,1,2,1]&lt;br /&gt;
    mwssa = [2,2,5,2,0,0,0,0,0,0,0,0,4,4,4,1,2,0]&lt;br /&gt;
    lwssa = [1,2,4,2,0,0,0,0,0,0,0,0,4,4,2,2,0,0]&lt;br /&gt;
    hwssb = [0,0,0,4,4,6,1,2,1,1,4,6,2,0,0,0,0,0]&lt;br /&gt;
    mwssb = [0,0,0,4,4,4,1,2,0,2,2,5,2,0,0,0,0,0]&lt;br /&gt;
    lwssb = [0,0,0,4,4,2,2,0,0,1,2,4,2,0,0,0,0,0]&lt;br /&gt;
&lt;br /&gt;
    # Calculate the number of standard spaceships in each phase:&lt;br /&gt;
    hacount = degcount[17]&lt;br /&gt;
    macount = degcount[16]/2 - hacount&lt;br /&gt;
    lacount = (degcount[15] - hacount - macount)/2&lt;br /&gt;
    hbcount = degcount[8]&lt;br /&gt;
    mbcount = degcount[7]/2 - hbcount&lt;br /&gt;
    lbcount = (degcount[6] - hbcount - mbcount)/2&lt;br /&gt;
&lt;br /&gt;
    # Determine the expected degcount given the calculated quantities:&lt;br /&gt;
    pcounts = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]&lt;br /&gt;
    pcounts = map(lambda x, y: x + y, pcounts, map(lambda x: hacount*x, hwssa))&lt;br /&gt;
    pcounts = map(lambda x, y: x + y, pcounts, map(lambda x: macount*x, mwssa))&lt;br /&gt;
    pcounts = map(lambda x, y: x + y, pcounts, map(lambda x: lacount*x, lwssa))&lt;br /&gt;
    pcounts = map(lambda x, y: x + y, pcounts, map(lambda x: hbcount*x, hwssb))&lt;br /&gt;
    pcounts = map(lambda x, y: x + y, pcounts, map(lambda x: mbcount*x, mwssb))&lt;br /&gt;
    pcounts = map(lambda x, y: x + y, pcounts, map(lambda x: lbcount*x, lwssb))&lt;br /&gt;
&lt;br /&gt;
    # Compare the observed and expected degcounts (to eliminate nonstandard spaceships):&lt;br /&gt;
    if (pcounts != degcount):&lt;br /&gt;
        # Expected and observed values do not match:&lt;br /&gt;
        return (-1, -1, -1)&lt;br /&gt;
&lt;br /&gt;
    # Return the combined numbers of *WSSes:&lt;br /&gt;
    return(lacount + lbcount, macount + mbcount, hacount + hbcount)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Generates the helper rules for apgsearch, given a base outer-totalistic rule.&lt;br /&gt;
class RuleGenerator:&lt;br /&gt;
&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
&lt;br /&gt;
        # Unless otherwise specified, assume standard B3/S23 rule:&lt;br /&gt;
        self.bee = [False, False, False, True, False, False, False, False, False]&lt;br /&gt;
        self.ess = [False, False, True, True, False, False, False, False, False]&lt;br /&gt;
        self.alphanumeric = &amp;quot;B3S23&amp;quot;&lt;br /&gt;
        self.slashed = &amp;quot;B3/S23&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Save all helper rules:&lt;br /&gt;
    def saveAllRules(self):&lt;br /&gt;
&lt;br /&gt;
        self.saveClassifyObjects()&lt;br /&gt;
        self.saveCoalesceObjects()&lt;br /&gt;
        self.saveExpungeObjects()&lt;br /&gt;
        self.saveExpungeGliders()&lt;br /&gt;
        self.saveIdentifyGliders()&lt;br /&gt;
        self.saveHandlePlumes()&lt;br /&gt;
        self.savePercolateInfection()&lt;br /&gt;
        self.saveEradicateInfection()&lt;br /&gt;
        self.saveContagiousLife()&lt;br /&gt;
&lt;br /&gt;
    # Set outer-totalistic rule:&lt;br /&gt;
    def setrule(self, rulestring):&lt;br /&gt;
&lt;br /&gt;
        mode = 0&lt;br /&gt;
        s = [False]*9&lt;br /&gt;
        b = [False]*9&lt;br /&gt;
&lt;br /&gt;
        for c in rulestring:&lt;br /&gt;
&lt;br /&gt;
            if ((c == &#039;s&#039;) | (c == &#039;S&#039;)):&lt;br /&gt;
                mode = 0&lt;br /&gt;
&lt;br /&gt;
            if ((c == &#039;b&#039;) | (c == &#039;B&#039;)):&lt;br /&gt;
                mode = 1&lt;br /&gt;
&lt;br /&gt;
            if (c == &#039;/&#039;):&lt;br /&gt;
                mode = 1 - mode&lt;br /&gt;
&lt;br /&gt;
            if ((ord(c) &amp;gt;= 48) &amp;amp; (ord(c) &amp;lt;= 56)):&lt;br /&gt;
                d = ord(c) - 48&lt;br /&gt;
                if (mode == 0):&lt;br /&gt;
                    s[d] = True&lt;br /&gt;
                else:&lt;br /&gt;
                    b[d] = True&lt;br /&gt;
&lt;br /&gt;
        prefix = &amp;quot;B&amp;quot;&lt;br /&gt;
        suffix = &amp;quot;S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(9):&lt;br /&gt;
            if (b[i]):&lt;br /&gt;
                prefix += str(i)&lt;br /&gt;
            if (s[i]):&lt;br /&gt;
                suffix += str(i)&lt;br /&gt;
&lt;br /&gt;
        self.alphanumeric = prefix + suffix&lt;br /&gt;
        self.slashed = prefix + &amp;quot;/&amp;quot; + suffix&lt;br /&gt;
        self.bee = b&lt;br /&gt;
        self.ess = s&lt;br /&gt;
&lt;br /&gt;
    # Save a rule file:&lt;br /&gt;
    def saverule(self, name, comments, table, colours):&lt;br /&gt;
&lt;br /&gt;
        ruledir = g.getdir(&amp;quot;rules&amp;quot;)&lt;br /&gt;
        filename = ruledir + name + &amp;quot;.rule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        results = &amp;quot;@RULE &amp;quot; + name + &amp;quot;\n\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;*** File autogenerated by saverule. ***\n\n&amp;quot;&lt;br /&gt;
        results += comments&lt;br /&gt;
        results += &amp;quot;\n\n@TABLE\n\n&amp;quot;&lt;br /&gt;
        results += table&lt;br /&gt;
        results += &amp;quot;\n\n@COLORS\n\n&amp;quot;&lt;br /&gt;
        results += colours&lt;br /&gt;
&lt;br /&gt;
        # Only create a rule file if it doesn&#039;t already exist; this avoids&lt;br /&gt;
        # concurrency issues when booting an instance of apgsearch whilst&lt;br /&gt;
        # one is already running.&lt;br /&gt;
        if not os.path.exists(filename):&lt;br /&gt;
            try:&lt;br /&gt;
                f = open(filename, &#039;w&#039;)&lt;br /&gt;
                f.write(results)&lt;br /&gt;
                f.close()&lt;br /&gt;
            except:&lt;br /&gt;
                g.warn(&amp;quot;Unable to create rule table:\n&amp;quot; + filename)&lt;br /&gt;
&lt;br /&gt;
    # Defines a variable:&lt;br /&gt;
    def newvar(self, name, vallist):&lt;br /&gt;
&lt;br /&gt;
        line = &amp;quot;var &amp;quot;+name+&amp;quot;={&amp;quot;&lt;br /&gt;
        for i in xrange(len(vallist)):&lt;br /&gt;
            if (i &amp;gt; 0):&lt;br /&gt;
                line += &#039;,&#039;&lt;br /&gt;
            line += str(vallist[i])&lt;br /&gt;
        line += &amp;quot;}\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        return line&lt;br /&gt;
&lt;br /&gt;
    # Defines a block of equivalent variables:&lt;br /&gt;
    def newvars(self, namelist, vallist):&lt;br /&gt;
&lt;br /&gt;
        block = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        for name in namelist:&lt;br /&gt;
            block += self.newvar(name, vallist)&lt;br /&gt;
&lt;br /&gt;
        block += &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        return block&lt;br /&gt;
&lt;br /&gt;
    def scoline(self, chara, charb, left, right, amount):&lt;br /&gt;
&lt;br /&gt;
        line = str(left) + &amp;quot;,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(8):&lt;br /&gt;
            if (i &amp;lt; amount):&lt;br /&gt;
                line += chara&lt;br /&gt;
            else:&lt;br /&gt;
                line += charb&lt;br /&gt;
            line += chr(97 + i)&lt;br /&gt;
            line += &amp;quot;,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        line += str(right) + &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        return line&lt;br /&gt;
&lt;br /&gt;
    def saveHandlePlumes(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
This post-processes the output of ClassifyObjects to remove any&lt;br /&gt;
unwanted clustering of low-period objects appearing in puffer&lt;br /&gt;
exhaust.&lt;br /&gt;
&lt;br /&gt;
state 0:  vacuum&lt;br /&gt;
&lt;br /&gt;
state 7:  ON, still-life&lt;br /&gt;
state 8:  OFF, still-life&lt;br /&gt;
&lt;br /&gt;
state 9:  ON, p2 oscillator&lt;br /&gt;
state 10: OFF, p2 oscillator&lt;br /&gt;
&lt;br /&gt;
state 11: ON, higher-period object&lt;br /&gt;
state 12: OFF, higher-period object&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
n_states:17&lt;br /&gt;
neighborhood:Moore&lt;br /&gt;
symmetries:permute&lt;br /&gt;
&lt;br /&gt;
var da={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
var db={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
var dc={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
var dd={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
var de={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
var df={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
var dg={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
var dh={0,2,4,6,8,10,12,14,16}&lt;br /&gt;
&lt;br /&gt;
var a={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var b={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var c={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var d={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var e={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var f={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var g={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var h={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8,da,db,dc,dd,de,df,dg,dh,0&lt;br /&gt;
10,da,db,dc,dd,de,df,dg,dh,0&lt;br /&gt;
&lt;br /&gt;
9,a,b,c,d,e,f,g,h,1&lt;br /&gt;
10,a,b,c,d,e,f,g,h,2&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
1  255  255  255&lt;br /&gt;
2  127  127  127&lt;br /&gt;
7    0    0  255&lt;br /&gt;
8    0    0  127&lt;br /&gt;
9  255    0    0&lt;br /&gt;
10 127    0    0&lt;br /&gt;
11   0  255    0&lt;br /&gt;
12   0  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_HandlePlumesCorrected&amp;quot;, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
    def saveExpungeGliders(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
This removes unwanted gliders.&lt;br /&gt;
It is mandatory that one first runs the rules CoalesceObjects,&lt;br /&gt;
IdentifyGliders and ClassifyObjects.&lt;br /&gt;
&lt;br /&gt;
Run this for two generations, and observe the population&lt;br /&gt;
counts after 1 and 2 generations. This will give the&lt;br /&gt;
following data:&lt;br /&gt;
&lt;br /&gt;
number of gliders = (p(1) - p(2))/5&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
n_states:17&lt;br /&gt;
neighborhood:Moore&lt;br /&gt;
symmetries:rotate4reflect&lt;br /&gt;
&lt;br /&gt;
var a={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var b={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var c={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var d={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var e={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var f={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var g={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var h={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
&lt;br /&gt;
13,a,b,c,d,e,f,g,h,14&lt;br /&gt;
14,a,b,c,d,e,f,g,h,0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1  255  255  255&lt;br /&gt;
2  127  127  127&lt;br /&gt;
7    0    0  255&lt;br /&gt;
8    0    0  127&lt;br /&gt;
9  255    0    0&lt;br /&gt;
10 127    0    0&lt;br /&gt;
11   0  255    0&lt;br /&gt;
12   0  127    0&lt;br /&gt;
13 255  255    0&lt;br /&gt;
14 127  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_ExpungeGliders&amp;quot;, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
    def saveIdentifyGliders(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
Run this after CoalesceObjects to find any gliders.&lt;br /&gt;
&lt;br /&gt;
state 0:  vacuum&lt;br /&gt;
state 1:  ON&lt;br /&gt;
state 2:  OFF&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
n_states:17&lt;br /&gt;
neighborhood:Moore&lt;br /&gt;
symmetries:rotate4reflect&lt;br /&gt;
&lt;br /&gt;
var a={0,2}&lt;br /&gt;
var b={0,2}&lt;br /&gt;
var c={0,2}&lt;br /&gt;
var d={0,2}&lt;br /&gt;
var e={0,2}&lt;br /&gt;
var f={0,2}&lt;br /&gt;
var g={0,2}&lt;br /&gt;
var h={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var i={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var j={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var k={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var l={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var m={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var n={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var o={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var p={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}&lt;br /&gt;
var q={3,4}&lt;br /&gt;
var r={9,10}&lt;br /&gt;
var s={11,12}&lt;br /&gt;
&lt;br /&gt;
1,1,a,1,1,b,1,c,d,3&lt;br /&gt;
d,1,1,1,1,a,b,1,c,4&lt;br /&gt;
&lt;br /&gt;
3,i,j,k,l,m,n,o,p,5&lt;br /&gt;
4,i,j,k,l,m,n,o,p,6&lt;br /&gt;
&lt;br /&gt;
1,q,i,j,a,b,c,k,l,7&lt;br /&gt;
d,q,i,j,a,b,c,k,l,8&lt;br /&gt;
1,i,a,b,c,d,e,j,q,7&lt;br /&gt;
f,i,a,b,c,d,e,j,q,8&lt;br /&gt;
&lt;br /&gt;
5,7,8,7,7,8,7,8,8,9&lt;br /&gt;
6,7,7,7,7,8,8,7,8,10&lt;br /&gt;
5,i,j,k,l,m,n,o,p,15&lt;br /&gt;
6,i,j,k,l,m,n,o,p,16&lt;br /&gt;
15,i,j,k,l,m,n,o,p,1&lt;br /&gt;
16,i,j,k,l,m,n,o,p,2&lt;br /&gt;
&lt;br /&gt;
7,i,j,k,l,m,n,o,p,11&lt;br /&gt;
8,i,j,k,l,m,n,o,p,12&lt;br /&gt;
&lt;br /&gt;
9,i,j,k,l,m,n,o,p,13&lt;br /&gt;
10,i,j,k,l,m,n,o,p,14&lt;br /&gt;
11,r,j,k,l,m,n,o,p,13&lt;br /&gt;
11,i,r,k,l,m,n,o,p,13&lt;br /&gt;
12,r,j,k,l,m,n,o,p,14&lt;br /&gt;
12,i,r,k,l,m,n,o,p,14&lt;br /&gt;
&lt;br /&gt;
11,i,j,k,l,m,n,o,p,1&lt;br /&gt;
12,i,j,k,l,m,n,o,p,2&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1  255  255  255&lt;br /&gt;
2  127  127  127&lt;br /&gt;
7    0    0  255&lt;br /&gt;
8    0    0  127&lt;br /&gt;
9  255    0    0&lt;br /&gt;
10 127    0    0&lt;br /&gt;
11   0  255    0&lt;br /&gt;
12   0  127    0&lt;br /&gt;
13 255  255    0&lt;br /&gt;
14 127  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_IdentifyGliders&amp;quot;, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
    def saveEradicateInfection(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
To run after ContagiousLife to disinfect any cells in states 3 or 4.&lt;br /&gt;
&lt;br /&gt;
state 0:  vacuum&lt;br /&gt;
state 1:  ON&lt;br /&gt;
state 2:  OFF&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
n_states:7&lt;br /&gt;
neighborhood:Moore&lt;br /&gt;
symmetries:permute&lt;br /&gt;
&lt;br /&gt;
var a={0,1,2,3,4,5,6}&lt;br /&gt;
var b={0,1,2,3,4,5,6}&lt;br /&gt;
var c={0,1,2,3,4,5,6}&lt;br /&gt;
var d={0,1,2,3,4,5,6}&lt;br /&gt;
var e={0,1,2,3,4,5,6}&lt;br /&gt;
var f={0,1,2,3,4,5,6}&lt;br /&gt;
var g={0,1,2,3,4,5,6}&lt;br /&gt;
var h={0,1,2,3,4,5,6}&lt;br /&gt;
var i={0,1,2,3,4,5,6}&lt;br /&gt;
&lt;br /&gt;
4,a,b,c,d,e,f,g,h,6&lt;br /&gt;
3,a,b,c,d,e,f,g,h,5&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1    0    0  255&lt;br /&gt;
2    0    0  127&lt;br /&gt;
3  255    0    0&lt;br /&gt;
4  127    0    0&lt;br /&gt;
5    0  255    0&lt;br /&gt;
6    0  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_EradicateInfection&amp;quot;, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
    def savePercolateInfection(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
Percolates any infection to all cells of that particular island.&lt;br /&gt;
&lt;br /&gt;
state 0:  vacuum&lt;br /&gt;
state 1:  ON&lt;br /&gt;
state 2:  OFF&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
n_states:7&lt;br /&gt;
neighborhood:Moore&lt;br /&gt;
symmetries:permute&lt;br /&gt;
&lt;br /&gt;
var a={0,1,2,3,4,5,6}&lt;br /&gt;
var b={0,1,2,3,4,5,6}&lt;br /&gt;
var c={0,1,2,3,4,5,6}&lt;br /&gt;
var d={0,1,2,3,4,5,6}&lt;br /&gt;
var e={0,1,2,3,4,5,6}&lt;br /&gt;
var f={0,1,2,3,4,5,6}&lt;br /&gt;
var g={0,1,2,3,4,5,6}&lt;br /&gt;
var h={0,1,2,3,4,5,6}&lt;br /&gt;
var i={0,1,2,3,4,5,6}&lt;br /&gt;
&lt;br /&gt;
var q={3,4}&lt;br /&gt;
var da={2,4,6}&lt;br /&gt;
var la={1,3,5}&lt;br /&gt;
&lt;br /&gt;
da,q,b,c,d,e,f,g,h,4&lt;br /&gt;
la,q,b,c,d,e,f,g,h,3&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1    0    0  255&lt;br /&gt;
2    0    0  127&lt;br /&gt;
3  255    0    0&lt;br /&gt;
4  127    0    0&lt;br /&gt;
5    0  255    0&lt;br /&gt;
6    0  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_PercolateInfection&amp;quot;, comments, table, colours)&lt;br /&gt;
        &lt;br /&gt;
    def saveExpungeObjects(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
This removes unwanted monominos, blocks, blinkers and beehives.&lt;br /&gt;
It is mandatory that one first runs the rule ClassifyObjects.&lt;br /&gt;
&lt;br /&gt;
Run this for four generations, and observe the population&lt;br /&gt;
counts after 0, 1, 2, 3 and 4 generations. This will give the&lt;br /&gt;
following data:&lt;br /&gt;
&lt;br /&gt;
number of monominos = p(1) - p(0)&lt;br /&gt;
number of blocks = (p(2) - p(1))/4&lt;br /&gt;
number of blinkers = (p(3) - p(2))/5&lt;br /&gt;
number of beehives = (p(4) - p(3))/8&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;n_states:17\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;neighborhood:Moore\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;symmetries:rotate4reflect\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        table += self.newvars([&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;e&amp;quot;,&amp;quot;f&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;h&amp;quot;,&amp;quot;i&amp;quot;], range(0, 17, 1))&lt;br /&gt;
&lt;br /&gt;
        table += &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
# Monomino&lt;br /&gt;
7,0,0,0,0,0,0,0,0,0&lt;br /&gt;
&lt;br /&gt;
# Death&lt;br /&gt;
6,a,b,c,d,e,f,g,h,0&lt;br /&gt;
a,6,b,c,d,e,f,g,h,0&lt;br /&gt;
&lt;br /&gt;
# Block&lt;br /&gt;
7,7,7,7,0,0,0,0,0,1&lt;br /&gt;
1,1,1,1,0,0,0,0,0,0&lt;br /&gt;
1,a,b,c,d,e,f,g,h,7&lt;br /&gt;
&lt;br /&gt;
# Blinker&lt;br /&gt;
10,0,0,0,9,9,9,0,0,2&lt;br /&gt;
9,9,10,0,0,0,0,0,10,3&lt;br /&gt;
2,a,b,c,d,e,f,g,h,10&lt;br /&gt;
3,a,b,c,d,e,f,g,h,9&lt;br /&gt;
9,2,0,3,0,2,0,3,0,6&lt;br /&gt;
&lt;br /&gt;
# Beehive&lt;br /&gt;
7,0,7,8,7,0,0,0,0,1&lt;br /&gt;
7,0,0,7,8,8,7,0,0,1&lt;br /&gt;
8,7,7,8,7,7,0,7,0,4&lt;br /&gt;
4,1,1,4,1,1,0,1,0,5&lt;br /&gt;
4,a,b,c,d,e,f,g,h,8&lt;br /&gt;
5,5,b,c,d,e,f,g,h,6&lt;br /&gt;
5,a,b,c,d,e,f,g,h,15&lt;br /&gt;
15,a,b,c,d,e,f,g,h,8&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1  255  255  255&lt;br /&gt;
2  127  127  127&lt;br /&gt;
7    0    0  255&lt;br /&gt;
8    0    0  127&lt;br /&gt;
9  255    0    0&lt;br /&gt;
10 127    0    0&lt;br /&gt;
11   0  255    0&lt;br /&gt;
12   0  127    0&lt;br /&gt;
13 255  255    0&lt;br /&gt;
14 127  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_ExpungeObjects&amp;quot;, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
    def saveCoalesceObjects(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
A variant of HistoricalLife which separates a field of ash into&lt;br /&gt;
distinct objects.&lt;br /&gt;
&lt;br /&gt;
state 0:  vacuum&lt;br /&gt;
state 1:  ON&lt;br /&gt;
state 2:  OFF&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;n_states:3\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;neighborhood:Moore\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;symmetries:permute\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        table += self.newvars([&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;e&amp;quot;,&amp;quot;f&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;h&amp;quot;,&amp;quot;i&amp;quot;], [0, 1, 2])&lt;br /&gt;
        table += self.newvars([&amp;quot;da&amp;quot;,&amp;quot;db&amp;quot;,&amp;quot;dc&amp;quot;,&amp;quot;dd&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;df&amp;quot;,&amp;quot;dg&amp;quot;,&amp;quot;dh&amp;quot;,&amp;quot;di&amp;quot;], [0, 2])&lt;br /&gt;
        table += self.newvars([&amp;quot;la&amp;quot;,&amp;quot;lb&amp;quot;,&amp;quot;lc&amp;quot;,&amp;quot;ld&amp;quot;,&amp;quot;le&amp;quot;,&amp;quot;lf&amp;quot;,&amp;quot;lg&amp;quot;,&amp;quot;lh&amp;quot;,&amp;quot;li&amp;quot;], [1])&lt;br /&gt;
&lt;br /&gt;
        minperc = 10&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(9):&lt;br /&gt;
            if (self.bee[i]):&lt;br /&gt;
                if (minperc == 10):&lt;br /&gt;
                    minperc = i&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,0,1,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,2,1,i)&lt;br /&gt;
            if (self.ess[i]):&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,1,1,i)&lt;br /&gt;
&lt;br /&gt;
        table += &amp;quot;\n# Bridge inductors\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(9):&lt;br /&gt;
            if (i &amp;gt;= minperc):&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,0,2,i)&lt;br /&gt;
&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,1,2,0)&lt;br /&gt;
&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1  255  255  255&lt;br /&gt;
2  127  127  127&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_CoalesceObjects_&amp;quot;+self.alphanumeric, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
    def saveClassifyObjects(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
This passively classifies objects as either still-lifes, p2 oscillators&lt;br /&gt;
or higher-period oscillators. It is mandatory that one first runs the&lt;br /&gt;
rule CoalesceObjects.&lt;br /&gt;
&lt;br /&gt;
state 0:  vacuum&lt;br /&gt;
state 1:  input ON&lt;br /&gt;
state 2:  input OFF&lt;br /&gt;
&lt;br /&gt;
state 3:  ON, will die&lt;br /&gt;
state 4:  OFF, will remain off&lt;br /&gt;
state 5:  ON, will survive&lt;br /&gt;
state 6:  OFF, will become alive&lt;br /&gt;
&lt;br /&gt;
state 7:  ON, still-life&lt;br /&gt;
state 8:  OFF, still-life&lt;br /&gt;
&lt;br /&gt;
state 9:  ON, p2 oscillator&lt;br /&gt;
state 10: OFF, p2 oscillator&lt;br /&gt;
&lt;br /&gt;
state 11: ON, higher-period object&lt;br /&gt;
state 12: OFF, higher-period object&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;n_states:17\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;neighborhood:Moore\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;symmetries:permute\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        table += self.newvars([&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;e&amp;quot;,&amp;quot;f&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;h&amp;quot;,&amp;quot;i&amp;quot;], range(0, 17, 1))&lt;br /&gt;
        table += self.newvars([&amp;quot;la&amp;quot;,&amp;quot;lb&amp;quot;,&amp;quot;lc&amp;quot;,&amp;quot;ld&amp;quot;,&amp;quot;le&amp;quot;,&amp;quot;lf&amp;quot;,&amp;quot;lg&amp;quot;,&amp;quot;lh&amp;quot;,&amp;quot;li&amp;quot;], range(1, 17, 2))&lt;br /&gt;
        table += self.newvars([&amp;quot;da&amp;quot;,&amp;quot;db&amp;quot;,&amp;quot;dc&amp;quot;,&amp;quot;dd&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;df&amp;quot;,&amp;quot;dg&amp;quot;,&amp;quot;dh&amp;quot;,&amp;quot;di&amp;quot;], range(0, 17, 2))&lt;br /&gt;
        table += self.newvars([&amp;quot;pa&amp;quot;,&amp;quot;pb&amp;quot;,&amp;quot;pc&amp;quot;,&amp;quot;pd&amp;quot;,&amp;quot;pe&amp;quot;,&amp;quot;pf&amp;quot;,&amp;quot;pg&amp;quot;,&amp;quot;ph&amp;quot;,&amp;quot;pi&amp;quot;], [0, 3, 4])&lt;br /&gt;
        table += self.newvars([&amp;quot;qa&amp;quot;,&amp;quot;qb&amp;quot;,&amp;quot;qc&amp;quot;,&amp;quot;qd&amp;quot;,&amp;quot;qe&amp;quot;,&amp;quot;qf&amp;quot;,&amp;quot;qg&amp;quot;,&amp;quot;qh&amp;quot;,&amp;quot;qi&amp;quot;], [5, 6])&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(9):&lt;br /&gt;
            if (self.bee[i]):&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,2,6,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;q&amp;quot;,&amp;quot;p&amp;quot;,3,9,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;q&amp;quot;,&amp;quot;p&amp;quot;,4,12,i)&lt;br /&gt;
            if (self.ess[i]):&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,1,5,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;q&amp;quot;,&amp;quot;p&amp;quot;,5,7,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;q&amp;quot;,&amp;quot;p&amp;quot;,6,12,i)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,2,4,0)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,1,3,0)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,5,11,0)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,3,11,0)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,4,8,0)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,6,10,0)&lt;br /&gt;
&lt;br /&gt;
        table += &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
# Propagate interestingness&lt;br /&gt;
7,11,b,c,d,e,f,g,h,11&lt;br /&gt;
7,12,b,c,d,e,f,g,h,11&lt;br /&gt;
7,9,b,c,d,e,f,g,h,9&lt;br /&gt;
7,10,b,c,d,e,f,g,h,9&lt;br /&gt;
8,11,b,c,d,e,f,g,h,12&lt;br /&gt;
8,12,b,c,d,e,f,g,h,12&lt;br /&gt;
8,9,b,c,d,e,f,g,h,10&lt;br /&gt;
8,10,b,c,d,e,f,g,h,10&lt;br /&gt;
&lt;br /&gt;
7,13,b,c,d,e,f,g,h,11&lt;br /&gt;
7,14,b,c,d,e,f,g,h,11&lt;br /&gt;
8,13,b,c,d,e,f,g,h,14&lt;br /&gt;
8,14,b,c,d,e,f,g,h,14&lt;br /&gt;
9,13,b,c,d,e,f,g,h,11&lt;br /&gt;
9,14,b,c,d,e,f,g,h,11&lt;br /&gt;
10,13,b,c,d,e,f,g,h,14&lt;br /&gt;
10,14,b,c,d,e,f,g,h,14&lt;br /&gt;
&lt;br /&gt;
9,11,b,c,d,e,f,g,h,11&lt;br /&gt;
9,12,b,c,d,e,f,g,h,11&lt;br /&gt;
10,11,b,c,d,e,f,g,h,12&lt;br /&gt;
10,12,b,c,d,e,f,g,h,12&lt;br /&gt;
&lt;br /&gt;
13,11,b,c,d,e,f,g,h,11&lt;br /&gt;
13,12,b,c,d,e,f,g,h,11&lt;br /&gt;
14,11,b,c,d,e,f,g,h,12&lt;br /&gt;
14,12,b,c,d,e,f,g,h,12&lt;br /&gt;
13,9,b,c,d,e,f,g,h,11&lt;br /&gt;
14,9,b,c,d,e,f,g,h,12&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1  255  255  255&lt;br /&gt;
2  127  127  127&lt;br /&gt;
7    0    0  255&lt;br /&gt;
8    0    0  127&lt;br /&gt;
9  255    0    0&lt;br /&gt;
10 127    0    0&lt;br /&gt;
11   0  255    0&lt;br /&gt;
12   0  127    0&lt;br /&gt;
13 255  255    0&lt;br /&gt;
14 127  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_ClassifyObjects_&amp;quot;+self.alphanumeric, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
    def saveContagiousLife(self):&lt;br /&gt;
&lt;br /&gt;
        comments = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
A variant of HistoricalLife used for detecting dependencies between&lt;br /&gt;
islands.&lt;br /&gt;
&lt;br /&gt;
state 0:  vacuum&lt;br /&gt;
state 1:  ON&lt;br /&gt;
state 2:  OFF&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        table = &amp;quot;n_states:7\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;neighborhood:Moore\n&amp;quot;&lt;br /&gt;
        table += &amp;quot;symmetries:permute\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        table += self.newvars([&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;e&amp;quot;,&amp;quot;f&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;h&amp;quot;,&amp;quot;i&amp;quot;], range(0, 7, 1))&lt;br /&gt;
        table += self.newvars([&amp;quot;la&amp;quot;,&amp;quot;lb&amp;quot;,&amp;quot;lc&amp;quot;,&amp;quot;ld&amp;quot;,&amp;quot;le&amp;quot;,&amp;quot;lf&amp;quot;,&amp;quot;lg&amp;quot;,&amp;quot;lh&amp;quot;,&amp;quot;li&amp;quot;], range(1, 7, 2))&lt;br /&gt;
        table += self.newvars([&amp;quot;da&amp;quot;,&amp;quot;db&amp;quot;,&amp;quot;dc&amp;quot;,&amp;quot;dd&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;df&amp;quot;,&amp;quot;dg&amp;quot;,&amp;quot;dh&amp;quot;,&amp;quot;di&amp;quot;], range(0, 7, 2))&lt;br /&gt;
        table += self.newvar(&amp;quot;p&amp;quot;,[3, 4])&lt;br /&gt;
        table += self.newvars([&amp;quot;ta&amp;quot;,&amp;quot;tb&amp;quot;,&amp;quot;tc&amp;quot;,&amp;quot;td&amp;quot;,&amp;quot;te&amp;quot;,&amp;quot;tf&amp;quot;,&amp;quot;tg&amp;quot;,&amp;quot;th&amp;quot;,&amp;quot;ti&amp;quot;], [3])&lt;br /&gt;
        table += self.newvars([&amp;quot;qa&amp;quot;,&amp;quot;qb&amp;quot;,&amp;quot;qc&amp;quot;,&amp;quot;qd&amp;quot;,&amp;quot;qe&amp;quot;,&amp;quot;qf&amp;quot;,&amp;quot;qg&amp;quot;,&amp;quot;qh&amp;quot;,&amp;quot;qi&amp;quot;], [0, 1, 2, 4, 5, 6])&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(9):&lt;br /&gt;
            if (self.bee[i]):&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,4,3,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,2,1,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,0,1,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,6,5,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;t&amp;quot;,&amp;quot;q&amp;quot;,0,4,i)&lt;br /&gt;
            if (self.ess[i]):&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,3,3,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,5,5,i)&lt;br /&gt;
                table += self.scoline(&amp;quot;l&amp;quot;,&amp;quot;d&amp;quot;,1,1,i)&lt;br /&gt;
&lt;br /&gt;
        table += &amp;quot;# Default behaviour (death):\n&amp;quot;&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,1,2,0)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,5,6,0)&lt;br /&gt;
        table += self.scoline(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,3,4,0)&lt;br /&gt;
&lt;br /&gt;
        colours = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
0    0    0    0&lt;br /&gt;
1    0    0  255&lt;br /&gt;
2    0    0  127&lt;br /&gt;
3  255    0    0&lt;br /&gt;
4  127    0    0&lt;br /&gt;
5    0  255    0&lt;br /&gt;
6    0  127    0&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.saverule(&amp;quot;APG_ContagiousLife_&amp;quot;+self.alphanumeric, comments, table, colours)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Soup:&lt;br /&gt;
&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
&lt;br /&gt;
        # The rule generator:&lt;br /&gt;
        self.rg = RuleGenerator()&lt;br /&gt;
&lt;br /&gt;
        # Should we skip error-correction:&lt;br /&gt;
        self.skipErrorCorrection = False&lt;br /&gt;
&lt;br /&gt;
        # A dict mapping binary representations of small possibly-pseudo-objects&lt;br /&gt;
        # to their equivalent canonised representation.&lt;br /&gt;
        #&lt;br /&gt;
        # This is many-to-one, as (for example) all of these will map to&lt;br /&gt;
        # the same pseudo-object (namely the beacon on block):&lt;br /&gt;
        #&lt;br /&gt;
        # ..**.**  ..**.**  **.....                           **.....&lt;br /&gt;
        # ..**.**  ...*.**  **.....                           *......&lt;br /&gt;
        # **.....  *......  ..**...                           ...*.**&lt;br /&gt;
        # **.....  **.....  ..**... [...12 others omitted...] ..**.**&lt;br /&gt;
        # .......  .......  .......                           .......&lt;br /&gt;
        # .......  .......  ..**...                           .......&lt;br /&gt;
        # .......  .......  ..**...                           .......&lt;br /&gt;
        #&lt;br /&gt;
        # The first few soups are much slower to process, as objects are being&lt;br /&gt;
        # entered into the cache.&lt;br /&gt;
        self.cache = {}&lt;br /&gt;
&lt;br /&gt;
        # A dict to store memoized decompositions of possibly-pseudo-objects&lt;br /&gt;
        # into constituent parts. This is initialised with the unique minimal&lt;br /&gt;
        # pseudo-still-life (two blocks on lock) that cannot be automatically&lt;br /&gt;
        # separated by the routine pseudo_bangbang(). Any larger objects are&lt;br /&gt;
        # ambiguous, such as this one:&lt;br /&gt;
        #&lt;br /&gt;
        #     *&lt;br /&gt;
        #    * * **&lt;br /&gt;
        #     ** **&lt;br /&gt;
        #&lt;br /&gt;
        #    * *** *&lt;br /&gt;
        #    ** * **&lt;br /&gt;
        #&lt;br /&gt;
        # Is it a (block on (lock on boat)) or ((block on lock) on boat)?&lt;br /&gt;
        # Ahh, the joys of non-associativity.&lt;br /&gt;
        #&lt;br /&gt;
        # See http://paradise.caltech.edu/~cook/Workshop/CAs/2DOutTot/Life/StillLife/StillLifeTheory.html&lt;br /&gt;
        self.decompositions = {&amp;quot;xs18_3pq3qp3&amp;quot;: [&amp;quot;xs14_3123qp3&amp;quot;, &amp;quot;xs4_33&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
        # A dict of objects in the form {&amp;quot;identifier&amp;quot;: (&amp;quot;common name&amp;quot;, points)}&lt;br /&gt;
        #&lt;br /&gt;
        # As a rough heuristic, an object is worth 15 + log2(n) points if it&lt;br /&gt;
        # is n times rarer than the pentadecathlon.&lt;br /&gt;
        #&lt;br /&gt;
        # Still-lifes are limited to 10 points.&lt;br /&gt;
        # p2 oscillators are limited to 20 points.&lt;br /&gt;
        # p3 and p4 oscillators are limited to 30 points.&lt;br /&gt;
        self.commonnames = {&amp;quot;xp3_co9nas0san9oczgoldlo0oldlogz1047210127401&amp;quot;: (&amp;quot;pulsar&amp;quot;, 8),&lt;br /&gt;
                       &amp;quot;xp15_4r4z4r4&amp;quot;: (&amp;quot;pentadecathlon&amp;quot;, 15),&lt;br /&gt;
                       &amp;quot;xp2_2a54&amp;quot;: (&amp;quot;clock&amp;quot;, 16),&lt;br /&gt;
                       &amp;quot;xp2_31ago&amp;quot;: (&amp;quot;bipole&amp;quot;, 17),&lt;br /&gt;
                       &amp;quot;xp2_0g0k053z32&amp;quot;: (&amp;quot;quadpole&amp;quot;, 18),&lt;br /&gt;
                       &amp;quot;xp2_g8gid1e8z1226&amp;quot;: (&amp;quot;great on-off&amp;quot;, 19),&lt;br /&gt;
                       &amp;quot;xp2_rhewehr&amp;quot;: (&amp;quot;spark coil&amp;quot;, 19),&lt;br /&gt;
                       &amp;quot;xp8_gk2gb3z11&amp;quot;: (&amp;quot;figure-8&amp;quot;, 20),&lt;br /&gt;
                       &amp;quot;xp4_37bkic&amp;quot;: (&amp;quot;mold&amp;quot;, 21),&lt;br /&gt;
                       &amp;quot;xp2_31a08zy0123cko&amp;quot;: (&amp;quot;quadpole on ship&amp;quot;, 20),&lt;br /&gt;
                       &amp;quot;xp2_g0k053z11&amp;quot;: (&amp;quot;tripole&amp;quot;, 20),&lt;br /&gt;
                       &amp;quot;xp4_ssj3744zw3&amp;quot;: (&amp;quot;mazing&amp;quot;, 23),&lt;br /&gt;
                       &amp;quot;xp8_g3jgz1ut&amp;quot;: (&amp;quot;blocker&amp;quot;, 24),&lt;br /&gt;
                       &amp;quot;xp3_695qc8zx33&amp;quot;: (&amp;quot;jam&amp;quot;, 24),&lt;br /&gt;
                       &amp;quot;xp30_w33z8kqrqk8zzzw33&amp;quot;: (&amp;quot;cis-queen-bee-shuttle&amp;quot;, 24),&lt;br /&gt;
                       &amp;quot;xp30_w33z8kqrqk8zzzx33&amp;quot;: (&amp;quot;trans-queen-bee-shuttle&amp;quot;, 24),&lt;br /&gt;
                       &amp;quot;xp4_8eh5e0e5he8z178a707a871&amp;quot;: (&amp;quot;cloverleaf&amp;quot;, 25),&lt;br /&gt;
                       &amp;quot;xp5_idiidiz01w1&amp;quot;: (&amp;quot;octagon II&amp;quot;, 26),&lt;br /&gt;
                       &amp;quot;xp6_ccb7w66z066&amp;quot;: (&amp;quot;unix&amp;quot;, 26),&lt;br /&gt;
                       &amp;quot;xp14_j9d0d9j&amp;quot;: (&amp;quot;tumbler&amp;quot;, 27),&lt;br /&gt;
                       &amp;quot;xp3_025qzrq221&amp;quot;: (&amp;quot;trans-tub-eater&amp;quot;, 28),&lt;br /&gt;
                       &amp;quot;xp3_4hh186z07&amp;quot;: (&amp;quot;caterer&amp;quot;, 29),&lt;br /&gt;
                       &amp;quot;xp3_025qz32qq1&amp;quot;: (&amp;quot;cis-tub-eater&amp;quot;, 30),&lt;br /&gt;
                       &amp;quot;xp8_wgovnz234z33&amp;quot;: (&amp;quot;Tim Coe&#039;s p8&amp;quot;, 31),&lt;br /&gt;
                       &amp;quot;xp5_3pmwmp3zx11&amp;quot;: (&amp;quot;fumarole&amp;quot;, 33),&lt;br /&gt;
                       &amp;quot;xp46_330279cx1aad3y833zx4e93x855bc&amp;quot;: (&amp;quot;cis-twin-bees-shuttle&amp;quot;, 35),&lt;br /&gt;
                       &amp;quot;xp46_330279cx1aad3zx4e93x855bcy8cc&amp;quot;: (&amp;quot;trans-twin-bees-shuttle&amp;quot;, 35),&lt;br /&gt;
                       &amp;quot;yl144_1_16_afb5f3db909e60548f086e22ee3353ac&amp;quot;: (&amp;quot;block-laying switch engine&amp;quot;, 16),&lt;br /&gt;
                       &amp;quot;yl384_1_59_7aeb1999980c43b4945fb7fcdb023326&amp;quot;: (&amp;quot;glider-producing switch engine&amp;quot;, 17),&lt;br /&gt;
                       &amp;quot;xp10_9hr&amp;quot;: (&amp;quot;[HighLife] p10&amp;quot;, 6),&lt;br /&gt;
                       &amp;quot;xp7_13090c8&amp;quot;: (&amp;quot;[HighLife] p7&amp;quot;, 9),&lt;br /&gt;
                       &amp;quot;xq48_07z8ca7zy1e531&amp;quot;: (&amp;quot;[HighLife] bomber&amp;quot;, 9),&lt;br /&gt;
                       &amp;quot;xq4_153&amp;quot;: (&amp;quot;glider&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xq4_6frc&amp;quot;: (&amp;quot;lightweight spaceship&amp;quot;, 7),&lt;br /&gt;
                       &amp;quot;xq4_27dee6&amp;quot;: (&amp;quot;middleweight spaceship&amp;quot;, 9),&lt;br /&gt;
                       &amp;quot;xq4_27deee6&amp;quot;: (&amp;quot;heavyweight spaceship&amp;quot;, 12),&lt;br /&gt;
                       &amp;quot;xq7_3nw17862z6952&amp;quot;: (&amp;quot;loafer&amp;quot;, 70),&lt;br /&gt;
                       &amp;quot;xp2_7&amp;quot;: (&amp;quot;blinker&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs4_33&amp;quot;: (&amp;quot;block&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs4_252&amp;quot;: (&amp;quot;tub&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs5_253&amp;quot;: (&amp;quot;boat&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs6_bd&amp;quot;: (&amp;quot;snake&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs6_356&amp;quot;: (&amp;quot;ship&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs6_696&amp;quot;: (&amp;quot;beehive&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs6_25a4&amp;quot;: (&amp;quot;barge&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs6_39c&amp;quot;: (&amp;quot;carrier&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xp2_7e&amp;quot;: (&amp;quot;toad&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xp2_318c&amp;quot;: (&amp;quot;beacon&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs7_3lo&amp;quot;: (&amp;quot;long snake&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs7_25ac&amp;quot;: (&amp;quot;long boat&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs7_178c&amp;quot;: (&amp;quot;eater&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs7_2596&amp;quot;: (&amp;quot;loaf&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_178k8&amp;quot;: (&amp;quot;twit&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_32qk&amp;quot;: (&amp;quot;hook with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_69ic&amp;quot;: (&amp;quot;mango&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_6996&amp;quot;: (&amp;quot;pond&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_25ak8&amp;quot;: (&amp;quot;long barge&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_3pm&amp;quot;: (&amp;quot;shillelagh&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_312ko&amp;quot;: (&amp;quot;canoe&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_31248c&amp;quot;: (&amp;quot;very long snake&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs8_35ac&amp;quot;: (&amp;quot;long ship&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_g8o653z11&amp;quot;: (&amp;quot;ship-tie&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_g88m952z121&amp;quot;: (&amp;quot;half-bakery&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_69bqic&amp;quot;: (&amp;quot;paperclip&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_31ego&amp;quot;: (&amp;quot;integral sign&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_g8o652z01&amp;quot;: (&amp;quot;boat-tie&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_g88b96z123&amp;quot;: (&amp;quot;big ess&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs16_g88m996z1221&amp;quot;: (&amp;quot;bipond&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_raar&amp;quot;: (&amp;quot;table on table&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_4aar&amp;quot;: (&amp;quot;hat&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_35ako&amp;quot;: (&amp;quot;very long ship&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_178ko&amp;quot;: (&amp;quot;trans boat with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs15_354cgc453&amp;quot;: (&amp;quot;moose antlers&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_6970796&amp;quot;: (&amp;quot;cis-mirrored r-bee&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_32qr&amp;quot;: (&amp;quot;block on table&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs16_j1u0696z11&amp;quot;: (&amp;quot;beehive on dock&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_j1u066z11&amp;quot;: (&amp;quot;block on dock&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_g8o652z11&amp;quot;: (&amp;quot;boat tie ship&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_25ako&amp;quot;: (&amp;quot;very long boat&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs16_69egmiczx1&amp;quot;: (&amp;quot;scorpion&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs18_rhe0ehr&amp;quot;: (&amp;quot;dead spark coil&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs17_2ege1ege2&amp;quot;: (&amp;quot;twinhat&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_178kk8&amp;quot;: (&amp;quot;beehive with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_69ar&amp;quot;: (&amp;quot;loop&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_69bo8a6&amp;quot;: (&amp;quot;fourteener&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_39e0e93&amp;quot;: (&amp;quot;bookends&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_178kc&amp;quot;: (&amp;quot;cis boat with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_330f96&amp;quot;: (&amp;quot;block and cap&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_358gkc&amp;quot;: (&amp;quot;10.003&amp;quot;,0),&lt;br /&gt;
                       &amp;quot;xs12_330fho&amp;quot;: (&amp;quot;trans block and longhook&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_g0s252z11&amp;quot;: (&amp;quot;prodigal sign&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_g0s453z11&amp;quot;: (&amp;quot;elevener&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_6is079c&amp;quot;: (&amp;quot;cis-rotated hook&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_69e0eic&amp;quot;: (&amp;quot;trans-mirrored R-bee&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_ggm952z1&amp;quot;: (&amp;quot;trans loaf with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs15_j1u06a4z11&amp;quot;: (&amp;quot;cis boat and dock&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs20_3lkkl3z32w23&amp;quot;: (&amp;quot;mirrored dock&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_178br&amp;quot;: (&amp;quot;12.003&amp;quot;,0),&lt;br /&gt;
                       &amp;quot;xs12_3hu066&amp;quot;: (&amp;quot;cis block and longhook&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_178c453&amp;quot;: (&amp;quot;eater with nine&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_0drz32&amp;quot;: (&amp;quot;broken snake&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_312453&amp;quot;: (&amp;quot;long shillelagh&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_3215ac&amp;quot;: (&amp;quot;boat with long tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_39e0e96&amp;quot;: (&amp;quot;cis-hook and R-bee&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs13_g88m96z121&amp;quot;: (&amp;quot;beehive at loaf&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_39e0eic&amp;quot;: (&amp;quot;trans hook and R-bee&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_3542ac&amp;quot;: (&amp;quot;S-ten&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs15_259e0eic&amp;quot;: (&amp;quot;trans R-bee and R-loaf&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_178jd&amp;quot;: (&amp;quot;11-loop&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_25a84c&amp;quot;: (&amp;quot;tub with long tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs15_3lkm96z01&amp;quot;: (&amp;quot;bee-hat&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_g8o0e96z121&amp;quot;: (&amp;quot;cis-rotated R-bee&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs13_69e0mq&amp;quot;: (&amp;quot;R-bee and snake&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_69lic&amp;quot;: (&amp;quot;11.003&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_6960ui&amp;quot;: (&amp;quot;beehive and table&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs16_259e0e952&amp;quot;: (&amp;quot;cis-mirrored R-loaf&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_1784ko&amp;quot;: (&amp;quot;8-snake-eater&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs13_4a960ui&amp;quot;: (&amp;quot;ortho loaf and table&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs9_g0g853z11&amp;quot;: (&amp;quot;long canoe&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs18_69is0si96&amp;quot;: (&amp;quot;[cis-mirrored R-mango]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_178kic&amp;quot;: (&amp;quot;cis loaf with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs16_69bob96&amp;quot;: (&amp;quot;symmetric scorpion&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs13_0g8o653z121&amp;quot;: (&amp;quot;longboat on ship&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_o4q552z01&amp;quot;: (&amp;quot;beehive at beehive&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs10_ggka52z1&amp;quot;: (&amp;quot;trans barge with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_256o8a6&amp;quot;: (&amp;quot;eater on boat&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_6960uic&amp;quot;: (&amp;quot;beehive with cap&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_2egm93&amp;quot;: (&amp;quot;snorkel loop&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs12_2egm96&amp;quot;: (&amp;quot;beehive bend tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_g0s253z11&amp;quot;: (&amp;quot;trans boat with nine&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs15_3lk453z121&amp;quot;: (&amp;quot;trans boat and dock&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs19_69icw8ozxdd11&amp;quot;: (&amp;quot;[mango with block on dock]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs13_2530f96&amp;quot;: (&amp;quot;[cis boat and cap]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_2530f9&amp;quot;: (&amp;quot;cis boat and table&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_4a9m88gzx121&amp;quot;: (&amp;quot;[bi-loaf2]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_ggka53z1&amp;quot;: (&amp;quot;trans longboat with tail&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs18_2egm9a4zx346&amp;quot;: (&amp;quot;[loaf eater tail]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs15_4a9raic&amp;quot;: (&amp;quot;[15-bent-paperclip]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs11_3586246&amp;quot;: (&amp;quot;[11-snake]&amp;quot;,0),&lt;br /&gt;
                       &amp;quot;xs11_178b52&amp;quot;: (&amp;quot;[11-boat wrap tail]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_08u1e8z321&amp;quot;: (&amp;quot;[hat join hook]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_g4s079cz11&amp;quot;: (&amp;quot;[cis-mirrored offset hooks]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs13_31egma4&amp;quot;: (&amp;quot;[13-boat wrap eater]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs14_69960ui&amp;quot;: (&amp;quot;pond and table&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs13_255q8a6&amp;quot;: (&amp;quot;[eater tie beehive]&amp;quot;, 0),&lt;br /&gt;
                       &amp;quot;xs15_09v0ccz321&amp;quot;: (&amp;quot;[hook join table and block]&amp;quot;,0)}&lt;br /&gt;
&lt;br /&gt;
        # First soup to contain a particular object:&lt;br /&gt;
        self.alloccur = {}&lt;br /&gt;
&lt;br /&gt;
        # A tally of objects that have occurred during this run of apgsearch:&lt;br /&gt;
        self.objectcounts = {}&lt;br /&gt;
&lt;br /&gt;
        # Any soups with positive scores, and the number of points.&lt;br /&gt;
        self.soupscores = {}&lt;br /&gt;
&lt;br /&gt;
        # Temporary list of unidentified objects:&lt;br /&gt;
        self.unids = []&lt;br /&gt;
&lt;br /&gt;
        # Things like glider guns and large oscillators belong here:&lt;br /&gt;
        self.superunids = []&lt;br /&gt;
        self.gridsize = 0&lt;br /&gt;
        self.resets = 0&lt;br /&gt;
&lt;br /&gt;
        # For profiling purposes:&lt;br /&gt;
        self.qlifetime = 0.0&lt;br /&gt;
        self.ruletime = 0.0&lt;br /&gt;
        self.gridtime = 0.0&lt;br /&gt;
&lt;br /&gt;
    # Increment object count by given value:&lt;br /&gt;
    def incobject(self, obj, incval):&lt;br /&gt;
        if (incval &amp;gt; 0):&lt;br /&gt;
            if obj in self.objectcounts:&lt;br /&gt;
                self.objectcounts[obj] = self.objectcounts[obj] + incval&lt;br /&gt;
            else:&lt;br /&gt;
                self.objectcounts[obj] = incval&lt;br /&gt;
&lt;br /&gt;
    # Increment soup score by given value:&lt;br /&gt;
    def awardpoints(self, soupid, incval):&lt;br /&gt;
        if (incval &amp;gt; 0):&lt;br /&gt;
            if soupid in self.soupscores:&lt;br /&gt;
                self.soupscores[soupid] = self.soupscores[soupid] + incval&lt;br /&gt;
            else:&lt;br /&gt;
                self.soupscores[soupid] = incval&lt;br /&gt;
&lt;br /&gt;
    # Increment soup score by appropriate value:&lt;br /&gt;
    def awardpoints2(self, soupid, obj):&lt;br /&gt;
&lt;br /&gt;
        # Record the occurrence of this object:&lt;br /&gt;
        if (obj in self.alloccur):&lt;br /&gt;
            if (len(self.alloccur[obj]) &amp;lt; 10):&lt;br /&gt;
                if (soupid not in self.alloccur[obj]):&lt;br /&gt;
                    self.alloccur[obj] += [soupid]&lt;br /&gt;
        else:&lt;br /&gt;
            self.alloccur[obj] = [soupid]&lt;br /&gt;
        &lt;br /&gt;
        if obj in self.commonnames:&lt;br /&gt;
            self.awardpoints(soupid, self.commonnames[obj][1])&lt;br /&gt;
        elif (obj[0] == &#039;x&#039;):&lt;br /&gt;
            prefix = obj.split(&#039;_&#039;)[0]&lt;br /&gt;
            prenum = int(prefix[2:])&lt;br /&gt;
            if (obj[1] == &#039;s&#039;):&lt;br /&gt;
                self.awardpoints(soupid, min(prenum, 20)) # for still-lifes, award one point per constituent cell (max 20)&lt;br /&gt;
            elif (obj[1] == &#039;p&#039;):&lt;br /&gt;
                if (prenum == 2):&lt;br /&gt;
                    self.awardpoints(soupid, 20) # p2 oscillators are limited to 20 points&lt;br /&gt;
                elif ((prenum == 3) | (prenum == 4)):&lt;br /&gt;
                    self.awardpoints(soupid, 30) # p3 and p4 oscillators are limited to 30 points&lt;br /&gt;
                else:&lt;br /&gt;
                    self.awardpoints(soupid, 40)&lt;br /&gt;
            else:&lt;br /&gt;
                self.awardpoints(soupid, 50)&lt;br /&gt;
        else:&lt;br /&gt;
            self.awardpoints(soupid, 60)&lt;br /&gt;
&lt;br /&gt;
    # Assuming the pattern has stabilised, perform a census:&lt;br /&gt;
    def census(self, stepsize):&lt;br /&gt;
&lt;br /&gt;
        g.setrule(&amp;quot;APG_CoalesceObjects_&amp;quot; + self.rg.alphanumeric)&lt;br /&gt;
        g.setbase(2)&lt;br /&gt;
        g.setstep(stepsize)&lt;br /&gt;
        g.step()&lt;br /&gt;
&lt;br /&gt;
        # apgsearch theoretically supports up to 2^14 rules, whereas the Guy&lt;br /&gt;
        # glider is only stable in 2^8 rules. Ensure that this is one of these&lt;br /&gt;
        # rules by doing some basic Boolean arithmetic.&lt;br /&gt;
        #&lt;br /&gt;
        # This should be parsed as `gliders exist&#039;, not `glider sexist&#039;:&lt;br /&gt;
        glidersexist = self.rg.ess[2] &amp;amp; self.rg.ess[3] &amp;amp; (not self.rg.ess[1]) &amp;amp; (not self.rg.ess[4])&lt;br /&gt;
        glidersexist = glidersexist &amp;amp; (not (self.rg.bee[4] | self.rg.bee[5]))&lt;br /&gt;
&lt;br /&gt;
        if (glidersexist):&lt;br /&gt;
            g.setrule(&amp;quot;APG_IdentifyGliders&amp;quot;)&lt;br /&gt;
            g.setbase(2)&lt;br /&gt;
            g.setstep(2)&lt;br /&gt;
            g.step()&lt;br /&gt;
&lt;br /&gt;
        g.setrule(&amp;quot;APG_ClassifyObjects_&amp;quot; + self.rg.alphanumeric)&lt;br /&gt;
        g.setbase(2)&lt;br /&gt;
        g.setstep(max(8, stepsize))&lt;br /&gt;
        g.step()&lt;br /&gt;
&lt;br /&gt;
        # Only do this if we have an infinite-growth pattern:&lt;br /&gt;
        if (stepsize &amp;gt; 8):&lt;br /&gt;
            g.setrule(&amp;quot;APG_HandlePlumesCorrected&amp;quot;)&lt;br /&gt;
            g.setbase(2)&lt;br /&gt;
            g.setstep(1)&lt;br /&gt;
            g.step()&lt;br /&gt;
            g.setrule(&amp;quot;APG_ClassifyObjects_&amp;quot; + self.rg.alphanumeric)&lt;br /&gt;
            g.setstep(stepsize)&lt;br /&gt;
            g.step()&lt;br /&gt;
&lt;br /&gt;
        # Remove any gliders:&lt;br /&gt;
        if (glidersexist):&lt;br /&gt;
            g.setrule(&amp;quot;APG_ExpungeGliders&amp;quot;)&lt;br /&gt;
            g.run(1)&lt;br /&gt;
            pop5 = int(g.getpop())&lt;br /&gt;
            g.run(1)&lt;br /&gt;
            pop6 = int(g.getpop())&lt;br /&gt;
            self.incobject(&amp;quot;xq4_153&amp;quot;, (pop5 - pop6)/5)&lt;br /&gt;
&lt;br /&gt;
        # Remove any blocks, blinkers and beehives:&lt;br /&gt;
        g.setrule(&amp;quot;APG_ExpungeObjects&amp;quot;)&lt;br /&gt;
        pop0 = int(g.getpop())&lt;br /&gt;
        g.run(1)&lt;br /&gt;
        pop1 = int(g.getpop())&lt;br /&gt;
        g.run(1)&lt;br /&gt;
        pop2 = int(g.getpop())&lt;br /&gt;
        g.run(1)&lt;br /&gt;
        pop3 = int(g.getpop())&lt;br /&gt;
        g.run(1)&lt;br /&gt;
        pop4 = int(g.getpop())&lt;br /&gt;
&lt;br /&gt;
        # Blocks, blinkers and beehives removed by ExpungeObjects:&lt;br /&gt;
        self.incobject(&amp;quot;xs1_1&amp;quot;, (pop0-pop1))&lt;br /&gt;
        self.incobject(&amp;quot;xs4_33&amp;quot;, (pop1-pop2)/4)&lt;br /&gt;
        self.incobject(&amp;quot;xp2_7&amp;quot;, (pop2-pop3)/5)&lt;br /&gt;
        self.incobject(&amp;quot;xs6_696&amp;quot;, (pop3-pop4)/8)&lt;br /&gt;
&lt;br /&gt;
    # Removes an object incident with (ix, iy) and returns the cell list:&lt;br /&gt;
    def grabobj(self, ix, iy):&lt;br /&gt;
&lt;br /&gt;
        allcells = [ix, iy, g.getcell(ix, iy)]&lt;br /&gt;
        g.setcell(ix, iy, 0)&lt;br /&gt;
        livecells = []&lt;br /&gt;
        deadcells = []&lt;br /&gt;
&lt;br /&gt;
        marker = 0&lt;br /&gt;
        ll = 3&lt;br /&gt;
&lt;br /&gt;
        while (marker &amp;lt; ll):&lt;br /&gt;
            x = allcells[marker]&lt;br /&gt;
            y = allcells[marker+1]&lt;br /&gt;
            z = allcells[marker+2]&lt;br /&gt;
            marker += 3&lt;br /&gt;
&lt;br /&gt;
            if ((z % 2) == 1):&lt;br /&gt;
                livecells.append(x)&lt;br /&gt;
                livecells.append(y)&lt;br /&gt;
            else:&lt;br /&gt;
                deadcells.append(x)&lt;br /&gt;
                deadcells.append(y)&lt;br /&gt;
&lt;br /&gt;
            for nx in xrange(x - 1, x + 2):&lt;br /&gt;
                for ny in xrange(y - 1, y + 2):&lt;br /&gt;
&lt;br /&gt;
                    nz = g.getcell(nx, ny)&lt;br /&gt;
                    if (nz &amp;gt; 0):&lt;br /&gt;
                        allcells.append(nx)&lt;br /&gt;
                        allcells.append(ny)&lt;br /&gt;
                        allcells.append(nz)&lt;br /&gt;
                        g.setcell(nx, ny, 0)&lt;br /&gt;
                        ll += 3&lt;br /&gt;
&lt;br /&gt;
        return livecells&lt;br /&gt;
&lt;br /&gt;
    # Command to Grab, Remove and IDentify an OBJect:&lt;br /&gt;
    def gridobj(self, ix, iy, gsize, gspacing, pos):&lt;br /&gt;
&lt;br /&gt;
        allcells = [ix, iy, g.getcell(ix, iy)]&lt;br /&gt;
        g.setcell(ix, iy, 0)&lt;br /&gt;
        livecells = []&lt;br /&gt;
        deadcells = []&lt;br /&gt;
&lt;br /&gt;
        # This tacitly assumes the object is smaller than 1000-by-1000.&lt;br /&gt;
        # But this is okay, since it is only used by the routing logic.&lt;br /&gt;
        dleft = ix + 1000&lt;br /&gt;
        dright = ix - 1000&lt;br /&gt;
        dtop = iy + 1000&lt;br /&gt;
        dbottom = iy - 1000&lt;br /&gt;
&lt;br /&gt;
        lleft = ix + 1000&lt;br /&gt;
        lright = ix - 1000&lt;br /&gt;
        ltop = iy + 1000&lt;br /&gt;
        lbottom = iy - 1000&lt;br /&gt;
&lt;br /&gt;
        lpop = 0&lt;br /&gt;
        dpop = 0&lt;br /&gt;
&lt;br /&gt;
        marker = 0&lt;br /&gt;
        ll = 3&lt;br /&gt;
&lt;br /&gt;
        while (marker &amp;lt; ll):&lt;br /&gt;
            x = allcells[marker]&lt;br /&gt;
            y = allcells[marker+1]&lt;br /&gt;
            z = allcells[marker+2]&lt;br /&gt;
            marker += 3&lt;br /&gt;
&lt;br /&gt;
            if ((z % 2) == 1):&lt;br /&gt;
                livecells.append(x)&lt;br /&gt;
                livecells.append(y)&lt;br /&gt;
                lleft = min(lleft, x)&lt;br /&gt;
                lright = max(lright, x)&lt;br /&gt;
                ltop = min(ltop, y)&lt;br /&gt;
                lbottom = max(lbottom, y)&lt;br /&gt;
                lpop += 1&lt;br /&gt;
            else:&lt;br /&gt;
                deadcells.append(x)&lt;br /&gt;
                deadcells.append(y)&lt;br /&gt;
                dleft = min(dleft, x)&lt;br /&gt;
                dright = max(dright, x)&lt;br /&gt;
                dtop = min(dtop, y)&lt;br /&gt;
                dbottom = max(dbottom, y)&lt;br /&gt;
                dpop += 1&lt;br /&gt;
&lt;br /&gt;
            for nx in xrange(x - 1, x + 2):&lt;br /&gt;
                for ny in xrange(y - 1, y + 2):&lt;br /&gt;
&lt;br /&gt;
                    nz = g.getcell(nx, ny)&lt;br /&gt;
                    if (nz &amp;gt; 0):&lt;br /&gt;
                        allcells.append(nx)&lt;br /&gt;
                        allcells.append(ny)&lt;br /&gt;
                        allcells.append(nz)&lt;br /&gt;
                        g.setcell(nx, ny, 0)&lt;br /&gt;
                        ll += 3&lt;br /&gt;
&lt;br /&gt;
        lwidth = max(0, 1 + lright - lleft)&lt;br /&gt;
        lheight = max(0, 1 + lbottom - ltop)&lt;br /&gt;
        dwidth = max(0, 1 + dright - dleft)&lt;br /&gt;
        dheight = max(0, 1 + dbottom - dtop)&lt;br /&gt;
&lt;br /&gt;
        llength = max(lwidth, lheight)&lt;br /&gt;
        lbreadth = min(lwidth, lheight)&lt;br /&gt;
        dlength = max(dwidth, dheight)&lt;br /&gt;
        dbreadth = min(dwidth, dheight)&lt;br /&gt;
&lt;br /&gt;
        self.gridsize = max(self.gridsize, llength)&lt;br /&gt;
&lt;br /&gt;
        objid = &amp;quot;unidentified&amp;quot;&lt;br /&gt;
        bitstring = 0&lt;br /&gt;
&lt;br /&gt;
        if (lpop == 0):&lt;br /&gt;
            objid = &amp;quot;nothing&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            if ((lwidth &amp;lt;= 7) &amp;amp; (lheight &amp;lt;= 7)):&lt;br /&gt;
                for i in xrange(0, lpop*2, 2):&lt;br /&gt;
                    bitstring += (1 &amp;lt;&amp;lt; ((livecells[i] - lleft) + 7*(livecells[i + 1] - ltop)))&lt;br /&gt;
&lt;br /&gt;
                if bitstring in self.cache:&lt;br /&gt;
                    objid = self.cache[bitstring]&lt;br /&gt;
&lt;br /&gt;
        if (objid == &amp;quot;unidentified&amp;quot;):&lt;br /&gt;
            # This has passed through the routing logic without being identified,&lt;br /&gt;
            # so save it in a temporary list for later identification:&lt;br /&gt;
            self.unids.append(bitstring)&lt;br /&gt;
            self.unids.append(livecells)&lt;br /&gt;
            self.unids.append(lleft)&lt;br /&gt;
            self.unids.append(ltop)&lt;br /&gt;
        elif (objid != &amp;quot;nothing&amp;quot;):&lt;br /&gt;
            # The object is non-empty, so add it to the census:&lt;br /&gt;
            ux = int(0.5 + float(lleft)/float(gspacing))&lt;br /&gt;
            uy = int(0.5 + float(ltop)/float(gspacing))&lt;br /&gt;
            soupid = ux + (uy * gsize) + pos&lt;br /&gt;
&lt;br /&gt;
            # Check whether the cached object is in the set of decompositions&lt;br /&gt;
            # (this is usually the case, unless for example it is a high-period&lt;br /&gt;
            # albeit small spaceship):&lt;br /&gt;
            if objid in self.decompositions:            &lt;br /&gt;
                for comp in self.decompositions[objid]:&lt;br /&gt;
                    self.incobject(comp, 1)&lt;br /&gt;
                    self.awardpoints2(soupid, comp)&lt;br /&gt;
            else:&lt;br /&gt;
                self.incobject(objid, 1)&lt;br /&gt;
                self.awardpoints2(soupid, objid)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    # Tests for population periodicity:&lt;br /&gt;
    def naivestab(self, period, security, length):&lt;br /&gt;
&lt;br /&gt;
        depth = 0&lt;br /&gt;
        prevpop = 0&lt;br /&gt;
        for i in xrange(length):&lt;br /&gt;
            g.run(period)&lt;br /&gt;
            currpop = int(g.getpop())&lt;br /&gt;
            if (currpop == prevpop):&lt;br /&gt;
                depth += 1&lt;br /&gt;
            else:&lt;br /&gt;
                depth = 0&lt;br /&gt;
            prevpop = currpop&lt;br /&gt;
            if (depth == security):&lt;br /&gt;
                # Population is periodic.&lt;br /&gt;
                return True&lt;br /&gt;
&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # This should catch most short-lived soups with few gliders produced:&lt;br /&gt;
    def naivestab2(self, period, length):&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(length):&lt;br /&gt;
            r = g.getrect()&lt;br /&gt;
            if (len(r) == 0):&lt;br /&gt;
                return True&lt;br /&gt;
            pop0 = int(g.getpop())&lt;br /&gt;
            g.run(period)&lt;br /&gt;
            hash1 = g.hash(r)&lt;br /&gt;
            pop1 = int(g.getpop())&lt;br /&gt;
            g.run(period)&lt;br /&gt;
            hash2 = g.hash(r)&lt;br /&gt;
            pop2 = int(g.getpop())&lt;br /&gt;
&lt;br /&gt;
            if ((hash1 == hash2) &amp;amp; (pop0 == pop1) &amp;amp; (pop1 == pop2)):&lt;br /&gt;
&lt;br /&gt;
                if (g.getrect() == r):&lt;br /&gt;
                    return True&lt;br /&gt;
                &lt;br /&gt;
                g.run((2*int(max(r[2], r[3])/period)+1)*period)&lt;br /&gt;
                hash3 = g.hash(r)&lt;br /&gt;
                pop3 = int(g.getpop())&lt;br /&gt;
                if ((hash2 == hash3) &amp;amp; (pop2 == pop3)):&lt;br /&gt;
                    return True&lt;br /&gt;
&lt;br /&gt;
        return False&lt;br /&gt;
            &lt;br /&gt;
    # Runs a pattern until stabilisation with a 99.99996% success rate.&lt;br /&gt;
    # False positives are handled by a later error-correction stage.&lt;br /&gt;
    def stabilise3(self):&lt;br /&gt;
&lt;br /&gt;
        # Phase I of stabilisation detection, designed to weed out patterns&lt;br /&gt;
        # that stabilise into a cluster of low-period oscillators within&lt;br /&gt;
        # about 6000 generations.&lt;br /&gt;
&lt;br /&gt;
        if (self.naivestab2(12, 10)):&lt;br /&gt;
            return 4;&lt;br /&gt;
&lt;br /&gt;
        if (self.naivestab(12, 30, 200)):&lt;br /&gt;
            return 4;&lt;br /&gt;
&lt;br /&gt;
        if (self.naivestab(30, 30, 200)):&lt;br /&gt;
            return 5;&lt;br /&gt;
&lt;br /&gt;
        # Phase II of stabilisation detection, which is much more rigorous&lt;br /&gt;
        # and based on oscar.py.&lt;br /&gt;
&lt;br /&gt;
        # Should be sufficient:&lt;br /&gt;
        prect = [-2000, -2000, 4000, 4000]&lt;br /&gt;
&lt;br /&gt;
        # initialize lists&lt;br /&gt;
        hashlist = []        # for pattern hash values&lt;br /&gt;
        genlist = []         # corresponding generation counts&lt;br /&gt;
&lt;br /&gt;
        for j in xrange(4000):&lt;br /&gt;
&lt;br /&gt;
            g.run(30)&lt;br /&gt;
&lt;br /&gt;
            h = g.hash(prect)&lt;br /&gt;
&lt;br /&gt;
            # determine where to insert h into hashlist&lt;br /&gt;
            pos = 0&lt;br /&gt;
            listlen = len(hashlist)&lt;br /&gt;
            while pos &amp;lt; listlen:&lt;br /&gt;
                if h &amp;gt; hashlist[pos]:&lt;br /&gt;
                    pos += 1&lt;br /&gt;
                elif h &amp;lt; hashlist[pos]:&lt;br /&gt;
                    # shorten lists and append info below&lt;br /&gt;
                    del hashlist[pos : listlen]&lt;br /&gt;
                    del genlist[pos : listlen]&lt;br /&gt;
                    break&lt;br /&gt;
                else:&lt;br /&gt;
                    period = (int(g.getgen()) - genlist[pos])&lt;br /&gt;
&lt;br /&gt;
                    prevpop = g.getpop()&lt;br /&gt;
&lt;br /&gt;
                    for i in xrange(20):&lt;br /&gt;
                        g.run(period)&lt;br /&gt;
                        currpop = g.getpop()&lt;br /&gt;
                        if (currpop != prevpop):&lt;br /&gt;
                            period = max(period, 4000)&lt;br /&gt;
                            break&lt;br /&gt;
                        prevpop = currpop&lt;br /&gt;
                        &lt;br /&gt;
                    return max(1 + int(math.log(period, 2)),3)&lt;br /&gt;
&lt;br /&gt;
            hashlist.insert(pos, h)&lt;br /&gt;
            genlist.insert(pos, int(g.getgen()))&lt;br /&gt;
&lt;br /&gt;
        g.setalgo(&amp;quot;HashLife&amp;quot;)&lt;br /&gt;
        g.setrule(self.rg.slashed)&lt;br /&gt;
        g.setbase(2)&lt;br /&gt;
        g.setstep(16)&lt;br /&gt;
        g.step()&lt;br /&gt;
        stepsize = 12&lt;br /&gt;
        g.setalgo(&amp;quot;QuickLife&amp;quot;)&lt;br /&gt;
        g.setrule(self.rg.slashed)&lt;br /&gt;
&lt;br /&gt;
        return 12&lt;br /&gt;
&lt;br /&gt;
    # Differs from oscar.py in that it detects absolute cycles, not eventual cycles.&lt;br /&gt;
    def bijoscar(self, maxsteps):&lt;br /&gt;
&lt;br /&gt;
        initpop = int(g.getpop())&lt;br /&gt;
        initrect = g.getrect()&lt;br /&gt;
        if (len(initrect) == 0):&lt;br /&gt;
            return 0&lt;br /&gt;
        inithash = g.hash(initrect)&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(maxsteps):&lt;br /&gt;
&lt;br /&gt;
            g.run(1)&lt;br /&gt;
&lt;br /&gt;
            if (int(g.getpop()) == initpop):&lt;br /&gt;
&lt;br /&gt;
                prect = g.getrect()&lt;br /&gt;
                phash = g.hash(prect)&lt;br /&gt;
&lt;br /&gt;
                if (phash == inithash):&lt;br /&gt;
&lt;br /&gt;
                    period = i + 1&lt;br /&gt;
&lt;br /&gt;
                    if (prect == initrect):&lt;br /&gt;
                        return period&lt;br /&gt;
                    else:&lt;br /&gt;
                        return -period&lt;br /&gt;
        return -1&lt;br /&gt;
&lt;br /&gt;
    # For a non-moving unidentified object, we check the dictionary of&lt;br /&gt;
    # memoized decompositions of possibly-pseudo-objects. If the object is&lt;br /&gt;
    # not already in the dictionary, it will be memoized.&lt;br /&gt;
    #&lt;br /&gt;
    # Low-period spaceships are also separated by this routine, although&lt;br /&gt;
    # this is less important now that there is a more bespoke prodecure&lt;br /&gt;
    # to handle disjoint unions of standard spaceships.&lt;br /&gt;
    #&lt;br /&gt;
    # @param moving  a bool which specifies whether the object is moving&lt;br /&gt;
    def enter_unid(self, unidname, soupid, moving):&lt;br /&gt;
&lt;br /&gt;
        if not(unidname in self.decompositions):&lt;br /&gt;
&lt;br /&gt;
            # Separate into pure components:&lt;br /&gt;
            if (moving):&lt;br /&gt;
                g.setrule(&amp;quot;APG_CoalesceObjects_&amp;quot; + self.rg.alphanumeric)&lt;br /&gt;
                g.setbase(2)&lt;br /&gt;
                g.setstep(3)&lt;br /&gt;
                g.step()&lt;br /&gt;
            else:&lt;br /&gt;
                pseudo_bangbang(self.rg.alphanumeric)&lt;br /&gt;
&lt;br /&gt;
            listoflists = [] # which incidentally don&#039;t contain themselves.&lt;br /&gt;
&lt;br /&gt;
            # Someone who plays the celllo:&lt;br /&gt;
            celllist = g.join(g.getcells(g.getrect()), [0])&lt;br /&gt;
&lt;br /&gt;
            for i in xrange(0, len(celllist)-1, 3):&lt;br /&gt;
                if (g.getcell(celllist[i], celllist[i+1]) != 0):&lt;br /&gt;
                    livecells = self.grabobj(celllist[i], celllist[i+1])&lt;br /&gt;
                    if (len(livecells) &amp;gt; 0):&lt;br /&gt;
                        listoflists.append(livecells)&lt;br /&gt;
&lt;br /&gt;
            listofobjs = []&lt;br /&gt;
&lt;br /&gt;
            for livecells in listoflists:&lt;br /&gt;
&lt;br /&gt;
                g.new(&amp;quot;Subcomponent&amp;quot;)&lt;br /&gt;
                g.setalgo(&amp;quot;QuickLife&amp;quot;)&lt;br /&gt;
                g.setrule(self.rg.slashed)&lt;br /&gt;
                g.putcells(livecells)&lt;br /&gt;
                period = self.bijoscar(1000)&lt;br /&gt;
                canonised = canonise(abs(period))&lt;br /&gt;
                if (period &amp;lt; 0):&lt;br /&gt;
                    listofobjs.append(&amp;quot;xq&amp;quot;+str(0-period)+&amp;quot;_&amp;quot;+canonised)&lt;br /&gt;
                elif (period == 1):&lt;br /&gt;
                    listofobjs.append(&amp;quot;xs&amp;quot;+str(len(livecells)/2)+&amp;quot;_&amp;quot;+canonised)&lt;br /&gt;
                else:&lt;br /&gt;
                    listofobjs.append(&amp;quot;xp&amp;quot;+str(period)+&amp;quot;_&amp;quot;+canonised)&lt;br /&gt;
&lt;br /&gt;
            self.decompositions[unidname] = listofobjs&lt;br /&gt;
&lt;br /&gt;
        # Actually add to the census:&lt;br /&gt;
        for comp in self.decompositions[unidname]:&lt;br /&gt;
            self.incobject(comp, 1)&lt;br /&gt;
            self.awardpoints2(soupid, comp)&lt;br /&gt;
&lt;br /&gt;
    # This function has lots of arguments (hence the name):&lt;br /&gt;
    #&lt;br /&gt;
    # @param gsize     the square-root of the number of soups per page&lt;br /&gt;
    # @param gspacing  the minimum distance between centres of soups&lt;br /&gt;
    # @param ashes     a list of cell lists&lt;br /&gt;
    # @param stepsize  binary logarithm of amount of time to coalesce objects&lt;br /&gt;
    # @param intergen  binary logarithm of amount of time to run HashLife&lt;br /&gt;
    # @param pos       the index of the first soup on the page&lt;br /&gt;
    def teenager(self, gsize, gspacing, ashes, stepsize, intergen, pos):&lt;br /&gt;
&lt;br /&gt;
        # For error-correction:&lt;br /&gt;
        if (intergen &amp;gt; 0):&lt;br /&gt;
            g.setalgo(&amp;quot;HashLife&amp;quot;)&lt;br /&gt;
            g.setrule(self.rg.slashed)&lt;br /&gt;
&lt;br /&gt;
        # If this gets incremented, we panic and perform error-correction:&lt;br /&gt;
        pathological = 0&lt;br /&gt;
&lt;br /&gt;
        # Draw the soups:&lt;br /&gt;
        for i in xrange(gsize * gsize):&lt;br /&gt;
&lt;br /&gt;
            x = int(i % gsize)&lt;br /&gt;
            y = int(i / gsize)&lt;br /&gt;
&lt;br /&gt;
            g.putcells(ashes[3*i], gspacing * x, gspacing * y)&lt;br /&gt;
&lt;br /&gt;
        # Because why not?&lt;br /&gt;
        g.fit()&lt;br /&gt;
        g.update()&lt;br /&gt;
&lt;br /&gt;
        # For error-correction:&lt;br /&gt;
        if (intergen &amp;gt; 0):&lt;br /&gt;
            g.setbase(2)&lt;br /&gt;
            g.setstep(intergen)&lt;br /&gt;
            g.step()&lt;br /&gt;
&lt;br /&gt;
        # Apply rules to coalesce objects and expunge annoyances such as&lt;br /&gt;
        # blocks, blinkers, beehives and gliders:&lt;br /&gt;
        start_time = time.clock()&lt;br /&gt;
        self.census(stepsize)&lt;br /&gt;
        end_time = time.clock()&lt;br /&gt;
        self.ruletime += (end_time - start_time)&lt;br /&gt;
&lt;br /&gt;
        # Now begin identifying objects:&lt;br /&gt;
        start_time = time.clock()&lt;br /&gt;
        celllist = g.join(g.getcells(g.getrect()), [0])&lt;br /&gt;
&lt;br /&gt;
        if (len(celllist) &amp;gt; 2):&lt;br /&gt;
            for i in xrange(0, len(celllist)-1, 3):&lt;br /&gt;
                if (g.getcell(celllist[i], celllist[i+1]) != 0):&lt;br /&gt;
                    self.gridobj(celllist[i], celllist[i+1], gsize, gspacing, pos)&lt;br /&gt;
&lt;br /&gt;
        # If we have leftover unidentified objects, attempt to canonise them:&lt;br /&gt;
        while (len(self.unids) &amp;gt; 0):&lt;br /&gt;
            ux = int(0.5 + float(self.unids[-2])/float(gspacing))&lt;br /&gt;
            uy = int(0.5 + float(self.unids[-1])/float(gspacing))&lt;br /&gt;
            soupid = ux + (uy * gsize) + pos&lt;br /&gt;
            unidname = self.process_unid()&lt;br /&gt;
            if (unidname == &amp;quot;PATHOLOGICAL&amp;quot;):&lt;br /&gt;
                pathological += 1&lt;br /&gt;
            if (unidname != &amp;quot;nothing&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
                if ((unidname[0] == &#039;U&#039;) &amp;amp; (unidname[1] == &#039;S&#039;) &amp;amp; (unidname[2] == &#039;S&#039;)):&lt;br /&gt;
                    &lt;br /&gt;
                    # Union of standard spaceships:&lt;br /&gt;
                    countlist = unidname.split(&#039;_&#039;)&lt;br /&gt;
                    &lt;br /&gt;
                    self.incobject(&amp;quot;xq4_6frc&amp;quot;, int(countlist[1]))&lt;br /&gt;
                    for i in xrange(int(countlist[1])):&lt;br /&gt;
                        self.awardpoints2(soupid, &amp;quot;xq4_6frc&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    self.incobject(&amp;quot;xq4_27dee6&amp;quot;, int(countlist[2]))&lt;br /&gt;
                    for i in xrange(int(countlist[2])):&lt;br /&gt;
                        self.awardpoints2(soupid, &amp;quot;xq4_27dee6&amp;quot;)&lt;br /&gt;
                        &lt;br /&gt;
                    self.incobject(&amp;quot;xq4_27deee6&amp;quot;, int(countlist[3]))&lt;br /&gt;
                    for i in xrange(int(countlist[3])):&lt;br /&gt;
                        self.awardpoints2(soupid, &amp;quot;xq4_27deee6&amp;quot;)&lt;br /&gt;
                        &lt;br /&gt;
                elif ((unidname[0] == &#039;x&#039;) &amp;amp; ((unidname[1] == &#039;s&#039;) | (unidname[1] == &#039;p&#039;))):&lt;br /&gt;
                    self.enter_unid(unidname, soupid, False)&lt;br /&gt;
                else:&lt;br /&gt;
                    if ((unidname[0] == &#039;x&#039;) &amp;amp; (unidname[1] == &#039;q&#039;) &amp;amp; (unidname[3] == &#039;_&#039;)):&lt;br /&gt;
                        # Separates low-period (&amp;lt;= 9) non-standard spaceships in medium proximity:&lt;br /&gt;
                        self.enter_unid(unidname, soupid, True)&lt;br /&gt;
                    else:&lt;br /&gt;
                        self.incobject(unidname, 1)&lt;br /&gt;
                        self.awardpoints2(soupid, unidname)&lt;br /&gt;
&lt;br /&gt;
        end_time = time.clock()&lt;br /&gt;
        self.gridtime += (end_time - start_time)&lt;br /&gt;
&lt;br /&gt;
        return pathological&lt;br /&gt;
&lt;br /&gt;
    def stabilise_soups_parallel(self, root, pos, gsize, sym):&lt;br /&gt;
&lt;br /&gt;
        souplist = [[sym, root + str(pos + i)] for i in xrange(gsize * gsize)]&lt;br /&gt;
&lt;br /&gt;
        return self.stabilise_soups_parallel_orig(gsize, souplist, pos)&lt;br /&gt;
&lt;br /&gt;
    def stabilise_soups_parallel_list(self, gsize, stringlist, pos):&lt;br /&gt;
&lt;br /&gt;
        souplist = [s.split(&#039;/&#039;) for s in stringlist]&lt;br /&gt;
&lt;br /&gt;
        return self.stabilise_soups_parallel_orig(gsize, souplist, pos)&lt;br /&gt;
&lt;br /&gt;
    # This basically orchestrates everything:&lt;br /&gt;
    def stabilise_soups_parallel_orig(self, gsize, souplist, pos):&lt;br /&gt;
&lt;br /&gt;
        ashes = []&lt;br /&gt;
        stepsize = 3&lt;br /&gt;
&lt;br /&gt;
        g.new(&amp;quot;Random soups&amp;quot;)&lt;br /&gt;
        g.setalgo(&amp;quot;QuickLife&amp;quot;)&lt;br /&gt;
        g.setrule(self.rg.slashed)&lt;br /&gt;
&lt;br /&gt;
        gspacing = 0&lt;br /&gt;
&lt;br /&gt;
        # Generate and run the soups until stabilisation:&lt;br /&gt;
        for i in xrange(gsize * gsize):&lt;br /&gt;
&lt;br /&gt;
            if (i &amp;lt; len(souplist)):&lt;br /&gt;
&lt;br /&gt;
                sym = souplist[i][0]&lt;br /&gt;
                prehash = souplist[i][1]&lt;br /&gt;
&lt;br /&gt;
                # Generate the soup from the SHA-256 of the concatenation of the&lt;br /&gt;
                # seed with the index:&lt;br /&gt;
                g.putcells(hashsoup(prehash, sym), 0, 0)&lt;br /&gt;
&lt;br /&gt;
            # Run the soup until stabilisation:&lt;br /&gt;
            start_time = time.clock()&lt;br /&gt;
            stepsize = max(stepsize, self.stabilise3())&lt;br /&gt;
            end_time = time.clock()&lt;br /&gt;
            self.qlifetime += (end_time - start_time)&lt;br /&gt;
&lt;br /&gt;
            # Ironically, the spelling of this variable is incurrrect:&lt;br /&gt;
            currrect = g.getrect()&lt;br /&gt;
            ashes.append(g.getcells(currrect))&lt;br /&gt;
&lt;br /&gt;
            if (len(currrect) == 4):&lt;br /&gt;
                ashes.append(currrect[0])&lt;br /&gt;
                ashes.append(currrect[1])&lt;br /&gt;
                # Choose the grid spacing based on the size of the ash:&lt;br /&gt;
                gspacing = max(gspacing, 2*currrect[2])&lt;br /&gt;
                gspacing = max(gspacing, 2*currrect[3])&lt;br /&gt;
                g.select(currrect)&lt;br /&gt;
                g.clear(0)&lt;br /&gt;
            else:&lt;br /&gt;
                ashes.append(0)&lt;br /&gt;
                ashes.append(0)&lt;br /&gt;
            g.select([])&lt;br /&gt;
&lt;br /&gt;
        # Account for any extra enlargement caused by running CoalesceObjects:&lt;br /&gt;
        gspacing += 2 ** (stepsize + 1) + 1000&lt;br /&gt;
&lt;br /&gt;
        start_time = time.clock()&lt;br /&gt;
&lt;br /&gt;
        # Remember the dictionary, just in case we have a pathological object:&lt;br /&gt;
        prevdict = self.objectcounts.copy()&lt;br /&gt;
        prevscores = self.soupscores.copy()&lt;br /&gt;
        prevunids = self.superunids[:]&lt;br /&gt;
&lt;br /&gt;
        # Process the soups:&lt;br /&gt;
        returncode = self.teenager(gsize, gspacing, ashes, stepsize, 0, pos)&lt;br /&gt;
&lt;br /&gt;
        end_time = time.clock()&lt;br /&gt;
&lt;br /&gt;
        # Calculate the mean delay incurred (excluding qlifetime or error-correction):&lt;br /&gt;
        meandelay = (end_time - start_time) / (gsize * gsize)&lt;br /&gt;
&lt;br /&gt;
        if (returncode &amp;gt; 0):&lt;br /&gt;
            if (self.skipErrorCorrection == False):&lt;br /&gt;
                # Arrrggghhhh, there&#039;s a pathological object! Usually this means&lt;br /&gt;
                # that naive stabilisation detection returned a false positive.&lt;br /&gt;
                self.resets += 1&lt;br /&gt;
                &lt;br /&gt;
                # Reset the object counts:&lt;br /&gt;
                self.objectcounts = prevdict&lt;br /&gt;
                self.soupscores = prevscores&lt;br /&gt;
                self.superunids = prevunids&lt;br /&gt;
&lt;br /&gt;
                # 2^18 generations should suffice. This takes about 30 seconds in&lt;br /&gt;
                # HashLife, but error-correction only occurs very infrequently, so&lt;br /&gt;
                # this has a negligible impact on mean performance:&lt;br /&gt;
                gspacing += 2 ** 19&lt;br /&gt;
                stepsize = max(stepsize, 12)&lt;br /&gt;
                &lt;br /&gt;
                # Clear the universe:&lt;br /&gt;
                g.new(&amp;quot;Error-correcting phase&amp;quot;)&lt;br /&gt;
                self.teenager(gsize, gspacing, ashes, stepsize, 18, pos)&lt;br /&gt;
&lt;br /&gt;
        # Erase any ashes. Not least because England usually loses...&lt;br /&gt;
        ashes = []&lt;br /&gt;
&lt;br /&gt;
        # Return the mean delay so that we can use machine-learning to&lt;br /&gt;
        # find the optimal value of sqrtspp:&lt;br /&gt;
        return meandelay&lt;br /&gt;
&lt;br /&gt;
    def reset(self):&lt;br /&gt;
&lt;br /&gt;
        self.objectcounts = {}&lt;br /&gt;
        self.soupscores = {}&lt;br /&gt;
        self.alloccur = {}&lt;br /&gt;
        self.superunids = []&lt;br /&gt;
        self.unids = []&lt;br /&gt;
&lt;br /&gt;
    # Pop the last unidentified object from the stack, and attempt to&lt;br /&gt;
    # ascertain its period and classify it.&lt;br /&gt;
    def process_unid(self):&lt;br /&gt;
&lt;br /&gt;
        g.new(&amp;quot;Unidentified object&amp;quot;)&lt;br /&gt;
        g.setalgo(&amp;quot;QuickLife&amp;quot;)&lt;br /&gt;
        g.setrule(self.rg.slashed)&lt;br /&gt;
        y = self.unids.pop()&lt;br /&gt;
        x = self.unids.pop()&lt;br /&gt;
        livecells = self.unids.pop()&lt;br /&gt;
        bitstring = self.unids.pop()&lt;br /&gt;
        g.putcells(livecells, -x, -y, 1, 0, 0, 1, &amp;quot;or&amp;quot;)&lt;br /&gt;
        period = self.bijoscar(1000)&lt;br /&gt;
        &lt;br /&gt;
        if (period == -1):&lt;br /&gt;
            # Infinite growth pattern, probably. Most infinite-growth&lt;br /&gt;
            # patterns are linear-growth (such as puffers, wickstretchers,&lt;br /&gt;
            # guns etc.) so we analyse to see whether we have a linear-&lt;br /&gt;
            # growth pattern:&lt;br /&gt;
            descriptor = linearlyse(1500)&lt;br /&gt;
            if (descriptor[0] == &amp;quot;y&amp;quot;):&lt;br /&gt;
                return descriptor&lt;br /&gt;
&lt;br /&gt;
            # Similarly check for irregular power-law growth. This will&lt;br /&gt;
            # catch replicators, for instance. Spend around 375 000&lt;br /&gt;
            # generations; this seems like a reasonable amount of time.&lt;br /&gt;
            descriptor = powerlyse(8, 1500)&lt;br /&gt;
            if (descriptor[0] == &amp;quot;z&amp;quot;):&lt;br /&gt;
                return descriptor&lt;br /&gt;
&lt;br /&gt;
            # It may be an unstabilised ember that slipped through the net,&lt;br /&gt;
            # but this will be handled by error-correction (unless it&lt;br /&gt;
            # persists another 2^18 gens, which is so unbelievably improbable&lt;br /&gt;
            # that you are more likely to be picked up by a passing ship in&lt;br /&gt;
            # the vacuum of space).&lt;br /&gt;
            self.superunids.append(livecells)&lt;br /&gt;
            self.superunids.append(x)&lt;br /&gt;
            self.superunids.append(y)&lt;br /&gt;
            &lt;br /&gt;
            return &amp;quot;PATHOLOGICAL&amp;quot;&lt;br /&gt;
        elif (period == 0):&lt;br /&gt;
            return &amp;quot;nothing&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            if (period == -4):&lt;br /&gt;
&lt;br /&gt;
                triple = countxwsses()&lt;br /&gt;
&lt;br /&gt;
                if (triple != (-1, -1, -1)):&lt;br /&gt;
&lt;br /&gt;
                    # Union of Standard Spaceships:&lt;br /&gt;
                    return (&amp;quot;USS_&amp;quot; + str(triple[0]) + &amp;quot;_&amp;quot; + str(triple[1]) + &amp;quot;_&amp;quot; + str(triple[2]))&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            canonised = canonise(abs(period))&lt;br /&gt;
&lt;br /&gt;
            if (canonised == &amp;quot;#&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
                # Okay, we know that it&#039;s an oscillator or spaceship with&lt;br /&gt;
                # a non-astronomical period. But it&#039;s too large to canonise&lt;br /&gt;
                # in any of its phases (i.e. transcends a 40-by-40 box).&lt;br /&gt;
                self.superunids.append(livecells)&lt;br /&gt;
                self.superunids.append(x)&lt;br /&gt;
                self.superunids.append(y)&lt;br /&gt;
                &lt;br /&gt;
                # Append a suffix according to whether it is a still-life,&lt;br /&gt;
                # oscillator or moving object:&lt;br /&gt;
                if (period == 1):&lt;br /&gt;
                    descriptor = (&amp;quot;ov_s&amp;quot;+str(len(livecells)/2))&lt;br /&gt;
                elif (period &amp;gt; 0):&lt;br /&gt;
                    descriptor = (&amp;quot;ov_p&amp;quot;+str(period))&lt;br /&gt;
                else:&lt;br /&gt;
                    descriptor = (&amp;quot;ov_q&amp;quot;+str(0-period))&lt;br /&gt;
&lt;br /&gt;
                return descriptor&lt;br /&gt;
            &lt;br /&gt;
            else:&lt;br /&gt;
&lt;br /&gt;
                # Prepend a prefix according to whether it is a still-life,&lt;br /&gt;
                # oscillator or moving object:&lt;br /&gt;
                if (period == 1):&lt;br /&gt;
                    descriptor = (&amp;quot;xs&amp;quot;+str(len(livecells)/2)+&amp;quot;_&amp;quot;+canonised)&lt;br /&gt;
                elif (period &amp;gt; 0):&lt;br /&gt;
                    descriptor = (&amp;quot;xp&amp;quot;+str(period)+&amp;quot;_&amp;quot;+canonised)&lt;br /&gt;
                else:&lt;br /&gt;
                    descriptor = (&amp;quot;xq&amp;quot;+str(0-period)+&amp;quot;_&amp;quot;+canonised)&lt;br /&gt;
&lt;br /&gt;
                if (bitstring &amp;gt; 0):&lt;br /&gt;
                    self.cache[bitstring] = descriptor&lt;br /&gt;
&lt;br /&gt;
                return descriptor&lt;br /&gt;
&lt;br /&gt;
    # This doesn&#039;t really do much, since unids should be empty and&lt;br /&gt;
    # actual pathological/oversized objects will rarely arise naturally.&lt;br /&gt;
    def display_unids(self):&lt;br /&gt;
&lt;br /&gt;
        g.new(&amp;quot;Unidentified objects&amp;quot;)&lt;br /&gt;
        g.setalgo(&amp;quot;QuickLife&amp;quot;)&lt;br /&gt;
        g.setrule(self.rg.slashed)&lt;br /&gt;
&lt;br /&gt;
        rowlength = 1 + int(math.sqrt(len(self.superunids)/3))&lt;br /&gt;
&lt;br /&gt;
        for i in xrange(len(self.superunids)/3):&lt;br /&gt;
&lt;br /&gt;
            xpos = i % rowlength&lt;br /&gt;
            ypos = int(i / rowlength)&lt;br /&gt;
&lt;br /&gt;
            g.putcells(self.superunids[3*i], xpos * (self.gridsize + 8) - self.superunids[3*i + 1], ypos * (self.gridsize + 8) - self.superunids[3*i + 2], 1, 0, 0, 1, &amp;quot;or&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        g.fit()&lt;br /&gt;
        g.update()&lt;br /&gt;
&lt;br /&gt;
    def compactify_scores(self):&lt;br /&gt;
&lt;br /&gt;
        # Number of soups to record:&lt;br /&gt;
        highscores = 100&lt;br /&gt;
        ilist = sorted(self.soupscores.iteritems(), key=operator.itemgetter(1), reverse=True)&lt;br /&gt;
&lt;br /&gt;
        # Empty the high score table:&lt;br /&gt;
        self.soupscores = {}&lt;br /&gt;
        &lt;br /&gt;
        for soupnum, score in ilist[:highscores]:&lt;br /&gt;
            self.soupscores[soupnum] = score&lt;br /&gt;
&lt;br /&gt;
    # Saves a machine-readable textual file containing the census:&lt;br /&gt;
    def save_progress(self, numsoups, root, symmetry=&#039;C1&#039;, save_file=True, payosha256_key=None):&lt;br /&gt;
&lt;br /&gt;
        g.show(&amp;quot;Saving progress...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Count the total number of objects:&lt;br /&gt;
        totobjs = 0&lt;br /&gt;
        censustable = &amp;quot;@CENSUS TABLE\n&amp;quot;&lt;br /&gt;
        tlist = sorted(self.objectcounts.iteritems(), key=operator.itemgetter(1), reverse=True)&lt;br /&gt;
        for objname, count in tlist:&lt;br /&gt;
            totobjs += count&lt;br /&gt;
            censustable += objname + &amp;quot; &amp;quot; + str(count) + &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        g.show(&amp;quot;Writing header information...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # The MD5 hash of the root string:&lt;br /&gt;
        md5root = hashlib.md5(root).hexdigest()&lt;br /&gt;
&lt;br /&gt;
        # Header information:&lt;br /&gt;
        results = &amp;quot;@VERSION v1.1\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;@MD5 &amp;quot;+md5root+&amp;quot;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;@ROOT &amp;quot;+root+&amp;quot;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;@RULE &amp;quot;+self.rg.alphanumeric+&amp;quot;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;@SYMMETRY &amp;quot;+symmetry+&amp;quot;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;@NUM_SOUPS &amp;quot;+str(numsoups)+&amp;quot;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;@NUM_OBJECTS &amp;quot;+str(totobjs)+&amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        results += &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        # Census table:&lt;br /&gt;
        results += censustable&lt;br /&gt;
&lt;br /&gt;
        g.show(&amp;quot;Compactifying score table...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        results += &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        # Number of soups to record:&lt;br /&gt;
        highscores = 100&lt;br /&gt;
&lt;br /&gt;
        results += &amp;quot;@TOP &amp;quot;+str(highscores)+&amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        ilist = sorted(self.soupscores.iteritems(), key=operator.itemgetter(1), reverse=True)&lt;br /&gt;
&lt;br /&gt;
        # Empty the high score table:&lt;br /&gt;
        self.soupscores = {}&lt;br /&gt;
        &lt;br /&gt;
        for soupnum, score in ilist[:highscores]:&lt;br /&gt;
            self.soupscores[soupnum] = score&lt;br /&gt;
            results += str(soupnum) + &amp;quot; &amp;quot; + str(score) + &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        g.show(&amp;quot;Saving soupids for rare objects...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        results += &amp;quot;\n@SAMPLE_SOUPIDS\n&amp;quot;&lt;br /&gt;
        for objname, count in tlist:&lt;br /&gt;
            # blinkers and gliders have no alloccur[] entry for some reason,&lt;br /&gt;
            # so the line below avoids errors in B3/S23, maybe other rules too?&lt;br /&gt;
            if objname in self.alloccur:&lt;br /&gt;
                results += objname&lt;br /&gt;
                for soup in self.alloccur[objname]:&lt;br /&gt;
                    results += &amp;quot; &amp;quot; + str(soup)&lt;br /&gt;
                results += &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        g.show(&amp;quot;Writing progress file...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        dirname = g.getdir(&amp;quot;data&amp;quot;)&lt;br /&gt;
        separator = dirname[-1]&lt;br /&gt;
        progresspath = dirname + &amp;quot;apgsearch&amp;quot; + separator + &amp;quot;progress&amp;quot; + separator&lt;br /&gt;
        if not os.path.exists(progresspath):&lt;br /&gt;
            os.makedirs(progresspath)&lt;br /&gt;
&lt;br /&gt;
        filename = progresspath + &amp;quot;search_&amp;quot; + md5root + &amp;quot;.txt&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        try:&lt;br /&gt;
            f = open(filename, &#039;w&#039;)&lt;br /&gt;
            f.write(results)&lt;br /&gt;
            f.close()&lt;br /&gt;
        except:&lt;br /&gt;
            g.warn(&amp;quot;Unable to create progress file:\n&amp;quot; + filename)&lt;br /&gt;
&lt;br /&gt;
        if payosha256_key is not None:&lt;br /&gt;
            if (len(payosha256_key) &amp;gt; 0):&lt;br /&gt;
                return catagolue_results(results, payosha256_key, &amp;quot;post_apgsearch_haul&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Save soup RLE:&lt;br /&gt;
    def save_soup(self, root, soupnum, symmetry):&lt;br /&gt;
&lt;br /&gt;
        # Soup pattern will be stored in a temporary directory:&lt;br /&gt;
        souphash = hashlib.sha256(root + str(soupnum))&lt;br /&gt;
        rlepath = souphash.hexdigest()&lt;br /&gt;
        rlepath = g.getdir(&amp;quot;temp&amp;quot;) + rlepath + &amp;quot;.rle&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        results = &amp;quot;&amp;lt;a href=\&amp;quot;open:&amp;quot; + rlepath + &amp;quot;\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
        results += str(soupnum)&lt;br /&gt;
        results += &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        # Try to write soup patterns to file &amp;quot;rlepath&amp;quot;:&lt;br /&gt;
        try:&lt;br /&gt;
            g.store(hashsoup(root + str(soupnum), symmetry), rlepath)&lt;br /&gt;
        except:&lt;br /&gt;
            g.warn(&amp;quot;Unable to create soup pattern:\n&amp;quot; + rlepath)&lt;br /&gt;
&lt;br /&gt;
        return results&lt;br /&gt;
        &lt;br /&gt;
    # Display results in Help window:&lt;br /&gt;
    def display_census(self, numsoups, root, symmetry):&lt;br /&gt;
&lt;br /&gt;
        dirname = g.getdir(&amp;quot;data&amp;quot;)&lt;br /&gt;
        separator = dirname[-1]&lt;br /&gt;
        apgpath = dirname + &amp;quot;apgsearch&amp;quot; + separator&lt;br /&gt;
        objectspath = apgpath + &amp;quot;objects&amp;quot; + separator + self.rg.alphanumeric + separator&lt;br /&gt;
        if not os.path.exists(objectspath):&lt;br /&gt;
            os.makedirs(objectspath)&lt;br /&gt;
&lt;br /&gt;
        results = &amp;quot;&amp;lt;html&amp;gt;\n&amp;lt;title&amp;gt;Census results&amp;lt;/title&amp;gt;\n&amp;lt;body bgcolor=\&amp;quot;#FFFFCE\&amp;quot;&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;p&amp;gt;Census results after processing &amp;quot; + str(numsoups) + &amp;quot; soups (seed = &amp;quot; + root + &amp;quot;, symmetry = &amp;quot; + symmetry + &amp;quot;):\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        tlist = sorted(self.objectcounts.iteritems(), key=operator.itemgetter(1), reverse=True)    &lt;br /&gt;
        results += &amp;quot;&amp;lt;p&amp;gt;&amp;lt;center&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;table cellspacing=1 border=2 cols=2&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; Object &amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt; Common name &amp;lt;/td&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;td align=right&amp;gt; Count &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; Sample occurrences &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n&amp;quot;&lt;br /&gt;
        for objname, count in tlist:&lt;br /&gt;
            if (objname[0] == &#039;x&#039;):&lt;br /&gt;
                if (objname[1] == &#039;p&#039;):&lt;br /&gt;
                    results += &amp;quot;&amp;lt;tr bgcolor=\&amp;quot;#CECECF\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
                elif (objname[1] == &#039;q&#039;):&lt;br /&gt;
                    results += &amp;quot;&amp;lt;tr bgcolor=\&amp;quot;#CEFFCE\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
                else:&lt;br /&gt;
                    results += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;
            else:&lt;br /&gt;
                results += &amp;quot;&amp;lt;tr bgcolor=\&amp;quot;#FFCECE\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
            results += &amp;quot;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
            results += &amp;quot; &amp;quot;&lt;br /&gt;
            &lt;br /&gt;
            # Using &amp;quot;open:&amp;quot; link enables one to click on the object name to open the pattern in Golly:&lt;br /&gt;
            rlepath = objectspath + objname + &amp;quot;.rle&amp;quot;&lt;br /&gt;
            if (objname[0] == &#039;x&#039;):&lt;br /&gt;
                results += &amp;quot;&amp;lt;a href=\&amp;quot;open:&amp;quot; + rlepath + &amp;quot;\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
            # If the name is longer than that of the block-laying switch engine:&lt;br /&gt;
            if len(objname) &amp;gt; 51:&lt;br /&gt;
                # Contract name and include ellipsis:&lt;br /&gt;
                results += objname[:40] + &amp;quot;…&amp;quot; + objname[-10:]&lt;br /&gt;
            else:&lt;br /&gt;
                results += objname&lt;br /&gt;
            if (objname[0] == &#039;x&#039;):&lt;br /&gt;
                results += &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
            results += &amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
            if (objname[0] == &#039;x&#039;):&lt;br /&gt;
                # save object in rlepath if it doesn&#039;t exist&lt;br /&gt;
                if not os.path.exists(rlepath):&lt;br /&gt;
                    # Canonised objects are at most 40-by-40:&lt;br /&gt;
                    rledata = &amp;quot;x = 40, y = 40, rule = &amp;quot; + self.rg.slashed + &amp;quot;\n&amp;quot;&lt;br /&gt;
                    # http://ferkeltongs.livejournal.com/15837.html&lt;br /&gt;
                    compact = objname.split(&#039;_&#039;)[1] + &amp;quot;z&amp;quot;&lt;br /&gt;
                    i = 0&lt;br /&gt;
                    strip = []&lt;br /&gt;
                    while (i &amp;lt; len(compact)):&lt;br /&gt;
                        c = ord2(compact[i])&lt;br /&gt;
                        if (c &amp;gt;= 0):&lt;br /&gt;
                            if (c &amp;lt; 32):&lt;br /&gt;
                                # Conventional character:&lt;br /&gt;
                                strip.append(c)&lt;br /&gt;
                            else:&lt;br /&gt;
                                if (c == 35):&lt;br /&gt;
                                    # End of line:&lt;br /&gt;
                                    if (len(strip) == 0):&lt;br /&gt;
                                        strip.append(0)&lt;br /&gt;
                                    for j in xrange(5):&lt;br /&gt;
                                        for d in strip:&lt;br /&gt;
                                            if ((d &amp;amp; (1 &amp;lt;&amp;lt; j)) &amp;gt; 0):&lt;br /&gt;
                                                rledata += &amp;quot;o&amp;quot;&lt;br /&gt;
                                            else:&lt;br /&gt;
                                                rledata += &amp;quot;b&amp;quot;&lt;br /&gt;
                                        rledata += &amp;quot;$\n&amp;quot;&lt;br /&gt;
                                    strip = []&lt;br /&gt;
                                else:&lt;br /&gt;
                                    # Multispace character:&lt;br /&gt;
                                    strip.append(0)&lt;br /&gt;
                                    strip.append(0)&lt;br /&gt;
                                    if (c &amp;gt;= 33):&lt;br /&gt;
                                        strip.append(0)&lt;br /&gt;
                                    if (c == 34):&lt;br /&gt;
                                        strip.append(0)&lt;br /&gt;
                                        i += 1&lt;br /&gt;
                                        d = ord2(compact[i])&lt;br /&gt;
                                        for j in xrange(d):&lt;br /&gt;
                                            strip.append(0)&lt;br /&gt;
                        i += 1&lt;br /&gt;
                    # End of pattern representation:&lt;br /&gt;
                    rledata += &amp;quot;!\n&amp;quot;&lt;br /&gt;
                    try:&lt;br /&gt;
                        f = open(rlepath, &#039;w&#039;)&lt;br /&gt;
                        f.write(rledata)&lt;br /&gt;
                        f.close()&lt;br /&gt;
                    except:&lt;br /&gt;
                        g.warn(&amp;quot;Unable to create object pattern:\n&amp;quot; + rlepath)&lt;br /&gt;
            &lt;br /&gt;
            results += &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt; &amp;quot;&lt;br /&gt;
            if (objname in self.commonnames):&lt;br /&gt;
                results += self.commonnames[objname][0]&lt;br /&gt;
            results += &amp;quot; &amp;lt;/td&amp;gt;&amp;lt;td align=right&amp;gt; &amp;quot; + str(count) + &amp;quot; &amp;quot;&lt;br /&gt;
            results += &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
            if objname in self.alloccur:&lt;br /&gt;
                results += &amp;quot; &amp;quot;&lt;br /&gt;
                for soup in self.alloccur[objname]:&lt;br /&gt;
                    results += self.save_soup(root, soup, symmetry) &lt;br /&gt;
                    results += &amp;quot; &amp;quot;&lt;br /&gt;
            results += &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;/table&amp;gt;\n&amp;lt;/center&amp;gt;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        ilist = sorted(self.soupscores.iteritems(), key=operator.itemgetter(1), reverse=True)&lt;br /&gt;
        results += &amp;quot;&amp;lt;p&amp;gt;&amp;lt;center&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;table cellspacing=1 border=2 cols=2&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; Soup number &amp;lt;/td&amp;gt;&amp;lt;td align=right&amp;gt; Score &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n&amp;quot;&lt;br /&gt;
        for soupnum, score in ilist[:50]:&lt;br /&gt;
            results += &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; &amp;quot;&lt;br /&gt;
            results += self.save_soup(root, soupnum, symmetry)&lt;br /&gt;
            results += &amp;quot; &amp;lt;/td&amp;gt;&amp;lt;td align=right&amp;gt; &amp;quot; + str(score) + &amp;quot; &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        results += &amp;quot;&amp;lt;/table&amp;gt;\n&amp;lt;/center&amp;gt;\n&amp;quot;&lt;br /&gt;
        results += &amp;quot;&amp;lt;/body&amp;gt;\n&amp;lt;/html&amp;gt;\n&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        htmlname = apgpath + &amp;quot;latest_census.html&amp;quot;&lt;br /&gt;
        try:&lt;br /&gt;
            f = open(htmlname, &#039;w&#039;)&lt;br /&gt;
            f.write(results)&lt;br /&gt;
            f.close()&lt;br /&gt;
            g.open(htmlname)&lt;br /&gt;
        except:&lt;br /&gt;
            g.warn(&amp;quot;Unable to create html file:\n&amp;quot; + htmlname)&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
# Converts a base-36 case-insensitive alphanumeric character into a&lt;br /&gt;
# numerical value.&lt;br /&gt;
def ord2(char):&lt;br /&gt;
&lt;br /&gt;
    x = ord(char)&lt;br /&gt;
&lt;br /&gt;
    if ((x &amp;gt;= 48) &amp;amp; (x &amp;lt; 58)):&lt;br /&gt;
        return x - 48&lt;br /&gt;
&lt;br /&gt;
    if ((x &amp;gt;= 65) &amp;amp; (x &amp;lt; 91)):&lt;br /&gt;
        return x - 55&lt;br /&gt;
&lt;br /&gt;
    if ((x &amp;gt;= 97) &amp;amp; (x &amp;lt; 123)):&lt;br /&gt;
        return x - 87&lt;br /&gt;
&lt;br /&gt;
    return -1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def apg_verify(rulestring, symmetry, payoshakey):&lt;br /&gt;
&lt;br /&gt;
    verifysoup = Soup()&lt;br /&gt;
    verifysoup.rg.setrule(rulestring)&lt;br /&gt;
    verifysoup.rg.saveAllRules()&lt;br /&gt;
&lt;br /&gt;
    return_point = [None]&lt;br /&gt;
&lt;br /&gt;
    catagolue_results(rulestring+&amp;quot;\n&amp;quot;+symmetry+&amp;quot;\n&amp;quot;, payoshakey, &amp;quot;verify_apgsearch_haul&amp;quot;, endpoint=&amp;quot;/verify&amp;quot;, return_point=return_point)&lt;br /&gt;
&lt;br /&gt;
    if return_point[0] is not None:&lt;br /&gt;
&lt;br /&gt;
        resplist = return_point[0].split(&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        if ((len(resplist) &amp;gt;= 4) and (resplist[1] == &amp;quot;yes&amp;quot;)):&lt;br /&gt;
&lt;br /&gt;
            md5 = resplist[2]&lt;br /&gt;
            passcode = resplist[3]&lt;br /&gt;
&lt;br /&gt;
            stringlist = resplist[4:]&lt;br /&gt;
&lt;br /&gt;
            stringlist = [s for s in stringlist if (len(s) &amp;gt; 0 and s[0] != &#039;*&#039;)]&lt;br /&gt;
&lt;br /&gt;
            # g.exit(stringlist[0])&lt;br /&gt;
&lt;br /&gt;
            gsize = 3&lt;br /&gt;
&lt;br /&gt;
            pos = 0&lt;br /&gt;
&lt;br /&gt;
            while (len(stringlist) &amp;gt; 0):&lt;br /&gt;
&lt;br /&gt;
                while (gsize * gsize &amp;gt; len(stringlist)):&lt;br /&gt;
&lt;br /&gt;
                    gsize -= 1&lt;br /&gt;
&lt;br /&gt;
                listhead = stringlist[:(gsize*gsize)]&lt;br /&gt;
                stringlist = stringlist[(gsize*gsize):]&lt;br /&gt;
&lt;br /&gt;
                verifysoup.stabilise_soups_parallel_list(gsize, listhead, pos)&lt;br /&gt;
&lt;br /&gt;
                pos += (gsize * gsize)&lt;br /&gt;
&lt;br /&gt;
            # verifysoup.display_census(-1, &amp;quot;verify&amp;quot;, &amp;quot;verify&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            payload = &amp;quot;@MD5 &amp;quot;+md5+&amp;quot;\n&amp;quot;&lt;br /&gt;
            payload += &amp;quot;@PASSCODE &amp;quot;+passcode+&amp;quot;\n&amp;quot;&lt;br /&gt;
            payload += &amp;quot;@RULE &amp;quot;+rulestring+&amp;quot;\n&amp;quot;&lt;br /&gt;
            payload += &amp;quot;@SYMMETRY &amp;quot;+symmetry+&amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            tlist = sorted(verifysoup.objectcounts.iteritems(), key=operator.itemgetter(1), reverse=True)&lt;br /&gt;
&lt;br /&gt;
            for objname, count in tlist:&lt;br /&gt;
&lt;br /&gt;
                payload += objname + &amp;quot; &amp;quot; + str(count) + &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            catagolue_results(payload, payoshakey, &amp;quot;submit_verification&amp;quot;, endpoint=&amp;quot;/verify&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def apg_main():&lt;br /&gt;
&lt;br /&gt;
    # ---------------- Hardcode the following inputs if running without a user interface ----------------&lt;br /&gt;
    orignumber = int(g.getstring(&amp;quot;How many soups to search between successive uploads?&amp;quot;, &amp;quot;5000000&amp;quot;))&lt;br /&gt;
    rulestring = g.getstring(&amp;quot;Which rule to use?&amp;quot;, &amp;quot;B3/S23&amp;quot;)&lt;br /&gt;
    symmstring = g.getstring(&amp;quot;What symmetries to use?&amp;quot;, &amp;quot;C1&amp;quot;)&lt;br /&gt;
    payoshakey = g.getstring(&amp;quot;Please enter your key (visit &amp;quot;+get_server_address()+&amp;quot;/payosha256 in your browser).&amp;quot;, &amp;quot;#anon&amp;quot;)&lt;br /&gt;
    # ---------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
    # Sanitise input:&lt;br /&gt;
    #orignumber = max(orignumber, 100000)&lt;br /&gt;
    #orignumber = min(orignumber, 100000000)&lt;br /&gt;
    number = orignumber&lt;br /&gt;
    initpos = 0&lt;br /&gt;
    if symmstring not in [&amp;quot;1x256X2+1&amp;quot;, &amp;quot;1x256X2&amp;quot;, &amp;quot;32x32&amp;quot;, &amp;quot;25p&amp;quot;, &amp;quot;75p&amp;quot;, &amp;quot;1x256&amp;quot;, &amp;quot;2x128&amp;quot;, &amp;quot;4x64&amp;quot;, &amp;quot;8x32&amp;quot;, &amp;quot;C1&amp;quot;, &amp;quot;C2_1&amp;quot;, &amp;quot;C2_2&amp;quot;, &amp;quot;C2_4&amp;quot;, &amp;quot;C4_1&amp;quot;, &amp;quot;C4_4&amp;quot;, &amp;quot;D2_+1&amp;quot;, &amp;quot;D2_+2&amp;quot;, &amp;quot;D2_x&amp;quot;, &amp;quot;D4_+1&amp;quot;, &amp;quot;D4_+2&amp;quot;, &amp;quot;D4_+4&amp;quot;, &amp;quot;D4_x1&amp;quot;, &amp;quot;D4_x4&amp;quot;, &amp;quot;D8_1&amp;quot;, &amp;quot;D8_4&amp;quot;]:&lt;br /&gt;
        g.exit(symmstring+&amp;quot; is not a valid symmetry option&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if symmstring in [&amp;quot;25p&amp;quot;]:&lt;br /&gt;
        g.exit(symmstring+&amp;quot; is faulty and DOES NOT WORK CORRECTLY&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    quitapg = False&lt;br /&gt;
&lt;br /&gt;
    # Create associated rule tables:&lt;br /&gt;
    soup = Soup()&lt;br /&gt;
    soup.rg.setrule(rulestring)&lt;br /&gt;
    soup.rg.saveAllRules()&lt;br /&gt;
&lt;br /&gt;
    # We have 100 soups per page, instead of one. This parallel approach&lt;br /&gt;
    # was suggested by Tomas Rokicki, and results in approximately a&lt;br /&gt;
    # fourfold increase in soup-searching speed!&lt;br /&gt;
    sqrtspp_optimal = 10&lt;br /&gt;
&lt;br /&gt;
    # Initialise the census:&lt;br /&gt;
    start_time = time.clock()&lt;br /&gt;
    f = (lambda x : &#039;abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789&#039;[ord(x) % 56])&lt;br /&gt;
    rootstring = &#039;&#039;.join(map(f, list(hashlib.sha256(payoshakey + datetime.datetime.now().isoformat()).digest()[:12])))&lt;br /&gt;
    scount = 0&lt;br /&gt;
&lt;br /&gt;
    while (quitapg == False):&lt;br /&gt;
&lt;br /&gt;
        # Peer-review some soups:&lt;br /&gt;
        for i in xrange(5):&lt;br /&gt;
            apg_verify(&amp;quot;b3s23&amp;quot;, &amp;quot;32x32&amp;quot;, payoshakey)&lt;br /&gt;
            apg_verify(&amp;quot;b3s23&amp;quot;, &amp;quot;4x64&amp;quot;, payoshakey)&lt;br /&gt;
            apg_verify(&amp;quot;b3s23&amp;quot;, &amp;quot;2x128&amp;quot;, payoshakey)&lt;br /&gt;
            apg_verify(&amp;quot;b3s23&amp;quot;, &amp;quot;1x256&amp;quot;, payoshakey)&lt;br /&gt;
            apg_verify(&amp;quot;b3s23&amp;quot;, &amp;quot;1x256X2&amp;quot;, payoshakey)&lt;br /&gt;
            apg_verify(&amp;quot;b3s23&amp;quot;, &amp;quot;1x256X2+1&amp;quot;, payoshakey)&lt;br /&gt;
&lt;br /&gt;
        # The &#039;for&#039; loop has been replaced with a &#039;while&#039; loop to allow sqrtspp&lt;br /&gt;
        # to vary during runtime. The idea is that apgsearch can apply a basic&lt;br /&gt;
        # form of machine-learning to dynamically locate the optimum sqrtspp:&lt;br /&gt;
        while (scount &amp;lt; number):&lt;br /&gt;
&lt;br /&gt;
            delays = [0.0, 0.0, 0.0]&lt;br /&gt;
&lt;br /&gt;
            for i in xrange(1000):&lt;br /&gt;
&lt;br /&gt;
                page_time = time.clock()&lt;br /&gt;
&lt;br /&gt;
                sqrtspp = (sqrtspp_optimal + (i % 3) - 1) if (i &amp;lt; 150) else (sqrtspp_optimal)&lt;br /&gt;
&lt;br /&gt;
                # Don&#039;t overrun:&lt;br /&gt;
                while (scount + sqrtspp * sqrtspp &amp;gt; number):&lt;br /&gt;
                    sqrtspp -= 1&lt;br /&gt;
&lt;br /&gt;
                meandelay = soup.stabilise_soups_parallel(rootstring, scount + initpos, sqrtspp, symmstring)&lt;br /&gt;
                if (i &amp;lt; 150):&lt;br /&gt;
                    delays[i % 3] += meandelay&lt;br /&gt;
                scount += (sqrtspp * sqrtspp)&lt;br /&gt;
&lt;br /&gt;
                current_speed = int((sqrtspp * sqrtspp)/(time.clock() - page_time))&lt;br /&gt;
                alltime_speed = int((scount)/(time.clock() - start_time))&lt;br /&gt;
                &lt;br /&gt;
                g.show(str(scount) + &amp;quot; soups processed (&amp;quot; + str(current_speed) +&lt;br /&gt;
                       &amp;quot; per second current; &amp;quot; + str(alltime_speed) + &amp;quot; overall)&amp;quot; +&lt;br /&gt;
                       &amp;quot; : (type &#039;s&#039; to see latest census or &#039;q&#039; to quit).&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                event = g.getevent()&lt;br /&gt;
                if event.startswith(&amp;quot;key&amp;quot;):&lt;br /&gt;
                    evt, ch, mods = event.split()&lt;br /&gt;
                    if ch == &amp;quot;s&amp;quot;:&lt;br /&gt;
                        soup.save_progress(scount, rootstring, symmstring)&lt;br /&gt;
                        soup.display_census(scount, rootstring, symmstring)&lt;br /&gt;
                    elif ch == &amp;quot;q&amp;quot;:&lt;br /&gt;
                        quitapg = True&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                if (scount &amp;gt;= number):&lt;br /&gt;
                    break&lt;br /&gt;
                &lt;br /&gt;
            if (quitapg == True):&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
            # Change sqrtspp to a more optimal value:&lt;br /&gt;
            if (scount &amp;lt; number):&lt;br /&gt;
                sqrtspp_new = sqrtspp_optimal&lt;br /&gt;
&lt;br /&gt;
                if (delays[0] &amp;lt; delays[1]):&lt;br /&gt;
                    sqrtspp_new = sqrtspp_optimal - 1&lt;br /&gt;
                if ((delays[2] &amp;lt; delays[1]) and (delays[2] &amp;lt; delays[0])):&lt;br /&gt;
                    sqrtspp_new = sqrtspp_optimal + 1&lt;br /&gt;
&lt;br /&gt;
                sqrtspp_optimal = sqrtspp_new&lt;br /&gt;
                sqrtspp_optimal = max(sqrtspp_optimal, 5)&lt;br /&gt;
&lt;br /&gt;
            # Compactify highscore table:&lt;br /&gt;
            soup.compactify_scores()&lt;br /&gt;
&lt;br /&gt;
        if (quitapg == False):&lt;br /&gt;
            # Save progress, upload it to Catagolue, and reset the census if successful:&lt;br /&gt;
            a = soup.save_progress(scount, rootstring, symmstring, payosha256_key=payoshakey)&lt;br /&gt;
            if (a == 0):&lt;br /&gt;
                # Reset the census:&lt;br /&gt;
                soup.reset()&lt;br /&gt;
                start_time = time.clock()&lt;br /&gt;
                f = (lambda x : &#039;abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789&#039;[ord(x) % 56])&lt;br /&gt;
                rootstring = &#039;&#039;.join(map(f, list(hashlib.sha256(rootstring + payoshakey + datetime.datetime.now().isoformat()).digest()[:12])))&lt;br /&gt;
                scount = 0&lt;br /&gt;
                number = orignumber&lt;br /&gt;
            else:&lt;br /&gt;
                number += orignumber&lt;br /&gt;
&lt;br /&gt;
    end_time = time.clock()&lt;br /&gt;
&lt;br /&gt;
    soup.save_progress(scount, rootstring, symmstring, payosha256_key=payoshakey)&lt;br /&gt;
&lt;br /&gt;
    soup.display_unids()&lt;br /&gt;
    soup.display_census(scount, rootstring, symmstring)&lt;br /&gt;
&lt;br /&gt;
def symmetry_test():&lt;br /&gt;
&lt;br /&gt;
    g.new(&amp;quot;Symmetry test&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    symmetries = [[&amp;quot;1x256X2+1&amp;quot;, &amp;quot;1x256X2&amp;quot;, &amp;quot;32x32&amp;quot;, &amp;quot;25p&amp;quot;, &amp;quot;75p&amp;quot;, &amp;quot;C1&amp;quot;, &amp;quot;8x32&amp;quot;, &amp;quot;4x64&amp;quot;, &amp;quot;2x128&amp;quot;, &amp;quot;1x256&amp;quot;],&lt;br /&gt;
                  [&amp;quot;C2_1&amp;quot;, &amp;quot;C2_2&amp;quot;, &amp;quot;C2_4&amp;quot;],&lt;br /&gt;
                  [&amp;quot;C4_1&amp;quot;, &amp;quot;C4_4&amp;quot;],&lt;br /&gt;
                  [&amp;quot;D2_+1&amp;quot;, &amp;quot;D2_+2&amp;quot;, &amp;quot;D2_x&amp;quot;],&lt;br /&gt;
                  [&amp;quot;D4_+1&amp;quot;, &amp;quot;D4_+2&amp;quot;, &amp;quot;D4_+4&amp;quot;, &amp;quot;D4_x1&amp;quot;, &amp;quot;D4_x4&amp;quot;],&lt;br /&gt;
                  [&amp;quot;D8_1&amp;quot;, &amp;quot;D8_4&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
    for i in range(len(symmetries)):&lt;br /&gt;
        for j in range(len(symmetries[i])):&lt;br /&gt;
&lt;br /&gt;
            g.putcells(hashsoup(&amp;quot;sym_test&amp;quot;, symmetries[i][j]), 120 * j + 60 * (i % 2), 80 * i)&lt;br /&gt;
    g.fit()&lt;br /&gt;
&lt;br /&gt;
# Run the soup-searching script:&lt;br /&gt;
apg_main()&lt;br /&gt;
# apg_verify()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Yes, I get silly all the time. -wwei23 9:53 AM 8/7/2017 NY time&lt;br /&gt;
&lt;br /&gt;
:Thanks. BTW, there is no use in calling apg_verify for your higher newly-created symmetries -- peer review is not enabled server-side for these in the first place. [[User:Apple Bottom|Apple Bottom]] ([[User talk:Apple Bottom|talk]]) 11:00, 7 August 2017 (UTC)&lt;br /&gt;
&lt;br /&gt;
== picture ==&lt;br /&gt;
&lt;br /&gt;
may the homepage picture be changed to the Christmas theme to fit whatever is currently happening? [[User:Snacked|Snacked]] ([[User talk:Snacked|talk]]) 23:37, 20 December 2022 (UTC)&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=User:Snacked/Apgcodes&amp;diff=116490</id>
		<title>User:Snacked/Apgcodes</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=User:Snacked/Apgcodes&amp;diff=116490"/>
		<updated>2022-10-14T00:40:33Z</updated>

		<summary type="html">&lt;p&gt;Snacked: Added the third page of &amp;quot;Cool apgcodes&amp;quot; to this page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The BEST apgcodes belong here!&amp;lt;br&amp;gt;&lt;br /&gt;
[https://conwaylife.com/forums/viewtopic.php?f=12&amp;amp;t=2687&amp;amp;p=109218| Carried from here]&lt;br /&gt;
= 0 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq15_013631zaoa/b3-n4az7s2-i3-c4z| 013631zaoa]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq26_0379qe4zzzzom66/b2i3-q4zs23-c| 0379qe4zzzzom66]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq8_04abgrakz6/b2ci3aejns2-c3-enr4-ait| 04abgrakz6]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_0gocure4z13631/b2ce3cjn4ceir5ci6an7e8s13i4-cez5-c67| 0gocure4z13631]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp7_0hmesooooss8zfvpof7/b2ce3cn4ceir5ci6an7e8s13i4-cez5-c67| 0hmesooooss8zfvpof7]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_0jhewehjz344owo443zy011/b3s23| 0jhewehjz344owo443zy011]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp7_0ogie0ehez4aaa4/b3s2-n36c| 0ogie0ehez4aaa4]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq6_0pziri/b3-ck4cijqz5eky6ai7c8s1c2-cn3-acy4cey5n6ac| 0pziri]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq64_0sq2sgyf4elhea4a0e4z4q3g08foy6g80rxgoxggzyg1x137x331/b3s2-e36| 0sq2sgyf4elhea4a0e4z4q3g08foy6g80rxgoxggzyg1x137x331]&lt;br /&gt;
= 1 =&lt;br /&gt;
[https://catagolue.appspot.com/object/yl90_1_150_bed59fcfac7fa7a8650636a3478ccbeb/b2ce3cjn4ceir5ci6an7e8s13i4-cez5-c67| 1_150_bed59fcfac7fa7a8650636a3478ccbeb]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/yl360_12_18912_2d77ed2dbae758648b929ab5002b0f3b/b2-ac3i4as12| 12_18912_2d77ed2dbae758648b929ab5002b0f3b]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq8_13p4/b2n3s23-q| 13p4]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq6_15x16/b2-a3c7s12-i| 15x16]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_1db8/b38s034678| 1db8]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp17_1jrpg/b2ce3ai4y6ks23ei4-i56| 1jrpg]&lt;br /&gt;
= 2 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp92_2528k0amis/b3aijkn4ty5es2-i3-aey4cny5iny6a7| 2528k0amis]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs12_259e0oo/b2in3-n5ys23| 259e0oo]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq45_27d/b3aijqr4i5cs2-in3-a4cqz5acek6-i8| 27d]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq8_27deeeeeee6/b3aeij4an5inr6is2-n3-ck4in| 27deeeeeee6]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq2_27x27/b2ci3aikr5ys1e2-a3aci| 27x27]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq4_2ate6/r2b6t8s5t7| 2ate6]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp6_2can/b2e3ai4t5e6ciks1c2-a3-a4-aeit5ikr| 2can]&lt;br /&gt;
= 3 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp8_317wogs/b3aijn4iw5ys1c2ace3jnr| 317wogs]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp3_31ewe13/b2in3-n5ys23| 31ewe13]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_35agic/b3-a4ejw5cky6ns234a5a8| 35agic]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp27_3falaf3/b2ce3ai4y6ks23ei4-i56| 3falaf3]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp27_3fanaf3/b2ce3ai4y6ks23ei4-i56| 3fanaf3]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq43_3fuuc/b34a8s0456-c78| 3fuuc]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq2_3p3/b2ek3cinqy4-cnqyz5acjq6aeks1c2cei3aeik4wz5cekny6-in7e8| 3p3]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp6_3phi/x7x3xb3-s23-shining| 3phi]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs31_3pmgmiczciq2qic/b3s23| 3pmgmiczciq2qic]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs10_3qq3/b2in3-n5ys23| 3qq3]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp27_3fataf3/b2ce3ai4y6ks23ei4-i56| 3fataf3]&lt;br /&gt;
= 4 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq2_44rave/b2k3s2cek3-a4-jkrw| 44rave]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq17_4aa4w4arl/b34n7s23| 4aa4w4arl]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp5_4aarahrrharaa4/b3s23| 4aarahrrharaa4]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs33_4aarharharhar/b3s23| 4aarharharhar]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_4ahdiczx1/b3aijkn4ty5es2-i3-aey4cny5iny6a7| 4ahdiczx1]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq8_4ahhhhhh197/b3aeij4an5inr6is2-n3-ck4in| 4ahhhhhh197]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs9_4ala4/b3s234c| 4ala4]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_4ervus8zx11/b2ce3cjn4ceir5ci6an7e8s13i4-cez5-c67| 4ervus8zx11]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_4he/b2ce3i4s345-jqr| 4he]&lt;br /&gt;
= 5 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp38_50s/b2-ak3ais12a| 50s]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp4_525weee/b38s034678| 525weee]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp26_57x75/b2in3-cqy4eknqwz5eiry6e7cs2-kn3cejnr4cjryz5ckq6aek| 57x75]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq20_5thme/b3s23-i5-iq| 5thme]&lt;br /&gt;
= 6 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs24_69bobjob96/b3s23| 69bobjob96]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq28_6r0gmzw1of8kc8y1gokee6c8zy2c4x8s49gd30scgzy9111x7847y26sozyfo48oy2of61zy2c8x4e953cg0fc21zx6s4ac4y136btsoc4zom12rz01/b3s2cek3-a4-ijkrw| 6r0gmzw1of8kc8y1gokee6c8zy2c4x8s49gd30scgzy9111x7847y26sozyfo48oy2of61zy2c8x4e953cg0fc21zx6s4ac4y136btsoc4zom12rz01]&lt;br /&gt;
= 7 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq8_77n7777777be4zw7b/b3aeij4an5inr6is2-n3-ck4in| 77n7777777be4zw7b]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp24_7bra/b2ei3ajkr4-cjnry5acjkr6-ak7c8s1e2ak3einqy4jnry5einqy6ak7e| 7bra]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp24_7oz7/b2ce3ai4y6ks23ei4-i56| 7oz7]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_7p2/b3is123-i4| 7p2]&lt;br /&gt;
= 8 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_8smfucogzw13731/b2ce3cjn4ceir5ci6an7e8s13i4-cez5-c67| 8smfucogzw13731]&lt;br /&gt;
= 9 =&lt;br /&gt;
= a =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq2_aaaaaaaaaaaaaaev/b2cen3ackr4-jkryz5ckqy6-cn7e8s12i3qy4aciw5-jkr6ak| aaaaaaaaaaaaaaev]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp4_adolfarz023/b3s2456| adolfarz023]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_araara/b3s13| araara]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp6_arrozales/b4i5c6ns2-i3-q4acnry5einqr6-ck| arrozales]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp18_ava/b2-ac3aei4ae6i8s23-ejq8| ava]&lt;br /&gt;
= b =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq4_brb/b2e3aeijn4rtzs23-a4eijkrtz5ai| brb]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq95_bzzzy92022/b2ce3k4ej5jrs12ei3-aq4aejkrty5ejqy6ac7e8| bzzzy92022]&lt;br /&gt;
= c =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs16_ciddiczw11/b3s2-i34q| ciddiczw11]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs31_cimgehlmzx3470696/b3s23| cimgehlmzx3470696]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp6_clunksgzw175/b3s2456| clunksgzw175]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp3_co9nas0san9oczgoldlo0oldlogz1047210127401/b3s23| co9nas0san9oczgoldlo0oldlogz1047210127401]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp48_cuj6soooooooo8kzw1fvs8/b2ce3cn4ceir5ci6an7e8s13i4-cez5-c67| cuj6soooooooo8kzw1fvs8]&lt;br /&gt;
= d =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs11_damp/b2e3ai4t5e6ciks1c2-a3-a4-aeit5ikr| damp]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp4_dohje/b34s26| dohje]&lt;br /&gt;
= e =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq2_eah/b2ek3cinqy4-cnqyz5acjq6aeks1c2cei3aeik4wz5cekny6-in7e8| eah]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_ear/b2i3-ekn4jqrty5cy6n8s1c2-ci3-aey4cetyz5ack6ack7e| ear]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq4_edu/b2ce3a4cekqry5ajky6cs02aek3acjkn4-aeyz5-cjky6-ak78| edu]&lt;br /&gt;
= f =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp48_flu/b2-a3akn6-cs1c2-i3aeinr4w| flu]&lt;br /&gt;
= g =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_g0k0l05zw2/b2ce3cjn4ceir5ci6an7e8s13i4-cez5-c67| g0k0l05zw2]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs10_g0o453z11/b2in3-n5ys23| g0o453z11]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs42_g8ogill2zhaaaaahz12319ll8/b3s23| g8ogill2zhaaaaahz12319ll8]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq8_gogif13z32_w84/g4b3s23| gogif13z32_w84]&lt;br /&gt;
= h =&lt;br /&gt;
= i =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp20_ihkozy248/b3aijn4iw5ys1c2ace3jnr| ihkozy248]&lt;br /&gt;
= j =&lt;br /&gt;
= k =&lt;br /&gt;
= l =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp6_l0l/b2c3-cekq4ikt5i8s2-in3-acky4aijry5eiky6i| l0l]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_level/b013s| level]&lt;br /&gt;
= m =&lt;br /&gt;
= n =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs16_nwtwlv/x7x3xb3-s23-shining| nwtwlv]&lt;br /&gt;
= o =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_osubbus8z01/b2ce3cjn4ceir5ci6an7e8s13i4-cez5-c67| osubbus8z01]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs15_owowowbwrz6/x7x3xb3-s23-shining| owowowbwrz6]&lt;br /&gt;
= p =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs16_phhhpzgzd/x7x3xb3-s23-shining| phhhpzgzd]&lt;br /&gt;
= q =&lt;br /&gt;
= r =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs20_raaraar/b3s23| raaraar]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs21_ratiozx3271/b3s2456| ratiozx3271]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs10_rwawr/x7x3xb3-s23-shining| rwawr]&lt;br /&gt;
= s =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq25_si1iszxg8oy7419i9f2zy01/b3-cky4e8s23-c4cn| si1iszxg8oy7419i9f2zy01]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq2_sotutosz027f72/b3678s34678| sotutosz027f72]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp4_sql3744zw3/b34ws2-k3-ck4t| sql3744zw3]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq4_surf72z01/x22x17x12xalternating_fattylife_scenery| surf72z01]&lt;br /&gt;
= t =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq8_tjsgz4a03eozxq961/b2en3ij4a5e7e8s1c2cek3-a4aiqw5aky| tjsgz4a03eozxq961]&lt;br /&gt;
= u =&lt;br /&gt;
= v =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq23_vcuz1/b3aijn4aejkz5cqy6kn7cs2ace3jnr4n5r7e| vcuz1]&lt;br /&gt;
= w =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs32_wmmge1ege1ege2z643/b3s23| wmmge1ege1ege2z643]&lt;br /&gt;
= x =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs154_xgosue63336eusogzouf731y5137fusgzvvgycgvvz037fusogy2gosuf73zy1133766667331/r5b38t61s29t58| xgosue63336eusogzouf731y5137fusgzvvgycgvvz037fusogy2gosuf73zy1133766667331]&lt;br /&gt;
= y =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp3_y1g0s3g0s0s0g0g0s0s0g3s0gz8844ll050103030303030301050ll4488zwaaaaayfaaaaazwgglllyflllggzgg22aa2yf2aa22ggzw115d0t0c0u0u0e0e0u0u0c0t0d511zy316w101y1101w61/b2-ac3i4as12| y1g0s3g0s0s0g0g0s0s0g3s0gz8844ll050103030303030301050ll4488zwaaaaayfaaaaazwgglllyflllggzgg22aa2yf2aa22ggzw115d0t0c0u0u0e0e0u0u0c0t0d511zy316w101y1101w61]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq82_y888w401y112ozy2gg401yb4zxg61yzyoc8ggogzxj8yzyr2323z061y22yhgggz1sy7gya776bgy6gy1ggya1zw34e8811hgy3q0acy613y5us604s731zy674444403_yagg0888sssooywgxgzy6osmujioutvqvivtiq8ypgwpsuuusg28gzy2ouuvlvvvfvvvvvbsbvjj3fyog04193rvvstfusskogk88zy14n77vviv4u5u024010101y8gogyf7f6fvnvvffvf77384zxssstscdvvet7gg1y8g8wkoefvl3quqqsosqsoqi08y167s3vvvku3hczxbj3vffevfudtsrsquu01y39g77fufefffb3b7vtnvf7nj84y422x2zy01112283jnnuud25f421y71111y0111171zy811zyzyfoquuogw8g8zyzyg237h36edge2_zy6oy18utn22205gqyu4uuuszy54420s17xgy23eys93qvvste6cog0ggzy2g12y04s0gw4x101y8gogyf7f69vnnvcfv3573zy1ghxgocd3ygge09y1osgoogoogy4101puuku3zy01010c2fescsk1cy01y577f6fef7fb3b7mtnf7373zy01w228w1wg8044421yk1zzyzyg266y08gzyzyg237gy0ge_yagg0888sssoozy7s6e32804aqqih42o8ys8cuuusgzy2ouuvlfo0c7311n10bvjj0eyq41y0105fuscx488zy147671j030g0ay41yzmuvf71y084zxssccs482gw40g1y8g8w406bigy0ooosgw2208y3s2311xgczxbi3i1fes2g0gsrcy89gy01eeff8086f547wgg84y422x2zy111x1hmgqe1wbya111y56zy811zyzyfoogwgzyzyh33y32_yagg0888sssooywgxgzy6osmujige95050vpi28ys1y228gzy2ouur1l7j2w1101y131yzwgkkogk88zy14n75vcisyzya8w8uf77384zxssstsc5d7202ybg8wko8ck4y02w4asoqi08y3s0suuku3hczxbj3vfx1y1gquu01y39g77fue01y2hojof7nj84y422x2zy01112282jnnuuc25f421y71111y0111171zy811/g9r3b6t7s7t9| y888w401y112ozy2gg401yb4zxg61yzyoc8ggogzxj8yzyr2323z061y22yhgggz1sy7gya776bgy6gy1ggya1zw34e8811hgy3q0acy613y5us604s731zy674444403_yagg0888sssooywgxgzy6osmujioutvqvivtiq8ypgwpsuuusg28gzy2ouuvlvvvfvvvvvbsbvjj3fyog04193rvvstfusskogk88zy14n77vviv4u5u024010101y8gogyf7f6fvnvvffvf77384zxssstscdvvet7gg1y8g8wkoefvl3quqqsosqsoqi08y167s3vvvku3hczxbj3vffevfudtsrsquu01y39g77fufefffb3b7vtnvf7nj84y422x2zy01112283jnnuud25f421y71111y0111171zy811zyzyfoquuogw8g8zyzyg237h36edge2_zy6oy18utn22205gqyu4uuuszy54420s17xgy23eys93qvvste6cog0ggzy2g12y04s0gw4x101y8gogyf7f69vnnvcfv3573zy1ghxgocd3ygge09y1osgoogoogy4101puuku3zy01010c2fescsk1cy01y577f6fef7fb3b7mtnf7373zy01w228w1wg8044421yk1zzyzyg266y08gzyzyg237gy0ge_yagg0888sssoozy7s6e32804aqqih42o8ys8cuuusgzy2ouuvlfo0c7311n10bvjj0eyq41y0105fuscx488zy147671j030g0ay41yzmuvf71y084zxssccs482gw40g1y8g8w406bigy0ooosgw2208y3s2311xgczxbi3i1fes2g0gsrcy89gy01eeff8086f547wgg84y422x2zy111x1hmgqe1wbya111y56zy811zyzyfoogwgzyzyh33y32_yagg0888sssooywgxgzy6osmujige95050vpi28ys1y228gzy2ouur1l7j2w1101y131yzwgkkogk88zy14n75vcisyzya8w8uf77384zxssstsc5d7202ybg8wko8ck4y02w4asoqi08y3s0suuku3hczxbj3vfx1y1gquu01y39g77fue01y2hojof7nj84y422x2zy01112282jnnuuc25f421y71111y0111171zy811]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq28_yaomi111imozyd101zy68goy7og8z4rh3ga635k9210soy1os0129k536ag3hr4zx32257p3gw7pfy1fp7wg3p75223zy513311y511331zz0262yp262/b3s2cek3-a4-ijkrw| yaomi111imozyd101zy68goy7og8z4rh3ga635k9210soy1os0129k536ag3hr4zx32257p3gw7pfy1fp7wg3p75223zy513311y511331zz0262yp262]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq41_yberry14ezg8gy4s8k8y0s0ksz121/b3-ck7es23-cr4q6c| yberry14ezg8gy4s8k8y0s0ksz121]&lt;br /&gt;
= z =&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=User:Snacked/Apgcodes&amp;diff=116464</id>
		<title>User:Snacked/Apgcodes</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=User:Snacked/Apgcodes&amp;diff=116464"/>
		<updated>2022-10-13T00:20:11Z</updated>

		<summary type="html">&lt;p&gt;Snacked: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The BEST apgcodes belong here!&amp;lt;br&amp;gt;&lt;br /&gt;
[https://conwaylife.com/forums/viewtopic.php?f=12&amp;amp;t=2687&amp;amp;p=109218| Carried from here]&lt;br /&gt;
= 0 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq15_013631zaoa/b3-n4az7s2-i3-c4z| 013631zaoa]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq26_0379qe4zzzzom66/b2i3-q4zs23-c| 0379qe4zzzzom66]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq8_04abgrakz6/b2ci3aejns2-c3-enr4-ait| 04abgrakz6]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_0gocure4z13631/b2ce3cjn4ceir5ci6an7e8s13i4-cez5-c67| 0gocure4z13631]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp7_0hmesooooss8zfvpof7/b2ce3cn4ceir5ci6an7e8s13i4-cez5-c67| 0hmesooooss8zfvpof7]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_0jhewehjz344owo443zy011/b3s23| 0jhewehjz344owo443zy011]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp7_0ogie0ehez4aaa4/b3s2-n36c| 0ogie0ehez4aaa4]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq6_0pziri/b3-ck4cijqz5eky6ai7c8s1c2-cn3-acy4cey5n6ac| 0pziri]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq64_0sq2sgyf4elhea4a0e4z4q3g08foy6g80rxgoxggzyg1x137x331/b3s2-e36| 0sq2sgyf4elhea4a0e4z4q3g08foy6g80rxgoxggzyg1x137x331]&lt;br /&gt;
= 1 =&lt;br /&gt;
[https://catagolue.appspot.com/object/yl90_1_150_bed59fcfac7fa7a8650636a3478ccbeb/b2ce3cjn4ceir5ci6an7e8s13i4-cez5-c67| 1_150_bed59fcfac7fa7a8650636a3478ccbeb]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/yl360_12_18912_2d77ed2dbae758648b929ab5002b0f3b/b2-ac3i4as12| 12_18912_2d77ed2dbae758648b929ab5002b0f3b]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_1db8/b38s034678| 1db8]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp17_1jrpg/b2ce3ai4y6ks23ei4-i56| 1jrpg]&lt;br /&gt;
= 2 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp92_2528k0amis/b3aijkn4ty5es2-i3-aey4cny5iny6a7| 2528k0amis]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs12_259e0oo/b2in3-n5ys23| 259e0oo]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq45_27d/b3aijqr4i5cs2-in3-a4cqz5acek6-i8| 27d]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq8_27deeeeeee6/b3aeij4an5inr6is2-n3-ck4in| 27deeeeeee6]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq4_2ate6/r2b6t8s5t7| 2ate6]&lt;br /&gt;
= 3 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp8_317wogs/b3aijn4iw5ys1c2ace3jnr| 317wogs]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp3_31ewe13/b2in3-n5ys23| 31ewe13]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp27_3falaf3/b2ce3ai4y6ks23ei4-i56| 3falaf3]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp27_3fanaf3/b2ce3ai4y6ks23ei4-i56| 3fanaf3]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs31_3pmgmiczciq2qic/b3s23| 3pmgmiczciq2qic]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs10_3qq3/b2in3-n5ys23| 3qq3]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp27_3fataf3/b2ce3ai4y6ks23ei4-i56| 3fataf3]&lt;br /&gt;
= 4 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq2_44rave/b2k3s2cek3-a4-jkrw| 44rave]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq17_4aa4w4arl/b34n7s23| 4aa4w4arl]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp5_4aarahrrharaa4/b3s23| 4aarahrrharaa4]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_4ahdiczx1/b3aijkn4ty5es2-i3-aey4cny5iny6a7| 4ahdiczx1]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq8_4ahhhhhh197/b3aeij4an5inr6is2-n3-ck4in| 4ahhhhhh197]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_4ervus8zx11/b2ce3cjn4ceir5ci6an7e8s13i4-cez5-c67| 4ervus8zx11]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_4he/b2ce3i4s345-jqr| 4he]&lt;br /&gt;
= 5 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp4_525weee/b38s034678| 525weee]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp26_57x75/b2in3-cqy4eknqwz5eiry6e7cs2-kn3cejnr4cjryz5ckq6aek| 57x75]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq20_5thme/b3s23-i5-iq| 5thme]&lt;br /&gt;
= 6 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq28_6r0gmzw1of8kc8y1gokee6c8zy2c4x8s49gd30scgzy9111x7847y26sozyfo48oy2of61zy2c8x4e953cg0fc21zx6s4ac4y136btsoc4zom12rz01/b3s2cek3-a4-ijkrw| 6r0gmzw1of8kc8y1gokee6c8zy2c4x8s49gd30scgzy9111x7847y26sozyfo48oy2of61zy2c8x4e953cg0fc21zx6s4ac4y136btsoc4zom12rz01]&lt;br /&gt;
= 7 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq8_77n7777777be4zw7b/b3aeij4an5inr6is2-n3-ck4in| 77n7777777be4zw7b]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp24_7oz7/b2ce3ai4y6ks23ei4-i56| 7oz7]&lt;br /&gt;
= 8 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_8smfucogzw13731/b2ce3cjn4ceir5ci6an7e8s13i4-cez5-c67| 8smfucogzw13731]&lt;br /&gt;
= 9 =&lt;br /&gt;
= a =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq2_aaaaaaaaaaaaaaev/b2cen3ackr4-jkryz5ckqy6-cn7e8s12i3qy4aciw5-jkr6ak| aaaaaaaaaaaaaaev]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs33_4aarharharhar/b3s23| 4aarharharhar]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp4_adolfarz023/b3s2456| adolfarz023]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp6_arrozales/b4i5c6ns2-i3-q4acnry5einqr6-ck| arrozales]&lt;br /&gt;
= b =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq95_bzzzy92022/b2ce3k4ej5jrs12ei3-aq4aejkrty5ejqy6ac7e8| bzzzy92022]&lt;br /&gt;
= c =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs16_ciddiczw11/b3s2-i34q| ciddiczw11]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs31_cimgehlmzx3470696/b3s23| cimgehlmzx3470696]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp3_co9nas0san9oczgoldlo0oldlogz1047210127401/b3s23| co9nas0san9oczgoldlo0oldlogz1047210127401]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp48_cuj6soooooooo8kzw1fvs8/b2ce3cn4ceir5ci6an7e8s13i4-cez5-c67| cuj6soooooooo8kzw1fvs8]&lt;br /&gt;
= d =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp4_dohje/b34s26| dohje]&lt;br /&gt;
= e =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_ear/b2i3-ekn4jqrty5cy6n8s1c2-ci3-aey4cetyz5ack6ack7e| ear]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq4_edu/b2ce3a4cekqry5ajky6cs02aek3acjkn4-aeyz5-cjky6-ak78| edu]&lt;br /&gt;
= f =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp48_flu/b2-a3akn6-cs1c2-i3aeinr4w| flu]&lt;br /&gt;
= g =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_g0k0l05zw2/b2ce3cjn4ceir5ci6an7e8s13i4-cez5-c67| g0k0l05zw2]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs10_g0o453z11/b2in3-n5ys23| g0o453z11]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs42_g8ogill2zhaaaaahz12319ll8/b3s23| g8ogill2zhaaaaahz12319ll8]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq8_gogif13z32_w84/g4b3s23| gogif13z32_w84]&lt;br /&gt;
= h =&lt;br /&gt;
= i =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp20_ihkozy248/b3aijn4iw5ys1c2ace3jnr| ihkozy248]&lt;br /&gt;
= j =&lt;br /&gt;
= k =&lt;br /&gt;
= l =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp6_l0l/b2c3-cekq4ikt5i8s2-in3-acky4aijry5eiky6i| l0l]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_level/b013s| level]&lt;br /&gt;
= m =&lt;br /&gt;
= n =&lt;br /&gt;
= o =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_osubbus8z01/b2ce3cjn4ceir5ci6an7e8s13i4-cez5-c67| osubbus8z01]&lt;br /&gt;
= p =&lt;br /&gt;
= q =&lt;br /&gt;
= r =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs20_raaraar/b3s23| raaraar]&lt;br /&gt;
= s =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq25_si1iszxg8oy7419i9f2zy01/b3-cky4e8s23-c4cn| si1iszxg8oy7419i9f2zy01]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq2_sotutosz027f72/b3678s34678| sotutosz027f72]&lt;br /&gt;
= t =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq8_tjsgz4a03eozxq961/b2en3ij4a5e7e8s1c2cek3-a4aiqw5aky| tjsgz4a03eozxq961]&lt;br /&gt;
= u =&lt;br /&gt;
= v =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq23_vcuz1/b3aijn4aejkz5cqy6kn7cs2ace3jnr4n5r7e| vcuz1]&lt;br /&gt;
= w =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs32_wmmge1ege1ege2z643/b3s23| wmmge1ege1ege2z643]&lt;br /&gt;
= x =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs154_xgosue63336eusogzouf731y5137fusgzvvgycgvvz037fusogy2gosuf73zy1133766667331/r5b38t61s29t58| xgosue63336eusogzouf731y5137fusgzvvgycgvvz037fusogy2gosuf73zy1133766667331]&lt;br /&gt;
= y =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp3_y1g0s3g0s0s0g0g0s0s0g3s0gz8844ll050103030303030301050ll4488zwaaaaayfaaaaazwgglllyflllggzgg22aa2yf2aa22ggzw115d0t0c0u0u0e0e0u0u0c0t0d511zy316w101y1101w61/b2-ac3i4as12| y1g0s3g0s0s0g0g0s0s0g3s0gz8844ll050103030303030301050ll4488zwaaaaayfaaaaazwgglllyflllggzgg22aa2yf2aa22ggzw115d0t0c0u0u0e0e0u0u0c0t0d511zy316w101y1101w61]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq28_yaomi111imozyd101zy68goy7og8z4rh3ga635k9210soy1os0129k536ag3hr4zx32257p3gw7pfy1fp7wg3p75223zy513311y511331zz0262yp262/b3s2cek3-a4-ijkrw| yaomi111imozyd101zy68goy7og8z4rh3ga635k9210soy1os0129k536ag3hr4zx32257p3gw7pfy1fp7wg3p75223zy513311y511331zz0262yp262]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq41_yberry14ezg8gy4s8k8y0s0ksz121/b3-ck7es23-cr4q6c| yberry14ezg8gy4s8k8y0s0ksz121]&lt;br /&gt;
= z =&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=User:Snacked/Apgcodes&amp;diff=116333</id>
		<title>User:Snacked/Apgcodes</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=User:Snacked/Apgcodes&amp;diff=116333"/>
		<updated>2022-10-09T01:17:09Z</updated>

		<summary type="html">&lt;p&gt;Snacked: Made the page lol&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The BEST apgcodes belong here!&amp;lt;br&amp;gt;&lt;br /&gt;
[https://conwaylife.com/forums/viewtopic.php?f=12&amp;amp;t=2687&amp;amp;p=109218| Carried from here]&lt;br /&gt;
= 0 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq15_013631zaoa/b3-n4az7s2-i3-c4z| 013631zaoa]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq26_0379qe4zzzzom66/b2i3-q4zs23-c| 0379qe4zzzzom66]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_0jhewehjz344owo443zy011/b3s23| 0jhewehjz344owo443zy011]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp7_0ogie0ehez4aaa4/b3s2-n36c| 0ogie0ehez4aaa4]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq64_0sq2sgyf4elhea4a0e4z4q3g08foy6g80rxgoxggzyg1x137x331/b3s2-e36| 0sq2sgyf4elhea4a0e4z4q3g08foy6g80rxgoxggzyg1x137x331]&lt;br /&gt;
= 1 =&lt;br /&gt;
[https://catagolue.appspot.com/object/yl360_12_18912_2d77ed2dbae758648b929ab5002b0f3b/b2-ac3i4as12| 12_18912_2d77ed2dbae758648b929ab5002b0f3b]&lt;br /&gt;
= 2 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs12_259e0oo/b2in3-n5ys23| 259e0oo]&amp;lt;br&amp;gt;&lt;br /&gt;
= 3 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp3_31ewe13/b2in3-n5ys23| 31ewe13]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs31_3pmgmiczciq2qic/b3s23| 3pmgmiczciq2qic]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs10_3qq3/b2in3-n5ys23| 3qq3]&lt;br /&gt;
= 4 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq17_4aa4w4arl/b34n7s23| 4aa4w4arl]&lt;br /&gt;
= 5 =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp26_57x75/b2in3-cqy4eknqwz5eiry6e7cs2-kn3cejnr4cjryz5ckq6aek| 57x75]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq20_5thme/b3s23-i5-iq| 5thme]&lt;br /&gt;
= 6 =&lt;br /&gt;
= 7 =&lt;br /&gt;
= 8 =&lt;br /&gt;
= 9 =&lt;br /&gt;
= a =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp4_adolfarz023/b3s2456| adolfarz023]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp6_arrozales/b4i5c6ns2-i3-q4acnry5einqr6-ck| arrozales]&lt;br /&gt;
= b =&lt;br /&gt;
= c =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs16_ciddiczw11/b3s2-i34q| ciddiczw11]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs31_cimgehlmzx3470696/b3s23| cimgehlmzx3470696]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xp3_co9nas0san9oczgoldlo0oldlogz1047210127401/b3s23| co9nas0san9oczgoldlo0oldlogz1047210127401]&lt;br /&gt;
= d =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp4_dohje/b34s26| dohje]&lt;br /&gt;
= e =&lt;br /&gt;
= f =&lt;br /&gt;
= g =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs10_g0o453z11/b2in3-n5ys23| g0o453z11]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xs42_g8ogill2zhaaaaahz12319ll8/b3s23| g8ogill2zhaaaaahz12319ll8]&lt;br /&gt;
= h =&lt;br /&gt;
= i =&lt;br /&gt;
= j =&lt;br /&gt;
= k =&lt;br /&gt;
= l =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp2_level/b013s| level]&lt;br /&gt;
= m =&lt;br /&gt;
= n =&lt;br /&gt;
= o =&lt;br /&gt;
= p =&lt;br /&gt;
= q =&lt;br /&gt;
= r =&lt;br /&gt;
= s =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq25_si1iszxg8oy7419i9f2zy01/b3-cky4e8s23-c4cn| si1iszxg8oy7419i9f2zy01]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://catagolue.appspot.com/object/xq2_sotutosz027f72/b3678s34678| sotutosz027f72]&lt;br /&gt;
= t =&lt;br /&gt;
= u =&lt;br /&gt;
= v =&lt;br /&gt;
[https://catagolue.appspot.com/object/xq23_vcuz1/b3aijn4aejkz5cqy6kn7cs2ace3jnr4n5r7e| vcuz1]&lt;br /&gt;
= w =&lt;br /&gt;
[https://catagolue.appspot.com/object/xs32_wmmge1ege1ege2z643/b3s23| wmmge1ege1ege2z643]&lt;br /&gt;
= x =&lt;br /&gt;
= y =&lt;br /&gt;
[https://catagolue.appspot.com/object/xp3_y1g0s3g0s0s0g0g0s0s0g3s0gz8844ll050103030303030301050ll4488zwaaaaayfaaaaazwgglllyflllggzgg22aa2yf2aa22ggzw115d0t0c0u0u0e0e0u0u0c0t0d511zy316w101y1101w61/b2-ac3i4as12| y1g0s3g0s0s0g0g0s0s0g3s0gz8844ll050103030303030301050ll4488zwaaaaayfaaaaazwgglllyflllggzgg22aa2yf2aa22ggzw115d0t0c0u0u0e0e0u0u0c0t0d511zy316w101y1101w61]&lt;br /&gt;
= z =&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
	<entry>
		<id>https://conwaylife.com/w/index.php?title=User:Snacked&amp;diff=116327</id>
		<title>User:Snacked</title>
		<link rel="alternate" type="text/html" href="https://conwaylife.com/w/index.php?title=User:Snacked&amp;diff=116327"/>
		<updated>2022-10-08T23:54:05Z</updated>

		<summary type="html">&lt;p&gt;Snacked: Created page with &amp;quot;Lemme make some cool apgcodes&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lemme make some cool apgcodes&lt;/div&gt;</summary>
		<author><name>Snacked</name></author>
	</entry>
</feed>