Page 1 of 1
Online File Format Converters
Posted: April 21st, 2025, 12:14 pm
by MXMLLN
Is there a list of converters to and from different CA formats: RLE, Plaintext, Life, &c?
I'm finding a lot of Github converters, but nothing hosted online.
I often find myself in situations where an online tool would be the optimal solution.
Last Theory is the only one I could find: https://lasttheory.com/tools/rle-to-text-converter
It only does RLE to Plaintext, not vice versa.
Re: Online File Format Converters
Posted: May 1st, 2025, 2:08 pm
by dvgrn
We had a good start at a set of tools like this in 2024. But Book's "golhobby" website went down without warning or explanation,
sometime in the second half of last year. I tried
asking if it would be revived, but haven't heard anything back so far.
Here's an
Internet Archive snapshot of the key page from 2023.
It still seems to be possible to retrieve the Javascript source for all of the tools from the Internet Archive. For example, the
page source for RLE2PNG. htm includes
Code: Select all
let canvas,context,nrow,ncols;
const deadcolor='white';
const livecolor='black';
const gridcolor='silver';
let rowcoords,colcoords;
function doOnload(){
canvas=document.getElementById('canvas'); //global var
context=canvas.getContext('2d',{alpha:false}); //global var
context.fillStyle="white";
context.fillRect(0,0,canvas.width,canvas.height);
let RLE=getURLParam("rle");
if(RLE>""){
let i=RLE.indexOf("B3/S23");
RLE=RLE.substr(i+6);
document.getElementById('ta').value=RLE;
drawIt(true);
} else {
document.getElementById('ta').select();
}
}
function getURLParam(s){
var params=new URLSearchParams(location.search);
var n=0;
for(var [key,value] of params){
if(key==s)n=value;
}
return n;
}
function drawIt(fit){
let txt=document.getElementById('ta').value.trim();
if(txt=="")return;
let rtn=RLE2Array(txt);
let rows=parseInt(rtn[1]);
let cols=parseInt(rtn[2]);
if(isNaN(rows) || isNaN(cols)){
alert('Invalid RLE.');
return;
}
let a=new Array(rows);
for(var i=0;i<rows;i++){
a[i]=new Array(cols);
a[i].fill(0);
}
const row=0; //for the eval
const col=0;
eval(rtn[0]);
const rotate=document.getElementById('rotate').checked;
if(rotate){
a=rotate90Right(a);
var temp=rows
rows=cols;
cols=temp;
}
nrows=rows+2; //add borders
ncols=cols+2;
if(!fit){
if(ncols>nrows){ //square
nrows=ncols;
} else {
ncols=nrows;
}
}
if(nrows>1000){
alert('Pattern too big.');
return;
}
let bigA=new Array(nrows);
for(var i=0;i<nrows;i++){
bigA[i]=new Array(ncols);
bigA[i].fill(0);
}
const idelta=Math.round((nrows-rows)/2);
const jdelta=Math.round((ncols-cols)/2);
for(var i=0;i<rows;i++){
for(var j=0;j<cols;j++){
bigA[i+idelta][j+jdelta]=a[i][j];
}
}
rowcoords=new Array(nrows);
colcoords=new Array(ncols);
drawGrid(bigA);
document.getElementById("download").style.visibility="visible";
}
function drawGrid(a){
var cellsize=16;
var w=ncols*(cellsize+1)+1;
var h=nrows*(cellsize+1)+1;
if(w>400 || h>400){
cellsize=11;
w=ncols*(cellsize+1)+1;
h=nrows*(cellsize+1)+1;
}
if(w>600 || h>600){
cellsize=6;
w=ncols*(cellsize+1)+1;
h=nrows*(cellsize+1)+1;
}
if(w>800 || h>800){
cellsize=4;
w=ncols*(cellsize+1)+1;
h=nrows*(cellsize+1)+1;
}
canvas.width=w;
canvas.height=h;
context.fillStyle=deadcolor;
context.fillRect(0,0,w,h);
//live cells
var n=0;
for(var x=0;x<w-1;x+=(cellsize+1)){
colcoords[n]=x+1;
if(cellsize<4)colcoords[n]++;
n++;
}
n=0;
for(var y=0;y<h-1;y+=(cellsize+1)){
rowcoords[n]=y;
if(cellsize<4)rowcoords[n]++;
n++;
}
context.fillStyle=livecolor;
let paintsize=cellsize-1;
if(paintsize==1)paintsize=2;
for(var j=0;j<nrows;j++){
for(var i=0;i<ncols;i++){
if(a[j][i]){
context.fillRect(colcoords[i],rowcoords[j]+1,paintsize,paintsize);
console.log(colcoords[i],rowcoords[j]);
}
}
}
//grid lines
context.beginPath();
for(var x=0;x<w-1;x+=(cellsize+1)){
context.moveTo(x,0);
context.lineTo(x,h);
}
context.moveTo(w,0);
context.lineTo(w,h);
context.lineWidth=2;
context.strokeStyle=gridcolor;
context.stroke();
context.beginPath();
for(var y=0;y<h-1;y+=(cellsize+1)){
context.moveTo(0,y);
context.lineTo(w,y);
}
context.moveTo(0,h);
context.lineTo(w,h);
context.lineWidth=2;
context.stroke();
}
function saveIt(el){
const imageURI=canvas.toDataURL("image/png");
el.href=imageURI;
}
Looks like that ought to work.
If someone wants to go through and "rescue" all of the tools from that golhobby.com archive page, and put everything into a nice package with relative URLs everywhere such that it will work wherever you put it, then I can work on finding a fresh place to host it.
Maybe just
conwaylife.com/ref/golhobby ? I haven't looked at them all, but these scripts all seem like they'd run clientside, so they're no more troublesome than the LifeViewers in
conwaylife.com/ref/lifepage or similar Javascript in Mark Niemiec's search page.
Re: Online File Format Converters
Posted: May 1st, 2025, 2:38 pm
by confocaloid
edit: linking related discussions:
dvgrn wrote: May 1st, 2025, 2:08 pm
[...] It still seems to be possible to retrieve the Javascript source for all of the tools from the Internet Archive. [...]
Sounds like it could be better to write some new code for the task (following whatever conventions/guidelines there are now) and host it on this website, instead of copying some code with unclear status and with unclear compatibility with what is believed to be the best way of presenting patterns on the wiki and in similar contexts.
While I don't remember the details without doing a forum/wiki search, I *do* remember that there were some disagreements on the issue (i.e. guidelines regarding conversion of CA configurations to static images).
Are there reasons why the LifeViewer feature (see quote below) doesn't work as intended? What are they?
rowett wrote: March 10th, 2022, 10:30 am
You can also do similar in LifeViewer:
Code: Select all
x = 8, y = 12, rule = B3/S23
b2o2b2o$3b2o$3b2o$obo2bobo$o6bo2$o6bo$b2o2b2o$2b4o2$3b2o$3b2o!
[[ THEME Inverse GRID GRIDMAJOR 0 AUTOFIT ]]
Use
Settings->
Pattern->
Save Image (hotkey
O).
Re: Online File Format Converters
Posted: May 1st, 2025, 8:22 pm
by dvgrn
confocaloid wrote: May 1st, 2025, 2:38 pm
Are there reasons why the LifeViewer feature (see quote below) doesn't work as intended [for the specific case of RLE-to-PNG conversion]? What are they?
The RLE2PNG extracted code was just one example of a fairly large number of online file format converters collected on the golhobby site.
For the specific case of RLE2PNG, it's definitely possible that LifeViewer can do a better job. I think this is the most recent relevant quote:
rowett wrote: October 29th, 2024, 12:02 pm
From LifeViewer build 1205 pressing the
; (semi-colon) key will take a screenshot with the following properties:
- Inverse Theme
- Grid lines on with no major grid lines
- Integer zoom
I'm not so sure about Book's RLE2PNG online converter, just because both Muzik and I have spent some time recently replacing PNGs in LifeWiki articles that were uploaded by Book a couple of years back. They turned out to have unnecessary aliasing -- i.e., they somehow ended up being a non-optimal size, so they had interpolated pixels that weren't just the LifeWiki-standard on, off, and grid colors.
So, long story short, any code retrieved from the golhobby site would ideally need to be tested, and maybe patched up a bit if needed. But then, any code uploaded to a hypothetical online-converters collection would ideally need to be tested in pretty much the same way, whether it's existing or newly written.
Here's the full list of tools that are presumably retrievable from the golhobby archive site:
Code: Select all
Toolkit
- Pattern Lookup
- Tidy RLE
- Inflate RLE
- IMG to RLE
- RLE to PNG
- RLE to SVG
- RLE to Plaintext
- Plaintext to RLE
- Apgcode to PNG
- Apgcode to RLE
- Integer to Life Digits RLE
- Frequency Class Calculator
- Frequency Calculator
(It also lists "RLE to Apgcode" but that was really just a link to Catagolue's Object page.)
I don't have time to write and test all of these converters from scratch in Javascript. So I'm not volunteering to do that. If someone else wants to do that, and do all the necessary testing, that would be great. But if not, well, there's code already available on that golhobby archive site. It's fairly easy to extract, and most of it probably works just fine.
What I
can volunteer to do is to help get an online Javascript converter tool collection hosted somewhere like
conwaylife.com/ref/golhobby or
conwaylife.com/ref/online-converters or whatever.
Re: Online File Format Converters
Posted: May 2nd, 2025, 3:02 am
by MXMLLN
Are there reasons why the LifeViewer feature (see quote below) doesn't work as intended? What are they?
Personally, it's the text file format converters that I could really use, not the image exports. I think they would also benefit beginners like me that haven't fully adapted RLE into their workflow.
And actually, since the
RLE to Plaintext converter already exists...
It is the complementary converter, from Plaintext or Life 1.05 to RLE that I'm missing.
Plaintext and Life 1.05 are trivial to convert between. I'm mostly working in spreadsheet and Find and Replace is sufficient.
Other text formats would be appreciated as well.
I think most people already have working solutions for IMG conversions, though I bet they could be streamlined.
Having an SVG exporter would be profound though.
And I'm happy to help out where I can.
Re: Online File Format Converters
Posted: May 2nd, 2025, 4:51 am
by rowett
This doesn't appear to help since the Plaintext it creates is not compatible with Golly or LifeViewer given it uses
$ as end of line markers in the Plaintext (this is an RLE feature).
MXMLLN wrote: May 2nd, 2025, 3:02 am
It is the complementary converter, from Plaintext or Life 1.05 to RLE that I'm missing.
Just open the pattern in Golly or LifeViewer and then use
Select All and then
Copy. The clipboard will contain RLE.
Re: Online File Format Converters
Posted: May 2nd, 2025, 4:55 am
by confocaloid
Linking some related discussions:
viewtopic.php?f=7&t=6403#p180189 "How to Copy Cells in "..OO" Pattern Format?"
viewtopic.php?f=7&t=6293 "Finer points of file formats"
Re: Online File Format Converters
Posted: May 2nd, 2025, 5:03 am
by MXMLLN
Thank you, Confocaloid. The related discussion's LUA script is quite useful.
rowett wrote: May 2nd, 2025, 4:51 am
This doesn't appear to help since the Plaintext it creates is not compatible with Golly or LifeViewer given it uses
$ as end of line markers in the Plaintext (this is an RLE feature).
This is just one use case.
I use Golly in conjunction with my spreadsheets. For the time being, the spreadsheet data is much faster in most of the cases I'm working on.
Re: Online File Format Converters
Posted: May 2nd, 2025, 7:23 am
by dvgrn
MXMLLN wrote: May 2nd, 2025, 3:02 am
Having an SVG exporter would be profound though.
And I'm happy to help out where I can.
Same as all the other online converters that Book provided, there's code for
RLE-to-SVG right there in the archived page source:
Code: Select all
let rowcoords,colcoords;
const deadcolor="white";
const livecolor="black";
const gridcolor="silver";
function doOnload(){
document.getElementById('ta').select();
}
function xRLE2Array(inp){
//extended RLE
inp=inp.replaceAll(".","b");
inp=inp.replaceAll("B","b");
inp=inp.replaceAll("A","o");
inp=inp.replaceAll("C","o");
inp=inp.replaceAll("D","b");
inp=inp.replaceAll("E","o");
inp=inp.replaceAll("F","o");
//
inp=inp.replaceAll("!","");
inp=inp.replaceAll(" ","");
var b="$"+"b$".repeat(998);
for(var i=999;i>1;i--){
inp=inp.replaceAll(i+"$",b);
b=b.slice(2);
}
var txt=inp.split("\n");
var out="";
var s1="";
var s2;
for(var i=0;i<txt.length;i++){
if(txt[i].charAt(0)!="#" && txt[i].charAt(0)!="x"){
s1+=txt[i];
}
}
s2=s1.split("$");
if(s2[s2.length-1]=="")s2.length=s2.length-1;
var rtn;
var maxrow=0;
var maxcol=0;
for(var i=0;i<s2.length;i++){
rtn=RLEDecodeLine(i,s2[i]);
out+=rtn[0];
maxrow=Math.max(maxrow,rtn[1]);
maxcol=Math.max(maxcol,rtn[2]);
}
return [out,maxrow,maxcol];
}
function xRLEDecodeLine(row,sin){
var nstr="";
var n=0;
var col=0;
var s,srow,scol;
var maxcol=0;
var sout="";
srow="+"+row;
if(row==0)srow="";
for(var i=0;i<sin.length;i++){
s=sin.charAt(i);
if(s=="b" || s=="o"){
if(nstr==""){
n=1;
} else {
n=parseInt(nstr);
}
if(s=="o"){
for(var j=0;j<n;j++){
scol="+"+(col+j);
if(col+j==0)scol="";
sout+="\ta[row"+srow+"][col"+scol+"]=1;\n";
maxcol=Math.max(maxcol,col+j);
}
}
col+=n;
n=0;
nstr="";
} else {
nstr+=s;
}
}
return [sout,row+1,maxcol+1];
}
function drawIt(){
let txt=document.getElementById('ta').value.trim();
if(txt=="")return;
let rtn=RLE2Array(txt);
const rows=parseInt(rtn[1]);
const cols=parseInt(rtn[2]);
if(isNaN(rows) || isNaN(cols)){
alert('Invalid RLE.');
return;
}
let a=new Array(rows);
for(var i=0;i<rows;i++){
a[i]=new Array(cols);
a[i].fill(0);
}
const row=0; //for the eval
const col=0;
eval(rtn[0]);
nrows=rows+2; //add borders
ncols=cols+2;
if(ncols>nrows){ //square
nrows=ncols;
} else {
ncols=nrows;
}
if(nrows>1000){
alert('Pattern too big.');
return;
}
let bigA=new Array(nrows);
for(var i=0;i<nrows;i++){
bigA[i]=new Array(ncols);
bigA[i].fill(0);
}
const idelta=Math.round((nrows-rows)/2);
const jdelta=Math.round((ncols-cols)/2);
for(var i=0;i<rows;i++){
for(var j=0;j<cols;j++){
bigA[i+idelta][j+jdelta]=a[i][j];
}
}
rowcoords=new Array(nrows);
colcoords=new Array(ncols);
drawGrid(bigA);
document.getElementById('save').disabled=false;
}
function svgDrawLine(x1,y1,x2,y2,w,color){
const r='<line x1="'+x1+'" y1="'+y1+'" x2="'+x2+'" y2="'+y2+'" style="stroke:'+color+';stroke-width:'+w+'" />';
return r;
}
function svgDrawRect(x,y,fill,w,h,border,borderw){
const r='<rect x="'+x+'" y="'+y+'" width="'+w+'" height="'+h+'" style="fill:'+fill+';stroke:'+border+';stroke-width:'+borderw+'" />';
return r;
}
function svgWrap(w,h,s){
let r='<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"';
r+=' x="0px" y="0px" width="'+w+'" height="'+h+'">'+s+'</svg>';
return r;
}
function drawGrid(a){
const div=document.getElementById('svg');
var cellsize=20;
var w=ncols*(cellsize+1)+1;
var h;
while(cellsize>3){
if(w>512){
cellsize--;
w=ncols*(cellsize+1)+1;
} else {
break;
}
}
h=w;
let svg="";
svg+=svgDrawRect(0,0,deadcolor,w,h,gridcolor,1);
var n=0;
for(var x=0;x<w-1;x+=(cellsize+1)){
if(cellsize)svg+=svgDrawLine(x,0,x,h,1,gridcolor); //else no gridlines
colcoords[n]=x+1;
if(cellsize<4)colcoords[n]++;
n++;
}
if(cellsize)svg+=svgDrawLine(w,0,w,h,1,gridcolor); //else no gridlines
n=0;
for(var y=0;y<h-1;y+=(cellsize+1)){
if(cellsize)svg+=svgDrawLine(0,y,w,y,1,gridcolor); //else no gridlines
rowcoords[n]=y;
if(cellsize<4)rowcoords[n]++;
n++;
}
if(cellsize)svg+=svgDrawLine(0,h,w,h,1,gridcolor); //else no gridlines
let paintsize=cellsize-1;
if(paintsize==1)paintsize=2;
for(var j=0;j<nrows;j++){
for(var i=0;i<ncols;i++){
if(a[j][i]){
svg+=svgDrawRect(colcoords[i],rowcoords[j],livecolor,paintsize,paintsize,gridcolor,1);
}
}
}
svg=svgWrap(w,h,svg);
div.style.width=w+'px';
div.style.height=h+'px';
div.innerHTML=svg;
}
Scripts are disabled in the Internet Archive, but a local copy of that page could be opened and run, either offline or online, possibly with a few small changes to paths. I haven't looked closely, but this ought to be an easy project for someone to do.
Once someone puts together a collection of these tools in the form of a linked set of HTML files with relative paths such that they work offline, it would be easy to upload them somewhere so that they are available online also.
Re: Online File Format Converters
Posted: May 2nd, 2025, 7:26 am
by MXMLLN
I didn't even think about how downloading an offline copy would get the code to work!
Brilliant.
Sorry if I missed the point in your first message.
I'll get started...
Re: Online File Format Converters
Posted: May 2nd, 2025, 12:12 pm
by MXMLLN

OMG!
RLE to SVG works! I didn't even notice it when I first came across GOL Hobby many years ago, before the page died.
There is a small typo:
RLE2Array
RLEDecodeLine
These two functions reference each other, but sometimes they were prepended by an x, ie, xRLE2Array & xRLEDecodeLine.
A simple text search will find the one or two function calls.
Just remove the x(s) and it should work.
Re: Online File Format Converters
Posted: August 3rd, 2025, 8:01 am
by Resu
dvgrn wrote: May 1st, 2025, 2:08 pm
If someone wants to go through and "rescue" all of the tools from that golhobby.com archive page, and put everything into a nice package with relative URLs everywhere such that it will work wherever you put it, then I can work on finding a fresh place to host it.
Has anybody done this yet?
Re: Online File Format Converters
Posted: August 3rd, 2025, 9:05 am
by dvgrn
Resu wrote: August 3rd, 2025, 8:01 am
Has anybody done this yet?
If they have, nobody has told me.
Re: Online File Format Converters
Posted: August 10th, 2025, 11:28 am
by MXMLLN
Should we start a 2nd thread to rescue the GolHobby.com converters?
I'm just updating the pages as I need them, but it will be a few weeks until I need everything.
For example, today I wanted the RLE to PlainText converter.
It uses the RLE2Array() function, though it doesnt't seem to have a reference to it anywhere.
However, RLE2Array() is available on the RLE to SVG page.
Easy fix!
Re: Online File Format Converters
Posted: November 5th, 2026, 9:20 am
by otismo
dvgrn wrote: May 2nd, 2025, 7:23 am
MXMLLN wrote: May 2nd, 2025, 3:02 am
Having an SVG exporter would be profound though.
And I'm happy to help out where I can.
Same as all the other online converters that Book provided, there's code for
RLE-to-SVG right there in the archived page source:
Code: Select all
let rowcoords,colcoords;
const deadcolor="white";
const livecolor="black";
const gridcolor="silver";
function doOnload(){
document.getElementById('ta').select();
}
function xRLE2Array(inp){
//extended RLE
inp=inp.replaceAll(".","b");
inp=inp.replaceAll("B","b");
inp=inp.replaceAll("A","o");
inp=inp.replaceAll("C","o");
inp=inp.replaceAll("D","b");
inp=inp.replaceAll("E","o");
inp=inp.replaceAll("F","o");
//
inp=inp.replaceAll("!","");
inp=inp.replaceAll(" ","");
var b="$"+"b$".repeat(998);
for(var i=999;i>1;i--){
inp=inp.replaceAll(i+"$",b);
b=b.slice(2);
}
var txt=inp.split("\n");
var out="";
var s1="";
var s2;
for(var i=0;i<txt.length;i++){
if(txt[i].charAt(0)!="#" && txt[i].charAt(0)!="x"){
s1+=txt[i];
}
}
s2=s1.split("$");
if(s2[s2.length-1]=="")s2.length=s2.length-1;
var rtn;
var maxrow=0;
var maxcol=0;
for(var i=0;i<s2.length;i++){
rtn=RLEDecodeLine(i,s2[i]);
out+=rtn[0];
maxrow=Math.max(maxrow,rtn[1]);
maxcol=Math.max(maxcol,rtn[2]);
}
return [out,maxrow,maxcol];
}
function xRLEDecodeLine(row,sin){
var nstr="";
var n=0;
var col=0;
var s,srow,scol;
var maxcol=0;
var sout="";
srow="+"+row;
if(row==0)srow="";
for(var i=0;i<sin.length;i++){
s=sin.charAt(i);
if(s=="b" || s=="o"){
if(nstr==""){
n=1;
} else {
n=parseInt(nstr);
}
if(s=="o"){
for(var j=0;j<n;j++){
scol="+"+(col+j);
if(col+j==0)scol="";
sout+="\ta[row"+srow+"][col"+scol+"]=1;\n";
maxcol=Math.max(maxcol,col+j);
}
}
col+=n;
n=0;
nstr="";
} else {
nstr+=s;
}
}
return [sout,row+1,maxcol+1];
}
function drawIt(){
let txt=document.getElementById('ta').value.trim();
if(txt=="")return;
let rtn=RLE2Array(txt);
const rows=parseInt(rtn[1]);
const cols=parseInt(rtn[2]);
if(isNaN(rows) || isNaN(cols)){
alert('Invalid RLE.');
return;
}
let a=new Array(rows);
for(var i=0;i<rows;i++){
a[i]=new Array(cols);
a[i].fill(0);
}
const row=0; //for the eval
const col=0;
eval(rtn[0]);
nrows=rows+2; //add borders
ncols=cols+2;
if(ncols>nrows){ //square
nrows=ncols;
} else {
ncols=nrows;
}
if(nrows>1000){
alert('Pattern too big.');
return;
}
let bigA=new Array(nrows);
for(var i=0;i<nrows;i++){
bigA[i]=new Array(ncols);
bigA[i].fill(0);
}
const idelta=Math.round((nrows-rows)/2);
const jdelta=Math.round((ncols-cols)/2);
for(var i=0;i<rows;i++){
for(var j=0;j<cols;j++){
bigA[i+idelta][j+jdelta]=a[i][j];
}
}
rowcoords=new Array(nrows);
colcoords=new Array(ncols);
drawGrid(bigA);
document.getElementById('save').disabled=false;
}
function svgDrawLine(x1,y1,x2,y2,w,color){
const r='<line x1="'+x1+'" y1="'+y1+'" x2="'+x2+'" y2="'+y2+'" style="stroke:'+color+';stroke-width:'+w+'" />';
return r;
}
function svgDrawRect(x,y,fill,w,h,border,borderw){
const r='<rect x="'+x+'" y="'+y+'" width="'+w+'" height="'+h+'" style="fill:'+fill+';stroke:'+border+';stroke-width:'+borderw+'" />';
return r;
}
function svgWrap(w,h,s){
let r='<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"';
r+=' x="0px" y="0px" width="'+w+'" height="'+h+'">'+s+'</svg>';
return r;
}
function drawGrid(a){
const div=document.getElementById('svg');
var cellsize=20;
var w=ncols*(cellsize+1)+1;
var h;
while(cellsize>3){
if(w>512){
cellsize--;
w=ncols*(cellsize+1)+1;
} else {
break;
}
}
h=w;
let svg="";
svg+=svgDrawRect(0,0,deadcolor,w,h,gridcolor,1);
var n=0;
for(var x=0;x<w-1;x+=(cellsize+1)){
if(cellsize)svg+=svgDrawLine(x,0,x,h,1,gridcolor); //else no gridlines
colcoords[n]=x+1;
if(cellsize<4)colcoords[n]++;
n++;
}
if(cellsize)svg+=svgDrawLine(w,0,w,h,1,gridcolor); //else no gridlines
n=0;
for(var y=0;y<h-1;y+=(cellsize+1)){
if(cellsize)svg+=svgDrawLine(0,y,w,y,1,gridcolor); //else no gridlines
rowcoords[n]=y;
if(cellsize<4)rowcoords[n]++;
n++;
}
if(cellsize)svg+=svgDrawLine(0,h,w,h,1,gridcolor); //else no gridlines
let paintsize=cellsize-1;
if(paintsize==1)paintsize=2;
for(var j=0;j<nrows;j++){
for(var i=0;i<ncols;i++){
if(a[j][i]){
svg+=svgDrawRect(colcoords[i],rowcoords[j],livecolor,paintsize,paintsize,gridcolor,1);
}
}
}
svg=svgWrap(w,h,svg);
div.style.width=w+'px';
div.style.height=h+'px';
div.innerHTML=svg;
}
Scripts are disabled in the Internet Archive, but a local copy of that page could be opened and run, either offline or online, possibly with a few small changes to paths. I haven't looked closely, but this ought to be an easy project for someone to do.
Once someone puts together a collection of these tools in the form of a linked set of HTML files with relative paths such that they work offline, it would be easy to upload them somewhere so that they are available online also.
I'm still working on this
http://cgolart.onfav.net/patman/tools/
I could use some beta testers to help me get everything working -
Thank You !
Maximum Density Still Lifes Collection
Code: Select all
#N Maximum Density Still Lifes Stamp Collection
#O Otis Arron Schmakel
#C Owner and Sole Proprietor
#C The Conway's Game of Life Art Gallery
#C at | http://cgolart.onfav.net
#C
#C crafted with care in October of 2026
#C from the Life Wiki at ConwayLife.com
#C
#C This Pattern contains Maximum Density Still Lifes
#C for all Bounding Boxes from 2X2 through 25X25
#C all noteworthy currently available have been included.
#C
#C Some very Artful still lifes have also been included;
#C The 124bitSL "Rook" of Mister Missed Her;
#C The 47bitSL "Dino Egg" of Econotic;
#C The 34bitSL "Liberty Bell" of OtismO;
#C
#C Liberty Bell is not yet the widely accepted name of
#C "house-on-house-siamese-table-on-table-weld-hat-siamese-hat"
#C which is the Precise Descriptive Nomenclature attached
#C to this pattern; it evidently does occur naturally
#C and is quite rare - I just think it looks like
#C the Liberty Bell - and is easy to draw, too.
#C
#C ;-)
#C
#CXRLE Pos=-98,-110
x = 178, y = 225, rule = B3/S23
2b2o11b2o6b2o6b2o6b2o5b2o2b2o2b2o2b2o6b2o2b2o4b2o2b2o6b2o8b2obo6b2obo
2b2o6b2o4b2obo4b2o2b2o2b2ob2ob2o2b2o5b2o11b2o$bo2bo11bo6bo6bo2bo5bo7bo
2bobo2bo3bo6bo4bo5bo3bo6bo8bo2b2o6bob2o3bo6bo5bob2o4bobo2bo2b2obo3bo2b
obo5bo10bo2bo$ob2obo10bobo2bobo5bobo2bo5bo5bo5b2o5bobo2bobo3bo5bo4bobo
2bobo7bobo3b2o2b2o6bo8bo2b2o10b2o7bob2o4bobo3bo10bob2obo$bo2bo10b2ob4o
b2o4bob2obo6bo3bo6bo5b2ob4ob2o2b2o4b2o2b2ob4ob2o6b2o4bo3bo7b2o6b2o2bo
11bo8bobo7bo2bo12bo2bo$2b2o24b2o4b2o6bobo8bo17bo5bo25bo3bo9b2o8bo11bo
6b2obo6b2obo14b2o$15b10o5bob2o7b2ob2o6b2o4b10o2bo5bo3b10o6b2o4b2o2b2o
6b2obo4b2o2b2o10b2o9b2o8b2o$15bo8bo5b2obo8bobo7bo5bo8bo2b2o4b2o2bo8bo
6bo5bo5b2obo3bobobo2bo5b2obo6bo7b2obo6b2obo$16bo2b2o2bo4b2o4b2o5bo3bo
7bo5bo2b2o2bo14bo2b2o2bo8bo5bo4bob2o3bo2bobobo5bob2o7bo7bobobo5bobobo$
15b2o2b2o2b2o4bob2obo6b2ob2o6b2o4b2o2b2o2b2o2b2o4b2o2b2o2b2o2b2o8bo3b
2o2b2o6b2o4bob2o8b2o4b2o7bo2b2o5bo2b2o$29bob2obo7bobo7bo18bo5bo19b2o3b
o3bo12b2o11bo5bo7b2o8b2o$15b2o6b2o3b2o4b2o5bo3bo7bo4b2o6b2o2bo5bo3b2o
6b2o13bo3bo6b2o6b2o9bo5bo6bo9bo$15bo7bo5bo4bo5bo5bo5b2o4bo7bo3b2o4b2o
2bo7bo8b2o3b2o2b2o6bo8bo8b2o4b2o7bo9bo$16bo7bo2bo8bo2bo7bo2bo2bobo3bo
7bo4bob2o5bo7bo6bo2bobo6b2obo3bo6bo5b2obo4bo2bobo6bo9bo$15b2o6b2o2b2o
6b2o2b2o5b2o2b2o2b2o2b2o6b2o4b2obo4b2o6b2o6b2o2b2o6bob2o2b2o6b2o4bob2o
4b2o2b2o5b2o8b2o6$7b2o160b2o$8bo15b2ob2o120b2ob2o15bo$7bo16bo3bo120bo
3bo16bo$7b2o16b3o122b3o16b2o$5b2o2bo158bo2b2o$4bo2b2obo14b3o122b3o14bo
b2o2bo$4bobo2bobob2o9bo3bo120bo3bo9b2obobo2bobo$ob2obobobob2obo9b2ob2o
15b2obo4b2ob2ob2o2b2o2b2o2b2o8b2o12b2o8b2o2b2o4b2obo4b2obo4b2obo15b2ob
2o9bob2obobobob2obo$2obobo2bobo14bobo16bob2o4b2obo3bo2bobo2bo3bo9bo13b
o8bobo2bo4bob2o4bob2o4bob2o16bobo14bobo2bobob2o$4bob2o2bo14bobo14b2o
11bob2o5b2o4bo9bo13bo11b2o4b2o6b2o6b2o20bobo14bo2b2obo$5bo2b2o14b2ob2o
13bo12bobo6bo5b2o8b2o12b2o10bo5bo7bo7bo20b2ob2o14b2o2bo$6b2o15bo5bo13b
o10b2obo7bo5bo9bo13bo11bo5bo7bo7bo18bo5bo15b2o$7bo16b5o13b2o13b2o5b2o
4bo9bo13bo11b2o4b2o6b2o6b2o19b5o16bo$6bo19bo17b2obo6b2obo6bo5b2o8b2o
12b2o10bo7b2obo4b2obo4b2obo17bo19bo$6b2o36bob2o7bobobo5bo5bo9bo13bo11b
o6bob2o4bob2o4bob2o36b2o$48b2o5bo2b2o4b2o4bo9bo13bo11b2o4b2o6b2o12b2o$
48bo5b2o8bo5b2o8b2o12b2o10bo5bo7bo13bo$49bo4bo10bo5bo9bo13bo11bo5bo7bo
13bo$48b2o5bo8b2o4bo9bo13bo11b2o6bo5b2o12b2o$44b2obo8bo5bo2bobo2bobob
2obo2bobob2obo6bobob2obo2bo2bobo2bobo7b2obo4b2obo$23bo5bo14bob2o7b2o5b
2o2b2o3b2obob2o3b2obob2o7b2obob2o2b2o2b2o2b2o8bob2o4bob2o14bo5bo$22bob
o3bobo116bobo3bobo$21bo2bo2bo2bo116bo2bo2bo2bo$18bobo3bobo3b2o114b2o3b
obo3bobo$18b2o5bo126bo5b2o7$2b2obo16b2obo14b2o4b2o14b2o2b2o16bob2o4b2o
b2o5b2o2b2o4b2ob2o13b2obo6b2obo14b2o2b2ob2obob2ob2ob2o$2bob2o16bob2o
14bo5bo15bobo2bo16b2obo4b2ob2o5b2o2b2o4b2obobo12bob2o6bob2o14bo2bobobo
b3obob2obo$6b2o18b2o13bo5bo5b2o5b2o3b2o15b2o31bobo16b2o2b2o4b2o13bobob
obo5bo5bo$6bo19bo6b2o5b2o4b2o4bo2bo4bo10b2ob2o5bobo8b2ob2o9b2o4b3obo
17bo3bo5bo13b2obobob6ob6o$7bo6b2o11bo4bobo7b2obo6bo2bo5bo9b2ob2o5bo10b
2obobo4b2obobo4bo2bo19bo3bo5bo13bobobo6bobo$6b2o6b2o10b2o4b2o8bob2o7b
2o5b2o18b2o14b2o4b2ob2o6b2o19b2o2b2o4b2o12bo2bob6obobob4o$2b2obo16b2ob
o20b2o14b2obo5b2ob2o6b2obo44b2obo4bo19b4o6bobobobo2bo$2bob2o16bob2o20b
o15bob2o5b2ob2o6bob2o44bob2o5bo22b5obobobobobo$2o24b2o19bo6b2o10b2o12b
2o4b2o40b2o8b2o4b2o12b4o4bobobobobob2o$o25bo19b2o5bobo10bo13bo5bo41bo
9bo5bo13bo2bob2obobobobobobo$bo25bo24bobo12bo13bo5bo4b2o2b2o6bob2o4b2o
b2o12bo9bo5bo13bobobobobobob2obo2bo$2o24b2o24b2o12b2o12b2o4b2o4bo2bobo
6b2obo4b2obo12b2o8b2o4b2o12b2obobobobobo4b4o$2b2obo16b2obo20b2o14b2obo
16b2obo7b2o7b2o11bo14b2obo6b2obo15bobobobobob5o$2bob2o16bob2o20b2o14bo
b2o16bob2o9b2o6bob2o5b2ob2o13bob2o6bob2o14bo2bobobobo6b4o$92bobo2bo4bo
2bobo4bobo2bo40b4obobob6obo2bo$92b2o2b2o4b2o2b2o5bo2b2o45bobo6bobobo$
158b6ob6obobob2o$158bo5bo5bobobobo$2b2o3bo3bo3bo3bo3b2o8b2o3bo3bo3bo3b
o3b2o8b2o3bo3bo3bo3bo3b2o72bob2obob3obobobo2bo$bo2bobobobobobobobobobo
2bo6bo2bobobobobobobobobobo2bo6bo2bobobobobobobobobobo2bo70b2ob2ob2obo
b2ob2o2b2o$b2obobobobobobobobobobob2o6b2obobobobobobobobobobob2o6b2obo
bobobobobobobobobob2o6bo2bo5b2ob2o5b2ob2o$3bobobobobobobobobobobo4b2o
4bobobobobobobobobobobo4b2o4bobobobobobobobobobobo8b4o5b2obo5bob2obo$
3bobobobobobobobobobobo4b2o4bobobobobobobobobobobo4b2o4bobobobobobobob
obobobo6b2o12bo5bo$b2obobobobobobobobobobob2o6b2obobobobobobobobobobob
2o6b2obobobobobobobobobobob2o5bo2b2o5b3o7bob2o$bo2bobobobobobobobobobo
2bo6bo2bobobobobobobobobobo2bo6bo2bobobobobobobobobobo2bo5bobobo4bo2bo
bo4b2obobo$2b2o3bo3bo3bo3bo3b2o8b2o3bo3bo3bo3bo3b2o8b2o3bo3bo3bo3bo3b
2o5b2ob2o5b2o2b2o8b2o4$157b2ob2obob2ob2obob2ob2o$ob2o20b2obo20b2obo6b
2o2b2ob2o4b2o2b2ob2o4bob2ob2obo4bob2ob2obo4bob2obob2o13b2obo6b2o13b2ob
ob3obobob3obob2o$2obo20bob2o20bob2o6bo2bobob2o4bo2bobob2o4b2obobob2o4b
2obobob2o4b2obob2obo13bob2o6bo17bo5bobo5bo$4b2o16b2o4b2o16b2o4b2o5bobo
bo8bobobo10bobo10bobo10bo22b2o5bo13b3ob5obob5ob3o$5bo5bob2ob2o4bo5bo5b
2ob2ob2o4bo5bo5b2obob4o4b2obob4o4b2obob4o4b2obob4o4b3ob4o18bo5b2o13bo
2bo4bobo6bo2bo$4bo6b2obobo6bo5bo4b2ob2ob2o5bo5bo4bo2bo4bo5bobo4bo5bobo
4bo4bo2bo4bo4bo2bo4bo18bo20bobob2obob6obobo$4b2o8bo2bo4b2o4b2o16b2o4b
2o5bob4o7bob4o7bob4o7bob4o7bobob4o17b2o4b2o13b2obob2obo6bobob2o$2b2o7b
3ob3o6b2obo6b2ob2ob2o6b2obo6b2o4b2o5b2o4b2o5b2o4b2o5b2o4b2o5b2obobo16b
2obo6bo15bobo4b6obobobo$3bo7bo2bo9bob2o6b2ob2ob2o6bob2o6bo2b2o3bo4bo2b
2o3bo4bo2b2o3bo4bo2b2o3bo4bo2bobob2o13bob2o7bo13bo2b5o5bobobo2bo$2bo9b
obob2o4b2o4b2o22b2o5b2ob2ob2o5b2ob2ob2o5b2ob2ob2o5b2ob2ob2o6b2ob2obo
11b2o10b2o13b3o5b4obobob4o$2b2o7b2ob2obo4bo5bo5b2ob2ob2o10bo77bo29b5o
3bobob2o$2o21bo5bo4b2ob2ob2o11bo77bo10b2o13b3o5b2obobo4b3o$bo20b2o4b2o
22b2o76b2o10bo14bo2b4obobobob4o2bo$o23b2obo20b2obo80b2obo7bo14bobo2bob
obobobo2bobo$2o22bob2o20bob2o80bob2o6b2o13b2obobo2bobobo2bobob2o$158bo
bob4obob4obobo$58bob2ob2obo4bob2ob2obo4bob2ob2obo4bob2ob2obo4bob2ob2ob
o38bo2bo6bo6bo2bo$58b2obobob2o4b2obobob2o4b2obobob2o4b2obobob2o4b2obob
ob2o38b3ob6ob6ob3o$61bobo10bobo10bobo10bobo10bobo44bo5bobo5bo$8b2o7b2o
7b2o7b2o7b2o12b2obob4o4b4ob4o4b2obob4o4b4o2b3o4b4ob4o38b2obob3obobob3o
bob2o$8b2o7b2o7b2o7b2o7b2o12b2obo4bo4bo7bo4bob2o4bo4bo3b2o2bo4bo7bo38b
2ob2obob2ob2obob2ob2o$61b5o6bob5o9b4o6b3o2b2o6b7o$5b2o4b2o10b2o4b2o10b
2o4b2o9b3o10b2obo10b3o13bo$b2obo2bo2bo2bob2o2b2obo2bo2bo2bob2o2b2obo2b
o2bo2bob2o5bo2bob2obo4bo2bob2obo4bo2bob2obo4bob2ob2obo4bob2ob2obo$bob
2o2bo2bo2b2obo2bob2o2bo2bo2b2obo2bob2o2bo2bo2b2obo7b2obob2o6b2obob2o4b
2o2b2ob2o4b2obobob2o4b2obobob2o$8b2o16b2o16b2o4$156b2ob2ob2obob2ob2ob
2ob2o$157bob2obob3obob2ob2ob2o$2o4bob2o8bob2ob2ob2o6b2o4b2o24b2o4b2obo
10b2ob2ob2o2b2o8b2obob2ob2obo12b2obo6b2obo12bo5bo5bo$o5b2obo8b2ob2obob
2o6bo5bo25bo5bob2o11bob2obobo2bo8bob3obobob2o12bob2o6bob2o12b6ob5ob9o$
bo2b2o4b2o12bo10bo5bo6b2ob2ob2ob2o8bo8b2o8bo5bobobo15bobo19b2o8b2o15bo
bo3bobo7bo$2o3bo5bo6b2ob3ob3o6b2o4b2o6b2ob2ob2ob2o7b2o8bo9b4ob2obob2o
9b6obob2o16bo9bo11b4obo2b2obobob4obo$4bo5bo8bobo2bo2bo49bo11bobo2bobo
9bo6b2ob2o17bo9bo10bo2bob2obobo2bobo2bob2o$2o2b2o4b2o6bo2bo2bobo7b2o4b
2o6b2ob2ob2ob2o7b2o8b2o8b2obobob2obo9b6o22b2o8b2o11bobobo2bobob2obo2bo
bo$o4bo12b3ob3ob2o6bo5bo7b2ob2ob2ob2o7bo5b2obo10b2obobo2bob2o14b6o12b
2obo6b2obo12b2obobob2obobo2b4o2bo$bo2bo16bo13bo5bo25bo4bob2o13bob3o12b
2ob2o6bo12bob2o6bob2o13bobobo2bobobobo4b3o$2o2b2o4b2o6b2obob2ob2o6b2o
4b2o6b2ob2ob2ob2o7b2o2b2o14b4o4b4o8b2obob6o11b2o8b2o16bo2b2obobobobob
5o$5bo5bo6b2ob2ob2obo20b2ob2ob2ob2o11bo15bo3b3obo2bo11bobo16bo9bo17b3o
3b2obobobo4bob2o$2o2bo5bo23b2o4b2o24b2o3bo15bobo2bobobo9b2obobob3obo
11bo9bo19b3o3bobobob2obob2o$o3b2o4b2o22bo5bo7b2ob2ob2ob2o7bo3b2o14b2ob
2o2b2ob2o8bob2ob2obob2o10b2o8b2o16b2obo2b3obobobobobo$bo4bob2o25bo5bo
6b2ob2ob2ob2o8bo4b2obo54b2obo6b2obo13bobobo2bobobobobobob2o$2o4b2obo
24b2o4b2o24b2o4bob2o54bob2o6bob2o12bo2bob2obobobobobobob2o$156b4obo2b
2obobob2obo$161bobo3bobo4bob2o$156b6ob5ob6ob2o$156bo5bo5bo$157bob2obob
3obob2ob2ob2o$156b2ob2ob2obob2ob2ob2ob2o8$155b2ob2ob2obob2obob2ob2obo$
156bob2obob3obob2obobob2o$155bo5bo5bo4bobo$2o2b2obo10b2ob2obob2ob2o7b
2o2b2o4b2o8b2ob2ob2ob2ob2o12b2o4b2o2b2o7b2ob2ob2ob2o2b2o12b2obo5b2obo
12b6ob5ob5obob2o$o3bob2o10b2obob3obob2o7bo3bo5bo9b2ob2ob2ob2ob2o12bo5b
obo2bo7b2ob2ob2obobo2bo12bob2o5bob2o17bobo3bobo5bob2o$bo6b2o11bo5bo11b
o3bo5bo35bo2b2o3b2o17bobobo17b2o7b2o10b4obo2b2obobob5o$2o6bo9b3ob5ob3o
7b2o2b2o4b2o8b4ob6ob2o12b2o2bo14b10obob2o16bo8bo11bo2bob2obobobobobo3b
3o$9bo8bo2bo5bo2bo13b2obo10bo2bobo4bob2o17bo13bo5bo4bobo18bo8bo11bobob
o2bobobobo3b2o2bo$2o6b2o9bobo2b2obobo8b2o4bob2o11bobobob2obo15b2o2b2o
14bob2o3b4o2bo16b2o7b2o10b2obo2b3obobob4obobo$o3b2obo10b2obobobobob2o
7bo9b2o8b2obobob2obob2o12bo5b2obo9b2obob3o4b3o12b2obo5b2obo15b3o3bobob
o3bobob2o$bo2bob2o11bobobobobobo9bo8bo10bobobo4bob2o13bo4bob2o10bobobo
2b4o15bob2o5bob2o12b3o3b3o2bo2b3o2bobo$2o6b2o8bo2bobobobo2bo7b2o9bo8bo
2bob6o15b2o8b2o7bo2bobobo4b3o10b2o13b2o10bo2b3o3b2ob2o3b3o2bo$8bo9b4ob
obob4o17b2o8b4o8b2o22bo8b4obob5o2bo10bo14bo12bobo2b3o2bo2b3o3b3o$2o7bo
14bo13b2o22b7ob2o12b2o9bo12bo5bobo12bo14bo10b2obobo3bobobo3b3o$o7b2o8b
5obob2ob2o7bo19b2o2bo5bo15bo9b2o7b4ob5obob2o10b2o13b2o11bobob4obobob3o
2bob2o$bo2b2obo10bo2bob2ob2ob2o8bo8b2o8bobobob3obob2o13bo4b2obo9bo2bo
5bobo15b2obo5b2obo12bo2b2o3bobobobo2bobobo$2o2bob2o30b2o8b2o9b2ob2obob
2ob2o12b2o4bob2o10bobob3obobob2o12bob2o5bob2o12b3o3bobobobobob2obo2bo$
103b2ob2obob2ob2obo40b5obobob2o2bob4o$155b2obo5bobo3bobo$155b2obob5ob
5ob6o$158bobo4bo5bo5bo$155b2obobob2obob3obob2obo$155bob2ob2obob2obob2o
b2ob2o9$154b2ob2ob2obob2ob2obob2ob2o$154b2ob2obob3obobob3obob2o$2o6bob
2o10b2ob2obo2bob2ob2o14b2ob2ob2obob2ob2o10b2o2bob2o15bob2ob2obob2ob2ob
o12b2obo4b2o4b2o14bo5bobo5bo$o7b2obo10b2obob6obob2o14b2ob2obob3obob2o
10bo3b2obo15b2obobob3obobob2o12bob2o4bo5bo9b4obob6o2b6ob2o$bo4b2o17bo
8bo23bo5bo14bo6b2o16bobo5bobo19b2o3bo5bo8bo2bobobo5bobo6b2o$2o3bobo14b
3ob8ob3o14b4obob6ob2o10b2o7bo13b2obob7obob2o16bo3b2o4b2o9bobobo2b6obob
4o$5bo16bo2bo8bo2bo14bo2bobobo6b2o18bo14b2obo9bob2o17bo4b2obo10b2obob
3o6bob2o3b3o$2o2b2o17bobob6obobo16bobobobob4o13b2o6b2o16b11o19b2o4bob
2o11bobo4b5obo4b2o2bo$o5b2obo12b2obobo4bobob2o14b2obobobobo3b3o10bo5b
2o15b3o11b3o12b2obo10b2o8bo2b5o3bobob4obobo$bo4bob2o13bobobob2obobobo
15bo2bobobo2b3o2bo11bo5bo15bo2b11o2bo12bob2o10bo9b3o5b2o3bobo2bobob2o$
2o2b2o4b2o11bobobob2obobobo16bobobob3o2bobo11b2o4bo18bo11bo12b2o15bo
11b4obob4obo2bobobo$4bo5bo11b2obobo4bobob2o14b2obobo4bobob2o16b2o15bob
13obo10bo15b2o8b3o3bobobo4b4obo2bo$2o3bo5bo11bobob6obobo16bobob6obobo
11b2o2b2o17b2o13b2o11bo24bo2b2obobobob3o5b4o$o3b2o4b2o10bo2bo8bo2bo14b
o2bo8bo2bo10bo4bo20b11o13b2o25bobobobob2obo2b5o$bo4b2obo12b3ob8ob3o14b
3ob8ob3o11bo2bo18b2obo9bob2o12b2obo10b2o8b2obobobo4bobo5b4o$2o4bob2o
15bo8bo20bo8bo13b2o2b2o17b2obob7obob2o12bob2o10b2o9bobobob6ob5obo2bo$
22b2obob6obob2o14b2obob2ob3obob2o36bobo5bobo39bo2b2obo6bo4bobobo$22b2o
b2obo2bob2ob2o14b2ob2ob2obob2ob2o33b2obobob3obobob2o36b3o3bob4obob2obo
bob2o$101bob2ob2obob2ob2obo39b4obo2bobobob2obobo$154b2o6bobo2bobo4bo2b
o$154b2ob6ob4ob5ob3o$157bo5bo4bo5bo$154b2obob3obob2obob3obob2o$154b2ob
2obob2ob2ob2obob2ob2o8$103bo2bo2bo2bo$2o4b2obo10bob2ob2ob2obob2ob2o8b
2o4b2obo13b2ob2ob2ob2obob2ob2o15b10o17b2obo6b2o2b2o7bob2ob2obob2ob2obo
b2ob2obo$o5bob2o10b2obobob2ob3obob2o8bo5bob2o13b2ob2ob2obob3obob2o42bo
b2o6bobo2bo7b2obobob3obobob3obobob2o$bo2b2o4b2o11bobo8bo12bo2b2o4b2o
20bo5bo18b2o2b2o2b2o21b2o2b2o3b2o11bobo5bobo5bobo$2o2bo5bo9b2obob9ob3o
8b2o2bo5bo12b2ob6ob5ob3o15b2o2b2o2b2o21bo3bo14b2obob7ob7obob2o$5bo5bo
8b2obo4bo5bo2bo13bo5bo11b2obo4bobo4bo2bo47bo3bo13b2obo8bo8bob2o$2o2b2o
4b2o11b4o3b3obobo9b2o2b2o4b2o14bob2obo2b3obobo16b10o21b2o2b2o16b8o2b9o
$o5b2obo10b3o3b4o2bobob2o8bo5b2obo13b2obobo2b3o2bobob2o15bo8bo17b2obo
6b2obo9b3o3bo3b3o9b3o$bo4bob2o10bo2b2o4bobo2bobo10bo4bob2o13b2obo2b2o
3b2o2bobo18bob2obo19bob2o6bob2o9bo2b2o3bo4b9o2bo$2o2b2o4b2o9bobob4o2b
4o2bo8b2o8b2o14b3o2b3o2b3o2bo16b2ob2ob2o16b2o14b2o8bobob8o8bobo$4bo5bo
9b2obobo2bobo4b3o18bo12b3o3b2o3b2o3b3o40bo15bo8b2obobo7b7obob2o$2o3bo
5bo9bobobo2bob5o11b2o9bo11bo2b3o2b3o2b3o19b2ob2ob2o17bo15bo7bo2bobob6o
6bobo2bo$o3b2o4b2o8bo2bob2obo6b3o8bo9b2o12bobo2b2o3b2o2bob2o16bo3bobo
17b2o14b2o8bobobobo4bob4obobobo$bo4b2obo10b4obo2b7o2bo9bo4b2obo13b2obo
bo2b3o2bobob2o17bobo3bo18b2obo6b2obo9b2obobobob2obobo2bobobob2o$2o4bob
2o15bobo6bobo9b2o4bob2o14bobob2obo2b3obo19b2ob2ob2o18bob2o6bob2o9bo2bo
bob2obobobo2bobobo2bo$20b6ob6obob2o31bo2bo4bobo4bob2o16bo3bobo43bobobo
4bobob4obobobo$20bo5bo5bobo34b3ob5ob6ob2o17bobo3bo41b2obob6obo5b2obob
2o$21bob2obob3obobob2o34bo5bo25b2ob2ob2o42bobo8b5o4bobo$20b2ob2ob2obob
2ob2obo31b2obob3obob2ob2ob2o65bo2b9o4b6o2bo$69b2ob2obob2ob2ob2ob2o16b
2ob2ob2o41b3o9b3o7b3o$102bo2bob2obo2bo42b9o2b8o$102b3o6b3o39b2obo8bo8b
ob2o$105b6o42b2obob7ob7obob2o$102b3o6b3o42bobo5bobo5bobo$101bo3bob2obo
3bo38b2obobob3obobob3obobob2o$101b2ob2ob2ob2ob2o38bob2ob2obob2ob2obob
2ob2obo!
Pattern Manager (PatMan) - by member book - is a great piece of software that works -
Thank You Phil Bookman !
Get PatMan
Cheers
<3